[
  {
    "path": ".circleci/are-we-d1-yet.sh",
    "content": "#!/bin/bash\n\n# based on https://github.com/k3rn31p4nic/travis-ci-discord-webhook\n\n# Only run for commits/builds on master, not for PRs for now\nif [[ \"$CIRCLE_BRANCH\" != \"master\" ]]; then\n  exit\nfi\n\n# Webhook URL missing, do nothing\nif [ -z \"$2\" ]; then\n  exit\nfi\n\necho -e \"[Webhook]: Sending webhook to Discord...\\\\n\";\n\nAUTHOR_NAME=\"$(git log -1 \"$CIRCLE_SHA1\" --pretty=\"%aN\")\"\nCOMMITTER_NAME=\"$(git log -1 \"$CIRCLE_SHA1\" --pretty=\"%cN\")\"\nCOMMIT_SUBJECT=\"$(git log -1 \"$CIRCLE_SHA1\" --pretty=\"%s\")\"\nCOMMIT_MESSAGE=\"$(git log -1 \"$CIRCLE_SHA1\" --pretty=\"%b\")\"\n\nif [ \"$AUTHOR_NAME\" == \"$COMMITTER_NAME\" ]; then\n  CREDITS=\"$AUTHOR_NAME authored & committed\"\nelse\n  CREDITS=\"$AUTHOR_NAME authored & $COMMITTER_NAME committed\"\nfi\n\nTIMESTAMP=$(date --utc +%FT%TZ)\nWEBHOOK_DATA='{\n  \"avatar_url\": \"https://www.saaves.com/storage/brochure/logo-circleci-icon1583764538.png\",\n  \"embeds\": [ {\n    \"author\": {\n      \"name\": \"'\"$3\"' (Build #'\"$CIRCLE_BUILD_NUM\"')\",\n      \"url\": \"'\"$CIRCLE_BUILD_URL\"'\",\n      \"icon_url\": \"https://www.saaves.com/storage/brochure/logo-circleci-icon1583764538.png\"\n    },\n    \"title\": \"['\"\\`${CIRCLE_SHA1:0:7}\\`\"'] '\"$COMMIT_SUBJECT\"'\",\n    \"url\": \"'\"https://github.com/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/commit/$CIRCLE_SHA1\"'\",\n    \"description\": \"'\"$CREDITS\"'\",\n    \"fields\": [\n      {\n        \"name\": \"Binary accuracy\",\n        \"value\": \"'\"$1\"'\",\n        \"inline\": true\n      }\n    ],\n    \"timestamp\": \"'\"$TIMESTAMP\"'\"\n  } ]\n}'\n\n(curl --fail --progress-bar -A \"TravisCI-Webhook\" -H Content-Type:application/json -H X-Author:diasurgical -d \"$WEBHOOK_DATA\" \"$2\" \\\n  && echo -e \"\\\\n[Webhook]: Successfully sent the webhook.\") || echo -e \"\\\\n[Webhook]: Unable to send webhook.\"\n"
  },
  {
    "path": ".circleci/config.yml",
    "content": "version: 2\njobs:\n  diablo_109b:\n    docker:\n      - image: diasurgical/riivaaja:stable\n    steps:\n      - checkout\n      - run: make -f MakefileVC\n  diablo_109b_diff:\n    machine: true\n    steps:\n      - checkout\n      - run: |\n          set -e\n          wget https://github.com/diasurgical/devilution-comparer/releases/download/v0.4.0/devilution-comparer-v0.4.0-x86_64-unknown-linux-gnu.tar.xz\n          tar xf devilution-comparer-v0.4.0-x86_64-unknown-linux-gnu.tar.xz\n          mv comparer-config/diablo.toml comparer-config.toml\n          echo '#!/bin/sh' | sudo tee /bin/wine\n          echo 'docker run -v $(pwd):/root/devilution --entrypoint \"/usr/bin/wine\" diasurgical/riivaaja:stable $(basename $1) $2 $3' | sudo tee --append /bin/wine\n          sudo chmod +x /bin/wine\n          docker run -v $(pwd):/root/devilution -e MAKE_BUILD=pdb diasurgical/riivaaja:stable\n          ./devilution-comparer generate-full Diablo.exe --no-mem-disp --truncate-to-original\n          docker run -v $(pwd):/root/devilution diasurgical/riivaaja:stable ../status.sh\n          .circleci/are-we-d1-yet.sh \"$(< accuracy.txt)\" $DISCORD_WEBHOOK \"Diablo 1.09b\"\n  spawn_109b_diff:\n    machine: true\n    steps:\n      - checkout\n      - run: |\n          set -e\n          wget https://github.com/diasurgical/devilution-comparer/releases/download/v0.4.0/devilution-comparer-v0.4.0-x86_64-unknown-linux-gnu.tar.xz\n          tar xf devilution-comparer-v0.4.0-x86_64-unknown-linux-gnu.tar.xz\n          mv comparer-config/spawn.toml comparer-config.toml\n          echo '#!/bin/sh' | sudo tee /bin/wine\n          echo 'docker run -v $(pwd):/root/devilution --entrypoint \"/usr/bin/wine\" diasurgical/riivaaja:stable $(basename $1) $2 $3' | sudo tee --append /bin/wine\n          sudo chmod +x /bin/wine\n          docker run -v $(pwd):/root/devilution -e MAKE_BUILD=pdb -e SPAWN=1 diasurgical/riivaaja:stable\n          ./devilution-comparer generate-full Diablo.exe --no-mem-disp --truncate-to-original\n          docker run -v $(pwd):/root/devilution diasurgical/riivaaja:stable ../spawn-status.sh\n          .circleci/are-we-d1-yet.sh \"$(< accuracy.txt)\" $DISCORD_WEBHOOK \"Spawn 1.09b\"\n  hellfire_101_diff:\n    machine: true\n    steps:\n      - checkout\n      - run: |\n          set -e\n          wget https://github.com/diasurgical/devilution-comparer/releases/download/v0.4.0/devilution-comparer-v0.4.0-x86_64-unknown-linux-gnu.tar.xz\n          tar xf devilution-comparer-v0.4.0-x86_64-unknown-linux-gnu.tar.xz\n          mv comparer-config/hellfire.toml comparer-config.toml\n          echo '#!/bin/sh' | sudo tee /bin/wine\n          echo 'docker run -v $(pwd):/root/devilution --entrypoint \"/usr/bin/wine\" diasurgical/riivaaja:stable $(basename $1) $2 $3' | sudo tee --append /bin/wine\n          sudo chmod +x /bin/wine\n          docker run -v $(pwd):/root/devilution -e MAKE_BUILD=pdb -e HELLFIRE=1 diasurgical/riivaaja:stable\n          dd if=/dev/zero bs=1 count=3072 of=hellfire.exe\n          dd if=Diablo.exe >> hellfire.exe\n          ./devilution-comparer generate-full hellfire.exe --no-mem-disp --truncate-to-original\n          docker run -v $(pwd):/root/devilution diasurgical/riivaaja:stable ../hellfire-status.sh\n          .circleci/are-we-d1-yet.sh \"$(< accuracy.txt)\" $DISCORD_WEBHOOK \"Hellfire 1.01\"\n  linux:\n    docker:\n      - image: debian:stretch-backports\n    steps:\n      - checkout\n      - run: apt-get update -y\n      - run: apt-get install -y mingw-w64 make\n      - run: make -j2\n      - run: make clean\n      - run: make debug -j2\n\nworkflows:\n  version: 2\n  testflow:\n    jobs:\n      - diablo_109b\n      - diablo_109b_diff\n      - spawn_109b_diff\n      - hellfire_101_diff\n      - linux\n"
  },
  {
    "path": ".clang-format",
    "content": "BasedOnStyle: webkit\nAlignTrailingComments: true\nAllowShortBlocksOnASingleLine: true\nAllowShortFunctionsOnASingleLine: None\nPointerAlignment: Right\nAlignConsecutiveAssignments: true\nTabWidth: 4\nUseTab: ForIndentation\nSortIncludes: false\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\r\n\r\n[*]\r\nindent_style = tab\r\nend_of_line = crlf\r\ncharset = utf-8\r\ntrim_trailing_whitespace = true\r\ninsert_final_newline = true\r\n\r\n[*.sh]\r\nend_of_line = lf\r\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\nBefore creating a bug report, please note that this bug tracker is only intended for the original devilution project, which is binary exact function-wise. Please report bugs in ports of devilution in their respective repositories: [Browser port](https://github.com/d07RiV/diabloweb/issues), [Crossplatform port](https://github.com/diasurgical/devilutionX/issues)\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/workflows/build_mac.yml",
    "content": "name: macOS Build\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    \n\njobs:\n  xcode:\n    runs-on: macos-11\n\n    steps:\n      - uses: actions/checkout@v2\n\n      - name: Install dependencies\n        run: brew install mingw-w64\n\n      - name: Build\n        run: make -j8\n\n      "
  },
  {
    "path": ".gitignore",
    "content": "# Generated by VC++ 6 builds\n/vc60.idb\n*.asm\n*.idb\n\n# macOS\n.DS_Store\n\n# CodeLite\n.CodeLite\n*.project\n*.workspace\n\n# Devilution Comparer\ndevilution-comparer\ncomparer-config.toml\n\n# ELF object file.\n*.o\n\n# PE shared library and associated files.\n*.lib\n*.exp\n*.dll\n\n# PE executable.\n*.exe\n\n# GCC dependency file.\n*.d\n\n# Resource file.\n*.res\n\n# Created by https://www.gitignore.io/api/visualstudio\n\n### VisualStudio ###\n## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\nWinDebug/\nWinRel/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n### VisualStudio Patch ###\n# By default, sensitive information, such as encrypted password\n# should be stored in the .pubxml.user file.\n*.pubxml.user\n\n# End of https://www.gitignore.io/api/visualstudio\n/docs/html/\n\n# MPQ files\n*.mpq\n\n# ddraw wrapper configuration file\nddraw_settings.ini"
  },
  {
    "path": "3rdParty/PKWare/Makefile",
    "content": "VC5_DIR ?= $(HOME)/DevStudio_5.10/VC\n\n# The $(VS6_DIR) directory is a copy of the \"Microsoft Visual Studio\" directory.\n#\n# To get a working setup on Linux or other \"portable\" copies of VS,\n# the following DLLs have to be copied to the\n# $(VS6_DIR)/VC98/Bin directory.\n#\n#     - $(VS6_DIR)/Common/MSDev98/Bin/MSPDB60.DLL\n#\n# And to the $(VC5_DIR)/bin directory.\n#\n#     - $(VC5_DIR)/SharedIDE/bin/MSDIS100.DLL\n#     - $(VC5_DIR)/SharedIDE/bin/MSPDB50.DLL\nVS6_DIR ?= $(HOME)/VS6\n\nVC6_DIR     = $(VS6_DIR)/VC98\n\nVC6_BIN_DIR = $(VC6_DIR)/Bin\nVC6_INC_DIR = $(VC6_DIR)/Include\nVC6_LIB_DIR = $(VC6_DIR)/Lib\n\nVC5_LIB_DIR = $(VC5_DIR)/lib\n\nIDE_DIR ?= $(VS6_DIR)/Common/MSDev98\nIDE_BIN_DIR = $(IDE_DIR)/bin\nifeq ($(OS),Windows_NT)\n\tCL = $(VC6_BIN_DIR)/CL.EXE\n\tRC = $(IDE_BIN_DIR)/RC.EXE\n\tVC5_LINK = $(VC5_DIR)/bin/link.exe\n\tVC6_LINK = $(VC6_BIN_DIR)/link.exe\nelse\n\tCL = wine $(VC6_BIN_DIR)/CL.EXE\n\tRC = wine $(IDE_BIN_DIR)/RC.EXE\n\tVC5_LINK = wine $(VC5_DIR)/bin/link.exe\n\tVC6_LINK = wine $(VC6_BIN_DIR)/link.exe\nendif\n\nCFLAGS=/nologo /c /GX /W3 /O1 /I $(VC6_INC_DIR) /FD /MT /D \"NDEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /YX /Gm /Zi\nLINKFLAGS=/nologo /subsystem:windows /machine:I386 /incremental:no\n\nVC_LINK=$(VC5_LINK)\nLINKFLAGS+= /LIBPATH:$(VC5_LIB_DIR)\n\nall: pkware.lib\n\nPKWARE_SRC=$(sort $(wildcard *.cpp))\nPKWARE_OBJS=$(PKWARE_SRC:.cpp=.obj)\n\npkware.lib: $(PKWARE_OBJS)\n\t$(VC_LINK) -lib /OUT:$@ $^ /nologo\n\n%.obj: %.cpp\n\t$(CL) $(CFLAGS) /Fo$@ $<\n\nclean:\n\t@$(RM) -v $(PKWARE_OBJS) pkware.lib vc60.{idb,pch,pdb}\n\n.PHONY: clean all\n"
  },
  {
    "path": "3rdParty/PKWare/PKWare.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"explode.cpp\" />\n    <ClCompile Include=\"implode.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"pkware.h\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{C7F9F3B4-2F7C-4672-9586-94D8BA0950B6}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>PKWare</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>.\\WinDebug\\</OutDir>\n    <IntDir>.\\WinDebug\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>.\\WinRel</OutDir>\n    <IntDir>.\\WinRel</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "3rdParty/PKWare/PKWare.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"explode.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"implode.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"pkware.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "3rdParty/PKWare/Pkware.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"Pkware\" - Package Owner=<4>\r\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n# ** DO NOT EDIT **\r\n\r\n# TARGTYPE \"Win32 (x86) Static Library\" 0x0104\r\n\r\nCFG=Pkware - Win32 Debug\r\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n!MESSAGE use the Export Makefile command and run\r\n!MESSAGE\r\n!MESSAGE NMAKE /f \"Pkware.mak\".\r\n!MESSAGE\r\n!MESSAGE You can specify a configuration when running NMAKE\r\n!MESSAGE by defining the macro CFG on the command line. For example:\r\n!MESSAGE\r\n!MESSAGE NMAKE /f \"Pkware.mak\" CFG=\"Pkware - Win32 Debug\"\r\n!MESSAGE\r\n!MESSAGE Possible choices for configuration are:\r\n!MESSAGE\r\n!MESSAGE \"Pkware - Win32 Release\" (based on \"Win32 (x86) Static Library\")\r\n!MESSAGE \"Pkware - Win32 Debug\" (based on \"Win32 (x86) Static Library\")\r\n!MESSAGE\r\n\r\n# Begin Project\r\n# PROP AllowPerConfigDependencies 0\r\n# PROP Scc_ProjName \"\"\r\n# PROP Scc_LocalPath \"\"\r\nCPP=cl.exe\r\nRSC=rc.exe\r\n\r\n!IF  \"$(CFG)\" == \"Pkware - Win32 Release\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 0\r\n# PROP BASE Output_Dir \"WinRel\"\r\n# PROP BASE Intermediate_Dir \"WinRel\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 0\r\n# PROP Output_Dir \"WinRel\"\r\n# PROP Intermediate_Dir \"WinRel\"\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\r\n# ADD CPP /nologo /MT /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\r\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\r\n# ADD RSC /l 0x409 /d \"NDEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLIB32=link.exe -lib\r\n# ADD BASE LIB32 /nologo\r\n# ADD LIB32 /nologo\r\n\r\n!ELSEIF  \"$(CFG)\" == \"Pkware - Win32 Debug\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 1\r\n# PROP BASE Output_Dir \"WinDebug\"\r\n# PROP BASE Intermediate_Dir \"WinDebug\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 1\r\n# PROP Output_Dir \"WinDebug\"\r\n# PROP Intermediate_Dir \"WinDebug\"\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\r\n# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\r\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\r\n# ADD RSC /l 0x409 /d \"_DEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLIB32=link.exe -lib\r\n# ADD BASE LIB32 /nologo\r\n# ADD LIB32 /nologo\r\n\r\n!ENDIF\r\n\r\n# Begin Target\r\n\r\n# Name \"Pkware - Win32 Release\"\r\n# Name \"Pkware - Win32 Debug\"\r\n# Begin Group \"Source Files\"\r\n\r\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\r\n# Begin Source File\r\n\r\nSOURCE=.\\explode.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\implode.cpp\r\n# End Source File\r\n# End Group\r\n# Begin Group \"Header Files\"\r\n\r\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\r\n# End Group\r\n# End Target\r\n# End Project\r\n"
  },
  {
    "path": "3rdParty/PKWare/explode.cpp",
    "content": "/*****************************************************************************/\n/* explode.cpp                            Copyright (c) Ladislav Zezula 2003 */\n/*---------------------------------------------------------------------------*/\n/* Implode function of PKWARE Data Compression library                       */\n/*---------------------------------------------------------------------------*/\n/*   Date    Ver   Who  Comment                                              */\n/* --------  ----  ---  -------                                              */\n/* 11.03.03  1.00  Lad  Splitted from Pkware.cpp                             */\n/* 08.04.03  1.01  Lad  Renamed to explode.cpp to be compatible with pkware  */\n/* 02.05.03  1.01  Lad  Stress test done                                     */\n/* 22.04.10  1.01  Lad  Documented                                           */\n/*****************************************************************************/\n\n#include <assert.h>\n#include <string.h>\n\n#include \"pkware.h\"\n\n#define PKDCL_OK                    0       \n#define PKDCL_STREAM_END            1   // All data from the input stream is read\n#define PKDCL_NEED_DICT             2   // Need more data (dictionary)\n#define PKDCL_CONTINUE             10   // Internal flag, not returned to user\n#define PKDCL_GET_INPUT            11   // Internal flag, not returned to user\n\nstatic char CopyrightPkware[] = \"PKWARE Data Compression Library for Win32\\r\\n\"\n                                \"Copyright 1989-1995 PKWARE Inc.  All Rights Reserved\\r\\n\"\n                                \"Patent No. 5,051,745\\r\\n\"\n                                \"PKWARE Data Compression Library Reg. U.S. Pat. and Tm. Off.\\r\\n\"\n                                \"Version 1.11\\r\\n\";\n\n//-----------------------------------------------------------------------------\n// Tables\n\nstatic unsigned char DistBits[] = \n{\n    0x02, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n    0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\n    0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\n    0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08\n};\n\nstatic unsigned char DistCode[] = \n{\n    0x03, 0x0D, 0x05, 0x19, 0x09, 0x11, 0x01, 0x3E, 0x1E, 0x2E, 0x0E, 0x36, 0x16, 0x26, 0x06, 0x3A,\n    0x1A, 0x2A, 0x0A, 0x32, 0x12, 0x22, 0x42, 0x02, 0x7C, 0x3C, 0x5C, 0x1C, 0x6C, 0x2C, 0x4C, 0x0C,\n    0x74, 0x34, 0x54, 0x14, 0x64, 0x24, 0x44, 0x04, 0x78, 0x38, 0x58, 0x18, 0x68, 0x28, 0x48, 0x08,\n    0xF0, 0x70, 0xB0, 0x30, 0xD0, 0x50, 0x90, 0x10, 0xE0, 0x60, 0xA0, 0x20, 0xC0, 0x40, 0x80, 0x00\n};\n\nstatic unsigned char ExLenBits[] =\n{\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08\n};\n\nstatic unsigned short LenBase[] =\n{\n    0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,\n    0x0008, 0x000A, 0x000E, 0x0016, 0x0026, 0x0046, 0x0086, 0x0106\n};\n\nstatic unsigned char LenBits[] =\n{\n    0x03, 0x02, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07\n};\n\nstatic unsigned char LenCode[] =\n{\n    0x05, 0x03, 0x01, 0x06, 0x0A, 0x02, 0x0C, 0x14, 0x04, 0x18, 0x08, 0x30, 0x10, 0x20, 0x40, 0x00\n};\n\nstatic unsigned char ChBitsAsc[] =\n{\n    0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x07, 0x0C, 0x0C, 0x07, 0x0C, 0x0C,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x04, 0x0A, 0x08, 0x0C, 0x0A, 0x0C, 0x0A, 0x08, 0x07, 0x07, 0x08, 0x09, 0x07, 0x06, 0x07, 0x08,\n    0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07, 0x07, 0x08, 0x08, 0x0C, 0x0B, 0x07, 0x09, 0x0B,\n    0x0C, 0x06, 0x07, 0x06, 0x06, 0x05, 0x07, 0x08, 0x08, 0x06, 0x0B, 0x09, 0x06, 0x07, 0x06, 0x06,\n    0x07, 0x0B, 0x06, 0x06, 0x06, 0x07, 0x09, 0x08, 0x09, 0x09, 0x0B, 0x08, 0x0B, 0x09, 0x0C, 0x08,\n    0x0C, 0x05, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x0B, 0x07, 0x05, 0x06, 0x05, 0x05,\n    0x06, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x08, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C,\n    0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\n    0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\n    0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D,\n    0x0D, 0x0D, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D\n};\n\nstatic unsigned short ChCodeAsc[] = \n{\n    0x0490, 0x0FE0, 0x07E0, 0x0BE0, 0x03E0, 0x0DE0, 0x05E0, 0x09E0,\n    0x01E0, 0x00B8, 0x0062, 0x0EE0, 0x06E0, 0x0022, 0x0AE0, 0x02E0,\n    0x0CE0, 0x04E0, 0x08E0, 0x00E0, 0x0F60, 0x0760, 0x0B60, 0x0360,\n    0x0D60, 0x0560, 0x1240, 0x0960, 0x0160, 0x0E60, 0x0660, 0x0A60,\n    0x000F, 0x0250, 0x0038, 0x0260, 0x0050, 0x0C60, 0x0390, 0x00D8,\n    0x0042, 0x0002, 0x0058, 0x01B0, 0x007C, 0x0029, 0x003C, 0x0098,\n    0x005C, 0x0009, 0x001C, 0x006C, 0x002C, 0x004C, 0x0018, 0x000C,\n    0x0074, 0x00E8, 0x0068, 0x0460, 0x0090, 0x0034, 0x00B0, 0x0710,\n    0x0860, 0x0031, 0x0054, 0x0011, 0x0021, 0x0017, 0x0014, 0x00A8,\n    0x0028, 0x0001, 0x0310, 0x0130, 0x003E, 0x0064, 0x001E, 0x002E,\n    0x0024, 0x0510, 0x000E, 0x0036, 0x0016, 0x0044, 0x0030, 0x00C8,\n    0x01D0, 0x00D0, 0x0110, 0x0048, 0x0610, 0x0150, 0x0060, 0x0088,\n    0x0FA0, 0x0007, 0x0026, 0x0006, 0x003A, 0x001B, 0x001A, 0x002A,\n    0x000A, 0x000B, 0x0210, 0x0004, 0x0013, 0x0032, 0x0003, 0x001D,\n    0x0012, 0x0190, 0x000D, 0x0015, 0x0005, 0x0019, 0x0008, 0x0078,\n    0x00F0, 0x0070, 0x0290, 0x0410, 0x0010, 0x07A0, 0x0BA0, 0x03A0,\n    0x0240, 0x1C40, 0x0C40, 0x1440, 0x0440, 0x1840, 0x0840, 0x1040,\n    0x0040, 0x1F80, 0x0F80, 0x1780, 0x0780, 0x1B80, 0x0B80, 0x1380,\n    0x0380, 0x1D80, 0x0D80, 0x1580, 0x0580, 0x1980, 0x0980, 0x1180,\n    0x0180, 0x1E80, 0x0E80, 0x1680, 0x0680, 0x1A80, 0x0A80, 0x1280,\n    0x0280, 0x1C80, 0x0C80, 0x1480, 0x0480, 0x1880, 0x0880, 0x1080,\n    0x0080, 0x1F00, 0x0F00, 0x1700, 0x0700, 0x1B00, 0x0B00, 0x1300,\n    0x0DA0, 0x05A0, 0x09A0, 0x01A0, 0x0EA0, 0x06A0, 0x0AA0, 0x02A0,\n    0x0CA0, 0x04A0, 0x08A0, 0x00A0, 0x0F20, 0x0720, 0x0B20, 0x0320,\n    0x0D20, 0x0520, 0x0920, 0x0120, 0x0E20, 0x0620, 0x0A20, 0x0220,\n    0x0C20, 0x0420, 0x0820, 0x0020, 0x0FC0, 0x07C0, 0x0BC0, 0x03C0,\n    0x0DC0, 0x05C0, 0x09C0, 0x01C0, 0x0EC0, 0x06C0, 0x0AC0, 0x02C0,\n    0x0CC0, 0x04C0, 0x08C0, 0x00C0, 0x0F40, 0x0740, 0x0B40, 0x0340,\n    0x0300, 0x0D40, 0x1D00, 0x0D00, 0x1500, 0x0540, 0x0500, 0x1900,\n    0x0900, 0x0940, 0x1100, 0x0100, 0x1E00, 0x0E00, 0x0140, 0x1600,\n    0x0600, 0x1A00, 0x0E40, 0x0640, 0x0A40, 0x0A00, 0x1200, 0x0200,\n    0x1C00, 0x0C00, 0x1400, 0x0400, 0x1800, 0x0800, 0x1000, 0x0000  \n};\n\n//-----------------------------------------------------------------------------\n// Local functions\n\nstatic void PKWAREAPI GenDecodeTabs(\n    unsigned char * positions,          // [out] Table of positions\n    unsigned char * start_indexes,      // [in] Table of start indexes\n    unsigned char * length_bits,        // [in] Table of lengths. Each length is stored as number of bits\n    size_t elements)                    // [in] Number of elements in start_indexes and length_bits\n{\n    unsigned int index;\n    unsigned int length;\n    size_t i;\n\n    for(i = 0; i < elements; i++)\n    {\n        length = 1 << length_bits[i];   // Get the length in bytes\n\n        for(index = start_indexes[i]; index < 0x100; index += length)\n        {\n            positions[index] = (unsigned char)i;\n        }\n    }\n}\n\nstatic void PKWAREAPI GenAscTabs(TDcmpStruct * pWork)\n{\n    unsigned short * pChCodeAsc = &ChCodeAsc[0xFF];\n    unsigned int  acc, add;\n    unsigned short count;\n\n    for(count = 0x00FF; pChCodeAsc >= ChCodeAsc; pChCodeAsc--, count--)\n    {\n        unsigned char * pChBitsAsc = pWork->ChBitsAsc + count;\n        unsigned char bits_asc = *pChBitsAsc;\n\n        if(bits_asc <= 8)\n        {\n            add = (1 << bits_asc);\n            acc = *pChCodeAsc;\n\n            do\n            {\n                pWork->offs2C34[acc] = (unsigned char)count;\n                acc += add;\n            }\n            while(acc < 0x100);\n        }\n        else if((acc = (*pChCodeAsc & 0xFF)) != 0)\n        {\n            pWork->offs2C34[acc] = 0xFF;\n\n            if(*pChCodeAsc & 0x3F)\n            {\n                bits_asc -= 4;\n                *pChBitsAsc = bits_asc;\n\n                add = (1 << bits_asc);\n                acc = *pChCodeAsc >> 4;\n                do\n                {\n                    pWork->offs2D34[acc] = (unsigned char)count;\n                    acc += add;\n                }\n                while(acc < 0x100);\n            }\n            else\n            {\n                bits_asc -= 6;\n                *pChBitsAsc = bits_asc;\n\n                add = (1 << bits_asc);\n                acc = *pChCodeAsc >> 6;\n                do\n                {\n                    pWork->offs2E34[acc] = (unsigned char)count;\n                    acc += add;\n                }\n                while(acc < 0x80);\n            }\n        }\n        else\n        {\n            bits_asc -= 8;\n            *pChBitsAsc = bits_asc;\n\n            add = (1 << bits_asc);\n            acc = *pChCodeAsc >> 8;\n            do\n            {\n                pWork->offs2EB4[acc] = (unsigned char)count;\n                acc += add;\n            }\n            while(acc < 0x100);\n        }\n    }\n}\n\n//-----------------------------------------------------------------------------\n// Removes given number of bits in the bit buffer. New bits are reloaded from\n// the input buffer, if needed.\n// Returns: PKDCL_OK:         Operation was successful\n//          PKDCL_STREAM_END: There are no more bits in the input buffer\n\nstatic int PKWAREAPI WasteBits(TDcmpStruct * pWork, unsigned int nBits)\n{\n    // If number of bits required is less than number of (bits in the buffer) ?\n    if(nBits <= pWork->extra_bits)\n    {\n        pWork->extra_bits -= nBits;\n        pWork->bit_buff  >>= nBits;\n        return PKDCL_OK;\n    }\n\n    // Load input buffer if necessary\n    pWork->bit_buff >>= pWork->extra_bits;\n    if(pWork->in_pos == pWork->in_bytes)\n    {\n        pWork->in_pos = sizeof(pWork->in_buff);\n        if((pWork->in_bytes = pWork->read_buf((char *)pWork->in_buff, &pWork->in_pos, pWork->param)) == 0)\n            return PKDCL_STREAM_END;\n        pWork->in_pos = 0;\n    }\n\n    // Update bit buffer\n    pWork->bit_buff  |= (pWork->in_buff[pWork->in_pos++] << 8);\n    pWork->bit_buff >>= (nBits - pWork->extra_bits);\n    pWork->extra_bits = (pWork->extra_bits - nBits) + 8;\n    return PKDCL_OK;\n}\n\n//-----------------------------------------------------------------------------\n// Decodes next literal from the input (compressed) data.\n// Returns : 0x000: One byte 0x00\n//           0x001: One byte 0x01\n//           ...\n//           0x0FF: One byte 0xFF\n//           0x100: Repetition, length of 0x02 bytes\n//           0x101: Repetition, length of 0x03 bytes\n//           ...\n//           0x304: Repetition, length of 0x206 bytes\n//           0x305: End of stream\n//           0x306: Error\n\nstatic unsigned int PKWAREAPI DecodeLit(TDcmpStruct * pWork)\n{\n    unsigned int extra_length_bits;    // Number of bits of extra literal length\n    unsigned int length_code;          // Length code\n    unsigned int value;\n\n    // Test the current bit in byte buffer. If is not set, simply return the next 8 bits.\n    if(pWork->bit_buff & 1)\n    {\n        // Remove one bit from the input data\n        if(WasteBits(pWork, 1))\n            return 0x306;   \n                      \n        // The next 8 bits hold the index to the length code table\n        length_code = pWork->LengthCodes[pWork->bit_buff & 0xFF];\n        \n        // Remove the apropriate number of bits\n        if(WasteBits(pWork, pWork->LenBits[length_code]))\n            return 0x306;\n\n        // Are there some extra bits for the obtained length code ?\n        if((extra_length_bits = pWork->ExLenBits[length_code]) != 0)\n        {\n            unsigned int extra_length = pWork->bit_buff & ((1 << extra_length_bits) - 1);\n\n            if(WasteBits(pWork, extra_length_bits))\n            {\n                if((length_code + extra_length) != 0x10E)\n                    return 0x306;\n            }\n            length_code = pWork->LenBase[length_code] + extra_length;\n        }\n\n        // In order to distinguish uncompressed byte from repetition length,\n        // we have to add 0x100 to the length.\n        return length_code + 0x100;\n    }\n\n    // Remove one bit from the input data\n    if(WasteBits(pWork, 1))\n        return 0x306;\n\n    // If the binary compression type, read 8 bits and return them as one byte.\n    if(pWork->ctype == CMP_BINARY)\n    {\n        unsigned int uncompressed_byte = pWork->bit_buff & 0xFF;\n\n        if(WasteBits(pWork, 8))\n            return 0x306;\n        return uncompressed_byte;\n    }\n\n    // When ASCII compression ...\n    if(pWork->bit_buff & 0xFF)\n    {\n        value = pWork->offs2C34[pWork->bit_buff & 0xFF];\n\n        if(value == 0xFF)\n        {\n            if(pWork->bit_buff & 0x3F)\n            {\n                if(WasteBits(pWork, 4))\n                    return 0x306;\n\n                value = pWork->offs2D34[pWork->bit_buff & 0xFF];\n            }\n            else\n            {\n                if(WasteBits(pWork, 6))\n                    return 0x306;\n\n                value = pWork->offs2E34[pWork->bit_buff & 0x7F];\n            }\n        }\n    }\n    else\n    {\n        if(WasteBits(pWork, 8))\n            return 0x306;\n\n        value = pWork->offs2EB4[pWork->bit_buff & 0xFF];\n    }\n\n    return WasteBits(pWork, pWork->ChBitsAsc[value]) ? 0x306 : value;\n}\n\n//-----------------------------------------------------------------------------\n// Decodes the distance of the repetition, backwards relative to the\n// current output buffer position\n\nstatic unsigned int PKWAREAPI DecodeDist(TDcmpStruct * pWork, unsigned int rep_length)\n{\n    unsigned int dist_pos_code;            // Distance position code\n    unsigned int dist_pos_bits;            // Number of bits of distance position\n    unsigned int distance;                 // Distance position\n\n    // Next 2-8 bits in the input buffer is the distance position code\n    dist_pos_code = pWork->DistPosCodes[pWork->bit_buff & 0xFF];\n    dist_pos_bits = pWork->DistBits[dist_pos_code];\n    if(WasteBits(pWork, dist_pos_bits))\n        return 0;\n\n    if(rep_length == 2)\n    {\n        // If the repetition is only 2 bytes length,\n        // then take 2 bits from the stream in order to get the distance\n        distance = (dist_pos_code << 2) | (pWork->bit_buff & 0x03);\n        if(WasteBits(pWork, 2))\n            return 0;\n    }\n    else\n    {\n        // If the repetition is more than 2 bytes length,\n        // then take \"dsize_bits\" bits in order to get the distance\n        distance = (dist_pos_code << pWork->dsize_bits) | (pWork->bit_buff & pWork->dsize_mask);\n        if(WasteBits(pWork, pWork->dsize_bits))\n            return 0;\n    }\n    return distance + 1;\n}\n\nstatic unsigned int PKWAREAPI Expand(TDcmpStruct * pWork)\n{\n    unsigned int next_literal;         // Literal decoded from the compressed data\n    unsigned int result;               // Value to be returned\n    unsigned int copyBytes;             // Number of bytes to copy to the output buffer\n\n    pWork->outputPos = 0x1000;          // Initialize output buffer position\n\n    // Decode the next literal from the input data.\n    // The returned literal can either be an uncompressed byte (next_literal < 0x100)\n    // or an encoded length of the repeating byte sequence that\n    // is to be copied to the current buffer position\n    while((result = next_literal = DecodeLit(pWork)) < 0x305)\n    {\n        // If the literal is greater than 0x100, it holds length\n        // of repeating byte sequence\n        // literal of 0x100 means repeating sequence of 0x2 bytes\n        // literal of 0x101 means repeating sequence of 0x3 bytes\n        // ...\n        // literal of 0x305 means repeating sequence of 0x207 bytes\n        if(next_literal >= 0x100)\n        {\n            unsigned char * source;\n            unsigned char * target;\n            unsigned int rep_length;       // Length of the repetition, in bytes\n            unsigned int minus_dist;       // Backward distance to the repetition, relative to the current buffer position\n\n            // Get the length of the repeating sequence.\n            // Note that the repeating block may overlap the current output position,\n            // for example if there was a sequence of equal bytes\n            rep_length = next_literal - 0xFE;\n\n            // Get backward distance to the repetition\n            if((minus_dist = DecodeDist(pWork, rep_length)) == 0)\n            {\n                result = 0x306;\n                break;\n            }\n\n            // Target and source pointer\n            target = &pWork->out_buff[pWork->outputPos];\n            source = target - minus_dist;\n\n            // Update buffer output position\n            pWork->outputPos += rep_length;\n\n            // Copy the repeating sequence\n            while(rep_length-- > 0)\n                *target++ = *source++;\n        }\n        else\n        {\n            pWork->out_buff[pWork->outputPos++] = (unsigned char)next_literal;\n        }\n    \n        // Flush the output buffer, if number of extracted bytes has reached the end\n        if(pWork->outputPos >= 0x2000)\n        {\n            // Copy decompressed data into user buffer\n            copyBytes = 0x1000;\n            pWork->write_buf((char *)&pWork->out_buff[0x1000], &copyBytes, pWork->param);\n\n            // Now copy the decompressed data to the first half of the buffer.\n            // This is needed because the decompression might reuse them as repetitions.\n            // Note that if the output buffer overflowed previously, the extra decompressed bytes\n            // are stored in \"out_buff_overflow\", and they will now be\n            // within decompressed part of the output buffer.\n            memmove(pWork->out_buff, &pWork->out_buff[0x1000], pWork->outputPos - 0x1000);\n            pWork->outputPos -= 0x1000;\n        }\n    }\n\n    // Flush any remaining decompressed bytes\n    copyBytes = pWork->outputPos - 0x1000;\n    pWork->write_buf((char *)&pWork->out_buff[0x1000], &copyBytes, pWork->param);\n    return result;\n}\n\n\n//-----------------------------------------------------------------------------\n// Main exploding function.\n\nunsigned int PKWAREAPI explode(\n        unsigned int (PKWAREAPI *read_buf)(char *buf, unsigned  int *size, void *param),\n        void         (PKWAREAPI *write_buf)(char *buf, unsigned  int *size, void *param),\n        char         *work_buf,\n        void         *param)\n{\n    TDcmpStruct * pWork = (TDcmpStruct *)work_buf;\n\n    // Initialize work struct and load compressed data\n    // Note: The caller must zero the \"work_buff\" before passing it to explode\n    pWork->read_buf   = read_buf;\n    pWork->write_buf  = write_buf;\n    pWork->param      = param;\n    pWork->in_pos     = sizeof(pWork->in_buff);\n    pWork->in_bytes   = pWork->read_buf((char *)pWork->in_buff, &pWork->in_pos, pWork->param);\n    if(pWork->in_bytes <= 4)\n        return CMP_BAD_DATA;\n\n    pWork->ctype      = pWork->in_buff[0]; // Get the compression type (CMP_BINARY or CMP_ASCII)\n    pWork->dsize_bits = pWork->in_buff[1]; // Get the dictionary size\n    pWork->bit_buff   = pWork->in_buff[2]; // Initialize 16-bit bit buffer\n    pWork->extra_bits = 0;                 // Extra (over 8) bits\n    pWork->in_pos     = 3;                 // Position in input buffer\n\n    // Test for the valid dictionary size\n    if(4 > pWork->dsize_bits || pWork->dsize_bits > 6) \n        return CMP_INVALID_DICTSIZE;\n\n    pWork->dsize_mask = 0xFFFF >> (0x10 - pWork->dsize_bits); // Shifted by 'sar' instruction\n\n    if(pWork->ctype != CMP_BINARY)\n    {\n        if(pWork->ctype != CMP_ASCII)\n            return CMP_INVALID_MODE;\n\n        memcpy(pWork->ChBitsAsc, ChBitsAsc, sizeof(pWork->ChBitsAsc));\n        GenAscTabs(pWork);\n    }\n\n    memcpy(pWork->LenBits, LenBits, sizeof(pWork->LenBits));\n    GenDecodeTabs(pWork->LengthCodes, LenCode, pWork->LenBits, sizeof(pWork->LenBits));\n    memcpy(pWork->ExLenBits, ExLenBits, sizeof(pWork->ExLenBits));\n    memcpy(pWork->LenBase, LenBase, sizeof(pWork->LenBase));\n    memcpy(pWork->DistBits, DistBits, sizeof(pWork->DistBits));\n    GenDecodeTabs(pWork->DistPosCodes, DistCode, pWork->DistBits, sizeof(pWork->DistBits));\n    if(Expand(pWork) != 0x306)\n        return CMP_NO_ERROR;\n        \n    return CMP_ABORT;\n}\n"
  },
  {
    "path": "3rdParty/PKWare/implode.cpp",
    "content": "/*****************************************************************************/\n/* implode.cpp                            Copyright (c) Ladislav Zezula 2003 */\n/*---------------------------------------------------------------------------*/\n/* Implode function of PKWARE Data Compression library                       */\n/*---------------------------------------------------------------------------*/\n/*   Date    Ver   Who  Comment                                              */\n/* --------  ----  ---  -------                                              */\n/* 11.04.03  1.00  Lad  First version of implode.cpp                         */\n/* 02.05.03  1.00  Lad  Stress test done                                     */\n/* 22.04.10  1.01  Lad  Documented                                           */\n/*****************************************************************************/\n\n#include <assert.h>\n#include <string.h>\n\n#include \"pkware.h\"\n\n#if ((1200 < _MSC_VER) && (_MSC_VER < 1400))\n#pragma optimize(\"\", off)\n#endif\n\n//-----------------------------------------------------------------------------\n// Defines\n\n#define MAX_REP_LENGTH 0x204            // The longest allowed repetition\n\nstatic char CopyrightPkware[] = \"PKWARE Data Compression Library for Win32\\r\\n\"\n                                \"Copyright 1989-1995 PKWARE Inc.  All Rights Reserved\\r\\n\"\n                                \"Patent No. 5,051,745\\r\\n\"\n                                \"PKWARE Data Compression Library Reg. U.S. Pat. and Tm. Off.\\r\\n\"\n                                \"Version 1.11\\r\\n\";\n\n//-----------------------------------------------------------------------------\n// Tables\n\nstatic unsigned char DistBits[] = \n{\n    0x02, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\n    0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\n    0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\n    0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08\n};\n\nstatic unsigned char DistCode[] = \n{\n    0x03, 0x0D, 0x05, 0x19, 0x09, 0x11, 0x01, 0x3E, 0x1E, 0x2E, 0x0E, 0x36, 0x16, 0x26, 0x06, 0x3A,\n    0x1A, 0x2A, 0x0A, 0x32, 0x12, 0x22, 0x42, 0x02, 0x7C, 0x3C, 0x5C, 0x1C, 0x6C, 0x2C, 0x4C, 0x0C,\n    0x74, 0x34, 0x54, 0x14, 0x64, 0x24, 0x44, 0x04, 0x78, 0x38, 0x58, 0x18, 0x68, 0x28, 0x48, 0x08,\n    0xF0, 0x70, 0xB0, 0x30, 0xD0, 0x50, 0x90, 0x10, 0xE0, 0x60, 0xA0, 0x20, 0xC0, 0x40, 0x80, 0x00\n};\n\nstatic unsigned char ExLenBits[] =\n{\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08\n};\n\nstatic unsigned char LenBits[] =\n{\n    0x03, 0x02, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07\n};\n\nstatic unsigned char LenCode[] =\n{\n    0x05, 0x03, 0x01, 0x06, 0x0A, 0x02, 0x0C, 0x14, 0x04, 0x18, 0x08, 0x30, 0x10, 0x20, 0x40, 0x00\n};\n\nstatic unsigned char ChBitsAsc[] =\n{\n    0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x07, 0x0C, 0x0C, 0x07, 0x0C, 0x0C,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x04, 0x0A, 0x08, 0x0C, 0x0A, 0x0C, 0x0A, 0x08, 0x07, 0x07, 0x08, 0x09, 0x07, 0x06, 0x07, 0x08,\n    0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07, 0x07, 0x08, 0x08, 0x0C, 0x0B, 0x07, 0x09, 0x0B,\n    0x0C, 0x06, 0x07, 0x06, 0x06, 0x05, 0x07, 0x08, 0x08, 0x06, 0x0B, 0x09, 0x06, 0x07, 0x06, 0x06,\n    0x07, 0x0B, 0x06, 0x06, 0x06, 0x07, 0x09, 0x08, 0x09, 0x09, 0x0B, 0x08, 0x0B, 0x09, 0x0C, 0x08,\n    0x0C, 0x05, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x0B, 0x07, 0x05, 0x06, 0x05, 0x05,\n    0x06, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x08, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C,\n    0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\n    0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\n    0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\n    0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D,\n    0x0D, 0x0D, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D\n};\n\nstatic unsigned short ChCodeAsc[] = \n{\n    0x0490, 0x0FE0, 0x07E0, 0x0BE0, 0x03E0, 0x0DE0, 0x05E0, 0x09E0,\n    0x01E0, 0x00B8, 0x0062, 0x0EE0, 0x06E0, 0x0022, 0x0AE0, 0x02E0,\n    0x0CE0, 0x04E0, 0x08E0, 0x00E0, 0x0F60, 0x0760, 0x0B60, 0x0360,\n    0x0D60, 0x0560, 0x1240, 0x0960, 0x0160, 0x0E60, 0x0660, 0x0A60,\n    0x000F, 0x0250, 0x0038, 0x0260, 0x0050, 0x0C60, 0x0390, 0x00D8,\n    0x0042, 0x0002, 0x0058, 0x01B0, 0x007C, 0x0029, 0x003C, 0x0098,\n    0x005C, 0x0009, 0x001C, 0x006C, 0x002C, 0x004C, 0x0018, 0x000C,\n    0x0074, 0x00E8, 0x0068, 0x0460, 0x0090, 0x0034, 0x00B0, 0x0710,\n    0x0860, 0x0031, 0x0054, 0x0011, 0x0021, 0x0017, 0x0014, 0x00A8,\n    0x0028, 0x0001, 0x0310, 0x0130, 0x003E, 0x0064, 0x001E, 0x002E,\n    0x0024, 0x0510, 0x000E, 0x0036, 0x0016, 0x0044, 0x0030, 0x00C8,\n    0x01D0, 0x00D0, 0x0110, 0x0048, 0x0610, 0x0150, 0x0060, 0x0088,\n    0x0FA0, 0x0007, 0x0026, 0x0006, 0x003A, 0x001B, 0x001A, 0x002A,\n    0x000A, 0x000B, 0x0210, 0x0004, 0x0013, 0x0032, 0x0003, 0x001D,\n    0x0012, 0x0190, 0x000D, 0x0015, 0x0005, 0x0019, 0x0008, 0x0078,\n    0x00F0, 0x0070, 0x0290, 0x0410, 0x0010, 0x07A0, 0x0BA0, 0x03A0,\n    0x0240, 0x1C40, 0x0C40, 0x1440, 0x0440, 0x1840, 0x0840, 0x1040,\n    0x0040, 0x1F80, 0x0F80, 0x1780, 0x0780, 0x1B80, 0x0B80, 0x1380,\n    0x0380, 0x1D80, 0x0D80, 0x1580, 0x0580, 0x1980, 0x0980, 0x1180,\n    0x0180, 0x1E80, 0x0E80, 0x1680, 0x0680, 0x1A80, 0x0A80, 0x1280,\n    0x0280, 0x1C80, 0x0C80, 0x1480, 0x0480, 0x1880, 0x0880, 0x1080,\n    0x0080, 0x1F00, 0x0F00, 0x1700, 0x0700, 0x1B00, 0x0B00, 0x1300,\n    0x0DA0, 0x05A0, 0x09A0, 0x01A0, 0x0EA0, 0x06A0, 0x0AA0, 0x02A0,\n    0x0CA0, 0x04A0, 0x08A0, 0x00A0, 0x0F20, 0x0720, 0x0B20, 0x0320,\n    0x0D20, 0x0520, 0x0920, 0x0120, 0x0E20, 0x0620, 0x0A20, 0x0220,\n    0x0C20, 0x0420, 0x0820, 0x0020, 0x0FC0, 0x07C0, 0x0BC0, 0x03C0,\n    0x0DC0, 0x05C0, 0x09C0, 0x01C0, 0x0EC0, 0x06C0, 0x0AC0, 0x02C0,\n    0x0CC0, 0x04C0, 0x08C0, 0x00C0, 0x0F40, 0x0740, 0x0B40, 0x0340,\n    0x0300, 0x0D40, 0x1D00, 0x0D00, 0x1500, 0x0540, 0x0500, 0x1900,\n    0x0900, 0x0940, 0x1100, 0x0100, 0x1E00, 0x0E00, 0x0140, 0x1600,\n    0x0600, 0x1A00, 0x0E40, 0x0640, 0x0A40, 0x0A00, 0x1200, 0x0200,\n    0x1C00, 0x0C00, 0x1400, 0x0400, 0x1800, 0x0800, 0x1000, 0x0000  \n};\n\n//-----------------------------------------------------------------------------\n// Macros\n\n// Macro for calculating hash of the current byte pair.\n// Note that most exact byte pair hash would be buffer[0] + buffer[1] << 0x08,\n// but even this way gives nice indication of equal byte pairs, with significantly\n// smaller size of the array that holds numbers of those hashes\n#define BYTE_PAIR_HASH(buffer)   ((buffer[0] * 4) + (buffer[1] * 5))\n\n//-----------------------------------------------------------------------------\n// Local functions\n\n// Builds the \"hash_to_index\" table and \"pair_hash_offsets\" table.\n// Every element of \"hash_to_index\" will contain lowest index to the\n// \"pair_hash_offsets\" table, effectively giving offset of the first\n// occurence of the given PAIR_HASH in the input data.\nstatic void PKWAREAPI SortBuffer(TCmpStruct * pWork, unsigned char * buffer_begin, unsigned char * buffer_end)\n{\n    unsigned short * phash_to_index;\n    unsigned char  * buffer_ptr;\n    unsigned short total_sum = 0;\n    unsigned long byte_pair_hash;           // Hash value of the byte pair\n    unsigned short byte_pair_offs;          // Offset of the byte pair, relative to \"work_buff\"\n\n    // Zero the entire \"phash_to_index\" table\n    memset(pWork->phash_to_index, 0, sizeof(pWork->phash_to_index));\n    \n    // Step 1: Count amount of each PAIR_HASH in the input buffer\n    // The table will look like this:\n    //  offs 0x000: Number of occurences of PAIR_HASH 0\n    //  offs 0x001: Number of occurences of PAIR_HASH 1\n    //  ...\n    //  offs 0x8F7: Number of occurences of PAIR_HASH 0x8F7 (the highest hash value)\n    for(buffer_ptr = buffer_begin; buffer_ptr < buffer_end; buffer_ptr++)\n        pWork->phash_to_index[BYTE_PAIR_HASH(buffer_ptr)]++;\n\n    // Step 2: Convert the table to the array of PAIR_HASH amounts. \n    // Each element contains count of PAIR_HASHes that is less or equal\n    // to element index\n    // The table will look like this:\n    //  offs 0x000: Number of occurences of PAIR_HASH 0 or lower\n    //  offs 0x001: Number of occurences of PAIR_HASH 1 or lower\n    //  ...\n    //  offs 0x8F7: Number of occurences of PAIR_HASH 0x8F7 or lower\n    for(phash_to_index = pWork->phash_to_index; phash_to_index < &pWork->phash_to_index_end; phash_to_index++)\n    {\n        total_sum = total_sum + phash_to_index[0];\n        phash_to_index[0] = total_sum;\n    }\n\n    // Step 3: Convert the table to the array of indexes.\n    // Now, each element contains index to the first occurence of given PAIR_HASH\n    for(buffer_end--; buffer_end >= buffer_begin; buffer_end--)\n    {\n        byte_pair_hash = BYTE_PAIR_HASH(buffer_end);\n        byte_pair_offs = (unsigned short)(buffer_end - pWork->work_buff);\n\n        pWork->phash_to_index[byte_pair_hash]--;\n        pWork->phash_offs[pWork->phash_to_index[byte_pair_hash]] = byte_pair_offs;\n    }\n}\n\nstatic void PKWAREAPI FlushBuf(TCmpStruct * pWork)\n{\n    unsigned char save_ch1;\n    unsigned char save_ch2;\n    unsigned int size = 0x800;\n\n    pWork->write_buf(pWork->out_buff, &size, pWork->param);\n\n    save_ch1 = pWork->out_buff[0x800];\n    save_ch2 = pWork->out_buff[pWork->out_bytes];\n    pWork->out_bytes -= 0x800;\n\n    memset(pWork->out_buff, 0, sizeof(pWork->out_buff));\n\n    if(pWork->out_bytes != 0)\n        pWork->out_buff[0] = save_ch1;\n    if(pWork->out_bits != 0)\n        pWork->out_buff[pWork->out_bytes] = save_ch2;\n}\n\nstatic void PKWAREAPI OutputBits(TCmpStruct * pWork, unsigned int nbits, unsigned long bit_buff)\n{\n    unsigned int out_bits;\n\n    // If more than 8 bits to output, do recursion\n    if(nbits > 8)\n    {\n        OutputBits(pWork, 8, bit_buff);\n        bit_buff >>= 8;\n        nbits -= 8;\n    }\n\n    // Add bits to the last out byte in out_buff;\n    out_bits = pWork->out_bits;\n    pWork->out_buff[pWork->out_bytes] |= (unsigned char)(bit_buff << out_bits);\n    pWork->out_bits += nbits;\n\n    // If 8 or more bits, increment number of bytes\n    if(pWork->out_bits > 8)\n    {\n        pWork->out_bytes++;\n        bit_buff >>= (8 - out_bits);\n        \n        pWork->out_buff[pWork->out_bytes] = (unsigned char)bit_buff;\n        pWork->out_bits &= 7;\n    }\n    else\n    {\n        pWork->out_bits &= 7;\n        if(pWork->out_bits == 0)\n            pWork->out_bytes++;\n    }\n\n    // If there is enough compressed bytes, flush them\n    if(pWork->out_bytes >= 0x800)\n        FlushBuf(pWork);\n}\n\n// This function searches for a repetition\n// (a previous occurence of the current byte sequence)\n// Returns length of the repetition, and stores the backward distance \n// to pWork structure.\nstatic unsigned int PKWAREAPI FindRep(TCmpStruct * pWork, unsigned char * input_data)\n{\n    unsigned short * phash_to_index;            // Pointer into pWork->phash_to_index table\n    unsigned short * phash_offs;                // Pointer to the table containing offsets of each PAIR_HASH\n    unsigned char * repetition_limit;           // An eventual repetition must be at position below this pointer\n    unsigned char * prev_repetition;            // Pointer to the previous occurence of the current PAIR_HASH\n    unsigned char * prev_rep_end;               // End of the previous repetition\n    unsigned char * input_data_ptr;\n    unsigned short phash_offs_index;            // Index to the table with PAIR_HASH positions\n    unsigned short min_phash_offs;              // The lowest allowed hash offset\n    unsigned short offs_in_rep;                 // Offset within found repetition\n    unsigned int equal_byte_count;              // Number of bytes that are equal to the previous occurence\n    unsigned int rep_length = 1;                // Length of the found repetition\n    unsigned int rep_length2;                   // Secondary repetition\n    unsigned char pre_last_byte;                // Last but one byte from a repetion\n    unsigned short di_val;\n\n    // Calculate the previous position of the PAIR_HASH\n    phash_to_index   = pWork->phash_to_index + BYTE_PAIR_HASH(input_data);\n    min_phash_offs   = (unsigned short)((input_data - pWork->work_buff) - pWork->dsize_bytes + 1);\n    phash_offs_index = phash_to_index[0];\n\n    // If the PAIR_HASH offset is below the limit, find a next one\n    phash_offs = pWork->phash_offs + phash_offs_index;\n    if(*phash_offs < min_phash_offs)\n    {\n        while(*phash_offs < min_phash_offs)\n        {\n            phash_offs_index++;\n            phash_offs++;\n        }\n        *phash_to_index = phash_offs_index;\n    }\n\n    // Get the first location of the PAIR_HASH,\n    // and thus the first eventual location of byte repetition\n    phash_offs = pWork->phash_offs + phash_offs_index;\n    prev_repetition = pWork->work_buff + phash_offs[0];\n    repetition_limit = input_data - 1;\n    \n    // If the current PAIR_HASH was not encountered before,\n    // we haven't found a repetition.\n    if(prev_repetition >= repetition_limit)\n        return 0;\n\n    // We have found a match of a PAIR_HASH. Now we have to make sure\n    // that it is also a byte match, because PAIR_HASH is not unique.\n    // We compare the bytes and count the length of the repetition\n    input_data_ptr = input_data;\n    for(;;)\n    {\n        // If the first byte of the repetition and the so-far-last byte\n        // of the repetition are equal, we will compare the blocks.\n        if(*input_data_ptr == *prev_repetition && input_data_ptr[rep_length-1] == prev_repetition[rep_length-1])\n        {\n            // Skip the current byte\n            prev_repetition++;\n            input_data_ptr++;\n            equal_byte_count = 2;\n\n            // Now count how many more bytes are equal\n            while(equal_byte_count < MAX_REP_LENGTH)\n            {\n                prev_repetition++;\n                input_data_ptr++;\n                \n                // Are the bytes different ?\n                if(*prev_repetition != *input_data_ptr)\n                    break;\n\n                equal_byte_count++;\n            }\n\n            // If we found a repetition of at least the same length, take it.\n            // If there are multiple repetitions in the input buffer, this will\n            // make sure that we find the most recent one, which in turn allows\n            // us to store backward length in less amount of bits\n            input_data_ptr = input_data;\n            if(equal_byte_count >= rep_length)\n            {\n                // Calculate the backward distance of the repetition.\n                // Note that the distance is stored as decremented by 1\n                pWork->distance = (unsigned int)(input_data - prev_repetition + equal_byte_count - 1);\n\n                // Repetitions longer than 10 bytes will be stored in more bits,\n                // so they need a bit different handling\n                if((rep_length = equal_byte_count) > 10)\n                    break;\n            }\n        }\n\n        // Move forward in the table of PAIR_HASH repetitions.\n        // There might be a more recent occurence of the same repetition.\n        phash_offs_index++;\n        phash_offs++;\n        prev_repetition = pWork->work_buff + phash_offs[0];\n\n        // If the next repetition is beyond the minimum allowed repetition, we are done.\n        if(prev_repetition >= repetition_limit)\n        {\n            // A repetition must have at least 2 bytes, otherwise it's not worth it\n            return (rep_length >= 2) ? rep_length : 0;\n        }\n    }\n\n    // If the repetition has max length of 0x204 bytes, we can't go any fuhrter\n    if(equal_byte_count == MAX_REP_LENGTH)\n    {\n        pWork->distance--;\n        return equal_byte_count;\n    }\n\n    // Check for possibility of a repetition that occurs at more recent position\n    phash_offs = pWork->phash_offs + phash_offs_index;\n    if(pWork->work_buff + phash_offs[1] >= repetition_limit)\n        return rep_length;\n\n    //\n    // The following part checks if there isn't a longer repetition at\n    // a latter offset, that would lead to better compression.\n    //\n    // Example of data that can trigger this optimization:\n    //\n    //   \"EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEQQQQQQQQQQQQ\"\n    //   \"XYZ\"\n    //   \"EEEEEEEEEEEEEEEEQQQQQQQQQQQQ\";\n    //\n    // Description of data in this buffer\n    //   [0x00] Single byte \"E\"\n    //   [0x01] Single byte \"E\"\n    //   [0x02] Repeat 0x1E bytes from [0x00]\n    //   [0x20] Single byte \"X\"\n    //   [0x21] Single byte \"Y\"\n    //   [0x22] Single byte \"Z\"\n    //   [0x23] 17 possible previous repetitions of length at least 0x10 bytes:\n    //          - Repetition of 0x10 bytes from [0x00] \"EEEEEEEEEEEEEEEE\"\n    //          - Repetition of 0x10 bytes from [0x01] \"EEEEEEEEEEEEEEEE\"\n    //          - Repetition of 0x10 bytes from [0x02] \"EEEEEEEEEEEEEEEE\"\n    //          ...\n    //          - Repetition of 0x10 bytes from [0x0F] \"EEEEEEEEEEEEEEEE\"\n    //          - Repetition of 0x1C bytes from [0x10] \"EEEEEEEEEEEEEEEEQQQQQQQQQQQQ\"\n    //          The last repetition is the best one.\n    //\n\n    pWork->offs09BC[0] = 0xFFFF;\n    pWork->offs09BC[1] = 0x0000;\n    di_val = 0;\n\n    // Note: I failed to figure out what does the table \"offs09BC\" mean.\n    // If anyone has an idea, let me know to zezula_at_volny_dot_cz\n    for(offs_in_rep = 1; offs_in_rep < rep_length; )\n    {\n        if(input_data[offs_in_rep] != input_data[di_val])\n        {\n            di_val = pWork->offs09BC[di_val];\n            if(di_val != 0xFFFF)\n                continue;\n        }\n        pWork->offs09BC[++offs_in_rep] = ++di_val;\n    }\n\n    // \n    // Now go through all the repetitions from the first found one\n    // to the current input data, and check if any of them migh be\n    // a start of a greater sequence match.\n    //\n\n    prev_repetition = pWork->work_buff + phash_offs[0];\n    prev_rep_end = prev_repetition + rep_length;\n    rep_length2 = rep_length;\n    \n    for(;;)\n    {\n        rep_length2 = pWork->offs09BC[rep_length2];\n        if(rep_length2 == 0xFFFF)\n            rep_length2 = 0;\n\n        // Get the pointer to the previous repetition\n        phash_offs = pWork->phash_offs + phash_offs_index;\n\n        // Skip those repetitions that don't reach the end\n        // of the first found repetition\n        do\n        {\n            phash_offs++;\n            phash_offs_index++;\n            prev_repetition = pWork->work_buff + *phash_offs;\n            if(prev_repetition >= repetition_limit)\n                return rep_length;\n        }\n        while(prev_repetition + rep_length2 < prev_rep_end);\n\n        // Verify if the last but one byte from the repetition matches\n        // the last but one byte from the input data.\n        // If not, find a next repetition\n        pre_last_byte = input_data[rep_length - 2];\n        if(pre_last_byte == prev_repetition[rep_length - 2])\n        {\n            // If the new repetition reaches beyond the end\n            // of previously found repetition, reset the repetition length to zero.\n            if(prev_repetition + rep_length2 != prev_rep_end)\n            {\n                prev_rep_end = prev_repetition;\n                rep_length2 = 0;\n            }\n        }\n        else\n        {\n            phash_offs = pWork->phash_offs + phash_offs_index;\n            do\n            {\n                phash_offs++;\n                phash_offs_index++;\n                prev_repetition = pWork->work_buff + *phash_offs;\n                if(prev_repetition >= repetition_limit)\n                    return rep_length;\n            }\n            while(prev_repetition[rep_length - 2] != pre_last_byte || prev_repetition[0] != input_data[0]);\n\n            // Reset the length of the repetition to 2 bytes only\n            prev_rep_end = prev_repetition + 2;\n            rep_length2 = 2;\n        }\n\n        // Find out how many more characters are equal to the first repetition.\n        while(*prev_rep_end == input_data[rep_length2])\n        {\n            if(++rep_length2 >= 0x204)\n                break;\n            prev_rep_end++;\n        }\n\n        // Is the newly found repetion at least as long as the previous one ?\n        if(rep_length2 >= rep_length)\n        {\n            // Calculate the distance of the new repetition\n            pWork->distance = (unsigned int)(input_data - prev_repetition - 1);\n            if((rep_length = rep_length2) == 0x204)\n                return rep_length;\n\n            // Update the additional elements in the \"offs09BC\" table\n            // to reflect new rep length\n            while(offs_in_rep < rep_length2)\n            {\n                if(input_data[offs_in_rep] != input_data[di_val])\n                {\n                    di_val = pWork->offs09BC[di_val];\n                    if(di_val != 0xFFFF)\n                        continue;\n                }\n                pWork->offs09BC[++offs_in_rep] = ++di_val;\n            }\n        }\n    }\n}\n\nstatic void PKWAREAPI WriteCmpData(TCmpStruct * pWork)\n{\n    unsigned char * input_data_end;         // Pointer to the end of the input data\n    unsigned char * input_data = pWork->work_buff + pWork->dsize_bytes + 0x204;\n    unsigned int input_data_ended = 0;      // If 1, then all data from the input stream have been already loaded\n    unsigned int save_rep_length;           // Saved length of current repetition\n    unsigned int save_distance = 0;         // Saved distance of current repetition\n    unsigned int rep_length;                // Length of the found repetition\n    unsigned int phase = 0;                 // \n\n    // Store the compression type and dictionary size\n    pWork->out_buff[0] = (char)pWork->ctype;\n    pWork->out_buff[1] = (char)pWork->dsize_bits;\n    pWork->out_bytes = 2;\n\n    // Reset output buffer to zero\n    memset(&pWork->out_buff[2], 0, sizeof(pWork->out_buff) - 2);\n    pWork->out_bits = 0;\n\n    while(input_data_ended == 0)\n    {\n        unsigned int bytes_to_load = 0x1000;\n        int total_loaded = 0;\n        int bytes_loaded;\n\n        // Load the bytes from the input stream, up to 0x1000 bytes\n        while(bytes_to_load != 0)\n        {\n            bytes_loaded = pWork->read_buf((char *)pWork->work_buff + pWork->dsize_bytes + 0x204 + total_loaded,\n                                                  &bytes_to_load,\n                                                   pWork->param);\n            if(bytes_loaded == 0)\n            {\n                if(total_loaded == 0 && phase == 0)\n                    goto __Exit;\n                input_data_ended = 1;\n                break;\n            }\n            else\n            {\n                bytes_to_load -= bytes_loaded;\n                total_loaded += bytes_loaded;\n            }\n        }\n\n        input_data_end = pWork->work_buff + pWork->dsize_bytes + total_loaded;\n        if(input_data_ended)\n            input_data_end += 0x204;\n        \n        //\n        // Warning: The end of the buffer passed to \"SortBuffer\" is actually 2 bytes beyond\n        // valid data. It is questionable if this is actually a bug or not,\n        // but it might cause the compressed data output to be dependent on random bytes\n        // that are in the buffer. \n        // To prevent that, the calling application must always zero the compression\n        // buffer before passing it to \"implode\"\n        //\n\n        // Search the PAIR_HASHes of the loaded blocks. Also, include\n        // previously compressed data, if any.\n        switch(phase)\n        {\n            case 0: \n                SortBuffer(pWork, input_data, input_data_end + 1);\n                phase++;\n                if(pWork->dsize_bytes != 0x1000)\n                    phase++;\n                break;\n\n            case 1:\n                SortBuffer(pWork, input_data - pWork->dsize_bytes + 0x204, input_data_end + 1);\n                phase++;\n                break;\n\n            default:\n                SortBuffer(pWork, input_data - pWork->dsize_bytes, input_data_end + 1);\n                break;\n        }\n\n        // Perform the compression of the current block\n        while(input_data < input_data_end)\n        {\n            // Find if the current byte sequence wasn't there before.\n            rep_length = FindRep(pWork, input_data);\n            while(rep_length != 0)\n            {\n                // If we found repetition of 2 bytes, that is 0x100 or fuhrter back,\n                // don't bother. Storing the distance of 0x100 bytes would actually\n                // take more space than storing the 2 bytes as-is.\n                if(rep_length == 2 && pWork->distance >= 0x100)\n                    break;\n\n                // When we are at the end of the input data, we cannot allow\n                // the repetition to go past the end of the input data.\n                if(input_data_ended && input_data + rep_length > input_data_end)\n                {\n                    // Shorten the repetition length so that it only covers valid data\n                    rep_length = (unsigned long)(input_data_end - input_data);\n                    if(rep_length < 2)\n                        break;\n\n                    // If we got repetition of 2 bytes, that is 0x100 or more backward, don't bother\n                    if(rep_length == 2 && pWork->distance >= 0x100)\n                        break;\n                    goto __FlushRepetition;\n                }\n\n                if(rep_length >= 8 || input_data + 1 >= input_data_end)\n                    goto __FlushRepetition;\n\n                // Try to find better repetition 1 byte later.\n                // Example: \"ARROCKFORT\" \"AROCKFORT\"\n                // When \"input_data\" points to the second string, FindRep\n                // returns the occurence of \"AR\". But there is longer repetition \"ROCKFORT\",\n                // beginning 1 byte after.\n                save_rep_length = rep_length;\n                save_distance = pWork->distance;\n                rep_length = FindRep(pWork, input_data + 1);\n\n                // Only use the new repetition if it's length is greater than the previous one\n                if(rep_length > save_rep_length)\n                {\n                    // If the new repetition if only 1 byte better\n                    // and the previous distance is less than 0x80 bytes, use the previous repetition\n                    if(rep_length > save_rep_length + 1 || save_distance > 0x80)\n                    {\n                        // Flush one byte, so that input_data will point to the secondary repetition\n                        OutputBits(pWork, pWork->nChBits[*input_data], pWork->nChCodes[*input_data]);\n                        input_data++;\n                        continue;\n                    }\n                }\n\n                // Revert to the previous repetition\n                rep_length = save_rep_length;\n                pWork->distance = save_distance;\n\n                __FlushRepetition:\n\n                OutputBits(pWork, pWork->nChBits[rep_length + 0xFE], pWork->nChCodes[rep_length + 0xFE]);\n                if(rep_length == 2)\n                {\n                    OutputBits(pWork, pWork->dist_bits[pWork->distance >> 2],\n                                      pWork->dist_codes[pWork->distance >> 2]);\n                    OutputBits(pWork, 2, pWork->distance & 3);\n                }\n                else\n                {\n                    OutputBits(pWork, pWork->dist_bits[pWork->distance >> pWork->dsize_bits],\n                                      pWork->dist_codes[pWork->distance >> pWork->dsize_bits]);\n                    OutputBits(pWork, pWork->dsize_bits, pWork->dsize_mask & pWork->distance);\n                }\n\n                // Move the begin of the input data by the length of the repetition\n                input_data += rep_length;\n                goto _00402252;\n            }\n\n            // If there was no previous repetition for the current position in the input data,\n            // just output the 9-bit literal for the one character\n            OutputBits(pWork, pWork->nChBits[*input_data], pWork->nChCodes[*input_data]);\n            input_data++;\n_00402252:;\n        }\n\n        if(input_data_ended == 0)\n        {\n            input_data -= 0x1000;\n            memmove(pWork->work_buff, pWork->work_buff + 0x1000, pWork->dsize_bytes + 0x204);\n        }\n    }\n\n__Exit:\n\n    // Write the termination literal\n    OutputBits(pWork, pWork->nChBits[0x305], pWork->nChCodes[0x305]);\n    if(pWork->out_bits != 0)\n        pWork->out_bytes++;\n    pWork->write_buf(pWork->out_buff, &pWork->out_bytes, pWork->param);\n    return;\n}\n\n//-----------------------------------------------------------------------------\n// Main imploding function\n\nunsigned int PKWAREAPI implode(\n    unsigned int (PKWAREAPI *read_buf)(char *buf, unsigned int *size, void *param),\n    void         (PKWAREAPI *write_buf)(char *buf, unsigned int *size, void *param),\n    char         *work_buf,\n    void         *param,\n    unsigned int *type,\n    unsigned int *dsize)\n{\n    TCmpStruct * pWork = (TCmpStruct *)work_buf;\n    unsigned int nChCode;\n    unsigned int nCount;\n    unsigned int i;\n    int nCount2;\n\n    // Fill the work buffer information\n    // Note: The caller must zero the \"work_buff\" before passing it to implode\n    pWork->read_buf    = read_buf;\n    pWork->write_buf   = write_buf;\n    pWork->dsize_bytes = *dsize;\n    pWork->ctype       = *type;\n    pWork->param       = param;\n    pWork->dsize_bits  = 4;\n    pWork->dsize_mask  = 0x0F;\n\n    // Test dictionary size\n    switch(*dsize)\n    {\n        case CMP_IMPLODE_DICT_SIZE3:    // 0x1000 bytes\n            pWork->dsize_bits++;\n            pWork->dsize_mask |= 0x20;\n            // No break here !!!\n\n        case CMP_IMPLODE_DICT_SIZE2:    // 0x800 bytes\n            pWork->dsize_bits++;\n            pWork->dsize_mask |= 0x10;\n            // No break here !!!\n\n        case CMP_IMPLODE_DICT_SIZE1:    // 0x400\n            break;\n\n        default:\n            return CMP_INVALID_DICTSIZE;\n    }\n\n    // Test the compression type\n    switch(*type)\n    {\n        case CMP_BINARY: // We will compress data with binary compression type\n            for(nChCode = 0, nCount = 0; nCount < 0x100; nCount++)\n            {\n                pWork->nChBits[nCount]  = 9;\n                pWork->nChCodes[nCount] = (unsigned short)nChCode;\n                nChCode = (nChCode & 0x0000FFFF) + 2;\n            }\n            break;\n\n\n        case CMP_ASCII: // We will compress data with ASCII compression type\n            for(nCount = 0; nCount < 0x100; nCount++)\n            {\n                pWork->nChBits[nCount]  = (unsigned char )(ChBitsAsc[nCount] + 1);\n                pWork->nChCodes[nCount] = (unsigned short)(ChCodeAsc[nCount] * 2);\n            }\n            break;\n\n        default:\n            return CMP_INVALID_MODE;\n    }\n\n    for(i = 0; i < 0x10; i++)\n    {\n        if(1 << ExLenBits[i])\n        {\n            for(nCount2 = 0; nCount2 < (1 << ExLenBits[i]); nCount2++)\n            {\n                pWork->nChBits[nCount]  = (unsigned char)(ExLenBits[i] + LenBits[i] + 1);\n                pWork->nChCodes[nCount] = (unsigned short)((nCount2 << (LenBits[i] + 1)) | ((LenCode[i] & 0xFFFF00FF) * 2) | 1);\n                nCount++;\n            }\n        }\n    }\n\n    // Copy the distance codes and distance bits and perform the compression\n    memcpy(&pWork->dist_codes, DistCode, sizeof(DistCode));\n    memcpy(&pWork->dist_bits, DistBits, sizeof(DistBits));\n    WriteCmpData(pWork);\n    return CMP_NO_ERROR;\n}\n"
  },
  {
    "path": "3rdParty/PKWare/pkware.h",
    "content": "/*****************************************************************************/\n/* pkware.h                               Copyright (c) Ladislav Zezula 2003 */\n/*---------------------------------------------------------------------------*/\n/* Header file for PKWARE Data Compression Library                           */\n/*---------------------------------------------------------------------------*/\n/*   Date    Ver   Who  Comment                                              */\n/* --------  ----  ---  -------                                              */\n/* 31.03.03  1.00  Lad  The first version of pkware.h                        */\n/*****************************************************************************/\n\n#ifndef __PKWARE_H__\n#define __PKWARE_H__\n\n//-----------------------------------------------------------------------------\n// Defines\n\n#define CMP_BINARY             0            // Binary compression\n#define CMP_ASCII              1            // Ascii compression\n\n#define CMP_NO_ERROR           0\n#define CMP_INVALID_DICTSIZE   1\n#define CMP_INVALID_MODE       2\n#define CMP_BAD_DATA           3\n#define CMP_ABORT              4\n\n#define CMP_IMPLODE_DICT_SIZE1   1024       // Dictionary size of 1024\n#define CMP_IMPLODE_DICT_SIZE2   2048       // Dictionary size of 2048\n#define CMP_IMPLODE_DICT_SIZE3   4096       // Dictionary size of 4096\n\n//-----------------------------------------------------------------------------\n// Define calling convention\n\n#ifndef PKWAREAPI\n#ifdef WIN32\n#define PKWAREAPI  __cdecl                   // Use for normal __cdecl calling \n#else\n#define PKWAREAPI\n#endif\n#endif\n\n//-----------------------------------------------------------------------------\n// Internal structures\n\n// Compression structure\ntypedef struct\n{\n    unsigned int   distance;                // 0000: Backward distance of the currently found repetition, decreased by 1\n    unsigned int   out_bytes;               // 0004: # bytes available in out_buff            \n    unsigned int   out_bits;                // 0008: # of bits available in the last out byte\n    unsigned int   dsize_bits;              // 000C: Number of bits needed for dictionary size. 4 = 0x400, 5 = 0x800, 6 = 0x1000\n    unsigned int   dsize_mask;              // 0010: Bit mask for dictionary. 0x0F = 0x400, 0x1F = 0x800, 0x3F = 0x1000\n    unsigned int   ctype;                   // 0014: Compression type (CMP_ASCII or CMP_BINARY)\n    unsigned int   dsize_bytes;             // 0018: Dictionary size in bytes\n    unsigned char  dist_bits[0x40];         // 001C: Distance bits\n    unsigned char  dist_codes[0x40];        // 005C: Distance codes\n    unsigned char  nChBits[0x306];          // 009C: Table of literal bit lengths to be put to the output stream\n    unsigned short nChCodes[0x306];         // 03A2: Table of literal codes to be put to the output stream\n    unsigned short offs09AE;                // 09AE: \n\n    void         * param;                   // 09B0: User parameter\n    unsigned int (PKWAREAPI *read_buf)(char *buf, unsigned int *size, void *param);  // 9B4\n    void         (PKWAREAPI *write_buf)(char *buf, unsigned int *size, void *param); // 9B8\n\n    unsigned short offs09BC[0x204];         // 09BC:\n    unsigned long  offs0DC4;                // 0DC4: \n    unsigned short phash_to_index[0x900];   // 0DC8: Array of indexes (one for each PAIR_HASH) to the \"pair_hash_offsets\" table\n    unsigned short phash_to_index_end;      // 1FC8: End marker for \"phash_to_index\" table\n    char           out_buff[0x802];         // 1FCA: Compressed data\n    unsigned char  work_buff[0x2204];       // 27CC: Work buffer\n                                            //  + DICT_OFFSET  => Dictionary\n                                            //  + UNCMP_OFFSET => Uncompressed data\n    unsigned short phash_offs[0x2204];      // 49D0: Table of offsets for each PAIR_HASH\n} TCmpStruct;\n\n#define CMP_BUFFER_SIZE  sizeof(TCmpStruct) // Size of compression structure.\n                                            // Defined as 36312 in pkware header file\n\n\n// Decompression structure\ntypedef struct\n{\n    unsigned long offs0000;                 // 0000\n    unsigned long ctype;                    // 0004: Compression type (CMP_BINARY or CMP_ASCII)\n    unsigned long outputPos;                // 0008: Position in output buffer\n    unsigned long dsize_bits;               // 000C: Dict size (4, 5, 6 for 0x400, 0x800, 0x1000)\n    unsigned long dsize_mask;               // 0010: Dict size bitmask (0x0F, 0x1F, 0x3F for 0x400, 0x800, 0x1000)\n    unsigned long bit_buff;                 // 0014: 16-bit buffer for processing input data\n    unsigned long extra_bits;               // 0018: Number of extra (above 8) bits in bit buffer\n    unsigned int  in_pos;                   // 001C: Position in in_buff\n    unsigned long in_bytes;                 // 0020: Number of bytes in input buffer\n    void        * param;                    // 0024: Custom parameter\n    unsigned int (PKWAREAPI *read_buf)(char *buf, unsigned int *size, void *param); // Pointer to function that reads data from the input stream\n    void         (PKWAREAPI *write_buf)(char *buf, unsigned int *size, void *param);// Pointer to function that writes data to the output stream\n\n    unsigned char out_buff[0x2204];         // 0030: Output circle buffer.\n                                            //       0x0000 - 0x0FFF: Previous uncompressed data, kept for repetitions\n                                            //       0x1000 - 0x1FFF: Currently decompressed data\n                                            //       0x2000 - 0x2203: Reserve space for the longest possible repetition\n    unsigned char in_buff[0x800];           // 2234: Buffer for data to be decompressed\n    unsigned char DistPosCodes[0x100];      // 2A34: Table of distance position codes\n    unsigned char LengthCodes[0x100];       // 2B34: Table of length codes\n    unsigned char offs2C34[0x100];          // 2C34: Buffer for \n    unsigned char offs2D34[0x100];          // 2D34: Buffer for \n    unsigned char offs2E34[0x80];           // 2EB4: Buffer for \n    unsigned char offs2EB4[0x100];          // 2EB4: Buffer for \n    unsigned char ChBitsAsc[0x100];         // 2FB4: Buffer for \n    unsigned char DistBits[0x40];           // 30B4: Numbers of bytes to skip copied block length\n    unsigned char LenBits[0x10];            // 30F4: Numbers of bits for skip copied block length\n    unsigned char ExLenBits[0x10];          // 3104: Number of valid bits for copied block\n    unsigned short LenBase[0x10];           // 3114: Buffer for \n} TDcmpStruct;\n\n#define EXP_BUFFER_SIZE sizeof(TDcmpStruct) // Size of decompression structure\n                                            // Defined as 12596 in pkware headers\n\n//-----------------------------------------------------------------------------\n// Public functions\n\n#ifdef __cplusplus\n   extern \"C\" {\n#endif\n\nunsigned int PKWAREAPI implode(\n   unsigned int (PKWAREAPI *read_buf)(char *buf, unsigned int *size, void *param),\n   void         (PKWAREAPI *write_buf)(char *buf, unsigned int *size, void *param),\n   char         *work_buf,\n   void         *param,\n   unsigned int *type,\n   unsigned int *dsize);\n\n\nunsigned int PKWAREAPI explode(\n   unsigned int (PKWAREAPI *read_buf)(char *buf, unsigned  int *size, void *param),\n   void         (PKWAREAPI *write_buf)(char *buf, unsigned  int *size, void *param),\n   char         *work_buf,\n   void         *param);\n\n#ifdef __cplusplus\n   }                         // End of 'extern \"C\"' declaration\n#endif\n\n#endif // __PKWARE_H__\n"
  },
  {
    "path": "3rdParty/Storm/Makefile",
    "content": "VC5_DIR ?= $(HOME)/DevStudio_5.10/VC\r\n\r\n# The $(VS6_DIR) directory is a copy of the \"Microsoft Visual Studio\" directory.\r\n#\r\n# To get a working setup on Linux or other \"portable\" copies of VS,\r\n# the following DLLs have to be copied to the\r\n# $(VS6_DIR)/VC98/Bin directory.\r\n#\r\n#     - $(VS6_DIR)/Common/MSDev98/Bin/MSPDB60.DLL\r\n#\r\n# And to the $(VC5_DIR)/bin directory.\r\n#\r\n#     - $(VC5_DIR)/SharedIDE/bin/MSDIS100.DLL\r\n#     - $(VC5_DIR)/SharedIDE/bin/MSPDB50.DLL\r\nVS6_DIR ?= $(HOME)/VS6\r\n\r\nVC6_DIR     = $(VS6_DIR)/VC98\r\n\r\nVC6_BIN_DIR = $(VC6_DIR)/Bin\r\nVC6_INC_DIR = $(VC6_DIR)/Include\r\nVC6_LIB_DIR = $(VC6_DIR)/Lib\r\n\r\nVC5_LIB_DIR = $(VC5_DIR)/lib\r\n\r\nIDE_DIR ?= $(VS6_DIR)/Common/MSDev98\r\nIDE_BIN_DIR = $(IDE_DIR)/bin\r\nifeq ($(OS),Windows_NT)\r\n\tCL = $(VC6_BIN_DIR)/CL.EXE\r\n\tRC = $(IDE_BIN_DIR)/RC.EXE\r\n\tVC5_LINK = $(VC5_DIR)/bin/link.exe\r\n\tVC6_LINK = $(VC6_BIN_DIR)/link.exe\r\nelse\r\n\tCL = wine $(VC6_BIN_DIR)/CL.EXE\r\n\tRC = wine $(IDE_BIN_DIR)/RC.EXE\r\n\tVC5_LINK = wine $(VC5_DIR)/bin/link.exe\r\n\tVC6_LINK = wine $(VC6_BIN_DIR)/link.exe\r\nendif\r\n\r\nCFLAGS=/nologo /c /GX /W3 /O1 /I $(VC6_INC_DIR) /FD /MT /D \"NDEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /YX /Gm /Zi\r\nLINKFLAGS=/nologo /subsystem:windows /machine:I386 /incremental:no\r\n\r\nVC_LINK=$(VC5_LINK)\r\nLINKFLAGS+= /LIBPATH:$(VC5_LIB_DIR)\r\n\r\nall: storm.lib\r\n\r\nSTORM_SRC=$(sort $(wildcard Source/*.cpp))\r\nSTORM_OBJS=$(STORM_SRC:.cpp=.obj)\r\n\r\nstorm.lib: $(STORM_OBJS)\r\n\t$(CL) $^ /link /LINK50COMPAT /nologo /dll /subsystem:windows /machine:I386 /LIBPATH:$(VC6_LIB_DIR) /def:\"Source/storm.def\" /out:storm.dll\r\n\r\n%.obj: %.cpp\r\n\t$(CL) $(CFLAGS) /Fo$@ $<\r\n\r\nclean:\r\n\t@$(RM) -v $(STORM_OBJS) storm.{exp,lib,dll} vc60.{idb,pch,pdb}\r\n\r\n.PHONY: clean all\r\n"
  },
  {
    "path": "3rdParty/Storm/Source/Storm.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"Storm\" - Package Owner=<4>\r\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n# ** DO NOT EDIT **\r\n\r\n# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\r\n\r\nCFG=Storm - Win32 Debug\r\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n!MESSAGE use the Export Makefile command and run\r\n!MESSAGE \r\n!MESSAGE NMAKE /f \"Storm.mak\".\r\n!MESSAGE \r\n!MESSAGE You can specify a configuration when running NMAKE\r\n!MESSAGE by defining the macro CFG on the command line. For example:\r\n!MESSAGE \r\n!MESSAGE NMAKE /f \"Storm.mak\" CFG=\"Storm - Win32 Debug\"\r\n!MESSAGE \r\n!MESSAGE Possible choices for configuration are:\r\n!MESSAGE \r\n!MESSAGE \"Storm - Win32 Release\" (based on \"Win32 (x86) Dynamic-Link Library\")\r\n!MESSAGE \"Storm - Win32 Debug\" (based on \"Win32 (x86) Dynamic-Link Library\")\r\n!MESSAGE \r\n\r\n# Begin Project\r\n# PROP AllowPerConfigDependencies 0\r\n# PROP Scc_ProjName \"\"\r\n# PROP Scc_LocalPath \"\"\r\nCPP=cl.exe\r\nMTL=midl.exe\r\nRSC=rc.exe\r\n\r\n!IF  \"$(CFG)\" == \"Storm - Win32 Release\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 0\r\n# PROP BASE Output_Dir \"WinRel\"\r\n# PROP BASE Intermediate_Dir \"WinRel\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 0\r\n# PROP Output_Dir \"WinRel\"\r\n# PROP Intermediate_Dir \"WinRel\"\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD CPP /nologo /MT /W3 /GX /O1 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\r\n# ADD RSC /l 0x409 /d \"NDEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLINK32=link.exe\r\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386\r\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /def:\"storm.def\"\r\n\r\n!ELSEIF  \"$(CFG)\" == \"Storm - Win32 Debug\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 1\r\n# PROP BASE Output_Dir \"WinDebug\"\r\n# PROP BASE Intermediate_Dir \"WinDebug\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 1\r\n# PROP Output_Dir \"WinDebug\"\r\n# PROP Intermediate_Dir \"WinDebug\"\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O1 /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\r\n# ADD RSC /l 0x409 /d \"_DEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLINK32=link.exe\r\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /def:\"storm.def\" /pdbtype:sept\r\n\r\n!ENDIF \r\n\r\n# Begin Target\r\n\r\n# Name \"Storm - Win32 Release\"\r\n# Name \"Storm - Win32 Debug\"\r\n# Begin Source File\r\n\r\nSOURCE=.\\storm.cpp\r\n# End Source File\r\n# End Target\r\n# End Project\r\n"
  },
  {
    "path": "3rdParty/Storm/Source/Storm.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <SccProjectName />\r\n    <SccLocalPath />\r\n    <ProjectGuid>{B28F69CE-15A1-424D-BBB5-2727258D675B}</ProjectGuid>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <PlatformToolset>v141</PlatformToolset>\r\n    <UseOfMfc>false</UseOfMfc>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <PlatformToolset>v141</PlatformToolset>\r\n    <UseOfMfc>false</UseOfMfc>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n    <Import Project=\"$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n    <Import Project=\"$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <OutDir>.\\WinRel\\</OutDir>\r\n    <IntDir>.\\WinRel\\</IntDir>\r\n    <LinkIncremental>false</LinkIncremental>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <OutDir>.\\WinDebug\\</OutDir>\r\n    <IntDir>.\\WinDebug\\</IntDir>\r\n    <LinkIncremental>true</LinkIncremental>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r\n      <InlineFunctionExpansion>Default</InlineFunctionExpansion>\r\n      <StringPooling>true</StringPooling>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AssemblerListingLocation>.\\WinRel\\</AssemblerListingLocation>\r\n      <PrecompiledHeaderOutputFile>.\\WinRel\\Storm.pch</PrecompiledHeaderOutputFile>\r\n      <ObjectFileName>.\\WinRel\\</ObjectFileName>\r\n      <ProgramDataBaseFileName>.\\WinRel\\</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Midl>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TypeLibraryName>.\\WinRel\\Storm.tlb</TypeLibraryName>\r\n      <MkTypLibCompatible>true</MkTypLibCompatible>\r\n      <RedirectOutputAndErrors>NUL</RedirectOutputAndErrors>\r\n      <TargetEnvironment>Win32</TargetEnvironment>\r\n    </Midl>\r\n    <ResourceCompile>\r\n      <Culture>0x0409</Culture>\r\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ResourceCompile>\r\n    <Bscmake>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <OutputFile>.\\WinRel\\Storm.bsc</OutputFile>\r\n    </Bscmake>\r\n    <Link>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <LinkDLL>true</LinkDLL>\r\n      <SubSystem>Windows</SubSystem>\r\n      <ModuleDefinitionFile>storm.def</ModuleDefinitionFile>\r\n      <OutputFile>.\\WinRel\\Storm.dll</OutputFile>\r\n      <ImportLibrary>.\\WinRel\\Storm.lib</ImportLibrary>\r\n      <AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r\n      <InlineFunctionExpansion>Default</InlineFunctionExpansion>\r\n      <Optimization>Disabled</Optimization>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <MinimalRebuild>true</MinimalRebuild>\r\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AssemblerListingLocation>.\\WinDebug\\</AssemblerListingLocation>\r\n      <PrecompiledHeaderOutputFile>.\\WinDebug\\Storm.pch</PrecompiledHeaderOutputFile>\r\n      <ObjectFileName>.\\WinDebug\\</ObjectFileName>\r\n      <ProgramDataBaseFileName>.\\WinDebug\\</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Midl>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TypeLibraryName>.\\WinDebug\\Storm.tlb</TypeLibraryName>\r\n      <MkTypLibCompatible>true</MkTypLibCompatible>\r\n      <RedirectOutputAndErrors>NUL</RedirectOutputAndErrors>\r\n      <TargetEnvironment>Win32</TargetEnvironment>\r\n    </Midl>\r\n    <ResourceCompile>\r\n      <Culture>0x0409</Culture>\r\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ResourceCompile>\r\n    <Bscmake>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <OutputFile>.\\WinDebug\\Storm.bsc</OutputFile>\r\n    </Bscmake>\r\n    <Link>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <LinkDLL>true</LinkDLL>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <SubSystem>Windows</SubSystem>\r\n      <ModuleDefinitionFile>storm.def</ModuleDefinitionFile>\r\n      <OutputFile>.\\WinDebug\\Storm.dll</OutputFile>\r\n      <ImportLibrary>.\\WinDebug\\Storm.lib</ImportLibrary>\r\n      <AdditionalDependencies>odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"storm.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"storm.def\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"storm.h\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "3rdParty/Storm/Source/storm.cpp",
    "content": "#include \"storm.h\"\r\n\r\n#define rBool { return TRUE; }\r\n#define rPVoid { return NULL; }\r\n#define rVoid { return; }\r\n#define rInt { return 0; }\r\n\r\nBOOL STORMAPI SNetCreateGame(const char *pszGameName, const char *pszGamePassword, const char *pszGameStatString, DWORD dwGameType, char *GameTemplateData, int GameTemplateSize, int playerCount, const char *creatorName, const char *a11, int *playerID) rBool;\r\nBOOL STORMAPI SNetDestroy() rBool;\r\n\r\nBOOL STORMAPI SNetDropPlayer(int playerid, DWORD flags) rBool;\r\nBOOL STORMAPI SNetGetGameInfo(int type, void *dst, size_t length, size_t *byteswritten) rBool;\r\n\r\nBOOL STORMAPI SNetGetNumPlayers(int *firstplayerid, int *lastplayerid, int *activeplayers) rBool;\r\n\r\nBOOL STORMAPI SNetGetPlayerCaps(char playerid, PCAPS playerCaps) rBool;\r\nBOOL STORMAPI SNetGetPlayerName(int playerid, char *buffer, size_t buffersize) rBool;\r\n//BOOL STORMAPI SNetGetProviderCaps(PCAPS providerCaps) rBool;\r\nBOOL STORMAPI SNetGetTurnsInTransit(int *turns) rBool;\r\nBOOL STORMAPI SNetInitializeDevice(int a1, int a2, int a3, int a4, int *a5) rBool;\r\n//BOOL STORMAPI SNetInitializeProvider(DWORD providerName, client_info *gameClientInfo, user_info *userData, battle_info *bnCallbacks, module_info *moduleData) rBool;\r\nBOOL STORMAPI SNetJoinGame(int id, char *gameName, char *gamePassword, char *playerName, char *userStats, int *playerid) rBool;\r\nBOOL STORMAPI SNetLeaveGame(int type) rBool;\r\nBOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus) rBool;\r\nBOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes) rBool;\r\nBOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, DWORD *arraydatabytes, DWORD *arrayplayerstatus) rBool;\r\n//HANDLE STORMAPI SNetRegisterEventHandler(int type, void (STORMAPI *sEvent)(PS_EVT)) rPVoid;\r\n\r\nint STORMAPI SNetSelectGame(int a1, int a2, int a3, int a4, int a5, int *playerid) rInt;\r\n\r\nBOOL STORMAPI SNetSendMessage(int playerID, void *data, size_t databytes) rBool;\r\nBOOL STORMAPI SNetSendTurn(char *data, size_t databytes) rBool;\r\n\r\nBOOL STORMAPI SNetSetGameMode(DWORD modeFlags, bool makePublic) rBool;\r\n\r\nBOOL STORMAPI SNetEnumGamesEx(int a1, int a2, int (__fastcall *callback)(DWORD, DWORD, DWORD), int *hintnextcall) rBool;\r\nBOOL STORMAPI SNetSendServerChatCommand(const char *command) rBool;\r\n\r\nBOOL STORMAPI SNetDisconnectAll(DWORD flags) rBool;\r\nBOOL STORMAPI SNetCreateLadderGame(const char *pszGameName, const char *pszGamePassword, const char *pszGameStatString, DWORD dwGameType, DWORD dwGameLadderType, DWORD dwGameModeFlags, char *GameTemplateData, int GameTemplateSize, int playerCount, char *creatorName, char *a11, int *playerID) rBool;\r\nBOOL STORMAPI SNetReportGameResult(unsigned a1, int size, int *results, const char* headerInfo, const char* detailInfo) rBool;\r\n\r\nint STORMAPI SNetSendLeagueCommand(char *cmd, char *callback) rInt;\r\nint STORMAPI SNetSendReplayPath(int a1, int a2, char *replayPath) rInt;\r\nint STORMAPI SNetGetLeagueName(int leagueID) rInt;\r\nBOOL STORMAPI SNetGetPlayerNames(char **names) rBool;\r\nint STORMAPI SNetLeagueLogout(char *bnetName) rInt;\r\nint STORMAPI SNetGetLeaguePlayerName(char *curPlayerLeageName, size_t nameSize) rInt;\r\n\r\nHGDIOBJ STORMAPI SDlgDefDialogProc(HWND hDlg, signed int DlgType, HDC textLabel, HWND hWnd) rPVoid;\r\n\r\nHANDLE STORMAPI SDlgDialogBoxIndirectParam(HMODULE hModule, LPCSTR lpName, HWND hWndParent, LPVOID lpParam, LPARAM lParam) rPVoid;\r\n\r\nBOOL STORMAPI SDlgEndDialog(HWND hDlg, HANDLE nResult) rBool;\r\n\r\nBOOL STORMAPI SDlgSetControlBitmaps(HWND parentwindow, int *id, int a3, char *buffer2, char *buffer, int flags, int mask) rBool;\r\n\r\nBOOL STORMAPI SDlgBltToWindowI(HWND hWnd, HRGN a2, char *a3, int a4, void *buffer, RECT *rct, SIZE *size, int a8, int a9, DWORD rop) rBool;\r\nBOOL STORMAPI SDlgBltToWindowE(HWND hWnd, HRGN a2, char *a3, int a4, void *buffer, RECT *rct, SIZE *size, int a8, int a9, DWORD rop) rBool;\r\nBOOL STORMAPI SDlgSetBitmapE(HWND hWnd, int a2, char *src, int mask1, int flags, int a6, int a7, int width, int a9, int mask2) rBool;\r\n\r\nint STORMAPI Ordinal224(int a1) rInt;\r\n\r\nBOOL STORMAPI SFileCloseArchive(HANDLE hArchive) rBool;\r\nBOOL STORMAPI SFileCloseFile(HANDLE hFile) rBool;\r\n\r\nBOOL STORMAPI SFileDdaBeginEx(HANDLE hFile, DWORD flags, DWORD mask, unsigned __int32 lDistanceToMove, signed __int32 volume, signed int a6, int a7) rBool;\r\nBOOL STORMAPI SFileDdaDestroy() rBool;\r\nBOOL STORMAPI SFileDdaEnd(HANDLE hFile) rBool;\r\nBOOL STORMAPI SFileDdaGetPos(HANDLE hFile, DWORD *current, DWORD *end) rBool;\r\n\r\nBOOL STORMAPI SFileDdaInitialize(HANDLE directsound) rBool;\r\nBOOL STORMAPI SFileDdaSetVolume(HANDLE hFile, signed int bigvolume, signed int volume) rBool;\r\nBOOL STORMAPI SFileDestroy() rBool;\r\n\r\nBOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE *archive) rBool;\r\nLONG STORMAPI SFileGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) rInt;\r\nBOOL STORMAPI SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq) rBool;\r\nBOOL STORMAPI SFileOpenFile(const char *filename, HANDLE *phFile) rBool;\r\nBOOL STORMAPI SFileOpenFileEx(HANDLE hMpq, const char *szFileName, DWORD dwSearchScope, HANDLE *phFile) rBool;\r\nBOOL STORMAPI SFileReadFile(HANDLE hFile, void *buffer, DWORD nNumberOfBytesToRead, DWORD *read, LONG *lpDistanceToMoveHigh) rBool;\r\n\r\nvoid STORMAPI SFileSetLocale(LCID lcLocale) rVoid;\r\n\r\nBOOL STORMAPI SFileSetIoErrorMode(int mode, BOOL (STORMAPI *callback)(char*,int,int) ) rBool;\r\nBOOL STORMAPI SFileGetArchiveName(HANDLE hArchive, char *name, int length) rBool;\r\nBOOL STORMAPI SFileGetFileName(HANDLE hFile, char *buffer, int length) rBool;\r\n\r\nBOOL STORMAPI SFileLoadFile(char *filename, void *buffer, int buffersize, int a4, int a5) rBool;\r\nBOOL STORMAPI SFileUnloadFile(HANDLE hFile) rBool;\r\nBOOL STORMAPI SFileLoadFileEx(void *hArchive, char *filename, int a3, int a4, int a5, DWORD searchScope, struct _OVERLAPPED *lpOverlapped) rBool;\r\n\r\nBOOL STORMAPI SBltROP3(void *lpDstBuffer, void *lpSrcBuffer, int width, int height, int a5, int a6, int a7, DWORD rop) rBool;\r\nBOOL STORMAPI SBltROP3Clipped(void *lpDstBuffer, RECT *lpDstRect, POINT *lpDstPt, int a4, void *lpSrcBuffer, RECT *lpSrcRect, POINT *lpSrcPt, int a8, int a9, DWORD rop) rBool;\r\nBOOL STORMAPI SBltROP3Tiled(void *lpDstBuffer, RECT *lpDstRect, POINT *lpDstPt, int a4, void *lpSrcBuffer, RECT *lpSrcRect, POINT *lpSrcPt, int a8, int a9, DWORD rop) rBool;\r\n\r\nBOOL STORMAPI SBmpDecodeImage(DWORD dwImgType, void *pSrcBuffer, DWORD dwSrcBuffersize, PALETTEENTRY *pPalette, void *pDstBuffer, DWORD dwDstBuffersize, DWORD *pdwWidth, DWORD *pdwHeight, DWORD *pdwBpp) rBool;\r\n\r\nBOOL STORMAPI SBmpLoadImage(const char *pszFileName, PALETTEENTRY *pPalette, BYTE *pBuffer, DWORD dwBuffersize, DWORD *pdwWidth, DWORD *pdwHeight, DWORD *pdwBpp) rBool;\r\n\r\nBOOL   STORMAPI SBmpSaveImage(const char*, PALETTEENTRY*, void*, DWORD, DWORD, DWORD) rBool;\r\nHANDLE STORMAPI SBmpAllocLoadImage(const char *fileName, PALETTEENTRY *palette, void **buffer, int *width, int *height, int unused6, int unused7, void *(STORMAPI *allocFunction)(DWORD)) rPVoid;\r\n\r\nBOOL STORMAPI SCodeCompile(char *directives1, char *directives2, char *loopstring, unsigned int maxiterations, unsigned int flags, HANDLE handle) rBool;\r\nBOOL STORMAPI SCodeDelete(HANDLE handle) rBool;\r\n\r\nint  STORMAPI SCodeExecute(HANDLE handle, int a2) rInt;\r\n\r\nBOOL STORMAPI SDrawAutoInitialize(HINSTANCE hInst, LPCSTR lpClassName, LPCSTR lpWindowName, WNDPROC pfnWndProc, int nMode, int nWidth, int nHeight, int nBits) rBool;\r\nBOOL STORMAPI SDrawCaptureScreen(const char *source) rBool;\r\n\r\nHWND STORMAPI SDrawGetFrameWindow(HWND *sdraw_framewindow) rPVoid;\r\nBOOL STORMAPI SDrawGetObjects(LPDIRECTDRAW *ddInterface, LPDIRECTDRAWSURFACE *primarySurface, LPDIRECTDRAWSURFACE *surface2, LPDIRECTDRAWSURFACE *surface3, LPDIRECTDRAWSURFACE *backSurface, LPDIRECTDRAWPALETTE *ddPalette, HPALETTE *hPalette) rBool;\r\nBOOL STORMAPI SDrawGetScreenSize(DWORD *pdwWidth, DWORD *pdwHeight, DWORD *pdwBpp) rBool;\r\n\r\nBOOL STORMAPI SDrawLockSurface(int surfacenumber, RECT *lpDestRect, void **lplpSurface, int *lpPitch, int arg_unused) rBool;\r\nBOOL STORMAPI SDrawManualInitialize(HWND hWnd, LPDIRECTDRAW ddInterface, LPDIRECTDRAWSURFACE primarySurface, LPDIRECTDRAWSURFACE surface2, LPDIRECTDRAWSURFACE surface3, LPDIRECTDRAWSURFACE backSurface, LPDIRECTDRAWPALETTE ddPalette, HPALETTE hPalette) rBool;\r\n\r\nBOOL STORMAPI SDrawPostClose() rBool;\r\n//BOOL STORMAPI SDrawRealizePalette() rBool;\r\n\r\nBOOL STORMAPI SDrawUnlockSurface(int surfacenumber, void *lpSurface, int a3, RECT *lpRect) rBool;\r\nBOOL STORMAPI SDrawUpdatePalette(unsigned int firstentry, unsigned int numentries, PALETTEENTRY *pPalEntries, int a4) rBool;\r\n\r\nBOOL STORMAPI SEvtDispatch(DWORD dwMessageID, DWORD dwFlags, int type, PS_EVT pEvent) rBool;\r\n\r\nBOOL STORMAPI SGdiDeleteObject(HANDLE handle) rBool;\r\n\r\nBOOL STORMAPI SGdiExtTextOut(int a1, int a2, int a3, int a4, unsigned int a8, signed int a6, signed int a7, const char *string, unsigned int arg20) rBool;\r\nBOOL STORMAPI SGdiImportFont(HGDIOBJ handle, int windowsfont) rBool;\r\n\r\nBOOL STORMAPI SGdiSelectObject(int handle) rBool;\r\nBOOL STORMAPI SGdiSetPitch(int pitch) rBool;\r\n\r\nBOOL STORMAPI Ordinal393(char *string, int, int) rBool;\r\n\r\nvoid *STORMAPI SMemAlloc(size_t amount, const char *logfilename, int logline, int defaultValue) rPVoid;\r\n\r\nBOOL STORMAPI SMemFree(void *location, const char *logfilename, int logline, char defaultValue) rBool;\r\n\r\nvoid* STORMAPI SMemReAlloc(void *location, size_t amount, const char *logfilename, int logline, char defaultValue) rPVoid;\r\n\r\nBOOL STORMAPI SRegLoadData(const char *keyname, const char *valuename, int size, LPBYTE lpData, BYTE flags, LPDWORD lpcbData) rBool;\r\nBOOL STORMAPI SRegLoadString(const char *keyname, const char *valuename, BYTE flags, char *buffer, size_t buffersize) rBool;\r\nBOOL STORMAPI SRegLoadValue(const char *keyname, const char *valuename, BYTE flags, int *value) rBool;\r\nBOOL STORMAPI SRegSaveData(const char *keyname, const char *valuename, int size, BYTE *lpData, DWORD cbData) rBool;\r\nBOOL STORMAPI SRegSaveString(const char *keyname, const char *valuename, BYTE flags, char *string) rBool;\r\nBOOL STORMAPI SRegSaveValue(const char *keyname, const char *valuename, BYTE flags, DWORD result) rBool;\r\n\r\nBOOL STORMAPI SRegDeleteValue(const char *keyname, const char *valuename, BYTE flags) rBool;\r\n\r\nBOOL STORMAPI STransBlt(void *lpSurface, int x, int y, int width, HANDLE hTrans) rBool;\r\nBOOL STORMAPI STransBltUsingMask(void *lpSurface, void *lpSource, int pitch, int width, HANDLE hTrans) rBool;\r\n\r\nBOOL STORMAPI STransDelete(HANDLE hTrans) rBool;\r\n\r\nBOOL STORMAPI STransDuplicate(HANDLE hTransSource, HANDLE hTransDest) rBool;\r\nBOOL STORMAPI STransIntersectDirtyArray(HANDLE hTrans, char * dirtyarraymask, unsigned flags, HANDLE * phTransResult) rBool;\r\nBOOL STORMAPI STransInvertMask(HANDLE hTrans, HANDLE * phTransResult) rBool;\r\n\r\nBOOL STORMAPI STransSetDirtyArrayInfo(int width, int height, int depth, int bits) rBool;\r\n\r\nBOOL STORMAPI STransPointInMask(HANDLE hTrans, int x, int y) rBool;\r\nBOOL STORMAPI STransCombineMasks(HANDLE hTransA, HANDLE hTransB, int left, int top, int flags, HANDLE * phTransResult) rBool;\r\n\r\nBOOL STORMAPI STransCreateE(void *pBuffer, int width, int height, int bpp, int a5, int bufferSize, HANDLE *phTransOut) rBool;\r\nBOOL STORMAPI STransCreateI(void *pBuffer, int width, int height, int bpp, int a5, int bufferSize, HANDLE *phTransOut) rBool;\r\n\r\nBOOL STORMAPI SVidDestroy() rBool;\r\nBOOL STORMAPI SVidGetSize(HANDLE video, int width, int height, int zero) rBool;\r\nBOOL STORMAPI SVidInitialize(HANDLE video) rBool;\r\nBOOL STORMAPI SVidPlayBegin(const char *filename, int a2, int a3, int a4, int a5, int flags, HANDLE *video) rBool;\r\n\r\nBOOL STORMAPI SVidPlayContinueSingle(HANDLE video, int a2, int a3) rBool;\r\nBOOL STORMAPI SVidPlayEnd(HANDLE video) rBool;\r\n\r\nBOOL STORMAPI SErrDisplayError(DWORD dwErrMsg, const char *logfilename, int logline, const char *message, BOOL allowOption, int exitCode) rBool;\r\nBOOL STORMAPI SErrGetErrorStr(DWORD dwErrCode, char *buffer, size_t bufferchars) rBool;\r\nDWORD STORMAPI SErrGetLastError() rInt;\r\n\r\nvoid STORMAPI SErrSetLastError(DWORD dwErrCode) rVoid;\r\n\r\nvoid STORMAPI SErrSuppressErrors(BOOL suppressErrors) rVoid;\r\n\r\nvoid STORMAPI SMemCopy(void *dest, const void *source, size_t size) rVoid;\r\nvoid STORMAPI SMemFill(void *location, size_t length, char fillWith) rVoid;\r\n\r\nvoid STORMAPI SMemZero(void *location, DWORD length) rVoid;\r\nint  STORMAPI SMemCmp(void *location1, void *location2, DWORD size) rInt;\r\n\r\nint   STORMAPI SStrCopy(char *dest, const char *src, int max_length) rInt;\r\nDWORD STORMAPI SStrHash(const char *string, DWORD flags, DWORD Seed) rInt;\r\nint   STORMAPI SStrPack(char *dest, const char *src, DWORD max_length) rInt;\r\n\r\nint STORMAPI SStrLen(const char* string) rInt;\r\n\r\nint STORMAPI SStrCmp(const char *string1, const char *string2, size_t size) rInt;\r\nint STORMAPI SStrCmpI(const char *string1, const char *string2, size_t size) rInt;\r\nchar* STORMAPI SStrUpper(char* string) rPVoid;\r\n\r\nvoid STORMAPI SRgn523(HANDLE hRgn, RECT *pRect, int a3, int a4) rVoid;\r\nvoid STORMAPI SRgnCreateRegion(HANDLE *hRgn, int a2) rVoid;\r\nvoid STORMAPI SRgnDeleteRegion(HANDLE hRgn) rVoid;\r\n\r\nvoid STORMAPI SRgn529i(int handle, int a2, int a3) rVoid;\r\n\r\nBOOL SErrDisplayErrorFmt(DWORD dwErrMsg, const char *logfilename, int logline, BOOL allowOption, int exitCode, const char *format, ...) rBool;\r\n\r\nvoid STORMAPI SErrCatchUnhandledExceptions() rVoid;\r\n\r\nchar* STORMAPI SStrChr(const char *string, char c) rPVoid;\r\nchar* STORMAPI SStrChrR(const char *string, char c) rPVoid;\r\n\r\nsize_t SStrVPrintf(char *dest, size_t size, const char *format, ...) rInt;\r\n\r\nint STORMAPI SBigDel(void *buffer) rInt;\r\n\r\nint STORMAPI SBigFromBinary(void *buffer, const void *str, size_t size) rInt;\r\n\r\nint STORMAPI SBigNew(void **buffer) rInt;\r\n\r\nint STORMAPI SBigPowMod(void *buffer1, void *buffer2, int a3, int a4) rInt;\r\n\r\nint STORMAPI SBigToBinaryBuffer(void *buffer, int length, int a3, int a4) rInt;\r\n//\r\n\r\nvoid __stdcall SDrawMessageBox(const char *,const char *,int) rVoid;\r\nvoid __cdecl SDrawDestroy(void) rVoid;\r\nBOOLEAN __cdecl StormDestroy(void) rBool;\r\nBOOL __stdcall SFileSetBasePath(const char *) rBool;\r\nvoid __cdecl SDrawRealizePalette(void) rVoid;\r\nBOOL __cdecl SVidPlayContinue(void) rBool;\r\nBOOL __stdcall SNetGetOwnerTurnsWaiting(DWORD *) rBool;\r\nBOOL __stdcall SNetUnregisterEventHandler(int,SEVTHANDLER) rPVoid;\r\nBOOL __stdcall SNetRegisterEventHandler(int,SEVTHANDLER) rPVoid;\r\nBOOLEAN __stdcall SNetSetBasePlayer(int) rBool;\r\nint __stdcall SNetInitializeProvider(unsigned long,struct _SNETPROGRAMDATA *,struct _SNETPLAYERDATA *,struct _SNETUIDATA *,struct _SNETVERSIONDATA *) rInt;\r\nint __stdcall SNetGetProviderCaps(struct _SNETCAPS *) rInt;\r\nint __stdcall SFileSetFilePointer(HANDLE,int,HANDLE,int) rInt;\r\nvoid __stdcall SDrawClearSurface(int a1) rVoid;\r\nBOOL __stdcall SDlgSetBitmapI(HWND hWnd, int a2, char *src, int mask1, int flags, void *pBuff, int a7, int width, int height, int mask2) rBool;\r\nvoid __stdcall SDlgBeginPaint(HWND hWnd, char *a2) rVoid;\r\nvoid __stdcall SDlgEndPaint(HWND hWnd, char *a2) rVoid;\r\nvoid __stdcall SDlgSetSystemCursor(BYTE *a1, BYTE *a2, int *a3, int a4) rVoid;\r\nvoid __stdcall SDlgSetCursor(HWND hWnd, HCURSOR a2, int a3, int *a4) rVoid;\r\nBOOL __stdcall SDlgSetTimer(int a1, int a2, int a3, void (__stdcall *a4)(int, int, int, int)) rBool;\r\nBOOL __stdcall SDlgKillTimer(int a1, int a2) rBool;\r\nBOOL __stdcall SDlgDrawBitmap(HWND hWnd, int a2, int a3, int a4, int a5, int a6, int a7) rBool;\r\nBOOL __stdcall SDlgDialogBoxParam(HINSTANCE hInst, char *szDialog, int hWnd, WNDPROC func, int selhero_is_good) rBool;\r\nBOOL __stdcall SGdiTextOut(void *pBuffer, int x, int y, int mask, char *str, int len) rBool;\r\nBOOL __stdcall SFileEnableDirectAccess(BOOL enable) rBool;\r\n"
  },
  {
    "path": "3rdParty/Storm/Source/storm.def",
    "content": "LIBRARY      \"Storm\"\r\n\r\nEXPORTS\r\n  SNetCreateGame                @101 NONAME\r\n  SNetDestroy                   @102 NONAME\r\n  ;SNetEnumDevices               @103 NONAME\r\n  ;SNetEnumGames                 @104 NONAME\r\n  ;SNetEnumProviders             @105 NONAME\r\n  SNetDropPlayer                @106 NONAME\r\n  SNetGetGameInfo               @107 NONAME\r\n  ;SNetGetNetworkLatency         @108 NONAME\r\n  SNetGetNumPlayers             @109 NONAME\r\n  SNetGetOwnerTurnsWaiting      @110 NONAME\r\n  ;SNetGetPerformanceData        @111 NONAME\r\n  SNetGetPlayerCaps             @112 NONAME\r\n  SNetGetPlayerName             @113 NONAME\r\n  SNetGetProviderCaps           @114 NONAME\r\n  SNetGetTurnsInTransit         @115 NONAME\r\n  SNetInitializeDevice          @116 NONAME\r\n  SNetInitializeProvider        @117 NONAME\r\n  SNetJoinGame                  @118 NONAME\r\n  SNetLeaveGame                 @119 NONAME\r\n  SNetPerformUpgrade            @120 NONAME\r\n  SNetReceiveMessage            @121 NONAME\r\n  SNetReceiveTurns              @122 NONAME\r\n  SNetRegisterEventHandler      @123 NONAME\r\n  ;SNetResetLatencyMeasurements  @124 NONAME\r\n  SNetSelectGame                @125 NONAME\r\n  ;SNetSelectProvider            @126 NONAME\r\n  SNetSendMessage               @127 NONAME\r\n  SNetSendTurn                  @128 NONAME\r\n  SNetSetBasePlayer             @129 NONAME\r\n  SNetSetGameMode               @130 NONAME\r\n  SNetUnregisterEventHandler    @131 NONAME\r\n\r\n  SNetEnumGamesEx               @133 NONAME\r\n  SNetSendServerChatCommand     @134 NONAME\r\n  ;SNetSendDatagram             @135 NONAME\r\n  ;SNetReceiveDatagram          @136 NONAME\r\n  SNetDisconnectAll             @137 NONAME\r\n  SNetCreateLadderGame          @138 NONAME\r\n  SNetReportGameResult          @139 NONAME\r\n  ;SNetCheckDataFile             @140 NONAME\r\n  SNetSendLeagueCommand         @141 NONAME\r\n  SNetSendReplayPath            @142 NONAME\r\n  SNetGetLeagueName             @143 NONAME\r\n  SNetGetPlayerNames            @144 NONAME\r\n  SNetLeagueLogout              @145 NONAME\r\n  SNetGetLeaguePlayerName       @146 NONAME\r\n\r\n  ;Ordinal150                    @150 NONAME\r\n  ;Ordinal151                    @151 NONAME\r\n\r\n  SDlgBeginPaint                @201 NONAME\r\n  SDlgBltToWindowI              @202 NONAME\r\n  ;SDlgCheckTimers               @203 NONAME\r\n  ;SDlgCreateDialogIndirectParam @204 NONAME\r\n  ;SDlgCreateDialogParam         @205 NONAME\r\n  SDlgDefDialogProc             @206 NONAME\r\n  \r\n  SDlgDialogBoxIndirectParam    @208 NONAME\r\n  SDlgDialogBoxParam            @209 NONAME\r\n  SDlgDrawBitmap                @210 NONAME\r\n  SDlgEndDialog                 @211 NONAME\r\n  SDlgEndPaint                  @212 NONAME\r\n  SDlgKillTimer                 @213 NONAME\r\n  ;SDlgSetBaseFont               @214 NONAME\r\n  SDlgSetBitmapI                @215 NONAME\r\n  SDlgSetControlBitmaps         @216 NONAME\r\n  SDlgSetCursor                 @217 NONAME\r\n  SDlgSetSystemCursor           @218 NONAME\r\n  SDlgSetTimer                  @219 NONAME\r\n  ;SDlgUpdateCursor              @220 NONAME\r\n  SDlgBltToWindowE              @221 NONAME\r\n  SDlgSetBitmapE                @222 NONAME\r\n  ;SDlgSetLocale                 @223 NONAME\r\n  Ordinal224                    @224 NONAME\r\n\r\n  ;SFileAuthenticateArchive      @251 NONAME\r\n  SFileCloseArchive             @252 NONAME\r\n  SFileCloseFile                @253 NONAME\r\n  ;SFileDdaBegin                 @254 NONAME\r\n  SFileDdaBeginEx               @255 NONAME\r\n  SFileDdaDestroy               @256 NONAME\r\n  SFileDdaEnd                   @257 NONAME\r\n  SFileDdaGetPos                @258 NONAME\r\n  ;SFileDdaGetVolume             @259 NONAME\r\n  SFileDdaInitialize            @260 NONAME\r\n  SFileDdaSetVolume             @261 NONAME\r\n  SFileDestroy                  @262 NONAME\r\n  SFileEnableDirectAccess       @263 NONAME\r\n  SFileGetFileArchive           @264 NONAME\r\n  SFileGetFileSize              @265 NONAME\r\n  SFileOpenArchive              @266 NONAME\r\n  SFileOpenFile                 @267 NONAME\r\n  SFileOpenFileEx               @268 NONAME\r\n  SFileReadFile                 @269 NONAME\r\n  SFileSetBasePath              @270 NONAME\r\n  SFileSetFilePointer           @271 NONAME\r\n  SFileSetLocale                @272 NONAME\r\n  ;SFileGetBasePath              @273 NONAME\r\n  SFileSetIoErrorMode           @274 NONAME\r\n  SFileGetArchiveName           @275 NONAME\r\n  SFileGetFileName              @276 NONAME\r\n  ;SFileGetArchiveInfo           @277 NONAME\r\n  ;SFileSetPlatform              @278 NONAME\r\n  SFileLoadFile                 @279 NONAME\r\n  SFileUnloadFile               @280 NONAME\r\n  SFileLoadFileEx               @281 NONAME\r\n  ;SFilePrioritizeRequest        @282 NONAME\r\n  ;SFileCancelRequest            @283 NONAME\r\n  ;SFileSetAsyncBudget           @284 NONAME\r\n  ;SFileSetDataChunkSize         @285 NONAME\r\n  ;SFileEnableSeekOptimization   @286 NONAME\r\n  ;SFileReadFileEx               @287 NONAME\r\n  ;SFileFileExists               @288 NONAME\r\n  ;SFileFileExistsEx             @289 NONAME\r\n  ;SFileReadFileEx2              @290 NONAME\r\n  ;SFileReadFile2                @291 NONAME\r\n  ;SFileLoadFile2                @292 NONAME\r\n  ;SFileOpenFileAsArchive        @293 NONAME\r\n  ;SFileGetLocale                @294 NONAME\r\n  ;SFileRegisterLoadNotifyProc   @295 NONAME\r\n  ;SFileGetFileCompressedSize    @296 NONAME\r\n  ;Ordinal297                    @297 NONAME\r\n  ;Ordinal298                    @298 NONAME\r\n  ;SFileAuthenticateArchiveEx    @299 NONAME\r\n  ;SFileOpenPathAsArchive        @300 NONAME\r\n  StormDestroy                  @301 NONAME\r\n  ;StormGetInstance              @302 NONAME\r\n  ;StormGetOption                @303 NONAME\r\n  ;StormSetOption                @304 NONAME\r\n\r\n  ;SBltGetSCode                  @312 NONAME\r\n  SBltROP3                      @313 NONAME\r\n  SBltROP3Clipped               @314 NONAME\r\n  SBltROP3Tiled                 @315 NONAME\r\n\r\n  SBmpDecodeImage               @321 NONAME\r\n\r\n  SBmpLoadImage                 @323 NONAME\r\n  SBmpSaveImage                 @324 NONAME\r\n  SBmpAllocLoadImage            @325 NONAME\r\n  ;SBmpSaveImageEx               @326 NONAME\r\n\r\n  SCodeCompile                  @331 NONAME\r\n  SCodeDelete                   @332 NONAME\r\n  \r\n  SCodeExecute                  @334 NONAME\r\n  ;SCodeGetPseudocode            @335 NONAME\r\n\r\n  SDrawAutoInitialize           @341 NONAME\r\n  SDrawCaptureScreen            @342 NONAME\r\n  SDrawClearSurface             @343 NONAME\r\n  SDrawDestroy                  @344 NONAME\r\n  ;SDrawFlipPage                 @345 NONAME\r\n  SDrawGetFrameWindow           @346 NONAME\r\n  SDrawGetObjects               @347 NONAME\r\n  SDrawGetScreenSize            @348 NONAME\r\n  ;SDrawGetServiceLevel          @349 NONAME\r\n  SDrawLockSurface              @350 NONAME\r\n  SDrawManualInitialize         @351 NONAME\r\n  SDrawMessageBox               @352 NONAME\r\n  SDrawPostClose                @353 NONAME\r\n  SDrawRealizePalette           @354 NONAME\r\n  ;SDrawSelectGdiSurface         @355 NONAME\r\n  SDrawUnlockSurface            @356 NONAME\r\n  SDrawUpdatePalette            @357 NONAME\r\n  ;SDrawUpdateScreen             @358 NONAME\r\n  ;SDrawWaitForVerticalBlank     @359 NONAME\r\n\r\n  SEvtDispatch                  @372 NONAME\r\n  ;SEvtRegisterHandler           @373 NONAME\r\n  ;SEvtUnregisterHandler         @374 NONAME\r\n  ;SEvtUnregisterType            @375 NONAME\r\n  ;SEvtPopState                  @376 NONAME\r\n  ;SEvtPushState                 @377 NONAME\r\n  ;SEvtBreakHandlerChain         @378 NONAME\r\n\r\n  ;SGdiBitBlt                    @381 NONAME\r\n  ;SGdiCreateFont                @382 NONAME\r\n  SGdiDeleteObject              @383 NONAME\r\n  ;SGdiDestroy                   @384 NONAME\r\n  SGdiExtTextOut                @385 NONAME\r\n  SGdiImportFont                @386 NONAME\r\n  ;SGdiLoadFont                  @387 NONAME\r\n  ;SGdiRectangle                 @388 NONAME\r\n  SGdiSelectObject              @389 NONAME\r\n  SGdiSetPitch                  @390 NONAME\r\n  SGdiTextOut                   @391 NONAME\r\n  ;SGdi392                       @392 NONAME\r\n  Ordinal393                    @393 NONAME\r\n\r\n  ;SMem399                       @399 NONAME\r\n  \r\n  SMemAlloc                     @401 NONAME\r\n  ;SMemDestroy                   @402 NONAME\r\n  SMemFree                      @403 NONAME\r\n  ;SMemGetSize                   @404 NONAME\r\n  SMemReAlloc                   @405 NONAME\r\n  ;Storm406                      @406 NONAME\r\n\r\n  ;SMsgDispatchMessage           @412 NONAME\r\n  ;SMsgDoMessageLoop             @413 NONAME\r\n  ;SMsgRegisterCommand           @414 NONAME\r\n  ;SMsgRegisterKeyDown           @415 NONAME\r\n  ;SMsgRegisterKeyUp             @416 NONAME\r\n  ;SMsgRegisterMessage           @417 NONAME\r\n  ;SMsgPopRegisterState          @418 NONAME\r\n  ;SMsgPushRegisterState         @419 NONAME\r\n  ;SMsg420                       @420 NONAME\r\n  SRegLoadData                  @421 NONAME\r\n  SRegLoadString                @422 NONAME\r\n  SRegLoadValue                 @423 NONAME\r\n  SRegSaveData                  @424 NONAME\r\n  SRegSaveString                @425 NONAME\r\n  SRegSaveValue                 @426 NONAME\r\n  ;SRegGetBaseKey                @427 NONAME\r\n  SRegDeleteValue               @428 NONAME\r\n  ;SReg429                       @429 NONAME\r\n  ;SReg430                       @430 NONAME\r\n  STransBlt                     @431 NONAME\r\n  STransBltUsingMask            @432 NONAME\r\n  STransCreateI                 @433 NONAME\r\n  STransDelete                  @434 NONAME\r\n  \r\n  STransDuplicate               @436 NONAME\r\n  STransIntersectDirtyArray     @437 NONAME\r\n  STransInvertMask              @438 NONAME\r\n  ;STransLoadI                   @439 NONAME\r\n  STransSetDirtyArrayInfo       @440 NONAME\r\n  ;STransUpdateDirtyArray        @441 NONAME\r\n  STransPointInMask             @442 NONAME\r\n  STransCombineMasks            @443 NONAME\r\n  ;STransCreateI                 @444 NONAME\r\n  STransCreateE                 @445 NONAME\r\n  ;STrans446                     @446 NONAME\r\n  ;STransLoadE                   @447 NONAME\r\n\r\n  SVidDestroy                   @451 NONAME\r\n  SVidGetSize                   @452 NONAME\r\n  SVidInitialize                @453 NONAME\r\n  SVidPlayBegin                 @454 NONAME\r\n  ;SVidPlayBeginFromMemory       @455 NONAME\r\n  SVidPlayContinue              @456 NONAME\r\n  SVidPlayContinueSingle        @457 NONAME\r\n  SVidPlayEnd                   @458 NONAME\r\n  ;SVidSetVolume                 @459 NONAME\r\n  ;Storm460                      @460 NONAME\r\n  SErrDisplayError              @461 NONAME\r\n  SErrGetErrorStr               @462 NONAME\r\n  SErrGetLastError              @463 NONAME\r\n  ;SErrRegisterMessageSource     @464 NONAME\r\n  SErrSetLastError              @465 NONAME\r\n  ;SErrReportNamedResourceLeak   @466 NONAME\r\n  ;SErrReportResourceLeak        @467 NONAME\r\n  SErrSuppressErrors            @468 NONAME\r\n  ;SErrRegisterHandler           @469 NONAME\r\n  ;SErrUnregisterHandler         @470 NONAME\r\n  ;Storm471                      @471 NONAME\r\n  ;SCmdGetBool                   @472 NONAME\r\n  ;SCmdGetNum                    @473 NONAME\r\n  ;SCmdGetString                 @474 NONAME\r\n  ;SCmdProcess                   @475 NONAME\r\n  ;SCmdRegisterArgList           @476 NONAME\r\n  ;SCmdRegisterArgument          @477 NONAME\r\n  ;SCmdStringExists              @478 NONAME\r\n  ;SCmdProcessCommandLine        @479 NONAME\r\n  ;Ordinal480                    @480 NONAME\r\n  ;SMemFindNextBlock             @481 NONAME\r\n  ;SMemFindNextHeap              @482 NONAME\r\n  ;SMemGetHeapByCaller           @483 NONAME\r\n  ;SMemGetHeapByPtr              @484 NONAME\r\n  ;SMemHeapAlloc                 @485 NONAME\r\n  ;SMemHeapCreate                @486 NONAME\r\n  ;SMemHeapDestroy               @487 NONAME\r\n  ;SMemHeapFree                  @488 NONAME\r\n  ;SMemHeapRealloc               @489 NONAME\r\n  ;SMemHeapSize                  @490 NONAME\r\n  SMemCopy                      @491 NONAME\r\n  SMemFill                      @492 NONAME\r\n  ;SMemMove                      @493 NONAME\r\n  SMemZero                      @494 NONAME\r\n  SMemCmp                       @495 NONAME\r\n  ;SMem496                       @496 NONAME\r\n  ;SMemDumpState                 @497 NONAME\r\n  ;Ordinal498                    @498 NONAME\r\n\r\n  SStrCopy                      @501 NONAME\r\n  SStrHash                      @502 NONAME\r\n  SStrPack                      @503 NONAME\r\n  ;SStrTokenize                  @504 NONAME\r\n  ;SStrPack                      @505 NONAME\r\n  SStrLen                       @506 NONAME\r\n  ;SStrDup                       @507 NONAME\r\n  SStrCmp                       @508 NONAME\r\n  SStrCmpI                      @509 NONAME\r\n  SStrUpper                     @510 NONAME\r\n  ;SMsgBreakHandlerChain         @511 NONAME\r\n  ;SMsgUnregisterCommand         @512 NONAME\r\n  ;SMsgUnregisterKeyDown         @513 NONAME\r\n  ;SMsgUnregisterKeyUp           @514 NONAME\r\n  ;SMsgUnregisterMessage         @515 NONAME\r\n  ;SMsgGetDispatcher             @516 NONAME\r\n  ;SMsgSetDefaultWindow          @517 NONAME\r\n  ;SMsgGetDefaultWindow          @518 NONAME\r\n  ;SMsg519                       @519 NONAME\r\n\r\n  ;SRgn521                     @521 NONAME\r\n\r\n  SRgn523                       @523 NONAME\r\n  SRgnCreateRegion              @524 NONAME\r\n  SRgnDeleteRegion              @525 NONAME\r\n\r\n  ;SRgn527                       @527 NONAME\r\n  ;SRgn528i                      @528 NONAME\r\n  SRgn529i                      @529 NONAME\r\n  ;SRgn530i                      @530 NONAME\r\n  ;SRgn531i                      @531 NONAME\r\n  ;SRgn532i                      @532 NONAME\r\n  ;SRgn533i                      @533 NONAME\r\n  ;SRgn534                       @534 NONAME\r\n  ;SRgn535f                      @535 NONAME\r\n  ;SRgn536f                      @536 NONAME\r\n  ;SRgn537f                      @537 NONAME\r\n  ;SRgn538f                      @538 NONAME\r\n  ;SRgn539f                      @539 NONAME\r\n  ;SRgn540f                      @540 NONAME\r\n  ;SLogClose                     @541 NONAME\r\n  ;SLogCreate                    @542 NONAME\r\n  ;SLog543                       @543 NONAME\r\n  ;SLogDump                      @544 NONAME\r\n  ;SLogFlush                     @545 NONAME\r\n  ;SLogFlushAll                  @546 NONAME\r\n  ;SLogPend                      @547 NONAME\r\n  ;SLogWrite                     @548 NONAME\r\n  ;SLog549                       @549 NONAME\r\n  ;SLogCriticalLog               @550 NONAME\r\n  ;SCompCompress                 @551 NONAME\r\n  ;SCompDecompress               @552 NONAME\r\n  ;SLogVWrite                    @553 NONAME\r\n  ;Ordinal554                    @554 NONAME\r\n  ;Ordinal555                    @555 NONAME\r\n  ;Ordinal556                    @556 NONAME\r\n  ;Ordinal557                    @557 NONAME\r\n  ;Ordinal558                    @558 NONAME\r\n  ;Ordinal559                    @559 NONAME\r\n  ;Ordinal560                    @560 NONAME\r\n  ;SErrCheckDebugSymbolLibrary   @561 NONAME\r\n  SErrDisplayErrorFmt           @562 NONAME\r\n  ;SErrIsDisplayingError         @563 NONAME\r\n  ;SErrPrepareAppFatal           @564 NONAME\r\n  ;SErrSetLogTitleString         @565 NONAME\r\n  ;SErrDisplayAppFatal           @566 NONAME\r\n  SErrCatchUnhandledExceptions  @567 NONAME\r\n  ;Storm568                      @568 NONAME\r\n  ;SStrChr                       @569 NONAME\r\n  ;SStrChrR                      @570 NONAME\r\n  SStrChr                       @571 NONAME\r\n  SStrChrR                      @572 NONAME\r\n  ;SStrToDouble                  @573 NONAME\r\n  ;SStrToFloat                   @574 NONAME\r\n  ;SStrToInt                     @575 NONAME\r\n  ;SStrToUnsigned                @576 NONAME\r\n  ;SStrToInt64                   @577 NONAME\r\n  SStrVPrintf                   @578 NONAME\r\n  ;SStrLower                     @579 NONAME\r\n  ;SStrHash64                    @580 NONAME\r\n  ;SStrPrintf                    @581 NONAME\r\n  ;SDrawSetClientRect            @582 NONAME\r\n  ;SDrawGetClientRect            @583 NONAME\r\n  ;SStrStrI                      @584 NONAME\r\n  ;SStrStrI                      @585 NONAME\r\n  ;SStrStr                       @586 NONAME\r\n  ;SStrStr                       @587 NONAME\r\n  ;SNet588                       @588 NONAME\r\n\r\n  ;SBigAdd                       @601 NONAME\r\n  ;SBigAnd                       @602 NONAME\r\n  ;SBigCompare                   @603 NONAME\r\n  ;SBigCopy                      @604 NONAME\r\n  ;SBigDec                       @605 NONAME\r\n  SBigDel                       @606 NONAME\r\n  ;SBigDiv                       @607 NONAME\r\n  ;SBigFindPrime                 @608 NONAME\r\n  SBigFromBinary                @609 NONAME\r\n  ;SBigFromStr                   @610 NONAME\r\n  ;SBigFromStream                @611 NONAME\r\n  ;SBigFromUnsigned              @612 NONAME\r\n  ;SBigGcd                       @613 NONAME\r\n  ;SBigInc                       @614 NONAME\r\n  ;SBigInvMod                    @615 NONAME\r\n  ;SBigIsEven                    @616 NONAME\r\n  ;SBigIsOdd                     @617 NONAME\r\n  ;SBigIsOne                     @618 NONAME\r\n  ;SBigIsPrime                   @619 NONAME\r\n  ;SBigIsZero                    @620 NONAME\r\n  ;SBigMod                       @621 NONAME\r\n  ;SBigMul                       @622 NONAME\r\n  ;SBigMulMod                    @623 NONAME\r\n  SBigNew                       @624 NONAME\r\n  ;SBigNot                       @625 NONAME\r\n  ;SBigOr                        @626 NONAME\r\n  ;SBigPow                       @627 NONAME\r\n  SBigPowMod                    @628 NONAME\r\n  ;SBigRand                      @629 NONAME\r\n  ;SBigSet2Exp                   @630 NONAME\r\n  ;SBigSetOne                    @631 NONAME\r\n  ;SBigSetZero                   @632 NONAME\r\n  ;SBigShl                       @633 NONAME\r\n  ;SBigShr                       @634 NONAME\r\n  ;SBigSquare                    @635 NONAME\r\n  ;SBigSub                       @636 NONAME\r\n  ;SBigToBinaryArray             @637 NONAME\r\n  SBigToBinaryBuffer            @638 NONAME\r\n  ;SBigToBinaryPtr               @639 NONAME\r\n  ;SBigToStrArray                @640 NONAME\r\n  ;SBigToStrBuffer               @641 NONAME\r\n  ;SBigToStrPtr                  @642 NONAME\r\n  ;SBigToStreamArray             @643 NONAME\r\n  ;SBigToStreamBuffer            @644 NONAME\r\n  ;SBigToStreamPtr               @645 NONAME\r\n  ;SBigToUnsigned                @646 NONAME\r\n  ;SBigXor                       @647 NONAME\r\n\r\n  ;SUniConvertUTF16to8Len        @901 NONAME\r\n  ;SUniConvertUTF16to8           @902 NONAME\r\n  ;SUniConvertUTF8to16Len        @903 NONAME\r\n  ;SUniConvertUTF8to16           @904 NONAME\r\n  ;SUniS905                      @905 NONAME\r\n  ;SUniS906                      @906 NONAME\r\n  ;SUniFindAfterUTF8Chr          @907 NONAME\r\n  ;SUniFindUTF8ChrStart          @908 NONAME\r\n  ;SUniConvertUTF16To909         @909 NONAME\r\n  ;SUniConvertUTF16To910         @910 NONAME\r\n  ;SUniConvertUTF16To911         @911 NONAME\r\n  ;SUniConvert912                @912 NONAME\r\n  ;SUniConvert913                @913 NONAME\r\n  ;SUniConvert914                @914 NONAME\r\n  ;SUniConvertUTF8ToWin          @915 NONAME\r\n; END\r\n"
  },
  {
    "path": "3rdParty/Storm/Source/storm.h",
    "content": "#pragma once\r\n\r\n#ifndef __BLIZZARD_STORM_HEADER\r\n#define __BLIZZARD_STORM_HEADER\r\n\r\n#include <windows.h>\r\n#include <winuser.h>\r\n#include <winsock.h>\r\n#include <ddraw.h>\r\n#include <limits>\r\n\r\n// Note to self: Linker error => forgot a return value in cpp\r\n\r\n// Storm API definition\r\n#ifndef STORMAPI\r\n#define STORMAPI __stdcall\r\n#endif\r\n\r\n#ifndef __STORM_SMAX\r\n#define __STORM_SMAX(x,y) (x < y ? y : x)\r\n#endif\r\n\r\n#ifndef __STORM_SSIZEMAX\r\n#define __STORM_SSIZEMAX(x,y) (__STORM_SMAX(sizeof(x),sizeof(y)))\r\n#endif\r\n\r\n#ifndef __STORM_SMIN\r\n#define __STORM_SMIN(x,y) (x < y ? x : y)\r\n#endif\r\n\r\n#ifndef __STORM_SSIZEMIN\r\n#define __STORM_SSIZEMIN(x,y) (__STORM_SMIN(sizeof(x),sizeof(y)))\r\n#endif\r\n\r\ntypedef struct _WRECT\r\n{\r\n  WORD  left;\r\n  WORD  top;\r\n  WORD  right;\r\n  WORD  bottom;\r\n} WRECT, *PWRECT;\r\n\r\ntypedef struct _WPOINT\r\n{\r\n  WORD  x;\r\n  WORD  y;\r\n} WPOINT, *PWPOINT;\r\n\r\ntypedef struct _WSIZE\r\n{\r\n  WORD  cx;\r\n  WORD  cy;\r\n} WSIZE, *PWSIZE;\r\n\r\n#ifdef __cplusplus\r\nstatic float infinity = std::numeric_limits<float>::infinity();\r\n\r\nstruct CCritSect {\r\n\tCRITICAL_SECTION m_critsect;\r\n\r\n\tCCritSect()\r\n\t{\r\n\t\tInitializeCriticalSection(&m_critsect);\r\n\t}\r\n\t~CCritSect()\r\n\t{\r\n\t\tDeleteCriticalSection(&m_critsect);\r\n\t}\r\n\tvoid Enter()\r\n\t{\r\n\t\tEnterCriticalSection(&m_critsect);\r\n\t}\r\n\tvoid Leave()\r\n\t{\r\n\t\tLeaveCriticalSection(&m_critsect);\r\n\t}\r\n};\r\n#endif\r\n\r\n\r\n\r\n// Game states\r\n#define GAMESTATE_PRIVATE 0x01\r\n#define GAMESTATE_FULL    0x02\r\n#define GAMESTATE_ACTIVE  0x04\r\n#define GAMESTATE_STARTED 0x08\r\n#define GAMESTATE_REPLAY  0x80\r\n\r\n#define PS_CONNECTED 0x10000\r\n#define PS_TURN_ARRIVED 0x20000\r\n#define PS_ACTIVE 0x40000\r\n\r\n#define LEAVE_ENDING 0x40000004\r\n#define LEAVE_DROP 0x40000006\r\n\r\n#if defined(__GNUC__) || defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\nBOOL STORMAPI SNetCreateGame(const char *pszGameName, const char *pszGamePassword, const char *pszGameStatString, DWORD dwGameType, char *GameTemplateData, int GameTemplateSize, int playerCount, const char *creatorName, const char *a11, int *playerID);\r\nBOOL STORMAPI SNetDestroy();\r\n\r\n/*  SNetDropPlayer @ 106\r\n *\r\n *  Drops a player from the current game.\r\n *\r\n *  playerid:     The player ID for the player to be dropped.\r\n *  flags:\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetDropPlayer(\r\n      int playerid,\r\n      DWORD flags);\r\n\r\n/*  SNetGetGameInfo @ 107\r\n *\r\n *  Retrieves specific game information from Storm, such as name, password,\r\n *  stats, mode, game template, and players.\r\n *\r\n *  type:         The type of data to retrieve. See GAMEINFO_ flags.\r\n *  dst:          The destination buffer for the data.\r\n *  length:       The maximum size of the destination buffer.\r\n *  byteswritten: The number of bytes written to the destination buffer.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetGetGameInfo(\r\n    int type,\r\n    void *dst,\r\n    unsigned int length,\r\n    unsigned int *byteswritten);\r\n\r\n\r\n#define SNGetGameInfo(typ,dst) SNetGetGameInfo(typ, &dst, sizeof(dst))\r\n\r\n\r\n\r\n// Game info fields\r\n#define GAMEINFO_NAME           1\r\n#define GAMEINFO_PASSWORD       2\r\n#define GAMEINFO_STATS          3\r\n#define GAMEINFO_MODEFLAG       4\r\n#define GAMEINFO_GAMETEMPLATE   5\r\n#define GAMEINFO_PLAYERS        6\r\n\r\n\r\nBOOL STORMAPI SNetGetNumPlayers(int *firstplayerid, int *lastplayerid, int *activeplayers);\r\n\r\n\r\ntypedef struct _CAPS\r\n{\r\n  DWORD dwSize;                 // Size of this structure  // sizeof(CAPS)\r\n  DWORD dwUnk_0x04;             // Some flags?\r\n  DWORD maxmessagesize;         // Size of the packet buffer, must be beteen 128 and 512\r\n  DWORD dwUnk_0x0C;             // Unknown\r\n  DWORD dwDisplayedPlayerCount; // Displayed player count in the mode selection list\r\n  DWORD dwUnk_0x14;             // some kind of timeout or timer related\r\n  DWORD dwPlayerLatency;        // ... latency?\r\n  DWORD dwPlayerCount;          // the number of players that can participate, must be between 1 and 20\r\n  DWORD dwCallDelay;            // the number of calls before data is sent over the network // between 2 and 8; single player is set to 1\r\n} CAPS, *PCAPS;\r\n\r\n\r\nBOOL STORMAPI SNetGetPlayerCaps(char playerid, PCAPS playerCaps);\r\n\r\n/*  SNetGetPlayerName @ 113\r\n *\r\n *  Retrieves the name of a player given their player ID.\r\n *\r\n *  playerid:     The player's ID.\r\n *  buffer:       The buffer that will receive the name.\r\n *  buffersize:   The maximum size of buffer.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetGetPlayerName(\r\n      int playerid,\r\n      char *buffer,\r\n      unsigned int buffersize);\r\n\r\n/*  SNetGetProviderCaps @ 114\r\n *\r\n *  Retrieves network provider capacity information.\r\n *\r\n *  providerCaps: A pointer to a CAPS structure that will receive the information.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\n//BOOL\r\n//STORMAPI\r\n//SNetGetProviderCaps(\r\n//      PCAPS providerCaps);\r\n\r\n/*  SNetGetTurnsInTransit @ 115\r\n *\r\n *  Retrieves the number of turns (buffers) that have been queued\r\n *  before sending them over the network.\r\n *\r\n *  turns: A pointer to an integer that will receive the value.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetGetTurnsInTransit(\r\n      int *turns);\r\n\r\n\r\nBOOL STORMAPI SNetInitializeDevice(int a1, int a2, int a3, int a4, int *a5);\r\n\r\n// Network provider structures\r\ntypedef struct _client_info\r\n{\r\n  DWORD dwSize; // 60\r\n  char  *pszName;\r\n  char  *pszVersion;\r\n  DWORD dwProduct;\r\n  DWORD dwVerbyte;\r\n  DWORD dwUnk5;\r\n  DWORD dwMaxPlayers;\r\n  DWORD dwUnk7;\r\n  DWORD dwUnk8;\r\n  DWORD dwUnk9;\r\n  DWORD dwUnk10; // 0xFF\r\n  char  *pszCdKey;\r\n  char  *pszCdOwner;\r\n  DWORD dwIsShareware;\r\n  DWORD dwLangId;\r\n} client_info;\r\n\r\ntypedef struct _user_info\r\n{\r\n  DWORD dwSize; // 16\r\n  char  *pszPlayerName;\r\n  char  *pszUnknown;\r\n  DWORD dwUnknown;\r\n} user_info;\r\n\r\ntypedef struct _battle_info\r\n{\r\n  DWORD dwSize;   // 92\r\n  DWORD dwUnkType;\r\n  HWND  hFrameWnd;\r\n  void  *pfnBattleGetResource;\r\n  void  *pfnBattleGetErrorString;\r\n  void  *pfnBattleMakeCreateGameDialog;\r\n  void  *pfnBattleUpdateIcons;\r\n  DWORD dwUnk_07;\r\n  void  *pfnBattleErrorDialog;\r\n  void  *pfnBattlePlaySound;\r\n  DWORD dwUnk_10;\r\n  void  *pfnBattleGetCursorLink;\r\n  DWORD dwUnk_12;\r\n  void  *pfnUnk_13;\r\n  DWORD dwUnk_14;\r\n  void  *pfnBattleMakeProfileDialog;\r\n  char  *pszProfileStrings;\r\n  void  *pfnBattleDrawProfileInfo;\r\n  void  *pfnUnk_18;\r\n  DWORD dwUnk_19;\r\n  void  *pfnUnk_20;\r\n  void  *pfnUnk_21;\r\n  void  *pfnBattleSetLeagueName;\r\n} battle_info;\r\n\r\ntypedef struct _module_info\r\n{\r\n  DWORD dwSize; // 20\r\n  char  *pszVersionString;\r\n  char  *pszModuleName;\r\n  char  *pszMainArchive;\r\n  char  *pszPatchArchive;\r\n} module_info;\r\n\r\ntypedef struct _game\r\n{\r\n  DWORD     dwIndex;\r\n  DWORD     dwGameState;\r\n  DWORD     dwUnk_08;\r\n  SOCKADDR  saHost;\r\n  DWORD     dwUnk_1C;\r\n  DWORD     dwTimer;\r\n  DWORD     dwUnk_24;\r\n  char      szGameName[128];\r\n  char      szGameStatString[128];\r\n  struct _game     *pNext;\r\n  void      *pExtra;\r\n  DWORD     dwExtraBytes;\r\n  DWORD     dwProduct;\r\n  DWORD     dwVersion;\r\n} game;\r\n\r\ntypedef struct _storm_head\r\n{\r\n  WORD wChecksum;\r\n  WORD wLength;\r\n  WORD wSent;\r\n  WORD wReceived;\r\n  BYTE bCommandClass;\r\n  BYTE bCommandType;\r\n  BYTE bPlayerId;\r\n  BYTE bFlags;\r\n} storm_head;\r\n\r\n\r\n// Traffic flags\r\n#define STRAFFIC_NORMAL 0\r\n#define STRAFFIC_VERIFY 1\r\n#define STRAFFIC_RESEND 2\r\n#define STRAFFIC_REPLY  4\r\n\r\n\r\n/*  SNetInitializeProvider @ 117\r\n *\r\n *  Initializes a provider by storing the provider callbacks, and calling\r\n *  spiInitialize() using the parameters passed to this function.\r\n *  Note: The use of the parameters is determined by the network\r\n *  module.\r\n *\r\n *  providerName:     The provider's identifier. Example: 'TENB' (BNET).\r\n *  gameClientInfo:   A pointer to a clientInfo structure containing\r\n *                    information about the game client.\r\n *  userData:         A pointer to a userInfo structure containing information\r\n *                    about the player.\r\n *  bnCallbacks:      A pointer to a battleInfo structure containing callbacks\r\n *                    and other information that is specific to Battle.net.\r\n *  moduleData:       A pointer to a moduleInfo structure containing the\r\n *                    executable information and paths to MPQ archives.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\n//BOOL\r\n//STORMAPI\r\n//SNetInitializeProvider(\r\n//      DWORD       providerName,\r\n//      client_info  *gameClientInfo,\r\n//      user_info    *userData,\r\n//      battle_info  *bnCallbacks,\r\n//      module_info  *moduleData);\r\n\r\n\r\nBOOL STORMAPI SNetJoinGame(int id, char *gameName, char *gamePassword, char *playerName, char *userStats, int *playerid);\r\n\r\n/*  SNetLeaveGame @ 119\r\n *\r\n *  Notifies Storm that the player has left the game. Storm will\r\n *  notify all connected peers through the network provider.\r\n *\r\n *  type: The leave type. It doesn't appear to be important, no documentation available.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetLeaveGame(\r\n    int type);\r\n\r\nBOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus);\r\nBOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes);\r\nBOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, DWORD *arraydatabytes, DWORD *arrayplayerstatus);\r\n\r\n// Values for arrayplayerstatus\r\n#define SNET_PS_OK             0\r\n#define SNET_PS_WAITING        2\r\n#define SNET_PS_NOTRESPONDING  3\r\n#define SNET_PS_UNKNOWN        default\r\n\r\n\r\n// Event structure\r\ntypedef struct _s_evt\r\n{\r\n  DWORD dwFlags;\r\n  int   dwPlayerId;\r\n  void  *pData;\r\n  DWORD dwSize;\r\n} S_EVT, *PS_EVT;\r\n\r\ntypedef void (STORMAPI *SEVTHANDLER)(struct _SNETEVENT *);\r\n\r\n// @TODO: \"type\" is unknown.\r\n//HANDLE STORMAPI SNetRegisterEventHandler(int type, void (STORMAPI *sEvent)(PS_EVT));\r\n\r\nint  STORMAPI SNetSelectGame(int a1, int a2, int a3, int a4, int a5, int *playerid);\r\n\r\n/*  SNetSendMessage @ 127\r\n *\r\n *  Sends a message to a player given their player ID. Network message\r\n *  is sent using class 01 and is retrieved by the other client using\r\n *  SNetReceiveMessage().\r\n *\r\n *  playerID:   The player index of the player to receive the data.\r\n *              Conversely, this field can be one of the following constants:\r\n *                  SNPLAYER_ALL      | Sends the message to all players, including oneself.\r\n *                  SNPLAYER_OTHERS   | Sends the message to all players, except for oneself.\r\n *  data:       A pointer to the data.\r\n *  databytes:  The amount of bytes that the data pointer contains.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetSendMessage(\r\n      int    playerID,\r\n      void   *data,\r\n      unsigned int databytes);\r\n\r\n\r\n// Macro values to target specific players\r\n#define SNPLAYER_ALL    -1\r\n#define SNPLAYER_OTHERS -2\r\n\r\n\r\n/*  SNetSendTurn @ 128\r\n *\r\n *  Sends a turn (data packet) to all players in the game. Network data\r\n *  is sent using class 02 and is retrieved by the other client using\r\n *  SNetReceiveTurns().\r\n *\r\n *  data:       A pointer to the data.\r\n *  databytes:  The amount of bytes that the data pointer contains.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetSendTurn(\r\n      char    *data,\r\n      unsigned int  databytes);\r\n\r\n/*  SNetSetGameMode @ 130\r\n *\r\n *  Set's the game's mode flags, notifying the network\r\n *  provider that the state of the game has changed.\r\n *  For example: notifies Battle.net when the game is\r\n *  full.\r\n *\r\n *  You should first call SNetGetGameInfo to retrieve\r\n *  the existing mode flags.\r\n *\r\n *  modeFlags:  The new flags for the game mode.\r\n *                  GAMESTATE_PRIVATE     | The game is passworded.\r\n *                  GAMESTATE_FULL        | The game is full.\r\n *                  GAMESTATE_ACTIVE      | The game is available.\r\n *                  GAMESTATE_STARTED     | The game is in progress.\r\n *                  GAMESTATE_REPLAY      | The game is a replay.\r\n *  makePublic: Used to make the game a public game, removing the GAMESTATE_PRIVATE flag.\r\n *\r\n *  Returns TRUE if the function was called successfully and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSNetSetGameMode(\r\n      DWORD modeFlags,\r\n      BOOLEAN makePublic);\r\n\r\n#define SNMakeGamePublic() SNetSetGameMode( (DWORD mode, SNetGetGameInfo(GAMEINFO_MODEFLAGS, &mode, 4), mode), true)\r\n\r\nBOOL STORMAPI SNetEnumGamesEx(int a1, int a2, int (__fastcall *callback)(DWORD, DWORD, DWORD), int *hintnextcall);\r\nBOOL STORMAPI SNetSendServerChatCommand(const char *command);\r\n\r\nBOOL STORMAPI SNetDisconnectAll(DWORD flags);\r\nBOOL STORMAPI SNetCreateLadderGame(const char *pszGameName, const char *pszGamePassword, const char *pszGameStatString, DWORD dwGameType, DWORD dwGameLadderType, DWORD dwGameModeFlags, char *GameTemplateData, int GameTemplateSize, int playerCount, char *creatorName, char *a11, int *playerID);\r\n\r\n#define SNET_GAME_RESULT_WIN        1\r\n#define SNET_GAME_RESULT_LOSS       2\r\n#define SNET_GAME_RESULT_DRAW       3\r\n#define SNET_GAME_RESULT_DISCONNECT 4\r\n\r\nBOOL STORMAPI SNetReportGameResult(unsigned a1, int size, int *results, const char* headerInfo, const char* detailInfo);\r\n\r\nint  STORMAPI SNetSendLeagueCommand(char *cmd, char *callback);\r\nint  STORMAPI SNetSendReplayPath(int a1, int a2, char *replayPath);\r\nint  STORMAPI SNetGetLeagueName(int leagueID);\r\nBOOL STORMAPI SNetGetPlayerNames(char **names);\r\nint  STORMAPI SNetLeagueLogout(char *bnetName);\r\nint  STORMAPI SNetGetLeaguePlayerName(char *curPlayerLeageName, unsigned int nameSize);\r\n\r\nHGDIOBJ STORMAPI SDlgDefDialogProc(HWND hDlg, signed int DlgType, HDC textLabel, HWND hWnd);\r\n\r\nHANDLE STORMAPI SDlgDialogBoxIndirectParam(HMODULE hModule, LPCSTR lpName, HWND hWndParent, LPVOID lpParam, LPARAM lParam);\r\n\r\nBOOL STORMAPI SDlgEndDialog(HWND hDlg, HANDLE nResult);\r\n\r\nBOOL STORMAPI SDlgSetControlBitmaps(HWND parentwindow, int *id, int a3, char *buffer2, char *buffer, int flags, int mask);\r\n\r\n/*\r\n// lpCursorName can only be IDC_ARROW\r\nBOOL STORMAPI SDlgSetSystemCursor(void *lpSrcBuffer, void *p_a2, LPSIZE lpSize, LPCSTR lpCursorName);\r\n*/\r\n\r\nBOOL STORMAPI SDlgBltToWindowI(HWND hWnd, HRGN a2, char *a3, int a4, void *buffer, RECT *rct, SIZE *size, int a8, int a9, DWORD rop);\r\nBOOL STORMAPI SDlgBltToWindowE(HWND hWnd, HRGN a2, char *a3, int a4, void *buffer, RECT *rct, SIZE *size, int a8, int a9, DWORD rop);\r\nBOOL STORMAPI SDlgSetBitmapE(HWND hWnd, int a2, char *src, int mask1, int flags, int a6, int a7, int width, int a9, int mask2);\r\n\r\nint  STORMAPI Ordinal224(int a1);\r\n\r\nBOOL STORMAPI SFileCloseArchive(HANDLE hArchive);\r\nBOOL STORMAPI SFileCloseFile(HANDLE hFile);\r\n\r\nBOOL STORMAPI SFileDdaBeginEx(HANDLE hFile, DWORD flags, DWORD mask, unsigned __int32 lDistanceToMove, signed __int32 volume, signed int pan, int a7);\r\nBOOL STORMAPI SFileDdaDestroy();\r\nBOOL STORMAPI SFileDdaEnd(HANDLE hFile);\r\nBOOL STORMAPI SFileDdaGetPos(HANDLE hFile, DWORD *current, DWORD *end);\r\n\r\nBOOL STORMAPI SFileDdaInitialize(HANDLE directsound);\r\nBOOL STORMAPI SFileDdaSetVolume(HANDLE hFile, signed int bigvolume, signed int volume);\r\nBOOL STORMAPI SFileDestroy();\r\n\r\nBOOL STORMAPI SFileGetFileArchive(HANDLE hFile, HANDLE *archive);\r\nLONG STORMAPI SFileGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);\r\nBOOL STORMAPI SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq);\r\n\r\n// values for dwFlags\r\nenum MPQFlags\r\n{\r\n  MPQ_NO_LISTFILE       = 0x0010,\r\n  MPQ_NO_ATTRIBUTES     = 0x0020,\r\n  MPQ_FORCE_V1          = 0x0040,\r\n  MPQ_CHECK_SECTOR_CRC  = 0x0080\r\n};\r\n\r\n\r\nBOOL STORMAPI SFileOpenFile(const char *filename, HANDLE *phFile);\r\nBOOL STORMAPI SFileOpenFileEx(HANDLE hMpq, const char *szFileName, DWORD dwSearchScope, HANDLE *phFile);\r\n\r\n// values for dwSearchScope\r\nenum SFileFlags\r\n{\r\n  SFILE_FROM_MPQ      = 0x00000000,\r\n  SFILE_FROM_ABSOLUTE = 0x00000001,\r\n  SFILE_FROM_RELATIVE = 0x00000002,\r\n  SFILE_FROM_DISK     = 0x00000004\r\n};\r\n\r\nBOOL STORMAPI SFileReadFile(HANDLE hFile, void *buffer, DWORD nNumberOfBytesToRead, DWORD *read, LONG *lpDistanceToMoveHigh);\r\n\r\nvoid STORMAPI SFileSetLocale(LCID lcLocale);\r\n\r\n// mode:    0 - Silent (callback is NULL)\r\n//          1 - Application Defined\r\n//          2 - Handled by storm (callback is NULL)\r\n// BOOL STORMAPI callback(const char *pszFilename, DWORD dwErrCode, DWORD dwErrCount)\r\nBOOL STORMAPI SFileSetIoErrorMode(DWORD mode, BOOL (STORMAPI *callback)(const char*,DWORD,DWORD) );\r\n\r\nBOOL STORMAPI SFileGetArchiveName(HANDLE hArchive, char *name, int length);\r\nBOOL STORMAPI SFileGetFileName(HANDLE hFile, char *buffer, int length);\r\n\r\nBOOL STORMAPI SFileLoadFile(char *filename, void *buffer, int buffersize, int a4, int a5);\r\nBOOL STORMAPI SFileUnloadFile(HANDLE hFile);\r\nBOOL STORMAPI SFileLoadFileEx(void *hArchive, char *filename, int a3, int a4, int a5, DWORD searchScope, struct _OVERLAPPED *lpOverlapped);\r\n\r\n// Options are DWORD except for #6\r\n// 1: [TRUE|FALSE] - If true, reports resource leaks (SErrReportResourceLeak/SErrReportNamedResourceLeak) to the attached debugger instead of a message box.\r\n// 2: This option is unused.\r\n// 3: [TRUE|FALSE] - If true, reports general memory leaks to the attached debugger instead of a message box.\r\n// 4: This option is unused.\r\n// 5: [TRUE|FALSE] - If true, reports log messages and log dumps to the attached debugger.\r\n// 6: { DWORD blocks_allocated; DWORD blocks_freed; } Used to determine the amount of memory/heap blocks that have been allocated and freed by storm.\r\n//    Can also be used for custom allocations outside of storm.\r\n//\r\n//BOOL STORMAPI StormGetOption(int type, void *pValue, unsigned int *pSize);\r\n//BOOL STORMAPI StormSetOption(int type, void *pValue, unsigned int size);\r\n\r\nBOOL STORMAPI SBltROP3(void *lpDstBuffer, void *lpSrcBuffer, int srcDrawWidth, int srcDrawHeight, int dstWidth, int srcWidth, int a7, DWORD rop);\r\nBOOL STORMAPI SBltROP3Clipped(void *lpDstBuffer, RECT *lpDstRect, POINT *lpDstPt, int a4, void *lpSrcBuffer, RECT *lpSrcRect, POINT *lpSrcPt, int a8, int a9, DWORD rop);\r\nBOOL STORMAPI SBltROP3Tiled(void *lpDstBuffer, RECT *lpDstRect, POINT *lpDstPt, int a4, void *lpSrcBuffer, RECT *lpSrcRect, POINT *lpSrcPt, int a8, int a9, DWORD rop);\r\n\r\n#define SBMP_DEFAULT  0\r\n#define SBMP_BMP      1\r\n#define SBMP_PCX      2\r\n#define SBMP_TGA      3\r\n\r\n\r\n/*  SBmpDecodeImage @ 321\r\n *\r\n *  Decodes an image that has already been loaded into a buffer.\r\n *\r\n *  dwImgType:        Optional, the image type. See SBMP_ macros.\r\n *  pSrcBuffer:       A pointer to the source buffer.\r\n *  dwSrcBuffersize:  The size of the data in the source buffer.\r\n *  pPalette:         An optional buffer that receives the image palette.\r\n *  pDstBuffer:       A buffer that receives the image data.\r\n *  dwDstBuffersize:  The size of the specified image buffer. If the size of the\r\n *                    destination buffer is 0, then the destination buffer is not used.\r\n *  pdwWidth:         An optional variable that receives the image width.\r\n *  pdwHeight:        An optional variable that receives the image height.\r\n *  pdwBpp:           An optional variable that receives the image bits per pixel.\r\n *\r\n *  Returns TRUE if the image was supported and decoded correctly, FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSBmpDecodeImage(\r\n    DWORD        dwImgType,\r\n    void         *pSrcBuffer,\r\n    DWORD        dwSrcBuffersize,\r\n    PALETTEENTRY *pPalette,\r\n    void         *pDstBuffer,\r\n    DWORD        dwDstBuffersize,\r\n    DWORD        *pdwWidth,\r\n    DWORD        *pdwHeight,\r\n    DWORD        *pdwBpp);\r\n\r\n\r\n/*  SBmpLoadImage @ 323\r\n *\r\n *  Load an image from an available archive into a buffer.\r\n *\r\n *  pszFileName:  The name of the graphic in an active archive.\r\n *  pPalette:     An optional buffer that receives the image palette.\r\n *  pBuffer:      A buffer that receives the image data.\r\n *  dwBuffersize: The size of the specified image buffer.\r\n *  pdwWidth:     An optional variable that receives the image width.\r\n *  pdwHeight:    An optional variable that receives the image height.\r\n *  pdwBpp:       An optional variable that receives the image bits per pixel.\r\n *\r\n *  Returns TRUE if the image was supported and loaded correctly, FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSBmpLoadImage(\r\n    const char   *pszFileName,\r\n    PALETTEENTRY *pPalette ,\r\n    BYTE         *pBuffer,\r\n    DWORD        dwBuffersize,\r\n    DWORD        *pdwWidth,\r\n    DWORD        *pdwHeight,\r\n    DWORD        *pdwBpp);\r\n\r\n/*  SBmpSaveImage @ 324\r\n *\r\n *  Save an image from a buffer to a file. The image format is determined\r\n *  from the filename and is either .gif, .pcx, .tga, or .bmp being the default.\r\n *\r\n *  pszFileName:  The name of the file to create.\r\n *  pPalette:     A pointer to a palette array containing 256 entries.\r\n *  pBuffer:      A buffer containing the image data.\r\n *  pdwWidth:     The width of the image.\r\n *  pdwHeight:    The height of the image.\r\n *  pdwBpp:       The bits per pixel.\r\n *\r\n *  Returns TRUE if the image was saved correctly, FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSBmpSaveImage(\r\n    const char    *pszFileName,\r\n    PALETTEENTRY  *pPalette,\r\n    void          *pBuffer,\r\n    DWORD         dwWidth,\r\n    DWORD         dwHeight,\r\n    DWORD         dwBpp);\r\n\r\n\r\nHANDLE STORMAPI SBmpAllocLoadImage(const char *fileName, PALETTEENTRY *palette, void **buffer, int *width, int *height, int unused6, int unused7, void *(STORMAPI *allocFunction)(DWORD));\r\n\r\nBOOL STORMAPI SCodeCompile(char *directives1, char *directives2, char *loopstring, unsigned int maxiterations, unsigned int flags, HANDLE handle);\r\nBOOL STORMAPI SCodeDelete(HANDLE handle);\r\n\r\nint  STORMAPI SCodeExecute(HANDLE handle, int a2);\r\n\r\nBOOL STORMAPI SDrawAutoInitialize(HINSTANCE hInst, LPCSTR lpClassName, LPCSTR lpWindowName, WNDPROC pfnWndProc, int nMode, int nWidth, int nHeight, int nBits);\r\n\r\n\r\n/*  SDrawCaptureScreen @ 342\r\n *\r\n *  Saves a screenshot from the primary surface being handled by Storm.\r\n *\r\n *  pszOutput: The name of the output file. The save format is automatically set by the extension.\r\n *             The extensions supported are .gif, .pcx, .tga, and .bmp. It will write a bitmap by default.\r\n *\r\n *  Returns TRUE if successful and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSDrawCaptureScreen(\r\n    const char *pszOutput);\r\n\r\n\r\n/*  SDrawGetFrameWindow @ 346\r\n *\r\n *  Retrieves the window handle that was specified in\r\n *  SDrawManualInitialize or created in SDrawAutoInitialize.\r\n *\r\n *  sdraw_framewindow: Optional variable that receives the returned handle.\r\n *\r\n *  Returns the handle of the window.\r\n */\r\nHWND\r\nSTORMAPI\r\nSDrawGetFrameWindow(\r\n    HWND *sdraw_framewindow);\r\n\r\n\r\n/*  SDrawGetObjects @ 347\r\n *\r\n *  Retrieves the object information that was initialized using\r\n *  SDrawManualInitialize or SDrawAutoInitialize.\r\n *\r\n *  ddInterface:    The DirectDraw interface.\r\n *  primarySurface: The primary DirectDraw surface.\r\n *  surface2:       A second unknown surface.\r\n *  surface3:       A third unknown surface.\r\n *  backSurface:    The back DirectDraw surface.\r\n *  ddPalette:      The DirectDraw palette.\r\n *  hPalette:       The palette handle.\r\n *\r\n *  Returns FALSE if the direct draw interface has not been initialized.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSDrawGetObjects(\r\n    LPDIRECTDRAW        *ddInterface ,\r\n    LPDIRECTDRAWSURFACE *primarySurface,\r\n    LPDIRECTDRAWSURFACE *surface2,\r\n    LPDIRECTDRAWSURFACE *surface3,\r\n    LPDIRECTDRAWSURFACE *backSurface ,\r\n    LPDIRECTDRAWPALETTE *ddPalette,\r\n    HPALETTE            *hPalette);\r\n\r\n\r\n/*  SDrawGetScreenSize @ 348\r\n *\r\n *  Obtains information for the current screen resolution.\r\n *\r\n *  pdwWidth:   Optional variable that receives the screen width.\r\n *  pdwHeight:  Optional variable that receives the screen height.\r\n *  pdwBpp:     Optional variable that receives the bits per pixel.\r\n *\r\n *  Returns FALSE if no variables were specified.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSDrawGetScreenSize(\r\n    DWORD *pdwWidth,\r\n    DWORD *pdwHeight,\r\n    DWORD *pdwBpp);\r\n\r\n\r\n// undefined\r\nBOOL STORMAPI SDrawLockSurface(int surfacenumber, RECT *lpDestRect, void **lplpSurface, int *lpPitch, int arg_unused);\r\n\r\n\r\n/*  SDrawManualInitialize @ 351\r\n *\r\n *  Sets the DirectDraw variables to be referenced in Storm.\r\n *\r\n *  hWnd:           The handle of the DirectDraw window.\r\n *  ddInterface:    The DirectDraw interface.\r\n *  primarySurface: The first and primary surface.\r\n *  surface2:       A second surface. Behaviour not completely known.\r\n *  surface3:       A third surface. Behaviour not completely known.\r\n *  backSurface:    The fourth and final surface. The back surface.\r\n *  ddPalette:      The DirectDraw palette if the application requires it.\r\n *  hPalette:       The palette handle that belongs to the window.\r\n *                  If this is NULL and ddPalette is specified, then it\r\n *                  will be created automatically. A palette can be created\r\n *                  using the CreatePalette WinAPI function.\r\n *\r\n *  Returns FALSE if no variables were specified.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSDrawManualInitialize(\r\n     HWND hWnd,\r\n     LPDIRECTDRAW ddInterface,\r\n     LPDIRECTDRAWSURFACE primarySurface,\r\n     LPDIRECTDRAWSURFACE surface2,\r\n     LPDIRECTDRAWSURFACE surface3,\r\n     LPDIRECTDRAWSURFACE backSurface,\r\n     LPDIRECTDRAWPALETTE ddPalette,\r\n     HPALETTE hPalette);\r\n\r\n\r\n/*  SDrawPostClose @ 353\r\n *\r\n *  Posts a WM_QUIT message to the active drawing window specified\r\n *  in SDrawManualInitialize or created in SDrawAutoInitialize.\r\n *\r\n *  Returns TRUE if successful and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSDrawPostClose();\r\n\r\n\r\n// undefined\r\n//BOOL STORMAPI SDrawRealizePalette();\r\n\r\nBOOL STORMAPI SDrawUnlockSurface(int surfacenumber, void *lpSurface, int a3, RECT *lpRect);\r\nBOOL STORMAPI SDrawUpdatePalette(unsigned int firstentry, unsigned int numentries, PALETTEENTRY *pPalEntries, int a4);\r\n\r\nBOOL STORMAPI SEvtDispatch(DWORD dwMessageID, DWORD dwFlags, int type, PS_EVT pEvent);\r\n\r\nBOOL STORMAPI SGdiDeleteObject(HANDLE handle);\r\n\r\nBOOL STORMAPI SGdiExtTextOut(int a1, int a2, int a3, int a4, unsigned int a8, signed int a6, signed int a7, const char *pszString, unsigned int arg20);\r\nBOOL STORMAPI SGdiImportFont(HGDIOBJ handle, int windowsfont);\r\n\r\nBOOL STORMAPI SGdiSelectObject(int handle);\r\nBOOL STORMAPI SGdiSetPitch(int pitch);\r\n\r\nBOOL STORMAPI Ordinal393(char *pszString, int, int);\r\n\r\n\r\n/*  SMemAlloc @ 401\r\n *\r\n *  Allocates a block of memory. This block is different\r\n *  from the standard malloc by including a header containing\r\n *  information about the block.\r\n *\r\n *  amount:       The amount of memory to allocate, in bytes.\r\n *  logfilename:  The name of the file or object that this call belongs to.\r\n *  logline:      The line in the file or one of the SLOG_ macros.\r\n *  defaultValue: The default value of a byte in the allocated memory.\r\n *\r\n *  Returns a pointer to the allocated memory. This pointer does NOT include\r\n *  the additional storm header.\r\n */\r\nvoid *\r\n    STORMAPI\r\n    SMemAlloc(\r\n        unsigned int amount,\r\n        const char *logfilename,\r\n        int logline,\r\n        int defaultValue);\r\n\r\n#define SMAlloc(amount) SMemAlloc((amount), __FILE__, __LINE__)\r\n\r\n\r\n/*  SMemFree @ 403\r\n *\r\n *  Frees a block of memory that was created using SMemAlloc,\r\n *  includes the log file and line for debugging purposes.\r\n *\r\n *  location:     The memory location to be freed.\r\n *  logfilename:  The name of the file or object that this call belongs to.\r\n *  logline:      The line in the file or one of the SLOG_ macros.\r\n *  defaultValue:\r\n *\r\n *  Returns TRUE if the call was successful and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSMemFree(\r\n    void *location,\r\n    const char *logfilename,\r\n    int  logline,\r\n    char defaultValue);\r\n\r\n#define SMFree(loc) SMemFree((loc), __FILE__, __LINE__)\r\n\r\n\r\n/*  SMemReAlloc @ 405\r\n *\r\n *  Reallocates a block of memory that was created using SMemAlloc,\r\n *  includes the log file and line for debugging purposes.\r\n *\r\n *  location:     The memory location to be re-allocated. If this parameter\r\n *                is NULL, then SMemAlloc is called with the remaining parameters.\r\n *  amount:       The amount of memory to re-allocate.\r\n *  logfilename:  The name of the file or object that this call belongs to.\r\n *  logline:      The line in the file or one of the SLOG_ macros.\r\n *  defaultValue:\r\n *\r\n *  Returns a pointer to the re-allocated memory. This pointer does NOT include\r\n *  the additional storm header.\r\n */\r\nvoid*\r\nSTORMAPI\r\nSMemReAlloc(\r\n    void    *location,\r\n    unsigned int  amount,\r\n    const char *logfilename,\r\n    int     logline,\r\n    char    defaultValue);\r\n\r\n#define SMReAlloc(loc,s) SMemReAlloc((loc),(s), __FILE__, __LINE__)\r\n\r\n// Can be provided instead of logline/__LINE__ parameter to indicate different errors.\r\n#define SLOG_EXPRESSION    0\r\n#define SLOG_FUNCTION     -1\r\n#define SLOG_OBJECT       -2\r\n#define SLOG_HANDLE       -3\r\n#define SLOG_FILE         -4\r\n#define SLOG_EXCEPTION    -5\r\n\r\n\r\nBOOL STORMAPI SRegLoadData(const char *keyname, const char *valuename, int size, LPBYTE lpData, BYTE flags, LPDWORD lpcbData);\r\nBOOL STORMAPI SRegLoadString(const char *keyname, const char *valuename, BYTE flags, char *buffer, unsigned int buffersize);\r\nBOOL STORMAPI SRegLoadValue(const char *keyname, const char *valuename, BYTE flags, int *value);\r\nBOOL STORMAPI SRegSaveData(const char *keyname, const char *valuename, int size, BYTE *lpData, DWORD cbData);\r\nBOOL STORMAPI SRegSaveString(const char *keyname, const char *valuename, BYTE flags, char *string);\r\nBOOL STORMAPI SRegSaveValue(const char *keyname, const char *valuename, BYTE flags, DWORD result);\r\n\r\nBOOL STORMAPI SRegDeleteValue(const char *keyname, const char *valuename, BYTE flags);\r\n\r\n// Flags for SReg functions\r\n\r\n// Default behaviour checks both HKEY_LOCAL_MACHINE and HKEY_CURRENT_USER\r\n// relative to the \"Software\\\\Blizzard Entertainment\\\\\" key in both hives.\r\n#define SREG_NONE                   0x00000000\r\n#define SREG_EXCLUDE_LOCAL_MACHINE  0x00000001  // excludes checking the HKEY_LOCAL_MACHINE hive\r\n#define SREG_BATTLE_NET             0x00000002  // sets the relative key to \"Software\\\\Battle.net\\\\\" instead\r\n#define SREG_EXCLUDE_CURRENT_USER   0x00000004  // excludes checking the HKEY_CURRENT_USER hive\r\n#define SREG_ABSOLUTE               0x00000010  // specifies that the key is not a relative key\r\n\r\nBOOL STORMAPI STransBlt(void *lpSurface, int x, int y, int width, HANDLE hTrans);\r\nBOOL STORMAPI STransBltUsingMask(void *lpDest, void *lpSource, int pitch, int width, HANDLE hTrans);\r\n\r\nBOOL STORMAPI STransDelete(HANDLE hTrans);\r\n\r\nBOOL STORMAPI STransDuplicate(HANDLE hTransSource, HANDLE hTransDest);\r\nBOOL STORMAPI STransIntersectDirtyArray(HANDLE hTrans, char * dirtyarraymask, unsigned flags, HANDLE * phTransResult);\r\nBOOL STORMAPI STransInvertMask(HANDLE hTrans, HANDLE * phTransResult);\r\n\r\nBOOL STORMAPI STransSetDirtyArrayInfo(int width, int height, int depth, int bits);\r\n\r\nBOOL STORMAPI STransPointInMask(HANDLE hTrans, int x, int y); // Name is a pure guess\r\nBOOL STORMAPI STransCombineMasks(HANDLE hTransA, HANDLE hTransB, int left, int top, int flags, HANDLE * phTransResult);\r\n\r\nBOOL STORMAPI STransCreateE(void *pBuffer, int width, int height, int bpp, int a5, int bufferSize, HANDLE *phTransOut);\r\nBOOL STORMAPI STransCreateI(void *pBuffer, int width, int height, int bpp, int a5, int bufferSize, HANDLE *phTransOut);\r\n\r\nBOOL STORMAPI SVidDestroy();\r\nBOOL STORMAPI SVidGetSize(HANDLE video, int width, int height, int zero);\r\nBOOL STORMAPI SVidInitialize(HANDLE video);\r\nBOOL STORMAPI SVidPlayBegin(const char *filename, int a2, int a3, int a4, int a5, int flags, HANDLE *video);\r\n\r\nBOOL STORMAPI SVidPlayContinueSingle(HANDLE video, int a2, int a3);\r\nBOOL STORMAPI SVidPlayEnd(HANDLE video);\r\n\r\n/* SErrDisplayError @ 461\r\n *\r\n * Displays a formatted error message. The message is detailed and flexible for many applications.\r\n * The message will be different if there is a debugger attached. Will typically terminate the application\r\n * unless the option to continue is given.\r\n *\r\n *  dwErrMessage:   The error code. See SErrGetLastError and GetLastError.\r\n *  logfilename:    The name of the file or object that this call belongs to.\r\n *  logline:        The line in the file or one of the SLOG_ macros.\r\n *  message:        A message or expression with additional information.\r\n *  allowOption:    If TRUE, allows the user the option to continue execution, otherwise the program will terminate.\r\n *  exitCode:       The exit code used for program termination.\r\n *\r\n *  Returns TRUE if the user chose to continue execution, FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSErrDisplayError(\r\n    DWORD dwErrMsg,\r\n    const char *logfilename,\r\n    int logline,\r\n    const char *message,\r\n    BOOL allowOption,\r\n    int exitCode);\r\n\r\n#define SAssert(x) { if ( !(x) ) SErrDisplayError(STORM_ERROR_ASSERTION, __FILE__, __LINE__, #x) }\r\n\r\n#define SEDisplayError(err) SErrDisplayError(e, __FILE__, __LINE__)\r\n\r\n/*  SErrGetErrorStr @ 462\r\n *\r\n *  Retrieves a string that describes the specified error code for\r\n *  the system, Storm, DirectDraw, or DirectSound.\r\n *\r\n *  dwErrCode:    The error code to look up.\r\n *  buffer:       The destination buffer to receive the string.\r\n *  bufferchars:  The size of the destination buffer.\r\n *\r\n *  Returns TRUE if the call was successful and FALSE otherwise.\r\n */\r\nBOOL\r\nSTORMAPI\r\nSErrGetErrorStr(\r\n    DWORD dwErrCode,\r\n    char *buffer,\r\n    unsigned int bufferchars);\r\n\r\n#define SEGetErrorStr(e,b) SErrGetErrorStr(e,b,sizeof(b))\r\n\r\n\r\n/*  SErrGetLastError @ 463\r\n *\r\n *  Retrieves the last error that was specifically\r\n *  set for the Storm library.\r\n *\r\n *  Returns the last error set within the Storm library.\r\n */\r\nDWORD\r\nSTORMAPI\r\nSErrGetLastError();\r\n\r\n\r\n// Registers a module as a message source for SErrGetErrorStr, always returns TRUE\r\n// groupID is a group in a MessageTable entry for example in STORM_ERROR_BAD_ARGUMENT 0x85100065, 0x510 is the group.\r\n// BOOL STORMAPI SErrRegisterMessageSource(WORD groupID, HMODULE hSourceModule, int a3)\r\n\r\n\r\n/*  SErrSetLastError @ 465\r\n *\r\n *  Sets the last error for the Storm library and the Kernel32 library.\r\n *\r\n *  dwErrCode:  The error code that will be set.\r\n */\r\nvoid\r\nSTORMAPI\r\nSErrSetLastError(\r\n    DWORD dwErrCode);\r\n\r\n//\r\n// void STORMAPI SErrReportNamedResourceLeak(const char *pszMsg, const char *pszSubMsg = nullptr)\r\n// void STORMAPI SErrReportResourceLeak(const char *pszMsg)\r\n\r\nvoid STORMAPI SErrSuppressErrors(BOOL suppressErrors);\r\n\r\n// Values for dwErrCode\r\n#define STORM_ERROR_ASSERTION                    0x85100000\r\n#define STORM_ERROR_BAD_ARGUMENT                 0x85100065\r\n#define STORM_ERROR_GAME_ALREADY_STARTED         0x85100066\r\n#define STORM_ERROR_GAME_FULL                    0x85100067\r\n#define STORM_ERROR_GAME_NOT_FOUND               0x85100068\r\n#define STORM_ERROR_GAME_TERMINATED              0x85100069\r\n#define STORM_ERROR_INVALID_PLAYER               0x8510006a\r\n#define STORM_ERROR_NO_MESSAGES_WAITING          0x8510006b\r\n#define STORM_ERROR_NOT_ARCHIVE                  0x8510006c\r\n#define STORM_ERROR_NOT_ENOUGH_ARGUMENTS         0x8510006d\r\n#define STORM_ERROR_NOT_IMPLEMENTED              0x8510006e\r\n#define STORM_ERROR_NOT_IN_ARCHIVE               0x8510006f\r\n#define STORM_ERROR_NOT_IN_GAME                  0x85100070\r\n#define STORM_ERROR_NOT_INITIALIZED              0x85100071\r\n#define STORM_ERROR_NOT_PLAYING                  0x85100072\r\n#define STORM_ERROR_NOT_REGISTERED               0x85100073\r\n#define STORM_ERROR_REQUIRES_CODEC1              0x85100074\r\n#define STORM_ERROR_REQUIRES_CODEC2              0x85100075\r\n#define STORM_ERROR_REQUIRES_CODEC3              0x85100076\r\n#define STORM_ERROR_REQUIRES_UPGRADE             0x85100077\r\n#define STORM_ERROR_STILL_ACTIVE                 0x85100078\r\n#define STORM_ERROR_VERSION_MISMATCH             0x85100079\r\n#define STORM_ERROR_MEM_NOT_ALLOCATED            0x8510007a\r\n#define STORM_ERROR_MEM_CORRUPTED                0x8510007b\r\n#define STORM_ERROR_MEM_INVALID                  0x8510007c\r\n#define STORM_ERROR_MEM_MANAGER_NOT_INITIALIZED  0x8510007d\r\n#define STORM_ERROR_MEM_NOT_FREED                0x8510007e\r\n#define STORM_ERROR_RESOURCES_NOT_RELEASED       0x8510007f\r\n#define STORM_ERROR_OUT_OF_BOUNDS                0x85100080\r\n#define STORM_ERROR_NULL_POINTER                 0x85100081\r\n#define STORM_ERROR_CDKEY_MISMATCH               0x85100082\r\n#define STORM_ERROR_FILE_CORRUPTED               0x85100083\r\n#define STORM_ERROR_FATAL                        0x85100084\r\n#define STORM_ERROR_GAMETYPE_UNAVAILABLE         0x85100085\r\n\r\n\r\n/*  SMemCopy @ 491\r\n *\r\n *  Copies a block of memory from source to destination.\r\n *  This function immediately calls memcpy. See online documentation\r\n *  of memcpy for more details.\r\n *\r\n *  dest:   The destination buffer.\r\n *  source: The source buffer.\r\n *  size:   The number of bytes to copy.\r\n */\r\nvoid\r\nSTORMAPI\r\nSMemCopy(\r\n    void *dest,\r\n    const void *source,\r\n    unsigned int size);\r\n\r\n#define SMCopy(d,s) ( SMemCopy(d, s, __STORM_SSIZEMIN(s,d)) )\r\n\r\n/*  SMemFill @ 492\r\n *\r\n *  Fills a block of memory with the specified character.\r\n *  This function immediately calls memset. See online documentation\r\n *  of memset for more details.\r\n *\r\n *  dest:   The destination buffer.\r\n *  source: The size of the destination buffer.\r\n *  size:   The format to use.\r\n */\r\nvoid\r\nSTORMAPI\r\nSMemFill(\r\n    void *location,\r\n    unsigned int length,\r\n    char fillWith);\r\n\r\n#define SMFill(l,f) (SMemFill(l, sizeof(l), f))\r\n\r\n/*  SMemZero @ 494\r\n *\r\n *  Fills a block of memory with the integer 0x00 (Zero).\r\n *\r\n *  location: The location to write at.\r\n *  length:   The amount of bytes to write.\r\n */\r\nvoid\r\nSTORMAPI\r\nSMemZero(\r\n    void *location,\r\n    unsigned int length);\r\n\r\n#define SMZero(l) (SMemZero(l, sizeof(l)))\r\n\r\n\r\nint   STORMAPI SMemCmp(void *location1, void *location2, DWORD size);\r\n\r\n#define SMCmp(l,x) ( SMemCmp(l, x, __STORM_SSIZEMIN(x,l)) )\r\n\r\n/*  SStrCopy @ 501\r\n *\r\n *  Copies a string from src to dest (including NULL terminator)\r\n *  until the max_length is reached.\r\n *\r\n *  dest:         The destination array.\r\n *  src:          The source array.\r\n *  max_length:   The maximum length of dest.\r\n *\r\n *  Returns the number of characters copied.\r\n */\r\nint\r\nSTORMAPI\r\nSStrCopy(\r\n    char *dest,\r\n    const char *src,\r\n    int max_length);\r\n\r\n#define SSCopy(d,s) (SStrCopy(d, s, sizeof(d)))\r\n\r\n#define STORM_HASH_ABSOLUTE 1\r\n\r\n/*  SStrHash @ 502\r\n *\r\n *  Creates a simple hash for the string. This function\r\n *  should NOT be used for sensitive information.\r\n *\r\n *  string:   The input string.\r\n *  flags:    If STORM_HASH_ABSOLUTE is set then this\r\n              function uses the absolute string, otherwise\r\n              it will convert backslashes to forward\r\n              slashes and some other processing.\r\n *  seed:     The hash seed. If this value is 0 then the\r\n *            default value 0x7FED7FED will be used.\r\n *\r\n *  Returns the 32-bit hash of the string.\r\n */\r\nDWORD\r\nSTORMAPI\r\nSStrHash(\r\n      const char *string,\r\n      DWORD flags,\r\n      DWORD Seed);\r\n\r\nint   STORMAPI SStrPack(char *dest, const char *src, DWORD max_length);\r\n\r\n/*  SStrLen @ 506\r\n *\r\n *  Retrieves the length of a string.\r\n *\r\n *  string:   The input string of which to obtain a\r\n *            length for.\r\n *\r\n *  Returns the length of the string.\r\n */\r\nint\r\nSTORMAPI\r\nSStrLen(\r\n      const char *string);\r\n\r\n/*  SStrCmp @ 508\r\n *\r\n *  Compares two strings case sensitive.\r\n *\r\n *  string1:  The first string.\r\n *  string2:  The second string.\r\n *  size:     The maximum amount of characters to compare.\r\n *\r\n *  Returns 0 if strings are equal. See strcmp documentation for more details.\r\n */\r\nint\r\nSTORMAPI\r\nSStrCmp(\r\n      const char *string1,\r\n      const char *string2,\r\n      unsigned int size);\r\n\r\n#define SSCmp(s,x) ( SStrCmp(s,x,__STORM_SSIZEMIN(s,x)) )\r\n\r\n/*  SStrCmpI @ 509\r\n *\r\n *  Compares two strings case insensitive.\r\n *\r\n *  string1:  The first string.\r\n *  string2:  The second string.\r\n *  size:     The maximum amount of characters to compare.\r\n *\r\n *  Returns 0 if strings are equal. See strcmpi documentation for more details.\r\n */\r\nint\r\nSTORMAPI\r\nSStrCmpI(\r\n      const char *string1,\r\n      const char *string2,\r\n      unsigned int size);\r\n\r\n#define SSCmpI(s,x) ( SStrCmpI(s,x,__STORM_SSIZEMIN(s,x)) )\r\n\r\n/*  SStrUpper @ 510\r\n *\r\n *  Converts all lower-case alpha characters of a string to upper-case.\r\n *\r\n *  string:   The string to convert.\r\n *\r\n *  Returns the same pointer given in the input.\r\n */\r\nchar*\r\nSTORMAPI\r\nSStrUpper(\r\n      char* string);\r\n\r\nvoid  STORMAPI SRgn523(HANDLE hRgn, RECT *pRect, int a3, int a4);\r\nvoid  STORMAPI SRgnCreateRegion(HANDLE *hRgn, int a2);\r\nvoid  STORMAPI SRgnDeleteRegion(HANDLE hRgn);\r\n\r\nvoid  STORMAPI SRgn529i(int handle, int a2, int a3);\r\n\r\n\r\n/* SErrDisplayErrorFmt @ 562\r\n *\r\n * Displays a formatted error message. The message is detailed and flexible for many applications.\r\n * The message will be different if there is a debugger attached. Will typically terminate the application\r\n * unless the option to continue is given.\r\n *\r\n *  dwErrMessage:   The error code. See SErrGetLastError and GetLastError.\r\n *  logfilename:    The name of the file or object that this call belongs to.\r\n *  logline:        The line in the file or one of the SLOG_ macros.\r\n *  allowOption:    If TRUE, allows the user the option to continue execution, otherwise the program will terminate.\r\n *  exitCode:       The exit code used for program termination.\r\n *  format:         Additional message formatting. See printf.\r\n *\r\n *  Returns TRUE if the user chose to continue execution, FALSE otherwise.\r\n */\r\nBOOL __cdecl\r\nSErrDisplayErrorFmt(\r\n    DWORD dwErrMsg,\r\n    const char *logfilename,\r\n    int logline,\r\n    BOOL allowOption,\r\n    int exitCode,\r\n    const char *format,\r\n    ...);\r\n\r\n//#define SEDisplayErrorFmt(err,...) SErrDisplayErrorFmt(err, __FILE__, __LINE__, FALSE, 1, __VA_ARGS__)\r\n\r\n/*  SErrCatchUnhandledExceptions @ 567\r\n *\r\n *  Registers a top-level exception filter managed entirely by Storm.\r\n *  The registered filter will display formatted exception information by calling SErrDisplayError.\r\n */\r\nvoid\r\nSTORMAPI\r\nSErrCatchUnhandledExceptions();\r\n\r\n\r\n/*  SStrChr @ 571\r\n *\r\n *  Searches a string for the given character. See\r\n *  strchr documentation for more details.\r\n *\r\n *  string:   The string to search.\r\n *  c:        The character to search for.\r\n *\r\n *  Returns a pointer to the first occurance of the character.\r\n */\r\nchar*\r\nSTORMAPI\r\nSStrChr(\r\n    const char *string,\r\n    char c);\r\n\r\n\r\nchar *STORMAPI SStrChrR(const char *string, char c);\r\n\r\n\r\n/*  SStrVPrintf @ 578\r\n *\r\n *  Prints a formatted string to a destination buffer.\r\n *  This function calls vsnprintf with some extra error handling.\r\n *  See online documentation of vsnprintf for more details.\r\n *\r\n *  dest:   The destination buffer.\r\n *  size:   The size of the destination buffer.\r\n *  format: The format to use.\r\n *\r\n *  Returns the number of characters written.\r\n */\r\nunsigned int __cdecl\r\nSStrVPrintf(\r\n    char *dest,\r\n    unsigned int size,\r\n    const char *format, ...);\r\n\r\n\r\nint STORMAPI SBigDel(void *buffer);\r\n\r\nint STORMAPI SBigFromBinary(void *buffer, const void *str, unsigned int size);\r\n\r\nint STORMAPI SBigNew(void **buffer);\r\n\r\nint STORMAPI SBigPowMod(void *buffer1, void *buffer2, int a3, int a4);\r\n\r\nint STORMAPI SBigToBinaryBuffer(void *buffer, int length, int a3, int a4);\r\n\r\nvoid __stdcall SDrawMessageBox(const char *,const char *,int);\r\nvoid __cdecl SDrawDestroy(void);\r\nBOOLEAN __cdecl StormDestroy(void);\r\nBOOL __stdcall SFileSetBasePath(const char *);\r\nvoid __cdecl SDrawRealizePalette(void);\r\nBOOL __cdecl SVidPlayContinue(void);\r\nBOOL __stdcall SNetGetOwnerTurnsWaiting(DWORD *);\r\nBOOL __stdcall SNetUnregisterEventHandler(int,SEVTHANDLER);\r\nBOOL __stdcall SNetRegisterEventHandler(int,SEVTHANDLER);\r\nBOOLEAN __stdcall SNetSetBasePlayer(int);\r\nint __stdcall SNetInitializeProvider(unsigned long,struct _SNETPROGRAMDATA *,struct _SNETPLAYERDATA *,struct _SNETUIDATA *,struct _SNETVERSIONDATA *);\r\nint __stdcall SNetGetProviderCaps(struct _SNETCAPS *);\r\nint __stdcall SFileSetFilePointer(HANDLE,int,HANDLE,int);\r\nvoid __stdcall SDrawClearSurface(int a1);\r\nBOOL __stdcall SDlgSetBitmapI(HWND hWnd, int a2, char *src, int mask1, int flags, void *pBuff, int a7, int width, int height, int mask2);\r\nvoid __stdcall SDlgBeginPaint(HWND hWnd, char *a2);\r\nvoid __stdcall SDlgEndPaint(HWND hWnd, char *a2);\r\nvoid __stdcall SDlgSetSystemCursor(BYTE *a1, BYTE *a2, int *a3, int a4);\r\nvoid __stdcall SDlgSetCursor(HWND hWnd, HCURSOR a2, int a3, int *a4);\r\nBOOL __stdcall SDlgSetTimer(int a1, int a2, int a3, void (__stdcall *a4)(int, int, int, int));\r\nBOOL __stdcall SDlgKillTimer(int a1, int a2);\r\nBOOL __stdcall SDlgDrawBitmap(HWND hWnd, int a2, int a3, int a4, int a5, int a6, int a7);\r\nBOOL __stdcall SDlgDialogBoxParam(HINSTANCE hInst, char *szDialog, int hWnd, WNDPROC func, int selhero_is_good);\r\nBOOL __stdcall SGdiTextOut(void *pBuffer, int x, int y, int mask, char *str, int len);\r\nBOOL __stdcall SFileEnableDirectAccess(BOOL enable);\r\n\r\n#if defined(__GNUC__) || defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "3rdParty/Storm/Source/storm_gcc.def",
    "content": "LIBRARY      \"Storm\"\n\nEXPORTS\n  SNetCreateGame                @101 NONAME\n  SNetCreateGame@40             @101 NONAME\n  SNetDestroy                   @102 NONAME\n  SNetDestroy@0                 @102 NONAME\n  ;SNetEnumDevices               @103 NONAME\n  ;SNetEnumGames                 @104 NONAME\n  ;SNetEnumProviders             @105 NONAME\n  SNetDropPlayer                @106 NONAME\n  SNetDropPlayer@8              @106 NONAME\n  SNetGetGameInfo               @107 NONAME\n  SNetGetGameInfo@16            @107 NONAME\n  ;SNetGetNetworkLatency         @108 NONAME\n  SNetGetNumPlayers             @109 NONAME\n  SNetGetOwnerTurnsWaiting      @110 NONAME\n  SNetGetOwnerTurnsWaiting@4    @110 NONAME\n  ;SNetGetPerformanceData        @111 NONAME\n  SNetGetPlayerCaps             @112 NONAME\n  SNetGetPlayerName             @113 NONAME\n  SNetGetProviderCaps           @114 NONAME\n  SNetGetProviderCaps@4         @114 NONAME\n  SNetGetTurnsInTransit         @115 NONAME\n  SNetGetTurnsInTransit@4       @115 NONAME\n  SNetInitializeDevice          @116 NONAME\n  SNetInitializeProvider        @117 NONAME\n  SNetInitializeProvider@20     @117 NONAME\n  SNetJoinGame                  @118 NONAME\n  SNetLeaveGame                 @119 NONAME\n  SNetLeaveGame@4               @119 NONAME\n  SNetPerformUpgrade            @120 NONAME\n  SNetPerformUpgrade@4          @120 NONAME\n  SNetReceiveMessage            @121 NONAME\n  SNetReceiveMessage@12         @121 NONAME\n  SNetReceiveTurns              @122 NONAME\n  SNetReceiveTurns@20           @122 NONAME\n  SNetRegisterEventHandler      @123 NONAME\n  SNetRegisterEventHandler@8    @123 NONAME\n  ;SNetResetLatencyMeasurements  @124 NONAME\n  SNetSelectGame                @125 NONAME\n  ;SNetSelectProvider            @126 NONAME\n  SNetSendMessage               @127 NONAME\n  SNetSendMessage@12            @127 NONAME\n  SNetSendTurn                  @128 NONAME\n  SNetSendTurn@8                @128 NONAME\n  SNetSetBasePlayer             @129 NONAME\n  SNetSetBasePlayer@4           @129 NONAME\n  SNetSetGameMode               @130 NONAME\n  SNetUnregisterEventHandler    @131 NONAME\n  SNetUnregisterEventHandler@8  @131 NONAME\n\n  SNetEnumGamesEx               @133 NONAME\n  SNetSendServerChatCommand     @134 NONAME\n  SNetSendServerChatCommand@4   @134 NONAME\n  ;SNetSendDatagram             @135 NONAME\n  ;SNetReceiveDatagram          @136 NONAME\n  SNetDisconnectAll             @137 NONAME\n  SNetCreateLadderGame          @138 NONAME\n  SNetReportGameResult          @139 NONAME\n  ;SNetCheckDataFile             @140 NONAME\n  SNetSendLeagueCommand         @141 NONAME\n  SNetSendReplayPath            @142 NONAME\n  SNetGetLeagueName             @143 NONAME\n  SNetGetPlayerNames            @144 NONAME\n  SNetLeagueLogout              @145 NONAME\n  SNetGetLeaguePlayerName       @146 NONAME\n\n  ;Ordinal150                    @150 NONAME\n  ;Ordinal151                    @151 NONAME\n\n  SDlgBeginPaint                 @201 NONAME\n  SDlgBeginPaint@8               @201 NONAME\n  SDlgBltToWindowI              @202 NONAME\n  SDlgBltToWindowI@40           @202 NONAME\n  ;SDlgCheckTimers               @203 NONAME\n  ;SDlgCreateDialogIndirectParam @204 NONAME\n  ;SDlgCreateDialogParam         @205 NONAME\n  SDlgDefDialogProc             @206 NONAME\n  SDlgDefDialogProc@16          @206 NONAME\n\n  SDlgDialogBoxIndirectParam    @208 NONAME\n  SDlgDialogBoxParam            @209 NONAME\n  SDlgDialogBoxParam@20         @209 NONAME\n  SDlgDrawBitmap                @210 NONAME\n  SDlgDrawBitmap@28             @210 NONAME\n  SDlgEndDialog                 @211 NONAME\n  SDlgEndDialog@8               @211 NONAME\n  SDlgEndPaint                  @212 NONAME\n  SDlgEndPaint@8                @212 NONAME\n  SDlgKillTimer                 @213 NONAME\n  SDlgKillTimer@8               @213 NONAME\n  ;SDlgSetBaseFont               @214 NONAME\n  SDlgSetBitmapI                @215 NONAME\n  SDlgSetBitmapI@40             @215 NONAME\n  SDlgSetControlBitmaps         @216 NONAME\n  SDlgSetControlBitmaps@28      @216 NONAME\n  SDlgSetCursor                 @217 NONAME\n  SDlgSetCursor@16              @217 NONAME\n  SDlgSetSystemCursor           @218 NONAME\n  SDlgSetSystemCursor@16        @218 NONAME\n  SDlgSetTimer                  @219 NONAME\n  SDlgSetTimer@16               @219 NONAME\n  ;SDlgUpdateCursor              @220 NONAME\n  SDlgBltToWindowE              @221 NONAME\n  SDlgSetBitmapE                @222 NONAME\n  ;SDlgSetLocale                 @223 NONAME\n  Ordinal224                    @224 NONAME\n\n  ;SFileAuthenticateArchive      @251 NONAME\n  SFileCloseArchive             @252 NONAME\n  SFileCloseArchive@4           @252 NONAME\n  SFileCloseFile                @253 NONAME\n  SFileCloseFile@4              @253 NONAME\n  ;SFileDdaBegin                 @254 NONAME\n  SFileDdaBeginEx               @255 NONAME\n  SFileDdaBeginEx@28            @255 NONAME\n  SFileDdaDestroy               @256 NONAME\n  SFileDdaDestroy@0             @256 NONAME\n  SFileDdaEnd                   @257 NONAME\n  SFileDdaEnd@4                 @257 NONAME\n  SFileDdaGetPos                @258 NONAME\n  SFileDdaGetPos@12             @258 NONAME\n  ;SFileDdaGetVolume             @259 NONAME\n  SFileDdaInitialize            @260 NONAME\n  SFileDdaInitialize@4          @260 NONAME\n  SFileDdaSetVolume             @261 NONAME\n  SFileDdaSetVolume@12          @261 NONAME\n  SFileDestroy                  @262 NONAME\n  SFileEnableDirectAccess       @263 NONAME\n  SFileEnableDirectAccess@4     @263 NONAME\n  SFileGetFileArchive           @264 NONAME\n  SFileGetFileArchive@8         @264 NONAME\n  SFileGetFileSize              @265 NONAME\n  SFileGetFileSize@8            @265 NONAME\n  SFileOpenArchive              @266 NONAME\n  SFileOpenArchive@16           @266 NONAME\n  SFileOpenFile                 @267 NONAME\n  SFileOpenFile@8               @267 NONAME\n  SFileOpenFileEx               @268 NONAME\n  SFileOpenFileEx@16            @268 NONAME\n  SFileReadFile                 @269 NONAME\n  SFileReadFile@20              @269 NONAME\n  SFileSetBasePath              @270 NONAME\n  SFileSetBasePath@4            @270 NONAME\n  SFileSetFilePointer           @271 NONAME\n  SFileSetFilePointer@16        @271 NONAME\n  SFileSetLocale                @272 NONAME\n  ;SFileGetBasePath              @273 NONAME\n  SFileSetIoErrorMode           @274 NONAME\n  SFileGetArchiveName           @275 NONAME\n  SFileGetFileName              @276 NONAME\n  ;SFileGetArchiveInfo           @277 NONAME\n  ;SFileSetPlatform              @278 NONAME\n  SFileLoadFile                 @279 NONAME\n  SFileUnloadFile               @280 NONAME\n  SFileLoadFileEx               @281 NONAME\n  ;SFilePrioritizeRequest        @282 NONAME\n  ;SFileCancelRequest            @283 NONAME\n  ;SFileSetAsyncBudget           @284 NONAME\n  ;SFileSetDataChunkSize         @285 NONAME\n  ;SFileEnableSeekOptimization   @286 NONAME\n  ;SFileReadFileEx               @287 NONAME\n  ;SFileFileExists               @288 NONAME\n  ;SFileFileExistsEx             @289 NONAME\n  ;SFileReadFileEx2              @290 NONAME\n  ;SFileReadFile2                @291 NONAME\n  ;SFileLoadFile2                @292 NONAME\n  ;SFileOpenFileAsArchive        @293 NONAME\n  ;SFileGetLocale                @294 NONAME\n  ;SFileRegisterLoadNotifyProc   @295 NONAME\n  ;SFileGetFileCompressedSize    @296 NONAME\n  ;Ordinal297                    @297 NONAME\n  ;Ordinal298                    @298 NONAME\n  ;SFileAuthenticateArchiveEx    @299 NONAME\n  ;SFileOpenPathAsArchive        @300 NONAME\n  StormDestroy                  @301 NONAME\n  ;StormGetInstance              @302 NONAME\n  ;StormGetOption                @303 NONAME\n  ;StormSetOption                @304 NONAME\n\n  ;SBltGetSCode                  @312 NONAME\n  SBltROP3                      @313 NONAME\n  SBltROP3@32                   @313 NONAME\n  SBltROP3Clipped               @314 NONAME\n  SBltROP3Tiled                 @315 NONAME\n  SBltROP3Tiled@40              @315 NONAME\n\n  SBmpDecodeImage               @321 NONAME\n\n  SBmpLoadImage                 @323 NONAME\n  SBmpLoadImage@28              @323 NONAME\n  SBmpSaveImage                 @324 NONAME\n  SBmpAllocLoadImage            @325 NONAME\n  ;SBmpSaveImageEx               @326 NONAME\n\n  SCodeCompile                  @331 NONAME\n  SCodeDelete                   @332 NONAME\n\n  SCodeExecute                  @334 NONAME\n  ;SCodeGetPseudocode            @335 NONAME\n\n  SDrawAutoInitialize           @341 NONAME\n  SDrawCaptureScreen            @342 NONAME\n  SDrawClearSurface             @343 NONAME\n  SDrawClearSurface@4           @343 NONAME\n  SDrawDestroy                  @344 NONAME\n  ;SDrawFlipPage                 @345 NONAME\n  SDrawGetFrameWindow           @346 NONAME\n  SDrawGetFrameWindow@4         @346 NONAME\n  SDrawGetObjects               @347 NONAME\n  SDrawGetScreenSize            @348 NONAME\n  ;SDrawGetServiceLevel          @349 NONAME\n  SDrawLockSurface              @350 NONAME\n  SDrawManualInitialize         @351 NONAME\n  SDrawManualInitialize@32      @351 NONAME\n  SDrawMessageBox               @352 NONAME\n  SDrawMessageBox@12            @352 NONAME\n  SDrawPostClose                @353 NONAME\n  SDrawRealizePalette           @354 NONAME\n  ;SDrawSelectGdiSurface         @355 NONAME\n  SDrawUnlockSurface            @356 NONAME\n  SDrawUpdatePalette            @357 NONAME\n  SDrawUpdatePalette@16         @357 NONAME\n  ;SDrawUpdateScreen             @358 NONAME\n  ;SDrawWaitForVerticalBlank     @359 NONAME\n\n  SEvtDispatch                  @372 NONAME\n  ;SEvtRegisterHandler           @373 NONAME\n  ;SEvtUnregisterHandler         @374 NONAME\n  ;SEvtUnregisterType            @375 NONAME\n  ;SEvtPopState                  @376 NONAME\n  ;SEvtPushState                 @377 NONAME\n  ;SEvtBreakHandlerChain         @378 NONAME\n\n  ;SGdiBitBlt                    @381 NONAME\n  ;SGdiCreateFont                @382 NONAME\n  SGdiDeleteObject              @383 NONAME\n  SGdiDeleteObject@4            @383 NONAME\n  ;SGdiDestroy                   @384 NONAME\n  SGdiExtTextOut                @385 NONAME\n  SGdiImportFont                @386 NONAME\n  SGdiImportFont@8              @386 NONAME\n  ;SGdiLoadFont                  @387 NONAME\n  ;SGdiRectangle                 @388 NONAME\n  SGdiSelectObject              @389 NONAME\n  SGdiSelectObject@4            @389 NONAME\n  SGdiSetPitch                  @390 NONAME\n  SGdiSetPitch@4                @390 NONAME\n  SGdiTextOut                   @391 NONAME\n  SGdiTextOut@24                @391 NONAME\n  ;SGdi392                       @392 NONAME\n  Ordinal393                    @393 NONAME\n\n  ;SMem399                       @399 NONAME\n\n  SMemAlloc                     @401 NONAME\n  SMemAlloc@16                  @401 NONAME\n  ;SMemDestroy                   @402 NONAME\n  SMemFree                      @403 NONAME\n  SMemFree@16                   @403 NONAME\n  ;SMemGetSize                   @404 NONAME\n  SMemReAlloc                   @405 NONAME\n  ;Storm406                      @406 NONAME\n\n  ;SMsgDispatchMessage           @412 NONAME\n  ;SMsgDoMessageLoop             @413 NONAME\n  ;SMsgRegisterCommand           @414 NONAME\n  ;SMsgRegisterKeyDown           @415 NONAME\n  ;SMsgRegisterKeyUp             @416 NONAME\n  ;SMsgRegisterMessage           @417 NONAME\n  ;SMsgPopRegisterState          @418 NONAME\n  ;SMsgPushRegisterState         @419 NONAME\n  ;SMsg420                       @420 NONAME\n  SRegLoadData                  @421 NONAME\n  SRegLoadData@24               @421 NONAME\n  SRegLoadString                @422 NONAME\n  SRegLoadString@20             @422 NONAME\n  SRegLoadValue                 @423 NONAME\n  SRegLoadValue@16              @423 NONAME\n  SRegSaveData                  @424 NONAME\n  SRegSaveData@20               @424 NONAME\n  SRegSaveString                @425 NONAME\n  SRegSaveString@16             @425 NONAME\n  SRegSaveValue                 @426 NONAME\n  SRegSaveValue@16              @426 NONAME\n  ;SRegGetBaseKey                @427 NONAME\n  SRegDeleteValue               @428 NONAME\n  ;SReg429                       @429 NONAME\n  ;SReg430                       @430 NONAME\n  STransBlt                     @431 NONAME\n  STransBlt@20                  @431 NONAME\n  STransBltUsingMask            @432 NONAME\n  STransCreateI                 @433 NONAME\n  STransCreateI@28              @433 NONAME\n  STransDelete                  @434 NONAME\n  STransDelete@4                @434 NONAME\n\n  STransDuplicate               @436 NONAME\n  STransIntersectDirtyArray     @437 NONAME\n  STransInvertMask              @438 NONAME\n  ;STransLoadI                   @439 NONAME\n  STransSetDirtyArrayInfo       @440 NONAME\n  ;STransUpdateDirtyArray        @441 NONAME\n  STransPointInMask             @442 NONAME\n  STransCombineMasks            @443 NONAME\n  ;STransCreateI                 @444 NONAME\n  STransCreateE                 @445 NONAME\n  ;STrans446                     @446 NONAME\n  ;STransLoadE                   @447 NONAME\n\n  SVidDestroy                   @451 NONAME\n  SVidDestroy@0                 @451 NONAME\n  SVidGetSize                   @452 NONAME\n  SVidInitialize                @453 NONAME\n  SVidInitialize@4              @453 NONAME\n  SVidPlayBegin                 @454 NONAME\n  SVidPlayBegin@28              @454 NONAME\n  ;SVidPlayBeginFromMemory       @455 NONAME\n  SVidPlayContinue              @456 NONAME\n  SVidPlayContinueSingle        @457 NONAME\n  SVidPlayEnd                   @458 NONAME\n  SVidPlayEnd@4                 @458 NONAME\n  ;SVidSetVolume                 @459 NONAME\n  ;Storm460                      @460 NONAME\n  SErrDisplayError              @461 NONAME\n  SErrGetErrorStr               @462 NONAME\n  SErrGetErrorStr@12            @462 NONAME\n  SErrGetLastError              @463 NONAME\n  SErrGetLastError@0            @463 NONAME\n  ;SErrRegisterMessageSource     @464 NONAME\n  SErrSetLastError              @465 NONAME\n  SErrSetLastError@4            @465 NONAME\n  ;SErrReportNamedResourceLeak   @466 NONAME\n  ;SErrReportResourceLeak        @467 NONAME\n  SErrSuppressErrors            @468 NONAME\n  ;SErrRegisterHandler           @469 NONAME\n  ;SErrUnregisterHandler         @470 NONAME\n  ;Storm471                      @471 NONAME\n  ;SCmdGetBool                   @472 NONAME\n  ;SCmdGetNum                    @473 NONAME\n  ;SCmdGetString                 @474 NONAME\n  ;SCmdProcess                   @475 NONAME\n  ;SCmdRegisterArgList           @476 NONAME\n  ;SCmdRegisterArgument          @477 NONAME\n  ;SCmdStringExists              @478 NONAME\n  ;SCmdProcessCommandLine        @479 NONAME\n  ;Ordinal480                    @480 NONAME\n  ;SMemFindNextBlock             @481 NONAME\n  ;SMemFindNextHeap              @482 NONAME\n  ;SMemGetHeapByCaller           @483 NONAME\n  ;SMemGetHeapByPtr              @484 NONAME\n  ;SMemHeapAlloc                 @485 NONAME\n  ;SMemHeapCreate                @486 NONAME\n  ;SMemHeapDestroy               @487 NONAME\n  ;SMemHeapFree                  @488 NONAME\n  ;SMemHeapRealloc               @489 NONAME\n  ;SMemHeapSize                  @490 NONAME\n  SMemCopy                      @491 NONAME\n  SMemFill                      @492 NONAME\n  ;SMemMove                      @493 NONAME\n  SMemZero                      @494 NONAME\n  SMemCmp                       @495 NONAME\n  ;SMem496                       @496 NONAME\n  ;SMemDumpState                 @497 NONAME\n  ;Ordinal498                    @498 NONAME\n\n  SStrCopy                      @501 NONAME\n  SStrCopy@12                   @501 NONAME\n  SStrHash                      @502 NONAME\n  SStrPack                      @503 NONAME\n  SStrPack@12                   @503 NONAME\n  ;SStrTokenize                  @504 NONAME\n  ;SStrPack                      @505 NONAME\n  SStrLen                       @506 NONAME\n  ;SStrDup                       @507 NONAME\n  SStrCmp                       @508 NONAME\n  SStrCmpI                      @509 NONAME\n  SStrUpper                     @510 NONAME\n  ;SMsgBreakHandlerChain         @511 NONAME\n  ;SMsgUnregisterCommand         @512 NONAME\n  ;SMsgUnregisterKeyDown         @513 NONAME\n  ;SMsgUnregisterKeyUp           @514 NONAME\n  ;SMsgUnregisterMessage         @515 NONAME\n  ;SMsgGetDispatcher             @516 NONAME\n  ;SMsgSetDefaultWindow          @517 NONAME\n  ;SMsgGetDefaultWindow          @518 NONAME\n  ;SMsg519                       @519 NONAME\n\n  ;SRgn521                     @521 NONAME\n\n  SRgn523                       @523 NONAME\n  SRgnCreateRegion              @524 NONAME\n  SRgnDeleteRegion              @525 NONAME\n\n  ;SRgn527                       @527 NONAME\n  ;SRgn528i                      @528 NONAME\n  SRgn529i                      @529 NONAME\n  ;SRgn530i                      @530 NONAME\n  ;SRgn531i                      @531 NONAME\n  ;SRgn532i                      @532 NONAME\n  ;SRgn533i                      @533 NONAME\n  ;SRgn534                       @534 NONAME\n  ;SRgn535f                      @535 NONAME\n  ;SRgn536f                      @536 NONAME\n  ;SRgn537f                      @537 NONAME\n  ;SRgn538f                      @538 NONAME\n  ;SRgn539f                      @539 NONAME\n  ;SRgn540f                      @540 NONAME\n  ;SLogClose                     @541 NONAME\n  ;SLogCreate                    @542 NONAME\n  ;SLog543                       @543 NONAME\n  ;SLogDump                      @544 NONAME\n  ;SLogFlush                     @545 NONAME\n  ;SLogFlushAll                  @546 NONAME\n  ;SLogPend                      @547 NONAME\n  ;SLogWrite                     @548 NONAME\n  ;SLog549                       @549 NONAME\n  ;SLogCriticalLog               @550 NONAME\n  ;SCompCompress                 @551 NONAME\n  ;SCompDecompress               @552 NONAME\n  ;SLogVWrite                    @553 NONAME\n  ;Ordinal554                    @554 NONAME\n  ;Ordinal555                    @555 NONAME\n  ;Ordinal556                    @556 NONAME\n  ;Ordinal557                    @557 NONAME\n  ;Ordinal558                    @558 NONAME\n  ;Ordinal559                    @559 NONAME\n  ;Ordinal560                    @560 NONAME\n  ;SErrCheckDebugSymbolLibrary   @561 NONAME\n  SErrDisplayErrorFmt           @562 NONAME\n  ;SErrIsDisplayingError         @563 NONAME\n  ;SErrPrepareAppFatal           @564 NONAME\n  ;SErrSetLogTitleString         @565 NONAME\n  ;SErrDisplayAppFatal           @566 NONAME\n  SErrCatchUnhandledExceptions  @567 NONAME\n  ;Storm568                      @568 NONAME\n  ;SStrChr                       @569 NONAME\n  ;SStrChrR                      @570 NONAME\n  SStrChr                       @571 NONAME\n  SStrChrR                      @572 NONAME\n  ;SStrToDouble                  @573 NONAME\n  ;SStrToFloat                   @574 NONAME\n  ;SStrToInt                     @575 NONAME\n  ;SStrToUnsigned                @576 NONAME\n  ;SStrToInt64                   @577 NONAME\n  SStrVPrintf                   @578 NONAME\n  ;SStrLower                     @579 NONAME\n  ;SStrHash64                    @580 NONAME\n  ;SStrPrintf                    @581 NONAME\n  ;SDrawSetClientRect            @582 NONAME\n  ;SDrawGetClientRect            @583 NONAME\n  ;SStrStrI                      @584 NONAME\n  ;SStrStrI                      @585 NONAME\n  ;SStrStr                       @586 NONAME\n  ;SStrStr                       @587 NONAME\n  ;SNet588                       @588 NONAME\n\n  ;SBigAdd                       @601 NONAME\n  ;SBigAnd                       @602 NONAME\n  ;SBigCompare                   @603 NONAME\n  ;SBigCopy                      @604 NONAME\n  ;SBigDec                       @605 NONAME\n  SBigDel                       @606 NONAME\n  ;SBigDiv                       @607 NONAME\n  ;SBigFindPrime                 @608 NONAME\n  SBigFromBinary                @609 NONAME\n  ;SBigFromStr                   @610 NONAME\n  ;SBigFromStream                @611 NONAME\n  ;SBigFromUnsigned              @612 NONAME\n  ;SBigGcd                       @613 NONAME\n  ;SBigInc                       @614 NONAME\n  ;SBigInvMod                    @615 NONAME\n  ;SBigIsEven                    @616 NONAME\n  ;SBigIsOdd                     @617 NONAME\n  ;SBigIsOne                     @618 NONAME\n  ;SBigIsPrime                   @619 NONAME\n  ;SBigIsZero                    @620 NONAME\n  ;SBigMod                       @621 NONAME\n  ;SBigMul                       @622 NONAME\n  ;SBigMulMod                    @623 NONAME\n  SBigNew                       @624 NONAME\n  ;SBigNot                       @625 NONAME\n  ;SBigOr                        @626 NONAME\n  ;SBigPow                       @627 NONAME\n  SBigPowMod                    @628 NONAME\n  ;SBigRand                      @629 NONAME\n  ;SBigSet2Exp                   @630 NONAME\n  ;SBigSetOne                    @631 NONAME\n  ;SBigSetZero                   @632 NONAME\n  ;SBigShl                       @633 NONAME\n  ;SBigShr                       @634 NONAME\n  ;SBigSquare                    @635 NONAME\n  ;SBigSub                       @636 NONAME\n  ;SBigToBinaryArray             @637 NONAME\n  SBigToBinaryBuffer            @638 NONAME\n  ;SBigToBinaryPtr               @639 NONAME\n  ;SBigToStrArray                @640 NONAME\n  ;SBigToStrBuffer               @641 NONAME\n  ;SBigToStrPtr                  @642 NONAME\n  ;SBigToStreamArray             @643 NONAME\n  ;SBigToStreamBuffer            @644 NONAME\n  ;SBigToStreamPtr               @645 NONAME\n  ;SBigToUnsigned                @646 NONAME\n  ;SBigXor                       @647 NONAME\n\n  ;SUniConvertUTF16to8Len        @901 NONAME\n  ;SUniConvertUTF16to8           @902 NONAME\n  ;SUniConvertUTF8to16Len        @903 NONAME\n  ;SUniConvertUTF8to16           @904 NONAME\n  ;SUniS905                      @905 NONAME\n  ;SUniS906                      @906 NONAME\n  ;SUniFindAfterUTF8Chr          @907 NONAME\n  ;SUniFindUTF8ChrStart          @908 NONAME\n  ;SUniConvertUTF16To909         @909 NONAME\n  ;SUniConvertUTF16To910         @910 NONAME\n  ;SUniConvertUTF16To911         @911 NONAME\n  ;SUniConvert912                @912 NONAME\n  ;SUniConvert913                @913 NONAME\n  ;SUniConvert914                @914 NONAME\n  ;SUniConvertUTF8ToWin          @915 NONAME\n; END\n"
  },
  {
    "path": "Diablo.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"Diablo\" - Package Owner=<4>\r\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n# ** DO NOT EDIT **\r\n\r\n# TARGTYPE \"Win32 (x86) Application\" 0x0101\r\n\r\nCFG=Diablo - Win32 Debug\r\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n!MESSAGE use the Export Makefile command and run\r\n!MESSAGE\r\n!MESSAGE NMAKE /f \"Diablo.mak\".\r\n!MESSAGE\r\n!MESSAGE You can specify a configuration when running NMAKE\r\n!MESSAGE by defining the macro CFG on the command line. For example:\r\n!MESSAGE\r\n!MESSAGE NMAKE /f \"Diablo.mak\" CFG=\"Diablo - Win32 Debug\"\r\n!MESSAGE\r\n!MESSAGE Possible choices for configuration are:\r\n!MESSAGE\r\n!MESSAGE \"Diablo - Win32 Release\" (based on \"Win32 (x86) Application\")\r\n!MESSAGE \"Diablo - Win32 Debug\" (based on \"Win32 (x86) Application\")\r\n!MESSAGE \"Diablo - Win32 Release with PDB\" (based on \"Win32 (x86) Application\")\r\n!MESSAGE\r\n\r\n# Begin Project\r\n# PROP AllowPerConfigDependencies 0\r\n# PROP Scc_ProjName \"\"\r\n# PROP Scc_LocalPath \"\"\r\nCPP=cl.exe\r\nMTL=midl.exe\r\nRSC=rc.exe\r\n\r\n!IF  \"$(CFG)\" == \"Diablo - Win32 Release\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 0\r\n# PROP BASE Output_Dir \"Source/WinRel\"\r\n# PROP BASE Intermediate_Dir \"Source/WinRel\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 0\r\n# PROP Output_Dir \"bld/WinRel\"\r\n# PROP Intermediate_Dir \"Source/WinRel\"\r\n# PROP Ignore_Export_Lib 0\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD CPP /nologo /Gr /MT /W3 /GX /O1 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\r\n# ADD RSC /l 0x409 /d \"NDEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLINK32=link.exe\r\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386\r\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /machine:I386\r\n\r\n!ELSEIF  \"$(CFG)\" == \"Diablo - Win32 Debug\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 0\r\n# PROP BASE Output_Dir \"Diablo__\"\r\n# PROP BASE Intermediate_Dir \"Diablo__\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 1\r\n# PROP Output_Dir \"bld/WinDebug\"\r\n# PROP Intermediate_Dir \"Source/WinDebug\"\r\n# PROP Ignore_Export_Lib 0\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD CPP /nologo /Gr /MTd /W3 /Gm /GX /Zi /O1 /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\r\n# ADD RSC /l 0x409 /d \"_DEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\nLINK32=link.exe\r\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /machine:I386\r\n /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\r\n\r\n!ELSEIF  \"$(CFG)\" == \"Diablo - Win32 Release with PDB\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 0\r\n# PROP BASE Output_Dir \"Diablo___Win32_Release_with_PDB\"\r\n# PROP BASE Intermediate_Dir \"Diablo___Win32_Release_with_PDB\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 0\r\n# PROP Output_Dir \"bld/WinRel\"\r\n# PROP Intermediate_Dir \"Source/WinRel\"\r\n# PROP Ignore_Export_Lib 0\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /MT /W3 /GX /O1 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# SUBTRACT BASE CPP /WX\r\n# ADD CPP /nologo /Gr /MT /W3 /GX /Zi /O1 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /FAs /YX /FD /c\r\n# SUBTRACT CPP /WX\r\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\r\n# ADD RSC /l 0x409 /d \"NDEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLINK32=link.exe\r\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /machine:I386\r\n# ADD LINK32 DiabloUI/WinRel/diabloui.lib 3rdParty/Storm/Source/WinRel/storm.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib 3rdParty/PKWare/WinRel/pkware.lib /nologo /subsystem:windows /debug /machine:I386\r\n\r\n!ENDIF\r\n\r\n# Begin Target\r\n\r\n# Name \"Diablo - Win32 Release\"\r\n# Name \"Diablo - Win32 Debug\"\r\n# Name \"Diablo - Win32 Release with PDB\"\r\n# Begin Group \"Source Files\"\r\n\r\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\appfat.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\automap.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\capture.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\codec.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\control.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\cursor.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\dead.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\debug.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\diablo.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\doom.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l1.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l2.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l3.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l4.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\dthread.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\dx.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\effects.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\encrypt.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\engine.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\error.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\fault.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\gamemenu.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\gendung.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\gmenu.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\help.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\init.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\interfac.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\inv.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\itemdat.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\items.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\lighting.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\loadsave.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\logging.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\mainmenu.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\minitext.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\misdat.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\missiles.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\monstdat.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\monster.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\movie.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\mpqapi.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\msg.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\msgcmd.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\multi.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\nthread.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\objdat.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\objects.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\pack.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\palette.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\path.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\pfile.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\player.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\plrmsg.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\portal.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\quests.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\restrict.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\scrollrt.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\setmaps.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\sha.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\sound.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\spelldat.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\spells.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\stores.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\sync.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\textdat.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\themes.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\tmsg.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\town.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\towners.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\track.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\trigs.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\wave.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\render.cpp\r\n# End Source File\r\n# End Group\r\n# Begin Group \"Resource Files\"\r\n\r\n# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\r\n# Begin Source File\r\n\r\nSOURCE=.\\Diablo.ico\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Diablo.rc\r\n# End Source File\r\n# End Group\r\n# Begin Group \"Header Files\"\r\n\r\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\r\n\r\n# Begin Source File\r\n\r\nSOURCE=.\\defs.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\enums.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\structs.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\types.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\appfat.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\automap.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\capture.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\codec.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\control.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\cursor.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\dead.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\debug.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\diablo.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\doom.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l1.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l2.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l3.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\drlg_l4.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\dthread.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\dx.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\effects.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\encrypt.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\engine.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\error.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\fault.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\gamemenu.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\gendung.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\gmenu.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\help.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\init.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\interfac.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\inv.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\items.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\lighting.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\loadsave.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\logging.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\mainmenu.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\minitext.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\missiles.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\monster.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\movie.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\mpqapi.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\msg.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\msgcmd.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\multi.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\nthread.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\objects.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\pack.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\palette.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\path.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\pfile.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\player.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\plrmsg.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\portal.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\quests.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\render.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\restrict.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\scrollrt.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\setmaps.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\sha.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\sound.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\spells.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\stores.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\sync.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\textdat.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\themes.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\tmsg.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\town.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\towners.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\track.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\trigs.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\Source\\wave.h\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\resource.h\r\n# End Source File\r\n# End Group\r\n# End Target\r\n# End Project\r\n"
  },
  {
    "path": "Diablo.dsw",
    "content": "Microsoft Developer Studio Workspace File, Format Version 6.00\r\n# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r\n\r\n###############################################################################\r\n\r\nProject: \"Diablo\"=\".\\Diablo.dsp\" - Package Owner=<4>\r\n\r\nPackage=<5>\r\n{{{\r\n}}}\r\n\r\nPackage=<4>\r\n{{{\r\n    Begin Project Dependency\r\n    Project_Dep_Name DiabloUI\r\n    End Project Dependency\r\n    Begin Project Dependency\r\n    Project_Dep_Name Storm\r\n    End Project Dependency\r\n    Begin Project Dependency\r\n    Project_Dep_Name Pkware\r\n    End Project Dependency\r\n}}}\r\n\r\n###############################################################################\r\n\r\nProject: \"DiabloUI\"=\".\\DiabloUI\\DiabloUI.dsp\" - Package Owner=<4>\r\n\r\nPackage=<5>\r\n{{{\r\n}}}\r\n\r\nPackage=<4>\r\n{{{\r\n    Begin Project Dependency\r\n    Project_Dep_Name Storm\r\n    End Project Dependency\r\n}}}\r\n\r\n###############################################################################\r\n\r\nProject: \"Pkware\"=\".\\3rdParty\\PKWare\\Pkware.dsp\" - Package Owner=<4>\r\n\r\nPackage=<5>\r\n{{{\r\n}}}\r\n\r\nPackage=<4>\r\n{{{\r\n}}}\r\n\r\n###############################################################################\r\n\r\nProject: \"Storm\"=\".\\3rdParty\\Storm\\Source\\Storm.dsp\" - Package Owner=<4>\r\n\r\nPackage=<5>\r\n{{{\r\n}}}\r\n\r\nPackage=<4>\r\n{{{\r\n}}}\r\n\r\n###############################################################################\r\n\r\nGlobal:\r\n\r\nPackage=<5>\r\n{{{\r\n}}}\r\n\r\nPackage=<3>\r\n{{{\r\n}}}\r\n\r\n###############################################################################\r\n\r\n"
  },
  {
    "path": "Diablo.rc",
    "content": "//Microsoft Developer Studio generated resource script.\r\n//\r\n#include \"resource.h\"\r\n\r\n#define APSTUDIO_READONLY_SYMBOLS\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 2 resource.\r\n//\r\n#include <winresrc.h>\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#undef APSTUDIO_READONLY_SYMBOLS\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n// English (U.S.) resources\r\n\r\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n#ifdef _WIN32\r\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r\n#pragma code_page(1252)\r\n#endif //_WIN32\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Icon\r\n//\r\n\r\n// Icon with lowest ID value placed first to ensure application icon\r\n// remains consistent on all systems.\r\nIDI_ICON1               ICON    DISCARDABLE     \"Diablo.ico\"\r\n\r\n#ifdef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// TEXTINCLUDE\r\n//\r\n\r\n1 TEXTINCLUDE DISCARDABLE \r\nBEGIN\r\n    \"resource.h\\0\"\r\nEND\r\n\r\n2 TEXTINCLUDE DISCARDABLE \r\nBEGIN\r\n    \"#include \"\"afxres.h\"\"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n3 TEXTINCLUDE DISCARDABLE \r\nBEGIN\r\n    \"\\r\\n\"\r\n    \"\\0\"\r\nEND\r\n\r\n#endif    // APSTUDIO_INVOKED\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Dialog\r\n//\r\n\r\nIDD_DIALOG1 DIALOG DISCARDABLE  0, 0, 250, 241\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Direct Draw Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,193,220,50,14\r\n    LTEXT           \"Diablo was unable to properly initialize your video card using DirectX.  Please try the following solutions to correct the problem:\",\r\n                    -1,7,7,236,18\r\n    LTEXT           \"Use the Diablo setup program \"\"SETUP.EXE\"\" provided on the Diablo CD-ROM to install DirectX 3.0.\",\r\n                    -1,19,26,210,18\r\n    LTEXT           \"Install the most recent DirectX video drivers provided by the manufacturer of your video card.  A list of video card manufactuers can be found at: http://www.blizzard.com/support/vendors.htm\",\r\n                    -1,19,48,210,27\r\n    LTEXT           \"The error encountered while trying to initialize the video card was:\",\r\n                    -1,7,175,236,9\r\n    LTEXT           \"unknown error\",1000,19,186,210,27\r\n    LTEXT           \"If you continue to have problems, we have also included Microsoft DirectX 2.0 drivers on the Diablo CD-ROM.  This older version of DirectX may work in cases where DirectX 3.0 does not.\",\r\n                    -1,7,79,236,27\r\n    LTEXT           \"USA telephone: 1-800-426-9400\\nInternational telephone: 206-882-8080\\nhttp://www.microsoft.com\",\r\n                    -1,19,137,210,27\r\n    LTEXT           \"If you continue to have problems with DirectX, please contact Microsoft's Technical Support at:\",\r\n                    -1,7,116,236,18\r\nEND\r\n\r\nIDD_DIALOG2 DIALOG DISCARDABLE  0, 0, 250, 213\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Out of Memory Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,193,192,50,14\r\n    LTEXT           \"Diablo has exhausted all the memory on your system.  This problem can likely be corrected by changing the virtual memory settings for Windows.  Ensure that your system has at least 10 megabytes of free disk space, then check your virtual memory settings:\",\r\n                    -1,7,7,236,36\r\n    LTEXT           \"Select \"\"Settings - Control Panel\"\" from the \"\"Start\"\" menu\\nRun the \"\"System\"\" control panel applet\\nSelect the \"\"Performance\"\" tab, and press \"\"Virtual Memory\"\"\\nUse the \"\"Let Windows manage my virtual memory...\"\" option\",\r\n                    -1,23,54,197,36\r\n    LTEXT           \"The error encountered was:\",-1,7,146,236,11\r\n    LTEXT           \"unknown location\",1000,20,157,210,27\r\n    LTEXT           \"For Windows 95:\",-1,7,45,236,9\r\n    LTEXT           \"Select \"\"Settings - Control Panel\"\" from the \"\"Start\"\" menu\\nRun the \"\"System\"\" control panel applet\\nSelect the \"\"Performance\"\" tab\\nPress \"\"Change\"\" in \"\"Virtual Memory\"\" settings\\nEnsure that the virtual memory file is at least 32 megabytes\",\r\n                    -1,17,98,197,45\r\n    LTEXT           \"For Windows NT:\",-1,7,89,236,9\r\nEND\r\n\r\nIDD_DIALOG3 DIALOG DISCARDABLE  0, 0, 265, 114\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Data File Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,208,93,50,14\r\n    LTEXT           \"Diablo was unable to open a required file.  Please ensure that the Diablo disc is in the CDROM drive.  If this problem persists, try uninstalling and reinstalling Diablo using the program \"\"SETUP.EXE\"\" on the Diablo CD-ROM.\",\r\n                    -1,7,7,251,36\r\n    LTEXT           \"The problem occurred while trying to load a file\",-1,7,\r\n                    48,232,9\r\n    LTEXT           \"unknown file\",1000,20,59,210,27\r\nEND\r\n\r\nIDD_DIALOG4 DIALOG DISCARDABLE  0, 0, 250, 161\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Direct Draw Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,193,140,50,14\r\n    LTEXT           \"Diablo was unable to find the file \"\"ddraw.dll\"\", which is a component of Microsoft DirectX.  Please run the program \"\"SETUP.EXE\"\" on the Diablo CD-ROM and install Microsoft DirectX.\",\r\n                    -1,7,7,236,27\r\n    LTEXT           \"The error encountered while trying to initialize DirectX was:\",\r\n                    -1,7,95,236,9\r\n    LTEXT           \"unknown error\",1000,19,106,210,29\r\n    LTEXT           \"USA telephone: 1-800-426-9400\\nInternational telephone: 206-882-8080\\nhttp://www.microsoft.com\",\r\n                    -1,19,60,210,27\r\n    LTEXT           \"If you continue to have problems with DirectX, please contact Microsoft's Technical Support at:\",\r\n                    -1,7,39,236,18\r\nEND\r\n\r\nIDD_DIALOG5 DIALOG DISCARDABLE  0, 0, 250, 161\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Direct Sound Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,193,140,50,14\r\n    LTEXT           \"Diablo was unable to find the file \"\"dsound.dll\"\", which is a component of Microsoft DirectX.  Please run the program \"\"SETUP.EXE\"\" on the Diablo CD-ROM and install Microsoft DirectX.\",\r\n                    -1,7,7,236,27\r\n    LTEXT           \"The error encountered while trying to initialize DirectX was:\",\r\n                    -1,7,95,236,9\r\n    LTEXT           \"unknown error\",1000,19,106,210,27\r\n    LTEXT           \"USA telephone: 1-800-426-9400\\nInternational telephone: 206-882-8080\\nhttp://www.microsoft.com\",\r\n                    -1,19,60,210,27\r\n    LTEXT           \"If you continue to have problems with DirectX, please contact Microsoft's Technical Support at:\",\r\n                    -1,7,39,236,18\r\nEND\r\n\r\n/* IDD_DIALOG6 DIALOG DISCARDABLE  0, 0, 250, 92\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"System warning\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"&OK\",1,130,71,50,14\r\n    LTEXT           \"Diablo requires an Intel Pentium-class processor to run properly.  Your system does not appear to have a Pentium-class processor installed.\",\r\n                    -1,7,7,236,18\r\n    LTEXT           \"You may still be able to play Diablo if your processor has the performance characteristics of a Pentium.\",\r\n                    -1,7,30,236,18\r\n    LTEXT           \"Press \"\"OK\"\" to proceed, otherwise press \"\"Cancel\"\" to exit this program.\",\r\n                    -1,7,53,236,9\r\n    PUSHBUTTON      \"&Cancel\",2,193,71,50,14\r\nEND */\r\n\r\nIDD_DIALOG7 DIALOG DISCARDABLE  0, 0, 250, 100\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Out of Disk Space\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,193,79,50,14\r\n    LTEXT           \"Diablo requires at least 10 megabytes of free disk space to run properly.  The disk:\",\r\n                    -1,7,7,236,18\r\n    LTEXT           \"\",-1,7,43,232,9\r\n    LTEXT           \"unknown drive\",1000,7,33,210,9\r\n    LTEXT           \"has less than 10 megabytes of free space left.  Please free some space on your drive and run Diablo again.\",\r\n                    -1,7,52,236,18\r\nEND\r\n\r\nIDD_DIALOG8 DIALOG DISCARDABLE  0, 0, 250, 161\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Direct Draw Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,193,140,50,14\r\n    LTEXT           \"Diablo was unable to switch video modes.  This is a common problem for computers with more than one video card.  To correct this problem, please set your video resolution to 640 x 480 and try running Diablo again.\",\r\n                    -1,7,7,236,27\r\n    LTEXT           \"The error encountered while trying to switch video modes was:\",\r\n                    -1,7,95,236,9\r\n    LTEXT           \"unknown error\",1000,19,106,210,27\r\n    LTEXT           \"Select \"\"Settings - Control Panel\"\" from the \"\"Start\"\" menu\\nRun the \"\"Display\"\" control panel applet\\nSelect the \"\"Settings\"\" tab\\nSet the \"\"Desktop Area\"\" to \"\"640 x 480 pixels\"\"\",\r\n                    -1,23,50,197,36\r\n    LTEXT           \"For Windows 95 and Windows NT\",-1,7,41,236,9\r\nEND\r\n\r\nIDD_DIALOG9 DIALOG DISCARDABLE  0, 0, 250, 92\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Data File Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,136,71,50,14\r\n    LTEXT           \"Diablo cannot read a required data file.  Your Diablo CD may not be in the CDROM drive.  Please ensure that the Diablo disc is in the CDROM drive and press OK.  To leave the program, press Exit.\",\r\n                    -1,7,7,236,27\r\n    LTEXT           \"unknown file\",1000,20,37,210,27\r\n    PUSHBUTTON      \"Exit\",2,193,71,50,14\r\nEND\r\n\r\nIDD_DIALOG10 DIALOG DISCARDABLE  0, 0, 223, 116\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Windows 2000 Restricted User Advisory\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,166,95,50,14\r\n    LTEXT           \"In order to install, play or patch Diablo using the Windows 2000 operating system,  you will need to log in as either an Administrator or as a Power User.\",\r\n                    -1,7,7,209,28\r\n    LTEXT           \"Users, also known as Restricted Users, do not have sufficient access to install or play the game properly.\",\r\n                    -1,7,39,209,20\r\n    LTEXT           \"If you have further questions regarding User Rights in Windows 2000, please refer to your Windows 2000 documentation or contact your system administrator.\",\r\n                    -1,7,63,209,28\r\nEND\r\n\r\nIDD_DIALOG11 DIALOG DISCARDABLE  0, 0, 220, 121\r\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\r\nCAPTION \"Read-Only Directory Error\"\r\nFONT 8, \"MS Sans Serif\"\r\nBEGIN\r\n    DEFPUSHBUTTON   \"OK\",1,163,100,50,14\r\n    LTEXT           \"Diablo is being run from:\",-1,7,7,206,10\r\n    LTEXT           \"unknown directory\",1000,17,20,186,20\r\n    LTEXT           \"Diablo or the current user does not seem to have write privilages in this directory. Contact your system administrator.\\n\\nNote that Windows 2000 Restricted Users can not write to the Windows or Program Files directory hierarchies.\",\r\n                    -1,7,44,206,50\r\nEND\r\n\r\n\r\n#ifndef _MAC\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Version\r\n//\r\n\r\nVS_VERSION_INFO VERSIONINFO\r\n FILEVERSION 2001,5,18,1\r\n PRODUCTVERSION 1,0,9,2\r\n FILEFLAGSMASK 0x3fL\r\n#ifdef _DEBUG\r\n FILEFLAGS 0x1L\r\n#else\r\n FILEFLAGS 0x0L\r\n#endif\r\n FILEOS 0x4L\r\n FILETYPE 0x1L\r\n FILESUBTYPE 0x0L\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"CompanyName\", \"Blizzard Entertainment\\0\"\r\n            VALUE \"FileDescription\", \"Diablo\\0\"\r\n            VALUE \"FileVersion\", \"2001, 5, 18, 1\\0\"\r\n            VALUE \"InternalName\", \"Diablo\\0\"\r\n            VALUE \"LegalCopyright\", \"Copyright  1996-2001\\0\"\r\n            VALUE \"OriginalFilename\", \"Diablo.exe\\0\"\r\n            VALUE \"ProductName\", \"Blizzard Entertainment Diablo\\0\"\r\n            VALUE \"ProductVersion\", \"1, 0, 9, 2\\0\"\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND\r\n\r\n#endif    // !_MAC\r\n\r\n#endif    // English (U.S.) resources\r\n/////////////////////////////////////////////////////////////////////////////\r\n\r\n\r\n\r\n#ifndef APSTUDIO_INVOKED\r\n/////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Generated from the TEXTINCLUDE 3 resource.\r\n//\r\n\r\n\r\n/////////////////////////////////////////////////////////////////////////////\r\n#endif    // not APSTUDIO_INVOKED\r\n\r\n"
  },
  {
    "path": "Diablo.sln",
    "content": "﻿\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio 15\r\nVisualStudioVersion = 15.0.27703.2035\r\nMinimumVisualStudioVersion = 10.0.40219.1\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Diablo\", \"Diablo.vcxproj\", \"{23114A83-7D81-4F17-A6B8-2FC51F3D72F2}\"\r\n\tProjectSection(ProjectDependencies) = postProject\r\n\t\t{C7F9F3B4-2F7C-4672-9586-94D8BA0950B6} = {C7F9F3B4-2F7C-4672-9586-94D8BA0950B6}\r\n\tEndProjectSection\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"DiabloUI\", \"DiabloUI\\DiabloUI.vcxproj\", \"{8408E35E-3CF5-4D4E-B873-AF3952CDABD4}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Storm\", \"3rdParty\\Storm\\Source\\Storm.vcxproj\", \"{B28F69CE-15A1-424D-BBB5-2727258D675B}\"\r\nEndProject\r\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"PKWare\", \"3rdParty\\PKWare\\PKWare.vcxproj\", \"{C7F9F3B4-2F7C-4672-9586-94D8BA0950B6}\"\r\nEndProject\r\nGlobal\r\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\r\n\t\tDebug|x86 = Debug|x86\r\n\t\tRelease|x86 = Release|x86\r\n\tEndGlobalSection\r\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\r\n\t\t{23114A83-7D81-4F17-A6B8-2FC51F3D72F2}.Debug|x86.ActiveCfg = Debug|Win32\r\n\t\t{23114A83-7D81-4F17-A6B8-2FC51F3D72F2}.Debug|x86.Build.0 = Debug|Win32\r\n\t\t{23114A83-7D81-4F17-A6B8-2FC51F3D72F2}.Release|x86.ActiveCfg = Release|Win32\r\n\t\t{23114A83-7D81-4F17-A6B8-2FC51F3D72F2}.Release|x86.Build.0 = Release|Win32\r\n\t\t{8408E35E-3CF5-4D4E-B873-AF3952CDABD4}.Debug|x86.ActiveCfg = Debug|Win32\r\n\t\t{8408E35E-3CF5-4D4E-B873-AF3952CDABD4}.Debug|x86.Build.0 = Debug|Win32\r\n\t\t{8408E35E-3CF5-4D4E-B873-AF3952CDABD4}.Release|x86.ActiveCfg = Release|Win32\r\n\t\t{8408E35E-3CF5-4D4E-B873-AF3952CDABD4}.Release|x86.Build.0 = Release|Win32\r\n\t\t{B28F69CE-15A1-424D-BBB5-2727258D675B}.Debug|x86.ActiveCfg = Debug|Win32\r\n\t\t{B28F69CE-15A1-424D-BBB5-2727258D675B}.Debug|x86.Build.0 = Debug|Win32\r\n\t\t{B28F69CE-15A1-424D-BBB5-2727258D675B}.Release|x86.ActiveCfg = Release|Win32\r\n\t\t{B28F69CE-15A1-424D-BBB5-2727258D675B}.Release|x86.Build.0 = Release|Win32\r\n\t\t{C7F9F3B4-2F7C-4672-9586-94D8BA0950B6}.Debug|x86.ActiveCfg = Debug|Win32\r\n\t\t{C7F9F3B4-2F7C-4672-9586-94D8BA0950B6}.Debug|x86.Build.0 = Debug|Win32\r\n\t\t{C7F9F3B4-2F7C-4672-9586-94D8BA0950B6}.Release|x86.ActiveCfg = Release|Win32\r\n\t\t{C7F9F3B4-2F7C-4672-9586-94D8BA0950B6}.Release|x86.Build.0 = Release|Win32\r\n\tEndGlobalSection\r\n\tGlobalSection(SolutionProperties) = preSolution\r\n\t\tHideSolutionNode = FALSE\r\n\tEndGlobalSection\r\n\tGlobalSection(ExtensibilityGlobals) = postSolution\r\n\t\tSolutionGuid = {6252549D-BED6-405B-9D6D-42C9074D0684}\r\n\tEndGlobalSection\r\nEndGlobal\r\n"
  },
  {
    "path": "Diablo.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <SccProjectName />\r\n    <SccLocalPath />\r\n    <ProjectGuid>{23114A83-7D81-4F17-A6B8-2FC51F3D72F2}</ProjectGuid>\r\n    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <PlatformToolset>v141</PlatformToolset>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>Application</ConfigurationType>\r\n    <PlatformToolset>v141</PlatformToolset>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n    <Import Project=\"$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n    <Import Project=\"$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <OutDir>.\\Source/WinRel\\</OutDir>\r\n    <IntDir>.\\Source/WinRel\\</IntDir>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <OutDir>.\\Source/WinDebug\\</OutDir>\r\n    <IntDir>.\\Source/WinDebug\\</IntDir>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r\n      <InlineFunctionExpansion>Default</InlineFunctionExpansion>\r\n      <StringPooling>true</StringPooling>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AssemblerListingLocation>.\\Source/WinRel\\</AssemblerListingLocation>\r\n      <ObjectFileName>.\\Source/WinRel\\</ObjectFileName>\r\n      <ProgramDataBaseFileName>.\\Source/WinRel\\</ProgramDataBaseFileName>\r\n      <DisableSpecificWarnings>4996</DisableSpecificWarnings>\r\n      <MinimalRebuild>true</MinimalRebuild>\r\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r\n      <DebugInformationFormat>None</DebugInformationFormat>\r\n    </ClCompile>\r\n    <Midl>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TypeLibraryName>.\\Source/WinRel\\Diablo.tlb</TypeLibraryName>\r\n      <MkTypLibCompatible>true</MkTypLibCompatible>\r\n      <RedirectOutputAndErrors>NUL</RedirectOutputAndErrors>\r\n      <TargetEnvironment>Win32</TargetEnvironment>\r\n    </Midl>\r\n    <ResourceCompile>\r\n      <Culture>0x0409</Culture>\r\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ResourceCompile>\r\n    <Bscmake>\r\n      <OutputFile>.\\Source/WinRel\\Diablo.bsc</OutputFile>\r\n    </Bscmake>\r\n    <Link>\r\n      <SubSystem>Windows</SubSystem>\r\n      <OutputFile>.\\Source/WinRel\\Diablo.exe</OutputFile>\r\n      <AdditionalDependencies>3rdParty/Storm/Source/WinRel/Storm.lib;3rdParty/PKWare/WinRel/PKWare.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n      <DataExecutionPrevention>false</DataExecutionPrevention>\r\n      <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>\r\n      <GenerateDebugInformation>false</GenerateDebugInformation>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r\n      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r\n      <Optimization>Disabled</Optimization>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AssemblerListingLocation>.\\Source/WinDebug\\</AssemblerListingLocation>\r\n      <ObjectFileName>.\\Source/WinDebug\\</ObjectFileName>\r\n      <ProgramDataBaseFileName>.\\Source/WinDebug\\</ProgramDataBaseFileName>\r\n      <DisableSpecificWarnings>4996</DisableSpecificWarnings>\r\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r\n    </ClCompile>\r\n    <Midl>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TypeLibraryName>.\\Source/WinDebug\\Diablo.tlb</TypeLibraryName>\r\n      <MkTypLibCompatible>true</MkTypLibCompatible>\r\n      <RedirectOutputAndErrors>NUL</RedirectOutputAndErrors>\r\n      <TargetEnvironment>Win32</TargetEnvironment>\r\n    </Midl>\r\n    <ResourceCompile>\r\n      <Culture>0x0409</Culture>\r\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ResourceCompile>\r\n    <Bscmake>\r\n      <OutputFile>.\\Source/WinDebug\\Diablo.bsc</OutputFile>\r\n    </Bscmake>\r\n    <Link>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <SubSystem>Windows</SubSystem>\r\n      <OutputFile>.\\Source/WinDebug\\Diablo.exe</OutputFile>\r\n      <AdditionalDependencies>DiabloUI/WinDebug/DiabloUI.lib;3rdParty/Storm/Source/WinDebug/Storm.lib;3rdParty/PKWare/WinDebug/PKWare.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n      <DataExecutionPrevention>false</DataExecutionPrevention>\r\n      <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"Source\\appfat.cpp\" />\r\n    <ClCompile Include=\"Source\\automap.cpp\" />\r\n    <ClCompile Include=\"Source\\capture.cpp\" />\r\n    <ClCompile Include=\"Source\\codec.cpp\" />\r\n    <ClCompile Include=\"Source\\control.cpp\" />\r\n    <ClCompile Include=\"Source\\cursor.cpp\" />\r\n    <ClCompile Include=\"Source\\dead.cpp\" />\r\n    <ClCompile Include=\"Source\\debug.cpp\" />\r\n    <ClCompile Include=\"Source\\diablo.cpp\" />\r\n    <ClCompile Include=\"Source\\doom.cpp\" />\r\n    <ClCompile Include=\"Source\\drlg_l1.cpp\" />\r\n    <ClCompile Include=\"Source\\drlg_l2.cpp\" />\r\n    <ClCompile Include=\"Source\\drlg_l3.cpp\" />\r\n    <ClCompile Include=\"Source\\drlg_l4.cpp\" />\r\n    <ClCompile Include=\"Source\\dthread.cpp\" />\r\n    <ClCompile Include=\"Source\\dx.cpp\" />\r\n    <ClCompile Include=\"Source\\effects.cpp\" />\r\n    <ClCompile Include=\"Source\\encrypt.cpp\" />\r\n    <ClCompile Include=\"Source\\engine.cpp\" />\r\n    <ClCompile Include=\"Source\\error.cpp\" />\r\n    <ClCompile Include=\"Source\\fault.cpp\" />\r\n    <ClCompile Include=\"Source\\gamemenu.cpp\" />\r\n    <ClCompile Include=\"Source\\gendung.cpp\" />\r\n    <ClCompile Include=\"Source\\gmenu.cpp\" />\r\n    <ClCompile Include=\"Source\\help.cpp\" />\r\n    <ClCompile Include=\"Source\\init.cpp\" />\r\n    <ClCompile Include=\"Source\\interfac.cpp\" />\r\n    <ClCompile Include=\"Source\\inv.cpp\" />\r\n    <ClCompile Include=\"Source\\itemdat.cpp\" />\r\n    <ClCompile Include=\"Source\\items.cpp\" />\r\n    <ClCompile Include=\"Source\\lighting.cpp\" />\r\n    <ClCompile Include=\"Source\\loadsave.cpp\" />\r\n    <ClCompile Include=\"Source\\logging.cpp\" />\r\n    <ClCompile Include=\"Source\\mainmenu.cpp\" />\r\n    <ClCompile Include=\"Source\\minitext.cpp\" />\r\n    <ClCompile Include=\"Source\\misdat.cpp\" />\r\n    <ClCompile Include=\"Source\\missiles.cpp\" />\r\n    <ClCompile Include=\"Source\\monstdat.cpp\" />\r\n    <ClCompile Include=\"Source\\monster.cpp\" />\r\n    <ClCompile Include=\"Source\\movie.cpp\" />\r\n    <ClCompile Include=\"Source\\mpqapi.cpp\" />\r\n    <ClCompile Include=\"Source\\msg.cpp\" />\r\n    <ClCompile Include=\"Source\\msgcmd.cpp\" />\r\n    <ClCompile Include=\"Source\\multi.cpp\" />\r\n    <ClCompile Include=\"Source\\nthread.cpp\" />\r\n    <ClCompile Include=\"Source\\objdat.cpp\" />\r\n    <ClCompile Include=\"Source\\objects.cpp\" />\r\n    <ClCompile Include=\"Source\\pack.cpp\" />\r\n    <ClCompile Include=\"Source\\palette.cpp\" />\r\n    <ClCompile Include=\"Source\\path.cpp\" />\r\n    <ClCompile Include=\"Source\\pfile.cpp\" />\r\n    <ClCompile Include=\"Source\\player.cpp\" />\r\n    <ClCompile Include=\"Source\\plrmsg.cpp\" />\r\n    <ClCompile Include=\"Source\\portal.cpp\" />\r\n    <ClCompile Include=\"Source\\quests.cpp\" />\r\n    <ClCompile Include=\"Source\\restrict.cpp\" />\r\n    <ClCompile Include=\"Source\\scrollrt.cpp\" />\r\n    <ClCompile Include=\"Source\\setmaps.cpp\" />\r\n    <ClCompile Include=\"Source\\sha.cpp\" />\r\n    <ClCompile Include=\"Source\\sound.cpp\" />\r\n    <ClCompile Include=\"Source\\spelldat.cpp\" />\r\n    <ClCompile Include=\"Source\\spells.cpp\" />\r\n    <ClCompile Include=\"Source\\stores.cpp\" />\r\n    <ClCompile Include=\"Source\\sync.cpp\" />\r\n    <ClCompile Include=\"Source\\textdat.cpp\" />\r\n    <ClCompile Include=\"Source\\themes.cpp\" />\r\n    <ClCompile Include=\"Source\\tmsg.cpp\" />\r\n    <ClCompile Include=\"Source\\town.cpp\" />\r\n    <ClCompile Include=\"Source\\towners.cpp\" />\r\n    <ClCompile Include=\"Source\\track.cpp\" />\r\n    <ClCompile Include=\"Source\\trigs.cpp\" />\r\n    <ClCompile Include=\"Source\\wave.cpp\" />\r\n    <ClCompile Include=\"Source\\render.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Image Include=\"Diablo.ico\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ResourceCompile Include=\"Diablo.rc\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"defs.h\" />\r\n    <ClInclude Include=\"enums.h\" />\r\n    <ClInclude Include=\"resource.h\" />\r\n    <ClInclude Include=\"Source\\appfat.h\" />\r\n    <ClInclude Include=\"Source\\automap.h\" />\r\n    <ClInclude Include=\"Source\\capture.h\" />\r\n    <ClInclude Include=\"Source\\codec.h\" />\r\n    <ClInclude Include=\"Source\\control.h\" />\r\n    <ClInclude Include=\"Source\\cursor.h\" />\r\n    <ClInclude Include=\"Source\\dead.h\" />\r\n    <ClInclude Include=\"Source\\debug.h\" />\r\n    <ClInclude Include=\"Source\\diablo.h\" />\r\n    <ClInclude Include=\"Source\\doom.h\" />\r\n    <ClInclude Include=\"Source\\drlg_l1.h\" />\r\n    <ClInclude Include=\"Source\\drlg_l2.h\" />\r\n    <ClInclude Include=\"Source\\drlg_l3.h\" />\r\n    <ClInclude Include=\"Source\\drlg_l4.h\" />\r\n    <ClInclude Include=\"Source\\dthread.h\" />\r\n    <ClInclude Include=\"Source\\dx.h\" />\r\n    <ClInclude Include=\"Source\\effects.h\" />\r\n    <ClInclude Include=\"Source\\encrypt.h\" />\r\n    <ClInclude Include=\"Source\\engine.h\" />\r\n    <ClInclude Include=\"Source\\error.h\" />\r\n    <ClInclude Include=\"Source\\fault.h\" />\r\n    <ClInclude Include=\"Source\\gamemenu.h\" />\r\n    <ClInclude Include=\"Source\\gendung.h\" />\r\n    <ClInclude Include=\"Source\\gmenu.h\" />\r\n    <ClInclude Include=\"Source\\help.h\" />\r\n    <ClInclude Include=\"Source\\init.h\" />\r\n    <ClInclude Include=\"Source\\interfac.h\" />\r\n    <ClInclude Include=\"Source\\inv.h\" />\r\n    <ClInclude Include=\"Source\\itemdat.h\" />\r\n    <ClInclude Include=\"Source\\items.h\" />\r\n    <ClInclude Include=\"Source\\lighting.h\" />\r\n    <ClInclude Include=\"Source\\loadsave.h\" />\r\n    <ClInclude Include=\"Source\\logging.h\" />\r\n    <ClInclude Include=\"Source\\mainmenu.h\" />\r\n    <ClInclude Include=\"Source\\minitext.h\" />\r\n    <ClInclude Include=\"Source\\misdat.h\" />\r\n    <ClInclude Include=\"Source\\missiles.h\" />\r\n    <ClInclude Include=\"Source\\monstdat.h\" />\r\n    <ClInclude Include=\"Source\\monster.h\" />\r\n    <ClInclude Include=\"Source\\movie.h\" />\r\n    <ClInclude Include=\"Source\\mpqapi.h\" />\r\n    <ClInclude Include=\"Source\\msg.h\" />\r\n    <ClInclude Include=\"Source\\msgcmd.h\" />\r\n    <ClInclude Include=\"Source\\multi.h\" />\r\n    <ClInclude Include=\"Source\\nthread.h\" />\r\n    <ClInclude Include=\"Source\\objdat.h\" />\r\n    <ClInclude Include=\"Source\\objects.h\" />\r\n    <ClInclude Include=\"Source\\pack.h\" />\r\n    <ClInclude Include=\"Source\\palette.h\" />\r\n    <ClInclude Include=\"Source\\path.h\" />\r\n    <ClInclude Include=\"Source\\pfile.h\" />\r\n    <ClInclude Include=\"Source\\player.h\" />\r\n    <ClInclude Include=\"Source\\plrmsg.h\" />\r\n    <ClInclude Include=\"Source\\portal.h\" />\r\n    <ClInclude Include=\"Source\\quests.h\" />\r\n    <ClInclude Include=\"Source\\restrict.h\" />\r\n    <ClInclude Include=\"Source\\scrollrt.h\" />\r\n    <ClInclude Include=\"Source\\setmaps.h\" />\r\n    <ClInclude Include=\"Source\\sha.h\" />\r\n    <ClInclude Include=\"Source\\sound.h\" />\r\n    <ClInclude Include=\"Source\\spelldat.h\" />\r\n    <ClInclude Include=\"Source\\spells.h\" />\r\n    <ClInclude Include=\"Source\\stores.h\" />\r\n    <ClInclude Include=\"Source\\sync.h\" />\r\n    <ClInclude Include=\"Source\\textdat.h\" />\r\n    <ClInclude Include=\"Source\\themes.h\" />\r\n    <ClInclude Include=\"Source\\tmsg.h\" />\r\n    <ClInclude Include=\"Source\\town.h\" />\r\n    <ClInclude Include=\"Source\\towners.h\" />\r\n    <ClInclude Include=\"Source\\track.h\" />\r\n    <ClInclude Include=\"Source\\trigs.h\" />\r\n    <ClInclude Include=\"Source\\wave.h\" />\r\n    <ClInclude Include=\"Source\\render.h\" />\r\n    <ClInclude Include=\"structs.h\" />\r\n    <ClInclude Include=\"types.h\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ProjectReference Include=\"3rdParty\\Storm\\Source\\Storm.vcxproj\">\r\n      <Project>{b28f69ce-15a1-424d-bbb5-2727258d675b}</Project>\r\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\r\n    </ProjectReference>\r\n    <ProjectReference Include=\"DiabloUI\\DiabloUI.vcxproj\">\r\n      <Project>{8408e35e-3cf5-4d4e-b873-af3952cdabd4}</Project>\r\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\r\n    </ProjectReference>\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>"
  },
  {
    "path": "Diablo.vcxproj.filters",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup>\r\n    <Filter Include=\"Source Files\">\r\n      <UniqueIdentifier>{0fb229f0-d459-4ec9-b897-317b016e0a57}</UniqueIdentifier>\r\n      <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Resource Files\">\r\n      <UniqueIdentifier>{52f34be1-947a-42ee-b303-4a46566a14a7}</UniqueIdentifier>\r\n      <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>\r\n    </Filter>\r\n    <Filter Include=\"Header Files\">\r\n      <UniqueIdentifier>{8003aed2-27a6-444b-8fb0-bb8a59530005}</UniqueIdentifier>\r\n      <Extensions>h;hpp;hxx;hm;inl</Extensions>\r\n    </Filter>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"Source\\appfat.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\automap.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\capture.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\codec.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\control.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\cursor.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\dead.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\debug.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\diablo.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\doom.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\drlg_l1.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\drlg_l2.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\drlg_l3.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\drlg_l4.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\dthread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\dx.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\effects.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\encrypt.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\engine.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\error.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\fault.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\gamemenu.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\gendung.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\gmenu.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\help.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\init.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\interfac.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\inv.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\itemdat.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\items.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\lighting.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\loadsave.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\logging.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\mainmenu.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\minitext.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\misdat.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\missiles.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\monstdat.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\monster.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\movie.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\mpqapi.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\msg.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\msgcmd.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\multi.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\nthread.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\objdat.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\objects.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\pack.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\palette.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\path.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\pfile.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\player.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\plrmsg.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\portal.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\quests.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\restrict.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\scrollrt.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\setmaps.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\sha.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\sound.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\spelldat.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\spells.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\stores.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\sync.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\textdat.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\themes.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\tmsg.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\town.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\towners.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\track.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\trigs.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\wave.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n    <ClCompile Include=\"Source\\render.cpp\">\r\n      <Filter>Source Files</Filter>\r\n    </ClCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <Image Include=\"Diablo.ico\">\r\n      <Filter>Resource Files</Filter>\r\n    </Image>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ResourceCompile Include=\"Diablo.rc\">\r\n      <Filter>Resource Files</Filter>\r\n    </ResourceCompile>\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"resource.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\appfat.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\automap.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\capture.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\codec.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\control.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\cursor.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\dead.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\debug.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\diablo.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\doom.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\drlg_l1.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\drlg_l2.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\drlg_l3.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\drlg_l4.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\dthread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\dx.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\effects.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\encrypt.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\engine.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\error.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\fault.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\gamemenu.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\gendung.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\gmenu.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\help.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\init.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\interfac.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\inv.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\itemdat.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\items.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\lighting.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\loadsave.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\logging.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\mainmenu.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\minitext.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\misdat.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\missiles.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\monstdat.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\monster.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\movie.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\mpqapi.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\msg.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\msgcmd.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\multi.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\nthread.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\objdat.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\objects.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\pack.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\palette.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\path.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\pfile.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\player.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\plrmsg.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\portal.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\quests.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\restrict.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\scrollrt.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\setmaps.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\sha.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\sound.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\spelldat.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\spells.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\stores.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\sync.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\textdat.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\themes.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\tmsg.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\town.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\towners.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\track.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\trigs.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\wave.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"Source\\render.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"defs.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"enums.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"structs.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n    <ClInclude Include=\"types.h\">\r\n      <Filter>Header Files</Filter>\r\n    </ClInclude>\r\n  </ItemGroup>\r\n</Project>"
  },
  {
    "path": "DiabloUI/DiabloUI.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"DiabloUI\" - Package Owner=<4>\r\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\r\n# ** DO NOT EDIT **\r\n\r\n# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\r\n\r\nCFG=DiabloUI - Win32 Debug\r\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r\n!MESSAGE use the Export Makefile command and run\r\n!MESSAGE \r\n!MESSAGE NMAKE /f \"DiabloUI.mak\".\r\n!MESSAGE \r\n!MESSAGE You can specify a configuration when running NMAKE\r\n!MESSAGE by defining the macro CFG on the command line. For example:\r\n!MESSAGE \r\n!MESSAGE NMAKE /f \"DiabloUI.mak\" CFG=\"DiabloUI - Win32 Debug\"\r\n!MESSAGE \r\n!MESSAGE Possible choices for configuration are:\r\n!MESSAGE \r\n!MESSAGE \"DiabloUI - Win32 Release\" (based on \"Win32 (x86) Dynamic-Link Library\")\r\n!MESSAGE \"DiabloUI - Win32 Debug\" (based on \"Win32 (x86) Dynamic-Link Library\")\r\n!MESSAGE \r\n\r\n# Begin Project\r\n# PROP AllowPerConfigDependencies 0\r\n# PROP Scc_ProjName \"\"\r\n# PROP Scc_LocalPath \"\"\r\nCPP=cl.exe\r\nMTL=midl.exe\r\nRSC=rc.exe\r\n\r\n!IF  \"$(CFG)\" == \"DiabloUI - Win32 Release\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 0\r\n# PROP BASE Output_Dir \"WinRel\"\r\n# PROP BASE Intermediate_Dir \"WinRel\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 0\r\n# PROP Output_Dir \"WinRel\"\r\n# PROP Intermediate_Dir \"WinRel\"\r\n# PROP Ignore_Export_Lib 0\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD CPP /nologo /MT /W3 /GX /O1 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\r\n# ADD RSC /l 0x409 /d \"NDEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLINK32=link.exe\r\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386\r\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /def:\"diabloui.def\"\r\n\r\n!ELSEIF  \"$(CFG)\" == \"DiabloUI - Win32 Debug\"\r\n\r\n# PROP BASE Use_MFC 0\r\n# PROP BASE Use_Debug_Libraries 1\r\n# PROP BASE Output_Dir \"WinDebug\"\r\n# PROP BASE Intermediate_Dir \"WinDebug\"\r\n# PROP BASE Target_Dir \"\"\r\n# PROP Use_MFC 0\r\n# PROP Use_Debug_Libraries 1\r\n# PROP Output_Dir \"WinDebug\"\r\n# PROP Intermediate_Dir \"WinDebug\"\r\n# PROP Ignore_Export_Lib 0\r\n# PROP Target_Dir \"\"\r\n# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /O1 /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /YX /FD /c\r\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /o \"NUL\" /win32\r\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\r\n# ADD RSC /l 0x409 /d \"_DEBUG\"\r\nBSC32=bscmake.exe\r\n# ADD BASE BSC32 /nologo\r\n# ADD BSC32 /nologo\r\nLINK32=link.exe\r\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /def:\"diabloui.def\" /pdbtype:sept\r\n\r\n!ENDIF \r\n\r\n# Begin Target\r\n\r\n# Name \"DiabloUI - Win32 Release\"\r\n# Name \"DiabloUI - Win32 Debug\"\r\n# Begin Source File\r\n\r\nSOURCE=.\\diabloui.cpp\r\n# End Source File\r\n# Begin Source File\r\n\r\nSOURCE=.\\diabloui.res\r\n# End Source File\r\n# End Target\r\n# End Project\r\n"
  },
  {
    "path": "DiabloUI/DiabloUI.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\r\n  <ItemGroup Label=\"ProjectConfigurations\">\r\n    <ProjectConfiguration Include=\"Debug|Win32\">\r\n      <Configuration>Debug</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n    <ProjectConfiguration Include=\"Release|Win32\">\r\n      <Configuration>Release</Configuration>\r\n      <Platform>Win32</Platform>\r\n    </ProjectConfiguration>\r\n  </ItemGroup>\r\n  <PropertyGroup Label=\"Globals\">\r\n    <SccProjectName />\r\n    <SccLocalPath />\r\n    <ProjectGuid>{8408E35E-3CF5-4D4E-B873-AF3952CDABD4}</ProjectGuid>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <PlatformToolset>v141</PlatformToolset>\r\n    <UseOfMfc>false</UseOfMfc>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\r\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\r\n    <PlatformToolset>v141</PlatformToolset>\r\n    <UseOfMfc>false</UseOfMfc>\r\n  </PropertyGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\r\n  <ImportGroup Label=\"ExtensionSettings\">\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n    <Import Project=\"$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props\" />\r\n  </ImportGroup>\r\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"PropertySheets\">\r\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\r\n    <Import Project=\"$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props\" />\r\n  </ImportGroup>\r\n  <PropertyGroup Label=\"UserMacros\" />\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <OutDir>.\\WinRel\\</OutDir>\r\n    <IntDir>.\\WinRel\\</IntDir>\r\n    <LinkIncremental>false</LinkIncremental>\r\n  </PropertyGroup>\r\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <OutDir>.\\WinDebug\\</OutDir>\r\n    <IntDir>.\\WinDebug\\</IntDir>\r\n    <LinkIncremental>true</LinkIncremental>\r\n  </PropertyGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\r\n    <ClCompile>\r\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r\n      <InlineFunctionExpansion>Default</InlineFunctionExpansion>\r\n      <StringPooling>true</StringPooling>\r\n      <FunctionLevelLinking>true</FunctionLevelLinking>\r\n      <Optimization>MaxSpeed</Optimization>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AssemblerListingLocation>.\\WinRel\\</AssemblerListingLocation>\r\n      <PrecompiledHeaderOutputFile>.\\WinRel\\DiabloUI.pch</PrecompiledHeaderOutputFile>\r\n      <ObjectFileName>.\\WinRel\\</ObjectFileName>\r\n      <ProgramDataBaseFileName>.\\WinRel\\</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Midl>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TypeLibraryName>.\\WinRel\\DiabloUI.tlb</TypeLibraryName>\r\n      <MkTypLibCompatible>true</MkTypLibCompatible>\r\n      <RedirectOutputAndErrors>NUL</RedirectOutputAndErrors>\r\n      <TargetEnvironment>Win32</TargetEnvironment>\r\n    </Midl>\r\n    <ResourceCompile>\r\n      <Culture>0x0409</Culture>\r\n      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ResourceCompile>\r\n    <Bscmake>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <OutputFile>.\\WinRel\\DiabloUI.bsc</OutputFile>\r\n    </Bscmake>\r\n    <Link>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <LinkDLL>true</LinkDLL>\r\n      <SubSystem>Windows</SubSystem>\r\n      <ModuleDefinitionFile>diabloui.def</ModuleDefinitionFile>\r\n      <OutputFile>.\\WinRel\\DiabloUI.dll</OutputFile>\r\n      <ImportLibrary>.\\WinRel\\DiabloUI.lib</ImportLibrary>\r\n      <AdditionalDependencies>../3rdParty/Storm/Source/WinRel/Storm.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\r\n    <ClCompile>\r\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r\n      <InlineFunctionExpansion>Default</InlineFunctionExpansion>\r\n      <Optimization>Disabled</Optimization>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <WarningLevel>Level3</WarningLevel>\r\n      <MinimalRebuild>true</MinimalRebuild>\r\n      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>\r\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <AssemblerListingLocation>.\\WinDebug\\</AssemblerListingLocation>\r\n      <PrecompiledHeaderOutputFile>.\\WinDebug\\DiabloUI.pch</PrecompiledHeaderOutputFile>\r\n      <ObjectFileName>.\\WinDebug\\</ObjectFileName>\r\n      <ProgramDataBaseFileName>.\\WinDebug\\</ProgramDataBaseFileName>\r\n    </ClCompile>\r\n    <Midl>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n      <TypeLibraryName>.\\WinDebug\\DiabloUI.tlb</TypeLibraryName>\r\n      <MkTypLibCompatible>true</MkTypLibCompatible>\r\n      <RedirectOutputAndErrors>NUL</RedirectOutputAndErrors>\r\n      <TargetEnvironment>Win32</TargetEnvironment>\r\n    </Midl>\r\n    <ResourceCompile>\r\n      <Culture>0x0409</Culture>\r\n      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r\n    </ResourceCompile>\r\n    <Bscmake>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <OutputFile>.\\WinDebug\\DiabloUI.bsc</OutputFile>\r\n    </Bscmake>\r\n    <Link>\r\n      <SuppressStartupBanner>true</SuppressStartupBanner>\r\n      <LinkDLL>true</LinkDLL>\r\n      <GenerateDebugInformation>true</GenerateDebugInformation>\r\n      <SubSystem>Windows</SubSystem>\r\n      <ModuleDefinitionFile>diabloui.def</ModuleDefinitionFile>\r\n      <OutputFile>.\\WinDebug\\DiabloUI.dll</OutputFile>\r\n      <ImportLibrary>.\\WinDebug\\DiabloUI.lib</ImportLibrary>\r\n      <AdditionalDependencies>../3rdParty/Storm/Source/WinDebug/Storm.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>\r\n    </Link>\r\n  </ItemDefinitionGroup>\r\n  <ItemGroup>\r\n    <ClCompile Include=\"diabloui.cpp\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <None Include=\"diabloui.def\" />\r\n  </ItemGroup>\r\n  <ItemGroup>\r\n    <ClInclude Include=\"diabloui.h\" />\r\n  </ItemGroup>\r\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\r\n  <ImportGroup Label=\"ExtensionTargets\">\r\n  </ImportGroup>\r\n</Project>\r\n"
  },
  {
    "path": "DiabloUI/Makefile",
    "content": "VC5_DIR ?= $(HOME)/DevStudio_5.10/VC\r\n\r\n# The $(VS6_DIR) directory is a copy of the \"Microsoft Visual Studio\" directory.\r\n#\r\n# To get a working setup on Linux or other \"portable\" copies of VS,\r\n# the following DLLs have to be copied to the\r\n# $(VS6_DIR)/VC98/Bin directory.\r\n#\r\n#     - $(VS6_DIR)/Common/MSDev98/Bin/MSPDB60.DLL\r\n#\r\n# And to the $(VC5_DIR)/bin directory.\r\n#\r\n#     - $(VC5_DIR)/SharedIDE/bin/MSDIS100.DLL\r\n#     - $(VC5_DIR)/SharedIDE/bin/MSPDB50.DLL\r\nVS6_DIR ?= $(HOME)/VS6\r\n\r\nVC6_DIR     = $(VS6_DIR)/VC98\r\n\r\nVC6_BIN_DIR = $(VC6_DIR)/Bin\r\nVC6_INC_DIR = $(VC6_DIR)/Include\r\nVC6_LIB_DIR = $(VC6_DIR)/Lib\r\n\r\nVC5_LIB_DIR = $(VC5_DIR)/lib\r\n\r\nIDE_DIR ?= $(VS6_DIR)/Common/MSDev98\r\nIDE_BIN_DIR = $(IDE_DIR)/bin\r\nifeq ($(OS),Windows_NT)\r\n\tCL = $(VC6_BIN_DIR)/CL.EXE\r\n\tRC = $(IDE_BIN_DIR)/RC.EXE\r\n\tVC5_LINK = $(VC5_DIR)/bin/link.exe\r\n\tVC6_LINK = $(VC6_BIN_DIR)/link.exe\r\nelse\r\n\tCL = wine $(VC6_BIN_DIR)/CL.EXE\r\n\tRC = wine $(IDE_BIN_DIR)/RC.EXE\r\n\tVC5_LINK = wine $(VC5_DIR)/bin/link.exe\r\n\tVC6_LINK = wine $(VC6_BIN_DIR)/link.exe\r\nendif\r\n\r\nCFLAGS=/nologo /c /GX /W3 /O1 /I $(VC6_INC_DIR) /FD /MT /D \"NDEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /YX /Gm /Zi\r\nLINKFLAGS=/nologo /subsystem:windows /machine:I386 /incremental:no\r\n\r\nVC_LINK=$(VC5_LINK)\r\nLINKFLAGS+= /LIBPATH:$(VC5_LIB_DIR)\r\n\r\nall: diabloui.lib\r\n\r\nDIABLOUI_SRC=diabloui.cpp\r\nDIABLOUI_OBJS=$(DIABLOUI_SRC:.cpp=.obj)\r\n\r\ndiabloui.lib: $(DIABLOUI_OBJS) ../3rdParty/Storm/storm.lib\r\n\t$(CL) $^ /link /LINK50COMPAT /nologo /dll /subsystem:windows /machine:I386 /LIBPATH:$(VC6_LIB_DIR) /LIBPATH:../3rdParty/Storm diabloui.res advapi32.lib gdi32.lib shell32.lib user32.lib version.lib storm.lib /def:\"diabloui.def\" /out:diabloui.dll\r\n\r\n../3rdParty/Storm/storm.lib:\r\n\tmake -C ../3rdParty/Storm\r\n\r\n%.obj: %.cpp\r\n\t$(CL) $(CFLAGS) /Fo$@ $<\r\n\r\nclean:\r\n\t@$(RM) -v $(DIABLOUI_OBJS) diabloui.{exp,lib,dll} vc50.{idb,pch,pdb}\r\n\r\n.PHONY: clean all\r\n"
  },
  {
    "path": "DiabloUI/_temp_data.cpp",
    "content": "//rdata\r\nProfileStruct bnprofiles[4] = {\r\n\t{ \"profile\\\\sex\", '\\x01', 1128, 8 },\r\n\t{ \"profile\\\\age\", '\\x01', 1130, 4 },\r\n\t{ \"profile\\\\location\", '\\x01', 1132, 40 },\r\n\t{ \"profile\\\\description\", '\\x01', 1134, 200 }\r\n};\r\nint profilemsg1[6]           = { 1125, 1127, 1129, 1131, 1133, 0 };\r\nint profilemsg2[6]           = { 1126, 1128, 1130, 1132, 1134, 0 };\r\nint Connect_cpp_float_value  = 2139095040; // weak\r\nint CopyProt_cpp_float_value = 2139095040; // weak\r\nint cr8game_cpp_float_value  = 2139095040; // weak\r\nint CreaDung_cpp_float_value = 2139095040; // weak\r\nint CreaStat_cpp_float_value = 2139095040; // weak\r\nint credits_cpp_float_value  = 2139095040; // weak\r\nint DiabEdit_cpp_float_value = 2139095040; // weak\r\nint DiabloUI_cpp_float_value = 2139095040; // weak\r\nint disclaim_cpp_float_value = 2139095040; // weak\r\nint doom_cpp_float_value     = 2139095040; // weak\r\nint EntName_cpp_float_value  = 2139095040; // weak\r\nint fade_cpp_float_value     = 2139095040; // weak\r\nint focus_cpp_float_value    = 2139095040; // weak\r\nint local_cpp_float_value    = 2139095040; // weak\r\nint mainmenu_cpp_float_value = 2139095040; // weak\r\nint OkCancel_cpp_float_value = 2139095040; // weak\r\nint Sbar_cpp_float_value     = 2139095040; // weak\r\nint Sbar_cpp_float_value2    = 2139095040; // weak\r\nint SelClass_cpp_float_value = 2139095040; // weak\r\nint SelHero_cpp_float_value  = 2139095040; // weak\r\nint SelList_cpp_float_value  = 2139095040; // weak\r\nint SelLoad_cpp_float_value  = 2139095040; // weak\r\nint SelYesNo_cpp_float_value = 2139095040; // weak\r\nint Title_cpp_float_value    = 2139095040; // weak\r\nint titlesnd_cpp_float_value = 2139095040; // weak\r\nint dword_10022258           = 4;          // weak\r\nProfFntStruct proffnts[4]    = {\r\n\t{ 8, \"Arial\", 400 },\r\n\t{ 10, \"Arial\", 400 },\r\n\t{ 10, \"Arial\", 700 },\r\n\t{ 13, \"Time New Roman\", 400 }\r\n};\r\nunsigned char connect_subnet_ip[4][4] = {\r\n\t{ 13, 0, 0, 0 },      // 13.0.0.0\r\n\t{ 128, 128, 128, 0 }, // 128.128.128.0\r\n\t{ 14, 0, 0, 0 },      // 14.0.0.0\r\n\t{ 255, 255, 255, 0 }  // 255.255.255.0\r\n};\r\nint creadung_msgtbl1[3]      = { 1038, 1080, 0 };\r\nint creadung_msgtbl2[2]      = { 1097, 0 };\r\nint creadung_msgtbl3[2]      = { 1099, 0 };\r\nint creadung_msgtbl4[3]      = { 1056, 1054, 0 };\r\nint creadung_msgtbl5[4]      = { 1094, 1095, 1096, 0 };\r\nshort defstats[3][4]         = { { 30, 15, 20, 30 }, { 25, 20, 30, 20 }, { 15, 35, 25, 20 } };\r\nint dword_10022A2C[3]        = { 1038, 1080, 0 };\r\nint dword_10022A38[2]        = { 1097, 0 };\r\nint dword_10022A40[2]        = { 1102, 0 };\r\nint dword_10022A48[3]        = { 1056, 1054, 0 };\r\nint dword_10022A54[3]        = { 1100, 1101, 0 };\r\nint disclaim_msgtbl1[3]      = { 1082, 1083, 0 };\r\nint disclaim_msgtbl2[4]      = { 1084, 1085, 1086, 0 };\r\nint dword_10022AFC[2]        = { 1038, 0 };\r\nint dword_10022B04[3]        = { 1056, 1054, 0 };\r\nint dword_10022B10[2]        = { 1116, 0 };\r\nint entname_msgtbl1[2]       = { 1038, 0 };\r\nint entname_msgtbl2[3]       = { 1056, 1054, 0 };\r\nint entname_msgtbl3[2]       = { 1065, 0 };\r\nint menumsgs_1option[2]      = { 1042, 0 };\r\nint menumsgs_5options[6]     = { 1044, 1001, 1002, 1003, 2, 0 };\r\nint dword_10022C4C[2]        = { 1038, 0 };\r\nint dword_10022C54[2]        = { 1080, 0 };\r\nint dword_10022C5C[2]        = { 1108, 0 };\r\nint dword_10022CAC[2]        = { 1026, 0 };\r\nint dword_10022CB4[2]        = { 2, 0 };\r\nint selclass_msgtbl1[2]      = { 1038, 0 };\r\nint selclass_msgtbl2[3]      = { 1056, 1054, 0 };\r\nint selclass_msgtbl3[4]      = { 1062, 1063, 1064, 0 };\r\nint dword_10022ED8[3]        = { 1038, 1080, 0 };\r\nint dword_10022EE4[3]        = { 1143, 1147, 0 };\r\nint dword_10022EF0[4]        = { 1081, 1076, 1144, 0 };\r\nint dword_10022F00[2]        = { 1075, 0 };\r\nint dword_10022F08[4]        = { 1056, 1054, 1145, 0 };\r\nint dword_10022F18[7]        = { 1069, 1070, 1071, 1072, 1073, 1074, 0 };\r\nchar *off_10022F8C[4]        = { \"Entry1\", \"Entry2\", \"Entry3\", \"Entry4\" };\r\nint dword_10022F9C[2]        = { 1038, 0 };\r\nint dword_10022FA4[3]        = { 1056, 1054, 0 };\r\nint dword_10022FB0[7]        = { 1117, 1118, 1119, 1120, 1121, 1122, 0 };\r\nint selhero_msgtbl_string[2] = { 1038, 0 };\r\nint selhero_msgtbl_3[6]      = { 1057, 1058, 1059, 1060, 1061, 0 };\r\nint selhero_msgtbl_info[6]   = { 1014, 1018, 1017, 1016, 1015, 0 };\r\nint dword_100230F0[3]        = { 1038, 1080, 0 };\r\nint dword_100230FC[2]        = { 1097, 0 };\r\nint dword_10023104[2]        = { 1098, 0 };\r\nint dword_1002310C[3]        = { 1056, 1054, 0 };\r\nint dword_10023118[7]        = { 1088, 1089, 1090, 1091, 1092, 1093, 0 };\r\nint sellist_msgtbl1[2]       = { 1038, 0 };\r\nint sellist_msgtbl2[3]       = { 1056, 1054, 0 };\r\nint sellist_msgtbl3[2]       = { 1006, 0 };\r\nint sellist_msgtbl4[7]       = { 1047, 1048, 1049, 1050, 1051, 1052, 0 };\r\nint selload_msgtbl1[2]       = { 1038, 0 };\r\nint selload_msgtbl2[3]       = { 1056, 1054, 0 };\r\nint selload_msgtbl3[3]       = { 1106, 1107, 0 };\r\nint dword_100231CC[2]        = { 1038, 0 };\r\nint dword_100231D4[3]        = { 1080, 1097, 0 };\r\nint dword_100231E0[2]        = { 1123, 0 };\r\nint dword_100231E8[3]        = { 1056, 1054, 0 };\r\nint dword_100231F4[7]        = { 1110, 1111, 1112, 1113, 1114, 1115, 0 };\r\nint dword_10023244[3]        = { 1038, 1080, 0 };\r\nint dword_10023250[2]        = { 1142, 0 };\r\nint dword_10023258[2]        = { 1146, 0 };\r\nint dword_10023260[3]        = { 1056, 1054, 0 };\r\nint dword_1002326C[7]        = { 1135, 1136, 1137, 1138, 1139, 1140, 0 };\r\nint yesno_msgtbl2[2]         = { 1026, 0 };\r\nint yesno_msgtbl1[3]         = { 1109, 2, 0 };\r\nint titlemsgtbl[2]           = { 1067, 0 };\r\n\r\n//data+bss\r\nint artfont_cpp_float = 0; // weak\r\nFontStruct font42g;\r\nFontStruct *sgpCurrFont;\r\nFontStruct font30g;\r\nFontStruct font16s;\r\nFontStruct font24s;\r\nFontStruct font16g;\r\nFontStruct font24g;\r\nFontStruct font30s;\r\nFontStruct font42y;\r\nLPARAM dword_10029400;                                          // idb\r\nint dword_10029404;                                             // weak\r\nint dword_10029408;                                             // weak\r\nint dword_1002940C;                                             // weak\r\nBYTE *dword_10029410;                                           // idb\r\nint dword_10029414;                                             // weak\r\nint dword_10029418;                                             // weak\r\nint dword_1002941C;                                             // weak\r\nHGDIOBJ dword_10029420;                                         // idb\r\nHGDIOBJ dword_10029424;                                         // idb\r\nBYTE *dword_10029428;                                           // idb\r\nvoid *dword_1002942C;                                           // idb\r\nint(__stdcall *dword_10029430)(DWORD, DWORD, DWORD, DWORD); // weak\r\nvoid *dword_10029434;                                           // idb\r\nint dword_10029438[4];                                          // weak\r\nchar nullcharacter;                                             /* check */\r\nHGDIOBJ dword_10029450;                                         // idb\r\nint dword_10029454;                                             // weak\r\nint dword_10029458;                                             // weak\r\nint dword_10029460[3];                                          // idb\r\nint dword_1002946C;                                             // weak\r\nHGDIOBJ dword_10029470;                                         // idb\r\nint dword_10029478;                                             // weak\r\nint dword_10029480;                                             // weak\r\nint dword_10029488;                                             // weak\r\nint dword_1002948C;                                             // weak\r\nint Connect_cpp_float;                                          // weak\r\nint special_frames;                                             // weak\r\nDWORD heroport_data[2];\r\nchar connect_categorystr[128];\r\nchar connect_plrinfostr[128];\r\nint heronum_frames2; // weak\r\nDWORD special_data[2];\r\nint heroport_frames; // weak\r\nDWORD heronum_data[2];\r\nint heronum_frames;      // idb\r\nint connect_draw_height; // idb\r\nBYTE *connect_data1;     // idb\r\nBYTE *connect_data2;     // idb\r\nBYTE *connect_data3;     // idb\r\nvoid *connect_data4;     // idb\r\nHANDLE connect_trans[10];\r\nchar *connect_charname;\r\nint connect_color_text;    // weak\r\nHGLOBAL copyprot_popupart; // idb\r\nHGLOBAL copyprot_artpal;   // idb\r\nint CopyProt_cpp_float;    // weak\r\nHGLOBAL copyprot_btnart;   // idb\r\nHGDIOBJ cr8game_hobject;   // idb\r\nint cr8game_cpp_float;     // weak\r\nint cr8_playercount;       // weak\r\nDWORD *cr8_somegamestruct;\r\nint cr8_dword_10029638; // weak\r\nint cr8_dword_1002963C; // weak\r\nint cr8_dword_10029640; // weak\r\nint *cr8game_playerID;  // idb\r\n_gamedata cr8_gamedata;\r\nHWND cr8_sendmsg1;      // idb\r\nHWND cr8_sendmsg2;      // idb\r\nint cr8_dword_10029658; // weak\r\nDWORD cr8diffbtns_size[2];\r\nint cr8_dword_10029668; // weak\r\nint cr8_dword_1002966C; // idb\r\nchar cr8_gamename[32];\r\nchar cr8_gamepassword[32];\r\nBYTE *cr8_creat_bg_ptr;\r\nBYTE *cr8_but_xsm_ptr;       // idb\r\nBYTE *cr8_diffbtns_ptr;      // idb\r\nint creadung_playername;     // weak\r\nint *creadung_playerID;      // idb\r\nint CreaDung_cpp_float;      // weak\r\nint creadung_dword_100296C8; // weak\r\nint creadung_delspinners;    // weak\r\nDWORD *crea_somegamestruct;\r\nint creadung_lasterror;      // weak\r\nint creadung_dword_100296D8; // weak\r\nchar *creadung_gamename;\r\nint CreaStat_cpp_float;   // weak\r\nint credittext_size;      // weak\r\nint credits_cpp_float;    // weak\r\nHGLOBAL credittext_rsrc;  // idb\r\nint credit_vertical_pos2; // idb\r\nint credit_horz_pos;      // idb\r\nint credit_vertical_pos1; // weak\r\nint credit_line_count;    // weak\r\nvoid *credit_back_img;    // idb\r\nHANDLE creditsobj;        // idb\r\nint DiabEdit_cpp_float;   // weak\r\nint DiabloUI_cpp_float;   // weak\r\nint sgbUiIsInitialized;   // weak\r\nHINSTANCE ghUiInst;       // idb\r\nint backbmp_flag1;        // weak\r\nint backbmp_flag2;        // weak\r\nint backbmp_flag3;        // weak\r\nint app_is_active;        // weak\r\nint sgbIsSpawn;           // weak\r\nint dword_10029730;       // weak\r\nint dword_10029738;       // weak\r\nchar byte_1002973C;       // idb\r\nchar byte_100297BC;       // idb\r\nint dword_1002983C;       // weak\r\nint dword_10029840;       // weak\r\nint gnDlinkPlayerid;      // weak\r\nvoid *dword_10029848;     // idb\r\nint dword_1002984C;       // weak\r\nint disclaim_cpp_float;   // weak\r\nint doom_cpp_float;       // weak\r\nLPSTR dword_10029858;     // idb\r\nint dword_1002985C;       // weak\r\nint EntName_cpp_float;    // weak\r\nchar *entname_charname;\r\nint fade_cpp_float; // weak\r\nint sgbFadeRange;   // idb\r\ntagPALETTEENTRY fadepal[256];\r\nint sgbIsFading; // weak\r\nHANDLE SpinnerTransOut[8];\r\nint focus_spin_width;  // idb\r\nint focus_spin_height; // weak\r\nint focus_cpp_float;   // weak\r\nint sgbSpinnersLoaded; // weak\r\nint dword_10029CA8;    // weak\r\nint dword_10029CAC;    // weak\r\nint sgnSpinnerFrame;   // weak\r\nint local_cpp_float;   // weak\r\nDWORD gdwCursData[2];  // weak\r\ntagPALETTEENTRY artpal[256];\r\nHGDIOBJ objPalette; // idb\r\nBYTE *gpCursorArt;\r\nBYTE *gpCursorArt2;\r\nint mainmenu_cpp_float; // weak\r\nchar menu_version_str[64];\r\nint menu_item_timer;         // weak\r\nint dword_1002A120;          // weak\r\nint dword_1002A124;          // weak\r\nint dword_1002A128;          // weak\r\nint dword_1002A12C;          // weak\r\nint dword_1002A130;          // weak\r\nint dword_1002A134;          // weak\r\nint dword_1002A138;          // weak\r\nint dword_1002A13C;          // weak\r\nint gnModemPlayerid;         // weak\r\nint dword_1002A144;          // weak\r\nint dword_1002A148;          // weak\r\nvoid *dword_1002A14C;        // idb\r\nint dword_1002A150;          // weak\r\nchar byte_1002A154;          // idb\r\nchar byte_1002A1D4;          // idb\r\nint dword_1002A254;          // weak\r\nint dword_1002A258;          // weak\r\nint dword_1002A25C;          // weak\r\nint (*dword_1002A260)(void); // weak\r\nchar byte_1002A264;          // idb\r\nint OkCancel_cpp_float;      // weak\r\nint dword_1002A2E8;          // weak\r\nint dword_1002A2EC;          // weak\r\nint dword_1002A2F0;          // weak\r\nint (*dword_1002A2F4)(void); // weak\r\nint dword_1002A2F8;          // weak\r\nBOOL dword_1002A2FC;         // idb\r\nint dword_1002A300;          // weak\r\nint dword_1002A304;          // weak\r\nDWORD dword_1002A308;        // idb\r\nDWORD dword_1002A310;        // idb\r\nBYTE *dword_1002A318;        // idb\r\nBYTE *dword_1002A31C;        // idb\r\nBYTE *dword_1002A320;        // idb\r\nBYTE *dword_1002A324;        // idb\r\nvoid *dword_1002A328;        // idb\r\nint Sbar_cpp_float;          // weak\r\nint Sbar_cpp_float2;         // weak\r\nint SelClass_cpp_float;      // weak\r\nint dword_1002A34C;          // idb\r\nint dword_1002A350;          // weak\r\nint dword_1002A354;          // weak\r\nchar *dword_1002A358;        // idb\r\nint dword_1002A35C;          // weak\r\nint dword_1002A360;          // idb\r\nint dword_1002A364;          // weak\r\nint dword_1002A368;          // weak\r\nint dword_1002A36C;          // weak\r\nint dword_1002A370;          // weak\r\nint dword_1002A374;          // weak\r\nchar *dword_1002A378;        // idb\r\nint dword_1002A37C;          // weak\r\nchar byte_1002A380[128];     // weak\r\nint dword_1002A400;          // weak\r\nint dword_1002A404;          // weak\r\nint dword_1002A408;          // weak\r\nBOOL(__stdcall *selhero_fnstats)\r\n(unsigned int, _uidefaultstats *);\r\nint SelHero_cpp_float;     // weak\r\nDWORD selhero_sizedata[2]; // idb\r\nint selhero_difficulty;    // weak\r\nint selhero_hero_hassaved; // weak\r\nint selhero_numheroesleft; // weak\r\nchar selhero_herolevel[4];\r\nBOOL(__stdcall *selhero_fnremove)\r\n(_uiheroinfo *);\r\nBOOL(__stdcall *selhero_fninfo)\r\n(BOOL(__stdcall *fninfo)(_uiheroinfo *));\r\nchar selhero_heromag[4];\r\nchar selhero_heronamestr[16];\r\nBOOL(__stdcall *selhero_fncreate)\r\n(_uiheroinfo *);\r\nchar selhero_herodex[4];\r\n_uiheroinfo *sgpHeroInfo;\r\nint selhero_is_created; // weak\r\n_uiheroinfo heroinfo_create;\r\nint selhero_is_good; // idb\r\nchar selhero_herostr[4];\r\nchar selhero_herovit[4];\r\nBYTE *selhero_buffer;\r\nint dword_1002A49C;    // weak\r\nvoid *dword_1002A4A0;  // idb\r\nint dword_1002A4A4;    // weak\r\nint gnIpxPlayerid;     // weak\r\nint dword_1002A4AC;    // weak\r\nint dword_1002A4B0;    // weak\r\nint dword_1002A4B4;    // weak\r\nint dword_1002A4B8;    // idb\r\nint dword_1002A4BC;    // weak\r\nint SelList_cpp_float; // weak\r\n_uiheroinfo *sellist_pheroinfo;\r\nint SelLoad_cpp_float;       // weak\r\nint dword_1002A4CC;          // weak\r\nint dword_1002A4D0;          // weak\r\nvoid *dword_1002A4D4;        // idb\r\nint dword_1002A4D8;          // idb\r\nint dword_1002A4DC;          // weak\r\nint dword_1002A4E0;          // weak\r\nint dword_1002A4E4;          // weak\r\nint dword_1002A4E8;          // weak\r\n_uiheroinfo *dword_1002A4EC; // idb\r\nint dword_1002A4F0;          // weak\r\nint dword_1002A4F4;          // idb\r\nchar *yesno_dialog_string;\r\nint SelYesNo_cpp_float; // weak\r\nint yesno_remove_focus; // weak\r\nchar *yesno_hero_name;\r\nint (*YesNoFunc)(void); // weak\r\nint yesno_is_popup;     // weak\r\nHANDLE titlePHTrans[30];\r\nint Title_cpp_float;    // weak\r\nint titleTransIdx;      // weak\r\nint titlesnd_cpp_float; // weak\r\nvoid(__stdcall *gfnSoundFunction)(const char *file);\r\n"
  },
  {
    "path": "DiabloUI/_temp_funcs.h",
    "content": "void __fastcall artfont_SetArtFont(int nFont);\r\nvoid __cdecl artfont_InitAllFonts();\r\nvoid __cdecl artfont_FreeAllFonts();\r\nvoid __fastcall artfont_FreeArtFont(FontStruct *pFont);\r\nBOOL __cdecl artfont_LoadAllFonts();\r\nvoid __fastcall artfont_LoadArtFont(FontStruct *pFont, const char *pszBinFile, const char *pszFileName);\r\nint __cdecl artfont_GetFontMaxHeight();\r\nint __cdecl artfont_GetFontDefWidth();\r\nint __fastcall artfont_GetFontWidth(char *str);\r\nvoid __cdecl j_artfont_cpp_init();\r\nvoid __cdecl artfont_cpp_init();\r\nint __fastcall artfont_GetFontBreak(char *str);\r\nvoid __cdecl artfont_delete_operator(void *ptr);\r\nvoid __fastcall artfont_PrintFontStr(char *str, DWORD **pSurface, int sx, int sy);\r\n\r\nsigned int bn_prof_100014E8();\r\n//const char *UiProfileGetString();\r\n//BOOL __stdcall UiProfileCallback(int a1, int a2, int a3, int a4, LPARAM a5, int a6, int a7, int a8, int (__stdcall *a9)(DWORD, DWORD, DWORD, DWORD));\r\nHGDIOBJ __stdcall bn_prof_1000155F(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid UNKCALL bn_prof_100016DD(HWND arg);\r\nvoid __fastcall bn_prof_100018CE(int a1, int a2);\r\nint __fastcall bn_prof_10001938(HDC a1, DWORD *a2, char *a3, int a4, int a5);\r\nint __fastcall bn_prof_10001A10(HWND a1, HWND a2);\r\nHINSTANCE __fastcall bn_prof_10001B0A(HWND a1, const CHAR *a2);\r\nHWND UNKCALL bn_prof_10001C0E(HWND hWnd);\r\nvoid __fastcall bn_prof_10001CB9(DWORD *a1, int a2, void(__fastcall *a3)(BYTE *, DWORD, int), int a4);\r\nBOOL UNKCALL bn_prof_10001CF3(HWND hWnd);\r\nHFONT __fastcall bn_prof_10001D81(HWND hWnd, int a2, int a3);\r\nvoid UNKCALL bn_prof_10001E34(void *arg);\r\nvoid __fastcall bn_prof_10001E4C(char *a1, LPARAM lParam, HWND hDlg);\r\nvoid __fastcall bn_prof_10001ED0(char *a1, BYTE *a2, int a3);\r\nvoid *bn_prof_10001F29();\r\nBYTE *bn_prof_10001F84();\r\n//int __stdcall UiProfileDraw(int, int, int, int, HGDIOBJ ho, int, int, int, int, int, int); // idb\r\nBOOL bn_prof_100021C4();\r\nvoid *bn_prof_10002247();\r\nint j_bn_prof_10002282();\r\nDWORD *bn_prof_10002282();\r\nvoid __cdecl bn_prof_10002298();         // idb\r\nint UNKCALL bn_prof_100022A2(HWND hWnd); // idb\r\nint UNKCALL bn_prof_10002353(HGDIOBJ h); // idb\r\nHGDIOBJ bn_prof_100023D8();\r\nDWORD *__fastcall bn_prof_10002410(HDC hdc, DWORD *a2);\r\nsigned int __fastcall bn_prof_10002456(int a1, const CHAR *a2, char a3, DWORD *a4);\r\nsigned int bn_prof_100026B9();\r\nsigned int UNKCALL bn_prof_100026C4(DWORD *arg);\r\nvoid UNKCALL bn_prof_100026F0(DWORD *arg);\r\nint UNKCALL bn_prof_10002749(DWORD *arg, DWORD *location);\r\nDWORD *UNKCALL bn_prof_10002782(int *arg, int a2, int a3, char a4);\r\nDWORD *UNKCALL bn_prof_100027CE(DWORD *arg);\r\nvoid UNKCALL bn_prof_100027D8(DWORD *arg);\r\nDWORD *UNKCALL bn_prof_1000280C(int *arg, DWORD *a2, int a3, DWORD *a4);\r\nvoid UNKCALL bn_prof_1000287D(DWORD *arg);\r\nvoid UNKCALL bn_prof_10002890(DWORD *arg);\r\n\r\nvoid UNKCALL BNetGW_100028C2(DWORD *arg);\r\nvoid UNKCALL BNetGW_100029BF(DWORD *arg, int a2);\r\nvoid *UNKCALL BNetGW_10002A07(DWORD *arg);\r\nDWORD *UNKCALL BNetGW_10002A84(DWORD *arg, signed int a2);\r\nsigned int BNetGW_10002AE5();\r\nint UNKCALL BNetGW_10002AF0(DWORD *arg, char *a2);\r\nBYTE *UNKCALL BNetGW_10002B21(DWORD *arg, signed int a2);\r\nvoid UNKCALL BNetGW_10002B51(DWORD *arg, signed int a2);\r\nchar *UNKCALL BNetGW_10002B78(void *arg, char *a2);\r\nchar *UNKCALL BNetGW_10002C23(DWORD *arg);\r\nint UNKCALL BNetGW_10002C51(DWORD *arg);\r\nint UNKCALL BNetGW_10002DBF(DWORD *arg);\r\nchar *__stdcall BNetGW_10002DEB(char *a1, unsigned int a2);\r\nchar *__stdcall BNetGW_10002E0B(char *a1, unsigned int a2);\r\n\r\nvoid __cdecl Connect_FreeConnectData();\r\nBOOL __cdecl Connect_LoadGFXAndStuff();\r\nBOOL __stdcall UiArtCallback(int game_type, unsigned int art_code, PALETTEENTRY *pPalette, void *pBuffer, DWORD dwBuffersize, DWORD *pdwWidth, DWORD *pdwHeight, DWORD *pdwBpp);\r\nvoid __cdecl j_Connect_cpp_init();\r\nvoid __cdecl Connect_cpp_init();\r\nBOOL __stdcall UiGetDataCallback(int game_type, int data_code, void *a3, int a4, int a5);\r\nBOOL __stdcall UiSoundCallback(int a1, int type, int a3);\r\nBOOL __stdcall UiAuthCallback(int a1, char *a2, char *a3, char a4, char *a5, LPSTR lpBuffer, int cchBufferMax);\r\nBOOL __stdcall UiDrawDescCallback(int game_type, COLORREF color, LPCSTR lpString, char *a4, int a5, UINT align, time_t a7, HDC *a8);\r\nBOOL __stdcall UiCategoryCallback(int a1, int a2, int a3, int a4, int a5, DWORD *a6, DWORD *a7);\r\nint __fastcall Connect_GetRankFromLevel(char *str);\r\nBOOL __fastcall Connect_DiffFromString(char *str, _gamedata *gamedata, int a3, int a4);\r\nvoid __fastcall Connect_SetDiffString(_gamedata *gamedata, const char *str1, char *str2, char *str3, int size);\r\nBOOL __fastcall Connect_GetHeroInfoConc(const char *a1, _uiheroinfo *pInfo);\r\nvoid __fastcall Connect_MakeDescString(_uiheroinfo *a1, char *name, size_t size);\r\nvoid __stdcall UiCreateGameCriteria(_uiheroinfo *pInfo, char *str);\r\nBOOL __stdcall UiCreatePlayerDescription(_uiheroinfo *info, DWORD mode, char *desc);\r\nvoid __stdcall UiSetupPlayerInfo(char *infostr, _uiheroinfo *pInfo, DWORD type);\r\nvoid __fastcall Connect_CopyPlrDescStrings(char *str1, int size1, char *str2, int size2);\r\n\r\nBOOL __stdcall UiCopyProtError(int *pdwResult);\r\nLRESULT __stdcall CopyProt_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __cdecl CopyProt_FreeCopyResrcs();\r\nBOOL __fastcall CopyProt_LoadCopyStuff(HWND hWnd, int a2);\r\nvoid __fastcall CopyProt_EndCopyDlg(HWND hWnd, int a2);\r\nvoid __cdecl j_CopyProt_cpp_init();\r\nvoid __cdecl CopyProt_cpp_init();\r\n\r\nvoid __cdecl j_cr8game_cpp_init();\r\nvoid __cdecl cr8game_cpp_init();\r\nBOOL __fastcall cr8game_GetSnetCreaGame(HWND hWnd);\r\nBOOL __stdcall UiCreateGameCallback(int a1, int a2, int a3, int a4, int a5, int a6);\r\nLRESULT __stdcall cr8game_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __cdecl cr8game_FreeCreaStuff();\r\nBOOL __fastcall cr8game_LoadCreaGFX(HWND hWnd);\r\nvoid __fastcall cr8game_FreeMainMem(HWND hWnd);\r\nvoid __fastcall cr8game_AllocMainMem(HWND hWnd);\r\nvoid __fastcall cr8game_DoAROP3Blit(HWND hWnd, int frame, int size);\r\nvoid __fastcall cr8game_SendMessageF5(HWND hWnd);\r\nvoid __fastcall cr8game_BlitCr8Dialog(HWND hWnd, int a2);\r\nvoid __fastcall cr8game_SetWindowStr(HWND hWnd, int dlgitem, int a3);\r\nint __fastcall cr8game_CheckValidGameName(char *name);\r\nHFONT __fastcall cr8game_GetCr8Object(HWND hWnd);\r\n\r\nvoid __fastcall CreaDung_SetDelSpin(int a1);\r\nvoid __cdecl j_CreaDung_cpp_init();\r\nvoid __cdecl CreaDung_cpp_init();\r\nLRESULT __stdcall CreaDung_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall CreaDung_ParseDungProcs(HWND hWnd, int dlg);\r\nvoid __fastcall CreaDung_FreeDungProcs(HWND hWnd);\r\nvoid __fastcall CreaDung_LoadDungGFX(HWND hWnd);\r\nvoid __fastcall CreaDung_PlaySndAndKill(HWND hWnd, int a2);\r\nvoid __fastcall CreaDung_DoAllPlaySnd(HWND hWnd);\r\nvoid __fastcall CreaDung_DoSnetCreaGame(HWND hWnd);\r\nvoid __fastcall CreaDung_CheckDlgForSnd(HWND hWnd, int a2, int a3);\r\nBOOL __fastcall CreaDung_SelDungDiff(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8);\r\n\r\nBOOL __stdcall UiGetDefaultStats(int pclass, _uidefaultstats *pStats);\r\nvoid __cdecl j_CreaStat_cpp_init();\r\nvoid __cdecl CreaStat_cpp_init();\r\n\r\nvoid __cdecl j_credits_cpp_init();\r\nvoid __cdecl credits_cpp_init();\r\nBOOL __stdcall UiCreditsDialog(int a1);\r\nLRESULT __stdcall credits_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall credits_FreeCreditResrc(HWND hWnd);\r\nvoid __fastcall credits_LoadImgCreditTxt(HWND hWnd, LPARAM lParam);\r\nvoid __fastcall credits_CalcPosROP3(HWND hWnd);\r\nvoid __fastcall credits_PrintCredLines(HWND hWnd);\r\nint __fastcall credits_GetCredLineBreak(char *str);\r\nchar *__fastcall credits_GetAdjustText(char *str, int len);\r\n\r\nvoid __fastcall DiabEdit_DoPaintBMP(HWND hWnd);\r\nvoid __cdecl j_DiabEdit_cpp_init();\r\nvoid __cdecl DiabEdit_cpp_init();\r\nvoid __cdecl DiabEdit_SetupWindow();\r\nLRESULT __stdcall DiabEdit_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall DiabEdit_SendWndCommand(HWND hWnd, WORD a2);\r\nvoid __fastcall DiabEdit_GetCursorProp(HWND hWnd);\r\nvoid __fastcall DiabEdit_RestrictAndLimit(HWND hWnd, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall DiabEdit_SetTextAndProp(HWND hWnd, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall DiabEdit_SetRestrictString(HWND hWnd, LPARAM lParam);\r\nvoid __fastcall DiabEdit_SetRestrictTimer(HWND hWnd);\r\nvoid __fastcall DiabEdit_RemoveAllProps(HWND hWnd);\r\n\r\nint __cdecl DiabloUI_GetSpawned();\r\nvoid __stdcall UiOnPaint(int a1);\r\nvoid __stdcall UiSetBackgroundBitmap(int a1, PALETTEENTRY *a2, int a3, int a4, int a5);\r\nvoid __stdcall UiSetSpawned(BOOL bSpawned);\r\nvoid __stdcall UiInitialize();\r\nvoid __stdcall UiDestroy();\r\nvoid __stdcall UiAppActivate(BOOL bActive);\r\nBOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);\r\nvoid __cdecl j_DiabloUI_cpp_init();\r\nvoid __cdecl DiabloUI_cpp_init();\r\n\r\nsigned int DirLink_10005CFA();\r\nBOOL __fastcall DirLink_10005D05(int a1, int a2, int a3, DWORD *a4, int a5, int playerid);\r\nint __stdcall DirLink_10005D63(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam);\r\nint __fastcall DirLink_10005EB2(HWND hDlg, int a2);\r\nint UNKCALL DirLink_10005F1F(HWND hDlg); // idb\r\nint UNKCALL DirLink_10005F7B(HWND hWnd); // idb\r\nint __fastcall DirLink_10006047(int a1, int a2);\r\nvoid UNKCALL DirLink_10006073(void *arg);\r\nHWND UNKCALL DirLink_100060D1(HWND arg);\r\nint UNKCALL DirLink_10006141(void *arg);\r\nint UNKCALL DirLink_100061E1(void *arg);\r\nint UNKCALL DirLink_100062BF(void *arg, int a2, char *a3, char *a4);\r\nsigned int __stdcall DirLink_1000632B(int a1, char *a2, char *a3);\r\nHWND __fastcall DirLink_10006359(HWND hWnd, int a2, int height);\r\n\r\nBOOL __stdcall UiBetaDisclaimer(int a1);\r\nLRESULT __stdcall disclaim_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall disclaim_DelDisclaimProcs(HWND hWnd);\r\nvoid __fastcall disclaim_LoadDisclaimGFX(HWND hWnd);\r\nvoid __fastcall disclaim_FadeFromDisclaim(HWND hWnd);\r\nvoid __cdecl j_disclaim_cpp_init();\r\nvoid __cdecl disclaim_cpp_init();\r\n\r\nvoid __cdecl j_Doom_cpp_init();\r\nvoid __cdecl Doom_cpp_init();\r\nvoid __fastcall Doom_ParseWndProcs(HWND hWnd, int *msgtbl, int nFont, int a4);\r\nvoid __fastcall Doom_GetSetWndText(HWND hWnd, int msg, int nFont, int a4);\r\nvoid __fastcall Doom_PrintStrWithSpin(HWND hWnd, BOOL a2);\r\nvoid __fastcall Doom_AllocAndSetBMP(HWND hWnd, int a2, int bmp_flags); /* check args, __stdcall? */\r\nvoid __fastcall Doom_GetWindowROP3(HWND hWnd1, HWND hWnd2);\r\nvoid __fastcall Doom_ParseWndProc2(HWND hWnd, int *msgtbl, int nFont, int a4);\r\nvoid __fastcall Doom_GetSetWndTxt2(HWND hWnd, int msg, int nFont, int a4);\r\nvoid __fastcall Doom_ParseWndProc3(HWND hWnd, int *msgtbl, int nFont);\r\nvoid __fastcall Doom_GetSetWndTxt3(HWND hWnd, int msg, int nFont);\r\nvoid __fastcall Doom_PrintStrWithSpn2(HWND hWnd, int justify_type);\r\nvoid __fastcall Doom_ParseWndProc4(HWND hWnd, int *msgtbl, int nFont);\r\nvoid __fastcall Doom_GetSetWndTxt4(HWND hWnd, int msg, int nFont);\r\nvoid __fastcall Doom_ParseWndProc5(HWND hWnd, int *msgtbl, int nFont);\r\nvoid __fastcall Doom_GetSetWndTxt5(HWND hWnd, int msg, int nFont);\r\nvoid __fastcall Doom_PrintTextMsg403(HWND hWnd);\r\nvoid __fastcall Doom_ParseWndProc6(HWND hWnd, int *msgtbl, int nFont);\r\nvoid __fastcall Doom_GetSetWndTxt6(HWND hWnd, int msg, int nFont);\r\nvoid __fastcall Doom_DeleteFreeProcs(HWND hWnd, int *msgtbl);\r\n\r\nint __stdcall EntDial_10006C96(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nHWND UNKCALL EntDial_10006D78(HWND hDlg);\r\nHWND USERCALL EntDial_10006DB8(HWND hWnd, int a2);\r\nint __fastcall EntDial_10006EA7(HWND hDlg, int a2);\r\nvoid __fastcall EntDial_10006EE8(HWND hWnd, unsigned int a2, int a3);\r\nint __fastcall EntDial_10006F16(HWND hDlg, int, int); // idb\r\nsigned int EntDial_10006F71();\r\n\r\nLRESULT __stdcall EntName_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall EntName_DelEntNameMsgs(HWND hWnd);\r\nvoid __fastcall EntName_LoadFocusChkName(HWND hWnd);\r\nvoid __fastcall EntName_SetCharName(HWND hWnd, int a2);\r\nvoid __fastcall EntName_GetMessageName(HWND hWnd, unsigned int a2, int a3);\r\nvoid __cdecl j_EntName_cpp_init();\r\nvoid __cdecl EntName_cpp_init();\r\n\r\nvoid __fastcall Fade_ApplyPaletteRange(int range1, int range2);\r\nvoid __fastcall Fade_UpdatePaletteRange(int range);\r\nBOOL __cdecl Fade_CheckRange5();\r\nvoid __cdecl Fade_Range5SetZero();\r\nvoid __fastcall Fade_NoInputAndArt(HWND hWnd, BOOL bShowCurs);\r\nvoid __fastcall Fade_SetInputWindow(HWND hWnd);\r\nvoid __fastcall Fade_SetFadeTimer(int nTime);\r\nvoid __stdcall Fade_TimerFunctionDlg(int a1, int a2, int a3, int a4);\r\nvoid __cdecl j_Fade_cpp_init();\r\nvoid __cdecl Fade_cpp_init();\r\n\r\nvoid __fastcall Focus_CheckPlayMove(LPARAM lParam);\r\nint __cdecl Focus_GetSpinWidthOrZero();\r\nvoid __fastcall Focus_BlitSpinner(HWND hWnd1, HWND hWnd2);\r\nvoid __fastcall Focus_CenterSpinFromSide(HWND hWnd);\r\nvoid __fastcall Focus_GetAndBlitSpin(HWND hWnd, LPARAM lParam);\r\nBOOL __fastcall Focus_DoBlitSpinIncFrame(HWND hWnd1, HWND hWnd2);\r\nvoid __cdecl Focus_DeleteSpinners();\r\nvoid __cdecl Focus_ResetSpinToZero();\r\nvoid __cdecl j_Focus_cpp_init();\r\nvoid __cdecl Focus_cpp_init();\r\nvoid __fastcall Focus_LoadSpinner(const char *pszFileName);\r\nvoid __fastcall Focus_SetFocusTimer(HWND hWnd, const char *pszFileName);\r\nvoid __stdcall Focus_SetFocusAndBlit(int hWnd, int a2, int a3, int a4);\r\nvoid __fastcall Focus_KillFocusTimer(HWND hWnd);\r\n\r\nvoid __cdecl local_InitUiPalette();\r\nvoid __cdecl local_DelUiPalette();\r\ntagPALETTEENTRY *__fastcall local_GetArtPalEntry(int entry);\r\nvoid __fastcall local_ClearPalette(PALETTEENTRY *pPal);\r\nvoid __cdecl local_ClearSurface();\r\nBOOL __fastcall local_LoadArtImage(const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize);\r\nBOOL __fastcall local_LoadArtWithPal(HWND hWnd, int a2, char *src, int mask, int flags, const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize, BOOL a9);\r\nvoid __fastcall local_AdjustRectSize(tagRECT *pRect, int a2, int a3);\r\nBOOL __fastcall local_SetStaticBmp(HWND hWnd, int nIDDlgItem, BYTE *pBuffer, DWORD *pdwSize);\r\nvoid __cdecl j_local_cpp_init();\r\nvoid __cdecl local_cpp_init();\r\nBOOL __fastcall local_SetButtonBmp(HWND hWnd, int flags, int a7, void *pBuffer, DWORD *pdwSize);\r\nvoid __fastcall local_FitButtonDlg(HWND hWnd, int *a2, void *pBuffer, DWORD *pdwSize);\r\nvoid __fastcall local_SetWhiteText(HDC hdc);\r\nBOOL __fastcall local_GetBottomRect(HWND hWnd1, HWND hWnd2, int width, int height);\r\nvoid __fastcall local_DlgDoPaint(HWND hWnd);\r\nvoid __fastcall local_DoUiWndProc(HWND hWnd, DWORD *pdwMsgTbl);\r\nLRESULT __stdcall local_PostUiWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall local_DoUiWndProc2(HWND hWnd, DWORD *pdwMsgTbl);\r\nLRESULT __stdcall local_PostUiWndProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r\nBOOL __fastcall local_DisableKeyWaitMouse(HWND hWnd);\r\nDWORD *__cdecl local_AllocWndLongData();\r\nvoid __fastcall local_FreeMemPtr(void **p);\r\nvoid __fastcall local_SetWndLongStr(int WndLongData, const char *pszStr);\r\nvoid __cdecl local_LoadArtCursor();\r\nvoid __cdecl local_InitArtCursor();\r\nvoid __cdecl local_FreeArtCursor();\r\nvoid __cdecl local_SetCursorArt();\r\nvoid __cdecl local_SetCursorDefault();\r\nvoid __fastcall local_SetDiabloCursor(HWND hWnd);\r\n\r\nvoid __cdecl j_MainMenu_cpp_init();\r\nvoid __cdecl MainMenu_cpp_init();\r\nBOOL __stdcall UiMainMenuDialog(char *name, int *pdwResult, void(__stdcall *fnSound)(char *file), int attractTimeOut);\r\nLRESULT __stdcall MainMenu_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall MainMenu_KillAndFreeMenu(HWND hWnd);\r\nvoid __fastcall MainMenu_SetMenuTimer(HWND hWnd);\r\nvoid __fastcall MainMenu_LoadMenuGFX(HWND hWnd);\r\nvoid __fastcall MainMenu_DoOptions(HWND hWnd, int option, int PlaySelect);\r\nBOOL __cdecl MainMenu_CheckEnoughMemory();\r\nvoid __fastcall MainMenu_CheckWParamFocus(HWND hWnd, WPARAM wParam);\r\n\r\nint Modem_1000855D();\r\nHWND __fastcall Modem_10008563(HWND hDlg, const char *edx0, int a2);\r\nint __stdcall Modem_100085D8(int, char *, char *); // idb\r\nBOOL Modem_10008606();\r\nchar *Modem_1000863D();\r\nsigned int Modem_10008648();\r\nint Modem_10008653();\r\nint Modem_10008659();\r\nint UNKCALL Modem_1000865F(char *); // idb\r\nBOOL __fastcall Modem_10008680(int a1, int a2, int a3, DWORD *a4, int a5, int playerid);\r\nint __stdcall Modem_100086DE(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nvoid **UNKCALL Modem_1000879E(HWND hDlg);\r\nBOOL UNKCALL Modem_100087DB(HWND hWnd);\r\nint Modem_10008888();\r\nint UNKCALL Modem_100088DB(HWND hWnd);         // idb\r\nint UNKCALL Modem_1000893D(HWND hWnd);         // idb\r\nint __fastcall Modem_10008A38(HWND hWnd, int); // idb\r\nvoid __cdecl Modem_10008B42(char *a1);\r\nint UNKCALL Modem_10008BB7(HWND hWnd); // idb\r\nint UNKCALL Modem_10008BFE(HWND hWnd); // idb\r\n\r\nint __stdcall ModmStat_10008C62(char *, int, int, int, int); // idb\r\nint UNKCALL ModmStat_10008C87(void *arg);\r\nint __stdcall ModmStat_10008CA0(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nint UNKCALL ModmStat_10008DB3(HWND hDlg);                                           // idb\r\nBOOL UNKCALL ModmStat_10008DE4(HWND hWnd);\r\nint __fastcall ModmStat_10008E89(int a1, int a2);\r\nvoid UNKCALL ModmStat_10008EBF(HWND hDlg);\r\nsigned int ModmStat_10008F26();\r\n\r\nBOOL __fastcall OkCancel_DrawString(HWND hWnd, char *str);\r\nvoid __cdecl j_OkCancel_cpp_init();\r\nvoid __cdecl OkCancel_cpp_init();\r\nLRESULT __stdcall OkCancel_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall OkCancel_FreeDlgBmp(HWND hWnd);\r\nBOOL __fastcall OkCancel_LoadOkCancGFX(HWND hWnd, DWORD *lParam);\r\nvoid __fastcall OkCancel_PlaySndEndDlg(HWND hWnd, int a2);\r\nvoid __fastcall OkCancel_DoOkDialog(HWND hWnd, char *str, int a3);\r\nvoid __stdcall UiMessageBoxCallback(HWND hWnd, char *lpText, LPCSTR lpCaption, UINT uType);\r\n\r\nsigned int Progress_10009480();\r\n//BOOL __stdcall UiProgressDialog(int a1, int a2, BOOL a3, int (*a4)(void), int a5);\r\nint __stdcall Progress_100094F4(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nvoid *Progress_100095EC();\r\nBOOL __fastcall Progress_10009675(HWND hWnd, const CHAR *edx0);\r\nBOOL __fastcall Progress_10009805(HWND hWnd, int a2);\r\nvoid Progress_100098B0();\r\nvoid UNKCALL Progress_100098C5(HWND hWnd);\r\nBOOL UNKCALL Progress_1000991C(HWND hWnd);\r\n\r\nvoid __cdecl j_Sbar_cpp_init();\r\nvoid __cdecl Sbar_cpp_init();\r\nBOOL __fastcall Sbar_CheckIfNextHero(HWND hWnd);\r\nint __fastcall Sbar_NumScrollLines(HWND hWnd, int width, int height);\r\nvoid __fastcall Sbar_DrawScrollBar(HWND hWnd, int nIDDlgItem, int width, int height);\r\nvoid __fastcall Sbar_LoadScrBarGFX(HWND hWnd, int nIDDlgItem);\r\nvoid __cdecl j_Sbar_cpp_init2();\r\nvoid __cdecl Sbar_cpp_init2();\r\nvoid __fastcall Sbar_FreeScrollBar(HWND hWnd, int nIDDlgItem);\r\n\r\nLRESULT __stdcall SelClass_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall SelClass_FreeClassMsgTbl(HWND hWnd);\r\nvoid __fastcall SelClass_LoadClassFocus(HWND hWnd);\r\nvoid __fastcall SelClass_SetDefaultStats(HWND hWnd, int a2);\r\nvoid __fastcall SelClass_CheckClassSpawn(HWND hWnd, int a2);\r\nvoid __cdecl j_SelClass_cpp_init();\r\nvoid __cdecl SelClass_cpp_init();\r\n\r\nvoid *SelConn_1000A082();\r\nsigned int SelConn_1000A09B();\r\nint __stdcall SelConn_1000A0A6(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam);\r\nHWND __fastcall SelConn_1000A226(HWND hDlg, int nIDDlgItem);\r\nHWND UNKCALL SelConn_1000A3E2(HWND hDlg);\r\nint SelConn_1000A3FF();\r\nvoid UNKCALL SelConn_1000A43A(HWND hDlg);\r\nBOOL __fastcall SelConn_1000A4B9(DWORD *a1);\r\nBOOL UNKCALL SelConn_1000A4CD(void *location);\r\nHWND UNKCALL SelConn_1000A4E4(HWND hWnd, char *a2, int a3);\r\nsigned int __stdcall SelConn_1000A5F3(int a1, char *a2, char *a3, int a4);\r\nint __fastcall SelConn_1000A670(HWND a1, const char *a2);\r\nvoid UNKCALL SelConn_1000A6EC(HWND hDlg);\r\nLRESULT __stdcall SelConn_1000A73E(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nHWND UNKCALL SelConn_1000A866(HWND hWnd);\r\nHWND UNKCALL SelConn_1000A8D7(HWND hWnd);\r\nHWND UNKCALL SelConn_1000A948(HWND hWnd);\r\nint UNKCALL SelConn_1000A9F3(HWND hWnd); // idb\r\nDWORD *__fastcall SelConn_1000AA28(int a1);\r\nHWND UNKCALL SelConn_1000AA3B(HWND hWnd);\r\nHWND UNKCALL SelConn_1000AAEB(HWND hWnd);\r\nHWND UNKCALL SelConn_1000AB83(HWND hWnd);\r\nint __fastcall SelConn_1000AC07(int a1, int a2);\r\nint UNKCALL SelConn_1000AC30(HWND arg);\r\nint UNKCALL SelConn_1000AC9E(HWND hWnd); // idb\r\nint UNKCALL SelConn_1000ADA8(HWND hWnd); // idb\r\nBOOL UNKCALL SelConn_1000ADD0(HWND hWnd);\r\nint __fastcall SelConn_1000AE19(int a1, UINT a2);\r\nHWND __fastcall SelConn_1000AE59(HWND hWnd, int a2, int height);\r\n//signed int __stdcall UiSelectProvider(int a1, int a2, int a3, int a4, char *a5, int *a6);\r\n\r\nint UNKCALL SelDial_1000B011(char *arg);\r\nsigned int SelDial_1000B0C4();\r\nint __stdcall SelDial_1000B0CF(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nHWND __fastcall SelDial_1000B1FB(HWND hWnd, int a2);\r\nHWND UNKCALL SelDial_1000B29A(HWND hDlg);\r\nint __fastcall SelDial_1000B2D8(int a1, int a2);\r\nHWND UNKCALL SelDial_1000B354(HWND hDlg);\r\nHWND UNKCALL SelDial_1000B3D8(HWND hDlg);\r\nHWND UNKCALL SelDial_1000B44C(HWND hDlg);\r\nHWND USERCALL SelDial_1000B483(HWND hWnd, int a2);\r\nint SelDial_1000B5D9();\r\nint __fastcall SelDial_1000B614(HWND hWnd, int, int); // idb\r\n\r\nvoid UNKCALL SelGame_1000B66A(void *arg);\r\nint SelGame_1000B671();\r\nvoid UNKCALL SelGame_1000B677(void *arg);\r\nint SelGame_1000B67E();\r\n//int __stdcall UiSelectGame(int, int, void *, int, int, int); // idb\r\nsigned int SelGame_1000B795();\r\n\r\n_uiheroinfo *__cdecl SelHero_GetCurrentHeroInfo();\r\nint __cdecl SelHero_GetNumHeroesLeft();\r\nvoid __fastcall SelHero_SetHeroDifficulty(int diff);\r\nchar *__cdecl SelHero_GetHeroNameStr();\r\n_uiheroinfo *__cdecl SelHero_AllocHeroInfo();\r\nint __cdecl SelHero_GetHeroIsGood();\r\nint __fastcall SelHero_SetClassStats(int heroclass, _uidefaultstats *pStats);\r\nvoid __cdecl j_SelHero_cpp_init();\r\nvoid __cdecl SelHero_cpp_init();\r\nvoid __fastcall SelHero_SetStaticBMP(HWND hWnd, int adjust_size);\r\nvoid __fastcall SelHero_PrintHeroInfo(HWND hWnd, _uiheroinfo *pInfo);\r\nvoid __fastcall SelHero_SetStringWithMsg(HWND hWnd, const char *str);\r\nBOOL __fastcall SelHero_IsNameReserved(const char *name);\r\nvoid __fastcall SelHero_SetLastNamePos(char *name);\r\nBOOL __fastcall SelHero_NameHasChar(const char *name, char *illegalchrs);\r\nBOOL __fastcall UiValidPlayerName(const char *name);\r\nBOOL __stdcall UiSelHeroMultDialog(BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), BOOL(__stdcall *fncreate)(_uiheroinfo *), BOOL(__stdcall *fnremove)(_uiheroinfo *), BOOL(__stdcall *fnstats)(int, _uidefaultstats *), int *dlgresult, int *a6, char *name);\r\nLRESULT __stdcall SelHero_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall SelHero_DoStuffWithStrings(HWND hWnd);\r\n_uiheroinfo *__fastcall SelHero_GetNextHeroFromStr(_uiheroinfo *pInfo, char *name);\r\nvoid __fastcall SelHero_FreeSomeMemory(void *ptr);\r\n_uiheroinfo *__fastcall SelHero_GetHeroSlotFromName(_uiheroinfo *pInfo, const char *name);\r\nvoid __fastcall SelHero_DoHeroSelList(HWND hWnd);\r\nvoid __fastcall SelHero_DoHeroSelClass(HWND hWnd);\r\nvoid __fastcall SelHero_DoEnterName(HWND hWnd);\r\nBOOL __fastcall SelHero_CreateHero(HWND hWnd, char *name);\r\nvoid __fastcall SelHero_DoSelLoad(HWND hWnd);\r\nvoid __fastcall SelHero_DoSelDiff(HWND hWnd);\r\nvoid __fastcall SelHero_DeleteAndFree(HWND hWnd);\r\nvoid __fastcall SelHero_FreeAllHeroes(_uiheroinfo *pInfo);\r\nvoid __fastcall SelHero_DoHeroEndFade(HWND hWnd, int a2);\r\nvoid __fastcall SelHero_LoadHeroGFX(HWND hWnd);\r\nvoid __fastcall SelHero_SelectHeroRegion(HWND hWnd);\r\nBOOL __stdcall SelHero_GetHeroInfo(_uiheroinfo *pInfo);\r\nBOOL __stdcall UiSelHeroSingDialog(BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), BOOL(__stdcall *fncreate)(_uiheroinfo *), BOOL(__stdcall *fnremove)(_uiheroinfo *), BOOL(__stdcall *fnstats)(int, _uidefaultstats *), int *dlgresult, char *name, int *difficulty);\r\n\r\nvoid *SelIPX_1000C610();\r\nsigned int SelIPX_1000C629();\r\nBOOL __fastcall SelIPX_1000C634(int a1, int a2, int a3, DWORD *a4, int a5, int playerid);\r\nint __stdcall SelIPX_1000C692(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nLONG __fastcall SelIPX_1000C818(HWND hDlg, int nIDDlgItem);\r\nHWND UNKCALL SelIPX_1000C982(HWND hDlg);\r\nint SelIPX_1000C99F();\r\nconst char *UNKCALL SelIPX_1000C9DA(HWND hDlg);\r\nvoid __fastcall SelIPX_1000CA64(DWORD *a1);\r\nDWORD **__fastcall SelIPX_1000CA71(DWORD *a1);\r\nBOOL UNKCALL SelIPX_1000CAC1(void *location);\r\nvoid *__stdcall SelIPX_1000CAD5(int a1, char *a2, char *a3);\r\nDWORD *__fastcall SelIPX_1000CB50(DWORD *a1, DWORD *a2);\r\nDWORD *__fastcall SelIPX_1000CB73(DWORD *a1, int a2);\r\nint __fastcall SelIPX_1000CB83(HWND a1, const char *a2);\r\nint UNKCALL SelIPX_1000CC41(HWND hDlg); // idb\r\nBOOL __fastcall SelIPX_1000CCC5(DWORD *a1);\r\nHWND UNKCALL SelIPX_1000CCD9(HWND hWnd);\r\nHWND UNKCALL SelIPX_1000CD4A(HWND hWnd);\r\nvoid UNKCALL SelIPX_1000CEE6(HWND hDlg);\r\nLRESULT __stdcall SelIPX_1000CF38(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nHWND UNKCALL SelIPX_1000D070(HWND hWnd);\r\nHWND UNKCALL SelIPX_1000D0E1(HWND hWnd);\r\nint UNKCALL SelIPX_1000D18C(HWND hWnd); // idb\r\nDWORD *__fastcall SelIPX_1000D1C1(int a1);\r\nHWND UNKCALL SelIPX_1000D1D4(HWND hWnd);\r\nHWND UNKCALL SelIPX_1000D284(HWND hWnd);\r\nHWND UNKCALL SelIPX_1000D31C(HWND hWnd);\r\nint __fastcall SelIPX_1000D3A0(int a1, int a2);\r\nHWND USERCALL SelIPX_1000D3C5(HWND hDlg, int a2);\r\nBOOL __fastcall SelIPX_1000D4CA(HWND hDlg, int a2);\r\nchar *UNKCALL SelIPX_1000D520(char *arg);\r\nconst char *__fastcall SelIPX_1000D58D(const char *a1, const char *a2);\r\nint __fastcall SelIPX_1000D5B0(int a1, int a2);\r\nHWND __fastcall SelIPX_1000D696(HWND hDlg, int a2, int height);\r\n\r\nvoid __cdecl j_SelList_cpp_init();\r\nvoid __cdecl SelList_cpp_init();\r\nLRESULT __stdcall SelList_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall SelList_DeleteFreeProcs(HWND hWnd);\r\nvoid __fastcall SelList_GetHeroStats(HWND hWnd, int nIDDlgItem);\r\nvoid __fastcall SelList_CountHeroList(HWND hWnd);\r\nint __fastcall SelList_GetNextHeroLong(HWND hWnd);\r\nvoid __fastcall SelList_LoadFocus16(HWND hWnd);\r\nvoid __fastcall SelList_KillFocus16(HWND hWnd);\r\nvoid __fastcall SelList_ShowListWindow(HWND hWnd);\r\nvoid __fastcall SelList_SetHeroDlgLong(HWND hWnd, _uiheroinfo *pInfo);\r\nvoid __fastcall SelList_DoListOldProc(HWND hWnd);\r\nLRESULT __stdcall SelList_OldListWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall SelList_ShiftHeroDlgItems(HWND hWnd);\r\nvoid __fastcall SelList_ShiftHeroDlgItm2(HWND hWnd);\r\nvoid __fastcall SelList_HeroesWithBigDialogs(HWND hWnd);\r\n_uiheroinfo *__fastcall SelList_GetHeroFromNum(int heronum);\r\nvoid __fastcall SelList_HeroesWithHugeDlg(HWND hWnd);\r\nvoid __fastcall SelList_HeroDlgWithSound(HWND hWnd);\r\nvoid __fastcall SelList_HeroDlgWithSnd2(HWND hWnd);\r\nvoid __fastcall SelList_ChooseDlgFromSize(HWND hWnd, int width, int height);\r\n\r\nLRESULT __stdcall SelLoad_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall SelLoad_DeleteProcsAndSpin(HWND hWnd);\r\nvoid __fastcall SelLoad_LoadFocusAndMsg(HWND hWnd);\r\nvoid __fastcall SelLoad_SelectSndLoad(HWND hWnd, int a2);\r\nvoid __cdecl j_SelLoad_cpp_init();\r\nvoid __cdecl SelLoad_cpp_init();\r\n\r\nsigned int SelModem_1000E42A();\r\nint __fastcall SelModem_1000E435(void *a1, int a2, int a3, char *a4, char *a5);\r\nchar *__stdcall SelModem_1000E497(int a1, char *a2, char *a3);\r\nvoid *SelModem_1000E4EC();\r\nDWORD *__fastcall SelModem_1000E500(int a1, DWORD *a2);\r\nsigned int UNKCALL SelModem_1000E505(void *arg);\r\nsigned int SelModem_1000E51E();\r\nBOOL __fastcall SelModem_1000E553(DWORD *a1);\r\nBOOL UNKCALL SelModem_1000E567(void *location);\r\nint __fastcall SelModem_1000E57B(int a1, int a2);\r\nsigned int SelModem_1000E5CC();\r\nint __stdcall SelModem_1000E63E(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nvoid UNKCALL SelModem_1000E783(HWND hDlg);\r\nHWND UNKCALL SelModem_1000E7E9(HWND hDlg);\r\nint UNKCALL SelModem_1000E80E(HWND hWnd); // idb\r\nHWND UNKCALL SelModem_1000E843(HWND hWnd);\r\nint __fastcall SelModem_1000E932(HWND a1, const char *a2);\r\nvoid UNKCALL SelModem_1000E9B2(HWND hDlg);\r\nLRESULT __stdcall SelModem_1000EA04(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nHWND UNKCALL SelModem_1000EB2C(HWND hWnd);\r\nHWND UNKCALL SelModem_1000EB9D(HWND hWnd);\r\nHWND UNKCALL SelModem_1000EC0E(HWND hWnd);\r\nDWORD *__fastcall SelModem_1000EC9F(int a1);\r\nHWND UNKCALL SelModem_1000ECB2(HWND hWnd);\r\nHWND UNKCALL SelModem_1000ED3B(HWND hWnd);\r\nHWND UNKCALL SelModem_1000EDBC(HWND hWnd);\r\nint __fastcall SelModem_1000EE29(int a1, int a2);\r\nHWND __fastcall SelModem_1000EE78(HWND hWnd, int a2, int height);\r\n\r\nvoid *SelRegn_1000EF42();\r\n_uiheroinfo *__fastcall SelRegn_SetNextHero(_uiheroinfo *pNext, _uiheroinfo *pCurrent);\r\nsigned int SelRegn_1000EF60();\r\nint __stdcall SelRegn_1000EF6B(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); // idb\r\nHWND __fastcall SelRegn_1000F0D7(HWND hDlg, int nIDDlgItem);\r\nHWND UNKCALL SelRegn_1000F109(HWND hDlg);\r\nint SelRegn_1000F126();\r\nvoid UNKCALL SelRegn_1000F161(HWND hDlg);\r\nBOOL __fastcall SelRegn_1000F1D4(DWORD *a1);\r\nBOOL UNKCALL SelRegn_1000F1E8(void *location);\r\nHWND UNKCALL SelRegn_1000F1FC(HWND hWnd);\r\nsigned int SelRegn_1000F2ED();\r\nint __fastcall SelRegn_1000F346(HWND a1, const char *a2);\r\nvoid UNKCALL SelRegn_1000F3C2(HWND hDlg);\r\nLRESULT __stdcall SelRegn_1000F414(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nHWND UNKCALL SelRegn_1000F53C(HWND hWnd);\r\nHWND UNKCALL SelRegn_1000F5AD(HWND hWnd);\r\nHWND UNKCALL SelRegn_1000F61E(HWND hWnd);\r\nint UNKCALL SelRegn_1000F6C9(HWND hWnd); // idb\r\nDWORD *__fastcall SelRegn_1000F6FE(int a1);\r\nHWND UNKCALL SelRegn_1000F711(HWND hWnd);\r\nHWND UNKCALL SelRegn_1000F7C1(HWND hWnd);\r\nHWND UNKCALL SelRegn_1000F859(HWND hWnd);\r\nsigned int UNKCALL SelRegn_1000F8DD(void *arg);\r\nsigned int SelRegn_1000F8F6();\r\nHWND __fastcall SelRegn_1000F929(HWND hWnd, int a2, int height);\r\n//signed int __stdcall UiSelectRegion(DWORD *a1);\r\n\r\nint __fastcall SelYesNo_YesNoDialog(HWND hWnd, char *dialogstr, char *hero, int nofocus); /* void */\r\nLRESULT __stdcall SelYesNo_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall SelYesNo_RemoveYNDialog(HWND hWnd);\r\nvoid __fastcall SelYesNo_LoadSelYN_GFX(HWND hWnd);\r\nvoid __fastcall SelYesNo_DoSelectYesNo(HWND hWnd, int option);\r\nint __fastcall SelYesNo_SelOkDialog(HWND hWnd, char *dialogstr, char *hero, int nofocus); /* void */\r\nint __fastcall SelYesNo_SpawnErrDialog(HWND hWnd, int string_rsrc, int is_popup);         /* void */\r\nvoid __cdecl j_SelYesNo_cpp_init();\r\nvoid __cdecl SelYesNo_cpp_init();\r\n\r\nvoid __fastcall Title_BlitTitleBuffer(HWND hWnd);\r\nvoid __cdecl Title_DeletePhTrans();\r\nvoid __fastcall Title_FreeTransMem(HWND hWnd);\r\nvoid __fastcall Title_SetTitleBMP(HWND hWnd);\r\nvoid __fastcall Title_LoadTitleImage(HWND hWnd, const char *pszFileName);\r\nvoid __fastcall Title_LoadImgSetTimer(HWND hWnd, const char *pszFileName);\r\nvoid __stdcall Title_BlitTitleBufFnc(int hWnd, int a2, int a3, int a4);\r\nvoid __cdecl j_Title_cpp_init();\r\nvoid __cdecl Title_cpp_init();\r\nvoid __fastcall Title_KillTitleTimer(HWND hWnd);\r\nBOOL __stdcall UiTitleDialog(int a1);\r\nLRESULT __stdcall Title_MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r\nvoid __fastcall Title_KillTimerAndFree(HWND hWnd);\r\nvoid __fastcall Title_LoadAllTitleImgs(HWND hWnd, int time);\r\nvoid __fastcall Title_KillAndFadeDlg(HWND hWnd);\r\n\r\nvoid __fastcall TitleSnd_SetSoundFunction(void(__stdcall *func)(const char *file));\r\nvoid __cdecl TitleSnd_InitSoundFunc();\r\nvoid __cdecl TitleSnd_PlayMoveSound();\r\nvoid __cdecl TitleSnd_PlaySelectSound();\r\nvoid __cdecl j_TitleSnd_cpp_init();\r\nvoid __cdecl TitleSnd_cpp_init();\r\n"
  },
  {
    "path": "DiabloUI/artfont.cpp",
    "content": "// ref: 0x10001058\r\nvoid __fastcall artfont_SetArtFont(int nFont)\r\n{\r\n\tswitch (nFont) {\r\n\tcase AF_SMALL:\r\n\t\tsgpCurrFont = &font16g;\r\n\t\tbreak;\r\n\tcase AF_MED:\r\n\t\tsgpCurrFont = &font24g;\r\n\t\tbreak;\r\n\tcase AF_MEDGRAY:\r\n\t\tsgpCurrFont = &font24s;\r\n\t\tbreak;\r\n\tcase AF_BIG:\r\n\t\tsgpCurrFont = &font30g;\r\n\t\tbreak;\r\n\tcase AF_BIGGRAY:\r\n\t\tsgpCurrFont = &font30s;\r\n\t\tbreak;\r\n\tcase AF_HUGE:\r\n\t\tsgpCurrFont = &font42g;\r\n\t\tbreak;\r\n\tcase AF_HUGEGRAY:\r\n\t\tsgpCurrFont = &font42y;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tsgpCurrFont = &font16s;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n// ref: 0x10001098\r\nvoid __cdecl artfont_InitAllFonts()\r\n{\r\n\tfont42g.active = 0;\r\n\tfont42y.active = 0;\r\n\tfont30g.active = 0;\r\n\tfont30s.active = 0;\r\n\tfont24g.active = 0;\r\n\tfont24s.active = 0;\r\n\tfont16g.active = 0;\r\n\tfont16s.active = 0;\r\n\tsgpCurrFont    = 0;\r\n}\r\n\r\n// ref: 0x100010C8\r\nvoid __cdecl artfont_FreeAllFonts()\r\n{\r\n\tartfont_FreeArtFont(&font42g);\r\n\tartfont_FreeArtFont(&font42y);\r\n\tartfont_FreeArtFont(&font30g);\r\n\tartfont_FreeArtFont(&font30s);\r\n\tartfont_FreeArtFont(&font24g);\r\n\tartfont_FreeArtFont(&font24s);\r\n\tartfont_FreeArtFont(&font16g);\r\n\tartfont_FreeArtFont(&font16s);\r\n\tsgpCurrFont = 0;\r\n}\r\n\r\n// ref: 0x10001120\r\nvoid __fastcall artfont_FreeArtFont(FontStruct *pFont)\r\n{\r\n\tHANDLE *v2;    // esi\r\n\tsigned int v3; // ebx\r\n\r\n\tif (pFont->active) {\r\n\t\tv2 = pFont->fonttrans;\r\n\t\tv3 = 256;\r\n\t\tdo {\r\n\t\t\tif (*v2) {\r\n\t\t\t\tSTransDelete(*v2);\r\n\t\t\t\t*v2 = 0;\r\n\t\t\t}\r\n\t\t\t++v2;\r\n\t\t\t--v3;\r\n\t\t} while (v3);\r\n\t\tpFont->active = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x10001159\r\nBOOL __cdecl artfont_LoadAllFonts()\r\n{\r\n\tartfont_LoadArtFont(&font30g, \"ui_art\\\\font30.bin\", \"ui_art\\\\font30g.pcx\");\r\n\tartfont_LoadArtFont(&font30s, \"ui_art\\\\font30.bin\", \"ui_art\\\\font30s.pcx\");\r\n\tartfont_LoadArtFont(&font24g, \"ui_art\\\\font24.bin\", \"ui_art\\\\font24g.pcx\");\r\n\tartfont_LoadArtFont(&font24s, \"ui_art\\\\font24.bin\", \"ui_art\\\\font24s.pcx\");\r\n\tartfont_LoadArtFont(&font16g, \"ui_art\\\\font16.bin\", \"ui_art\\\\font16g.pcx\");\r\n\tartfont_LoadArtFont(&font16s, \"ui_art\\\\font16.bin\", \"ui_art\\\\font16s.pcx\");\r\n\tartfont_LoadArtFont(&font42g, \"ui_art\\\\font42.bin\", \"ui_art\\\\font42g.pcx\");\r\n\tartfont_LoadArtFont(&font42y, \"ui_art\\\\font42.bin\", \"ui_art\\\\font42y.pcx\");\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x100011FB\r\nvoid __fastcall artfont_LoadArtFont(FontStruct *pFont, const char *pszBinFile, const char *pszFileName)\r\n{\r\n\tLONG v4;          // eax\r\n\tsigned int v5;    // edi\r\n\tunsigned char v6; // al\r\n\tint v7;           // ecx\r\n\tint a5[4];        // [esp+8h] [ebp-20h]\r\n\tDWORD size[2];    // [esp+18h] [ebp-10h]\r\n\tBYTE *pBuffer;    // [esp+20h] [ebp-8h]\r\n\tHANDLE phFile;    // [esp+24h] [ebp-4h]\r\n\tHANDLE *a1a;      // [esp+30h] [ebp+8h]\r\n\r\n\tif (!pFont->active && SFileOpenFile(pszBinFile, &phFile)) {\r\n\t\tv4 = SFileGetFileSize(phFile, 0);\r\n\t\tif (SFileReadFile(phFile, pFont, v4, 0, NULL)) {\r\n\t\t\tSFileCloseFile(phFile);\r\n\t\t\tlocal_LoadArtImage(pszFileName, &pBuffer, size);\r\n\t\t\tmemset(pFont->fonttrans, 0, 0x400u);\r\n\t\t\tif (pBuffer) {\r\n\t\t\t\tv5  = 0;\r\n\t\t\t\ta1a = pFont->fonttrans;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tv6 = pFont->fontbin[v5 + 2];\r\n\t\t\t\t\tif (v6) {\r\n\t\t\t\t\t\tv7    = pFont->fontbin[1];\r\n\t\t\t\t\t\ta5[2] = v6;\r\n\t\t\t\t\t\ta5[1] = v5 * v7;\r\n\t\t\t\t\t\ta5[0] = 0;\r\n\t\t\t\t\t\ta5[3] = v7 + v5 * v7 - 1;\r\n\t\t\t\t\t\tSTransCreateI(pBuffer, size[0], size[1], 8, (int)a5, 16777248, a1a);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t++a1a;\r\n\t\t\t\t\t++v5;\r\n\t\t\t\t} while (v5 <= 256);\r\n\t\t\t\tpFont->active = 1;\r\n\t\t\t\tSMemFree(pBuffer, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\artfont.cpp\", 206, 0);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tSFileCloseFile(phFile);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x100012F6\r\nint __cdecl artfont_GetFontMaxHeight()\r\n{\r\n\tint result; // eax\r\n\r\n\tif (sgpCurrFont && sgpCurrFont->active)\r\n\t\tresult = sgpCurrFont->fontbin[1];\r\n\telse\r\n\t\tresult = 0;\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10001310\r\nint __cdecl artfont_GetFontDefWidth()\r\n{\r\n\tint result; // eax\r\n\r\n\tif (sgpCurrFont && sgpCurrFont->active)\r\n\t\tresult = sgpCurrFont->fontbin[0];\r\n\telse\r\n\t\tresult = 0;\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10001329\r\nint __fastcall artfont_GetFontWidth(char *str)\r\n{\r\n\tint result;       // eax\r\n\tunsigned char i;  // bl\r\n\tunsigned char v3; // bl\r\n\tint v4;           // esi\r\n\r\n\tresult = 0;\r\n\tif (!sgpCurrFont || !sgpCurrFont->active)\r\n\t\treturn 0;\r\n\tfor (i = *str; *str; i = *str) {\r\n\t\tv3 = sgpCurrFont->fontbin[i + 2];\r\n\t\tif (v3)\r\n\t\t\tv4 = v3;\r\n\t\telse\r\n\t\t\tv4 = sgpCurrFont->fontbin[0];\r\n\t\tresult += v4;\r\n\t\t++str;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x1000136C\r\nvoid __cdecl artfont_cpp_init()\r\n{\r\n\tartfont_cpp_float = 2139095040;\r\n}\r\n// 10026BB0: using guessed type int artfont_cpp_float;\r\n\r\n// ref: 0x10001377\r\nint __fastcall artfont_GetFontBreak(char *str)\r\n{\r\n\tint result;       // eax\r\n\tunsigned char v2; // dl\r\n\tunsigned char v3; // dl\r\n\r\n\tresult = 0;\r\n\tif (!sgpCurrFont || !sgpCurrFont->active)\r\n\t\treturn 0;\r\n\twhile (1) {\r\n\t\tv3 = *str;\r\n\t\tif (!*str)\r\n\t\t\tbreak;\r\n\t\tif (v3 == '\\n')\r\n\t\t\tbreak;\r\n\t\tif (v3 == ' ')\r\n\t\t\tbreak;\r\n\t\tv2 = sgpCurrFont->fontbin[v3 + 2];\r\n\t\tif (!v2)\r\n\t\t\tbreak;\r\n\t\tresult += v2;\r\n\t\t++str;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x100013B3\r\nvoid __cdecl artfont_delete_operator(void *ptr)\r\n{\r\n\tif (ptr)\r\n\t\tSMemFree(ptr, \"delete\", -1, 0);\r\n}\r\n\r\n// ref: 0x100013CD\r\nvoid __fastcall artfont_PrintFontStr(char *str, DWORD **pSurface, int sx, int sy)\r\n{\r\n\tFontStruct *v5;   // esi\r\n\tunsigned char v6; // cl\r\n\tint v7;           // edi\r\n\tunsigned char v8; // dl\r\n\tint v9;           // edi\r\n\tDWORD *v10;       // ecx\r\n\tHANDLE hTrans;    // [esp+Ch] [ebp-8h]\r\n\tHANDLE hTransa;   // [esp+Ch] [ebp-8h]\r\n\r\n\tif (pSurface) {\r\n\t\tif (*pSurface) {\r\n\t\t\tv5 = sgpCurrFont;\r\n\t\t\tif (sgpCurrFont) {\r\n\t\t\t\tif (sgpCurrFont->active) {\r\n\t\t\t\t\tif (sx < 0)\r\n\t\t\t\t\t\tsx = 0;\r\n\t\t\t\t\tif (sy < 0)\r\n\t\t\t\t\t\tsy = 0;\r\n\t\t\t\t\tv6     = *str;\r\n\t\t\t\t\tif (*str) {\r\n\t\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\t\thTrans = (HANDLE)(sy + v5->fontbin[1]);\r\n\t\t\t\t\t\t\tif (sy + v5->fontbin[1] > (signed int)pSurface[2])\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\tif (v6 == '\\n')\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tv7 = v6;\r\n\t\t\t\t\t\t\tv8 = v5->fontbin[v6 + 2];\r\n\t\t\t\t\t\t\tif (!v8) {\r\n\t\t\t\t\t\t\t\tv9 = v5->fontbin[0];\r\n\t\t\t\t\t\t\t\tif (sx + v9 + artfont_GetFontBreak(++str) < (signed int)pSurface[1]) {\r\n\t\t\t\t\t\t\t\t\tsx += v9;\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tsx = 0;\r\n\t\t\t\t\t\t\t\t\tsy = (int)hTrans;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tgoto LABEL_23;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\thTransa = v5->fonttrans[v6];\r\n\t\t\t\t\t\t\tif (v5->fonttrans[v6]) {\r\n\t\t\t\t\t\t\t\tv10 = pSurface[1];\r\n\t\t\t\t\t\t\t\tif (sx + v8 <= (signed int)v10) {\r\n\t\t\t\t\t\t\t\t\tSTransBlt(*pSurface, sx, sy, (int)v10, hTransa);\r\n\t\t\t\t\t\t\t\t\tv5 = sgpCurrFont;\r\n\t\t\t\t\t\t\t\t\tsx += sgpCurrFont->fontbin[v7 + 2];\r\n\t\t\t\t\t\t\t\t\tgoto LABEL_22;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tsx = 0;\r\n\t\t\t\t\t\t\t\tsy += v5->fontbin[1];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\tLABEL_23:\r\n\t\t\t\t\t\t\tv6 = *str;\r\n\t\t\t\t\t\t\tif (!*str)\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsx = 0;\r\n\t\t\t\t\t\tsy += v5->fontbin[1];\r\n\t\t\t\t\tLABEL_22:\r\n\t\t\t\t\t\t++str;\r\n\t\t\t\t\t\tgoto LABEL_23;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "DiabloUI/bn_prof.cpp",
    "content": "// ref: 0x100014E8\r\nsigned int bn_prof_100014E8() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_10029404 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 10029404: using guessed type int dword_10029404;\r\n\r\n// ref: 0x100014F3\r\nconst char **__stdcall UiProfileGetString() { return NULL; }\r\n//const char *UiProfileGetString() { return 0; }\r\n/* {\r\n\treturn \"profile\\\\sex\";\r\n} */\r\n\r\n// ref: 0x100014F9\r\nvoid __cdecl UiProfileCallback() { return; }\r\n//BOOL __stdcall UiProfileCallback(int a1, int a2, int a3, int a4, LPARAM a5, int a6, int a7, int a8, int (__stdcall *a9)(DWORD, DWORD, DWORD, DWORD)) { return 0; }\r\n/* {\r\n\tconst char *v9; // eax\r\n\tint v10; // eax\r\n\r\n\tlParam = a5;\r\n\tdword_10029408 = a6;\r\n\tdword_1002941C = a7;\r\n\tdword_10029418 = a8;\r\n\tdword_10029430 = a9;\r\n\tv9 = \"DIALOG_PROFILE\";\r\n\tif ( !a9 )\r\n\t\tv9 = \"DIALOG_STATIC_PROFILE\";\r\n\tv10 = SDlgDialogBoxParam(hInstance, v9, *(DWORD *)(a3 + 8), bn_prof_1000155F, 0);\r\n\treturn v10 && v10 != -1;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10029408: using guessed type int dword_10029408;\r\n// 10029418: using guessed type int dword_10029418;\r\n// 1002941C: using guessed type int dword_1002941C;\r\n// 10029430: using guessed type int (__stdcall *dword_10029430)(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000155F\r\nHGDIOBJ __stdcall bn_prof_1000155F(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tHWND v6; // edi\r\n\r\n\tif ( Msg <= 0x110 )\r\n\t{\r\n\t\tswitch ( Msg )\r\n\t\t{\r\n\t\t\tcase 0x110u:\r\n\t\t\t\tbn_prof_10001C0E(hWnd);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2u:\r\n\t\t\t\tbn_prof_10001F29();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 0x2Bu:\r\n\t\t\t\tif ( wParam == 1134 )\r\n\t\t\t\t{\r\n\t\t\t\t\tbn_prof_100018CE((int)hWnd, lParam);\r\n\t\t\t\t\treturn (HGDIOBJ)1;\r\n\t\t\t\t}\r\n\t\t\t\treturn (HGDIOBJ)SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\tdefault:\r\n\t\t\t\tif ( Msg > 0x103 && Msg <= 0x105 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\t\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\t\t\t}\r\n\t\t\t\treturn (HGDIOBJ)SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 273 )\r\n\t{\r\n\t\tif ( (unsigned short)wParam == 1 )\r\n\t\t{\r\n\t\t\tEnableWindow((HWND)lParam, 0);\r\n\t\t\tTitleSnd_10010315();\r\n\t\t\tif ( dword_10029430 )\r\n\t\t\t\tbn_prof_100016DD(hWnd);\r\n\t\t\tSDlgEndDialog(hWnd, 1);\r\n\t\t}\r\n\t\telse if ( (unsigned short)wParam == 2 )\r\n\t\t{\r\n\t\t\tEnableWindow((HWND)lParam, 0);\r\n\t\t\tTitleSnd_10010315();\r\n\t\t\tSDlgEndDialog(hWnd, 0);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif ( (unsigned short)wParam != 1134 || HIWORD(wParam) || dword_10029430 )\r\n\t\t\t\treturn (HGDIOBJ)SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\tbn_prof_10001A10(hWnd, (HWND)lParam);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 274 )\r\n\t{\r\n\t\tif ( wParam != 61536 )\r\n\t\t\treturn (HGDIOBJ)SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\tv6 = GetParent(hWnd);\r\n\t\tSDlgEndDialog(hWnd, 0);\r\n\t\tPostMessageA(v6, 0x112u, 0xF060u, lParam);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg != 312 || GetWindowLongA((HWND)lParam, -12) != 1124 )\r\n\t\treturn (HGDIOBJ)SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tSetTextColor((HDC)wParam, 0xFFFFu);\r\n\treturn GetStockObject(5);\r\n} */\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 10029430: using guessed type int (__stdcall *dword_10029430)(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x100016DD\r\nvoid UNKCALL bn_prof_100016DD(HWND arg) { return; }\r\n/* {\r\n\tint v1; // ebx\r\n\tint v2; // eax\r\n\tconst char **v3; // edi\r\n\tint v4; // eax\r\n\tint v5; // ebx\r\n\tint *v6; // ebx\r\n\tLRESULT v7; // eax\r\n\tLPARAM v8; // eax\r\n\tsize_t v9; // eax\r\n\tchar *v10; // eax\r\n\tint v11; // ebx\r\n\tDWORD *v12; // edi\r\n\tint v13; // eax\r\n\tint v14; // ebx\r\n\tsize_t v15; // [esp+4h] [ebp-28h]\r\n\tchar *v16; // [esp+8h] [ebp-24h]\r\n\tHWND hDlg; // [esp+Ch] [ebp-20h]\r\n\tint v18; // [esp+10h] [ebp-1Ch]\r\n\tint v19; // [esp+14h] [ebp-18h]\r\n\tint v20; // [esp+18h] [ebp-14h]\r\n\tchar *v21; // [esp+1Ch] [ebp-10h]\r\n\tint v22; // [esp+20h] [ebp-Ch]\r\n\tint v23; // [esp+24h] [ebp-8h]\r\n\tchar *v24; // [esp+28h] [ebp-4h]\r\n\tsize_t v25; // [esp+28h] [ebp-4h]\r\n\r\n\tv1 = 0;\r\n\thDlg = arg;\r\n\tif ( dword_10029430 )\r\n\t{\r\n\t\tv2 = SMemAlloc(4 * dword_10029408, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 193, 0);\r\n\t\tv3 = (const char **)v2;\r\n\t\tv22 = v2;\r\n\t\tv4 = SMemAlloc(4 * dword_10029408, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 195, 0);\r\n\t\tv18 = v4;\r\n\t\tv20 = 0;\r\n\t\tv23 = 0;\r\n\t\tif ( dword_10029408 > 0 )\r\n\t\t{\r\n\t\t\tv19 = v4 - (DWORD)v3;\r\n\t\t\tdo\r\n\t\t\t{\r\n\t\t\t\tv5 = 0;\r\n\t\t\t\tv24 = byte_1001F37C;\r\n\t\t\t\tv16 = *(char **)(4 * v23 + dword_10029418);\r\n\t\t\t\tv21 = *(char **)(4 * v23 + dword_1002941C);\r\n\t\t\t\twhile ( 1 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( !_strcmpi(v21, *((const char **)v24 - 1)) )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv15 = strlen(v16);\r\n\t\t\t\t\t\tif ( *v24 & 1 )\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tv24 += 16;\r\n\t\t\t\t\t++v5;\r\n\t\t\t\t\tif ( (signed int)v24 >= (signed int)&unk_1001F3BC )\r\n\t\t\t\t\t\tgoto LABEL_13;\r\n\t\t\t\t}\r\n\t\t\t\tv6 = &dword_1001F380[4 * v5];\r\n\t\t\t\tv7 = SendDlgItemMessageA(hDlg, *v6, 0xEu, 0, 0);\r\n\t\t\t\tv25 = v7;\r\n\t\t\t\tv8 = SMemAlloc(v7 + 1, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 218, 0);\r\n\t\t\t\t*v3 = (const char *)v8;\r\n\t\t\t\tSendDlgItemMessageA(hDlg, *v6, 0xDu, v25 + 1, v8);\r\n\t\t\t\t(*v3)[v25] = 0;\r\n\t\t\t\tif ( v25 == v15 && !_strnicmp(v16, *v3, v25) )\r\n\t\t\t\t{\r\n\t\t\t\t\tSMemFree(*v3, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 236, 0);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tv9 = strlen(v21);\r\n\t\t\t\t\tv10 = (char *)SMemAlloc(v9 + 1, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 232, 0);\r\n\t\t\t\t\t*(const char **)((char *)v3 + v19) = v10;\r\n\t\t\t\t\tstrcpy(v10, v21);\r\n\t\t\t\t\t++v20;\r\n\t\t\t\t\t++v3;\r\n\t\t\t\t}\r\nLABEL_13:\r\n\t\t\t\t++v23;\r\n\t\t\t}\r\n\t\t\twhile ( v23 < dword_10029408 );\r\n\t\t\tv1 = v20;\r\n\t\t}\r\n\t\tdword_10029430(&byte_10029448, v1, v18, v22);\r\n\t\tv11 = v1 - 1;\r\n\t\tif ( v11 >= 0 )\r\n\t\t{\r\n\t\t\tv12 = (DWORD *)(v22 + 4 * v11);\r\n\t\t\tv13 = v18 - v22;\r\n\t\t\tv14 = v11 + 1;\r\n\t\t\twhile ( 1 )\r\n\t\t\t{\r\n\t\t\t\tSMemFree(*(DWORD *)((char *)v12 + v13), \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 250, 0);\r\n\t\t\t\tSMemFree(*v12, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 251, 0);\r\n\t\t\t\t--v12;\r\n\t\t\t\tif ( !--v14 )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tv13 = v18 - v22;\r\n\t\t\t}\r\n\t\t}\r\n\t\tSMemFree(v18, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 253, 0);\r\n\t\tSMemFree(v22, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 254, 0);\r\n\t}\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n// 1001F380: using guessed type int dword_1001F380[];\r\n// 10029408: using guessed type int dword_10029408;\r\n// 10029418: using guessed type int dword_10029418;\r\n// 1002941C: using guessed type int dword_1002941C;\r\n// 10029430: using guessed type int (__stdcall *dword_10029430)(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x100018CE\r\nvoid __fastcall bn_prof_100018CE(int a1, int a2) { return; }\r\n/* {\r\n\tint v2; // esi\r\n\tLRESULT v3; // eax\r\n\tWPARAM v4; // edi\r\n\tchar *v5; // ebx\r\n\r\n\tv2 = a2;\r\n\tif ( *(DWORD *)(a2 + 24) && *(DWORD *)a2 == 5 )\r\n\t{\r\n\t\tv3 = SendMessageA(*(HWND *)(a2 + 20), 0xEu, 0, 0);\r\n\t\tv4 = v3 + 1;\r\n\t\tif ( v3 != 0 )\r\n\t\t{\r\n\t\t\tv5 = (char *)SMemAlloc(v3 + 1, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 362, 0);\r\n\t\t\tSendMessageA(*(HWND *)(v2 + 20), 0xDu, v4, (LPARAM)v5);\r\n\t\t\tbn_prof_10001938(*(HDC *)(v2 + 24), (DWORD *)(v2 + 28), v5, 0, 0);\r\n\t\t\tSMemFree(v5, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 367, 0);\r\n\t\t}\r\n\t}\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10001938\r\nint __fastcall bn_prof_10001938(HDC a1, DWORD *a2, char *a3, int a4, int a5) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\tchar *v6; // edi\r\n\tchar *v7; // eax\r\n\tchar *v8; // esi\r\n\tchar v9; // bl\r\n\tchar *v10; // eax\r\n\tRECT rc; // [esp+Ch] [ebp-14h]\r\n\tDWORD *v12; // [esp+1Ch] [ebp-4h]\r\n\tchar *v13; // [esp+28h] [ebp+8h]\r\n\r\n\tresult = (int)bn_prof_10002410(a1, a2);\r\n\tv12 = (DWORD *)result;\r\n\tif ( result )\r\n\t{\r\n\t\tv6 = a3;\r\n\t\tif ( a3 )\r\n\t\t{\r\n\t\t\tv13 = (char *)(a4 != 0 ? (unsigned int)&rc : 0);\r\n\t\t\twhile ( 1 )\r\n\t\t\t{\r\n\t\t\t\tv7 = strstr(v6, \"http://\");\r\n\t\t\t\tv8 = v7;\r\n\t\t\t\tv9 = 0;\r\n\t\t\t\tif ( v7 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv9 = *v7;\r\n\t\t\t\t\t*v7 = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif ( !bn_prof_10002456((int)v12, v6, 1, v13) || !v8 )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t*v8 = v9;\r\n\t\t\t\tv10 = strpbrk(v8, \" \\n\\r\\t\");\r\n\t\t\t\tv6 = v10;\r\n\t\t\t\tif ( v10 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv9 = *v10;\r\n\t\t\t\t\t*v10 = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif ( !bn_prof_10002456((int)v12, v8, 2, v13) )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tif ( a4 && PtInRect(&rc, *(POINT *)a4) )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( a5 )\r\n\t\t\t\t\t\t*(DWORD *)a5 = v8;\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t\tif ( !v6 )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t*v6 = v9;\r\n\t\t\t}\r\n\t\t}\r\n\t\tbn_prof_100026C4(v12);\r\n\t\tresult = a4 == 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x10001A10\r\nint __fastcall bn_prof_10001A10(HWND a1, HWND a2) { return 0; }\r\n/* {\r\n\tHWND v2; // esi\r\n\tint result; // eax\r\n\tWPARAM v4; // esi\r\n\tHWND v5; // eax\r\n\tHDC v6; // edi\r\n\tHWND v7; // eax\r\n\tstruct tagRECT v8; // [esp+Ch] [ebp-3Ch]\r\n\tstruct tagRECT Rect; // [esp+1Ch] [ebp-2Ch]\r\n\tstruct tagPOINT Point; // [esp+2Ch] [ebp-1Ch]\r\n\tHWND v11; // [esp+34h] [ebp-14h]\r\n\tint v12; // [esp+38h] [ebp-10h]\r\n\tint v13; // [esp+3Ch] [ebp-Ch]\r\n\tHWND hWnd; // [esp+40h] [ebp-8h]\r\n\tchar *v15; // [esp+44h] [ebp-4h]\r\n\r\n\tv2 = a2;\r\n\thWnd = a2;\r\n\tv11 = a1;\r\n\tresult = GetCursorPos(&Point);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetWindowRect(v2, &Rect);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tresult = GetClientRect(v2, &v8);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tPoint.x -= Rect.left;\r\n\t\t\t\tPoint.y -= Rect.top;\r\n\t\t\t\tresult = SendMessageA(v2, 0xEu, 0, 0);\r\n\t\t\t\tv4 = result + 1;\r\n\t\t\t\tif ( result + 1 > 1 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv15 = (char *)SMemAlloc(result + 1, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 438, 0);\r\n\t\t\t\t\tSendMessageA(hWnd, 0xDu, v4, (LPARAM)v15);\r\n\t\t\t\t\tv5 = GetDesktopWindow();\r\n\t\t\t\t\tv6 = GetDC(v5);\r\n\t\t\t\t\thWnd = (HWND)CreateCompatibleDC(v6);\r\n\t\t\t\t\tv13 = bn_prof_10001938((HDC)hWnd, &v8, v15, (int)&Point, (int)&v12);\r\n\t\t\t\t\tDeleteDC((HDC)hWnd);\r\n\t\t\t\t\tv7 = GetDesktopWindow();\r\n\t\t\t\t\tReleaseDC(v7, v6);\r\n\t\t\t\t\tif ( v13 )\r\n\t\t\t\t\t\tbn_prof_10001B0A(v11, (const CHAR *)v12);\r\n\t\t\t\t\tresult = SMemFree(v15, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 450, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10001B0A\r\nHINSTANCE __fastcall bn_prof_10001B0A(HWND a1, const CHAR *a2) { return 0; }\r\n/* {\r\n\tconst CHAR *v2; // ebp\r\n\tHWND v3; // eax\r\n\tHWND v4; // eax\r\n\tHINSTANCE result; // eax\r\n\tFILE *v6; // eax\r\n\tHWND v7; // eax\r\n\tHWND v8; // eax\r\n\tHWND v9; // eax\r\n\tHWND hWnd; // [esp+10h] [ebp-348h]\r\n\tCHAR Caption; // [esp+14h] [ebp-344h]\r\n\tCHAR Result; // [esp+54h] [ebp-304h]\r\n\tCHAR Buffer; // [esp+158h] [ebp-200h]\r\n\r\n\tv2 = a2;\r\n\thWnd = a1;\r\n\tv3 = GetDesktopWindow();\r\n\tSetForegroundWindow(v3);\r\n\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\tresult = ShellExecuteA(v4, \"open\", v2, 0, 0, 1);\r\n\tif ( (unsigned int)result <= 0x20 )\r\n\t{\r\n\t\tv6 = fopen(\"battle.htm\", \"wb\");\r\n\t\tif ( v6 )\r\n\t\t\tfclose(v6);\r\n\t\tif ( (unsigned int)FindExecutableA(\"battle.htm\", 0, &Result) <= 0x20 )\r\n\t\t{\r\n\t\t\tv7 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\tif ( (unsigned int)ShellExecuteA(v7, \"open\", &Result, v2, 0, 1) <= 0x20 )\r\n\t\t\t{\r\n\t\t\t\tv8 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\t\tSetActiveWindow(v8);\r\n\t\t\t\tv9 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\t\tShowWindow(v9, 0);\r\n\t\t\t\tLoadStringA(hInstance, 0x50u, &Buffer, 512);\r\n\t\t\t\tLoadStringA(hInstance, 0x51u, &Caption, 64);\r\n\t\t\t\tUiMessageBoxCallback(hWnd, &Buffer, &Caption, 0x30u);\r\n\t\t\t}\r\n\t\t}\r\n\t\tresult = (HINSTANCE)DeleteFileA(\"battle.htm\");\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10001C0E\r\nHWND UNKCALL bn_prof_10001C0E(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tLPARAM v2; // ST10_4\r\n\tHWND v3; // eax\r\n\tHWND v4; // eax\r\n\tHWND v5; // eax\r\n\tHWND v6; // eax\r\n\r\n\tv1 = hWnd;\r\n\tbn_prof_10001CF3(hWnd);\r\n\tho = bn_prof_10001D81(v1, 2, (int)&unk_1001F3B8);\r\n\tdword_10029424 = bn_prof_10001D81(v1, 1, (int)&unk_1001F3D0);\r\n\tv2 = lParam;\r\n\tv3 = GetDlgItem(v1, 1126);\r\n\tSendMessageA(v3, 0xCu, 0, v2);\r\n\tbn_prof_10001CB9(\r\n\t\t(DWORD *)dword_1002941C,\r\n\t\tdword_10029418,\r\n\t\t(void (__fastcall *)(BYTE *, DWORD, int))bn_prof_10001ED0,\r\n\t\t0);\r\n\tbn_prof_10001E34(v1);\r\n\tif ( dword_10029430 )\r\n\t{\r\n\t\tv4 = GetDlgItem(v1, 1128);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv5 = GetDlgItem(v1, 1134);\r\n\t\tbn_prof_100022A2(v5);\r\n\t\tv6 = GetDlgItem(v1, 1);\r\n\t\tEnableWindow(v6, 0);\r\n\t\tv4 = GetDlgItem(v1, 2);\r\n\t}\r\n\treturn SetFocus(v4);\r\n} */\r\n// 10029418: using guessed type int dword_10029418;\r\n// 1002941C: using guessed type int dword_1002941C;\r\n// 10029430: using guessed type int (__stdcall *dword_10029430)(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10001CB9\r\nvoid __fastcall bn_prof_10001CB9(DWORD *a1, int a2, void (__fastcall *a3)(BYTE *, DWORD, int), int a4) { return; }\r\n/* {\r\n\tBYTE *v4; // eax\r\n\tDWORD *v5; // esi\r\n\tint v6; // edi\r\n\r\n\tif ( a1 )\r\n\t{\r\n\t\tif ( a2 )\r\n\t\t{\r\n\t\t\tif ( a3 )\r\n\t\t\t{\r\n\t\t\t\tv4 = (BYTE *)*a1;\r\n\t\t\t\tif ( *(BYTE *)*a1 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv5 = a1;\r\n\t\t\t\t\tv6 = a2 - (DWORD)a1;\r\n\t\t\t\t\tdo\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ta3(v4, *(DWORD *)((char *)v5 + v6), a4);\r\n\t\t\t\t\t\t++v5;\r\n\t\t\t\t\t\tv4 = (BYTE *)*v5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile ( *(BYTE *)*v5 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n} */\r\n\r\n// ref: 0x10001CF3\r\nint UNKCALL bn_prof_10001CF3(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tconst char *v2; // eax\r\n\tint v3; // ST10_4\r\n\tHWND v4; // eax\r\n\tint v6; // [esp+8h] [ebp-14h]\r\n\tint v7; // [esp+Ch] [ebp-10h]\r\n\tint v8; // [esp+10h] [ebp-Ch]\r\n\tchar v9; // [esp+14h] [ebp-8h]\r\n\r\n\tv8 = 0;\r\n\tv1 = hWnd;\r\n\tv6 = 1;\r\n\tv7 = 2;\r\n\tv2 = \"ui_art\\\\bnprofile.pcx\";\r\n\tif ( !dword_10029430 )\r\n\t\tv2 = \"ui_art\\\\bnstaticprofile.pcx\";\r\n\tv3 = (int)v2;\r\n\tv4 = GetParent(hWnd);\r\n\tlocal_10007944((int)v1, (int)v4, \"Popup\", -1, 1, v3, &dword_10029410, &v9, 1);\r\n\tlocal_10007944(0, 0, \"Button\", -1, 1, (int)\"ui_art\\\\but_xsm.pcx\", &dword_10029428, &v9, 1);\r\n\treturn SDlgSetControlBitmaps(v1, &v6, 0, dword_10029428, &v9, 1, -1);\r\n} */\r\n// 10010388: using guessed type int __stdcall SDlgSetControlBitmaps(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10029410: using guessed type int dword_10029410;\r\n// 10029428: using guessed type int dword_10029428;\r\n// 10029430: using guessed type int (__stdcall *dword_10029430)(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10001D81\r\nHFONT __fastcall bn_prof_10001D81(HWND hWnd, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // esi\r\n\tvoid *v4; // ebx\r\n\tint v5; // esi\r\n\tint v6; // eax\r\n\tconst char *v7; // ST10_4\r\n\tHFONT v8; // ebx\r\n\tint *v10; // esi\r\n\tint pv; // [esp+8h] [ebp-40h]\r\n\tint v12; // [esp+18h] [ebp-30h]\r\n\tchar v13; // [esp+24h] [ebp-24h]\r\n\tHWND hDlg; // [esp+44h] [ebp-4h]\r\n\r\n\tv3 = a2;\r\n\thDlg = hWnd;\r\n\tv4 = (void *)SendMessageA(hWnd, 0x31u, 0, 0);\r\n\tif ( !v4 )\r\n\t\treturn 0;\r\n\tmemset(&pv, 0, 0x3Cu);\r\n\tif ( !GetObjectA(v4, 60, &pv) )\r\n\t\treturn 0;\r\n\tv5 = 3 * v3;\r\n\tv6 = MulDiv(dword_10022260[v5], 96, 72);\r\n\tv7 = (&off_10022264)[v5];\r\n\tpv = -v6;\r\n\tv12 = dword_10022268[v5];\r\n\tstrcpy(&v13, v7);\r\n\tv8 = CreateFontIndirectA((const LOGFONTA *)&pv);\r\n\tif ( !v8 )\r\n\t\treturn 0;\r\n\tv10 = (int *)a3;\r\n\tif ( a3 )\r\n\t{\r\n\t\twhile ( *v10 )\r\n\t\t{\r\n\t\t\tSendDlgItemMessageA(hDlg, *v10, 0x30u, (WPARAM)v8, 0);\r\n\t\t\t++v10;\r\n\t\t}\r\n\t}\r\n\treturn v8;\r\n} */\r\n// 10022260: using guessed type int dword_10022260[];\r\n// 10022264: using guessed type char *off_10022264;\r\n// 10022268: using guessed type int dword_10022268[];\r\n\r\n// ref: 0x10001E34\r\nvoid UNKCALL bn_prof_10001E34(void *arg) { return; }\r\n/* {\r\n\tbn_prof_10001CB9(\r\n\t\t(DWORD *)dword_1002941C,\r\n\t\tdword_10029418,\r\n\t\t(void (__fastcall *)(BYTE *, DWORD, int))bn_prof_10001E4C,\r\n\t\t(int)arg);\r\n} */\r\n// 10029418: using guessed type int dword_10029418;\r\n// 1002941C: using guessed type int dword_1002941C;\r\n\r\n// ref: 0x10001E4C\r\nvoid __fastcall bn_prof_10001E4C(char *a1, LPARAM lParam, HWND hDlg) { return; }\r\n/* {\r\n\tint v3; // esi\r\n\tbool v4; // zf\r\n\tLPARAM v5; // ebp\r\n\tchar *v6; // ebx\r\n\tconst char **v7; // edi\r\n\tint v8; // esi\r\n\tHWND v9; // ebx\r\n\r\n\tv3 = 0;\r\n\tv4 = dword_10022258 == 0;\r\n\tv5 = lParam;\r\n\tv6 = a1;\r\n\tif ( dword_10022258 > 0 )\r\n\t{\r\n\t\tv7 = (const char **)&off_1001F378;\r\n\t\tdo\r\n\t\t{\r\n\t\t\tif ( !_strcmpi(v6, *v7) )\r\n\t\t\t\tbreak;\r\n\t\t\t++v3;\r\n\t\t\tv7 += 4;\r\n\t\t}\r\n\t\twhile ( v3 < dword_10022258 );\r\n\t\tv4 = v3 == dword_10022258;\r\n\t}\r\n\tif ( !v4 )\r\n\t{\r\n\t\tv8 = 4 * v3;\r\n\t\tif ( !(byte_1001F37C[v8 * 4] & 4) )\r\n\t\t{\r\n\t\t\tv9 = GetDlgItem(hDlg, dword_1001F380[v8]);\r\n\t\t\tSendMessageA(v9, 0xCu, 0, v5);\r\n\t\t\tif ( dword_10029430 )\r\n\t\t\t\tSendMessageA(v9, 0xC5u, dword_1001F384[v8], 0);\r\n\t\t}\r\n\t}\r\n} */\r\n// 1001F378: using guessed type char *off_1001F378;\r\n// 1001F380: using guessed type int dword_1001F380[];\r\n// 1001F384: using guessed type int dword_1001F384[];\r\n// 10022258: using guessed type int dword_10022258;\r\n// 10029430: using guessed type int (__stdcall *dword_10029430)(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10001ED0\r\nvoid __fastcall bn_prof_10001ED0(char *a1, BYTE *a2, int a3) { return; }\r\n/* {\r\n\tint v3; // esi\r\n\tbool v4; // zf\r\n\tBYTE *v5; // edi\r\n\tchar *v6; // ebp\r\n\tconst char **v7; // ebx\r\n\r\n\tv3 = 0;\r\n\tv4 = dword_10022258 == 0;\r\n\tv5 = a2;\r\n\tv6 = a1;\r\n\tif ( dword_10022258 > 0 )\r\n\t{\r\n\t\tv7 = (const char **)&off_1001F378;\r\n\t\tdo\r\n\t\t{\r\n\t\t\tif ( !_strcmpi(v6, *v7) )\r\n\t\t\t\tbreak;\r\n\t\t\t++v3;\r\n\t\t\tv7 += 4;\r\n\t\t}\r\n\t\twhile ( v3 < dword_10022258 );\r\n\t\tv4 = v3 == dword_10022258;\r\n\t}\r\n\tif ( !v4 )\r\n\t{\r\n\t\tif ( *v5 )\r\n\t\t\tdword_10029438[v3] = (int)v5;\r\n\t\telse\r\n\t\t\tdword_10029438[v3] = (int)\"0\";\r\n\t}\r\n} */\r\n// 1001F378: using guessed type char *off_1001F378;\r\n// 10022258: using guessed type int dword_10022258;\r\n\r\n// ref: 0x10001F29\r\nvoid *bn_prof_10001F29() { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tbn_prof_100023D8();\r\n\tbn_prof_10001F84();\r\n\tif ( ho )\r\n\t\tDeleteObject(ho);\r\n\tho = 0;\r\n\tif ( dword_10029424 )\r\n\t\tDeleteObject(dword_10029424);\r\n\tresult = dword_10029434;\r\n\tdword_10029424 = 0;\r\n\tif ( dword_10029434 )\r\n\t\tresult = SMemFree(dword_10029434, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 509, 0);\r\n\tdword_10029434 = 0;\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 10029434: using guessed type int dword_10029434;\r\n\r\n// ref: 0x10001F84\r\nBYTE *bn_prof_10001F84() { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tif ( dword_10029410 )\r\n\t{\r\n\t\tSMemFree(dword_10029410, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 129, 0);\r\n\t\tdword_10029410 = 0;\r\n\t}\r\n\tresult = dword_10029428;\r\n\tif ( dword_10029428 )\r\n\t{\r\n\t\tresult = SMemFree(dword_10029428, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 133, 0);\r\n\t\tdword_10029428 = 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 10029410: using guessed type int dword_10029410;\r\n// 10029428: using guessed type int dword_10029428;\r\n\r\n// ref: 0x10001FC8\r\nvoid __cdecl UiProfileDraw() { return; }\r\n//int __stdcall UiProfileDraw(int a1, int a2, int a3, int a4, HGDIOBJ ho, int a6, int a7, int a8, int a9, int a10, int a11) { return 0; }\r\n/* {\r\n\tint v11; // eax\r\n\tHFONT v12; // eax\r\n\tint v14; // eax\r\n\tCHAR *v15; // edi\r\n\tint v16; // esi\r\n\tCHAR v17; // al\r\n\tint v18; // ecx\r\n\tint v19; // eax\r\n\tint v20; // edx\r\n\tCHAR Buffer[256]; // [esp+Ch] [ebp-150h]\r\n\tint v22; // [esp+10Ch] [ebp-50h]\r\n\tint v23; // [esp+110h] [ebp-4Ch]\r\n\tint v24; // [esp+114h] [ebp-48h]\r\n\tint v25; // [esp+118h] [ebp-44h]\r\n\tint v26; // [esp+11Ch] [ebp-40h]\r\n\tint v27; // [esp+120h] [ebp-3Ch]\r\n\tint v28; // [esp+124h] [ebp-38h]\r\n\tint v29; // [esp+128h] [ebp-34h]\r\n\tint v30; // [esp+12Ch] [ebp-30h]\r\n\tint v31; // [esp+130h] [ebp-2Ch]\r\n\tint v32; // [esp+134h] [ebp-28h]\r\n\tint v33; // [esp+138h] [ebp-24h]\r\n\tint v34; // [esp+13Ch] [ebp-20h]\r\n\tint v35; // [esp+140h] [ebp-1Ch]\r\n\tint v36; // [esp+144h] [ebp-18h]\r\n\tint v37; // [esp+148h] [ebp-14h]\r\n\tint v38; // [esp+14Ch] [ebp-10h]\r\n\tint v39; // [esp+150h] [ebp-Ch]\r\n\tint v40; // [esp+154h] [ebp-8h]\r\n\tint v41; // [esp+158h] [ebp-4h]\r\n\tHFONT hoa; // [esp+174h] [ebp+18h]\r\n\tint hob; // [esp+174h] [ebp+18h]\r\n\r\n\tif ( ho )\r\n\t\treturn 0;\r\n\tif ( !a9 )\r\n\t\treturn 0;\r\n\tif ( !a10 )\r\n\t\treturn 0;\r\n\tif ( !a11 )\r\n\t\treturn 0;\r\n\tv24 = dword_1002940C;\r\n\tv34 = dword_1002940C;\r\n\tv30 = 0;\r\n\tv31 = 0;\r\n\tv32 = a10;\r\n\tv33 = a11;\r\n\tv36 = a10;\r\n\tv37 = a11;\r\n\tv22 = 0;\r\n\tv23 = 0;\r\n\tv25 = dword_10029414;\r\n\tv35 = dword_10029414;\r\n\tif ( !SBltROP3Clipped(a9, &v30, &v36, a10, dword_1002942C, &v22, &v34, dword_1002940C, 0, 13369376) )\r\n\t\treturn 0;\r\n\tif ( !LoadStringA(hInstance, 0x4Fu, Buffer, 255) )\r\n\t\treturn 0;\r\n\tv11 = MulDiv(12, 96, 72);\r\n\tv12 = CreateFontA(-v11, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0x20u, \"Arial\");\r\n\thoa = v12;\r\n\tif ( !v12 )\r\n\t\treturn 0;\r\n\tv41 = 0;\r\n\tif ( !SGdiImportFont(v12, &v41) )\r\n\t\treturn 0;\r\n\tDeleteObject(hoa);\r\n\tif ( !v41 || !SGdiSelectObject(v41) )\r\n\t\treturn 0;\r\n\tv26 = 0;\r\n\tv27 = 0;\r\n\tv28 = a10;\r\n\tv29 = a11;\r\n\tSGdiSetPitch(a10);\r\n\tv14 = SStrLen(Buffer);\r\n\tv15 = Buffer;\r\n\thob = v14 + 1;\r\n\tv40 = 8;\r\n\tBuffer[v14 + 1] = 0;\r\n\tv16 = v14 + 1;\r\n\tdo\r\n\t{\r\n\t\tif ( v15[v16 - 1] )\r\n\t\t{\r\n\t\t\tv17 = v15[v16 - 1];\r\n\t\t\tdo\r\n\t\t\t{\r\n\t\t\t\tif ( v17 == 32 )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tif ( v17 == 10 )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tif ( v17 == 9 )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tif ( v16 <= 1 )\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tv17 = v15[v16-- - 2];\r\n\t\t\t}\r\n\t\t\twhile ( v17 );\r\n\t\t}\r\n\t\tSGdiGetTextExtent(v15, v16, &v38);\r\n\t\tif ( v38 >= a10 - 8 )\r\n\t\t{\r\n\t\t\tv20 = a10 * hob % v38;\r\n\t\t\tif ( --v16 >= a10 * hob / v38 )\r\n\t\t\t\tv16 = a10 * hob / v38;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tv19 = v16 - 1;\r\n\t\t\tif ( v15[v16 - 1] )\r\n\t\t\t\tv19 = v16;\r\n\t\t\tSGdiExtTextOut(a9, 8, v40, &v26, 16777471, 1, 0, v15, v19);\r\n\t\t\tif ( v15[v16] == 32 )\r\n\t\t\t\t++v16;\r\n\t\t\tv15 += v16;\r\n\t\t\tv40 += v39;\r\n\t\t\thob -= v16;\r\n\t\t\tv16 = hob;\r\n\t\t}\r\n\t}\r\n\twhile ( v16 && hob && v40 < a11 - 8 );\r\n\tSGdiDeleteObject(v18, v20, v41);\r\n\treturn 1;\r\n} */\r\n// 1001038E: using guessed type int __fastcall SGdiDeleteObject(DWORD, DWORD, DWORD);\r\n// 10010394: using guessed type int __stdcall SGdiExtTextOut(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1001039A: using guessed type int __stdcall SGdiGetTextExtent(DWORD, DWORD, DWORD);\r\n// 100103A0: using guessed type int __stdcall SStrLen(DWORD);\r\n// 100103A6: using guessed type int __stdcall SGdiSetPitch(DWORD);\r\n// 100103AC: using guessed type int __stdcall SGdiSelectObject(DWORD);\r\n// 100103B2: using guessed type int __stdcall SGdiImportFont(DWORD, DWORD);\r\n// 100103B8: using guessed type int __stdcall SBltROP3Clipped(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002940C: using guessed type int dword_1002940C;\r\n// 10029414: using guessed type int dword_10029414;\r\n// 1002942C: using guessed type int dword_1002942C;\r\n// 10001FC8: using guessed type CHAR Buffer[256];\r\n\r\n// ref: 0x100021C4\r\nint bn_prof_100021C4() { return 0; }\r\n/* {\r\n\tint v0; // edi\r\n\tint v2; // [esp+4h] [ebp-8h]\r\n\tint v3; // [esp+8h] [ebp-4h]\r\n\r\n\tv3 = 0;\r\n\tv2 = 0;\r\n\tif ( !SBmpLoadImage(\"ui_Art\\\\profilebkg.pcx\", 0, 0, 0, &v3, &v2, 0) || !v3 || !v2 )\r\n\t\treturn 0;\r\n\tv0 = v3 * v2;\r\n\tdword_1002942C = SMemAlloc(v3 * v2, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 760, 0);\r\n\tdword_1002940C = v3;\r\n\tdword_10029414 = v2;\r\n\treturn SBmpLoadImage(\"ui_Art\\\\profilebkg.pcx\", 0, dword_1002942C, v0, &v3, &v2, 0);\r\n} */\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n// 100103BE: using guessed type int __stdcall SBmpLoadImage(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002940C: using guessed type int dword_1002940C;\r\n// 10029414: using guessed type int dword_10029414;\r\n// 1002942C: using guessed type int dword_1002942C;\r\n\r\n// ref: 0x10002247\r\nvoid *bn_prof_10002247() { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tresult = dword_1002942C;\r\n\tif ( dword_1002942C )\r\n\t{\r\n\t\tresult = SMemFree(dword_1002942C, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\bn_prof.cpp\", 776, 0);\r\n\t\tdword_1002942C = 0;\r\n\t\tdword_1002940C = 0;\r\n\t\tdword_10029414 = 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 1002940C: using guessed type int dword_1002940C;\r\n// 10029414: using guessed type int dword_10029414;\r\n// 1002942C: using guessed type int dword_1002942C;\r\n\r\n// ref: 0x10002278\r\nint j_bn_prof_10002282() { return 0; }\r\n/* {\r\n\tbn_prof_10002282();\r\n\treturn atexit(bn_prof_10002298);\r\n} */\r\n\r\n// ref: 0x10002282\r\nDWORD *bn_prof_10002282() { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\tDWORD *v1; // edx\r\n\r\n\tresult = dword_10029460;\r\n\tv1 = &dword_10029460[1];\r\n\t*v1 = 0;\r\n\tv1[1] = 0;\r\n\t*v1 = v1;\r\n\tdword_10029460[0] = 0;\r\n\tdword_10029460[2] = ~(unsigned int)&dword_10029460[1];\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x10002298\r\nvoid __cdecl bn_prof_10002298() { return; }\r\n/* {\r\n\tbn_prof_100026F0(dword_10029460);\r\n} */\r\n\r\n// ref: 0x100022A2\r\nint UNKCALL bn_prof_100022A2(HWND hWnd) { return 0; }\r\n/* {\r\n\tHFONT v2; // eax\r\n\tHFONT v3; // eax\r\n\tchar pv; // [esp+4h] [ebp-40h]\r\n\tchar v5; // [esp+19h] [ebp-2Bh]\r\n\tHANDLE h; // [esp+40h] [ebp-4h]\r\n\r\n\tif ( !hWnd )\r\n\t\treturn 0;\r\n\th = (HANDLE)SendMessageA(hWnd, 0x31u, 0, 0);\r\n\tif ( !h )\r\n\t\treturn 0;\r\n\tmemset(&pv, 0, 0x3Cu);\r\n\tif ( GetObjectA(h, 60, &pv) )\r\n\t{\r\n\t\tv2 = CreateFontIndirectA((const LOGFONTA *)&pv);\r\n\t\tif ( v2 )\r\n\t\t{\r\n\t\t\tdword_10029450 = v2;\r\n\t\t\tdword_10029458 = bn_prof_10002353(v2);\r\n\t\t}\r\n\t}\r\n\tmemset(&pv, 0, 0x3Cu);\r\n\tif ( GetObjectA(h, 60, &pv) )\r\n\t{\r\n\t\tv5 = 1;\r\n\t\tv3 = CreateFontIndirectA((const LOGFONTA *)&pv);\r\n\t\tif ( v3 )\r\n\t\t{\r\n\t\t\t::h = v3;\r\n\t\t\tdword_1002946C = bn_prof_10002353(v3);\r\n\t\t}\r\n\t}\r\n\treturn 1;\r\n} */\r\n// 10029458: using guessed type int dword_10029458;\r\n// 1002946C: using guessed type int dword_1002946C;\r\n\r\n// ref: 0x10002353\r\nint UNKCALL bn_prof_10002353(HGDIOBJ h) { return 0; }\r\n/* {\r\n\tHGDIOBJ v1; // ebx\r\n\tHWND v2; // eax\r\n\tHDC v3; // ebp\r\n\tHDC v4; // esi\r\n\tHWND v5; // eax\r\n\tint v7; // [esp+10h] [ebp-10h]\r\n\tHGDIOBJ ha; // [esp+14h] [ebp-Ch]\r\n\tstruct tagSIZE psizl; // [esp+18h] [ebp-8h]\r\n\r\n\tv1 = h;\r\n\tv2 = GetDesktopWindow();\r\n\tv3 = GetDC(v2);\r\n\tv4 = CreateCompatibleDC(v3);\r\n\tv7 = 0;\r\n\tha = SelectObject(v4, v1);\r\n\tif ( GetTextExtentPoint32A(v4, \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\", 52, &psizl) )\r\n\t\tv7 = (psizl.cx / 26 + 1) / 2;\r\n\tSelectObject(v4, ha);\r\n\tDeleteDC(v4);\r\n\tv5 = GetDesktopWindow();\r\n\tReleaseDC(v5, v3);\r\n\treturn v7;\r\n} */\r\n\r\n// ref: 0x100023D8\r\nHGDIOBJ bn_prof_100023D8() { return 0; }\r\n/* {\r\n\tHGDIOBJ result; // eax\r\n\tint v1; // esi\r\n\r\n\tif ( dword_10029450 )\r\n\t{\r\n\t\tDeleteObject(dword_10029450);\r\n\t\tdword_10029450 = 0;\r\n\t}\r\n\tresult = h;\r\n\tif ( h )\r\n\t{\r\n\t\tresult = (HGDIOBJ)DeleteObject(h);\r\n\t\th = 0;\r\n\t}\r\n\twhile ( 1 )\r\n\t{\r\n\t\tv1 = dword_10029460[2];\r\n\t\tif ( v1 <= 0 )\r\n\t\t\tbreak;\r\n\t\tbn_prof_100027D8((DWORD *)dword_10029460[2]);\r\n\t\tresult = (HGDIOBJ)SMemFree(v1, \".?AU_DRAWTEXT@@\", -2, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10002410\r\nDWORD *__fastcall bn_prof_10002410(HDC hdc, DWORD *a2) { return 0; }\r\n/* {\r\n\tHDC v2; // ebp\r\n\tDWORD *v3; // esi\r\n\tDWORD *v4; // eax\r\n\tDWORD *v5; // ebx\r\n\tDWORD *v6; // esi\r\n\r\n\tv2 = hdc;\r\n\tv3 = a2;\r\n\tv4 = bn_prof_10002782(dword_10029460, 2, 0, 0);\r\n\tv5 = v4;\r\n\tv4[2] = v2;\r\n\tv4[3] = *v3;\r\n\t++v3;\r\n\tv4[4] = *v3;\r\n\t++v3;\r\n\tv4[5] = *v3;\r\n\tv4[6] = v3[1];\r\n\tv4[7] = 0;\r\n\tv4[8] = 0;\r\n\tv6 = v4 + 9;\r\n\tGetTextMetricsA(v2, (LPTEXTMETRICA)(v4 + 9));\r\n\tv5[23] = *v6 + v5[13];\r\n\treturn v5;\r\n} */\r\n\r\n// ref: 0x10002456\r\nsigned int __fastcall bn_prof_10002456(int a1, const CHAR *a2, char a3, DWORD *a4) { return 0; }\r\n/* {\r\n\tint v4; // esi\r\n\tHGDIOBJ v6; // edi\r\n\tint v7; // eax\r\n\tint v8; // ecx\r\n\tint v9; // edi\r\n\tint v10; // eax\r\n\tint v11; // eax\r\n\tint v12; // eax\r\n\tLPCSTR v13; // ebx\r\n\tLONG v14; // ecx\r\n\tint v15; // eax\r\n\tint v16; // eax\r\n\tint v17; // eax\r\n\tint v18; // ecx\r\n\tconst CHAR *v19; // eax\r\n\tint v20; // eax\r\n\tint v21; // eax\r\n\tCOLORREF v22; // [esp-Ch] [ebp-2Ch]\r\n\tstruct tagSIZE Size; // [esp+4h] [ebp-1Ch]\r\n\tCOLORREF color; // [esp+Ch] [ebp-14h]\r\n\tHGDIOBJ h; // [esp+10h] [ebp-10h]\r\n\tint cchString; // [esp+14h] [ebp-Ch]\r\n\tLPCSTR lpszString; // [esp+18h] [ebp-8h]\r\n\tint nFit; // [esp+1Ch] [ebp-4h]\r\n\tint v29; // [esp+28h] [ebp+8h]\r\n\r\n\tv4 = a1;\r\n\tlpszString = a2;\r\n\tif ( !a1 )\r\n\t\treturn 0;\r\n\tcchString = strlen(a2);\r\n\tif ( a4 )\r\n\t\tmemset(a4, 0, 0x10u);\r\n\th = 0;\r\n\tif ( a3 & 2 )\r\n\t{\r\n\t\tv6 = ::h;\r\n\t\tv7 = dword_1002946C;\r\n\t\tv22 = 16711680;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv6 = dword_10029450;\r\n\t\tv7 = dword_10029458;\r\n\t\tv22 = 0xFFFFFF;\r\n\t}\r\n\tv29 = v7;\r\n\tcolor = SetTextColor(*(HDC *)(v4 + 8), v22);\r\n\tif ( v6 )\r\n\t\th = SelectObject(*(HDC *)(v4 + 8), v6);\r\n\tif ( a4 )\r\n\t{\r\n\t\t*a4 = *(DWORD *)(v4 + 28);\r\n\t\ta4[1] = *(DWORD *)(v4 + 32);\r\n\t}\r\n\tdo\r\n\t{\r\n\t\twhile ( cchString > 0 && *(WORD *)lpszString == 2573 )\r\n\t\t{\r\n\t\t\tv8 = *(DWORD *)(v4 + 92);\r\n\t\t\tcchString -= 2;\r\n\t\t\t*(DWORD *)(v4 + 32) += v8;\r\n\t\t\tlpszString += 2;\r\n\t\t\t*(DWORD *)(v4 + 28) = 0;\r\n\t\t}\r\n\t\tif ( !cchString )\r\n\t\t\tbreak;\r\n\t\tnFit = 0;\r\n\t\tGetTextExtentExPointA(\r\n\t\t\t*(HDC *)(v4 + 8),\r\n\t\t\tlpszString,\r\n\t\t\tcchString,\r\n\t\t\t*(DWORD *)(v4 + 20) - *(DWORD *)(v4 + 28) - *(DWORD *)(v4 + 12) - v29 + 1,\r\n\t\t\t&nFit,\r\n\t\t\t0,\r\n\t\t\t&Size);\r\n\t\tv9 = nFit;\r\n\t\tif ( nFit )\r\n\t\t{\r\n\t\t\tif ( nFit < cchString )\r\n\t\t\t{\r\n\t\t\t\tif ( nFit > 0 )\r\n\t\t\t\t{\r\n\t\t\t\t\tdo\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif ( isspace(lpszString[v9]) )\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t--v9;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile ( v9 > 0 );\r\n\t\t\t\t\tif ( v9 > 0 )\r\n\t\t\t\t\t{\r\nLABEL_26:\r\n\t\t\t\t\t\t++v9;\r\n\t\t\t\t\t\tgoto LABEL_27;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif ( *(DWORD *)(v4 + 28) > 0 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( isspace(lpszString[v9]) )\r\n\t\t\t\t\t\tgoto LABEL_26;\r\nLABEL_27:\r\n\t\t\t\t\tnFit = v9;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tv11 = 0;\r\n\t\t\tif ( nFit > 0 )\r\n\t\t\t{\r\n\t\t\t\twhile ( *(WORD *)&lpszString[v11] != 2573 && lpszString[v11] != 9 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( ++v11 >= nFit )\r\n\t\t\t\t\t\tgoto LABEL_34;\r\n\t\t\t\t}\r\n\t\t\t\tnFit = v11;\r\n\t\t\t}\r\nLABEL_34:\r\n\t\t\tif ( a4 )\r\n\t\t\t{\r\n\t\t\t\tv12 = *(DWORD *)(v4 + 28);\r\n\t\t\t\tif ( v12 < *a4 )\r\n\t\t\t\t\t*a4 = v12;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tExtTextOutA(\r\n\t\t\t\t\t*(HDC *)(v4 + 8),\r\n\t\t\t\t\t*(DWORD *)(v4 + 28),\r\n\t\t\t\t\t*(DWORD *)(v4 + 32),\r\n\t\t\t\t\t4u,\r\n\t\t\t\t\t(const RECT *)(v4 + 12),\r\n\t\t\t\t\tlpszString,\r\n\t\t\t\t\tnFit,\r\n\t\t\t\t\t0);\r\n\t\t\t}\r\n\t\t\tv13 = lpszString;\r\n\t\t\tGetTextExtentPoint32A(*(HDC *)(v4 + 8), lpszString, nFit, &Size);\r\n\t\t\tv14 = Size.cx;\r\n\t\t\tif ( a4 )\r\n\t\t\t{\r\n\t\t\t\tv15 = Size.cx + *(DWORD *)(v4 + 28);\r\n\t\t\t\tif ( v15 > a4[2] )\r\n\t\t\t\t\ta4[2] = v15;\r\n\t\t\t\tv16 = Size.cy + *(DWORD *)(v4 + 32);\r\n\t\t\t\tif ( v16 > a4[3] )\r\n\t\t\t\t\ta4[3] = v16;\r\n\t\t\t}\r\n\t\t\tv17 = nFit;\r\n\t\t\t*(DWORD *)(v4 + 28) += v14;\r\n\t\t\tv18 = *(DWORD *)(v4 + 28);\r\n\t\t\tif ( v17 < cchString )\r\n\t\t\t{\r\n\t\t\t\tv19 = &v13[v17];\r\n\t\t\t\tif ( *v19 == 9 )\r\n\t\t\t\t{\r\n\t\t\t\t\t++nFit;\r\n\t\t\t\t\t*(DWORD *)(v4 + 28) = 8 * v29 + v18 - v18 % (8 * v29);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( *(WORD *)v19 == 2573 )\r\n\t\t\t\t\t\tnFit += 2;\r\n\t\t\t\t\tv20 = *(DWORD *)(v4 + 92);\r\n\t\t\t\t\t*(DWORD *)(v4 + 28) = 0;\r\n\t\t\t\t\t*(DWORD *)(v4 + 32) += v20;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcchString -= nFit;\r\n\t\t\tlpszString += nFit;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tv10 = *(DWORD *)(v4 + 92);\r\n\t\t*(DWORD *)(v4 + 28) &= nFit;\r\n\t\t*(DWORD *)(v4 + 32) += v10;\r\n\t}\r\n\twhile ( cchString > 0 );\r\n\tif ( *(DWORD *)(v4 + 28) > *(DWORD *)(v4 + 20) - *(DWORD *)(v4 + 12) - v29 + 1 )\r\n\t{\r\n\t\tv21 = *(DWORD *)(v4 + 92);\r\n\t\t*(DWORD *)(v4 + 28) = 0;\r\n\t\t*(DWORD *)(v4 + 32) += v21;\r\n\t}\r\n\tif ( h )\r\n\t\tSelectObject(*(HDC *)(v4 + 8), h);\r\n\tSetTextColor(*(HDC *)(v4 + 8), color);\r\n\treturn 1;\r\n} */\r\n// 10029458: using guessed type int dword_10029458;\r\n// 1002946C: using guessed type int dword_1002946C;\r\n\r\n// ref: 0x100026B9\r\nsigned int bn_prof_100026B9() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_10029454 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 10029454: using guessed type int dword_10029454;\r\n\r\n// ref: 0x100026C4\r\nsigned int UNKCALL bn_prof_100026C4(DWORD *arg) { return 0; }\r\n/* {\r\n\tif ( !arg )\r\n\t\treturn 0;\r\n\tbn_prof_10002749((char *)dword_10029460, arg);\r\n\treturn 1;\r\n} */\r\n\r\n// ref: 0x100026F0\r\nvoid UNKCALL bn_prof_100026F0(DWORD *arg) { return; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\r\n\tv1 = arg;\r\n\tbn_prof_1000287D(arg);\r\n\tbn_prof_10002890(v1 + 1);\r\n} */\r\n\r\n// ref: 0x10002749\r\nint UNKCALL bn_prof_10002749(char *arg, DWORD *a2) { return 0; }\r\n/* {\r\n\tint v2; // eax\r\n\tint v3; // eax\r\n\tint v4; // esi\r\n\r\n\tv2 = (int)a2;\r\n\tif ( !a2 )\r\n\t\tv2 = (int)(arg + 4);\r\n\tv3 = *(DWORD *)(v2 + 4);\r\n\tif ( v3 > 0 )\r\n\t\tv4 = v3;\r\n\telse\r\n\t\tv4 = 0;\r\n\tbn_prof_100027D8(a2);\r\n\tSMemFree(a2, \".?AU_DRAWTEXT@@\", -2, 0);\r\n\treturn v4;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10002782\r\nDWORD *UNKCALL bn_prof_10002782(int *arg, int a2, int a3, int a4) { return 0; }\r\n/* {\r\n\tint v4; // eax\r\n\tint *v5; // edi\r\n\tDWORD *v6; // eax\r\n\tDWORD *v7; // esi\r\n\r\n\tv4 = a4;\r\n\tLOBYTE(v4) = a4 | 8;\r\n\tv5 = arg;\r\n\tv6 = (DWORD *)SMemAlloc(a3 + 96, \".?AU_DRAWTEXT@@\", -2, v4);\r\n\tif ( v6 )\r\n\t\tv7 = bn_prof_100027CE(v6);\r\n\telse\r\n\t\tv7 = 0;\r\n\tif ( a2 )\r\n\t\tbn_prof_1000280C(v5, v7, a2, 0);\r\n\treturn v7;\r\n} */\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x100027CE\r\nDWORD *UNKCALL bn_prof_100027CE(DWORD *arg) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\r\n\tresult = arg;\r\n\t*arg = 0;\r\n\targ[1] = 0;\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x100027D8\r\nvoid UNKCALL bn_prof_100027D8(DWORD *arg) { return; }\r\n/* {\r\n\tDWORD *v1; // ST00_4\r\n\r\n\tv1 = arg;\r\n\tbn_prof_10002890(arg);\r\n\tbn_prof_10002890(v1);\r\n} */\r\n\r\n// ref: 0x1000280C\r\nDWORD *UNKCALL bn_prof_1000280C(int *arg, DWORD *a2, int a3, DWORD *a4) { return 0; }\r\n/* {\r\n\tint *v4; // edi\r\n\tDWORD *v5; // esi\r\n\tDWORD *result; // eax\r\n\tint v7; // ecx\r\n\tint v8; // edx\r\n\tint v9; // ecx\r\n\tint v10; // edx\r\n\r\n\tv4 = arg;\r\n\tv5 = a2;\r\n\tif ( !a2 )\r\n\t\tv5 = arg + 1;\r\n\tif ( *v5 )\r\n\t\tbn_prof_10002890(v5);\r\n\tresult = a4;\r\n\tif ( !a4 )\r\n\t\tresult = v4 + 1;\r\n\tif ( a3 == 1 )\r\n\t{\r\n\t\t*v5 = result;\r\n\t\tv5[1] = result[1];\r\n\t\tv8 = result[1];\r\n\t\tv9 = *v4;\r\n\t\tif ( v8 > 0 )\r\n\t\t{\r\n\t\t\tif ( v9 < 0 )\r\n\t\t\t\tv9 = (int)result - *(DWORD *)(*result + 4);\r\n\t\t\tv10 = v9 + v8;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tv10 = ~v8;\r\n\t\t}\r\n\t\t*(DWORD *)v10 = v5;\r\n\t\tresult[1] = a2;\r\n\t}\r\n\telse if ( a3 == 2 )\r\n\t{\r\n\t\tv7 = *result;\r\n\t\t*v5 = *result;\r\n\t\tv5[1] = *(DWORD *)(v7 + 4);\r\n\t\t*(DWORD *)(v7 + 4) = a2;\r\n\t\t*result = v5;\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000287D\r\nvoid UNKCALL bn_prof_1000287D(DWORD *arg) { return; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tDWORD *v2; // ecx\r\n\r\n\tv1 = arg;\r\n\twhile ( 1 )\r\n\t{\r\n\t\tv2 = (DWORD *)v1[2];\r\n\t\tif ( (signed int)v2 <= 0 )\r\n\t\t\tbreak;\r\n\t\tbn_prof_10002890(v2);\r\n\t}\r\n} */\r\n\r\n// ref: 0x10002890\r\nvoid UNKCALL bn_prof_10002890(DWORD *arg) { return; }\r\n/* {\r\n\tint v1; // esi\r\n\tint v2; // edx\r\n\tint v3; // edx\r\n\r\n\tv1 = *arg;\r\n\tif ( *arg )\r\n\t{\r\n\t\tv2 = arg[1];\r\n\t\tif ( v2 > 0 )\r\n\t\t\tv3 = (int)arg + v2 - *(DWORD *)(v1 + 4);\r\n\t\telse\r\n\t\t\tv3 = ~v2;\r\n\t\t*(DWORD *)v3 = v1;\r\n\t\t*(DWORD *)(*arg + 4) = arg[1];\r\n\t\t*arg = 0;\r\n\t\targ[1] = 0;\r\n\t}\r\n} */\r\n"
  },
  {
    "path": "DiabloUI/bnetgw.cpp",
    "content": "// ref: 0x100028C2\r\nvoid UNKCALL BNetGW_100028C2(DWORD *arg) { return; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tbool v2; // zf\r\n\tbool v3; // sf\r\n\tint v4; // edi\r\n\tint v5; // eax\r\n\tint v6; // edi\r\n\tint v7; // ST08_4\r\n\tint v8; // eax\r\n\tsigned int v9; // eax\r\n\tstruct _TIME_ZONE_INFORMATION TimeZoneInformation; // [esp+Ch] [ebp-B8h]\r\n\tchar *v11; // [esp+B8h] [ebp-Ch]\r\n\tint v12; // [esp+BCh] [ebp-8h]\r\n\tint v13; // [esp+C0h] [ebp-4h]\r\n\r\n\tv1 = arg;\r\n\targ[2] = 0;\r\n\targ[3] = 0;\r\n\targ[4] = 0;\r\n\targ[5] = 0;\r\n\targ[6] = 0;\r\n\t*(BYTE *)arg = 0;\r\n\tBNetGW_10002C23(arg);\r\n\tif ( !v1[4] )\r\n\t\tgoto LABEL_15;\r\n\tif ( v1[6] < 0x3E8u )\r\n\t{\r\n\t\tv1[1] = 0;\r\n\t\tBNetGW_10002A07(v1);\r\n\t\tSRegDeleteValue(\"Configuration\", \"Battle.net gateways\", 2u);\r\n\t}\r\n\tif ( !v1[4] )\r\nLABEL_15:\r\n\t\tBNetGW_10002C51(v1);\r\n\tif ( v1[6] >= 0x3E8u )\r\n\t{\r\n\t\tv2 = v1[5] == 0;\r\n\t\tv3 = v1[5] < 0;\r\n\t\tv4 = v1[4];\r\n\t\tv13 = -2;\r\n\t\tv12 = 0;\r\n\t\tif ( !v3 && !v2 )\r\n\t\t{\r\n\t\t\tdo\r\n\t\t\t{\r\n\t\t\t\tv5 = SStrLen(v4) + 1;\r\n\t\t\t\tv12 += v5;\r\n\t\t\t\tv4 += v5;\r\n\t\t\t\t++v13;\r\n\t\t\t}\r\n\t\t\twhile ( v12 < v1[5] );\r\n\t\t}\r\n\t\tv6 = v1[4];\r\n\t\tv7 = v1[4];\r\n\t\tv1[2] = v13 / 3;\r\n\t\tv8 = SStrLen(v7);\r\n\t\tv9 = strtoul((const char *)(v6 + v8 + 1), &v11, 10);\r\n\t\tv1[3] = v9;\r\n\t\tv1[1] = 0;\r\n\t\tif ( v9 < 1 || v9 > v1[2] )\r\n\t\t{\r\n\t\t\tSMemZero(&TimeZoneInformation, 172);\r\n\t\t\tGetTimeZoneInformation(&TimeZoneInformation);\r\n\t\t\tBNetGW_100029BF(v1, TimeZoneInformation.Bias);\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv1[2] = 0;\r\n\t\tv1[3] = 0;\r\n\t}\r\n} */\r\n// 100103A0: using guessed type int __stdcall SStrLen(DWORD);\r\n// 100103C4: using guessed type int __stdcall SMemZero(DWORD, DWORD);\r\n// 100103CA: using guessed type int __stdcall SRegDeleteValue(const char *, const char *, unsigned int);\r\n\r\n// ref: 0x100029BF\r\nvoid UNKCALL BNetGW_100029BF(DWORD *arg, int a2) { return; }\r\n/* {\r\n\tDWORD *v2; // esi\r\n\tchar *v3; // edi\r\n\tsigned int v4; // ebx\r\n\tsigned int v5; // ebp\r\n\tint v6; // eax\r\n\tint v7; // eax\r\n\r\n\tv2 = arg;\r\n\tv3 = (char *)1;\r\n\tv4 = 1380;\r\n\tv5 = 1;\r\n\tif ( arg[2] >= 1 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv6 = BNetGW_10002AF0(v2, v3);\r\n\t\t\tv7 = abs(60 * v6 - a2);\r\n\t\t\tif ( v7 < v4 )\r\n\t\t\t{\r\n\t\t\t\tv4 = v7;\r\n\t\t\t\tv5 = (signed int)v3;\r\n\t\t\t}\r\n\t\t\t++v3;\r\n\t\t}\r\n\t\twhile ( (signed int)v3 <= v2[2] );\r\n\t}\r\n\tBNetGW_10002B51(v2, v5);\r\n} */\r\n\r\n// ref: 0x10002A07\r\nvoid *UNKCALL BNetGW_10002A07(DWORD *arg) { return 0; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tint v2; // edi\r\n\tBYTE *v3; // ecx\r\n\tconst char *v4; // eax\r\n\tint result; // eax\r\n\r\n\tv1 = arg;\r\n\tif ( arg[1] )\r\n\t{\r\n\t\tv2 = arg[4];\r\n\t\tif ( v2 )\r\n\t\t{\r\n\t\t\tv3 = (BYTE *)(v2 + SStrLen(arg[4]) + 1);\r\n\t\t\t*v3 = v1[3] / 10 + 48;\r\n\t\t\tv4 = \"Override Battle.net gateways\";\r\n\t\t\tv3[1] = v1[3] % 10 + 48;\r\n\t\t\tif ( !v1[7] )\r\n\t\t\t\tv4 = \"Battle.net gateways\";\r\n\t\t\tSRegSaveData(\"Configuration\", v4, 0x82u, (void *)v1[4], v1[5]);\r\n\t\t}\r\n\t}\r\n\tresult = v1[4];\r\n\tif ( result )\r\n\t{\r\n\t\tresult = SMemFree(result, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\BNetGW.cpp\", 152, 0);\r\n\t\tv1[4] = 0;\r\n\t\tv1[5] = 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 100103A0: using guessed type int __stdcall SStrLen(DWORD);\r\n// 100103D0: using guessed type int __stdcall SRegSaveData(const char *, const char *, unsigned int, void *, unsigned int);\r\n\r\n// ref: 0x10002A84\r\nDWORD *UNKCALL BNetGW_10002A84(DWORD *arg, signed int a2) { return 0; }\r\n/* {\r\n\tsigned int v2; // eax\r\n\tsigned int v3; // ebx\r\n\tint v4; // esi\r\n\tint v5; // edi\r\n\tbool v6; // sf\r\n\tunsigned char v7; // of\r\n\tint v8; // eax\r\n\tDWORD *result; // eax\r\n\tDWORD *v10; // [esp+8h] [ebp-4h]\r\n\tDWORD *v11; // [esp+14h] [ebp+8h]\r\n\r\n\tv10 = arg;\r\n\tif ( !arg[4] )\r\n\t\treturn arg;\r\n\tv2 = a2;\r\n\tv3 = 1;\r\n\tif ( a2 < 1 || a2 > arg[2] )\r\n\t\treturn arg;\r\n\tv4 = 3 * a2;\r\n\tv5 = 0;\r\n\tv11 = (DWORD *)arg[4];\r\n\tif ( 3 * v2 <= 1 )\r\n\t{\r\nLABEL_7:\r\n\t\tv7 = __OFSUB__(v5, arg[5]);\r\n\t\tv6 = v5 - arg[5] < 0;\r\n\t}\r\n\telse\r\n\t{\r\n\t\twhile ( 1 )\r\n\t\t{\r\n\t\t\tv7 = __OFSUB__(v5, arg[5]);\r\n\t\t\tv6 = v5 - arg[5] < 0;\r\n\t\t\tif ( v5 >= arg[5] )\r\n\t\t\t\tbreak;\r\n\t\t\tv8 = SStrLen(v11);\r\n\t\t\targ = v10;\r\n\t\t\tv11 = (DWORD *)((char *)v11 + ++v8);\r\n\t\t\tv5 += v8;\r\n\t\t\tif ( ++v3 >= v4 )\r\n\t\t\t\tgoto LABEL_7;\r\n\t\t}\r\n\t}\r\n\tif ( !(v6 ^ v7) )\r\n\t\treturn arg;\r\n\tresult = v11;\r\n\tif ( v3 > v4 )\r\n\t\treturn arg;\r\n\treturn result;\r\n} */\r\n// 100103A0: using guessed type int __stdcall SStrLen(DWORD);\r\n\r\n// ref: 0x10002AE5\r\nsigned int BNetGW_10002AE5() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_10029478 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 10029478: using guessed type int dword_10029478;\r\n\r\n// ref: 0x10002AF0\r\nint UNKCALL BNetGW_10002AF0(DWORD *arg, char *a2) { return 0; }\r\n/* {\r\n\tconst char *v2; // eax\r\n\tconst char *v3; // esi\r\n\r\n\tv2 = (const char *)BNetGW_10002A84(arg, (signed int)a2);\r\n\tv3 = v2;\r\n\tif ( *v2 )\r\n\t\tv3 = &v2[SStrLen(v2) + 1];\r\n\treturn strtol(v3, &a2, 10);\r\n} */\r\n// 100103A0: using guessed type int __stdcall SStrLen(DWORD);\r\n\r\n// ref: 0x10002B21\r\nBYTE *UNKCALL BNetGW_10002B21(DWORD *arg, signed int a2) { return 0; }\r\n/* {\r\n\tDWORD *v2; // eax\r\n\tBYTE *v3; // esi\r\n\r\n\tv2 = BNetGW_10002A84(arg, a2);\r\n\tv3 = v2;\r\n\tif ( *(BYTE *)v2 )\r\n\t{\r\n\t\tv3 = (char *)v2 + SStrLen(v2) + 1;\r\n\t\tif ( *v3 )\r\n\t\t\tv3 += SStrLen(v3) + 1;\r\n\t}\r\n\treturn v3;\r\n} */\r\n// 100103A0: using guessed type int __stdcall SStrLen(DWORD);\r\n\r\n// ref: 0x10002B51\r\nvoid UNKCALL BNetGW_10002B51(DWORD *arg, signed int a2) { return; }\r\n/* {\r\n\tsigned int v2; // eax\r\n\r\n\tif ( arg[4] )\r\n\t{\r\n\t\tv2 = a2;\r\n\t\tif ( a2 >= 1 && a2 <= arg[2] )\r\n\t\t{\r\n\t\t\tif ( a2 > 99 )\r\n\t\t\t\tv2 = 99;\r\n\t\t\targ[3] = v2;\r\n\t\t\targ[1] = 1;\r\n\t\t}\r\n\t}\r\n} */\r\n\r\n// ref: 0x10002B78\r\nchar *UNKCALL BNetGW_10002B78(DWORD *arg, char *a2) { return 0; }\r\n/* {\r\n\tDWORD *v2; // esi\r\n\tchar *result; // eax\r\n\tchar *v4; // ST08_4\r\n\tvoid *v5; // eax\r\n\tchar *v6; // [esp+Ch] [ebp-4h]\r\n\r\n\tv2 = arg;\r\n\tv6 = 0;\r\n\tresult = (char *)SRegLoadData(\"Configuration\", a2, 0x82u, 0, 0, (unsigned int *)&v6);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = v6;\r\n\t\tif ( v6 )\r\n\t\t{\r\n\t\t\tv4 = v6;\r\n\t\t\tv2[5] = v6;\r\n\t\t\tv5 = (void *)SMemAlloc(v4, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\BNetGW.cpp\", 263, 0);\r\n\t\t\tv2[4] = v5;\r\n\t\t\tif ( !SRegLoadData(\"Configuration\", a2, 0x82u, v5, v2[5], 0) )\r\n\t\t\t{\r\n\t\t\t\tSMemFree(v2[4], \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\BNetGW.cpp\", 271, 0);\r\n\t\t\t\tv2[4] = 0;\r\n\t\t\t\tv2[5] = 0;\r\n\t\t\t}\r\n\t\t\tresult = (char *)v2[4];\r\n\t\t\tv2[6] = 0;\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\ta2 = result;\r\n\t\t\t\tv2[6] = strtoul(result, &a2, 10);\r\n\t\t\t\tresult = (char *)v2[4];\r\n\t\t\t\tif ( result == a2 )\r\n\t\t\t\t\tv2[6] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n// 100103D6: using guessed type int __stdcall SRegLoadData(const char *, const char *, unsigned int, void *, unsigned int, unsigned int *);\r\n\r\n// ref: 0x10002C23\r\nchar *UNKCALL BNetGW_10002C23(DWORD *arg) { return 0; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tchar *result; // eax\r\n\r\n\tv1 = arg;\r\n\targ[7] = 0;\r\n\tresult = BNetGW_10002B78(arg, \"Override Battle.net gateways\");\r\n\tif ( !v1[4] )\r\n\t\treturn BNetGW_10002B78(v1, \"Battle.net gateways\");\r\n\tv1[7] = 1;\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x10002C51\r\nint UNKCALL BNetGW_10002C51(DWORD *arg) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\tchar *v2; // edi\r\n\tchar *v3; // esi\r\n\tunsigned int v4; // ebx\r\n\tchar *v5; // esi\r\n\tBYTE *v6; // esi\r\n\tchar *v7; // eax\r\n\tchar *v8; // eax\r\n\tBYTE *v9; // esi\r\n\tchar *v10; // esi\r\n\tchar v11; // al\r\n\tunsigned int v12; // esi\r\n\tchar *v13; // [esp+4h] [ebp-10h]\r\n\tint v14; // [esp+8h] [ebp-Ch]\r\n\tint v15; // [esp+Ch] [ebp-8h]\r\n\tDWORD *v16; // [esp+10h] [ebp-4h]\r\n\r\n\tv15 = 0;\r\n\tv16 = arg;\r\n\tresult = BNetGW_10002DBF(&v15);\r\n\tv2 = (char *)result;\r\n\tv14 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tv3 = (char *)SMemAlloc(2 * v15, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\BNetGW.cpp\", 358, 0);\r\n\t\tv13 = v3;\r\n\t\tv4 = (unsigned int)&v2[v15];\r\n\t\tsprintf(v3, \"%d\", 1000);\r\n\t\tv5 = &v3[SStrLen(v3) + 1];\r\n\t\t*v5++ = 48;\r\n\t\t*v5++ = 48;\r\n\t\t*v5 = 0;\r\n\t\tv6 = v5 + 1;\r\n\t\tif ( (unsigned int)v2 < v4 )\r\n\t\t{\r\n\t\t\tif ( (unsigned int)v2 >= v4 )\r\n\t\t\t\tgoto LABEL_8;\r\n\t\t\tdo\r\n\t\t\t{\r\n\t\t\t\tif ( *v2 == 35 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv7 = BNetGW_10002DEB(v2, v4);\r\n\t\t\t\t\tv8 = BNetGW_10002E0B(v7, v4);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tdo\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif ( isspace(*v2) )\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t*v6++ = *v2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twhile ( (unsigned int)v2 < v4 );\r\nLABEL_8:\r\n\t\t\t\t\t*v6 = 0;\r\n\t\t\t\t\tv9 = v6 + 1;\r\n\t\t\t\t\tif ( (unsigned int)v2 < v4 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdo\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif ( !isspace(*v2) )\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t++v2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twhile ( (unsigned int)v2 < v4 );\r\n\t\t\t\t\t\twhile ( (unsigned int)v2 < v4 && !isspace(*v2) )\r\n\t\t\t\t\t\t\t*v9++ = *v2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t*v9 = 0;\r\n\t\t\t\t\tv10 = v9 + 1;\r\n\t\t\t\t\tif ( (unsigned int)v2 < v4 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdo\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif ( !isspace(*v2) )\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t++v2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twhile ( (unsigned int)v2 < v4 );\r\n\t\t\t\t\t\twhile ( (unsigned int)v2 < v4 )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv11 = *v2;\r\n\t\t\t\t\t\t\tif ( *v2 == 13 || v11 == 10 )\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t*v10++ = v11;\r\n\t\t\t\t\t\t\t++v2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t*v10 = 0;\r\n\t\t\t\t\tv6 = v10 + 1;\r\n\t\t\t\t\tv8 = BNetGW_10002E0B(v2, v4);\r\n\t\t\t\t}\r\n\t\t\t\tv2 = v8;\r\n\t\t\t}\r\n\t\t\twhile ( (unsigned int)v8 < v4 );\r\n\t\t}\r\n\t\t*v6 = 0;\r\n\t\tv12 = v6 - v13 + 1;\r\n\t\tSRegSaveData(\"Configuration\", \"Battle.net gateways\", 0x82u, v13, v12);\r\n\t\tSMemFree(v14, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\BNetGW.cpp\", 429, 0);\r\n\t\tresult = (int)v16;\r\n\t\tv16[5] = v12;\r\n\t\t*(DWORD *)(result + 16) = v13;\r\n\t\t*(DWORD *)(result + 24) = 1000;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n// 100103A0: using guessed type int __stdcall SStrLen(DWORD);\r\n// 100103D0: using guessed type int __stdcall SRegSaveData(const char *, const char *, unsigned int, void *, unsigned int);\r\n\r\n// ref: 0x10002DBF\r\nint UNKCALL BNetGW_10002DBF(DWORD *arg) { return 0; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tint v3; // [esp+4h] [ebp-8h]\r\n\tint v4; // [esp+8h] [ebp-4h]\r\n\r\n\tv4 = 0;\r\n\tv1 = arg;\r\n\tSFileLoadFile(\"rez\\\\gateways.txt\", &v3, &v4, 0, 0);\r\n\t*v1 = v4;\r\n\treturn v3;\r\n} */\r\n// 100103DC: using guessed type int __stdcall SFileLoadFile(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10002DEB\r\nchar *__stdcall BNetGW_10002DEB(char *a1, unsigned int a2) { return 0; }\r\n/* {\r\n\tchar *result; // eax\r\n\tchar v3; // cl\r\n\r\n\tfor ( result = a1; (unsigned int)result < a2; ++result )\r\n\t{\r\n\t\tv3 = *result;\r\n\t\tif ( !*result || v3 == 13 || v3 == 10 )\r\n\t\t\tbreak;\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x10002E0B\r\nchar *__stdcall BNetGW_10002E0B(char *a1, unsigned int a2) { return 0; }\r\n/* {\r\n\tchar *result; // eax\r\n\tchar v3; // cl\r\n\r\n\tfor ( result = a1; (unsigned int)result < a2; ++result )\r\n\t{\r\n\t\tv3 = *result;\r\n\t\tif ( !*result || v3 != 13 && v3 != 10 )\r\n\t\t\tbreak;\r\n\t}\r\n\treturn result;\r\n} */\r\n"
  },
  {
    "path": "DiabloUI/connect.cpp",
    "content": "// ref: 0x10002E2B\r\nvoid __cdecl Connect_FreeConnectData()\r\n{\r\n\tHANDLE *v0; // edi\r\n\r\n\tif (connect_data1) {\r\n\t\tSMemFree(connect_data1, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Connect.cpp\", 124, 0);\r\n\t\tconnect_data1 = 0;\r\n\t}\r\n\tif (connect_data2) {\r\n\t\tSMemFree(connect_data2, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Connect.cpp\", 129, 0);\r\n\t\tconnect_data2 = 0;\r\n\t}\r\n\tv0 = connect_trans;\r\n\tdo {\r\n\t\tif (*v0) {\r\n\t\t\tSTransDelete(*v0);\r\n\t\t\t*v0 = 0;\r\n\t\t}\r\n\t\t++v0;\r\n\t} while ((signed int)v0 < (signed int)&connect_trans[10]);\r\n\tif (connect_data3) {\r\n\t\tSMemFree(connect_data3, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Connect.cpp\", 141, 0);\r\n\t\tconnect_data3 = 0;\r\n\t}\r\n\tif (connect_data4) {\r\n\t\tSMemFree(connect_data4, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Connect.cpp\", 146, 0);\r\n\t\tconnect_data4 = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x10002EC4\r\nBOOL __cdecl Connect_LoadGFXAndStuff()\r\n{\r\n\tHANDLE *v0; // esi\r\n\tint v1;     // ebx\r\n\tint a5[4];  // [esp+4h] [ebp-14h]\r\n\tBYTE *a2;   // [esp+14h] [ebp-4h]\r\n\r\n\ta2 = 0;\r\n\tif (!connect_data1 && !connect_trans[0]) {\r\n\t\tlocal_LoadArtImage(\"ui_art\\\\heroport.pcx\", &connect_data1, heroport_data);\r\n\t\tlocal_LoadArtImage(\"ui_art\\\\spwnport.pcx\", &connect_data2, 0);\r\n\t\tlocal_LoadArtImage(\"ui_art\\\\heronum.pcx\", &a2, heronum_data);\r\n\t\tlocal_LoadArtImage(\"ui_art\\\\special.pcx\", &connect_data3, special_data);\r\n\t\tconnect_draw_height = 14;\r\n\t\theronum_frames      = (signed int)heronum_data[1] / 10;\r\n\t\tspecial_frames      = (signed int)special_data[1] / 8;\r\n\t\theronum_frames2     = (signed int)heronum_data[1] / 10 * heronum_data[0];\r\n\t\theroport_frames     = 14 * heroport_data[0];\r\n\t\tv0                  = connect_trans;\r\n\t\tconnect_data4       = SMemAlloc(14 * heroport_data[0], \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Connect.cpp\", 194, 0);\r\n\t\tmemset(connect_trans, 0, 0x28u);\r\n\t\tif (a2) {\r\n\t\t\tv1 = 0;\r\n\t\t\tdo {\r\n\t\t\t\ta5[0] = 0;\r\n\t\t\t\ta5[2] = heronum_data[0] - 1;\r\n\t\t\t\ta5[1] = v1 * heronum_frames;\r\n\t\t\t\ta5[3] = heronum_frames + v1 * heronum_frames - 1;\r\n\t\t\t\tSTransCreateI(a2, heronum_data[0], heronum_frames, 8, (int)a5, 16777455, v0);\r\n\t\t\t\t++v0;\r\n\t\t\t\t++v1;\r\n\t\t\t} while ((signed int)v0 < (signed int)&connect_trans[10]);\r\n\t\t\tSMemFree(a2, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Connect.cpp\", 218, 0);\r\n\t\t}\r\n\t}\r\n\treturn 1;\r\n}\r\n// 100294A4: using guessed type int special_frames;\r\n// 100295B0: using guessed type int heronum_frames2;\r\n// 100295C0: using guessed type int heroport_frames;\r\n\r\n// ref: 0x10003009\r\nBOOL __stdcall UiArtCallback(int game_type, unsigned int art_code, PALETTEENTRY *pPalette, BYTE *pBuffer, DWORD dwBuffersize, DWORD *pdwWidth, DWORD *pdwHeight, DWORD *pdwBpp)\r\n{\r\n\tBOOL result;           // eax\r\n\tchar pszFileName[MAX_PATH]; // [esp+8h] [ebp-104h]\r\n\r\n\tpszFileName[0] = nullcharacter;\r\n\tmemset(&pszFileName[1], 0, 0x100u);\r\n\t*(WORD *)&pszFileName[257] = 0;\r\n\tpszFileName[259]            = 0;\r\n\tSStrCopy(pszFileName, \"ui_art\\\\\", sizeof(pszFileName));\r\n\tif (game_type == 'BNET') {\r\n\t\tif (art_code > 0x80000004) {\r\n\t\t\tswitch (art_code) {\r\n\t\t\tcase 0x80000005:\r\n\t\t\t\tSStrPack(pszFileName, \"bnconnbg.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x80000006:\r\n\t\t\t\tSStrPack(pszFileName, \"bnselchn.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x80000007:\r\n\t\t\t\tSStrPack(pszFileName, \"bnlogin.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x80000008:\r\n\t\t\t\tSStrPack(pszFileName, \"newaccount.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x80000009:\r\n\t\t\t\tSStrPack(pszFileName, \"changepassword.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x8000000A:\r\n\t\t\t\tSStrPack(pszFileName, \"bnladder.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x8000000B:\r\n\t\t\t\tSStrPack(pszFileName, \"badconn.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x8000000C:\r\n\t\t\t\tSStrPack(pszFileName, \"welcome.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x8000000D:\r\n\t\t\t\tSStrPack(pszFileName, \"lepopup.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\tcase 0x8000000E:\r\n\t\t\t\tSStrPack(pszFileName, \"tos.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (art_code == 0x80000004) {\r\n\t\t\t\tSStrPack(pszFileName, \"redlag.pcx\", sizeof(pszFileName));\r\n\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t}\r\n\t\t\tif (art_code > 7) {\r\n\t\t\t\tswitch (art_code) {\r\n\t\t\t\tcase 8u:\r\n\t\t\t\tLABEL_48:\r\n\t\t\t\t\tSStrPack(pszFileName, \"but_lrg.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 0x80000000:\r\n\t\t\t\t\tSStrPack(pszFileName, \"bnbuttns.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 0x80000001:\r\n\t\t\t\t\tSStrPack(pszFileName, \"chat_bkg.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 0x80000002:\r\n\t\t\t\t\tSStrPack(pszFileName, \"greenlag.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 0x80000003:\r\n\t\t\t\t\tSStrPack(pszFileName, \"yellolag.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tswitch (art_code) {\r\n\t\t\t\tcase 7u:\r\n\t\t\t\tLABEL_47:\r\n\t\t\t\t\tSStrPack(pszFileName, \"but_med.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 0u:\r\n\t\t\t\t\tSStrPack(pszFileName, \"bn_bkg.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 2u:\r\n\t\t\t\t\tSStrPack(pszFileName, \"bnjoinbg.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 3u:\r\n\t\t\t\t\tSStrPack(pszFileName, \"hpopup.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 5u:\r\n\t\t\t\tLABEL_46:\r\n\t\t\t\t\tSStrPack(pszFileName, \"but_xsm.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\tcase 6u:\r\n\t\t\t\tLABEL_11:\r\n\t\t\t\t\tSStrPack(pszFileName, \"but_sml.pcx\", sizeof(pszFileName));\r\n\t\t\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (game_type == 'IPXN') {\r\n\t\tif (!art_code) {\r\n\t\t\tSStrPack(pszFileName, \"ipx_bkg.pcx\", sizeof(pszFileName));\r\n\t\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t\t}\r\n\t} else if (!game_type && !art_code) {\r\n\t\tSStrPack(pszFileName, \"connect.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\t}\r\n\tswitch (art_code) {\r\n\tcase 0u:\r\n\tcase 2u:\r\n\t\tSStrPack(pszFileName, \"menu.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 1u:\r\n\tcase 8u:\r\n\t\tgoto LABEL_48;\r\n\tcase 3u:\r\n\tcase 4u:\r\n\t\tSStrPack(pszFileName, \"lpopup.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 5u:\r\n\t\tgoto LABEL_46;\r\n\tcase 6u:\r\n\t\tgoto LABEL_11;\r\n\tcase 7u:\r\n\t\tgoto LABEL_47;\r\n\tcase 9u:\r\n\t\tSStrPack(pszFileName, \"xsmlogo.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0xAu:\r\n\t\tSStrPack(pszFileName, \"prog_bg.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0xBu:\r\n\t\tSStrPack(pszFileName, \"prog_fil.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0xCu:\r\n\t\tSStrPack(pszFileName, \"spopup.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0xDu:\r\n\t\tSStrPack(pszFileName, \"scrlarrw.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0xEu:\r\n\t\tSStrPack(pszFileName, \"scrlthmb.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0xFu:\r\n\t\tSStrPack(pszFileName, \"scrlbar.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x10u:\r\n\t\tSStrPack(pszFileName, \"cmel.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x11u:\r\n\t\tSStrPack(pszFileName, \"cmml.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x12u:\r\n\t\tSStrPack(pszFileName, \"cmbl.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x13u:\r\n\t\tSStrPack(pszFileName, \"cmec.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x14u:\r\n\t\tSStrPack(pszFileName, \"cmmc.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x15u:\r\n\t\tSStrPack(pszFileName, \"cmbc.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x16u:\r\n\t\tSStrPack(pszFileName, \"cmer.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x17u:\r\n\t\tSStrPack(pszFileName, \"cmmr.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x18u:\r\n\t\tSStrPack(pszFileName, \"cmbr.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x19u:\r\n\t\tSStrPack(pszFileName, \"slgray.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x1Au:\r\n\t\tSStrPack(pszFileName, \"slthumb.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x1Bu:\r\n\t\tSStrPack(pszFileName, \"slfocus.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x1Cu:\r\n\t\tSStrPack(pszFileName, \"slleft.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x1Du:\r\n\t\tSStrPack(pszFileName, \"slmiddle.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x1Eu:\r\n\t\tSStrPack(pszFileName, \"slright.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x20u:\r\n\t\tSStrPack(pszFileName, \"but_checkoff.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tcase 0x21u:\r\n\t\tSStrPack(pszFileName, \"but_checkon.pcx\", sizeof(pszFileName));\r\n\t\treturn SBmpLoadImage(pszFileName, pPalette, pBuffer, dwBuffersize, pdwWidth, pdwHeight, pdwBpp);\r\n\tdefault:\r\n\t\tresult = 0;\r\n\t\tbreak;\r\n\t}\r\n\treturn result;\r\n}\r\n// 100103E2: using guessed type unsigned int __stdcall SStrPack(char *, const char *, unsigned int);\r\n\r\n// ref: 0x100033D1\r\nvoid __cdecl Connect_cpp_init()\r\n{\r\n\tConnect_cpp_float = Connect_cpp_float_value;\r\n}\r\n// 1001F3F4: using guessed type int Connect_cpp_float_value;\r\n// 100294A0: using guessed type int Connect_cpp_float;\r\n\r\n// ref: 0x100033DC\r\nBOOL __stdcall UiGetDataCallback(int game_type, int data_code, void *a3, int a4, int a5)\r\n{\r\n\tsigned int v5; // edi\r\n\tDWORD *v6;    // esi\r\n\tHCURSOR v7;    // eax\r\n\r\n\tv5 = 0;\r\n\tif (game_type != 'BNET' || data_code != 0x80000000) {\r\n\t\tswitch (data_code) {\r\n\t\tcase 1:\r\n\t\t\tv5 = 16;\r\n\t\t\tif (!a3)\r\n\t\t\t\tgoto LABEL_24;\r\n\t\t\tif ((unsigned int)a4 >= 0x10) {\r\n\t\t\t\tmemcpy(a3, connect_subnet_ip, 0x10u);\r\n\t\t\t\tgoto LABEL_24;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\tcase 2:\r\n\t\t\tv6 = (DWORD *)a3;\r\n\t\t\tv5 = 4;\r\n\t\t\tif (!a3)\r\n\t\t\t\tgoto LABEL_24;\r\n\t\t\tif ((unsigned int)a4 < 4)\r\n\t\t\t\treturn 0;\r\n\t\t\tv7 = LoadCursorA(ghUiInst, \"DIABLO_LINKCURSOR\");\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tv6 = (DWORD *)a3;\r\n\t\t\tv5 = 4;\r\n\t\t\tif (!a3)\r\n\t\t\t\tgoto LABEL_24;\r\n\t\t\tif ((unsigned int)a4 < 4)\r\n\t\t\t\treturn 0;\r\n\t\t\tv7 = LoadCursorA(ghUiInst, \"DIABLO_ARROWCURSOR\");\r\n\t\t\tbreak;\r\n\t\tcase 4:\r\n\t\t\tv6 = (DWORD *)a3;\r\n\t\t\tv5 = 4;\r\n\t\t\tif (!a3)\r\n\t\t\t\tgoto LABEL_24;\r\n\t\t\tif ((unsigned int)a4 < 4)\r\n\t\t\t\treturn 0;\r\n\t\t\tv7 = LoadCursorA(ghUiInst, \"DIABLOIBEAM\");\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tgoto LABEL_24;\r\n\t\t}\r\n\t\t*v6 = (DWORD)v7;\r\n\t\tif (v7)\r\n\t\t\tgoto LABEL_24;\r\n\t\treturn 0;\r\n\t}\r\n\tv5 = 4;\r\n\tif (a3) {\r\n\t\tif ((unsigned int)a4 >= 4) {\r\n\t\t\t*(DWORD *)a3 = 54;\r\n\t\t\tgoto LABEL_24;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\nLABEL_24:\r\n\tif (a5)\r\n\t\t*(DWORD *)a5 = v5;\r\n\treturn v5 != 0;\r\n}\r\n\r\n// ref: 0x100034AB\r\nBOOL __stdcall UiSoundCallback(int a1, int type, int a3)\r\n{\r\n\tif (type) {\r\n\t\tif (type == 1)\r\n\t\t\tTitleSnd_PlaySelectSound();\r\n\t} else {\r\n\t\tTitleSnd_PlayMoveSound();\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\n// ref: 0x100034C8\r\nBOOL __stdcall UiAuthCallback(int a1, char *a2, char *a3, char a4, char *a5, LPSTR lpBuffer, int cchBufferMax)\r\n{\r\n\tsize_t v7;            // edi\r\n\tsize_t v8;            // ebx\r\n\tint v9;               // ebx\r\n\tchar *v10;            // ebx\r\n\tsize_t v11;           // eax\r\n\tint v12;              // eax\r\n\tint v14;              // eax\r\n\tchar v15[256];        // [esp+0h] [ebp-434h]\r\n\tchar a1a[256];        // [esp+100h] [ebp-334h]\r\n\tchar v17[256];        // [esp+200h] [ebp-234h]\r\n\tchar Buffer[256];     // [esp+300h] [ebp-134h]\r\n\t_uiheroinfo heroinfo; // [esp+400h] [ebp-34h]\r\n\t_gamedata GameData;   // [esp+42Ch] [ebp-8h]\r\n\r\n\t*(DWORD *)&GameData.bDiff = 0;\r\n\tif (cchBufferMax)\r\n\t\t*lpBuffer = 0;\r\n\tv7            = strlen(a3) + 1;\r\n\tv8            = strlen(a5) + 1;\r\n\tif (v7 > 0x100 || v8 > 0x100) {\r\n\t\tif (lpBuffer)\r\n\t\t\tLoadStringA(ghUiInst, 0x413u, lpBuffer, cchBufferMax);\r\n\t\treturn 0;\r\n\t}\r\n\tmemcpy(a1a, a3, v7);\r\n\tmemcpy(v17, a5, v8);\r\n\tif (Connect_GetHeroInfoConc(a1a, &heroinfo)) {\r\n\t\tif (a1 == 1) {\r\n\t\t\tif (!(a4 & 9)) {\r\n\t\t\t\tv9 = 0;\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\tLoadStringA(ghUiInst, v9 + 4, Buffer, 256);\r\n\t\t\t\t\tif (strstr(v17, Buffer))\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tif (++v9 >= 3)\r\n\t\t\t\t\t\tgoto LABEL_16;\r\n\t\t\t\t}\r\n\t\t\t\tif (heroinfo.heroclass != v9)\r\n\t\t\t\t\tgoto LABEL_20;\r\n\t\t\t\t*(DWORD *)&GameData.bDiff = 1;\r\n\t\t\tLABEL_16:\r\n\t\t\t\tLoadStringA(ghUiInst, 0x408u, Buffer, 256);\r\n\t\t\t\tv10 = strstr(v17, Buffer);\r\n\t\t\t\tif (v10) {\r\n\t\t\t\t\tv11 = strlen(Buffer);\r\n\t\t\t\t\tv12 = atoi(&v10[v11]);\r\n\t\t\t\t\tif (heroinfo.level >= v12)\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t\tif (*(DWORD *)&GameData.bDiff)\r\n\t\t\t\t\treturn 1;\r\n\t\t\tLABEL_20:\r\n\t\t\t\tif (lpBuffer) {\r\n\t\t\t\t\tLoadStringA(ghUiInst, 0x415u, v15, 256);\r\n\t\t\t\t\tv14 = sprintf(Buffer, v15, v17) + 1;\r\n\t\t\t\t\tif (cchBufferMax >= v14) {\r\n\t\t\t\t\t\tmemcpy(lpBuffer, Buffer, v14);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tmemcpy(lpBuffer, Buffer, cchBufferMax);\r\n\t\t\t\t\t\tlpBuffer[cchBufferMax - 1] = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t} else if (!(a4 & 8)) {\r\n\t\t\tConnect_DiffFromString(v17, &GameData, 0, 0);\r\n\t\t\tif (GameData.bDiff == 1) {\r\n\t\t\t\tif (heroinfo.level < 20u) {\r\n\t\t\t\t\tif (lpBuffer)\r\n\t\t\t\t\t\tLoadStringA(ghUiInst, 0x411u, lpBuffer, cchBufferMax);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t} else if (GameData.bDiff == 2 && heroinfo.level < 30u) {\r\n\t\t\t\tif (lpBuffer)\r\n\t\t\t\t\tLoadStringA(ghUiInst, 0x412u, lpBuffer, cchBufferMax);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 1;\r\n\t}\r\n\tif (lpBuffer)\r\n\t\tLoadStringA(ghUiInst, 0x414u, lpBuffer, cchBufferMax);\r\n\treturn 0;\r\n}\r\n\r\n// ref: 0x10003710\r\nBOOL __stdcall UiDrawDescCallback(int game_type, COLORREF color, LPCSTR lpString, char *a4, int a5, UINT align, time_t a7, HDC *a8)\r\n{\r\n\tHDC *v8;                  // ebx\r\n\tHDC v9;                   // esi\r\n\tint v10;                  // esi\r\n\tsize_t v11;               // eax\r\n\tUINT v13;                 // eax\r\n\tBOOL v14;                 // esi\r\n\tint v15;                  // eax\r\n\tint v16;                  // eax\r\n\tHDC v17;                  // ST20_4\r\n\tstruct tm *v18;           // eax\r\n\tstruct tm *v19;           // edi\r\n\tsigned int v20;           // eax\r\n\tint v21;                  // eax\r\n\tint v22;                  // eax\r\n\tUINT v23;                 // eax\r\n\tint v24;                  // esi\r\n\tint v25;                  // eax\r\n\tint v26;                  // eax\r\n\tsigned int v27;           // [esp-4h] [ebp-2E8h]\r\n\tchar a1[256];             // [esp+Ch] [ebp-2D8h]\r\n\tchar String[128];         // [esp+10Ch] [ebp-1D8h]\r\n\tchar Buffer[128];         // [esp+18Ch] [ebp-158h]\r\n\tCHAR v31[32];             // [esp+20Ch] [ebp-D8h]\r\n\tHDC a8a[12];              // [esp+22Ch] [ebp-B8h]\r\n\tstruct tagTEXTMETRICA tm; // [esp+25Ch] [ebp-88h]\r\n\t_uiheroinfo heroinfo;     // [esp+294h] [ebp-50h]\r\n\tstruct tagPOINT pt;       // [esp+2C0h] [ebp-24h]\r\n\t_gamedata gamedata;       // [esp+2C8h] [ebp-1Ch]\r\n\tstruct tagRECT rc;        // [esp+2D0h] [ebp-14h]\r\n\tCOLORREF v38;             // [esp+2E0h] [ebp-4h]\r\n\tLPCSTR lpStringa;         // [esp+2F4h] [ebp+10h]\r\n\r\n\tBuffer[0] = nullcharacter;\r\n\tv8        = a8;\r\n\tmemset(&Buffer[1], 0, 0x7Cu);\r\n\tv9                     = a8[4];\r\n\t*(WORD *)&Buffer[125] = 0;\r\n\tBuffer[127]            = 0;\r\n\tv10                    = (unsigned char)v9 & 1;\r\n\tv11                    = strlen(a4) + 1;\r\n\tif (v11 > 0x100)\r\n\t\treturn 0;\r\n\tmemcpy(a1, a4, v11);\r\n\tif (color == 1) {\r\n\t\ta8 = 0;\r\n\t\ta4 = 0;\r\n\t\tif (!Connect_DiffFromString(a1, &gamedata, (int)&a8, (int)&a4))\r\n\t\t\treturn 0;\r\n\t\tcolor = SetTextColor(v8[6], 0xFFFFFFu);\r\n\t\tv38   = SetBkColor(v8[6], v10 != 0 ? 0x808080 : 0);\r\n\t\tif (align & 1) {\r\n\t\t\tv13 = strlen(lpString);\r\n\t\t\tExtTextOutA(v8[6], (int)v8[7], (int)v8[8], 6u, (const RECT *)(v8 + 7), lpString, v13, 0);\r\n\t\t} else {\r\n\t\t\tv14 = a8 && a4;\r\n\t\t\tif (gamedata.bDiff < 3u)\r\n\t\t\t\tLoadStringA(ghUiInst, gamedata.bDiff + 1003, Buffer, 128);\r\n\t\t\tif (align & 2 && v14) {\r\n\t\t\t\tGetTextMetricsA(v8[6], &tm);\r\n\t\t\t\tlpStringa = (LPCSTR)(tm.tmHeight + tm.tmExternalLeading);\r\n\t\t\t\tMoveToEx(v8[6], (int)v8[7], (int)v8[8], &pt);\r\n\t\t\t\talign = SetTextAlign(v8[6], 1u);\r\n\t\t\t\tv15   = strlen(Buffer);\r\n\t\t\t\tTextOutA(v8[6], 0, 0, Buffer, v15);\r\n\t\t\t\tLoadStringA(ghUiInst, 0x409u, String, 128);\r\n\t\t\t\tMoveToEx(v8[6], (int)v8[7], (int)v8[8] + (DWORD)lpStringa, 0);\r\n\t\t\t\tv16 = strlen(String);\r\n\t\t\t\tTextOutA(v8[6], 0, 0, String, v16);\r\n\t\t\t\tv17 = v8[6];\r\n\t\t\t\tmemcpy(a8a, v8, sizeof(a8a));\r\n\t\t\t\tGetCurrentPositionEx(v17, (LPPOINT)&a8a[7]);\r\n\t\t\t\tSetTextAlign(v8[6], 0);\r\n\t\t\t\tconnect_color_text = 1;\r\n\t\t\t\tUiDrawDescCallback(game_type, 2u, (LPCSTR)a8, a4, 0, 1u, 0, a8a);\r\n\t\t\t\tconnect_color_text = 0;\r\n\t\t\t\tif (a7) {\r\n\t\t\t\t\tSetTextAlign(v8[6], 1u);\r\n\t\t\t\t\tLoadStringA(ghUiInst, 0x40Cu, &heroinfo.name[8], 32);\r\n\t\t\t\t\tLoadStringA(ghUiInst, 0x40Du, v31, 32);\r\n\t\t\t\t\tv18 = localtime(&a7);\r\n\t\t\t\t\tv19 = v18;\r\n\t\t\t\t\tif (v18) {\r\n\t\t\t\t\t\tLoadStringA(ghUiInst, (v18->tm_hour > 12) + 1034, (LPSTR)&rc.top, 10);\r\n\t\t\t\t\t\tv20 = v19->tm_hour;\r\n\t\t\t\t\t\tif (v20 > 12)\r\n\t\t\t\t\t\t\tv19->tm_hour = v20 - 12;\r\n\t\t\t\t\t\tif (!v19->tm_hour)\r\n\t\t\t\t\t\t\tv19->tm_hour = 12;\r\n\t\t\t\t\t\tsprintf(String, &heroinfo.name[8], v31, v19->tm_hour, v19->tm_min, &rc.top);\r\n\t\t\t\t\t\tMoveToEx(v8[6], (int)v8[7], (int)v8[8] + 2 * (DWORD)lpStringa, 0);\r\n\t\t\t\t\t\tv21 = strlen(String);\r\n\t\t\t\t\t\tTextOutA(v8[6], 0, 0, String, v21);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tMoveToEx(v8[6], pt.x, pt.y, 0);\r\n\t\t\t\tSetTextAlign(v8[6], align);\r\n\t\t\t} else {\r\n\t\t\t\tv22 = strlen(Buffer);\r\n\t\t\t\tTextOutA(v8[6], (int)v8[7], (int)v8[8], Buffer, v22);\r\n\t\t\t}\r\n\t\t}\r\n\t\tgoto LABEL_56;\r\n\t}\r\n\tGetTextMetricsA(v8[6], &tm);\r\n\ta4 = (char *)((tm.tmHeight - connect_draw_height) / 2 + 1);\r\n\tif (!connect_color_text) {\r\n\t\tcolor = SetTextColor(v8[6], 0xFFFFu);\r\n\t\tv38   = SetBkColor(v8[6], v10 != 0 ? 0x808080 : 0);\r\n\t}\r\n\tif (align & 1) {\r\n\t\tv23 = strlen(lpString);\r\n\t\tExtTextOutA(v8[6], (int)v8[7] + heroport_data[0] + 2, (int)v8[8], 6u, (const RECT *)(v8 + 7), lpString, v23, 0);\r\n\t}\r\n\tif (a5) {\r\n\t\tif (a5 & 0x20) {\r\n\t\t\tv27 = 5;\r\n\t\tLABEL_45:\r\n\t\t\tv24 = v27;\r\n\t\t\tgoto LABEL_46;\r\n\t\t}\r\n\t\tif (a5 & 1) {\r\n\t\t\tv24 = 0;\r\n\t\tLABEL_46:\r\n\t\t\tSetRect(&rc, 0, 0, special_data[0] - 1, special_frames - 1);\r\n\t\t\tOffsetRect(&rc, 0, special_frames * v24);\r\n\t\t\tSDlgBltToWindowI(\r\n\t\t\t    (HWND)v8[5],\r\n\t\t\t    0,\r\n\t\t\t    (char *)v8[7],\r\n\t\t\t    (int)v8[8] + (DWORD)a4,\r\n\t\t\t    connect_data3,\r\n\t\t\t    &rc,\r\n\t\t\t    (SIZE *)special_data,\r\n\t\t\t    -1,\r\n\t\t\t    0,\r\n\t\t\t    0xCC0020u);\r\n\t\t\tgoto LABEL_55;\r\n\t\t}\r\n\t\tif (a5 & 2) {\r\n\t\t\tv27 = 2;\r\n\t\t\tgoto LABEL_45;\r\n\t\t}\r\n\t\tif (a5 & 4) {\r\n\t\t\tv27 = 3;\r\n\t\t\tgoto LABEL_45;\r\n\t\t}\r\n\t\tif (a5 & 8) {\r\n\t\t\tv25          = (game_type != 'BNET') - 1;\r\n\t\t\tv25 = v25 & 0xFD;\r\n\t\t\tv24          = v25 + 4;\r\n\t\t\tgoto LABEL_46;\r\n\t\t}\r\n\t}\r\n\tif (*(DWORD *)a1 == 'CHAT') {\r\n\t\tv27 = 6;\r\n\t\tgoto LABEL_45;\r\n\t}\r\n\tif (*(DWORD *)a1 == 'SEXP' || *(DWORD *)a1 == 'SSHR' || *(DWORD *)a1 == 'STAR') {\r\n\t\tv27 = 7;\r\n\t\tgoto LABEL_45;\r\n\t}\r\n\tif (Connect_GetHeroInfoConc(a1, &heroinfo)) {\r\n\t\tif (heroinfo.spawned) {\r\n\t\t\tif (connect_data2)\r\n\t\t\t\tSBltROP3(\r\n\t\t\t\t    connect_data4,\r\n\t\t\t\t    connect_data2,\r\n\t\t\t\t    heroport_data[0],\r\n\t\t\t\t    connect_draw_height,\r\n\t\t\t\t    heroport_data[0],\r\n\t\t\t\t    heroport_data[0],\r\n\t\t\t\t    0,\r\n\t\t\t\t    0xCC0020u);\r\n\t\t} else {\r\n\t\t\tSBltROP3(\r\n\t\t\t    connect_data4,\r\n\t\t\t    &connect_data1[heroport_frames * (heroinfo.heroclass + 3 * heroinfo.herorank)],\r\n\t\t\t    heroport_data[0],\r\n\t\t\t    connect_draw_height,\r\n\t\t\t    heroport_data[0],\r\n\t\t\t    heroport_data[0],\r\n\t\t\t    0,\r\n\t\t\t    0xCC0020u);\r\n\t\t}\r\n\t\tv26 = heroinfo.level / 10;\r\n\t\tif (v26)\r\n\t\t\tSTransBlt(\r\n\t\t\t    (char *)connect_data4 + 4 * heroport_data[0] + heroport_data[0] + 14,\r\n\t\t\t    0,\r\n\t\t\t    0,\r\n\t\t\t    heroport_data[0],\r\n\t\t\t    connect_trans[v26]);\r\n\t\tSTransBlt(\r\n\t\t    (char *)connect_data4 + 4 * (heroport_data[0] + 4) + heroport_data[0] + 4,\r\n\t\t    0,\r\n\t\t    0,\r\n\t\t    heroport_data[0],\r\n\t\t    connect_trans[heroinfo.level % 10]);\r\n\t\tSetRect(&rc, 0, 0, heroport_data[0] - 1, connect_draw_height - 1);\r\n\t\tSDlgBltToWindowI(\r\n\t\t    (HWND)v8[5],\r\n\t\t    0,\r\n\t\t    (char *)v8[7],\r\n\t\t    (int)v8[8] + (DWORD)a4,\r\n\t\t    connect_data4,\r\n\t\t    &rc,\r\n\t\t    (SIZE *)heroport_data,\r\n\t\t    -1,\r\n\t\t    0,\r\n\t\t    0xCC0020u);\r\n\t}\r\nLABEL_55:\r\n\tif (!connect_color_text) {\r\n\tLABEL_56:\r\n\t\tSetTextColor(v8[6], color);\r\n\t\tSetBkColor(v8[6], v38);\r\n\t}\r\n\treturn 1;\r\n}\r\n// 100294A4: using guessed type int special_frames;\r\n// 100295C0: using guessed type int heroport_frames;\r\n// 10029614: using guessed type int connect_color_text;\r\n\r\n// ref: 0x10003CE4\r\nBOOL __stdcall UiCategoryCallback(int a1, int a2, int a3, int a4, int a5, DWORD *a6, DWORD *a7)\r\n{\r\n\t*a7 = 0xFFFF;\r\n\t*a6 = Connect_GetRankFromLevel(connect_categorystr);\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10003D04\r\nint __fastcall Connect_GetRankFromLevel(char *str)\r\n{\r\n\tchar a1[512];   // [esp+0h] [ebp-22Ch]\r\n\t_uiheroinfo a2; // [esp+200h] [ebp-2Ch]\r\n\r\n\tstrcpy(a1, str);\r\n\tif (!Connect_GetHeroInfoConc(a1, &a2) || a2.level == 1)\r\n\t\treturn 0;\r\n\tif ((signed int)a2.level < 4)\r\n\t\treturn 1;\r\n\tif ((signed int)a2.level < 6)\r\n\t\treturn 2;\r\n\tif ((signed int)a2.level < 8)\r\n\t\treturn 3;\r\n\tif ((signed int)a2.level < 10)\r\n\t\treturn 4;\r\n\tif ((signed int)a2.level < 13)\r\n\t\treturn 5;\r\n\tif ((signed int)a2.level < 17)\r\n\t\treturn 6;\r\n\tif ((signed int)a2.level < 20)\r\n\t\treturn 7;\r\n\tif ((signed int)a2.level < 25)\r\n\t\treturn 8;\r\n\tif ((signed int)a2.level < 30)\r\n\t\treturn 9;\r\n\tif ((signed int)a2.level < 35)\r\n\t\treturn 10;\r\n\tif ((signed int)a2.level < 40)\r\n\t\treturn 11;\r\n\treturn ((signed int)a2.level >= 48) + 12;\r\n}\r\n\r\n// ref: 0x10003DAF\r\nBOOL __fastcall Connect_DiffFromString(char *str, _gamedata *gamedata, int a3, int a4)\r\n{\r\n\tunsigned char v6; // al\r\n\tchar *v8;         // eax\r\n\tconst char *v9;   // eax\r\n\tchar *v10;        // eax\r\n\r\n\tif (!*str)\r\n\t\treturn 0;\r\n\tv6              = atoi(str);\r\n\tgamedata->bDiff = v6;\r\n\tif (v6 >= 3u)\r\n\t\treturn 0;\r\n\tv8 = strchr(str, 13);\r\n\tif (v8) {\r\n\t\t*v8 = 0;\r\n\t\tv9  = v8 + 1;\r\n\t\tif (a3)\r\n\t\t\t*(DWORD *)a3 = (DWORD)v9;\r\n\t\tv10               = (char *)strchr(v9, 13);\r\n\t\tif (v10) {\r\n\t\t\t*v10 = 0;\r\n\t\t\tif (a4)\r\n\t\t\t\t*(DWORD *)a4 = (DWORD)v10 + 1;\r\n\t\t}\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10003E0C\r\nvoid __fastcall Connect_SetDiffString(_gamedata *gamedata, const char *str1, char *str2, char *str3, int size)\r\n{\r\n\tsize_t v7;         // ebx\r\n\tsize_t v8;         // eax\r\n\tunsigned char v9;  // zf\r\n\tunsigned char v10; // sf\r\n\tint v12;           // eax\r\n\r\n\tv7  = strlen(str1);\r\n\tv8  = v7 + strlen(str2) + 5;\r\n\tv9  = size == v8;\r\n\tv10 = (signed int)(size - v8) < 0;\r\n\tv12 = gamedata->bDiff;\r\n\tif (v10 | v9)\r\n\t\t_itoa(v12, str3, 10);\r\n\telse\r\n\t\tsprintf(str3, \"%d\\r%s\\r%s\", v12, str1, str2);\r\n}\r\n\r\n// ref: 0x10003E61\r\nBOOL __fastcall Connect_GetHeroInfoConc(const char *a1, _uiheroinfo *pInfo)\r\n{\r\n\tint v4;            // eax\r\n\tint v5;            // edi\r\n\tint v6;            // edx\r\n\tunsigned short v7; // di\r\n\tunsigned char v8;  // cl\r\n\tint v10;           // [esp+Ch] [ebp-24h]\r\n\tunsigned int v11;  // [esp+10h] [ebp-20h]\r\n\tunsigned int v12;  // [esp+14h] [ebp-1Ch]\r\n\tunsigned int v13;  // [esp+18h] [ebp-18h]\r\n\tint v14;           // [esp+1Ch] [ebp-14h]\r\n\tint v15;           // [esp+20h] [ebp-10h]\r\n\tint v16;           // [esp+24h] [ebp-Ch]\r\n\tint v17;           // [esp+28h] [ebp-8h]\r\n\tint v18;           // [esp+2Ch] [ebp-4h]\r\n\r\n\tmemset(pInfo, 0, 0x2Cu);\r\n\tif (!*a1)\r\n\t\treturn 0;\r\n\tv4 = *(DWORD *)a1;\r\n\tif (*(DWORD *)a1 != 'DRTL' && v4 != 'DSHR' && v4 != 'DTST')\r\n\t\treturn 0;\r\n\tif (sscanf(a1 + 4, \"%d %d %d %d %d %d %d %d %d\", &v13, &v12, &v11, &v18, &v17, &v16, &v15, &v10, &v14) != 9)\r\n\t\treturn 0;\r\n\tv5 = *(DWORD *)a1;\r\n\tv6 = v14;\r\n\tif (v5 == 'DRTL') {\r\n\t\tif (v14)\r\n\t\t\treturn 0;\r\n\t}\r\n\tif (v5 == 'DSHR' && !v14)\r\n\t\treturn 0;\r\n\tv7 = v13;\r\n\tif (!v13)\r\n\t\treturn 0;\r\n\tif (v13 > 0x63)\r\n\t\treturn 0;\r\n\tv8 = v12;\r\n\tif (v12 >= 3 || v11 > 3 || v18 < 0 || v17 < 0 || v16 < 0 || v15 < 0)\r\n\t\treturn 0;\r\n\tpInfo->herorank  = v11;\r\n\tpInfo->level     = v7;\r\n\tpInfo->strength  = (unsigned char)v18;\r\n\tpInfo->heroclass = v8;\r\n\tpInfo->magic     = (unsigned char)v17;\r\n\tpInfo->spawned   = v6;\r\n\tpInfo->dexterity = (unsigned char)v16;\r\n\tpInfo->vitality  = (unsigned char)v15;\r\n\tpInfo->gold      = v10;\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10003F6F\r\nvoid __fastcall Connect_MakeDescString(_uiheroinfo *a1, char *name, size_t size)\r\n{\r\n\t*(DWORD *)name = (DWORD)connect_charname;\r\n\t_snprintf(\r\n\t    name + 4,\r\n\t    size,\r\n\t    \" %d %d %d %d %d %d %d %d %d\",\r\n\t    a1->level,\r\n\t    a1->heroclass,\r\n\t    a1->herorank,\r\n\t    a1->strength,\r\n\t    a1->magic,\r\n\t    a1->dexterity,\r\n\t    a1->vitality,\r\n\t    a1->gold,\r\n\t    a1->spawned);\r\n}\r\n\r\n// ref: 0x10003FB7\r\nvoid __stdcall UiCreateGameCriteria(_uiheroinfo *pInfo, char *str)\r\n{\r\n\tsprintf(str, \"#%d?%d\", 3, pInfo->level);\r\n}\r\n\r\n// ref: 0x10003FD6\r\nBOOL __stdcall UiCreatePlayerDescription(_uiheroinfo *info, DWORD mode, char *desc)\r\n{\r\n\tconnect_charname = (char *)mode;\r\n\tConnect_MakeDescString(info, desc, 0x80u);\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10003FF7\r\nvoid __stdcall UiSetupPlayerInfo(char *infostr, _uiheroinfo *pInfo, DWORD type)\r\n{\r\n\tconnect_charname = (char *)type;\r\n\tSStrCopy(connect_plrinfostr, infostr, 128);\r\n\tConnect_MakeDescString(pInfo, connect_categorystr, 0x80u);\r\n}\r\n\r\n// ref: 0x10004028\r\nvoid __fastcall Connect_CopyPlrDescStrings(char *str1, int size1, char *str2, int size2)\r\n{\r\n\tif (str1)\r\n\t\tSStrCopy(str1, connect_plrinfostr, size1);\r\n\tif (str2)\r\n\t\tSStrCopy(str2, connect_categorystr, size2);\r\n}\r\n"
  },
  {
    "path": "DiabloUI/copyprot.cpp",
    "content": "// ref: 0x10004054\r\nBOOL __stdcall UiCopyProtError(int *pdwResult)\r\n{\r\n\tint v1;           // eax\r\n\tint v2;           // eax\r\n\tchar Buffer[128]; // [esp+0h] [ebp-80h]\r\n\r\n\tif (DiabloUI_GetSpawned())\r\n\t\tLoadStringA(ghUiInst, 0x3Fu, Buffer, 127);\r\n\telse\r\n\t\tLoadStringA(ghUiInst, 0x1Bu, Buffer, 127);\r\n\tv1 = (int)SDrawGetFrameWindow(NULL);\r\n\tv2 = SDlgDialogBoxParam(ghUiInst, \"OKCANCEL_DIALOG\", v1, CopyProt_WndProc, (int)Buffer);\r\n\tif (pdwResult)\r\n\t\t*pdwResult = v2;\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x100040AF\r\nLRESULT __stdcall CopyProt_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v4; // ecx\r\n\tint v5;  // edx\r\n\tHWND v6; // eax\r\n\tLONG v7; // eax\r\n\tHWND v9; // eax\r\n\r\n\tif (Msg == 2) {\r\n\t\tCopyProt_FreeCopyResrcs();\r\n\t\tFade_UpdatePaletteRange(10);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg <= 0x103)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tif (Msg <= 0x105) {\r\n\t\tv9 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v9, Msg, wParam, lParam);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg == 272) {\r\n\t\tCopyProt_LoadCopyStuff(hWnd, lParam);\r\n\t\treturn 1;\r\n\t}\r\n\tif (Msg != 273)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tswitch ((unsigned short)wParam) {\r\n\tcase 1u:\r\n\t\tv6 = GetFocus();\r\n\t\tv7 = GetWindowLongA(v6, -12);\r\n\t\tv4 = hWnd;\r\n\t\tif (v7 == 1109) {\r\n\t\t\tv5 = 1;\r\n\t\t\tgoto LABEL_13;\r\n\t\t}\r\n\t\tgoto LABEL_12;\r\n\tcase 2u:\r\n\t\tv4 = hWnd;\r\n\tLABEL_12:\r\n\t\tv5 = 2;\r\n\t\tgoto LABEL_13;\r\n\tcase 0x455u:\r\n\t\tv4 = hWnd;\r\n\t\tv5 = 1;\r\n\tLABEL_13:\r\n\t\tCopyProt_EndCopyDlg(v4, v5);\r\n\t\tbreak;\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10004173\r\nvoid __cdecl CopyProt_FreeCopyResrcs()\r\n{\r\n\tif (copyprot_artpal) {\r\n\t\tFreeResource(copyprot_artpal);\r\n\t\tcopyprot_artpal = 0;\r\n\t}\r\n\tif (copyprot_btnart) {\r\n\t\tFreeResource(copyprot_btnart);\r\n\t\tcopyprot_btnart = 0;\r\n\t}\r\n\tif (copyprot_popupart) {\r\n\t\tFreeResource(copyprot_popupart);\r\n\t\tcopyprot_popupart = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x100041B5\r\nBOOL __fastcall CopyProt_LoadCopyStuff(HWND hWnd, int a2)\r\n{\r\n\tHRSRC v2;                      // eax\r\n\tHRSRC v3;                      // eax\r\n\tHRSRC v4;                      // eax\r\n\tvoid *v5;                      // edi\r\n\tvoid *v6;                      // ebx\r\n\tHWND v7;                       // eax\r\n\tPALETTEENTRY pPalEntries[256]; // [esp+Ch] [ebp-420h]\r\n\tint msgs[3];                   // [esp+40Ch] [ebp-20h]\r\n\tDWORD data[2];                 // [esp+418h] [ebp-14h]\r\n\tLPCSTR lpString;               // [esp+420h] [ebp-Ch]\r\n\tvoid *v13;                     // [esp+424h] [ebp-8h]\r\n\r\n\tmsgs[2]           = 0;\r\n\tlpString          = (LPCSTR)a2;\r\n\tdata[0]           = 112;\r\n\tdata[1]           = 140;\r\n\tmsgs[0]           = 1109;\r\n\tmsgs[1]           = 2;\r\n\tv2                = FindResourceA(ghUiInst, \"IDR_POPUPART\", \"ART_FILES\");\r\n\tcopyprot_popupart = LoadResource(ghUiInst, v2);\r\n\tv3                = FindResourceA(ghUiInst, \"IDR_BTNART\", \"ART_FILES\");\r\n\tcopyprot_btnart   = LoadResource(ghUiInst, v3);\r\n\tv4                = FindResourceA(ghUiInst, \"IDR_ARTPAL\", \"ART_FILES\");\r\n\tcopyprot_artpal   = LoadResource(ghUiInst, v4);\r\n\tv5                = LockResource(copyprot_popupart);\r\n\tv6                = LockResource(copyprot_btnart);\r\n\tv13               = LockResource(copyprot_artpal);\r\n\tif (v5)\r\n\t\tSDlgSetBitmapI(hWnd, 0, &nullcharacter, -1, 1, v5, 0, 284, 148, -1);\r\n\tShowCursor(TRUE);\r\n\tFade_SetInputWindow(hWnd);\r\n\tif (v6)\r\n\t\tlocal_FitButtonDlg(hWnd, msgs, v6, data);\r\n\tif (v13) {\r\n\t\tmemcpy(pPalEntries, v13, 0x400u);\r\n\t\tSDrawUpdatePalette(0, 0x100u, pPalEntries, 1);\r\n\t}\r\n\tv7 = GetDlgItem(hWnd, 1026);\r\n\tSetWindowTextA(v7, lpString);\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x1000430C\r\nvoid __fastcall CopyProt_EndCopyDlg(HWND hWnd, int a2)\r\n{\r\n\tShowCursor(FALSE);\r\n\tSDlgEndDialog(hWnd, (HANDLE)a2);\r\n}\r\n\r\n// ref: 0x10004329\r\nvoid __cdecl CopyProt_cpp_init()\r\n{\r\n\tCopyProt_cpp_float = CopyProt_cpp_float_value;\r\n}\r\n// 1001F3F8: using guessed type int CopyProt_cpp_float_value;\r\n// 10029620: using guessed type int CopyProt_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/cr8game.cpp",
    "content": "// ref: 0x10004339\r\nvoid __cdecl cr8game_cpp_init()\r\n{\r\n\tcr8game_cpp_float = cr8game_cpp_float_value;\r\n}\r\n// 1001F3FC: using guessed type int cr8game_cpp_float_value;\r\n// 1002962C: using guessed type int cr8game_cpp_float;\r\n\r\n// ref: 0x10004344\r\nBOOL __fastcall cr8game_GetSnetCreaGame(HWND hWnd)\r\n{\r\n\tBOOL result;      // eax\r\n\tDWORD *v2;        // eax\r\n\tint *v3;          // ST24_4\r\n\tint v4;           // ST18_4\r\n\tint v5;           // ST14_4\r\n\tchar *v6;         // ST10_4\r\n\tint v7;           // eax\r\n\tchar Buffer[128]; // [esp+Ch] [ebp-308h]\r\n\tchar Text[256];   // [esp+8Ch] [ebp-288h]\r\n\tchar a4[128];     // [esp+18Ch] [ebp-188h]\r\n\tchar a2[128];     // [esp+20Ch] [ebp-108h]\r\n\tchar str[128];    // [esp+28Ch] [ebp-88h]\r\n\tBOOL v13;         // [esp+30Ch] [ebp-8h]\r\n\r\n\tConnect_CopyPlrDescStrings(a2, 128, str, 128);\r\n\tConnect_SetDiffString(&cr8_gamedata, a2, str, a4, 128);\r\n\tif (UiAuthCallback(2, a2, str, 0, a4, Text, 256)) {\r\n\t\tv2 = cr8_somegamestruct;\r\n\t\tif (cr8_somegamestruct[8] >= 8) {\r\n\t\t\t*(BYTE *)(cr8_somegamestruct[7] + 4) = cr8_gamedata.bDiff;\r\n\t\t\tv2                                    = cr8_somegamestruct;\r\n\t\t}\r\n\t\tv3  = cr8game_playerID;\r\n\t\tv4  = *(DWORD *)(cr8_playercount + 8);\r\n\t\tv5  = v2[8];\r\n\t\tv6  = (char *)v2[7];\r\n\t\tv7  = Connect_GetRankFromLevel(str);\r\n\t\tv13 = SNetCreateGame(cr8_gamename, cr8_gamepassword, a4, v7, v6, v5, v4, a2, 0, v3);\r\n\t\tif (!v13) {\r\n\t\t\tif (SErrGetLastError() == 183) {\r\n\t\t\t\tLoadStringA(ghUiInst, 0x40Fu, Buffer, 128);\r\n\t\t\t\tsprintf(Text, Buffer, cr8_gamename);\r\n\t\t\t} else {\r\n\t\t\t\tLoadStringA(ghUiInst, 0x410u, Text, 256);\r\n\t\t\t}\r\n\t\t\tUiMessageBoxCallback(hWnd, Text, 0, 0x30u);\r\n\t\t}\r\n\t\tresult = v13;\r\n\t} else {\r\n\t\tUiMessageBoxCallback(hWnd, Text, 0, 0x30u);\r\n\t\tresult = 0;\r\n\t}\r\n\treturn result;\r\n}\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 10029630: using guessed type int cr8_playercount;\r\n\r\n// ref: 0x100044AA\r\nBOOL __stdcall UiCreateGameCallback(int a1, int a2, int a3, int a4, int a5, int a6)\r\n{\r\n\tBOOL v6; // eax\r\n\r\n\tcr8_playercount    = a1;\r\n\tcr8_somegamestruct = (DWORD *)a2;\r\n\tcr8_dword_10029638 = a3;\r\n\tcr8_dword_10029640 = a5;\r\n\tcr8_dword_1002963C = a4;\r\n\tcr8game_playerID   = (int *)a6;\r\n\tv6                 = SDlgDialogBoxParam(ghUiInst, \"DIALOG_CREATE_GAME\", *(DWORD *)(a4 + 8), cr8game_WndProc, 0);\r\n\treturn v6 != -1 ? v6 : 0;\r\n}\r\n// 10029630: using guessed type int cr8_playercount;\r\n// 10029638: using guessed type int cr8_dword_10029638;\r\n// 1002963C: using guessed type int cr8_dword_1002963C;\r\n// 10029640: using guessed type int cr8_dword_10029640;\r\n\r\n// ref: 0x10004506\r\nLRESULT __stdcall cr8game_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tsigned int v4;    // ebx\r\n\tHWND v6;          // eax\r\n\tHWND v7;          // eax\r\n\tHWND v8;          // eax\r\n\tchar Buffer[256]; // [esp+Ch] [ebp-104h]\r\n\tint a2;           // [esp+10Ch] [ebp-4h]\r\n\r\n\tv4 = Msg;\r\n\tif (Msg == 2) {\r\n\t\tcr8game_FreeCreaStuff();\r\n\t\tcr8game_FreeMainMem(hWnd);\r\n\t\tif (cr8game_hobject)\r\n\t\t\tDeleteObject(cr8game_hobject);\r\n\t\tcr8_sendmsg1 = 0;\r\n\t\tcr8_sendmsg2 = 0;\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg > 0x103) {\r\n\t\tif (Msg > 0x105) {\r\n\t\t\tif (Msg == 272) {\r\n\t\t\t\tcr8_sendmsg2 = GetDlgItem(hWnd, 1010);\r\n\t\t\t\tcr8_sendmsg1 = GetDlgItem(hWnd, 1011);\r\n\t\t\t\tcr8game_LoadCreaGFX(hWnd);\r\n\t\t\t\tcr8game_AllocMainMem(hWnd);\r\n\t\t\t\tcr8game_SendMessageF5(hWnd);\r\n\t\t\t\tcr8game_hobject = cr8game_GetCr8Object(hWnd);\r\n\t\t\t\tSendMessageA(cr8_sendmsg2, 0xC5u, 0x1Fu, 0);\r\n\t\t\t\tSendMessageA(cr8_sendmsg1, 0xC5u, 0x1Fu, 0);\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\tif (Msg != 273) {\r\n\t\t\t\tif (Msg == 312 && GetWindowLongA((HWND)lParam, -12) == 1030) {\r\n\t\t\t\t\tlocal_SetWhiteText((HDC)wParam);\r\n\t\t\t\t\treturn (LRESULT)GetStockObject(5);\r\n\t\t\t\t}\r\n\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);\r\n\t\t\t}\r\n\t\t\tif ((unsigned short)wParam == 1) {\r\n\t\t\t\tif (SendMessageA(cr8_sendmsg2, 0xEu, 0, 0)) {\r\n\t\t\t\t\tSendMessageA(cr8_sendmsg2, 0xDu, 0x20u, (LPARAM)cr8_gamename);\r\n\t\t\t\t\tif (SelHero_IsNameReserved(cr8_gamename)\r\n\t\t\t\t\t    || SelHero_NameHasChar(cr8_gamename, &nullcharacter)\r\n\t\t\t\t\t    || !cr8game_CheckValidGameName(cr8_gamename)) {\r\n\t\t\t\t\t\tLoadStringA(ghUiInst, 0x404u, Buffer, 256);\r\n\t\t\t\t\t\tOkCancel_DoOkDialog(hWnd, Buffer, 1);\r\n\t\t\t\t\t\tcr8_gamename[0] = 0;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcr8_gamepassword[0] = 0;\r\n\t\t\t\t\t\tif (SendMessageA(cr8_sendmsg1, 0xEu, 0, 0))\r\n\t\t\t\t\t\t\tSendMessageA(cr8_sendmsg1, 0xDu, 0x20u, (LPARAM)cr8_gamepassword);\r\n\t\t\t\t\t\tcr8_gamedata.bDiff = cr8_dword_1002966C;\r\n\t\t\t\t\t\tTitleSnd_PlaySelectSound();\r\n\t\t\t\t\t\tif (cr8game_GetSnetCreaGame(hWnd))\r\n\t\t\t\t\t\t\tSDlgEndDialog(hWnd, (void *)HANDLE_FLAG_INHERIT);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tLoadStringA(ghUiInst, 0x3F0u, Buffer, 256);\r\n\t\t\t\t\tOkCancel_DoOkDialog(hWnd, Buffer, 1);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif ((unsigned short)wParam != 2) {\r\n\t\t\t\t\tif ((signed int)(unsigned short)wParam > 1031 && (signed int)(unsigned short)wParam <= 1034) {\r\n\t\t\t\t\t\ta2 = (unsigned short)wParam - 1032;\r\n\t\t\t\t\t\tif (HIWORD(wParam) == 6)\r\n\t\t\t\t\t\t\tSetFocus(cr8_sendmsg2);\r\n\t\t\t\t\t\tif (cr8_dword_1002966C != (unsigned short)wParam - 1032) {\r\n\t\t\t\t\t\t\tif (cr8_dword_1002966C != -1) {\r\n\t\t\t\t\t\t\t\tv6 = GetDlgItem(hWnd, cr8_dword_1002966C + 1032);\r\n\t\t\t\t\t\t\t\tSendMessageA(v6, 0xF3u, 0, 0);\r\n\t\t\t\t\t\t\t\tTitleSnd_PlayMoveSound();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcr8game_BlitCr8Dialog(hWnd, a2);\r\n\t\t\t\t\t\t\tv7 = GetDlgItem(hWnd, 1040);\r\n\t\t\t\t\t\t\tcr8game_SetWindowStr(v7, 1029, a2);\r\n\t\t\t\t\t\t\tv4                 = 273;\r\n\t\t\t\t\t\t\tcr8_dword_1002966C = a2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tSendMessageA((HWND)lParam, 0xF3u, 1u, 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\t}\r\n\t\t\t\tTitleSnd_PlaySelectSound();\r\n\t\t\t\tSDlgEndDialog(hWnd, 0);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tv8 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v8, Msg, wParam, lParam);\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, v4, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10004828\r\nvoid __cdecl cr8game_FreeCreaStuff()\r\n{\r\n\tif (cr8_creat_bg_ptr) {\r\n\t\tSMemFree(cr8_creat_bg_ptr, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\cr8game.cpp\", 55, 0);\r\n\t\tcr8_creat_bg_ptr = 0;\r\n\t}\r\n\tif (cr8_but_xsm_ptr) {\r\n\t\tSMemFree(cr8_but_xsm_ptr, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\cr8game.cpp\", 60, 0);\r\n\t\tcr8_but_xsm_ptr = 0;\r\n\t}\r\n\tif (cr8_diffbtns_ptr) {\r\n\t\tSMemFree(cr8_diffbtns_ptr, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\cr8game.cpp\", 65, 0);\r\n\t\tcr8_diffbtns_ptr = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x1000487F\r\nBOOL __fastcall cr8game_LoadCreaGFX(HWND hWnd)\r\n{\r\n\tint id[3];   // [esp+8h] [ebp-1Ch]\r\n\tDWORD a8[2]; // [esp+14h] [ebp-10h]\r\n\tDWORD a3[2]; // [esp+1Ch] [ebp-8h]\r\n\r\n\tid[0] = 0;\r\n\tid[0] = 1;\r\n\tid[1] = 2;\r\n\tlocal_LoadArtWithPal(hWnd, 0, \"Dialog\", -1, 1, \"ui_art\\\\creat_bg.pcx\", &cr8_creat_bg_ptr, a8, 1);\r\n\tlocal_LoadArtImage(\"ui_art\\\\but_xsm.pcx\", &cr8_but_xsm_ptr, a3);\r\n\tSDlgSetControlBitmaps(hWnd, id, 0, (char *)cr8_but_xsm_ptr, (char *)a3, 1, -1);\r\n\tlocal_LoadArtImage(\"ui_art\\\\diffbtns.pcx\", &cr8_diffbtns_ptr, cr8diffbtns_size);\r\n\tlocal_SetStaticBmp(hWnd, 1040, cr8_creat_bg_ptr, a8);\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10004914\r\nvoid __fastcall cr8game_FreeMainMem(HWND hWnd)\r\n{\r\n\tsigned int v2;       // edi\r\n\tHWND v3;             // esi\r\n\tvoid **v4;           // eax MAPDST\r\n\tvoid *v6;            // eax\r\n\tstruct tagRECT Rect; // [esp+10h] [ebp-10h]\r\n\r\n\tv2 = 0;\r\n\tdo {\r\n\t\tv3 = GetDlgItem(hWnd, v2 + 1032);\r\n\t\tGetClientRect(v3, &Rect);\r\n\t\tv4 = (void **)GetWindowLongA(v3, -21);\r\n\t\tif (v4) {\r\n\t\t\tv6 = *v4;\r\n\t\t\tif (*v4)\r\n\t\t\t\tSMemFree(v6, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\cr8game.cpp\", 160, 0);\r\n\t\t\tSMemFree(v4, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\cr8game.cpp\", 162, 0);\r\n\t\t}\r\n\t\t++v2;\r\n\t} while (v2 < 3);\r\n}\r\n\r\n// ref: 0x1000497F\r\nvoid __fastcall cr8game_AllocMainMem(HWND hWnd)\r\n{\r\n\tint v1;              // ebx\r\n\tvoid **v2;           // esi\r\n\tHWND v3;             // ST1C_4\r\n\tLONG v4;             // eax\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-18h]\r\n\tHWND hWnda;          // [esp+20h] [ebp-4h]\r\n\r\n\tv1 = 0;\r\n\tdo {\r\n\t\thWnda = GetDlgItem(hWnd, v1 + 1032);\r\n\t\tGetClientRect(hWnda, &Rect);\r\n\t\tv2    = (void **)SMemAlloc(0x110u, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\cr8game.cpp\", 177, 0);\r\n\t\t*v2   = SMemAlloc(Rect.right * Rect.bottom, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\cr8game.cpp\", 178, 0);\r\n\t\tv3    = hWnda;\r\n\t\tv2[1] = (void *)Rect.right;\r\n\t\tv4    = Rect.bottom;\r\n\t\tv2[3] = 0;\r\n\t\tv2[2] = (void *)v4;\r\n\t\tSetWindowLongA(v3, -21, (LONG)v2);\r\n\t\tSDlgSetBitmapI(hWnda, 0, &nullcharacter, -1, 241, *v2, 0, (int)v2[1], (int)v2[2], -1);\r\n\t\tcr8game_DoAROP3Blit(hWnda, v1++, 0);\r\n\t} while (v1 < 3);\r\n}\r\n\r\n// ref: 0x10004A34\r\nvoid __fastcall cr8game_DoAROP3Blit(HWND hWnd, int frame, int size)\r\n{\r\n\tDWORD *v5; // eax\r\n\r\n\tv5 = (DWORD *)GetWindowLongA(hWnd, -21);\r\n\tif (v5) {\r\n\t\tif (cr8_diffbtns_ptr) {\r\n\t\t\tSBltROP3(\r\n\t\t\t    (void *)*v5,\r\n\t\t\t    &cr8_diffbtns_ptr[cr8diffbtns_size[0] * v5[2] * (size + 2 * frame)],\r\n\t\t\t    v5[1],\r\n\t\t\t    v5[2],\r\n\t\t\t    v5[1],\r\n\t\t\t    cr8diffbtns_size[0],\r\n\t\t\t    0,\r\n\t\t\t    0xCC0020u);\r\n\t\t\tInvalidateRect(hWnd, 0, 0);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x10004A93\r\nvoid __fastcall cr8game_SendMessageF5(HWND hWnd)\r\n{\r\n\tcr8_dword_1002966C = -1;\r\n\tcr8_dword_10029658 = 0;\r\n\tcr8_dword_10029668 = 0;\r\n\tSendDlgItemMessageA(hWnd, 1032, 0xF5u, 0, 0);\r\n}\r\n// 10029658: using guessed type int cr8_dword_10029658;\r\n// 10029668: using guessed type int cr8_dword_10029668;\r\n\r\n// ref: 0x10004ABA\r\nvoid __fastcall cr8game_BlitCr8Dialog(HWND hWnd, int a2)\r\n{\r\n\tHWND v4; // eax\r\n\tHWND v5; // eax\r\n\r\n\tif (cr8_dword_1002966C != -1) {\r\n\t\tv4 = GetDlgItem(hWnd, cr8_dword_1002966C + 1032);\r\n\t\tcr8game_DoAROP3Blit(v4, cr8_dword_1002966C, 0);\r\n\t}\r\n\tv5 = GetDlgItem(hWnd, a2 + 1032);\r\n\tcr8game_DoAROP3Blit(v5, a2, 1);\r\n}\r\n\r\n// ref: 0x10004B02\r\nvoid __fastcall cr8game_SetWindowStr(HWND hWnd, int dlgitem, int a3)\r\n{\r\n\tchar Buffer[256]; // [esp+4h] [ebp-100h]\r\n\r\n\tLoadStringA(ghUiInst, a3 + dlgitem, Buffer, 256);\r\n\tSetWindowTextA(hWnd, Buffer);\r\n}\r\n\r\n// ref: 0x10004B3F\r\nint __fastcall cr8game_CheckValidGameName(char *name)\r\n{\r\n\tsigned int v1; // edi\r\n\tchar v2;       // al\r\n\tsigned int v3; // esi\r\n\tint result;    // eax\r\n\tchar v5[32];   // [esp+8h] [ebp-24h]\r\n\r\n\tstrcpy(v5, name);\r\n\tv1 = 0;\r\n\tif (v5[0] == 32) {\r\n\t\tv2 = 32;\r\n\t\twhile (v2) {\r\n\t\t\tv2 = v5[v1++ + 1];\r\n\t\t\tif (v2 != 32)\r\n\t\t\t\tgoto LABEL_5;\r\n\t\t}\r\n\tLABEL_9:\r\n\t\tresult = 0;\r\n\t} else {\r\n\tLABEL_5:\r\n\t\tv3 = strlen(v5);\r\n\t\twhile (v5[--v3] == 32) {\r\n\t\t\tif (v3 <= v1)\r\n\t\t\t\tgoto LABEL_9;\r\n\t\t}\r\n\t\tv5[v3 + 1] = 0;\r\n\t\tstrcpy(name, &v5[v1]);\r\n\t\tresult = v3 + 1 - v1;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10004BA8\r\nHFONT __fastcall cr8game_GetCr8Object(HWND hWnd)\r\n{\r\n\tHFONT v2;   // eax MAPDST\r\n\tint pv[15]; // [esp+8h] [ebp-40h]\r\n\r\n\tv2 = (HFONT)SendMessageA(hWnd, 0x31u, 0, 0);\r\n\tif (v2) {\r\n\t\tif (GetObjectA(v2, 60, pv)) {\r\n\t\t\tpv[0] = -MulDiv(12, 96, 72);\r\n\t\t\tpv[1] = 0;\r\n\t\t\tv2    = CreateFontIndirectA((const LOGFONTA *)pv);\r\n\t\t\tif (v2) {\r\n\t\t\t\tSendDlgItemMessageA(hWnd, 1032, 0x30u, (WPARAM)v2, 0);\r\n\t\t\t\tSendDlgItemMessageA(hWnd, 1033, 0x30u, (WPARAM)v2, 0);\r\n\t\t\t\tSendDlgItemMessageA(hWnd, 1034, 0x30u, (WPARAM)v2, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn v2;\r\n}\r\n"
  },
  {
    "path": "DiabloUI/creadung.cpp",
    "content": "// ref: 0x10004C33\r\nvoid __fastcall CreaDung_SetDelSpin(int a1)\r\n{\r\n\tcreadung_delspinners = a1;\r\n}\r\n// 100296CC: using guessed type int creadung_delspinners;\r\n\r\n// ref: 0x10004C3F\r\nvoid __cdecl CreaDung_cpp_init()\r\n{\r\n\tCreaDung_cpp_float = CreaDung_cpp_float_value;\r\n}\r\n// 1001F400: using guessed type int CreaDung_cpp_float_value;\r\n// 100296C4: using guessed type int CreaDung_cpp_float;\r\n\r\n// ref: 0x10004C4A\r\nLRESULT __stdcall CreaDung_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v4; // eax\r\n\tHWND v6; // eax\r\n\r\n\tif (Msg == 2) {\r\n\t\tCreaDung_FreeDungProcs(hWnd);\r\n\t} else if (Msg > 0x103) {\r\n\t\tif (Msg > 0x105) {\r\n\t\t\tif (Msg == 272) {\r\n\t\t\t\tcreadung_dword_100296D8 = lParam;\r\n\t\t\t\tCreaDung_LoadDungGFX(hWnd);\r\n\t\t\t} else {\r\n\t\t\t\tif (Msg == 273) {\r\n\t\t\t\t\tif (HIWORD(wParam) == 7) {\r\n\t\t\t\t\t\tFocus_GetAndBlitSpin(hWnd, lParam);\r\n\t\t\t\t\t} else if (HIWORD(wParam) == 6) {\r\n\t\t\t\t\t\tFocus_CheckPlayMove(lParam);\r\n\t\t\t\t\t\tFocus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);\r\n\t\t\t\t\t\tCreaDung_ParseDungProcs(hWnd, (unsigned short)wParam);\r\n\t\t\t\t\t} else if (HIWORD(wParam) == 5 || (WORD)wParam == 1) {\r\n\t\t\t\t\t\tCreaDung_DoAllPlaySnd(hWnd);\r\n\t\t\t\t\t} else if ((WORD)wParam == 2) {\r\n\t\t\t\t\t\tCreaDung_PlaySndAndKill(hWnd, 2);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\t}\r\n\t\t\t\tif (Msg != 275) {\r\n\t\t\t\t\tif (Msg == 513)\r\n\t\t\t\t\t\tCreaDung_CheckDlgForSnd(hWnd, (unsigned short)lParam, (unsigned int)lParam >> 16);\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\t}\r\n\t\t\t\tif (wParam == 1) {\r\n\t\t\t\t\tv4 = GetFocus();\r\n\t\t\t\t\tFocus_DoBlitSpinIncFrame(hWnd, v4);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tv6 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v6, Msg, wParam, lParam);\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 100296D8: using guessed type int creadung_dword_100296D8;\r\n\r\n// ref: 0x10004D75\r\nvoid __fastcall CreaDung_ParseDungProcs(HWND hWnd, int dlg)\r\n{\r\n\tHWND v3;          // eax\r\n\tint v4;           // eax\r\n\tHWND v5;          // eax\r\n\tint v6;           // eax\r\n\tchar Buffer[256]; // [esp+4h] [ebp-100h]\r\n\r\n\tLoadStringA(ghUiInst, dlg - 1055, Buffer, 255);\r\n\tv3 = GetDlgItem(hWnd, 1097);\r\n\tif (v3) {\r\n\t\tv4 = GetWindowLongA(v3, -21);\r\n\t\tlocal_SetWndLongStr(v4, Buffer);\r\n\t}\r\n\tDoom_ParseWndProc4(hWnd, creadung_msgtbl2, AF_BIGGRAY);\r\n\tLoadStringA(ghUiInst, dlg - 65, Buffer, 255);\r\n\tv5 = GetDlgItem(hWnd, 1099);\r\n\tif (v5) {\r\n\t\tv6 = GetWindowLongA(v5, -21);\r\n\t\tlocal_SetWndLongStr(v6, Buffer);\r\n\t}\r\n\tDoom_ParseWndProc4(hWnd, creadung_msgtbl3, AF_SMALLGRAY);\r\n}\r\n\r\n// ref: 0x10004E2E\r\nvoid __fastcall CreaDung_FreeDungProcs(HWND hWnd)\r\n{\r\n\tvoid **v2; // eax\r\n\r\n\tDoom_DeleteFreeProcs(hWnd, creadung_msgtbl5);\r\n\tDoom_DeleteFreeProcs(hWnd, creadung_msgtbl4);\r\n\tDoom_DeleteFreeProcs(hWnd, creadung_msgtbl3);\r\n\tDoom_DeleteFreeProcs(hWnd, creadung_msgtbl2);\r\n\tDoom_DeleteFreeProcs(hWnd, creadung_msgtbl1);\r\n\tv2 = (void **)GetWindowLongA(hWnd, -21);\r\n\tlocal_FreeMemPtr(v2);\r\n\tif (creadung_delspinners)\r\n\t\tFocus_DeleteSpinners();\r\n}\r\n// 100296CC: using guessed type int creadung_delspinners;\r\n\r\n// ref: 0x10004E8B\r\nvoid __fastcall CreaDung_LoadDungGFX(HWND hWnd)\r\n{\r\n\tDWORD *v2; // eax MAPDST\r\n\r\n\tif (creadung_delspinners)\r\n\t\tFocus_LoadSpinner(\"ui_art\\\\focus16.pcx\");\r\n\telse\r\n\t\tFocus_ResetSpinToZero();\r\n\tSDlgSetTimer((int)hWnd, 1, 55, 0);\r\n\tv2 = local_AllocWndLongData();\r\n\tif (v2) {\r\n\t\tSetWindowLongA(hWnd, -21, (LONG)v2);\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, \"popup\", -1, 1, \"ui_art\\\\seldiff.pcx\", (BYTE **)v2, v2 + 1, 0);\r\n\t}\r\n\tlocal_DoUiWndProc(hWnd, (DWORD *)creadung_msgtbl5);\r\n\tDoom_ParseWndProc3(hWnd, creadung_msgtbl1, AF_BIGGRAY);\r\n\tDoom_ParseWndProc3(hWnd, creadung_msgtbl2, AF_BIGGRAY);\r\n\tDoom_ParseWndProc3(hWnd, creadung_msgtbl3, AF_SMALLGRAY);\r\n\tDoom_ParseWndProcs(hWnd, creadung_msgtbl4, AF_BIG, 0);\r\n\tDoom_ParseWndProcs(hWnd, creadung_msgtbl5, AF_MED, 1);\r\n}\r\n// 100296CC: using guessed type int creadung_delspinners;\r\n\r\n// ref: 0x10004F40\r\nvoid __fastcall CreaDung_PlaySndAndKill(HWND hWnd, int a2)\r\n{\r\n\tTitleSnd_PlaySelectSound();\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tSDlgEndDialog(hWnd, (HANDLE)a2);\r\n}\r\n\r\n// ref: 0x10004F5D\r\nvoid __fastcall CreaDung_DoAllPlaySnd(HWND hWnd)\r\n{\r\n\t//int v1; // ebp\r\n\tHWND v2;   // esi\r\n\tHWND v3;   // eax\r\n\tLONG v4;   // eax\r\n\tHWND v5;   // edi\r\n\tHWND v6;   // eax\r\n\tint v7;    // [esp-288h] [ebp-28Ch]\r\n\tint v8;    // [esp-188h] [ebp-18Ch]\r\n\tchar *v9;  // [esp-108h] [ebp-10Ch]\r\n\tchar *v10; // [esp-88h] [ebp-8Ch]\r\n\tint v11;   // [esp-8h] [ebp-Ch]\r\n\tchar v12;  // [esp-4h] [ebp-8h]\r\n\t//int v13; // [esp+0h] [ebp-4h]\r\n\r\n\t/* note: stack is hosed, fix me */\r\n\tv2 = hWnd;\r\n\tif (creadung_dword_100296D8 == 1) {\r\n\t\t//v13 = v1;\r\n\t\tv5 = hWnd;\r\n\t\tConnect_CopyPlrDescStrings((char *)&v10, 128, (char *)&v9, 128);\r\n\t\tv6  = GetFocus();\r\n\t\tv12 = GetWindowLongA(v6, -12) - 70;\r\n\t\tConnect_SetDiffString((_gamedata *)&v11, (const char *)&v10, (char *)&v9, (char *)&v8, 128);\r\n\t\tif (UiAuthCallback(2, (char *)&v10, (char *)&v9, 0, (char *)&v8, (LPSTR)&v7, 256))\r\n\t\t\tCreaDung_DoSnetCreaGame(v5);\r\n\t\telse\r\n\t\t\tSelYesNo_SelOkDialog(v5, (char *)&v7, 0, 0);\r\n\t} else {\r\n\t\tv3 = GetFocus();\r\n\t\tv4 = GetWindowLongA(v3, -12);\r\n\t\tSelHero_SetHeroDifficulty(v4 - 1094);\r\n\t\tCreaDung_PlaySndAndKill(v2, 1);\r\n\t}\r\n}\r\n// 10004F5D: could not find valid save-restore pair for ebp\r\n// 100296D8: using guessed type int creadung_dword_100296D8;\r\n\r\n// ref: 0x10005037\r\nvoid __fastcall CreaDung_DoSnetCreaGame(HWND hWnd)\r\n{\r\n\tHWND v1;          // ebx\r\n\tDWORD *v2;        // eax\r\n\tDWORD v3;         // edi\r\n\tchar a4[256];     // [esp+8h] [ebp-34Ch]\r\n\tchar v5[128];     // [esp+108h] [ebp-24Ch]\r\n\tchar Buffer[192]; // [esp+188h] [ebp-1CCh]\r\n\tchar a3[128];     // [esp+248h] [ebp-10Ch]\r\n\tchar a2[128];     // [esp+2C8h] [ebp-8Ch]\r\n\t_gamedata a1;     // [esp+348h] [ebp-Ch]\r\n\r\n\tv1 = GetFocus();\r\n\tif (hWnd == GetParent(v1)) {\r\n\t\tConnect_CopyPlrDescStrings(a2, 128, a3, 128);\r\n\t\ta1.bDiff = GetWindowLongA(v1, -12) - 70;\r\n\t\tConnect_SetDiffString(&a1, a2, a3, a4, 256);\r\n\t\tv2 = crea_somegamestruct;\r\n\t\tif (crea_somegamestruct[8] >= 8) {\r\n\t\t\tv3                 = crea_somegamestruct[7];\r\n\t\t\t*(BYTE *)(v3 + 4) = GetWindowLongA(v1, -12) - 70;\r\n\t\t\tv2                 = crea_somegamestruct;\r\n\t\t}\r\n\t\tif (SNetCreateGame(\r\n\t\t        creadung_gamename,\r\n\t\t        0,\r\n\t\t        a4,\r\n\t\t        0,\r\n\t\t        (char *)v2[7],\r\n\t\t        v2[8],\r\n\t\t        *(DWORD *)(creadung_playername + 8),\r\n\t\t        a2,\r\n\t\t        0,\r\n\t\t        creadung_playerID)) {\r\n\t\t\tCreaDung_PlaySndAndKill(hWnd, 1);\r\n\t\t} else {\r\n\t\t\tcreadung_lasterror = SErrGetLastError();\r\n\t\t\tif (creadung_lasterror == 183) {\r\n\t\t\t\tLoadStringA(ghUiInst, 0x49u, v5, 127);\r\n\t\t\t\twsprintfA(Buffer, v5, creadung_gamename);\r\n\t\t\t} else {\r\n\t\t\t\tLoadStringA(ghUiInst, 0x26u, Buffer, 191);\r\n\t\t\t}\r\n\t\t\tSelYesNo_SelOkDialog(hWnd, Buffer, 0, 0);\r\n\t\t}\r\n\t}\r\n}\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 100296BC: using guessed type int creadung_playername;\r\n// 100296D4: using guessed type int creadung_lasterror;\r\n\r\n// ref: 0x1000517E\r\nvoid __fastcall CreaDung_CheckDlgForSnd(HWND hWnd, int a2, int a3)\r\n{\r\n\tHWND v6; // eax\r\n\tHWND v7; // eax\r\n\r\n\tv6 = GetDlgItem(hWnd, 1056);\r\n\tif (local_GetBottomRect(hWnd, v6, a2, a3)) {\r\n\t\tCreaDung_DoAllPlaySnd(hWnd);\r\n\t} else {\r\n\t\tv7 = GetDlgItem(hWnd, 1054);\r\n\t\tif (local_GetBottomRect(hWnd, v7, a2, a3))\r\n\t\t\tCreaDung_PlaySndAndKill(hWnd, 2);\r\n\t}\r\n}\r\n\r\n// ref: 0x100051D8\r\nBOOL __fastcall CreaDung_SelDungDiff(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)\r\n{\r\n\tint v8;      // ST10_4\r\n\tBOOL result; // eax\r\n\r\n\tcreadung_playername     = a1;\r\n\tcreadung_dword_100296C8 = a3;\r\n\tcreadung_playerID       = (int *)a6;\r\n\tcreadung_delspinners    = a7;\r\n\tcrea_somegamestruct     = (DWORD *)a2;\r\n\tcreadung_gamename       = (char *)a8;\r\n\tv8                      = SelHero_GetHeroIsGood();\r\n\tresult                  = SDlgDialogBoxParam(ghUiInst, \"SELDIFF_DIALOG\", *(DWORD *)(a4 + 8), CreaDung_WndProc, v8);\r\n\tif (result != 1) {\r\n\t\tSErrSetLastError(creadung_lasterror);\r\n\t\tresult = 0;\r\n\t}\r\n\treturn result;\r\n}\r\n// 1001041E: using guessed type int __stdcall SErrSetLastError(DWORD);\r\n// 100296BC: using guessed type int creadung_playername;\r\n// 100296C8: using guessed type int creadung_dword_100296C8;\r\n// 100296CC: using guessed type int creadung_delspinners;\r\n// 100296D4: using guessed type int creadung_lasterror;\r\n"
  },
  {
    "path": "DiabloUI/creastat.cpp",
    "content": "// ref: 0x1000523E\r\nBOOL __stdcall UiGetDefaultStats(int pclass, _uidefaultstats *pStats)\r\n{\r\n\tif (!pStats)\r\n\t\treturn 0;\r\n\tpStats->strength  = defstats[pclass][0];\r\n\tpStats->magic     = defstats[pclass][1];\r\n\tpStats->dexterity = defstats[pclass][2];\r\n\tpStats->vitality  = defstats[pclass][3];\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10005287\r\nvoid __cdecl CreaStat_cpp_init()\r\n{\r\n\tCreaStat_cpp_float = CreaStat_cpp_float_value;\r\n}\r\n// 1001F404: using guessed type int CreaStat_cpp_float_value;\r\n// 100296E0: using guessed type int CreaStat_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/credits.cpp",
    "content": "// ref: 0x10005297\r\nvoid __cdecl credits_cpp_init()\r\n{\r\n\tcredits_cpp_float = credits_cpp_float_value;\r\n}\r\n// 1001F408: using guessed type int credits_cpp_float_value;\r\n// 100296EC: using guessed type int credits_cpp_float;\r\n\r\n// ref: 0x100052A2\r\nBOOL __stdcall UiCreditsDialog(int a1)\r\n{\r\n\tint v1; // eax\r\n\r\n\tv1 = (int)SDrawGetFrameWindow(NULL);\r\n\tSDlgDialogBoxParam(ghUiInst, \"CREDITS_DIALOG\", v1, credits_WndProc, 25);\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x100052C7\r\nLRESULT __stdcall credits_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v5; // eax\r\n\r\n\tif (Msg > 0x111) {\r\n\t\tif (Msg == 275) {\r\n\t\t\tcredits_CalcPosROP3(hWnd);\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tif (Msg == 513 || Msg == 516)\r\n\t\t\tgoto LABEL_12;\r\n\t\tif (Msg != 528) {\r\n\t\t\tif (Msg == 2024) {\r\n\t\t\t\tif (!Fade_CheckRange5())\r\n\t\t\t\t\tFade_SetFadeTimer((int)hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tif ((WORD)wParam != 513 && (WORD)wParam != 516)\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tLABEL_25:\r\n\t\tTitle_KillAndFadeDlg(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg == 273)\r\n\t\tgoto LABEL_25;\r\n\tif (Msg != 2) {\r\n\t\tif (Msg == 135)\r\n\t\t\treturn 4;\r\n\t\tif (Msg != 256) {\r\n\t\t\tif (Msg > 0x103) {\r\n\t\t\t\tif (Msg <= 0x105) {\r\n\t\t\t\t\tv5 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\t\t\tSendMessageA(v5, Msg, wParam, lParam);\r\n\t\t\t\t} else if (Msg == 272) {\r\n\t\t\t\t\tcredits_LoadImgCreditTxt(hWnd, lParam);\r\n\t\t\t\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tif (wParam != 32)\r\n\t\t\treturn 0;\r\n\tLABEL_12:\r\n\t\tTitle_KillAndFadeDlg(hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tcredits_FreeCreditResrc(hWnd);\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x100053D9\r\nvoid __fastcall credits_FreeCreditResrc(HWND hWnd)\r\n{\r\n\tvoid **v2; // eax\r\n\r\n\tif (creditsobj) {\r\n\t\tSGdiDeleteObject(creditsobj);\r\n\t\tcreditsobj = 0;\r\n\t}\r\n\tif (credit_back_img) {\r\n\t\tSMemFree(credit_back_img, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\credits.cpp\", 46, 0);\r\n\t\tcredit_back_img = 0;\r\n\t}\r\n\tv2 = (void **)GetWindowLongA(hWnd, -21);\r\n\tlocal_FreeMemPtr(v2);\r\n\tif (credittext_rsrc) {\r\n\t\tFreeResource(credittext_rsrc);\r\n\t\tcredittext_rsrc = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x1000543A\r\nvoid __fastcall credits_LoadImgCreditTxt(HWND hWnd, LPARAM lParam)\r\n{\r\n\tsigned int v2;       // eax\r\n\tHRSRC v3;            // eax\r\n\tHRSRC v4;            // eax\r\n\tDWORD *v5;           // eax\r\n\tDWORD *v6;           // esi\r\n\tint v7;              // ebx\r\n\tint v8;              // esi\r\n\tHFONT v9;            // eax MAPDST\r\n\tBOOL v11;            // ebx\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-18h]\r\n\tHWND v13;            // [esp+1Ch] [ebp-8h]\r\n\r\n\tif (lParam)\r\n\t\tv2 = 1000 / lParam;\r\n\telse\r\n\t\tv2 = 50;\r\n\tSDlgSetTimer((int)hWnd, 1, v2, 0);\r\n\tv3              = FindResourceA(ghUiInst, \"IDR_CREDITS\", \"TEXT_FILES\");\r\n\tcredittext_rsrc = LoadResource(ghUiInst, v3);\r\n\tv4              = FindResourceA(ghUiInst, \"IDR_CREDITS\", \"TEXT_FILES\");\r\n\tcredittext_size = SizeofResource(ghUiInst, v4);\r\n\tv5              = local_AllocWndLongData();\r\n\tv6              = v5;\r\n\tif (v5) {\r\n\t\tSetWindowLongA(hWnd, -21, (LONG)v5);\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, \"ui_art\\\\credits.pcx\", (BYTE **)v6, v6 + 1, 0);\r\n\t\tFade_NoInputAndArt(hWnd, 0);\r\n\t}\r\n\tv13 = GetDlgItem(hWnd, 1000);\r\n\tGetWindowRect(v13, &Rect);\r\n\tv7                   = Rect.right - Rect.left;\r\n\tv8                   = Rect.bottom - Rect.top + 60;\r\n\tcredit_back_img      = SMemAlloc((Rect.right - Rect.left) * v8, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\credits.cpp\", 122, 0);\r\n\tcredit_horz_pos      = v7;\r\n\tcredit_vertical_pos1 = v8;\r\n\tlocal_AdjustRectSize(&Rect, 0, 30);\r\n\tSDlgSetBitmapI(v13, 0, 0, -1, 1, credit_back_img, (int)&Rect, v7, v8, -1);\r\n\tcredit_vertical_pos2 = v8 - 30;\r\n\tcredits_CalcPosROP3(hWnd);\r\n\tv9 = CreateFontA(-17, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, VARIABLE_PITCH | (FF_SCRIPT << 2), \"Times New Roman\");\r\n\tif (!v9 || (v11 = SGdiImportFont(v9, (int)&creditsobj), DeleteObject(v9), !v11))\r\n\t\tTitle_KillAndFadeDlg(hWnd);\r\n}\r\n// 100296E8: using guessed type int credittext_size;\r\n// 100296FC: using guessed type int credit_vertical_pos1;\r\n\r\n// ref: 0x100055C0\r\nvoid __fastcall credits_CalcPosROP3(HWND hWnd)\r\n{\r\n\tDWORD *v2;          // edi\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-14h]\r\n\tHWND hWnda;          // [esp+1Ch] [ebp-4h]\r\n\r\n\thWnda = GetDlgItem(hWnd, 1000);\r\n\tv2    = (DWORD *)GetWindowLongA(hWnd, -21);\r\n\tGetWindowRect(hWnda, &Rect);\r\n\tScreenToClient(hWnd, (LPPOINT)&Rect);\r\n\tScreenToClient(hWnd, (LPPOINT)&Rect.right);\r\n\tSBltROP3(\r\n\t    (char *)credit_back_img + 30 * credit_horz_pos,\r\n\t    (void *)(Rect.left + *v2 + Rect.top * v2[1]),\r\n\t    credit_horz_pos,\r\n\t    Rect.bottom - Rect.top,\r\n\t    credit_horz_pos,\r\n\t    v2[1],\r\n\t    0,\r\n\t    0xCC0020u);\r\n\t--credit_vertical_pos2;\r\n\tcredits_PrintCredLines(hWnd);\r\n\tInvalidateRect(hWnda, 0, 0);\r\n\tUpdateWindow(hWnda);\r\n}\r\n\r\n// ref: 0x10005660\r\nvoid __fastcall credits_PrintCredLines(HWND hWnd)\r\n{\r\n\tchar *v1; // esi\r\n\tint i;    // edi\r\n\tint v3;   // ebp\r\n\tint v4;   // ebx\r\n\r\n\tv1                = (char *)LockResource(credittext_rsrc);\r\n\tcredit_line_count = credittext_size;\r\n\tSGdiSelectObject((int)creditsobj);\r\n\tSGdiSetPitch(credit_horz_pos);\r\n\tfor (i = credit_vertical_pos2; credit_line_count > 0; v1 = credits_GetAdjustText(v1, v4)) {\r\n\t\tv3 = 0;\r\n\t\twhile (*v1 == 9) {\r\n\t\t\tv3 += 40;\r\n\t\t\t++v1;\r\n\t\t\t--credit_line_count;\r\n\t\t}\r\n\t\tv4 = credits_GetCredLineBreak(v1);\r\n\t\tif (v4 == -1)\r\n\t\t\tbreak;\r\n\t\tif (i >= 0) {\r\n\t\t\tif (i > credit_vertical_pos1 - 30)\r\n\t\t\t\tbreak;\r\n\t\t\tif (v4) {\r\n\t\t\t\tSGdiTextOut(credit_back_img, v3 + 2, i + 2, 0x1000000, v1, v4);\r\n\t\t\t\tSGdiTextOut(credit_back_img, v3, i, 16777440, v1, v4);\r\n\t\t\t}\r\n\t\t}\r\n\t\ti += 22;\r\n\t}\r\n\tif (i < 0)\r\n\t\tTitle_KillAndFadeDlg(hWnd);\r\n}\r\n// 100103A6: using guessed type int __stdcall SGdiSetPitch(DWORD);\r\n// 100103AC: using guessed type int __stdcall SGdiSelectObject(DWORD);\r\n// 100296E8: using guessed type int credittext_size;\r\n// 100296FC: using guessed type int credit_vertical_pos1;\r\n// 10029700: using guessed type int credit_line_count;\r\n\r\n// ref: 0x10005736\r\nint __fastcall credits_GetCredLineBreak(char *str)\r\n{\r\n\tint result; // eax\r\n\r\n\tresult = 0;\r\n\twhile (*str != 13 && *str != 10) {\r\n\t\t++result;\r\n\t\t++str;\r\n\t\tif (result > credit_line_count)\r\n\t\t\treturn -1;\r\n\t}\r\n\treturn result;\r\n}\r\n// 10029700: using guessed type int credit_line_count;\r\n\r\n// ref: 0x10005755\r\nchar *__fastcall credits_GetAdjustText(char *str, int len)\r\n{\r\n\tcredit_line_count += -2 - len;\r\n\treturn &str[len + 2];\r\n}\r\n// 10029700: using guessed type int credit_line_count;\r\n"
  },
  {
    "path": "DiabloUI/diabedit.cpp",
    "content": "// ref: 0x10005765\r\nvoid __fastcall DiabEdit_DoPaintBMP(HWND hWnd)\r\n{\r\n\tstruct tagPAINTSTRUCT Paint; // [esp+4h] [ebp-40h]\r\n\r\n\tBeginPaint(hWnd, &Paint);\r\n\tSDlgDrawBitmap(hWnd, 1, 0, 0, 0, 0, 0);\r\n\tEndPaint(hWnd, &Paint);\r\n}\r\n\r\n// ref: 0x1000579B\r\nvoid __cdecl DiabEdit_cpp_init()\r\n{\r\n\tDiabEdit_cpp_float = DiabEdit_cpp_float_value;\r\n}\r\n// 1001F40C: using guessed type int DiabEdit_cpp_float_value;\r\n// 1002970C: using guessed type int DiabEdit_cpp_float;\r\n\r\n// ref: 0x100057A6\r\nvoid __cdecl DiabEdit_SetupWindow()\r\n{\r\n\tWNDCLASSA WndClass; // [esp+0h] [ebp-28h]\r\n\r\n\tmemset(&WndClass, 0, 0x28u);\r\n\tWndClass.style         = 64;\r\n\tWndClass.lpfnWndProc   = DiabEdit_WndProc;\r\n\tWndClass.hInstance     = GetModuleHandleA(0);\r\n\tWndClass.lpszClassName = \"DIABLOEDIT\";\r\n\tRegisterClassA(&WndClass);\r\n}\r\n\r\n// ref: 0x100057E8\r\nLRESULT __stdcall DiabEdit_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tif (Msg <= 0x113) {\r\n\t\tif (Msg == 275) {\r\n\t\t\tDiabEdit_GetCursorProp(hWnd);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif (Msg == 1) {\r\n\t\t\tDiabEdit_SetRestrictTimer(hWnd);\r\n\t\t} else if (Msg == 2) {\r\n\t\t\tDiabEdit_RemoveAllProps(hWnd);\r\n\t\t} else {\r\n\t\t\tif (Msg != 7) {\r\n\t\t\t\tif (Msg == 15) {\r\n\t\t\t\t\tDiabEdit_DoPaintBMP(hWnd);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (Msg == 135)\r\n\t\t\t\t\t\treturn 129;\r\n\t\t\t\t\tif (Msg != 256) {\r\n\t\t\t\t\t\tif (Msg == 258)\r\n\t\t\t\t\t\t\tDiabEdit_RestrictAndLimit(hWnd, wParam, lParam);\r\n\t\t\t\t\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tDiabEdit_SetTextAndProp(hWnd, wParam, lParam);\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tDiabEdit_SendWndCommand(hWnd, 1u);\r\n\t\t}\r\n\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tswitch (Msg) {\r\n\tcase 0x201u:\r\n\t\tSetFocus(hWnd);\r\n\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\tcase 0x400u:\r\n\t\tSetWindowTextA(hWnd, &nullcharacter);\r\n\t\tDiabEdit_SendWndCommand(hWnd, 3u);\r\n\t\treturn 0;\r\n\tcase 0x401u:\r\n\t\tSetPropA(hWnd, \"LIMIT\", (HANDLE)wParam);\r\n\t\treturn 0;\r\n\tcase 0x402u:\r\n\t\treturn (LRESULT)GetPropA(hWnd, \"LIMIT\");\r\n\t}\r\n\tif (Msg != 1027) {\r\n\t\tif (Msg == 1028) {\r\n\t\t\tDiabEdit_SetRestrictString(hWnd, lParam);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\treturn (LRESULT)GetPropA(hWnd, \"CURSOR\");\r\n}\r\n\r\n// ref: 0x1000591C\r\nvoid __fastcall DiabEdit_SendWndCommand(HWND hWnd, WORD a2)\r\n{\r\n\tint v4;  // ST08_4\r\n\tHWND v5; // eax\r\n\r\n\tv4 = (a2 << 16) | (unsigned short)GetWindowLongA(hWnd, -12);\r\n\tv5 = GetParent(hWnd);\r\n\tSendMessageA(v5, 0x111u, v4, (LPARAM)hWnd);\r\n}\r\n\r\n// ref: 0x1000594E\r\nvoid __fastcall DiabEdit_GetCursorProp(HWND hWnd)\r\n{\r\n\tsize_t v2;        // eax\r\n\tchar *v3;         // esi\r\n\tchar String[256]; // [esp+Ch] [ebp-100h]\r\n\r\n\tString[0] = nullcharacter;\r\n\tmemset(&String[1], 0, 0xFCu);\r\n\t*(WORD *)&String[253] = 0;\r\n\tString[255]            = 0;\r\n\tif (GetPropA(hWnd, \"CURSOR\")) {\r\n\t\tSetPropA(hWnd, \"CURSOR\", 0);\r\n\t\tDiabEdit_SendWndCommand(hWnd, 3u);\r\n\t} else {\r\n\t\tSetPropA(hWnd, \"CURSOR\", (void *)HANDLE_FLAG_INHERIT);\r\n\t\tGetWindowTextA(hWnd, String, 255);\r\n\t\tString[254]    = 0;\r\n\t\tv2             = strlen(String);\r\n\t\tString[v2 + 1] = 0;\r\n\t\tv3             = &String[v2];\r\n\t\tString[v2]     = 124;\r\n\t\tSetWindowTextA(hWnd, String);\r\n\t\tDiabEdit_SendWndCommand(hWnd, 3u);\r\n\t\t*v3 = 0;\r\n\t\tSetWindowTextA(hWnd, String);\r\n\t}\r\n}\r\n\r\n// ref: 0x10005A0A\r\nvoid __fastcall DiabEdit_RestrictAndLimit(HWND hWnd, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tunsigned char v3; // bl\r\n\tchar *v4;         // eax\r\n\tchar v5;          // cl\r\n\tsigned int v6;    // eax\r\n\tsigned int v7;    // esi\r\n\t//char v8; // [esp+7h] [ebp-105h]\r\n\tchar String[256]; // [esp+8h] [ebp-104h]\r\n\r\n\tString[0] = nullcharacter;\r\n\tv3        = wParam;\r\n\tmemset(&String[1], 0, 0xFCu);\r\n\t*(WORD *)&String[253] = 0;\r\n\tString[255]            = 0;\r\n\tif ((BYTE)wParam == 8)\r\n\t\tgoto LABEL_9;\r\n\tif ((unsigned char)wParam < 0x20u || (unsigned char)wParam > 0x7Eu && (unsigned char)wParam < 0xC0u)\r\n\t\treturn;\r\n\tv4 = (char *)GetPropA(hWnd, \"RESTRICTED\");\r\n\tif (!v4 || (v5 = *v4) == 0) {\r\n\tLABEL_9:\r\n\t\tGetWindowTextA(hWnd, String, 255);\r\n\t\tString[254] = 0;\r\n\t\tv6          = strlen(String);\r\n\t\tv7          = v6;\r\n\t\tif (v3 == 8) {\r\n\t\t\tif (v6) {\r\n\t\t\t\tString[v6 - 1] = 0; // *(&v8 + v6) = 0;\r\n\t\t\t\tgoto LABEL_14;\r\n\t\t\t}\r\n\t\t} else if (v6 < (signed int)GetPropA(hWnd, \"LIMIT\")) {\r\n\t\t\tString[v7]     = v3;\r\n\t\t\tString[v7 + 1] = 0;\r\n\t\tLABEL_14:\r\n\t\t\tSetWindowTextA(hWnd, String);\r\n\t\t\tgoto LABEL_15;\r\n\t\t}\r\n\tLABEL_15:\r\n\t\tDiabEdit_GetCursorProp(hWnd);\r\n\t\treturn;\r\n\t}\r\n\twhile (v3 != v5) {\r\n\t\tv5 = *++v4;\r\n\t\tif (!*v4)\r\n\t\t\tgoto LABEL_9;\r\n\t}\r\n}\r\n\r\n// ref: 0x10005AF4\r\nvoid __fastcall DiabEdit_SetTextAndProp(HWND hWnd, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tWPARAM v4; // ebx\r\n\tsize_t v5; // eax\r\n\t//char v6; // [esp+Bh] [ebp-101h]\r\n\tchar String[256]; // [esp+Ch] [ebp-100h]\r\n\r\n\tString[0] = nullcharacter;\r\n\tmemset(&String[1], 0, 0xFCu);\r\n\t*(WORD *)&String[253] = 0;\r\n\tString[255]            = 0;\r\n\tv4                     = wParam;\r\n\tGetWindowTextA(hWnd, String, 255);\r\n\tString[254] = 0;\r\n\tv5          = strlen(String);\r\n\tif (v4 == 37) {\r\n\t\tif (v5) {\r\n\t\t\tString[v5 - 1] = 0; // *(&v6 + v5) = 0;\r\n\t\t\tSetWindowTextA(hWnd, String);\r\n\t\t}\r\n\t\tDiabEdit_GetCursorProp(hWnd);\r\n\t}\r\n}\r\n\r\n// ref: 0x10005B70\r\nvoid __fastcall DiabEdit_SetRestrictString(HWND hWnd, LPARAM lParam)\r\n{\r\n\tconst char *v2; // edi\r\n\tchar *v3;       // eax MAPDST\r\n\r\n\tv2 = (const char *)lParam;\r\n\tv3 = (char *)GetPropA(hWnd, \"RESTRICTED\");\r\n\tif (v3) {\r\n\t\tstrncpy(v3, v2, 0xFFu);\r\n\t\tv3[255] = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x10005B9F\r\nvoid __fastcall DiabEdit_SetRestrictTimer(HWND hWnd)\r\n{\r\n\tunsigned char *v2; // eax\r\n\r\n\tSDlgSetTimer((int)hWnd, 1, 500, 0);\r\n\tSetPropA(hWnd, \"CURSOR\", 0);\r\n\tv2  = (unsigned char *)SMemAlloc(0x100u, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\DiabEdit.cpp\", 185, 0);\r\n\t*v2 = 0;\r\n\tSetPropA(hWnd, \"RESTRICTED\", v2);\r\n}\r\n\r\n// ref: 0x10005BE7\r\nvoid __fastcall DiabEdit_RemoveAllProps(HWND hWnd)\r\n{\r\n\tHANDLE v2; // eax\r\n\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tRemovePropA(hWnd, \"LIMIT\");\r\n\tRemovePropA(hWnd, \"CURSOR\");\r\n\tv2 = RemovePropA(hWnd, \"RESTRICTED\");\r\n\tif (v2)\r\n\t\tSMemFree(v2, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\DiabEdit.cpp\", 200, 0);\r\n}\r\n"
  },
  {
    "path": "DiabloUI/diabloui.cpp",
    "content": "#define STRICT // for WNDPROC. ref: Remarks in https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-callwindowproca\r\n#include <ddraw.h>\r\n#include <dsound.h>\r\n#include <io.h>\r\n#include <math.h>\r\n#include <process.h>\r\n#include <shlobj.h>\r\n#include <stdio.h>\r\n#include <time.h>\r\n#include <windows.h>\r\n\r\n#ifdef _MSC_VER\r\n#pragma warning(disable : 4018) // signed/unsigned mismatch\r\n#endif\r\n\r\n#include \"..\\defs.h\"\r\n#include \"..\\enums.h\"\r\n#include \"..\\structs.h\"\r\n#include \"..\\3rdParty\\Storm\\Source\\storm.h\"\r\n#include \"diabloui.h\"\r\n\r\n#define UNKCALL __fastcall\r\n#define USERCALL __fastcall\r\n#define USERPURGE __fastcall\r\n\r\n//temporarily include everything directly\r\n#include \"_temp_data.cpp\"\r\n#include \"_temp_funcs.h\"\r\n\r\n#include \"artfont.cpp\"\r\n#include \"bn_prof.cpp\"\r\n#include \"bnetgw.cpp\"\r\n#include \"connect.cpp\"\r\n#include \"copyprot.cpp\"\r\n#include \"cr8game.cpp\"\r\n#include \"creadung.cpp\"\r\n#include \"creastat.cpp\"\r\n#include \"credits.cpp\"\r\n#include \"diabedit.cpp\"\r\n#include \"dirlink.cpp\"\r\n#include \"disclaim.cpp\"\r\n#include \"doom.cpp\"\r\n#include \"entdial.cpp\"\r\n#include \"entname.cpp\"\r\n#include \"fade.cpp\"\r\n#include \"focus.cpp\"\r\n#include \"local.cpp\"\r\n#include \"mainmenu.cpp\"\r\n#include \"modem.cpp\"\r\n#include \"modmstat.cpp\"\r\n#include \"okcancel.cpp\"\r\n#include \"progress.cpp\"\r\n#include \"sbar.cpp\"\r\n#include \"selclass.cpp\"\r\n#include \"selconn.cpp\"\r\n#include \"seldial.cpp\"\r\n#include \"selgame.cpp\"\r\n#include \"selhero.cpp\"\r\n#include \"selipx.cpp\"\r\n#include \"sellist.cpp\"\r\n#include \"selload.cpp\"\r\n#include \"selmodem.cpp\"\r\n#include \"selregn.cpp\"\r\n#include \"selyesno.cpp\"\r\n#include \"title.cpp\"\r\n#include \"titlesnd.cpp\"\r\n\r\n// ref: 0x10005C2A\r\nint __cdecl DiabloUI_GetSpawned()\r\n{\r\n\treturn sgbIsSpawn;\r\n}\r\n// 1002972C: using guessed type int sgbIsSpawn;\r\n\r\n// ref: 0x10005C30\r\nvoid __stdcall UiOnPaint(int a1)\r\n{\r\n\treturn;\r\n}\r\n\r\n// ref: 0x10005C33\r\nvoid __stdcall UiSetBackgroundBitmap(int a1, PALETTEENTRY *a2, int a3, int a4, int a5)\r\n{\r\n\tbackbmp_flag1 = a3;\r\n\tbackbmp_flag2 = a4;\r\n\tbackbmp_flag3 = a5;\r\n\tSDrawUpdatePalette(0xAu, 0xECu, a2 + 10, 0);\r\n}\r\n// 1002971C: using guessed type int backbmp_flag1;\r\n// 10029720: using guessed type int backbmp_flag2;\r\n// 10029724: using guessed type int backbmp_flag3;\r\n\r\n// ref: 0x10005C67\r\nvoid __stdcall UiSetSpawned(BOOL bSpawned)\r\n{\r\n\tsgbIsSpawn = bSpawned;\r\n}\r\n// 1002972C: using guessed type int sgbIsSpawn;\r\n\r\n// ref: 0x10005C73\r\nvoid __stdcall UiInitialize()\r\n{\r\n\tsgbUiIsInitialized = 1;\r\n\tTitleSnd_InitSoundFunc();\r\n\tartfont_InitAllFonts();\r\n\tConnect_LoadGFXAndStuff();\r\n\tlocal_LoadArtCursor();\r\n\tbn_prof_100021C4();\r\n}\r\n// 10029714: using guessed type int sgbUiIsInitialized;\r\n\r\n// ref: 0x10005C96\r\nvoid __stdcall UiDestroy()\r\n{\r\n\tbn_prof_10002247();\r\n\tlocal_FreeArtCursor();\r\n\tConnect_FreeConnectData();\r\n\tsgbUiIsInitialized = 0;\r\n}\r\n// 10029714: using guessed type int sgbUiIsInitialized;\r\n\r\n// ref: 0x10005CAD\r\nvoid __stdcall UiAppActivate(BOOL bActive)\r\n{\r\n\tapp_is_active = bActive;\r\n}\r\n// 10029728: using guessed type int app_is_active;\r\n\r\n// ref: 0x10005CB9\r\nBOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)\r\n{\r\n\tif (fdwReason) {\r\n\t\tif (fdwReason == 1) {\r\n\t\t\tghUiInst = hinstDLL;\r\n\t\t\tDiabEdit_SetupWindow();\r\n\t\t\tlocal_InitUiPalette();\r\n\t\t}\r\n\t} else {\r\n\t\tlocal_DelUiPalette();\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\n// ref: 0x10005CEA\r\nvoid __cdecl DiabloUI_cpp_init()\r\n{\r\n\tDiabloUI_cpp_float = DiabloUI_cpp_float_value;\r\n}\r\n// 1001F410: using guessed type int DiabloUI_cpp_float_value;\r\n// 10029710: using guessed type int DiabloUI_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/diabloui.def",
    "content": "LIBRARY \"DiabloUI\"\r\n\r\nEXPORTS\r\n\tUiValidPlayerName\r\n\tUiAppActivate\r\n\tUiArtCallback\r\n\tUiAuthCallback\r\n\tUiBetaDisclaimer\r\n\tUiCategoryCallback\r\n\tUiCopyProtError\r\n\tUiCreateGameCallback\r\n\tUiCreateGameCriteria\r\n\tUiCreatePlayerDescription\r\n\tUiCreditsDialog\r\n\tUiDestroy\r\n\tUiDrawDescCallback\r\n\tUiGetDataCallback\r\n\tUiGetDefaultStats\r\n\tUiInitialize\r\n\tUiMainMenuDialog\r\n\tUiMessageBoxCallback\r\n\tUiOnPaint\r\n\tUiProfileCallback\r\n\tUiProfileDraw\r\n\tUiProfileGetString\r\n\tUiProgressDialog\r\n\tUiSelHeroMultDialog\r\n\tUiSelHeroSingDialog\r\n\tUiSelectGame\r\n\tUiSelectProvider\r\n\tUiSelectRegion\r\n\tUiSetBackgroundBitmap\r\n\tUiSetSpawned\r\n\tUiSetupPlayerInfo\r\n\tUiSoundCallback\r\n\tUiTitleDialog\r\n"
  },
  {
    "path": "DiabloUI/diabloui.h",
    "content": "//HEADER_GOES_HERE\r\n#ifndef __DIABLOUI_H__\r\n#define __DIABLOUI_H__\r\n\r\n#if defined(__GNUC__) || defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\nstruct FontStruct {\r\n\tunsigned char fontbin[258];\r\n\tHANDLE fonttrans[256];\r\n\tBOOL active;\r\n};\r\n\r\nstruct ProfileStruct {\r\n\tconst char *name;\r\n\tchar field_4;\r\n\tint msg;\r\n\tint field_C;\r\n};\r\n\r\nstruct ProfFntStruct {\r\n\tint size;\r\n\tconst char *fontname;\r\n\tint field_8;\r\n};\r\n\r\nvoid __stdcall UiDestroy();\r\nBOOL __stdcall UiTitleDialog(int a1);\r\nvoid __stdcall UiSetSpawned(BOOL bSpawned);\r\nvoid __stdcall UiInitialize();\r\nBOOL __stdcall UiCopyProtError(int *pdwResult);\r\nvoid __stdcall UiAppActivate(BOOL bActive);\r\nBOOL __fastcall UiValidPlayerName(const char *name); /* check __stdcall */\r\nBOOL __stdcall UiSelHeroMultDialog(BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), BOOL(__stdcall *fncreate)(_uiheroinfo *), BOOL(__stdcall *fnremove)(_uiheroinfo *), BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, BOOL *hero_is_created, char *name);\r\nBOOL __stdcall UiSelHeroSingDialog(BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)), BOOL(__stdcall *fncreate)(_uiheroinfo *), BOOL(__stdcall *fnremove)(_uiheroinfo *), BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *), int *dlgresult, char *name, int *difficulty);\r\nBOOL __stdcall UiCreditsDialog(int a1);\r\nBOOL __stdcall UiMainMenuDialog(const char *name, int *pdwResult, void(__stdcall *fnSound)(const char *file), int attractTimeOut);\r\nBOOL __stdcall UiProgressDialog(HWND window, const char *msg, int enable, int(*fnfunc)(), int rate);\r\nconst char **__stdcall UiProfileGetString();\r\nvoid __cdecl UiProfileCallback();\r\nvoid __cdecl UiProfileDraw();\r\nBOOL __stdcall UiCategoryCallback(int a1, int a2, int a3, int a4, int a5, DWORD *a6, DWORD *a7);\r\nBOOL __stdcall UiGetDataCallback(int game_type, int data_code, void *a3, int a4, int a5);\r\nBOOL __stdcall UiAuthCallback(int a1, char *a2, char *a3, char a4, char *a5, LPSTR lpBuffer, int cchBufferMax);\r\nBOOL __stdcall UiSoundCallback(int a1, int type, int a3);\r\nvoid __stdcall UiMessageBoxCallback(HWND hWnd, char *lpText, LPCSTR lpCaption, UINT uType);\r\nBOOL __stdcall UiDrawDescCallback(int game_type, COLORREF color, LPCSTR lpString, char *a4, int a5, UINT align, time_t a7, HDC *a8);\r\nBOOL __stdcall UiCreateGameCallback(int a1, int a2, int a3, int a4, int a5, int a6);\r\nBOOL __stdcall UiArtCallback(int game_type, unsigned int art_code, PALETTEENTRY *pPalette, BYTE *pBuffer, DWORD dwBuffersize, DWORD *pdwWidth, DWORD *pdwHeight, DWORD *pdwBpp);\r\nint __stdcall UiSelectGame(int a1, _SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, _SNETVERSIONDATA *file_info, int *a6);\r\nint __stdcall UiSelectProvider(int a1, _SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, _SNETVERSIONDATA *file_info, int *type);\r\nBOOL __stdcall UiCreatePlayerDescription(_uiheroinfo *info, DWORD mode, char *desc);\r\nvoid __stdcall UiSetupPlayerInfo(char *infostr, _uiheroinfo *pInfo, DWORD type);\r\nvoid __stdcall UiCreateGameCriteria(_uiheroinfo *pInfo, char *str);\r\nBOOL __stdcall UiGetDefaultStats(int pclass, _uidefaultstats *pStats);\r\nBOOL __stdcall UiBetaDisclaimer(int a1);\r\n\r\n#if defined(__GNUC__) || defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif /* __DIABLOUI_H__ */\r\n"
  },
  {
    "path": "DiabloUI/diabloui_gcc.def",
    "content": "LIBRARY \"DiabloUI\"\r\n\r\nEXPORTS\r\n\tUiValidPlayerName              @1\r\n\t@UiValidPlayerName@4           @1  NONAME\r\n\tUiAppActivate                  @2\r\n\tUiAppActivate@4                @2  NONAME\r\n\tUiArtCallback                  @3\r\n\tUiArtCallback@32               @3  NONAME\r\n\tUiAuthCallback                 @4\r\n\tUiAuthCallback@28              @4  NONAME\r\n\tUiBetaDisclaimer               @5\r\n\tUiBetaDisclaimer@4             @5  NONAME\r\n\tUiCategoryCallback             @6\r\n\tUiCategoryCallback@28          @6  NONAME\r\n\tUiCopyProtError                @7\r\n\tUiCopyProtError@4              @7  NONAME\r\n\tUiCreateGameCallback           @8\r\n\tUiCreateGameCallback@24        @8  NONAME\r\n\tUiCreateGameCriteria           @9\r\n\tUiCreatePlayerDescription      @10\r\n\tUiCreatePlayerDescription@12   @10 NONAME\r\n\tUiCreditsDialog                @11\r\n\tUiCreditsDialog@4              @11 NONAME\r\n\tUiDestroy                      @12\r\n\tUiDestroy@0                    @12 NONAME\r\n\tUiDrawDescCallback             @13\r\n\tUiDrawDescCallback@32          @13 NONAME\r\n\tUiGetDataCallback              @14\r\n\tUiGetDataCallback@20           @14 NONAME\r\n\tUiGetDefaultStats              @15\r\n\tUiInitialize                   @16\r\n\tUiInitialize@0                 @16 NONAME\r\n\tUiMainMenuDialog               @17\r\n\tUiMainMenuDialog@16            @17 NONAME\r\n\tUiMessageBoxCallback           @18\r\n\tUiMessageBoxCallback@16        @18 NONAME\r\n\tUiOnPaint                      @19\r\n\tUiProfileCallback              @20\r\n\tUiProfileDraw                  @21\r\n\tUiProfileGetString             @22\r\n\tUiProfileGetString@0           @22 NONAME\r\n\tUiProgressDialog               @23\r\n\tUiProgressDialog@20            @23 NONAME\r\n\tUiSelHeroMultDialog            @24\r\n\tUiSelHeroMultDialog@28         @24 NONAME\r\n\tUiSelHeroSingDialog            @25\r\n\tUiSelHeroSingDialog@28         @25 NONAME\r\n\tUiSelectGame                   @26\r\n\tUiSelectGame@24                @26 NONAME\r\n\tUiSelectProvider               @27\r\n\tUiSelectProvider@24            @27 NONAME\r\n\tUiSelectRegion                 @28\r\n\tUiSetBackgroundBitmap          @29\r\n\tUiSetSpawned                   @30\r\n\tUiSetSpawned@4                 @30 NONAME\r\n\tUiSetupPlayerInfo              @31\r\n\tUiSetupPlayerInfo@12           @31 NONAME\r\n\tUiSoundCallback                @32\r\n\tUiSoundCallback@12             @32 NONAME\r\n\tUiTitleDialog                  @33\r\n\tUiTitleDialog@4                @33 NONAME\r\n"
  },
  {
    "path": "DiabloUI/dirlink.cpp",
    "content": "// ref: 0x10005CFA\r\nsigned int DirLink_10005CFA() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_10029730 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 10029730: using guessed type int dword_10029730;\r\n\r\n// ref: 0x10005D05\r\nBOOL __fastcall DirLink_10005D05(int a1, int a2, int a3, DWORD *a4, int a5, int playerid) { return 0; }\r\n/* {\r\n\tint v6; // esi\r\n\r\n\tdword_1002983C = a3;\r\n\tdword_1002984C = a2;\r\n\tdword_10029840 = a5;\r\n\tdword_10029848 = a4;\r\n\tgnDlinkPlayerid = playerid;\r\n\tartfont_10001159();\r\n\tv6 = SDlgDialogBoxParam(hInstance, \"DIRLINK_DIALOG\", a4[2], DirLink_10005D63, 0);\r\n\tartfont_100010C8();\r\n\treturn v6 == 1;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002983C: using guessed type int dword_1002983C;\r\n// 10029840: using guessed type int dword_10029840;\r\n// 10029844: using guessed type int gnDlinkPlayerid;\r\n// 1002984C: using guessed type int dword_1002984C;\r\n\r\n// ref: 0x10005D63\r\nint __stdcall DirLink_10005D63(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tint v6; // [esp+0h] [ebp-Ch]\r\n\tchar *v7; // [esp+4h] [ebp-8h]\r\n\tchar *v8; // [esp+8h] [ebp-4h]\r\n\r\n\tif ( Msg > 0x111 )\r\n\t{\r\n\t\tswitch ( Msg )\r\n\t\t{\r\n\t\t\tcase 0x113u:\r\n\t\t\t\tif ( wParam == 3 )\r\n\t\t\t\t{\r\n\t\t\t\t\tDirLink_100062BF(hWnd, v6, v7, v8);\r\n\t\t\t\t\tDirLink_10006073(hWnd);\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\tcase 0x201u:\r\n\t\t\t\tDirLink_10006359(hWnd, (unsigned short)lParam, lParam >> 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 0x7E8u:\r\n\t\t\t\tif ( !Fade_1000739F() )\r\n\t\t\t\t\tFade_100073FD(hWnd, v6);\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 273 )\r\n\t{\r\n\t\tif ( HIWORD(wParam) == 7 )\r\n\t\t{\r\n\t\t\tFocus_100075B7(hWnd, (HWND)lParam);\r\n\t\t}\r\n\t\telse if ( HIWORD(wParam) == 6 )\r\n\t\t{\r\n\t\t\tFocus_10007458((void *)lParam);\r\n\t\t\tFocus_100075DC(hWnd, (HWND)lParam);\r\n\t\t\tDirLink_10005EB2(hWnd, (unsigned short)wParam);\r\n\t\t}\r\n\t\telse if ( wParam == 327681 )\r\n\t\t{\r\n\t\t\tDirLink_100060D1(hWnd);\r\n\t\t}\r\n\t\telse if ( (WORD)wParam == 2 )\r\n\t\t{\r\n\t\t\tDirLink_10006047((int)hWnd, 2);\r\n\t\t}\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tDirLink_10005F1F(hWnd);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg <= 0x103 )\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tif ( Msg <= 0x105 )\r\n\t{\r\n\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg != 272 )\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\tDirLink_10005F7B(hWnd);\r\n\treturn 0;\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10005EB2\r\nint __fastcall DirLink_10005EB2(HWND hDlg, int a2) { return 0; }\r\n/* {\r\n\tHWND v2; // esi\r\n\tint v3; // edi\r\n\tHWND v4; // ebx\r\n\tint v5; // eax\r\n\tCHAR Buffer; // [esp+Ch] [ebp-100h]\r\n\r\n\tv2 = hDlg;\r\n\tv3 = a2;\r\n\tv4 = GetDlgItem(hDlg, 1102);\r\n\tif ( v3 == 1100 )\r\n\t\tLoadStringA(hInstance, 0x2Au, &Buffer, 255);\r\n\telse\r\n\t\tLoadStringA(hInstance, 0x2Fu, &Buffer, 255);\r\n\tv5 = GetWindowLongA(v4, -21);\r\n\tlocal_10007FA4(v5, &Buffer);\r\n\treturn Doom_10006A13(v2, (int *)&unk_10022A40, 1);\r\n} */\r\n\r\n// ref: 0x10005F1F\r\nint UNKCALL DirLink_10005F1F(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tDWORD *v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tDoom_10006C53(hDlg, (int *)&unk_10022A54);\r\n\tDoom_10006C53(v1, (int *)&unk_10022A48);\r\n\tDoom_10006C53(v1, (int *)&unk_10022A40);\r\n\tDoom_10006C53(v1, (int *)&unk_10022A38);\r\n\tDoom_10006C53(v1, (int *)&unk_10022A2C);\r\n\tv2 = (DWORD *)GetWindowLongA(v1, -21);\r\n\tlocal_10007F72(v2);\r\n\tTitle_100100E7(v1);\r\n\treturn Focus_10007818(v1);\r\n} */\r\n\r\n// ref: 0x10005F7B\r\nint UNKCALL DirLink_10005F7B(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // ST1C_4\r\n\tint v3; // eax\r\n\tint *v4; // edi\r\n\tHWND v6; // [esp-4h] [ebp-Ch]\r\n\tint v7; // [esp-4h] [ebp-Ch]\r\n\tchar *v8; // [esp+0h] [ebp-8h]\r\n\tchar *v9; // [esp+4h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tFocus_100077E9((int)hWnd, \"ui_art\\\\focus16.pcx\", v6);\r\n\tTitle_1001009E(v1, (int)\"ui_art\\\\smlogo.pcx\", v2);\r\n\tv3 = local_10007F46();\r\n\tv4 = (int *)v3;\r\n\tif ( v3 )\r\n\t{\r\n\t\tSetWindowLongA(v1, -21, v3);\r\n\t\tlocal_10007944((int)v1, 0, &byte_10029448, -1, 1, (int)\"ui_art\\\\selgame.pcx\", v4, v4 + 1, 0);\r\n\t\tFade_100073C5(v1, 1);\r\n\t}\r\n\tlocal_10007CB5(v1, (int *)&unk_10022A54);\r\n\tDoom_100068AB(v1, (int *)&unk_10022A2C, 5);\r\n\tDoom_100068AB(v1, (int *)&unk_10022A38, 3);\r\n\tDoom_100068AB(v1, (int *)&unk_10022A40, 1);\r\n\tDoom_1000658C(v1, (int *)&unk_10022A48, 4, 0);\r\n\tDoom_1000658C(v1, (int *)&unk_10022A54, 2, 1);\r\n\tDirLink_100062BF(v1, v7, v8, v9);\r\n\tDirLink_10006073(v1);\r\n\treturn SDlgSetTimer(v1, 3, 2000, 0);\r\n} */\r\n// 10010412: using guessed type int __stdcall SDlgSetTimer(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10006047\r\nint __fastcall DirLink_10006047(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // edi\r\n\tint v3; // esi\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tTitleSnd_1001031F();\r\n\tFade_100073B4();\r\n\tSDlgKillTimer(v3, 3);\r\n\tFade_100072BE(10);\r\n\treturn SDlgEndDialog(v3, v2);\r\n} */\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n// 10010418: using guessed type int __stdcall SDlgKillTimer(DWORD, DWORD);\r\n\r\n// ref: 0x10006073\r\nvoid UNKCALL DirLink_10006073(void *arg) { return; }\r\n/* {\r\n\tint v1; // esi\r\n\tchar v2; // [esp+4h] [ebp-100h]\r\n\tchar v3; // [esp+84h] [ebp-80h]\r\n\r\n\tv1 = (int)arg;\r\n\tif ( dword_10029738 )\r\n\t{\r\n\t\tConnect_10004028((int)&v2, 128, (int)&v3, 128);\r\n\t\tif ( SNetJoinGame(dword_10029738, &byte_1002973C, 0, &v2, &v3, gnDlinkPlayerid) )\r\n\t\t\tDirLink_10006047(v1, 1);\r\n\t}\r\n} */\r\n// 10010430: using guessed type int __stdcall SNetJoinGame(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10029738: using guessed type int dword_10029738;\r\n// 10029844: using guessed type int gnDlinkPlayerid;\r\n\r\n// ref: 0x100060D1\r\nHWND UNKCALL DirLink_100060D1(HWND arg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // eax\r\n\tHWND v3; // edi\r\n\tHWND result; // eax\r\n\tCHAR Buffer; // [esp+8h] [ebp-80h]\r\n\r\n\tv1 = arg;\r\n\tv2 = GetFocus();\r\n\tv3 = v2;\r\n\tresult = GetParent(v2);\r\n\tif ( v1 == result )\r\n\t{\r\n\t\tif ( GetWindowLongA(v3, -12) == 1100 )\r\n\t\t{\r\n\t\t\tresult = (HWND)DirLink_10006141(v1);\r\n\t\t}\r\n\t\telse if ( dword_10029738 )\r\n\t\t{\r\n\t\t\tresult = (HWND)DirLink_100061E1(v1);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tLoadStringA(hInstance, 0x2Bu, &Buffer, 127);\r\n\t\t\tresult = (HWND)SelYesNo_1000FD39((int)v1, &Buffer, 0, 0);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10029738: using guessed type int dword_10029738;\r\n\r\n// ref: 0x10006141\r\nint UNKCALL DirLink_10006141(void *arg) { return 0; }\r\n/* {\r\n\tint v1; // edi\r\n\tint result; // eax\r\n\tchar v3; // [esp+8h] [ebp-E0h]\r\n\tint v4; // [esp+88h] [ebp-60h]\r\n\tint v5; // [esp+90h] [ebp-58h]\r\n\tint v6; // [esp+D8h] [ebp-10h]\r\n\tint v7; // [esp+DCh] [ebp-Ch]\r\n\tint v8; // [esp+E0h] [ebp-8h]\r\n\tint v9; // [esp+E4h] [ebp-4h]\r\n\r\n\tv1 = (int)arg;\r\n\tConnect_10004028((int)&v3, 128, 0, 0);\r\n\tmemcpy(&v4, dword_10029848, 0x50u);\r\n\tv4 = 80;\r\n\tv5 = v1;\r\n\tmemset(&v6, 0, 0x10u);\r\n\tv6 = 16;\r\n\tv7 = 1396916812;\r\n\tv8 = *(DWORD *)(dword_1002984C + 24);\r\n\tv9 = 0;\r\n\tresult = CreaDung_100051D8(\r\n\t\t\t\t (int)&v6,\r\n\t\t\t\t dword_1002984C,\r\n\t\t\t\t dword_1002983C,\r\n\t\t\t\t (int)&v4,\r\n\t\t\t\t dword_10029840,\r\n\t\t\t\t gnDlinkPlayerid,\r\n\t\t\t\t 0,\r\n\t\t\t\t (int)&v3);\r\n\tif ( result )\r\n\t\tresult = DirLink_10006047(v1, 1);\r\n\treturn result;\r\n} */\r\n// 1002983C: using guessed type int dword_1002983C;\r\n// 10029840: using guessed type int dword_10029840;\r\n// 10029844: using guessed type int gnDlinkPlayerid;\r\n// 1002984C: using guessed type int dword_1002984C;\r\n\r\n// ref: 0x100061E1\r\nint UNKCALL DirLink_100061E1(void *arg) { return 0; }\r\n/* {\r\n\tint v1; // ebx\r\n\tCHAR *v2; // edx\r\n\tCHAR v4; // [esp+Ch] [ebp-380h]\r\n\tCHAR v5; // [esp+10Ch] [ebp-280h]\r\n\tint v6; // [esp+20Ch] [ebp-180h]\r\n\tchar v7; // [esp+28Ch] [ebp-100h]\r\n\tCHAR Buffer; // [esp+30Ch] [ebp-80h]\r\n\r\n\tv1 = (int)arg;\r\n\tConnect_10004028((int)&v6, 128, (int)&v7, 128);\r\n\tif ( UiAuthCallback(2, (int)&v6, &v7, 0, &byte_100297BC, &v5, 256) )\r\n\t{\r\n\t\tif ( SNetJoinGame(dword_10029738, &byte_1002973C, 0, &v6, &v7, gnDlinkPlayerid) )\r\n\t\t\treturn DirLink_10006047(v1, 1);\r\n\t\tif ( SErrGetLastError() == -2062548871 )\r\n\t\t\tLoadStringA(hInstance, 0x32u, &Buffer, 127);\r\n\t\telse\r\n\t\t\tLoadStringA(hInstance, 0x25u, &Buffer, 127);\r\n\t\twsprintfA(&v4, &Buffer, &byte_1002973C);\r\n\t\tv2 = &v4;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv2 = &v5;\r\n\t}\r\n\treturn SelYesNo_1000FD39(v1, v2, 0, 0);\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 10010430: using guessed type int __stdcall SNetJoinGame(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10029738: using guessed type int dword_10029738;\r\n// 10029844: using guessed type int gnDlinkPlayerid;\r\n\r\n// ref: 0x100062BF\r\nint UNKCALL DirLink_100062BF(void *arg, int a2, char *a3, char *a4) { return 0; }\r\n/* {\r\n\tint v4; // esi\r\n\tint result; // eax\r\n\tCHAR Buffer; // [esp+8h] [ebp-80h]\r\n\r\n\tv4 = (int)arg;\r\n\tdword_10029738 = 0;\r\n\tbyte_1002973C = 0;\r\n\tbyte_100297BC = 0;\r\n\tresult = SNetEnumGames(0, 0, DirLink_1000632B, 0);\r\n\tif ( !result )\r\n\t{\r\n\t\tresult = SErrGetLastError();\r\n\t\tif ( result == -2062548871 )\r\n\t\t{\r\n\t\t\tLoadStringA(hInstance, 0x32u, &Buffer, 127);\r\n\t\t\tSelYesNo_1000FD39(v4, &Buffer, 0, 0);\r\n\t\t\tresult = DirLink_10006047(v4, 2);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 10010436: using guessed type int __stdcall SNetEnumGames(DWORD, DWORD, DWORD, DWORD);\r\n// 10029738: using guessed type int dword_10029738;\r\n\r\n// ref: 0x1000632B\r\nsigned int __stdcall DirLink_1000632B(int a1, char *a2, char *a3) { return 0; }\r\n/* {\r\n\tdword_10029738 = a1;\r\n\tstrcpy(&byte_1002973C, a2);\r\n\tstrcpy(&byte_100297BC, a3);\r\n\treturn 1;\r\n} */\r\n// 10029738: using guessed type int dword_10029738;\r\n\r\n// ref: 0x10006359\r\nHWND __fastcall DirLink_10006359(HWND hWnd, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // ebx\r\n\tHWND v4; // esi\r\n\tint v5; // ST08_4\r\n\tHWND v6; // eax\r\n\tHWND result; // eax\r\n\tHWND v8; // eax\r\n\r\n\tv3 = a2;\r\n\tv4 = hWnd;\r\n\tv5 = a2;\r\n\tv6 = GetDlgItem(hWnd, 1056);\r\n\tif ( local_10007C3B(v4, v6, v5, a3) )\r\n\t\treturn DirLink_100060D1(v4);\r\n\tv8 = GetDlgItem(v4, 1054);\r\n\tresult = (HWND)local_10007C3B(v4, v8, v3, a3);\r\n\tif ( result )\r\n\t\tresult = (HWND)DirLink_10006047((int)v4, 2);\r\n\treturn result;\r\n} */\r\n"
  },
  {
    "path": "DiabloUI/disclaim.cpp",
    "content": "// ref: 0x100063B3\r\nBOOL __stdcall UiBetaDisclaimer(int a1)\r\n{\r\n\tint v1; // eax\r\n\r\n\tv1 = (int)SDrawGetFrameWindow(NULL);\r\n\tSDlgDialogBoxParam(ghUiInst, \"DISCLAIMER_DIALOG\", v1, disclaim_WndProc, a1);\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x100063DA\r\nLRESULT __stdcall disclaim_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v5; // eax\r\n\r\n\tif (Msg > 0x111) {\r\n\t\tif (Msg != 513 && Msg != 516) {\r\n\t\t\tif (Msg == 528) {\r\n\t\t\t\tif ((WORD)wParam == 513 || (WORD)wParam == 516)\r\n\t\t\t\t\tdisclaim_FadeFromDisclaim(hWnd);\r\n\t\t\t} else if (Msg == 2024) {\r\n\t\t\t\tif (!Fade_CheckRange5())\r\n\t\t\t\t\tFade_SetFadeTimer((int)hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t} else if (Msg != 273) {\r\n\t\tif (Msg != 2) {\r\n\t\t\tif (Msg != 256) {\r\n\t\t\t\tif (Msg > 0x103) {\r\n\t\t\t\t\tif (Msg <= 0x105) {\r\n\t\t\t\t\t\tv5 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\t\t\t\tSendMessageA(v5, Msg, wParam, lParam);\r\n\t\t\t\t\t} else if (Msg == 272) {\r\n\t\t\t\t\t\tdisclaim_LoadDisclaimGFX(hWnd);\r\n\t\t\t\t\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t}\r\n\t\t\tgoto LABEL_21;\r\n\t\t}\r\n\t\tdisclaim_DelDisclaimProcs(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\nLABEL_21:\r\n\tdisclaim_FadeFromDisclaim(hWnd);\r\n\treturn 0;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x100064C9\r\nvoid __fastcall disclaim_DelDisclaimProcs(HWND hWnd)\r\n{\r\n\tvoid **v2; // eax\r\n\r\n\tDoom_DeleteFreeProcs(hWnd, disclaim_msgtbl2);\r\n\tDoom_DeleteFreeProcs(hWnd, disclaim_msgtbl1);\r\n\tv2 = (void **)GetWindowLongA(hWnd, -21);\r\n\tlocal_FreeMemPtr(v2);\r\n}\r\n\r\n// ref: 0x100064F3\r\nvoid __fastcall disclaim_LoadDisclaimGFX(HWND hWnd)\r\n{\r\n\tDWORD *v2; // eax MAPDST\r\n\r\n\tv2 = local_AllocWndLongData();\r\n\tif (v2) {\r\n\t\tSetWindowLongA(hWnd, -21, (LONG)v2);\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, \"ui_art\\\\disclaim.pcx\", (BYTE **)v2, v2 + 1, 0);\r\n\t\tFade_NoInputAndArt(hWnd, 0);\r\n\t}\r\n\tDoom_ParseWndProc3(hWnd, disclaim_msgtbl1, AF_BIGGRAY);\r\n\tDoom_ParseWndProc3(hWnd, disclaim_msgtbl2, AF_MED);\r\n}\r\n\r\n// ref: 0x10006552\r\nvoid __fastcall disclaim_FadeFromDisclaim(HWND hWnd)\r\n{\r\n\tFade_Range5SetZero();\r\n\tFade_UpdatePaletteRange(10);\r\n\tSDlgEndDialog(hWnd, (void *)HANDLE_FLAG_INHERIT);\r\n}\r\n\r\n// ref: 0x10006571\r\nvoid __cdecl disclaim_cpp_init()\r\n{\r\n\tdisclaim_cpp_float = disclaim_cpp_float_value;\r\n}\r\n// 1001F418: using guessed type int disclaim_cpp_float_value;\r\n// 10029850: using guessed type int disclaim_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/doom.cpp",
    "content": "// ref: 0x10006581\r\nvoid __cdecl Doom_cpp_init()\r\n{\r\n\tdoom_cpp_float = doom_cpp_float_value;\r\n}\r\n// 1001F41C: using guessed type int doom_cpp_float_value;\r\n// 10029854: using guessed type int doom_cpp_float;\r\n\r\n// ref: 0x1000658C\r\nvoid __fastcall Doom_ParseWndProcs(HWND hWnd, int *msgtbl, int nFont, int a4)\r\n{\r\n\tHWND msg; // eax\r\n\r\n\twhile (*msgtbl) {\r\n\t\tmsg = GetDlgItem(hWnd, *msgtbl);\r\n\t\tDoom_GetSetWndText(hWnd, (int)msg, nFont, a4);\r\n\t\t++msgtbl;\r\n\t}\r\n}\r\n\r\n// ref: 0x100065BB\r\nvoid __fastcall Doom_GetSetWndText(HWND hWnd, int msg, int nFont, int a4)\r\n{\r\n\tHWND v4;          // esi\r\n\tHWND v5;          // edi\r\n\tint v6;           // eax\r\n\tchar String[256]; // [esp+8h] [ebp-100h]\r\n\r\n\tv4 = (HWND)msg;\r\n\tv5 = hWnd;\r\n\tif (msg) {\r\n\t\tDoom_AllocAndSetBMP(hWnd, msg, 1521);\r\n\t\tDoom_GetWindowROP3(v5, v4);\r\n\t\tartfont_SetArtFont(nFont);\r\n\t\tDoom_PrintStrWithSpin(v4, a4);\r\n\t\tGetWindowTextA(v4, String, 255);\r\n\t\tif (strlen(String)) {\r\n\t\t\tv6 = GetWindowLongA(v4, -21);\r\n\t\t\tlocal_SetWndLongStr(v6, String);\r\n\t\t\tSetWindowTextA(v4, &nullcharacter);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x1000663F\r\nvoid __fastcall Doom_PrintStrWithSpin(HWND hWnd, BOOL a2)\r\n{\r\n\tDWORD *v3;       // eax\r\n\tDWORD *v4;       // esi\r\n\tchar *v5;         // ebx\r\n\tint v6;           // edi\r\n\tsize_t v7;        // eax\r\n\tchar *i;          // eax\r\n\tint v9;           // kr04_4\r\n\tint v10;          // eax\r\n\tchar String[256]; // [esp+8h] [ebp-10Ch]\r\n\tchar *v12;        // [esp+108h] [ebp-Ch]\r\n\tint v14;          // [esp+110h] [ebp-4h]\r\n\r\n\tv3 = (DWORD *)GetWindowLongA(hWnd, -21);\r\n\tv4 = v3;\r\n\tif (v3 && *v3) {\r\n\t\tGetWindowTextA(hWnd, String, 255);\r\n\t\tv5 = String;\r\n\t\tif (!strlen(String))\r\n\t\t\tv5 = (char *)(v4 + 4);\r\n\t\tv14    = artfont_GetFontWidth(v5);\r\n\t\tif (a2) {\r\n\t\t\tv6 = v4[1] - 2 * Focus_GetSpinWidthOrZero();\r\n\t\t\tv7 = strlen(v5);\r\n\t\t\tif (v14 > v6) {\r\n\t\t\t\tfor (i = &v5[v7];; i = v12) {\r\n\t\t\t\t\tv12  = i - 1;\r\n\t\t\t\t\t*v12 = 0;\r\n\t\t\t\t\tv14  = artfont_GetFontWidth(v5);\r\n\t\t\t\t\tif (v14 <= v6)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tv9  = v4[1] - v14 - 1;\r\n\t\tv10 = artfont_GetFontMaxHeight();\r\n\t\tartfont_PrintFontStr(v5, (DWORD **)v4, v9 / 2, (v4[2] - v10) / 2);\r\n\t\tInvalidateRect(hWnd, 0, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x10006719\r\nvoid __fastcall Doom_AllocAndSetBMP(HWND hWnd, int a2, int bmp_flags)\r\n{\r\n\tDWORD *v4;           // esi\r\n\tstruct tagRECT Rect; // [esp+8h] [ebp-10h]\r\n\r\n\tGetClientRect((HWND)a2, &Rect);\r\n\tv4    = local_AllocWndLongData();\r\n\tv4[1] = Rect.right;\r\n\tv4[2] = Rect.bottom;\r\n\t*v4   = (DWORD)SMemAlloc(Rect.right * Rect.bottom, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Doom.cpp\", 139, 0);\r\n\tSetWindowLongA((HWND)a2, -21, (LONG)v4);\r\n\tSDlgSetBitmapI((HWND)a2, 0, &nullcharacter, -1, bmp_flags, (void *)*v4, 0, v4[1], v4[2], -1);\r\n}\r\n\r\n// ref: 0x1000678A\r\nvoid __fastcall Doom_GetWindowROP3(HWND hWnd1, HWND hWnd2)\r\n{\r\n\tDWORD *v3;          // ebx\r\n\tLONG v4;             // eax MAPDST\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-14h]\r\n\r\n\tv3 = (DWORD *)GetWindowLongA(hWnd1, -21);\r\n\tv4 = GetWindowLongA(hWnd2, -21);\r\n\tif (v3 && *v3 && v4) {\r\n\t\tif (*(DWORD *)v4) {\r\n\t\t\tGetWindowRect(hWnd2, &Rect);\r\n\t\t\tScreenToClient(hWnd1, (LPPOINT)&Rect);\r\n\t\t\tScreenToClient(hWnd1, (LPPOINT)&Rect.right);\r\n\t\t\tSBltROP3(\r\n\t\t\t    *(void **)v4,\r\n\t\t\t    (void *)(Rect.left + *v3 + Rect.top * v3[1]),\r\n\t\t\t    *(DWORD *)(v4 + 4),\r\n\t\t\t    *(DWORD *)(v4 + 8),\r\n\t\t\t    *(DWORD *)(v4 + 4),\r\n\t\t\t    v3[1],\r\n\t\t\t    0,\r\n\t\t\t    0xCC0020u);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x1000680A\r\nvoid __fastcall Doom_ParseWndProc2(HWND hWnd, int *msgtbl, int nFont, int a4)\r\n{\r\n\tHWND msg; // eax\r\n\r\n\twhile (*msgtbl) {\r\n\t\tmsg = GetDlgItem(hWnd, *msgtbl);\r\n\t\tDoom_GetSetWndTxt2(hWnd, (int)msg, nFont, a4);\r\n\t\t++msgtbl;\r\n\t}\r\n}\r\n\r\n// ref: 0x10006839\r\nvoid __fastcall Doom_GetSetWndTxt2(HWND hWnd, int msg, int nFont, int a4)\r\n{\r\n\tHWND v4;          // esi\r\n\tint v5;           // eax\r\n\tchar String[256]; // [esp+4h] [ebp-100h]\r\n\r\n\tv4 = (HWND)msg;\r\n\tif (msg) {\r\n\t\tDoom_GetWindowROP3(hWnd, (HWND)msg);\r\n\t\tartfont_SetArtFont(nFont);\r\n\t\tDoom_PrintStrWithSpin(v4, a4);\r\n\t\tGetWindowTextA(v4, String, 255);\r\n\t\tif (strlen(String)) {\r\n\t\t\tv5 = GetWindowLongA(v4, -21);\r\n\t\t\tlocal_SetWndLongStr(v5, String);\r\n\t\t\tSetWindowTextA(v4, &nullcharacter);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x100068AB\r\nvoid __fastcall Doom_ParseWndProc3(HWND hWnd, int *msgtbl, int nFont)\r\n{\r\n\tHWND msg; // eax\r\n\r\n\twhile (*msgtbl) {\r\n\t\tmsg = GetDlgItem(hWnd, *msgtbl);\r\n\t\tDoom_GetSetWndTxt3(hWnd, (int)msg, nFont);\r\n\t\t++msgtbl;\r\n\t}\r\n}\r\n\r\n// ref: 0x100068D6\r\nvoid __fastcall Doom_GetSetWndTxt3(HWND hWnd, int msg, int nFont)\r\n{\r\n\tHWND v3;          // esi\r\n\tHWND v4;          // edi\r\n\tint v5;           // eax\r\n\tint v6;           // eax\r\n\tchar String[256]; // [esp+8h] [ebp-100h]\r\n\r\n\tv3 = (HWND)msg;\r\n\tv4 = hWnd;\r\n\tif (msg) {\r\n\t\tDoom_AllocAndSetBMP(hWnd, msg, 1);\r\n\t\tDoom_GetWindowROP3(v4, v3);\r\n\t\tartfont_SetArtFont(nFont);\r\n\t\tv5 = GetWindowLongA(v3, -16);\r\n\t\tDoom_PrintStrWithSpn2(v3, v5);\r\n\t\tGetWindowTextA(v3, String, 255);\r\n\t\tif (strlen(String)) {\r\n\t\t\tv6 = GetWindowLongA(v3, -21);\r\n\t\t\tlocal_SetWndLongStr(v6, String);\r\n\t\t\tSetWindowTextA(v3, &nullcharacter);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x1000695D\r\nvoid __fastcall Doom_PrintStrWithSpn2(HWND hWnd, int justify_type)\r\n{\r\n\tDWORD *v2;       // eax\r\n\tDWORD *v3;       // esi\r\n\tchar *v4;         // edi\r\n\tint v5;           // eax\r\n\tchar String[256]; // [esp+4h] [ebp-108h]\r\n\r\n\tv2 = (DWORD *)GetWindowLongA(hWnd, -21);\r\n\tv3 = v2;\r\n\tif (v2 && *v2) {\r\n\t\tGetWindowTextA(hWnd, String, 255);\r\n\t\tv4 = String;\r\n\t\tif (!strlen(String))\r\n\t\t\tv4 = (char *)(v3 + 4);\r\n\t\tif (justify_type & 2) {\r\n\t\t\tv5 = v3[1] - artfont_GetFontWidth(v4) - 1;\r\n\t\t} else if (justify_type & 1) {\r\n\t\t\tv5 = (v3[1] - artfont_GetFontWidth(v4) - 1) / 2;\r\n\t\t} else {\r\n\t\t\tv5 = 0;\r\n\t\t}\r\n\t\tartfont_PrintFontStr(v4, (DWORD **)v3, v5, 0);\r\n\t\tInvalidateRect(hWnd, 0, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x10006A13\r\nvoid __fastcall Doom_ParseWndProc4(HWND hWnd, int *msgtbl, int nFont)\r\n{\r\n\tHWND msg; // eax\r\n\r\n\twhile (*msgtbl) {\r\n\t\tmsg = GetDlgItem(hWnd, *msgtbl);\r\n\t\tDoom_GetSetWndTxt4(hWnd, (int)msg, nFont);\r\n\t\t++msgtbl;\r\n\t}\r\n}\r\n\r\n// ref: 0x10006A3E\r\nvoid __fastcall Doom_GetSetWndTxt4(HWND hWnd, int msg, int nFont)\r\n{\r\n\tHWND v3;          // edi\r\n\tint v4;           // eax\r\n\tint v5;           // eax\r\n\tchar String[256]; // [esp+8h] [ebp-100h]\r\n\r\n\tv3 = (HWND)msg;\r\n\tif (msg) {\r\n\t\tDoom_GetWindowROP3(hWnd, (HWND)msg);\r\n\t\tartfont_SetArtFont(nFont);\r\n\t\tv4 = GetWindowLongA(v3, -16);\r\n\t\tDoom_PrintStrWithSpn2(v3, v4);\r\n\t\tGetWindowTextA(v3, String, 255);\r\n\t\tif (strlen(String)) {\r\n\t\t\tv5 = GetWindowLongA(v3, -21);\r\n\t\t\tlocal_SetWndLongStr(v5, String);\r\n\t\t\tSetWindowTextA(v3, &nullcharacter);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x10006AB8\r\nvoid __fastcall Doom_ParseWndProc5(HWND hWnd, int *msgtbl, int nFont)\r\n{\r\n\tHWND msg; // eax\r\n\r\n\twhile (*msgtbl) {\r\n\t\tmsg = GetDlgItem(hWnd, *msgtbl);\r\n\t\tDoom_GetSetWndTxt5(hWnd, (int)msg, nFont);\r\n\t\t++msgtbl;\r\n\t}\r\n}\r\n\r\n// ref: 0x10006AE3\r\nvoid __fastcall Doom_GetSetWndTxt5(HWND hWnd, int msg, int nFont)\r\n{\r\n\tHWND v3; // esi\r\n\r\n\tv3 = (HWND)msg;\r\n\tif (msg) {\r\n\t\tDoom_AllocAndSetBMP(hWnd, msg, 1);\r\n\t\tDoom_GetWindowROP3(hWnd, v3);\r\n\t\tartfont_SetArtFont(nFont);\r\n\t\tDoom_PrintTextMsg403(v3);\r\n\t}\r\n}\r\n\r\n// ref: 0x10006B12\r\nvoid __fastcall Doom_PrintTextMsg403(HWND hWnd)\r\n{\r\n\tBYTE *v2; // eax\r\n\tint v3;   // edi\r\n\tint v4;   // edi\r\n\tint v5;   // esi\r\n\tint v6;   // esi\r\n\tchar *i;  // ebx\r\n\tint v8;   // eax\r\n\t//char v9; // [esp+3h] [ebp-11Dh]\r\n\tchar String[256];    // [esp+4h] [ebp-11Ch]\r\n\tstruct tagRECT Rect; // [esp+104h] [ebp-1Ch]\r\n\tLRESULT v12;         // [esp+114h] [ebp-Ch]\r\n\tBYTE *pWidthBin;     // [esp+118h] [ebp-8h]\r\n\tsize_t v14;          // [esp+11Ch] [ebp-4h]\r\n\r\n\tv2        = (BYTE *)GetWindowLongA(hWnd, -21);\r\n\tpWidthBin = v2;\r\n\tif (v2 && *(DWORD *)v2) {\r\n\t\tGetWindowTextA(hWnd, String, 255);\r\n\t\tv14 = strlen(String);\r\n\t\tv3  = Focus_GetSpinWidthOrZero();\r\n\t\tv4  = artfont_GetFontDefWidth() + v3;\r\n\t\tGetClientRect(hWnd, &Rect);\r\n\t\tv5  = Focus_GetSpinWidthOrZero();\r\n\t\tv6  = Rect.right - 2 * (artfont_GetFontDefWidth() + v5);\r\n\t\tv12 = SendMessageA(hWnd, 0x403u, 0, 0);\r\n\t\tif (v12 == 1)\r\n\t\t\tString[v14 - 1] = 0; // *(&v9 + v14) = 0;\r\n\t\tfor (i = String; *i; ++i) {\r\n\t\t\tif (artfont_GetFontWidth(i) <= v6)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (v12)\r\n\t\t\tString[v14 - 1] = 124; // *(&v9 + v14) = 124;\r\n\t\tv8                  = artfont_GetFontMaxHeight();\r\n\t\tartfont_PrintFontStr(i, (DWORD **)pWidthBin, v4, (*((DWORD *)pWidthBin + 2) - v8) / 2);\r\n\t}\r\n}\r\n\r\n// ref: 0x10006C08\r\nvoid __fastcall Doom_ParseWndProc6(HWND hWnd, int *msgtbl, int nFont)\r\n{\r\n\tHWND msg; // eax\r\n\r\n\twhile (*msgtbl) {\r\n\t\tmsg = GetDlgItem(hWnd, *msgtbl);\r\n\t\tDoom_GetSetWndTxt6(hWnd, (int)msg, nFont);\r\n\t\t++msgtbl;\r\n\t}\r\n}\r\n\r\n// ref: 0x10006C33\r\nvoid __fastcall Doom_GetSetWndTxt6(HWND hWnd, int msg, int nFont)\r\n{\r\n\tHWND v3; // esi\r\n\r\n\tv3 = (HWND)msg;\r\n\tif (msg) {\r\n\t\tDoom_GetWindowROP3(hWnd, (HWND)msg);\r\n\t\tartfont_SetArtFont(nFont);\r\n\t\tDoom_PrintTextMsg403(v3);\r\n\t}\r\n}\r\n\r\n// ref: 0x10006C53\r\nvoid __fastcall Doom_DeleteFreeProcs(HWND hWnd, int *msgtbl)\r\n{\r\n\tint i;     // eax\r\n\tHWND v5;   // eax MAPDST\r\n\tvoid **v7; // eax\r\n\r\n\tfor (i = *msgtbl; *msgtbl; i = *msgtbl) {\r\n\t\tv5 = GetDlgItem(hWnd, i);\r\n\t\tif (v5) {\r\n\t\t\tv7 = (void **)GetWindowLongA(v5, -21);\r\n\t\t\tlocal_FreeMemPtr(v7);\r\n\t\t\tSetWindowLongA(v5, -21, 0);\r\n\t\t}\r\n\t\t++msgtbl;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "DiabloUI/entdial.cpp",
    "content": "// ref: 0x10006C96\r\nint __stdcall EntDial_10006C96(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tint v4; // edx\r\n\tHWND v5; // eax\r\n\tHWND v7; // eax\r\n\tint savedregs; // [esp+Ch] [ebp+0h]\r\n\r\n\tv4 = 2;\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tEntDial_10006D78(hDlg);\r\n\t}\r\n\telse if ( Msg > 0x103 )\r\n\t{\r\n\t\tif ( Msg <= 0x105 )\r\n\t\t{\r\n\t\t\tv7 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\tSendMessageA(v7, Msg, wParam, lParam);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif ( Msg == 272 )\r\n\t\t\t{\r\n\t\t\t\tlpString = (LPSTR)lParam;\r\n\t\t\t\tEntDial_10006DB8(hDlg, (int)&savedregs);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( Msg != 273 )\r\n\t\t\t{\r\n\t\t\t\tif ( Msg != 275 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( Msg == 513 )\r\n\t\t\t\t\t\tEntDial_10006F16(hDlg, (unsigned short)lParam, (unsigned int)lParam >> 16);\r\n\t\t\t\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t\t\t\t}\r\n\t\t\t\tv5 = GetFocus();\r\n\t\t\t\tFocus_100075DC(hDlg, v5);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( (unsigned short)wParam == 1 )\r\n\t\t\t{\r\n\t\t\t\tv4 = 1;\r\n\t\t\t}\r\n\t\t\telse if ( (unsigned short)wParam != 2 )\r\n\t\t\t{\r\n\t\t\t\tif ( (unsigned short)wParam == 1116 )\r\n\t\t\t\t\tEntDial_10006EE8(hDlg, wParam, lParam);\r\n\t\t\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t\t\t}\r\n\t\t\tEntDial_10006EA7(hDlg, v4);\r\n\t\t}\r\n\t}\r\n\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10006D78\r\nHWND UNKCALL EntDial_10006D78(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tFocus_100076C3();\r\n\tDoom_10006C53(v1, (int *)&unk_10022B10);\r\n\tDoom_10006C53(v1, (int *)&unk_10022B04);\r\n\tDoom_10006C53(v1, (int *)&unk_10022AFC);\r\n\tv2 = GetParent(v1);\r\n\treturn Modem_10008563(v2, 0, 0);\r\n} */\r\n\r\n// ref: 0x10006DB8\r\nHWND USERCALL EntDial_10006DB8(HWND hWnd, int a2) { return 0; }\r\n/* {\r\n\tHWND v2; // esi\r\n\tHWND v3; // eax\r\n\tLONG v4; // eax\r\n\tHWND v5; // ebx\r\n\tHWND v6; // eax\r\n\tint v8; // [esp-138h] [ebp-144h]\r\n\tint v9; // [esp-38h] [ebp-44h]\r\n\tint v10; // [esp+8h] [ebp-4h]\r\n\r\n\tv2 = hWnd;\r\n\tv3 = GetParent(hWnd);\r\n\tv4 = GetWindowLongA(v3, -21);\r\n\tSetWindowLongA(v2, -21, v4);\r\n\tDoom_100068AB(v2, (int *)&unk_10022AFC, 5);\r\n\tDoom_1000658C(v2, (int *)&unk_10022B04, 4, 0);\r\n\tDoom_10006AB8(v2, (int *)&unk_10022B10, 2);\r\n\tFocus_10007719(\"ui_art\\\\focus.pcx\");\r\n\tSDlgSetTimer(v2, 1, 55, 0);\r\n\tv5 = GetDlgItem(v2, 1116);\r\n\tSendMessageA(v5, 0x401u, 0x1Fu, 0);\r\n\tSendMessageA(v5, 0x404u, 0, (LPARAM)\"<>%&?\");\r\n\tv10 = a2;\r\n\tLoadStringA(hInstance, 0x3Bu, (LPSTR)&v9, 63);\r\n\tLoadStringA(hInstance, 0x3Au, (LPSTR)&v8, 255);\r\n\tv6 = GetParent(v2);\r\n\treturn Modem_10008563(v6, (const char *)&v9, (int)&v8);\r\n} */\r\n// 10006DB8: could not find valid save-restore pair for ebp\r\n// 10010412: using guessed type int __stdcall SDlgSetTimer(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10006EA7\r\nint __fastcall EntDial_10006EA7(HWND hDlg, int a2) { return 0; }\r\n/* {\r\n\tint v2; // edi\r\n\tHWND v3; // esi\r\n\tCHAR *v4; // ST08_4\r\n\tHWND v5; // eax\r\n\r\n\tv2 = a2;\r\n\tv3 = hDlg;\r\n\tTitleSnd_1001031F();\r\n\tSDlgKillTimer(v3, 1);\r\n\tv4 = lpString;\r\n\tv5 = GetDlgItem(v3, 1116);\r\n\tGetWindowTextA(v5, v4, 32);\r\n\tlpString[31] = 0;\r\n\treturn SDlgEndDialog(v3, v2);\r\n} */\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n// 10010418: using guessed type int __stdcall SDlgKillTimer(DWORD, DWORD);\r\n\r\n// ref: 0x10006EE8\r\nvoid __fastcall EntDial_10006EE8(HWND hWnd, unsigned int a2, int a3) { return; }\r\n/* {\r\n\tint v3; // edx\r\n\tHWND v4; // esi\r\n\tHWND v5; // eax\r\n\r\n\tv3 = (a2 >> 16) - 1;\r\n\tv4 = hWnd;\r\n\tif ( v3 )\r\n\t{\r\n\t\tif ( v3 == 2 )\r\n\t\t\tDoom_10006C08(hWnd, (int *)&unk_10022B10, 2);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv5 = GetFocus();\r\n\t\tFocus_100075DC(v4, v5);\r\n\t}\r\n} */\r\n\r\n// ref: 0x10006F16\r\nint __fastcall EntDial_10006F16(HWND hDlg, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // ebx\r\n\tHWND v4; // esi\r\n\tint v5; // ST08_4\r\n\tHWND v6; // eax\r\n\tint v7; // edx\r\n\tHWND v8; // eax\r\n\tint result; // eax\r\n\r\n\tv3 = a2;\r\n\tv4 = hDlg;\r\n\tv5 = a2;\r\n\tv6 = GetDlgItem(hDlg, 1056);\r\n\tif ( local_10007C3B(v4, v6, v5, a3) )\r\n\t{\r\n\t\tv7 = 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv8 = GetDlgItem(v4, 1054);\r\n\t\tresult = local_10007C3B(v4, v8, v3, a3);\r\n\t\tif ( !result )\r\n\t\t\treturn result;\r\n\t\tv7 = 2;\r\n\t}\r\n\treturn EntDial_10006EA7(v4, v7);\r\n} */\r\n\r\n// ref: 0x10006F71\r\nsigned int EntDial_10006F71() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002985C = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002985C: using guessed type int dword_1002985C;\r\n"
  },
  {
    "path": "DiabloUI/entname.cpp",
    "content": "// ref: 0x10006F7C\r\nLRESULT __stdcall EntName_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tint v4;  // edx\r\n\tHWND v5; // eax\r\n\tHWND v6; // eax\r\n\tHWND v7; // eax\r\n\tHWND v9; // eax\r\n\r\n\tv4 = 2;\r\n\tif (Msg == 2) {\r\n\t\tEntName_DelEntNameMsgs(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg <= 0x103)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tif (Msg <= 0x105) {\r\n\t\tv9 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v9, Msg, wParam, lParam);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tswitch (Msg) {\r\n\tcase 0x110u:\r\n\t\tentname_charname = (char *)lParam;\r\n\t\tEntName_LoadFocusChkName(hWnd);\r\n\t\treturn 0;\r\n\tcase 0x111u:\r\n\t\tif ((unsigned short)wParam != 1) {\r\n\t\t\tif ((unsigned short)wParam != 2) {\r\n\t\t\t\tif ((unsigned short)wParam == 1065)\r\n\t\t\t\t\tEntName_GetMessageName(hWnd, wParam, lParam);\r\n\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t}\r\n\t\t\tgoto LABEL_11;\r\n\t\t}\r\n\t\tgoto LABEL_18;\r\n\tcase 0x113u:\r\n\t\tv7 = GetFocus();\r\n\t\tFocus_DoBlitSpinIncFrame(hWnd, v7);\r\n\t\treturn 0;\r\n\t}\r\n\tif (Msg != 513)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tv5 = GetDlgItem(hWnd, 1056);\r\n\tif (local_GetBottomRect(hWnd, v5, (unsigned short)lParam, (unsigned int)lParam >> 16)) {\r\n\tLABEL_18:\r\n\t\tv4 = 1;\r\n\t\tgoto LABEL_11;\r\n\t}\r\n\tv6 = GetDlgItem(hWnd, 1054);\r\n\tif (local_GetBottomRect(hWnd, v6, (unsigned short)lParam, (unsigned int)lParam >> 16)) {\r\n\t\tv4 = 2;\r\n\tLABEL_11:\r\n\t\tEntName_SetCharName(hWnd, v4);\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000709E\r\nvoid __fastcall EntName_DelEntNameMsgs(HWND hWnd)\r\n{\r\n\tHWND v2; // eax\r\n\r\n\tFocus_DeleteSpinners();\r\n\tDoom_DeleteFreeProcs(hWnd, entname_msgtbl3);\r\n\tDoom_DeleteFreeProcs(hWnd, entname_msgtbl2);\r\n\tDoom_DeleteFreeProcs(hWnd, entname_msgtbl1);\r\n\tv2 = GetParent(hWnd);\r\n\tSelHero_SetStringWithMsg(v2, 0);\r\n}\r\n\r\n// ref: 0x100070DB\r\nvoid __fastcall EntName_LoadFocusChkName(HWND hWnd)\r\n{\r\n\tHWND v2;         // edi\r\n\tLONG v3;         // eax\r\n\tHWND v4;         // ebx\r\n\tchar Buffer[32]; // [esp+Ch] [ebp-20h]\r\n\r\n\tv2 = GetParent(hWnd);\r\n\tif (SelHero_GetHeroIsGood() == 1)\r\n\t\tLoadStringA(ghUiInst, 0x20u, Buffer, 31);\r\n\telse\r\n\t\tLoadStringA(ghUiInst, 0x1Fu, Buffer, 31);\r\n\tSelHero_SetStringWithMsg(v2, Buffer);\r\n\tv3 = GetWindowLongA(v2, -21);\r\n\tSetWindowLongA(hWnd, -21, v3);\r\n\tDoom_ParseWndProc3(hWnd, entname_msgtbl1, AF_BIGGRAY);\r\n\tDoom_ParseWndProcs(hWnd, entname_msgtbl2, AF_BIG, 0);\r\n\tDoom_ParseWndProc5(hWnd, entname_msgtbl3, AF_MED);\r\n\tFocus_LoadSpinner(\"ui_art\\\\focus.pcx\");\r\n\tSDlgSetTimer((int)hWnd, 1, 55, 0);\r\n\tv4 = GetDlgItem(hWnd, 1065);\r\n\tSendMessageA(v4, 0x401u, 0xFu, 0);\r\n\tif (SelHero_GetHeroIsGood() == 1)\r\n\t\tSendMessageA(v4, 0x404u, 0, (LPARAM) \" ,<>%&\\\\\\\"?*#/\");\r\n}\r\n\r\n// ref: 0x100071AC\r\nvoid __fastcall EntName_SetCharName(HWND hWnd, int a2)\r\n{\r\n\tchar *v4; // ST08_4\r\n\tHWND v5;  // eax\r\n\r\n\tTitleSnd_PlaySelectSound();\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tv4 = entname_charname;\r\n\tv5 = GetDlgItem(hWnd, 1065);\r\n\tGetWindowTextA(v5, v4, 16);\r\n\tentname_charname[15] = 0;\r\n\tSDlgEndDialog(hWnd, (HANDLE)a2);\r\n}\r\n\r\n// ref: 0x100071ED\r\nvoid __fastcall EntName_GetMessageName(HWND hWnd, unsigned int a2, int a3)\r\n{\r\n\tunsigned int v3; // edx\r\n\tHWND v5;         // eax\r\n\r\n\tv3 = (a2 >> 16) - 1;\r\n\tif (v3) {\r\n\t\tif (v3 == 2)\r\n\t\t\tDoom_ParseWndProc6(hWnd, entname_msgtbl3, AF_MED);\r\n\t} else {\r\n\t\tv5 = GetFocus();\r\n\t\tFocus_DoBlitSpinIncFrame(hWnd, v5);\r\n\t}\r\n}\r\n\r\n// ref: 0x10007220\r\nvoid __cdecl EntName_cpp_init()\r\n{\r\n\tEntName_cpp_float = EntName_cpp_float_value;\r\n}\r\n// 1001F424: using guessed type int EntName_cpp_float_value;\r\n// 10029860: using guessed type int EntName_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/fade.cpp",
    "content": "// ref: 0x1000722B\r\nvoid __fastcall Fade_ApplyPaletteRange(int range1, int range2)\r\n{\r\n\ttagPALETTEENTRY *v4; // eax MAPDST\r\n\tBYTE *v6;            // esi\r\n\tBYTE v7;             // al\r\n\r\n\tv4 = local_GetArtPalEntry(0);\r\n\tif (range1 == range2) {\r\n\t\tmemcpy(fadepal, v4, 0x400u);\r\n\t} else if (range2) {\r\n\t\tv6 = &fadepal[0].peGreen;\r\n\t\tdo {\r\n\t\t\tv7 = range2 * v4->peRed / range1;\r\n\t\t\t++v4;\r\n\t\t\t*(v6 - 1) = v7;\r\n\t\t\t*v6       = range2 * v4[-1].peGreen / range1;\r\n\t\t\tv6 += 4;\r\n\t\t\t*(v6 - 3) = range2 * v4[-1].peBlue / range1;\r\n\t\t} while ((signed int)v6 < (signed int)&fadepal[256].peGreen);\r\n\t} else {\r\n\t\tmemcpy(fadepal, v4, 0x400u);\r\n\t\tlocal_ClearPalette(fadepal);\r\n\t}\r\n\tSDrawUpdatePalette(0, 0x100u, fadepal, 1);\r\n}\r\n\r\n// ref: 0x100072BE\r\nvoid __fastcall Fade_UpdatePaletteRange(int range)\r\n{\r\n\ttagPALETTEENTRY *v2; // eax\r\n\ttagPALETTEENTRY *v3; // edi\r\n\tBYTE *v4;            // ecx\r\n\tBYTE v5;             // al\r\n\tHPALETTE v6;         // ebx\r\n\tint v7;              // [esp+10h] [ebp-4h]\r\n\r\n\tv2 = local_GetArtPalEntry(0);\r\n\tmemcpy(fadepal, v2, 0x400u);\r\n\tif (range > 0) {\r\n\t\tv7 = range;\r\n\t\tdo {\r\n\t\t\tv3 = local_GetArtPalEntry(0);\r\n\t\t\tv4 = &fadepal[0].peGreen;\r\n\t\t\tdo {\r\n\t\t\t\tv5 = v3->peRed / range;\r\n\t\t\t\t++v3;\r\n\t\t\t\t*(v4 - 1) -= v5;\r\n\t\t\t\t*v4 -= v3[-1].peGreen / range;\r\n\t\t\t\tv4 += 4;\r\n\t\t\t\t*(v4 - 3) -= v3[-1].peBlue / range;\r\n\t\t\t} while ((signed int)v4 < (signed int)&fadepal[256].peGreen);\r\n\t\t\tSDrawUpdatePalette(0, 0x100u, fadepal, 1);\r\n\t\t\t--v7;\r\n\t\t} while (v7);\r\n\t}\r\n\tlocal_ClearPalette(fadepal);\r\n\tSDrawUpdatePalette(0, 0x100u, fadepal, 1);\r\n\tlocal_SetCursorDefault();\r\n\tSDrawClearSurface(0);\r\n\tv6 = (HPALETTE)GetStockObject(15);\r\n\tGetPaletteEntries(v6, 0, 0xAu, fadepal);\r\n\tGetPaletteEntries(v6, 0xAu, 0xAu, &fadepal[246]);\r\n\tSDrawUpdatePalette(0, 0x100u, fadepal, 1);\r\n}\r\n// 1001043C: using guessed type int __stdcall SDrawClearSurface(DWORD);\r\n\r\n// ref: 0x1000739F\r\nBOOL __cdecl Fade_CheckRange5()\r\n{\r\n\tBOOL result; // eax\r\n\r\n\tresult = 0;\r\n\tif (sgbIsFading) {\r\n\t\tif (sgbFadeRange <= 5)\r\n\t\t\tresult = 1;\r\n\t}\r\n\treturn result;\r\n}\r\n// 10029C70: using guessed type int sgbIsFading;\r\n\r\n// ref: 0x100073B4\r\nvoid __cdecl Fade_Range5SetZero()\r\n{\r\n\tif (Fade_CheckRange5())\r\n\t\tsgbIsFading = 0;\r\n}\r\n// 10029C70: using guessed type int sgbIsFading;\r\n\r\n// ref: 0x100073C5\r\nvoid __fastcall Fade_NoInputAndArt(HWND hWnd, BOOL bShowCurs)\r\n{\r\n\tHWND v3; // eax\r\n\r\n\tv3 = GetParent(hWnd);\r\n\tlocal_DisableKeyWaitMouse(v3);\r\n\tif (bShowCurs)\r\n\t\tlocal_SetCursorArt();\r\n\tsgbIsFading  = 0;\r\n\tsgbFadeRange = 0;\r\n}\r\n// 10029C70: using guessed type int sgbIsFading;\r\n\r\n// ref: 0x100073EF\r\nvoid __fastcall Fade_SetInputWindow(HWND hWnd)\r\n{\r\n\tHWND v1; // eax\r\n\r\n\tv1 = GetParent(hWnd);\r\n\tlocal_DisableKeyWaitMouse(v1);\r\n}\r\n\r\n// ref: 0x100073FD\r\nvoid __fastcall Fade_SetFadeTimer(int nTime)\r\n{\r\n\tif (!sgbIsFading) {\r\n\t\tSDlgSetTimer(nTime, 16, 50, Fade_TimerFunctionDlg);\r\n\t\tsgbIsFading = 1;\r\n\t}\r\n}\r\n// 10029C70: using guessed type int sgbIsFading;\r\n\r\n// ref: 0x10007420\r\nvoid __stdcall Fade_TimerFunctionDlg(int a1, int a2, int a3, int a4)\r\n{\r\n\tif (sgbFadeRange > 5) {\r\n\t\tSDlgKillTimer(a1, 16);\r\n\t} else {\r\n\t\tFade_ApplyPaletteRange(5, sgbFadeRange);\r\n\t\t++sgbFadeRange;\r\n\t}\r\n}\r\n\r\n// ref: 0x1000744D\r\nvoid __cdecl Fade_cpp_init()\r\n{\r\n\tfade_cpp_float = fade_cpp_float_value;\r\n}\r\n// 1001F428: using guessed type int fade_cpp_float_value;\r\n// 10029868: using guessed type int fade_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/focus.cpp",
    "content": "// ref: 0x10007458\r\nvoid __fastcall Focus_CheckPlayMove(LPARAM lParam)\r\n{\r\n\tif (sgbSpinnersLoaded && lParam != dword_10029CA8) {\r\n\t\tif (dword_10029CAC)\r\n\t\t\tTitleSnd_PlayMoveSound();\r\n\t\tdword_10029CA8 = lParam;\r\n\t}\r\n}\r\n// 10029CA4: using guessed type int sgbSpinnersLoaded;\r\n// 10029CA8: using guessed type int dword_10029CA8;\r\n// 10029CAC: using guessed type int dword_10029CAC;\r\n\r\n// ref: 0x10007482\r\nint __cdecl Focus_GetSpinWidthOrZero()\r\n{\r\n\treturn sgbSpinnersLoaded != 0 ? focus_spin_width : 0;\r\n}\r\n// 10029CA4: using guessed type int sgbSpinnersLoaded;\r\n\r\n// ref: 0x10007492\r\nvoid __fastcall Focus_BlitSpinner(HWND hWnd1, HWND hWnd2)\r\n{\r\n\tDWORD *v2;          // edi\r\n\tLONG v3;             // eax MAPDST\r\n\tint v5;              // eax MAPDST\r\n\tint v7;              // eax\r\n\tstruct tagRECT Rect; // [esp+8h] [ebp-18h]\r\n\tchar *v9;            // [esp+18h] [ebp-8h]\r\n\r\n\tv9 = (char *)hWnd1;\r\n\tv2 = (DWORD *)GetWindowLongA(hWnd1, -21);\r\n\tv3 = GetWindowLongA(hWnd2, -21);\r\n\tif (v2 && v3 && *v2) {\r\n\t\tif (*(DWORD *)v3) {\r\n\t\t\tGetWindowRect(hWnd2, &Rect);\r\n\t\t\tScreenToClient((HWND)v9, (LPPOINT)&Rect);\r\n\t\t\tScreenToClient((HWND)v9, (LPPOINT)&Rect.right);\r\n\t\t\tSBltROP3(\r\n\t\t\t    *(void **)v3,\r\n\t\t\t    (void *)(Rect.left + *v2 + Rect.top * v2[1]),\r\n\t\t\t    focus_spin_width,\r\n\t\t\t    *(DWORD *)(v3 + 8),\r\n\t\t\t    *(DWORD *)(v3 + 4),\r\n\t\t\t    v2[1],\r\n\t\t\t    0,\r\n\t\t\t    0xCC0020u);\r\n\t\t\tv5 = v2[1];\r\n\t\t\tv7 = *v2 + Rect.top * v5;\r\n\t\t\tv9 = *(char **)(v3 + 4);\r\n\t\t\tSBltROP3(\r\n\t\t\t    &v9[*(DWORD *)v3 - focus_spin_width],\r\n\t\t\t    &v9[v7 - focus_spin_width + Rect.left],\r\n\t\t\t    focus_spin_width,\r\n\t\t\t    *(DWORD *)(v3 + 8),\r\n\t\t\t    (int)v9,\r\n\t\t\t    v5,\r\n\t\t\t    0,\r\n\t\t\t    0xCC0020u);\r\n\t\t\tFocus_CenterSpinFromSide(hWnd2);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x10007566\r\nvoid __fastcall Focus_CenterSpinFromSide(HWND hWnd)\r\n{\r\n\tstruct tagRECT Rect; // [esp+8h] [ebp-10h]\r\n\r\n\tGetClientRect(hWnd, &Rect);\r\n\t--Rect.bottom;\r\n\tRect.left = --Rect.right - focus_spin_width;\r\n\tInvalidateRect(hWnd, &Rect, 0);\r\n\tRect.left  = 0;\r\n\tRect.right = focus_spin_width - 1;\r\n\tInvalidateRect(hWnd, &Rect, 0);\r\n}\r\n\r\n// ref: 0x100075B7\r\nvoid __fastcall Focus_GetAndBlitSpin(HWND hWnd, LPARAM lParam)\r\n{\r\n\tHWND v2; // esi\r\n\r\n\tv2 = (HWND)lParam;\r\n\tGetWindowLongA((HWND)lParam, -12);\r\n\tFocus_BlitSpinner(hWnd, v2);\r\n\tdword_10029CAC = 1;\r\n}\r\n// 10029CAC: using guessed type int dword_10029CAC;\r\n\r\n// ref: 0x100075DC\r\nBOOL __fastcall Focus_DoBlitSpinIncFrame(HWND hWnd1, HWND hWnd2)\r\n{\r\n\tvoid **v4;           // eax\r\n\tvoid **v5;           // esi\r\n\tint v7;              // edi\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-14h]\r\n\r\n\tif (!sgbSpinnersLoaded)\r\n\t\treturn 0;\r\n\tif (!hWnd2)\r\n\t\treturn 0;\r\n\tGetWindowLongA(hWnd2, -12);\r\n\tif (hWnd1 != GetParent(hWnd2))\r\n\t\treturn 0;\r\n\tFocus_BlitSpinner(hWnd1, hWnd2);\r\n\tv4 = (void **)GetWindowLongA(hWnd2, -21);\r\n\tv5 = v4;\r\n\tif (!v4 || !*v4)\r\n\t\treturn 0;\r\n\tGetWindowRect(hWnd2, &Rect);\r\n\tScreenToClient(hWnd1, (LPPOINT)&Rect);\r\n\tScreenToClient(hWnd1, (LPPOINT)&Rect.right);\r\n\tif (SpinnerTransOut[sgnSpinnerFrame]) {\r\n\t\tv7 = ((signed int)v5[2] - focus_spin_height) / 2;\r\n\t\tSTransBlt(*v5, 0, v7, (int)v5[1], SpinnerTransOut[sgnSpinnerFrame]);\r\n\t\tSTransBlt(*v5, (int)v5[1] - focus_spin_width, v7, (int)v5[1], SpinnerTransOut[sgnSpinnerFrame]);\r\n\t\tFocus_CenterSpinFromSide(hWnd2);\r\n\t}\r\n\tif (++sgnSpinnerFrame >= 8)\r\n\t\tsgnSpinnerFrame = 0;\r\n\treturn 1;\r\n}\r\n// 10029C9C: using guessed type int focus_spin_height;\r\n// 10029CA4: using guessed type int sgbSpinnersLoaded;\r\n// 10029CB0: using guessed type int sgnSpinnerFrame;\r\n\r\n// ref: 0x100076C3\r\nvoid __cdecl Focus_DeleteSpinners()\r\n{\r\n\tHANDLE *v0; // esi\r\n\r\n\tv0 = SpinnerTransOut;\r\n\tdo {\r\n\t\tif (*v0) {\r\n\t\t\tSTransDelete(*v0);\r\n\t\t\t*v0 = 0;\r\n\t\t}\r\n\t\t++v0;\r\n\t} while ((signed int)v0 < (signed int)&SpinnerTransOut[8]);\r\n\tdword_10029CAC    = 0;\r\n\tdword_10029CA8    = 0;\r\n\tsgbSpinnersLoaded = 0;\r\n}\r\n// 10029CA4: using guessed type int sgbSpinnersLoaded;\r\n// 10029CA8: using guessed type int dword_10029CA8;\r\n// 10029CAC: using guessed type int dword_10029CAC;\r\n\r\n// ref: 0x100076FA\r\nvoid __cdecl Focus_ResetSpinToZero()\r\n{\r\n\tdword_10029CAC = 0;\r\n\tdword_10029CA8 = 0;\r\n}\r\n// 10029CA8: using guessed type int dword_10029CA8;\r\n// 10029CAC: using guessed type int dword_10029CAC;\r\n\r\n// ref: 0x1000770E\r\nvoid __cdecl Focus_cpp_init()\r\n{\r\n\tfocus_cpp_float = focus_cpp_float_value;\r\n}\r\n// 1001F42C: using guessed type int focus_cpp_float_value;\r\n// 10029CA0: using guessed type int focus_cpp_float;\r\n\r\n// ref: 0x10007719\r\nvoid __fastcall Focus_LoadSpinner(const char *pszFileName)\r\n{\r\n\tHANDLE *v1;    // esi\r\n\tint v2;        // ecx\r\n\tint v3;        // eax\r\n\tint v4;        // ebx\r\n\tint a5[4];     // [esp+4h] [ebp-1Ch]\r\n\tDWORD data[2]; // [esp+14h] [ebp-Ch]\r\n\tBYTE *pBuffer; // [esp+1Ch] [ebp-4h]\r\n\r\n\tif (!sgbSpinnersLoaded) {\r\n\t\tpBuffer        = 0;\r\n\t\tdword_10029CAC = 0;\r\n\t\tdword_10029CA8 = 0;\r\n\t\tlocal_LoadArtImage(pszFileName, &pBuffer, data);\r\n\t\tv1 = SpinnerTransOut;\r\n\t\tmemset(SpinnerTransOut, 0, 0x20u);\r\n\t\tif (pBuffer) {\r\n\t\t\tv2                = data[0];\r\n\t\t\tfocus_spin_width  = data[0];\r\n\t\t\tv3                = (signed int)data[1] / 8;\r\n\t\t\tv4                = 0;\r\n\t\t\tfocus_spin_height = (signed int)data[1] / 8;\r\n\t\t\twhile (1) {\r\n\t\t\t\ta5[2] = v2 - 1;\r\n\t\t\t\ta5[1] = v4 * v3;\r\n\t\t\t\ta5[0] = 0;\r\n\t\t\t\ta5[3] = v3 + v4 * v3 - 1;\r\n\t\t\t\tSTransCreateI(pBuffer, v2, v3, 8, (int)a5, 16777466, v1);\r\n\t\t\t\t++v1;\r\n\t\t\t\t++v4;\r\n\t\t\t\tif ((signed int)v1 >= (signed int)&SpinnerTransOut[8])\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tv3 = focus_spin_height;\r\n\t\t\t\tv2 = focus_spin_width;\r\n\t\t\t}\r\n\t\t\tSMemFree(pBuffer, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Focus.cpp\", 246, 0);\r\n\t\t}\r\n\t\tsgnSpinnerFrame   = 0;\r\n\t\tsgbSpinnersLoaded = 1;\r\n\t}\r\n}\r\n// 10029C9C: using guessed type int focus_spin_height;\r\n// 10029CA4: using guessed type int sgbSpinnersLoaded;\r\n// 10029CA8: using guessed type int dword_10029CA8;\r\n// 10029CAC: using guessed type int dword_10029CAC;\r\n// 10029CB0: using guessed type int sgnSpinnerFrame;\r\n\r\n// ref: 0x100077E9\r\nvoid __fastcall Focus_SetFocusTimer(HWND hWnd, const char *pszFileName)\r\n{\r\n\tFocus_LoadSpinner(pszFileName);\r\n\tSDlgSetTimer((int)hWnd, 1, 55, Focus_SetFocusAndBlit);\r\n}\r\n\r\n// ref: 0x10007804\r\nvoid __stdcall Focus_SetFocusAndBlit(int hWnd, int a2, int a3, int a4)\r\n{\r\n\tHWND v1; // eax\r\n\r\n\tv1 = GetFocus();\r\n\tFocus_DoBlitSpinIncFrame((HWND)hWnd, v1);\r\n}\r\n\r\n// ref: 0x10007818\r\nvoid __fastcall Focus_KillFocusTimer(HWND hWnd)\r\n{\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tFocus_DeleteSpinners();\r\n}\r\n"
  },
  {
    "path": "DiabloUI/local.cpp",
    "content": "// ref: 0x10007825\r\nvoid __cdecl local_InitUiPalette()\r\n{\r\n\tLOGPALETTE *v0;   // eax MAPDST\r\n\tPALETTEENTRY *v2; // eax\r\n\tint v3;           // ecx\r\n\r\n\tv0 = (LOGPALETTE *)SMemAlloc(0x404u, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 27, 0);\r\n\tif (v0) {\r\n\t\tv0->palVersion    = 768;\r\n\t\tv0->palNumEntries = 256;\r\n\t\tv2                = v0->palPalEntry;\r\n\t\tv3                = 0;\r\n\t\tdo {\r\n\t\t\tv2[v3].peFlags = 2;\r\n\t\t\t++v3;\r\n\t\t} while (v3 < 256);\r\n\t\tobjPalette = CreatePalette(v0);\r\n\t\tSMemFree(v0, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 41, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000787D\r\nvoid __cdecl local_DelUiPalette()\r\n{\r\n\tif (objPalette) {\r\n\t\tDeleteObject(objPalette);\r\n\t\tobjPalette = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x10007895\r\ntagPALETTEENTRY *__fastcall local_GetArtPalEntry(int entry)\r\n{\r\n\treturn &artpal[entry];\r\n}\r\n\r\n// ref: 0x1000789D\r\nvoid __fastcall local_ClearPalette(PALETTEENTRY *pPal)\r\n{\r\n\tBYTE *v1;      // eax\r\n\tsigned int v2; // ecx\r\n\r\n\tv1 = &pPal->peBlue;\r\n\tv2 = 256;\r\n\tdo {\r\n\t\t*(v1 - 2) = 0;\r\n\t\t*(v1 - 1) = 0;\r\n\t\t*v1       = 0;\r\n\t\tv1 += 4;\r\n\t\t--v2;\r\n\t} while (v2);\r\n}\r\n\r\n// ref: 0x100078B6\r\nvoid __cdecl local_ClearSurface()\r\n{\r\n\tSDrawClearSurface(0);\r\n}\r\n// 1001043C: using guessed type int __stdcall SDrawClearSurface(DWORD);\r\n\r\n// ref: 0x100078BE\r\nBOOL __fastcall local_LoadArtImage(const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize)\r\n{\r\n\tBYTE *v4;       // eax\r\n\tDWORD v5;       // ecx\r\n\tDWORD dwHeight; // [esp+10h] [ebp-8h]\r\n\tDWORD dwWidth;  // [esp+14h] [ebp-4h]\r\n\r\n\t*pBuffer = 0;\r\n\tif (!SBmpLoadImage(pszFileName, 0, 0, 0, &dwWidth, &dwHeight, 0))\r\n\t\treturn 0;\r\n\tv4       = (BYTE *)SMemAlloc(dwHeight * dwWidth, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 93, 0);\r\n\tv5       = dwWidth;\r\n\t*pBuffer = v4;\r\n\tif (!SBmpLoadImage(pszFileName, 0, v4, dwHeight * v5, 0, 0, 0)) {\r\n\t\tSMemFree(*pBuffer, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 95, 0);\r\n\t\t*pBuffer = 0;\r\n\t\treturn 0;\r\n\t}\r\n\tif (pdwSize) {\r\n\t\t*pdwSize   = dwWidth;\r\n\t\tpdwSize[1] = dwHeight;\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10007944\r\nBOOL __fastcall local_LoadArtWithPal(HWND hWnd, int a2, char *src, int mask, int flags, const char *pszFileName, BYTE **pBuffer, DWORD *pdwSize, BOOL a9)\r\n{\r\n\tBYTE *v10;                        // eax\r\n\tDWORD v11;                        // ST18_4\r\n\tHPALETTE v13;                     // edi\r\n\ttagPALETTEENTRY pPalEntries[256]; // [esp+Ch] [ebp-40Ch]\r\n\tDWORD pdwWidth;                   // [esp+410h] [ebp-8h]\r\n\tDWORD dwHeight;                   // [esp+414h] [ebp-4h]\r\n\r\n\tif (!SBmpLoadImage(pszFileName, 0, 0, 0, &pdwWidth, &dwHeight, 0))\r\n\t\treturn 0;\r\n\tv10      = (BYTE *)SMemAlloc(dwHeight * pdwWidth, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 129, 0);\r\n\tv11      = dwHeight * pdwWidth;\r\n\t*pBuffer = v10;\r\n\tif (!SBmpLoadImage(pszFileName, pPalEntries, v10, v11, 0, 0, 0)\r\n\t    || !SDlgSetBitmapI(hWnd, a2, src, mask, flags, *pBuffer, 0, pdwWidth, dwHeight, -1)) {\r\n\t\treturn 0;\r\n\t}\r\n\tif (!src || !*src) {\r\n\t\tv13 = (HPALETTE)GetStockObject(15);\r\n\t\tGetPaletteEntries(v13, 0, 0xAu, pPalEntries);\r\n\t\tGetPaletteEntries(v13, 0xAu, 0xAu, &pPalEntries[246]);\r\n\t\tmemcpy(artpal, pPalEntries, 0x400u);\r\n\t\tif (a9) {\r\n\t\t\tSDrawUpdatePalette(0, 255, artpal, 1);\r\n\t\t} else {\r\n\t\t\tlocal_ClearPalette(pPalEntries);\r\n\t\t\tSDrawUpdatePalette(0, 256, pPalEntries, 1);\r\n\t\t}\r\n\t}\r\n\tif (pdwSize) {\r\n\t\t*pdwSize   = pdwWidth;\r\n\t\tpdwSize[1] = dwHeight;\r\n\t}\r\n\treturn 1;\r\n}\r\n// 100103FA: using guessed type int __stdcall SDrawUpdatePalette(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10007A68\r\nvoid __fastcall local_AdjustRectSize(tagRECT *pRect, int a2, int a3)\r\n{\r\n\tint v3; // eax\r\n\tint v4; // edx\r\n\r\n\tv3          = a2 - pRect->left;\r\n\tpRect->left = a2;\r\n\tpRect->right += v3 - 1;\r\n\tv4         = a3 - pRect->top;\r\n\tpRect->top = a3;\r\n\tpRect->bottom += v4 - 1;\r\n}\r\n\r\n// ref: 0x10007A85\r\nBOOL __fastcall local_SetStaticBmp(HWND hWnd, int nIDDlgItem, BYTE *pBuffer, DWORD *pdwSize)\r\n{\r\n\tHWND v4;             // edi\r\n\tHWND v5;             // ebx\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-10h]\r\n\r\n\tv4 = hWnd;\r\n\tv5 = GetDlgItem(hWnd, nIDDlgItem);\r\n\tGetWindowRect(v5, &Rect);\r\n\tScreenToClient(v4, (LPPOINT)&Rect);\r\n\tScreenToClient(v4, (LPPOINT)&Rect.right);\r\n\tSDlgSetBitmapI(v5, 0, \"Static\", -1, 1, pBuffer, (int)&Rect, *pdwSize, pdwSize[1], -1);\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x10007AEA\r\nvoid __cdecl local_cpp_init()\r\n{\r\n\tlocal_cpp_float = 0x7F800000;\r\n}\r\n// 10029CB8: using guessed type int local_cpp_float;\r\n\r\n// ref: 0x10007AF5\r\nBOOL __fastcall local_SetButtonBmp(HWND hWnd, int flags, int a7, void *pBuffer, DWORD *pdwSize)\r\n{\r\n\treturn SDlgSetBitmapI(hWnd, 0, \"Button\", -1, flags, pBuffer, a7, *pdwSize, pdwSize[1], -1);\r\n}\r\n\r\n// ref: 0x10007B1B\r\nvoid __fastcall local_FitButtonDlg(HWND hWnd, int *a2, void *pBuffer, DWORD *pdwSize)\r\n{\r\n\tint v4;              // eax\r\n\tHWND v5;             // esi\r\n\tstruct tagRECT Rect; // [esp+0h] [ebp-1Ch]\r\n\tint a3;              // [esp+14h] [ebp-8h]\r\n\tint *v9;             // [esp+18h] [ebp-4h]\r\n\r\n\tv4 = *a2;\r\n\ta3 = 0;\r\n\tv9 = a2;\r\n\tif (v4) {\r\n\t\tdo {\r\n\t\t\tv5 = GetDlgItem(hWnd, v4);\r\n\t\t\tif (v5) {\r\n\t\t\t\tGetClientRect(v5, &Rect);\r\n\t\t\t\tlocal_AdjustRectSize(&Rect, 0, a3);\r\n\t\t\t\tlocal_SetButtonBmp(v5, 16, (int)&Rect, pBuffer, pdwSize);\r\n\t\t\t\t++Rect.bottom;\r\n\t\t\t\t++Rect.right;\r\n\t\t\t\tlocal_AdjustRectSize(&Rect, 0, Rect.bottom);\r\n\t\t\t\tlocal_SetButtonBmp(v5, 64, (int)&Rect, pBuffer, pdwSize);\r\n\t\t\t\t++Rect.bottom;\r\n\t\t\t\t++Rect.right;\r\n\t\t\t\tlocal_AdjustRectSize(&Rect, 0, Rect.bottom);\r\n\t\t\t\tlocal_SetButtonBmp(v5, 32, (int)&Rect, pBuffer, pdwSize);\r\n\t\t\t\t++Rect.bottom;\r\n\t\t\t\t++Rect.right;\r\n\t\t\t\tlocal_AdjustRectSize(&Rect, 0, Rect.bottom);\r\n\t\t\t\tlocal_SetButtonBmp(v5, 128, (int)&Rect, pBuffer, pdwSize);\r\n\t\t\t\t++Rect.bottom;\r\n\t\t\t\t++Rect.right;\r\n\t\t\t\tlocal_AdjustRectSize(&Rect, 0, Rect.bottom);\r\n\t\t\t\tlocal_SetButtonBmp(v5, 1280, (int)&Rect, pBuffer, pdwSize);\r\n\t\t\t\t++Rect.bottom;\r\n\t\t\t\t++Rect.right;\r\n\t\t\t\ta3 = Rect.bottom;\r\n\t\t\t}\r\n\t\t\t++v9;\r\n\t\t\tv4 = *v9;\r\n\t\t} while (*v9);\r\n\t}\r\n}\r\n\r\n// ref: 0x10007C2E\r\nvoid __fastcall local_SetWhiteText(HDC hdc)\r\n{\r\n\tSetTextColor(hdc, 0xFFFFu);\r\n}\r\n\r\n// ref: 0x10007C3B\r\nBOOL __fastcall local_GetBottomRect(HWND hWnd1, HWND hWnd2, int width, int height)\r\n{\r\n\tBOOL result;         // eax\r\n\tstruct tagRECT Rect; // [esp+4h] [ebp-10h]\r\n\r\n\tif (hWnd1\r\n\t    && hWnd2\r\n\t    && (GetWindowRect(hWnd2, &Rect),\r\n\t           ScreenToClient(hWnd1, (LPPOINT)&Rect),\r\n\t           ScreenToClient(hWnd1, (LPPOINT)&Rect.right),\r\n\t           width >= Rect.left)\r\n\t    && width < Rect.right\r\n\t    && height >= Rect.top) {\r\n\t\tresult = height < Rect.bottom;\r\n\t} else {\r\n\t\tresult = 0;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10007C95\r\nvoid __fastcall local_DlgDoPaint(HWND hWnd)\r\n{\r\n\tchar v2[64]; // [esp+4h] [ebp-40h]\r\n\r\n\tSDlgBeginPaint(hWnd, v2);\r\n\tSDlgEndPaint(hWnd, v2);\r\n}\r\n// 10010442: using guessed type int __stdcall SDlgEndPaint(DWORD, DWORD);\r\n// 10010448: using guessed type int __stdcall SDlgBeginPaint(DWORD, DWORD);\r\n\r\n// ref: 0x10007CB5\r\nvoid __fastcall local_DoUiWndProc(HWND hWnd, DWORD *pdwMsgTbl)\r\n{\r\n\tDWORD *v2; // edi\r\n\tint i;     // eax\r\n\tHWND v5;   // eax\r\n\tHWND v6;   // esi\r\n\tvoid *v7;  // eax\r\n\r\n\tv2 = pdwMsgTbl;\r\n\tfor (i = *pdwMsgTbl; *v2; i = *v2) {\r\n\t\tv5 = GetDlgItem(hWnd, i);\r\n\t\tv6 = v5;\r\n\t\tif (v5) {\r\n\t\t\tv7 = (void *)GetWindowLongA(v5, -4);\r\n\t\t\tSetPropA(v6, \"UIWNDPROC\", v7);\r\n\t\t\tSetWindowLongA(v6, -4, (LONG)local_PostUiWndProc);\r\n\t\t}\r\n\t\t++v2;\r\n\t}\r\n}\r\n\r\n// ref: 0x10007D01\r\nLRESULT __stdcall local_PostUiWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tWNDPROC v4;\r\n\tHWND v5;                      // eax\r\n\tHWND v6;                      // eax\r\n\tHWND v7;                      // eax\r\n\tWPARAM v9;                    // [esp-8h] [ebp-14h]\r\n\tBOOL v10;                     // [esp-4h] [ebp-10h]\r\n\r\n\tv4 = (WNDPROC)GetPropA(hWnd, \"UIWNDPROC\");\r\n\tswitch (uMsg) {\r\n\tcase 2u:\r\n\t\tRemovePropA(hWnd, \"UIWNDPROC\");\r\n\t\tif (!v4)\r\n\t\t\treturn DefWindowProcA(hWnd, uMsg, wParam, lParam);\r\n\t\tSetWindowLongA(hWnd, -4, (LONG)v4);\r\n\t\tgoto LABEL_21;\r\n\tcase 0xFu:\r\n\t\tlocal_DlgDoPaint(hWnd);\r\n\t\treturn 0;\r\n\tcase 0x87u:\r\n\t\treturn 4;\r\n\t}\r\n\tif (uMsg != 256)\r\n\t\tgoto LABEL_21;\r\n\tswitch (wParam) {\r\n\tcase 0xDu:\r\n\t\tgoto LABEL_26;\r\n\tcase 0x1Bu:\r\n\t\tv9 = 2;\r\n\tLABEL_15:\r\n\t\tv7 = GetParent(hWnd);\r\n\t\tSendMessageA(v7, 0x111u, v9, 0);\r\n\t\tgoto LABEL_21;\r\n\tcase 0x20u:\r\n\tLABEL_26:\r\n\t\tv9 = 1;\r\n\t\tgoto LABEL_15;\r\n\t}\r\n\tif (wParam <= 0x24)\r\n\t\tgoto LABEL_21;\r\n\tif (wParam <= 0x26) {\r\n\t\tv10 = 1;\r\n\t} else {\r\n\t\tif (wParam > 0x28)\r\n\t\t\tgoto LABEL_21;\r\n\t\tv10 = 0;\r\n\t}\r\n\tv5 = GetParent(hWnd);\r\n\tv6 = GetNextDlgGroupItem(v5, hWnd, v10);\r\n\tSetFocus(v6);\r\nLABEL_21:\r\n\tif (v4)\r\n\t\treturn CallWindowProcA(v4, hWnd, uMsg, wParam, lParam);\r\n\treturn DefWindowProcA(hWnd, uMsg, wParam, lParam);\r\n}\r\n\r\n// ref: 0x10007DE9\r\nvoid __fastcall local_DoUiWndProc2(HWND hWnd, DWORD *pdwMsgTbl)\r\n{\r\n\tDWORD *v2; // edi\r\n\tint i;     // eax\r\n\tHWND v5;   // eax\r\n\tHWND v6;   // esi\r\n\tvoid *v7;  // eax\r\n\r\n\tv2 = pdwMsgTbl;\r\n\tfor (i = *pdwMsgTbl; *v2; i = *v2) {\r\n\t\tv5 = GetDlgItem(hWnd, i);\r\n\t\tv6 = v5;\r\n\t\tif (v5) {\r\n\t\t\tv7 = (void *)GetWindowLongA(v5, -4);\r\n\t\t\tSetPropA(v6, \"UIWNDPROC\", v7);\r\n\t\t\tSetWindowLongA(v6, -4, (LONG)local_PostUiWndProc2);\r\n\t\t}\r\n\t\t++v2;\r\n\t}\r\n}\r\n\r\n// ref: 0x10007E35\r\nLRESULT __stdcall local_PostUiWndProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tLRESULT(__stdcall * v4)\r\n\t(HWND, UINT, WPARAM, LPARAM); // ebx\r\n\tWPARAM v5;                    // ST0C_4\r\n\tHWND v6;                      // eax\r\n\tHWND v8;                      // [esp+18h] [ebp+Ch]\r\n\r\n\tv4 = (LRESULT(__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, \"UIWNDPROC\");\r\n\tswitch (uMsg) {\r\n\tcase 2u:\r\n\t\tRemovePropA(hWnd, \"UIWNDPROC\");\r\n\t\tif (!v4)\r\n\t\t\treturn DefWindowProcA(hWnd, uMsg, wParam, lParam);\r\n\t\tSetWindowLongA(hWnd, -4, (LONG)v4);\r\n\t\tbreak;\r\n\tcase 0xFu:\r\n\t\tlocal_DlgDoPaint(hWnd);\r\n\t\treturn 0;\r\n\tcase 0x201u:\r\n\t\tv8 = GetFocus();\r\n\t\tSetFocus(hWnd);\r\n\t\tInvalidateRect(v8, 0, 0);\r\n\t\tInvalidateRect(hWnd, 0, 0);\r\n\t\tUpdateWindow(v8);\r\n\t\tUpdateWindow(hWnd);\r\n\t\tv5 = (unsigned short)GetWindowLongA(hWnd, -12);\r\n\t\tv6 = GetParent(hWnd);\r\n\t\tPostMessageA(v6, 0x111u, v5, (LPARAM)hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tif (v4)\r\n\t\treturn CallWindowProcA(v4, hWnd, uMsg, wParam, lParam);\r\n\treturn DefWindowProcA(hWnd, uMsg, wParam, lParam);\r\n}\r\n\r\n// ref: 0x10007F04\r\nBOOL __fastcall local_DisableKeyWaitMouse(HWND hWnd)\r\n{\r\n\tBOOL result;       // eax\r\n\tstruct tagMSG Msg; // [esp+8h] [ebp-1Ch]\r\n\r\n\tdo {\r\n\t\twhile (PeekMessageA(&Msg, hWnd, 0x100u, 0x108u, 1u))\r\n\t\t\t;\r\n\t\tresult = PeekMessageA(&Msg, hWnd, 0x200u, 0x209u, 1u);\r\n\t} while (result);\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10007F46\r\nDWORD *__cdecl local_AllocWndLongData()\r\n{\r\n\tDWORD *result; // eax\r\n\r\n\tresult = (DWORD *)SMemAlloc(0x110u, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 480, 0);\r\n\tif (result) {\r\n\t\t*result                 = 0;\r\n\t\tresult[1]               = 0;\r\n\t\tresult[2]               = 0;\r\n\t\tresult[3]               = 0;\r\n\t\t*((BYTE *)result + 16) = 0;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10007F72\r\nvoid __fastcall local_FreeMemPtr(void **p)\r\n{\r\n\tif (p) {\r\n\t\tif (*p)\r\n\t\t\tSMemFree(*p, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 498, 0);\r\n\t\tSMemFree(p, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 499, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x10007FA4\r\nvoid __fastcall local_SetWndLongStr(int WndLongData, const char *pszStr)\r\n{\r\n\tif (WndLongData) {\r\n\t\tif (pszStr) {\r\n\t\t\tstrncpy((char *)(WndLongData + 16), pszStr, 0xFFu);\r\n\t\t\t*(BYTE *)(WndLongData + 271) = 0;\r\n\t\t} else {\r\n\t\t\t*(BYTE *)(WndLongData + 16) = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x10007FD0\r\nvoid __cdecl local_LoadArtCursor()\r\n{\r\n\tDWORD dwHeight; // [esp+8h] [ebp-8h]\r\n\tDWORD dwWidth;  // [esp+Ch] [ebp-4h]\r\n\r\n\tif (SBmpLoadImage(\"ui_art\\\\cursor.pcx\", 0, 0, 0, &dwWidth, &dwHeight, 0)) {\r\n\t\tgpCursorArt  = (BYTE *)SMemAlloc(dwHeight * dwWidth, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 553, 0);\r\n\t\tgpCursorArt2 = (BYTE *)SMemAlloc(dwHeight * dwWidth, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 554, 0);\r\n\t\tif (SBmpLoadImage(\"ui_art\\\\cursor.pcx\", 0, gpCursorArt, dwHeight * dwWidth, 0, 0, 0)) {\r\n\t\t\tgdwCursData[0] = dwWidth;\r\n\t\t\tgdwCursData[1] = dwHeight;\r\n\t\t\tlocal_InitArtCursor();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x10008062\r\nvoid __cdecl local_InitArtCursor()\r\n{\r\n\tBYTE *v0; // eax\r\n\tBYTE *v1; // ecx\r\n\tint i;    // esi\r\n\tchar v3;  // dl\r\n\r\n\tv0 = gpCursorArt2;\r\n\tv1 = gpCursorArt;\r\n\tif (gpCursorArt2) {\r\n\t\tif (gpCursorArt) {\r\n\t\t\tfor (i = 0; i < gdwCursData[0] * gdwCursData[1]; ++i) {\r\n\t\t\t\tv3 = *v1++;\r\n\t\t\t\tif (v3)\r\n\t\t\t\t\t*v0 = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\t*v0 = -1;\r\n\t\t\t\t++v0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x100080AD\r\nvoid __cdecl local_FreeArtCursor()\r\n{\r\n\tif (gpCursorArt) {\r\n\t\tSMemFree(gpCursorArt, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 571, 0);\r\n\t\tgpCursorArt = 0;\r\n\t}\r\n\tif (gpCursorArt2) {\r\n\t\tSMemFree(gpCursorArt2, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\local.cpp\", 575, 0);\r\n\t\tgpCursorArt2 = 0;\r\n\t}\r\n}\r\n\r\n// ref: 0x100080F1\r\nvoid __cdecl local_SetCursorArt()\r\n{\r\n\tif (!gpCursorArt)\r\n\t\tlocal_LoadArtCursor();\r\n\tSDlgSetSystemCursor(gpCursorArt2, gpCursorArt, (int *)gdwCursData, 32512);\r\n}\r\n// 1001044E: using guessed type int __stdcall SDlgSetSystemCursor(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000811B\r\nvoid __cdecl local_SetCursorDefault()\r\n{\r\n\tSDlgSetSystemCursor(0, 0, 0, 32512);\r\n}\r\n// 1001044E: using guessed type int __stdcall SDlgSetSystemCursor(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000812B\r\nvoid __fastcall local_SetDiabloCursor(HWND hWnd)\r\n{\r\n\tHCURSOR v2; // eax\r\n\tint v3;     // [esp+4h] [ebp-4h]\r\n\r\n\tv3 = 0;\r\n\tlocal_SetCursorDefault();\r\n\tv2 = LoadCursorA(ghUiInst, \"DIABLOCURSOR\");\r\n\tSDlgSetCursor(hWnd, v2, 32512, &v3);\r\n}\r\n// 10010454: using guessed type int __stdcall SDlgSetCursor(DWORD, DWORD, DWORD, DWORD);\r\n"
  },
  {
    "path": "DiabloUI/mainmenu.cpp",
    "content": "// ref: 0x10008164\r\nvoid __cdecl MainMenu_cpp_init()\r\n{\r\n\tmainmenu_cpp_float = mainmenu_cpp_float_value;\r\n}\r\n// 1001F434: using guessed type int mainmenu_cpp_float_value;\r\n// 1002A0D4: using guessed type int mainmenu_cpp_float;\r\n\r\n// ref: 0x1000816F\r\nBOOL __stdcall UiMainMenuDialog(const char *name, int *pdwResult, void(__stdcall *fnSound)(const char *file), int attractTimeOut)\r\n{\r\n\tint v4; // eax\r\n\tint v5; // esi\r\n\r\n\tmenu_item_timer = attractTimeOut;\r\n\tTitleSnd_SetSoundFunction(fnSound);\r\n\tartfont_LoadAllFonts();\r\n\tmenu_version_str[0] = 0;\r\n\tif (name)\r\n\t\tstrncpy(menu_version_str, name, 0x40u);\r\n\tv4 = (int)SDrawGetFrameWindow(NULL);\r\n\tv5 = SDlgDialogBoxParam(ghUiInst, \"MAINMENU_DIALOG\", v4, MainMenu_WndProc, 0);\r\n\tif (v5 == 5)\r\n\t\tartfont_FreeAllFonts();\r\n\tif (pdwResult)\r\n\t\t*pdwResult = v5;\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 1002A118: using guessed type int menu_item_timer;\r\n\r\n// ref: 0x100081E3\r\nLRESULT __stdcall MainMenu_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v5; // eax\r\n\r\n\tif (Msg <= 0x113) {\r\n\t\tif (Msg != 275) {\r\n\t\t\tif (Msg == 2) {\r\n\t\t\t\tMainMenu_KillAndFreeMenu(hWnd);\r\n\t\t\t} else if (Msg > 0x103) {\r\n\t\t\t\tif (Msg <= 0x105) {\r\n\t\t\t\t\tv5 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\t\t\tSendMessageA(v5, Msg, wParam, lParam);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (Msg == 272) {\r\n\t\t\t\t\t\tMainMenu_LoadMenuGFX(hWnd);\r\n\t\t\t\t\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (Msg == 273) {\r\n\t\t\t\t\t\tMainMenu_SetMenuTimer(hWnd);\r\n\t\t\t\t\t\tswitch (HIWORD(wParam)) {\r\n\t\t\t\t\t\tcase 7:\r\n\t\t\t\t\t\t\tFocus_GetAndBlitSpin(hWnd, lParam);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 6:\r\n\t\t\t\t\t\t\tFocus_CheckPlayMove(lParam);\r\n\t\t\t\t\t\t\tFocus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\t\tMainMenu_CheckWParamFocus(hWnd, (unsigned short)wParam);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tif (wParam == 3 && !DiabloUI_GetSpawned()) {\r\n\t\t\tif (app_is_active)\r\n\t\t\t\tMainMenu_DoOptions(hWnd, 6, 0);\r\n\t\t\telse\r\n\t\t\t\tMainMenu_SetMenuTimer(hWnd);\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\tif (Msg >= 0x200) {\r\n\t\tif (Msg <= 0x202)\r\n\t\t\tgoto LABEL_34;\r\n\t\tif (Msg <= 0x203)\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\tif (Msg <= 0x205) {\r\n\t\tLABEL_34:\r\n\t\t\tMainMenu_SetMenuTimer(hWnd);\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tif (Msg == 2024) {\r\n\t\t\tif (!Fade_CheckRange5())\r\n\t\t\t\tFade_SetFadeTimer((int)hWnd);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 10029728: using guessed type int app_is_active;\r\n\r\n// ref: 0x10008354\r\nvoid __fastcall MainMenu_KillAndFreeMenu(HWND hWnd)\r\n{\r\n\tvoid **v2; // eax\r\n\r\n\tTitle_KillTitleTimer(hWnd);\r\n\tFocus_KillFocusTimer(hWnd);\r\n\tDoom_DeleteFreeProcs(hWnd, menumsgs_5options);\r\n\tDoom_DeleteFreeProcs(hWnd, menumsgs_1option);\r\n\tv2 = (void **)GetWindowLongA(hWnd, -21);\r\n\tlocal_FreeMemPtr(v2);\r\n\tlocal_SetCursorDefault();\r\n}\r\n\r\n// ref: 0x10008391\r\nvoid __fastcall MainMenu_SetMenuTimer(HWND hWnd)\r\n{\r\n\tSDlgSetTimer((int)hWnd, 3, 1000 * menu_item_timer, 0);\r\n}\r\n// 1002A118: using guessed type int menu_item_timer;\r\n\r\n// ref: 0x100083A8\r\nvoid __fastcall MainMenu_LoadMenuGFX(HWND hWnd)\r\n{\r\n\tDWORD *v2;      // eax MAPDST\r\n\tbool v4;        // zf\r\n\tconst char *v5; // eax\r\n\tHWND v6;        // eax\r\n\r\n\tv2 = local_AllocWndLongData();\r\n\tif (v2) {\r\n\t\tSetWindowLongA(hWnd, -21, (LONG)v2);\r\n\t\tv4 = DiabloUI_GetSpawned() == 0;\r\n\t\tv5 = \"ui_art\\\\swmmenu.pcx\";\r\n\t\tif (v4)\r\n\t\t\tv5 = \"ui_art\\\\mainmenu.pcx\";\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, v5, (BYTE **)v2, v2 + 1, 0);\r\n\t\tFade_NoInputAndArt(hWnd, 1);\r\n\t}\r\n\tv6 = GetDlgItem(hWnd, 1042);\r\n\tSetWindowTextA(v6, menu_version_str);\r\n\tDoom_ParseWndProc3(hWnd, menumsgs_1option, AF_SMALLGRAY);\r\n\tDoom_ParseWndProcs(hWnd, menumsgs_5options, AF_HUGE, 1);\r\n\tFocus_SetFocusTimer(hWnd, \"ui_art\\\\focus42.pcx\");\r\n\tTitle_LoadImgSetTimer(hWnd, \"ui_art\\\\smlogo.pcx\");\r\n\tMainMenu_SetMenuTimer(hWnd);\r\n\tlocal_DoUiWndProc2(hWnd, (DWORD *)menumsgs_5options);\r\n}\r\n\r\n// ref: 0x1000845A\r\nvoid __fastcall MainMenu_DoOptions(HWND hWnd, int option, int PlaySelect)\r\n{\r\n\tSDlgKillTimer((int)hWnd, 3);\r\n\tif (DiabloUI_GetSpawned() && option == 3) {\r\n\t\tSelYesNo_SpawnErrDialog(hWnd, 70, 1);\r\n\tLABEL_7:\r\n\t\tSDlgSetTimer((int)hWnd, 3, 1000 * menu_item_timer, 0);\r\n\t\treturn;\r\n\t}\r\n\tif (option == 2 && !MainMenu_CheckEnoughMemory()) {\r\n\t\tSelYesNo_SpawnErrDialog(hWnd, 78, 1);\r\n\t\tgoto LABEL_7;\r\n\t}\r\n\tFade_Range5SetZero();\r\n\tif (PlaySelect)\r\n\t\tTitleSnd_PlaySelectSound();\r\n\tFade_UpdatePaletteRange(10);\r\n\tSDlgEndDialog(hWnd, (HANDLE)option);\r\n}\r\n// 1002A118: using guessed type int menu_item_timer;\r\n\r\n// ref: 0x100084D5\r\nBOOL __cdecl MainMenu_CheckEnoughMemory()\r\n{\r\n\tstruct _MEMORYSTATUS Buffer; // [esp+0h] [ebp-20h]\r\n\r\n\tBuffer.dwLength = 32;\r\n\tGlobalMemoryStatus(&Buffer);\r\n\treturn Buffer.dwTotalPhys > 0xDAC000;\r\n}\r\n\r\n// ref: 0x100084FA\r\nvoid __fastcall MainMenu_CheckWParamFocus(HWND hWnd, WPARAM wParam)\r\n{\r\n\tHWND v3; // eax\r\n\tLONG v4; // eax\r\n\tint v5;  // [esp-8h] [ebp-Ch]\r\n\r\n\tswitch (wParam) {\r\n\tcase 1u:\r\n\t\tv3 = GetFocus();\r\n\t\tv4 = GetWindowLongA(v3, -12);\r\n\t\tSendMessageA(hWnd, 0x111u, v4, 0);\r\n\t\treturn;\r\n\tcase 2u:\r\n\t\tv5 = 5;\r\n\t\tgoto LABEL_12;\r\n\tcase 0x3E9u:\r\n\t\tv5 = 2;\r\n\t\tgoto LABEL_12;\r\n\tcase 0x3EAu:\r\n\t\tv5 = 3;\r\n\t\tgoto LABEL_12;\r\n\tcase 0x3EBu:\r\n\t\tv5 = 4;\r\n\tLABEL_12:\r\n\t\tMainMenu_DoOptions(hWnd, v5, 1);\r\n\t\treturn;\r\n\tcase 0x414u:\r\n\t\tMainMenu_DoOptions(hWnd, 1, 1);\r\n\t\tbreak;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "DiabloUI/modem.cpp",
    "content": "// ref: 0x1000855D\r\nint Modem_1000855D() { return 0; }\r\n/* {\r\n\treturn dword_1002A124;\r\n} */\r\n// 1002A124: using guessed type int dword_1002A124;\r\n\r\n// ref: 0x10008563\r\nHWND __fastcall Modem_10008563(HWND hDlg, const char *a2, int a3) { return 0; }\r\n/* {\r\n\tHWND v3; // esi\r\n\tconst char *v4; // ebp\r\n\tHWND result; // eax\r\n\r\n\tv3 = hDlg;\r\n\tv4 = a2;\r\n\tresult = GetDlgItem(hDlg, 1108);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tlocal_10007FA4((int)result, (const char *)a3);\r\n\t\t\tDoom_10006A13(v3, (int *)&unk_10022C5C, 1);\r\n\t\t\tresult = GetDlgItem(v3, 1080);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\t\tif ( result )\r\n\t\t\t\t{\r\n\t\t\t\t\tlocal_10007FA4((int)result, v4);\r\n\t\t\t\t\tresult = (HWND)Doom_10006A13(v3, (int *)&unk_10022C54, 3);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x100085D8\r\nint __stdcall Modem_100085D8(int a1, char *a2, char *a3) { return 0; }\r\n/* {\r\n\tdword_1002A150 = a1;\r\n\tstrcpy(&byte_1002A154, a2);\r\n\tstrcpy(&byte_1002A1D4, a3);\r\n\treturn 1;\r\n} */\r\n// 1002A150: using guessed type int dword_1002A150;\r\n\r\n// ref: 0x10008606\r\nBOOL Modem_10008606() { return 0; }\r\n/* {\r\n\tBOOL result; // eax\r\n\r\n\tdword_1002A150 = 0;\r\n\tbyte_1002A154 = 0;\r\n\tbyte_1002A1D4 = 0;\r\n\tif ( SNetEnumGames(0, 0, Modem_100085D8, 0) )\r\n\t\tresult = dword_1002A150 != 0;\r\n\telse\r\n\t\tresult = 0;\r\n\treturn result;\r\n} */\r\n// 10010436: using guessed type int __stdcall SNetEnumGames(DWORD, DWORD, DWORD, DWORD);\r\n// 1002A150: using guessed type int dword_1002A150;\r\n\r\n// ref: 0x1000863D\r\nchar *Modem_1000863D() { return 0; }\r\n/* {\r\n\treturn &byte_1002A154;\r\n} */\r\n\r\n// ref: 0x10008648\r\nsigned int Modem_10008648() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A128 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A128: using guessed type int dword_1002A128;\r\n\r\n// ref: 0x10008653\r\nint Modem_10008653() { return 0; }\r\n/* {\r\n\treturn dword_1002A148;\r\n} */\r\n// 1002A148: using guessed type int dword_1002A148;\r\n\r\n// ref: 0x10008659\r\nint Modem_10008659() { return 0; }\r\n/* {\r\n\treturn dword_1002A134;\r\n} */\r\n// 1002A134: using guessed type int dword_1002A134;\r\n\r\n// ref: 0x1000865F\r\nint UNKCALL Modem_1000865F(char *arg) { return 0; }\r\n/* {\r\n\tchar v1; // al\r\n\tint result; // eax\r\n\r\n\twhile ( 1 )\r\n\t{\r\n\t\tv1 = *arg;\r\n\t\tif ( !*arg || (unsigned char)v1 >= 0x30u && (unsigned char)v1 <= 0x39u )\r\n\t\t\tbreak;\r\n\t\t++arg;\r\n\t}\r\n\tif ( *arg )\r\n\t\tresult = atoi(arg);\r\n\telse\r\n\t\tresult = 0;\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x10008680\r\nBOOL __fastcall Modem_10008680(int a1, int a2, int a3, DWORD *a4, int a5, int playerid) { return 0; }\r\n/* {\r\n\tint v6; // esi\r\n\r\n\tdword_1002A13C = a3;\r\n\tdword_1002A138 = a2;\r\n\tdword_1002A144 = a5;\r\n\tdword_1002A14C = a4;\r\n\tgnModemPlayerid = playerid;\r\n\tartfont_10001159();\r\n\tv6 = SDlgDialogBoxParam(hInstance, \"MODEM_DIALOG\", a4[2], Modem_100086DE, 0);\r\n\tartfont_100010C8();\r\n\treturn v6 == 1;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A138: using guessed type int dword_1002A138;\r\n// 1002A13C: using guessed type int dword_1002A13C;\r\n// 1002A140: using guessed type int gnModemPlayerid;\r\n// 1002A144: using guessed type int dword_1002A144;\r\n\r\n// ref: 0x100086DE\r\nint __stdcall Modem_100086DE(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tint v6; // [esp+0h] [ebp-8h]\r\n\r\n\tif ( Msg > 0x7E8 )\r\n\t{\r\n\t\tswitch ( Msg )\r\n\t\t{\r\n\t\t\tcase 0xBD0u:\r\n\t\t\t\tModem_100088DB(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\tcase 0xBD1u:\r\n\t\t\t\tModem_10008BB7(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\tcase 0xBD2u:\r\n\t\t\t\tModem_10008BFE(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 2024 )\r\n\t{\r\n\t\tif ( !Fade_1000739F() )\r\n\t\t\tFade_100073FD(hWnd, v6);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tModem_1000879E(hWnd);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg <= 0x103 )\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tif ( Msg <= 0x105 )\r\n\t{\r\n\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg != 272 )\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tModem_100087DB(hWnd);\r\n\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\treturn 0;\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000879E\r\nvoid **UNKCALL Modem_1000879E(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tDWORD *v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tDoom_10006C53(hDlg, (int *)&unk_10022C5C);\r\n\tDoom_10006C53(v1, (int *)&unk_10022C54);\r\n\tDoom_10006C53(v1, (int *)&unk_10022C4C);\r\n\tv2 = (DWORD *)GetWindowLongA(v1, -21);\r\n\tlocal_10007F72(v2);\r\n\treturn Title_100100E7(v1);\r\n} */\r\n\r\n// ref: 0x100087DB\r\nBOOL UNKCALL Modem_100087DB(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\tint *v3; // edi\r\n\tHWND v5; // [esp+0h] [ebp-10h]\r\n\r\n\tv1 = hWnd;\r\n\tTitle_1001009E(hWnd, (int)\"ui_art\\\\smlogo.pcx\", v5);\r\n\tv2 = local_10007F46();\r\n\tv3 = (int *)v2;\r\n\tif ( v2 )\r\n\t{\r\n\t\tSetWindowLongA(v1, -21, v2);\r\n\t\tlocal_10007944((int)v1, 0, &byte_10029448, -1, 1, (int)\"ui_art\\\\selgame.pcx\", v3, v3 + 1, 0);\r\n\t\tFade_100073C5(v1, 1);\r\n\t}\r\n\tDoom_100068AB(v1, (int *)&unk_10022C4C, 5);\r\n\tDoom_100068AB(v1, (int *)&unk_10022C54, 3);\r\n\tDoom_100068AB(v1, (int *)&unk_10022C5C, 1);\r\n\tModem_10008888();\r\n\tif ( dword_1002A124 )\r\n\t\treturn PostMessageA(v1, 0xBD2u, 0, 0);\r\n\tdword_1002A134 = 1;\r\n\tdword_1002A130 = 1;\r\n\treturn PostMessageA(v1, 0xBD0u, 0, 0);\r\n} */\r\n// 1002A124: using guessed type int dword_1002A124;\r\n// 1002A130: using guessed type int dword_1002A130;\r\n// 1002A134: using guessed type int dword_1002A134;\r\n\r\n// ref: 0x10008888\r\nint Modem_10008888() { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tdword_1002A150 = 0;\r\n\tbyte_1002A154 = 0;\r\n\tbyte_1002A1D4 = 0;\r\n\tresult = SNetEnumGames(0, 0, Modem_100085D8, 0);\r\n\tif ( result )\r\n\t{\r\n\t\tdword_1002A124 = 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tresult = SErrGetLastError();\r\n\t\tif ( result == 1222 )\r\n\t\t{\r\n\t\t\tdword_1002A124 = 0;\r\n\t\t\tresult = 1;\r\n\t\t\tdword_1002A134 = 1;\r\n\t\t\tdword_1002A130 = 1;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 10010436: using guessed type int __stdcall SNetEnumGames(DWORD, DWORD, DWORD, DWORD);\r\n// 1002A124: using guessed type int dword_1002A124;\r\n// 1002A130: using guessed type int dword_1002A130;\r\n// 1002A134: using guessed type int dword_1002A134;\r\n// 1002A150: using guessed type int dword_1002A150;\r\n\r\n// ref: 0x100088DB\r\nint UNKCALL Modem_100088DB(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\tint v3; // eax\r\n\tint v5; // [esp+4h] [ebp-20h]\r\n\r\n\tv1 = hWnd;\r\n\tv2 = SDlgDialogBoxParam(hInstance, \"SELDIAL_DIALOG\", hWnd, SelDial_1000B0CF, &v5) - 3;\r\n\tif ( !v2 )\r\n\t\treturn Modem_1000893D(v1);\r\n\tv3 = v2 - 1;\r\n\tif ( !v3 )\r\n\t\treturn Modem_10008A38(v1, (int)&v5);\r\n\tif ( v3 == 1 )\r\n\t\treturn PostMessageA(v1, 0xBD1u, 0, 0);\r\n\treturn SelHero_1000C3E2((int)v1, 2);\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000893D\r\nint UNKCALL Modem_1000893D(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\tint result; // eax\r\n\tCHAR v4; // [esp+8h] [ebp-C0h]\r\n\tint v5; // [esp+48h] [ebp-80h]\r\n\tHWND v6; // [esp+50h] [ebp-78h]\r\n\tCHAR Buffer; // [esp+98h] [ebp-30h]\r\n\tint v8; // [esp+B8h] [ebp-10h]\r\n\tint v9; // [esp+BCh] [ebp-Ch]\r\n\tint v10; // [esp+C0h] [ebp-8h]\r\n\tint v11; // [esp+C4h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tmemcpy(&v5, dword_1002A14C, 0x50u);\r\n\tv5 = 80;\r\n\tv6 = v1;\r\n\tmemset(&v8, 0, 0x10u);\r\n\tv8 = 16;\r\n\tv9 = 1297040461;\r\n\tv2 = *(DWORD *)(dword_1002A138 + 24);\r\n\tv11 = 0;\r\n\tv10 = v2;\r\n\tLoadStringA(hInstance, 0x47u, &Buffer, 31);\r\n\twsprintfA(&v4, &Buffer, dword_1002A130);\r\n\tif ( CreaDung_100051D8(\r\n\t\t\t (int)&v8,\r\n\t\t\t dword_1002A138,\r\n\t\t\t dword_1002A13C,\r\n\t\t\t (int)&v5,\r\n\t\t\t dword_1002A144,\r\n\t\t\t gnModemPlayerid,\r\n\t\t\t 1,\r\n\t\t\t (int)&v4) )\r\n\t{\r\n\t\t++dword_1002A130;\r\n\t\tresult = SelHero_1000C3E2((int)v1, 1);\r\n\t}\r\n\telse if ( dword_1002A124 )\r\n\t{\r\n\t\tif ( SErrGetLastError() == 183 )\r\n\t\t\t++dword_1002A130;\r\n\t\tresult = PostMessageA(v1, 0xBD2u, 0, 0);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tresult = PostMessageA(v1, 0xBD0u, 0, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 1002A124: using guessed type int dword_1002A124;\r\n// 1002A130: using guessed type int dword_1002A130;\r\n// 1002A138: using guessed type int dword_1002A138;\r\n// 1002A13C: using guessed type int dword_1002A13C;\r\n// 1002A140: using guessed type int gnModemPlayerid;\r\n// 1002A144: using guessed type int dword_1002A144;\r\n\r\n// ref: 0x10008A38\r\nint __fastcall Modem_10008A38(HWND hWnd, int a2) { return 0; }\r\n/* {\r\n\tchar *v2; // ebx\r\n\tHWND v3; // edi\r\n\tint v4; // eax\r\n\tint result; // eax\r\n\tCHAR Buffer; // [esp+Ch] [ebp-80h]\r\n\r\n\tv2 = (char *)a2;\r\n\tv3 = hWnd;\r\n\tdword_1002A148 = 0;\r\n\t_beginthread((int)Modem_10008B42, 0, a2);\r\n\tModmStat_10008C87(v3);\r\n\tif ( !dword_1002A120 )\r\n\t{\r\n\t\tswitch ( dword_1002A12C )\r\n\t\t{\r\n\t\t\tcase -2062548871:\r\n\t\t\t\tLoadStringA(hInstance, 0x32u, &Buffer, 127);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 54:\r\n\t\t\t\tLoadStringA(hInstance, 0x42u, &Buffer, 127);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1204:\r\n\t\t\t\tLoadStringA(hInstance, 0x4Cu, &Buffer, 127);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1222:\r\n\t\t\t\tLoadStringA(hInstance, 0x41u, &Buffer, 127);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1223:\r\n\t\t\t\tgoto LABEL_18;\r\n\t\t\tcase 2250:\r\n\t\t\t\tLoadStringA(hInstance, 0x40u, &Buffer, 127);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tLoadStringA(hInstance, 0x33u, &Buffer, 127);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tSelYesNo_1000FD39((int)v3, &Buffer, 0, 1);\r\nLABEL_18:\r\n\t\tif ( dword_1002A124 )\r\n\t\t\tresult = PostMessageA(v3, 0xBD2u, 0, 0);\r\n\t\telse\r\n\t\t\tresult = PostMessageA(v3, 0xBD0u, 0, 0);\r\n\t\treturn result;\r\n\t}\r\n\tif ( !dword_1002A124 )\r\n\t{\r\n\t\tSelDial_1000B011(v2);\r\n\t\tModem_10008606();\r\n\t}\r\n\tv4 = Modem_1000865F(&byte_1002A154);\r\n\tdword_1002A134 = v4;\r\n\tdword_1002A130 = v4 + 1;\r\n\treturn SelHero_1000C3E2((int)v3, 1);\r\n} */\r\n// 1002A120: using guessed type int dword_1002A120;\r\n// 1002A124: using guessed type int dword_1002A124;\r\n// 1002A12C: using guessed type int dword_1002A12C;\r\n// 1002A130: using guessed type int dword_1002A130;\r\n// 1002A134: using guessed type int dword_1002A134;\r\n// 1002A148: using guessed type int dword_1002A148;\r\n\r\n// ref: 0x10008B42\r\nvoid __cdecl Modem_10008B42(char *a1) { return; }\r\n/* {\r\n\tchar *v1; // eax\r\n\tchar v2; // [esp+0h] [ebp-100h]\r\n\tchar v3; // [esp+80h] [ebp-80h]\r\n\r\n\tConnect_10004028((int)&v2, 128, (int)&v3, 128);\r\n\tdword_1002A148 = 0;\r\n\tv1 = &byte_1002A154;\r\n\tif ( !dword_1002A124 )\r\n\t\tv1 = a1;\r\n\tdword_1002A120 = SNetJoinGame(0, v1, 0, &v2, &v3, gnModemPlayerid);\r\n\tif ( !dword_1002A120 )\r\n\t\tdword_1002A12C = SErrGetLastError();\r\n\tdword_1002A148 = 1;\r\n\t_endthread();\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 10010430: using guessed type int __stdcall SNetJoinGame(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10011E20: using guessed type int _endthread(void);\r\n// 1002A120: using guessed type int dword_1002A120;\r\n// 1002A124: using guessed type int dword_1002A124;\r\n// 1002A12C: using guessed type int dword_1002A12C;\r\n// 1002A140: using guessed type int gnModemPlayerid;\r\n// 1002A148: using guessed type int dword_1002A148;\r\n\r\n// ref: 0x10008BB7\r\nint UNKCALL Modem_10008BB7(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint result; // eax\r\n\tint v3; // [esp+4h] [ebp-20h]\r\n\r\n\tv1 = hWnd;\r\n\tif ( SDlgDialogBoxParam(hInstance, \"ENTERDIAL_DIALOG\", hWnd, EntDial_10006C96, &v3) == 1 )\r\n\t\tresult = Modem_10008A38(v1, (int)&v3);\r\n\telse\r\n\t\tresult = PostMessageA(v1, 0xBD0u, 0, 0);\r\n\treturn result;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10008BFE\r\nint UNKCALL Modem_10008BFE(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\tint v3; // eax\r\n\r\n\tv1 = hWnd;\r\n\tv2 = SDlgDialogBoxParam(hInstance, \"SELCRE8JOIN_DIALOG\", hWnd, SelDial_1000B0CF, 0) - 3;\r\n\tif ( !v2 )\r\n\t\treturn Modem_1000893D(v1);\r\n\tv3 = v2 - 2;\r\n\tif ( !v3 )\r\n\t\treturn Modem_10008A38(v1, (int)&byte_1002A154);\r\n\tif ( v3 != 1217 )\r\n\t\treturn SelHero_1000C3E2((int)v1, 2);\r\n\tdword_1002A124 = 0;\r\n\treturn PostMessageA(v1, 0xBD0u, 0, 0);\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A124: using guessed type int dword_1002A124;\r\n"
  },
  {
    "path": "DiabloUI/modmstat.cpp",
    "content": "// ref: 0x10008C62\r\nint __stdcall ModmStat_10008C62(char *a1, int a2, int a3, int a4, int a5) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tstrcpy(&byte_1002A264, a1);\r\n\tresult = 1;\r\n\tdword_1002A258 = 1;\r\n\tdword_1002A260 = (int (*)(void))a5;\r\n\treturn result;\r\n} */\r\n// 1002A258: using guessed type int dword_1002A258;\r\n// 1002A260: using guessed type int (*dword_1002A260)(void);\r\n\r\n// ref: 0x10008C87\r\nint UNKCALL ModmStat_10008C87(void *arg) { return 0; }\r\n/* {\r\n\treturn SDlgDialogBoxParam(hInstance, \"MODMSTAT_DIALOG\", arg, ModmStat_10008CA0, 0);\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x10008CA0\r\nint __stdcall ModmStat_10008CA0(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tHWND v6; // eax\r\n\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tModmStat_10008DB3(hWnd);\r\n\t}\r\n\telse if ( Msg > 0x103 )\r\n\t{\r\n\t\tif ( Msg <= 0x105 )\r\n\t\t{\r\n\t\t\tv6 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\tSendMessageA(v6, Msg, wParam, lParam);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tswitch ( Msg )\r\n\t\t\t{\r\n\t\t\t\tcase 0x110u:\r\n\t\t\t\t\tModmStat_10008DE4(hWnd);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\tcase 0x111u:\r\n\t\t\t\t\tif ( HIWORD(wParam) == 7 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFocus_100075B7(hWnd, (HWND)lParam);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ( HIWORD(wParam) == 6 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tFocus_10007458((void *)lParam);\r\n\t\t\t\t\t\tFocus_100075DC(hWnd, (HWND)lParam);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ( (WORD)wParam == 1 || (WORD)wParam == 2 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tModmStat_10008E89((int)hWnd, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 0x113u:\r\n\t\t\t\t\tif ( dword_1002A258 )\r\n\t\t\t\t\t\tModmStat_10008EBF(hWnd);\r\n\t\t\t\t\tif ( Modem_10008653() )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tdword_1002A25C = 1;\r\n\t\t\t\t\t\tModmStat_10008E89((int)hWnd, 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tv4 = GetFocus();\r\n\t\t\t\t\tFocus_100075DC(hWnd, v4);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 1002A258: using guessed type int dword_1002A258;\r\n// 1002A25C: using guessed type int dword_1002A25C;\r\n\r\n// ref: 0x10008DB3\r\nint UNKCALL ModmStat_10008DB3(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tDWORD *v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = (DWORD *)GetWindowLongA(hDlg, -21);\r\n\tlocal_10007F72(v2);\r\n\tFocus_100076C3();\r\n\tDoom_10006C53(v1, (int *)&unk_10022CB4);\r\n\treturn Doom_10006C53(v1, (int *)&unk_10022CAC);\r\n} */\r\n\r\n// ref: 0x10008DE4\r\nBOOL UNKCALL ModmStat_10008DE4(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\tint *v3; // edi\r\n\tHWND v4; // eax\r\n\tBOOL result; // eax\r\n\r\n\tv1 = hWnd;\r\n\tv2 = local_10007F46();\r\n\tv3 = (int *)v2;\r\n\tif ( v2 )\r\n\t{\r\n\t\tSetWindowLongA(v1, -21, v2);\r\n\t\tlocal_10007944((int)v1, 0, \"Popup\", -1, 1, (int)\"ui_art\\\\black.pcx\", v3, v3 + 1, 1);\r\n\t}\r\n\tDoom_100068AB(v1, (int *)&unk_10022CAC, 3);\r\n\tDoom_1000658C(v1, (int *)&unk_10022CB4, 4, 1);\r\n\tFocus_10007719(\"ui_art\\\\focus.pcx\");\r\n\tSDlgSetTimer(v1, 1, 55, 0);\r\n\tlocal_10007DE9(v1, (int *)&unk_10022CB4);\r\n\tbyte_1002A264 = 0;\r\n\tdword_1002A258 = 0;\r\n\tdword_1002A260 = 0;\r\n\tv4 = GetDlgItem(v1, 2);\r\n\tresult = ShowWindow(v4, 0);\r\n\tdword_1002A25C = 0;\r\n\treturn result;\r\n} */\r\n// 10010412: using guessed type int __stdcall SDlgSetTimer(DWORD, DWORD, DWORD, DWORD);\r\n// 1002A258: using guessed type int dword_1002A258;\r\n// 1002A25C: using guessed type int dword_1002A25C;\r\n// 1002A260: using guessed type int (*dword_1002A260)(void);\r\n\r\n// ref: 0x10008E89\r\nint __fastcall ModmStat_10008E89(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // edi\r\n\tint v3; // esi\r\n\tint result; // eax\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tif ( dword_1002A25C )\r\n\t{\r\n\t\tTitleSnd_1001031F();\r\n\t\tSDlgKillTimer(v3, 1);\r\n\t\tif ( v2 )\r\n\t\t{\r\n\t\t\tif ( dword_1002A260 )\r\n\t\t\t\tdword_1002A260();\r\n\t\t}\r\n\t\tresult = SDlgEndDialog(v3, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A260: invalid function type has been ignored\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n// 10010418: using guessed type int __stdcall SDlgKillTimer(DWORD, DWORD);\r\n// 1002A25C: using guessed type int dword_1002A25C;\r\n// 1002A260: using guessed type int (*dword_1002A260)(void);\r\n\r\n// ref: 0x10008EBF\r\nvoid UNKCALL ModmStat_10008EBF(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // eax\r\n\tint v3; // eax\r\n\tHWND v4; // eax\r\n\r\n\tdword_1002A258 = 0;\r\n\tv1 = hDlg;\r\n\tif ( dword_1002A260 )\r\n\t{\r\n\t\tv2 = GetDlgItem(hDlg, 1026);\r\n\t\tif ( v2 )\r\n\t\t{\r\n\t\t\tv3 = GetWindowLongA(v2, -21);\r\n\t\t\tlocal_10007FA4(v3, &byte_1002A264);\r\n\t\t\tDoom_10006A13(v1, (int *)&unk_10022CAC, 3);\r\n\t\t\tv4 = GetDlgItem(v1, 2);\r\n\t\t\tShowWindow(v4, 1);\r\n\t\t\tdword_1002A25C = 1;\r\n\t\t}\r\n\t}\r\n} */\r\n// 1002A258: using guessed type int dword_1002A258;\r\n// 1002A25C: using guessed type int dword_1002A25C;\r\n// 1002A260: using guessed type int (*dword_1002A260)(void);\r\n\r\n// ref: 0x10008F26\r\nsigned int ModmStat_10008F26() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A254 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A254: using guessed type int dword_1002A254;\r\n"
  },
  {
    "path": "DiabloUI/okcancel.cpp",
    "content": "// ref: 0x10008F31\r\nBOOL __fastcall OkCancel_DrawString(HWND hWnd, char *str)\r\n{\r\n\tHDC v3;              // edi\r\n\tvoid *v4;            // eax\r\n\tint v5;              // eax\r\n\tBOOL result;         // eax\r\n\tLONG v7;             // [esp+14h] [ebp-20h]\r\n\tLONG v8;             // [esp+18h] [ebp-1Ch]\r\n\tstruct tagRECT Rect; // [esp+1Ch] [ebp-18h]\r\n\tHGDIOBJ h;           // [esp+2Ch] [ebp-8h]\r\n\r\n\tif (!str || !*str)\r\n\t\tgoto LABEL_13;\r\n\tif (!hWnd)\r\n\t\tgoto LABEL_14;\r\n\tGetClientRect(hWnd, &Rect);\r\n\t--Rect.right;\r\n\t--Rect.bottom;\r\n\tv7 = Rect.right;\r\n\tv8 = Rect.bottom;\r\n\tv3 = GetDC(hWnd);\r\n\tv4 = (void *)SendMessageA(hWnd, 0x31u, 0, 0);\r\n\th  = SelectObject(v3, v4);\r\n\tif (!v3)\r\n\t\tgoto LABEL_13;\r\n\tv5 = strlen(str);\r\n\tDrawTextA(v3, str, v5, &Rect, 0x410u);\r\n\tif (h)\r\n\t\tSelectObject(v3, h);\r\n\tReleaseDC(hWnd, v3);\r\n\tif (Rect.bottom > v8 || Rect.right > v7)\r\n\tLABEL_14:\r\n\t\tresult = 1;\r\n\telse\r\n\tLABEL_13:\r\n\t\tresult = 0;\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10008FEC\r\nvoid __cdecl OkCancel_cpp_init()\r\n{\r\n\tOkCancel_cpp_float = OkCancel_cpp_float_value;\r\n}\r\n// 1001F440: using guessed type int OkCancel_cpp_float_value;\r\n// 1002A2E4: using guessed type int OkCancel_cpp_float;\r\n\r\n// ref: 0x10008FF7\r\nLRESULT __stdcall OkCancel_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v5; // ecx\r\n\tint v6;  // edx\r\n\tHWND v7; // eax\r\n\tLONG v8; // eax\r\n\tHWND v9; // eax\r\n\r\n\tif (Msg == 2) {\r\n\t\tShowCursor(FALSE);\r\n\t\tOkCancel_FreeDlgBmp(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg <= 0x103)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tif (Msg <= 0x105) {\r\n\t\tv9 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v9, Msg, wParam, lParam);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg != 272) {\r\n\t\tif (Msg != 273) {\r\n\t\t\tif (Msg == 312 && GetWindowLongA((HWND)lParam, -12) == 1038) {\r\n\t\t\t\tlocal_SetWhiteText((HDC)wParam);\r\n\t\t\t\treturn (LRESULT)GetStockObject(5);\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tif ((unsigned short)wParam == 1) {\r\n\t\t\tv7 = GetFocus();\r\n\t\t\tv8 = GetWindowLongA(v7, -12);\r\n\t\t\tv5 = hWnd;\r\n\t\t\tif (v8 == 1109) {\r\n\t\t\t\tv6 = 1;\r\n\t\t\t\tgoto LABEL_16;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif ((unsigned short)wParam != 2) {\r\n\t\t\t\tif ((unsigned short)wParam == 1109) {\r\n\t\t\t\t\tv5 = hWnd;\r\n\t\t\t\t\tv6 = 1;\r\n\t\t\t\tLABEL_16:\r\n\t\t\t\t\tOkCancel_PlaySndEndDlg(v5, v6);\r\n\t\t\t\t}\r\n\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t}\r\n\t\t\tv5 = hWnd;\r\n\t\t}\r\n\t\tv6 = 2;\r\n\t\tgoto LABEL_16;\r\n\t}\r\n\tShowCursor(TRUE);\r\n\tif (!OkCancel_LoadOkCancGFX(hWnd, (DWORD *)lParam))\r\n\t\tSDlgEndDialog(hWnd, (HANDLE)0xFF000000);\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10009117\r\nvoid __fastcall OkCancel_FreeDlgBmp(HWND hWnd)\r\n{\r\n\tvoid **v1; // eax MAPDST\r\n\tvoid *v3;  // eax\r\n\tvoid *v4;  // eax\r\n\r\n\tv1 = (void **)RemovePropA(hWnd, \"DLGBMP\");\r\n\tif (v1) {\r\n\t\tv3 = *v1;\r\n\t\tif (v3)\r\n\t\t\tSMemFree(v3, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\OkCancel.cpp\", 48, 0);\r\n\t\tv4 = v1[1];\r\n\t\tif (v4)\r\n\t\t\tSMemFree(v4, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\OkCancel.cpp\", 50, 0);\r\n\t\tSMemFree(v1, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\OkCancel.cpp\", 51, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x10009161\r\nBOOL __fastcall OkCancel_LoadOkCancGFX(HWND hWnd, DWORD *lParam)\r\n{\r\n\tbool v3;             // zf\r\n\tHWND v4;             // edi\r\n\ttagPALETTEENTRY *v5; // edi\r\n\tHWND v6;             // eax\r\n\tHWND v7;             // edi\r\n\tBYTE **v8;           // edi\r\n\tHWND v9;             // eax\r\n\tconst CHAR *v10;     // ST1C_4\r\n\tHWND v11;            // eax\r\n\tHWND v12;            // edi\r\n\tint a2a;             // [esp+Ch] [ebp-20h]\r\n\tint v15;             // [esp+10h] [ebp-1Ch]\r\n\tint v16;             // [esp+14h] [ebp-18h]\r\n\tDWORD data[2];       // [esp+18h] [ebp-14h]\r\n\tBYTE **pBuffer;      // [esp+20h] [ebp-Ch]\r\n\tchar *pszFileName;   // [esp+24h] [ebp-8h]\r\n\r\n\ta2a     = 1109;\r\n\tv15     = 2;\r\n\tv16     = 0;\r\n\tpBuffer = (BYTE **)SMemAlloc(8u, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\OkCancel.cpp\", 110, 0);\r\n\tSetPropA(hWnd, \"DLGBMP\", pBuffer);\r\n\tif (lParam[2]) {\r\n\t\tv3          = lParam[3] == 0;\r\n\t\tpszFileName = \"ui_art\\\\lrpopup.pcx\";\r\n\t\tif (v3)\r\n\t\t\tpszFileName = \"ui_art\\\\lpopup.pcx\";\r\n\t} else if (lParam[3]) {\r\n\t\tpszFileName = \"ui_art\\\\srpopup.pcx\";\r\n\t} else {\r\n\t\tpszFileName = \"ui_art\\\\spopup.pcx\";\r\n\t}\r\n\tv4 = GetParent(hWnd);\r\n\tif ((HWND)SDrawGetFrameWindow(NULL) == v4) {\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, pszFileName, pBuffer, 0, 1);\r\n\t\tv5 = local_GetArtPalEntry(0);\r\n\t\tSDrawUpdatePalette(0, 0xAu, v5, 0);\r\n\t\tSDrawUpdatePalette(0x70u, 0x90u, v5 + 112, 1);\r\n\t} else {\r\n\t\tv6 = GetParent(hWnd);\r\n\t\tlocal_LoadArtWithPal(hWnd, (int)v6, \"Popup\", -1, 1, pszFileName, pBuffer, 0, 1);\r\n\t}\r\n\tv7 = GetParent(hWnd);\r\n\tif ((HWND)SDrawGetFrameWindow(NULL) == v7)\r\n\t\tFade_SetInputWindow(hWnd);\r\n\tv8 = pBuffer + 1;\r\n\tlocal_LoadArtImage(\"ui_art\\\\but_sml.pcx\", pBuffer + 1, data);\r\n\tlocal_FitButtonDlg(hWnd, &a2a, *v8, data);\r\n\tv9      = GetDlgItem(hWnd, 1026);\r\n\tv10     = (const CHAR *)lParam[1];\r\n\tpBuffer = (BYTE **)v9;\r\n\tSetWindowTextA(v9, v10);\r\n\tif (lParam[4] && OkCancel_DrawString((HWND)pBuffer, (char *)lParam[1]))\r\n\t\treturn 0;\r\n\tif (*lParam) {\r\n\t\tv11 = GetDlgItem(hWnd, 1038);\r\n\t\tv12 = v11;\r\n\t\tif (lParam[4] && OkCancel_DrawString(v11, (char *)*lParam))\r\n\t\t\treturn 0;\r\n\t\tif (v12)\r\n\t\t\tSetWindowTextA(v12, (LPCSTR)*lParam);\r\n\t}\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x100092F5\r\nvoid __fastcall OkCancel_PlaySndEndDlg(HWND hWnd, int a2)\r\n{\r\n\tTitleSnd_PlaySelectSound();\r\n\tSDlgEndDialog(hWnd, (HANDLE)a2);\r\n}\r\n\r\n// ref: 0x1000930A\r\nvoid __fastcall OkCancel_DoOkDialog(HWND hWnd, char *str, int a3)\r\n{\r\n\tint a5[5]; // [esp+0h] [ebp-14h]\r\n\r\n\ta5[1] = (int)str;\r\n\ta5[2] = 0;\r\n\ta5[0] = 0;\r\n\ta5[4] = 0;\r\n\ta5[3] = a3;\r\n\tSDlgDialogBoxParam(ghUiInst, \"OK_DIALOG\", (int)hWnd, OkCancel_WndProc, (int)a5);\r\n}\r\n\r\n// ref: 0x10009342\r\nvoid __stdcall UiMessageBoxCallback(HWND hWnd, char *lpText, LPCSTR lpCaption, UINT uType)\r\n{\r\n\tint v4;           // eax\r\n\tunsigned char v5; // sf\r\n\tsize_t v7;        // eax\r\n\tchar *v8;         // eax\r\n\tint v9;           // ecx\r\n\tint a5[5];        // [esp+0h] [ebp-24h]\r\n\tint v11;          // [esp+14h] [ebp-10h]\r\n\tvoid *location;   // [esp+18h] [ebp-Ch]\r\n\tchar *szDialog;   // [esp+1Ch] [ebp-8h]\r\n\tchar *v14;        // [esp+20h] [ebp-4h]\r\n\r\n\ta5[0]    = (int)lpCaption;\r\n\ta5[1]    = (int)lpText;\r\n\tszDialog = \"OK_DIALOG\";\r\n\ta5[4]    = 1;\r\n\tif (uType & 0xF)\r\n\t\tszDialog = \"OKCANCEL_DIALOG\";\r\n\ta5[3]        = (uType & 0xF0) == 16 || (uType & 0xF0) == 48;\r\n\tv4           = 0;\r\n\ta5[2]        = 0;\r\n\twhile (1) {\r\n\t\tv14 = (char *)SDlgDialogBoxParam(ghUiInst, &szDialog[32 * v4], (int)hWnd, OkCancel_WndProc, (int)a5);\r\n\t\tif (v14 != (char *)0xFF000000)\r\n\t\t\tbreak;\r\n\t\tv4 = a5[2] + 1;\r\n\t\tv5 = a5[2]++ - 1 < 0;\r\n\t\tif (!v5) {\r\n\t\t\tv7       = strlen(lpText);\r\n\t\t\tv8       = (char *)SMemAlloc(v7 + 256, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\OkCancel.cpp\", 392, 0);\r\n\t\t\tv11      = 0; /* check */\r\n\t\t\tlocation = v8;\r\n\t\t\tv14      = lpText;\r\n\t\t\tif (*lpText) {\r\n\t\t\t\tv9 = v11;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (*v14 <= 32)\r\n\t\t\t\t\t\tv9 = 0;\r\n\t\t\t\t\t*v8++  = *v14;\r\n\t\t\t\t\tif (++v9 > 18) {\r\n\t\t\t\t\t\t*v8++ = 10;\r\n\t\t\t\t\t\tv9    = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t++v14;\r\n\t\t\t\t} while (*v14);\r\n\t\t\t}\r\n\t\t\t*v8   = 0;\r\n\t\t\ta5[1] = (int)location;\r\n\t\t\tv14   = (char *)SDlgDialogBoxParam(ghUiInst, szDialog, (int)hWnd, OkCancel_WndProc, (int)a5);\r\n\t\t\tSMemFree(location, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\OkCancel.cpp\", 416, 0);\r\n\t\t\tif (v14 == (char *)0xFF000000)\r\n\t\t\t\tMessageBoxA(hWnd, lpText, lpCaption, uType);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "DiabloUI/progress.cpp",
    "content": "// ref: 0x10009480\r\nsigned int Progress_10009480() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A2EC = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A2EC: using guessed type int dword_1002A2EC;\r\n\r\n// ref: 0x1000948B\r\nBOOL __stdcall UiProgressDialog(HWND window, const char *msg, int enable, int(*fnfunc)(), int rate) { return 0; }\r\n/* {\r\n\tHWND v5; // eax\r\n\tBOOL result; // eax\r\n\r\n\tdword_1002A2E8 = -1;\r\n\tdword_1002A2F8 = 0;\r\n\tdword_1002A2F4 = a4;\r\n\tbEnable = a3;\r\n\tdword_1002A2F0 = a5;\r\n\tv5 = (HWND)SDlgCreateDialogParam(hInstance, \"PROGRESS_DIALOG\", a1, Progress_100094F4, a2);\r\n\tresult = 0;\r\n\tif ( v5 )\r\n\t{\r\n\t\tProgress_1000991C(v5);\r\n\t\tif ( dword_1002A2E8 != 2 && dword_1002A2E8 != -1 )\r\n\t\t\tresult = 1;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1001045A: using guessed type int __stdcall SDlgCreateDialogParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A2E8: using guessed type int dword_1002A2E8;\r\n// 1002A2F0: using guessed type int dword_1002A2F0;\r\n// 1002A2F4: using guessed type int (*dword_1002A2F4)(void);\r\n// 1002A2F8: using guessed type int dword_1002A2F8;\r\n\r\n// ref: 0x100094F4\r\nint __stdcall Progress_100094F4(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tvoid *v5; // eax\r\n\tHWND v7; // eax\r\n\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tShowCursor(FALSE);\r\n\t\tProgress_100095EC();\r\n\t}\r\n\telse if ( Msg > 0x103 )\r\n\t{\r\n\t\tif ( Msg <= 0x105 )\r\n\t\t{\r\n\t\t\tv7 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\tSendMessageA(v7, Msg, wParam, lParam);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tswitch ( Msg )\r\n\t\t\t{\r\n\t\t\t\tcase 0x110u:\r\n\t\t\t\t\tProgress_10009675(hWnd, (const CHAR *)lParam);\r\n\t\t\t\t\tv5 = (void *)SDrawGetFrameWindow(NULL);\r\n\t\t\t\t\tlocal_1000812B(v5);\r\n\t\t\t\t\tlocal_1000812B(hWnd);\r\n\t\t\t\t\tShowCursor(TRUE);\r\n\t\t\t\t\treturn 1;\r\n\t\t\t\tcase 0x111u:\r\n\t\t\t\t\tif ( (WORD)wParam == 2 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSDlgKillTimer(hWnd, 1);\r\n\t\t\t\t\t\tv4 = GetParent(hWnd);\r\n\t\t\t\t\t\tif ( (HWND)SDrawGetFrameWindow(NULL) == v4 )\r\n\t\t\t\t\t\t\tFade_100072BE(10);\r\n\t\t\t\t\t\tProgress_100098B0();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 0x113u:\r\n\t\t\t\t\tProgress_100098C5(hWnd);\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 10010418: using guessed type int __stdcall SDlgKillTimer(DWORD, DWORD);\r\n\r\n// ref: 0x100095EC\r\nvoid *Progress_100095EC() { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tif ( dword_1002A318 )\r\n\t{\r\n\t\tSMemFree(dword_1002A318, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Progress.cpp\", 88, 0);\r\n\t\tdword_1002A318 = 0;\r\n\t}\r\n\tif ( dword_1002A31C )\r\n\t{\r\n\t\tSMemFree(dword_1002A31C, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Progress.cpp\", 92, 0);\r\n\t\tdword_1002A31C = 0;\r\n\t}\r\n\tif ( dword_1002A320 )\r\n\t{\r\n\t\tSMemFree(dword_1002A320, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Progress.cpp\", 96, 0);\r\n\t\tdword_1002A320 = 0;\r\n\t}\r\n\tif ( dword_1002A324 )\r\n\t{\r\n\t\tSMemFree(dword_1002A324, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Progress.cpp\", 100, 0);\r\n\t\tdword_1002A324 = 0;\r\n\t}\r\n\tresult = dword_1002A328;\r\n\tif ( dword_1002A328 )\r\n\t{\r\n\t\tresult = SMemFree(dword_1002A328, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Progress.cpp\", 104, 0);\r\n\t\tdword_1002A328 = 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n// 1002A318: using guessed type int dword_1002A318;\r\n// 1002A31C: using guessed type int dword_1002A31C;\r\n// 1002A320: using guessed type int dword_1002A320;\r\n// 1002A324: using guessed type int dword_1002A324;\r\n// 1002A328: using guessed type int dword_1002A328;\r\n\r\n// ref: 0x10009675\r\nBOOL __fastcall Progress_10009675(HWND hWnd, const CHAR *a2) { return 0; }\r\n/* {\r\n\tHWND v2; // ebx\r\n\tHWND v3; // esi\r\n\tchar *v4; // esi\r\n\tHWND v5; // eax\r\n\tHWND v6; // esi\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-28h]\r\n\tchar v9; // [esp+1Ch] [ebp-18h]\r\n\tint v10; // [esp+24h] [ebp-10h]\r\n\tint v11; // [esp+28h] [ebp-Ch]\r\n\tLPCSTR lpString; // [esp+2Ch] [ebp-8h]\r\n\tHWND v13; // [esp+30h] [ebp-4h]\r\n\r\n\tv2 = hWnd;\r\n\tlpString = a2;\r\n\tv10 = 2;\r\n\tv11 = 0;\r\n\tif ( dword_1002A2F0 )\r\n\t\tSDlgSetTimer(hWnd, 1, 0x3E8u / dword_1002A2F0, 0);\r\n\telse\r\n\t\tSDlgSetTimer(hWnd, 1, 50, 0);\r\n\tlocal_10007944((int)v2, 0, &byte_10029448, -1, 1, (int)\"ui_art\\\\spopup.pcx\", &dword_1002A318, 0, 0);\r\n\tv3 = GetParent(v2);\r\n\tif ( (HWND)SDrawGetFrameWindow(NULL) == v3 )\r\n\t\tFade_100073EF(v2);\r\n\tv4 = local_10007895(0);\r\n\tSDrawUpdatePalette(0, 10, v4, 0);\r\n\tSDrawUpdatePalette(112, 144, v4 + 448, 1);\r\n\tlocal_100078BE((int)\"ui_art\\\\but_sml.pcx\", &dword_1002A31C, &v9);\r\n\tlocal_10007B1B(v2, &v10, dword_1002A31C, &v9);\r\n\tlocal_100078BE((int)\"ui_art\\\\prog_bg.pcx\", &dword_1002A320, &dword_1002A310);\r\n\tlocal_100078BE((int)\"ui_art\\\\prog_fil.pcx\", &dword_1002A324, &dword_1002A308);\r\n\tv13 = GetDlgItem(v2, 1030);\r\n\tGetClientRect(v13, &Rect);\r\n\tdword_1002A328 = SMemAlloc(Rect.right * Rect.bottom, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Progress.cpp\", 170, 0);\r\n\tdword_1002A300 = Rect.right;\r\n\tdword_1002A304 = Rect.bottom;\r\n\tSDlgSetBitmapI(v13, 0, 0, -1, 1, dword_1002A328, 0, Rect.right, Rect.bottom, -1);\r\n\tProgress_10009805(v2, 0);\r\n\tv5 = GetDlgItem(v2, 1031);\r\n\tSetWindowTextA(v5, lpString);\r\n\tv6 = GetDlgItem(v2, 2);\r\n\tShowWindow(v6, bEnable != 0);\r\n\treturn EnableWindow(v6, bEnable);\r\n} */\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 100103FA: using guessed type int __stdcall SDrawUpdatePalette(DWORD, DWORD, DWORD, DWORD);\r\n// 10010400: using guessed type int __stdcall SDlgSetBitmapI(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10010412: using guessed type int __stdcall SDlgSetTimer(DWORD, DWORD, DWORD, DWORD);\r\n// 1002A2F0: using guessed type int dword_1002A2F0;\r\n// 1002A300: using guessed type int dword_1002A300;\r\n// 1002A304: using guessed type int dword_1002A304;\r\n// 1002A308: using guessed type int dword_1002A308;\r\n// 1002A310: using guessed type int dword_1002A310;\r\n// 1002A318: using guessed type int dword_1002A318;\r\n// 1002A31C: using guessed type int dword_1002A31C;\r\n// 1002A320: using guessed type int dword_1002A320;\r\n// 1002A324: using guessed type int dword_1002A324;\r\n// 1002A328: using guessed type int dword_1002A328;\r\n\r\n// ref: 0x10009805\r\nBOOL __fastcall Progress_10009805(HWND hWnd, int a2) { return 0; }\r\n/* {\r\n\tHWND v2; // edi\r\n\tstruct tagRECT Rect; // [esp+8h] [ebp-18h]\r\n\tHWND hWnda; // [esp+18h] [ebp-8h]\r\n\tint v6; // [esp+1Ch] [ebp-4h]\r\n\r\n\tv2 = hWnd;\r\n\tv6 = a2;\r\n\thWnda = GetDlgItem(hWnd, 1030);\r\n\tSBltROP3(\r\n\t\tdword_1002A328,\r\n\t\tdword_1002A320,\r\n\t\tdword_1002A300,\r\n\t\tdword_1002A304,\r\n\t\tdword_1002A300,\r\n\t\tdword_1002A310,\r\n\t\t0,\r\n\t\t13369376);\r\n\tSBltROP3(\r\n\t\tdword_1002A328,\r\n\t\tdword_1002A324,\r\n\t\tv6 * dword_1002A300 / 100,\r\n\t\tdword_1002A304,\r\n\t\tdword_1002A300,\r\n\t\tdword_1002A308,\r\n\t\t0,\r\n\t\t13369376);\r\n\tGetWindowRect(hWnda, &Rect);\r\n\tScreenToClient(v2, (LPPOINT)&Rect);\r\n\tScreenToClient(v2, (LPPOINT)&Rect.right);\r\n\treturn InvalidateRect(v2, &Rect, 0);\r\n} */\r\n// 100103F4: using guessed type int __stdcall SBltROP3(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A300: using guessed type int dword_1002A300;\r\n// 1002A304: using guessed type int dword_1002A304;\r\n// 1002A308: using guessed type int dword_1002A308;\r\n// 1002A310: using guessed type int dword_1002A310;\r\n// 1002A320: using guessed type int dword_1002A320;\r\n// 1002A324: using guessed type int dword_1002A324;\r\n// 1002A328: using guessed type int dword_1002A328;\r\n\r\n// ref: 0x100098B0\r\nvoid Progress_100098B0() { return; }\r\n/* {\r\n\tdword_1002A2E8 = 2;\r\n\tdword_1002A2F8 = 1;\r\n} */\r\n// 1002A2E8: using guessed type int dword_1002A2E8;\r\n// 1002A2F8: using guessed type int dword_1002A2F8;\r\n\r\n// ref: 0x100098C5\r\nvoid UNKCALL Progress_100098C5(HWND hWnd) { return; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\tHWND v3; // edi\r\n\tint v4; // edx\r\n\r\n\tv1 = hWnd;\r\n\tv2 = dword_1002A2F4();\r\n\tif ( v2 >= 100 )\r\n\t{\r\n\t\tSDlgKillTimer(v1, 1);\r\n\t\tv3 = GetParent(v1);\r\n\t\tif ( (HWND)SDrawGetFrameWindow(NULL) == v3 )\r\n\t\t\tFade_100072BE(10);\r\n\t\tProgress_100098B0();\r\n\t\tdword_1002A2E8 &= v4;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tProgress_10009805(v1, v2);\r\n\t}\r\n} */\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 10010418: using guessed type int __stdcall SDlgKillTimer(DWORD, DWORD);\r\n// 1002A2E8: using guessed type int dword_1002A2E8;\r\n// 1002A2F4: using guessed type int (*dword_1002A2F4)(void);\r\n\r\n// ref: 0x1000991C\r\nBOOL UNKCALL Progress_1000991C(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tBOOL result; // eax\r\n\tstruct tagMSG Msg; // [esp+Ch] [ebp-1Ch]\r\n\r\n\tv1 = hWnd;\r\n\tfor ( result = IsWindow(hWnd); result; result = IsWindow(v1) )\r\n\t{\r\n\t\tif ( dword_1002A2F8 )\r\n\t\t\tgoto LABEL_12;\r\n\t\tif ( PeekMessageA(&Msg, 0, 0, 0, 1u) )\r\n\t\t{\r\n\t\t\tif ( Msg.message == 18 )\r\n\t\t\t{\r\n\t\t\t\tPostQuitMessage(Msg.wParam);\r\n\t\t\t}\r\n\t\t\telse if ( !IsDialogMessageA(v1, &Msg) )\r\n\t\t\t{\r\n\t\t\t\tTranslateMessage(&Msg);\r\n\t\t\t\tDispatchMessageA(&Msg);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tSDlgCheckTimers();\r\n\t\t\tSDlgUpdateCursor();\r\n\t\t}\r\n\t}\r\n\tif ( !dword_1002A2F8 )\r\n\t\treturn result;\r\nLABEL_12:\r\n\tresult = DestroyWindow(v1);\r\n\tdword_1002A2F8 = 0;\r\n\treturn result;\r\n} */\r\n// 10010460: using guessed type DWORD __stdcall SDlgUpdateCursor();\r\n// 10010466: using guessed type DWORD __stdcall SDlgCheckTimers();\r\n// 1002A2F8: using guessed type int dword_1002A2F8;\r\n"
  },
  {
    "path": "DiabloUI/sbar.cpp",
    "content": "// ref: 0x100099B5\r\nvoid __cdecl Sbar_cpp_init()\r\n{\r\n\tSbar_cpp_float = Sbar_cpp_float_value;\r\n}\r\n// 1001F448: using guessed type int Sbar_cpp_float_value;\r\n// 1002A338: using guessed type int Sbar_cpp_float;\r\n\r\n// ref: 0x100099C0\r\nBOOL __fastcall Sbar_CheckIfNextHero(HWND hWnd)\r\n{\r\n\t_uiheroinfo *v1; // eax\r\n\r\n\tv1 = (_uiheroinfo *)GetWindowLongA(hWnd, -21);\r\n\tif (!v1 || !v1->next)\r\n\t\treturn 0;\r\n\tv1->next = 0;\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x100099DC\r\nint __fastcall Sbar_NumScrollLines(HWND hWnd, int width, int height)\r\n{\r\n\tDWORD *v4;            // eax\r\n\tDWORD *v5;            // esi\r\n\tint result;            // eax\r\n\tsigned int v7;         // ecx\r\n\tLONG v8;               // ebx\r\n\tLONG v9;               // edi\r\n\tint v10;               // [esp-4h] [ebp-1Ch]\r\n\tstruct tagPOINT Point; // [esp+Ch] [ebp-Ch]\r\n\r\n\tPoint.x = width;\r\n\tPoint.y = height;\r\n\tif (!hWnd)\r\n\t\treturn 0;\r\n\tif (!IsWindowVisible(hWnd))\r\n\t\treturn 0;\r\n\tv4 = (DWORD *)GetWindowLongA(hWnd, -21);\r\n\tv5 = v4;\r\n\tif (!v4)\r\n\t\treturn 0;\r\n\tv7 = v4[13];\r\n\tif (v7 <= 1)\r\n\t\tv8 = 22;\r\n\telse\r\n\t\tv8 = v4[14] * (v4[3] - v4[9] - 44) / (v7 - 1) + 22;\r\n\tv9     = v8 + v4[9];\r\n\tScreenToClient(hWnd, &Point);\r\n\tif (Point.y >= 22) {\r\n\t\tif (Point.y >= v8) {\r\n\t\t\tif (Point.y >= v9) {\r\n\t\t\t\tif (Point.y >= v5[3] - 22) {\r\n\t\t\t\t\t*v5 = 4;\r\n\t\t\t\t\tv10 = 2;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t*v5 = 8;\r\n\t\t\t\t\tv10 = 4;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t*v5 = 16;\r\n\t\t\t\tv10 = 5;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t*v5 = 2;\r\n\t\t\tv10 = 3;\r\n\t\t}\r\n\t\tresult = v10;\r\n\t} else {\r\n\t\tresult = 1;\r\n\t\t*v5    = 1;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x10009A99\r\nvoid __fastcall Sbar_DrawScrollBar(HWND hWnd, int nIDDlgItem, int width, int height)\r\n{\r\n\tHWND v4;           // eax\r\n\tLONG v5;           // eax MAPDST\r\n\tbool v7;           // zf\r\n\tint v8;            // eax\r\n\ttagRECT DstRect;   // [esp+Ch] [ebp-24h]\r\n\ttagRECT SrcBuffer; // [esp+1Ch] [ebp-14h]\r\n\tHWND hWnda;        // [esp+2Ch] [ebp-4h]\r\n\r\n\tv4    = GetDlgItem(hWnd, nIDDlgItem);\r\n\thWnda = v4;\r\n\tif (v4) {\r\n\t\tv5 = GetWindowLongA(v4, -21);\r\n\t\tif (v5) {\r\n\t\t\tif (*(DWORD *)(v5 + 4)) {\r\n\t\t\t\tv7                   = *(DWORD *)(v5 + 16) == 0;\r\n\t\t\t\t*(DWORD *)(v5 + 52) = width;\r\n\t\t\t\t*(DWORD *)(v5 + 56) = height;\r\n\t\t\t\tif (!v7) {\r\n\t\t\t\t\tSrcBuffer.left   = 0;\r\n\t\t\t\t\tDstRect.left     = 0;\r\n\t\t\t\t\tSrcBuffer.top    = 0;\r\n\t\t\t\t\tDstRect.top      = 0;\r\n\t\t\t\t\tDstRect.right    = *(DWORD *)(v5 + 8) - 1;\r\n\t\t\t\t\tDstRect.bottom   = *(DWORD *)(v5 + 12) - 1;\r\n\t\t\t\t\tSrcBuffer.right  = *(DWORD *)(v5 + 8) - 1;\r\n\t\t\t\t\tSrcBuffer.bottom = *(DWORD *)(v5 + 24) - 1;\r\n\t\t\t\t\tSBltROP3Tiled(\r\n\t\t\t\t\t    *(void **)(v5 + 4),\r\n\t\t\t\t\t    &DstRect,\r\n\t\t\t\t\t    *(POINT **)(v5 + 8),\r\n\t\t\t\t\t    *(DWORD *)(v5 + 16),\r\n\t\t\t\t\t    &SrcBuffer,\r\n\t\t\t\t\t    *(RECT **)(v5 + 20),\r\n\t\t\t\t\t    0,\r\n\t\t\t\t\t    0,\r\n\t\t\t\t\t    0,\r\n\t\t\t\t\t    0xCC0020u);\r\n\t\t\t\t\tif (*(DWORD *)(v5 + 28)) {\r\n\t\t\t\t\t\tif (width <= 1)\r\n\t\t\t\t\t\t\tv8 = 22;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tv8 = height * (*(DWORD *)(v5 + 12) - *(DWORD *)(v5 + 36) - 44) / (width - 1) + 22;\r\n\t\t\t\t\t\tSBltROP3(\r\n\t\t\t\t\t\t    (void *)(v8 * *(DWORD *)(v5 + 8) + *(DWORD *)(v5 + 4) + 3),\r\n\t\t\t\t\t\t    *(void **)(v5 + 28),\r\n\t\t\t\t\t\t    18,\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 36),\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 8),\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 32),\r\n\t\t\t\t\t\t    0,\r\n\t\t\t\t\t\t    0xCC0020u);\r\n\t\t\t\t\t\tSBltROP3(\r\n\t\t\t\t\t\t    *(void **)(v5 + 4),\r\n\t\t\t\t\t\t    (void *)(*(DWORD *)(v5 + 40) + 22 * (~*(BYTE *)v5 & 1) * *(DWORD *)(v5 + 44)),\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 8),\r\n\t\t\t\t\t\t    22,\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 8),\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 44),\r\n\t\t\t\t\t\t    0,\r\n\t\t\t\t\t\t    0xCC0020u);\r\n\t\t\t\t\t\tSBltROP3(\r\n\t\t\t\t\t\t    (void *)(*(DWORD *)(v5 + 4) + *(DWORD *)(v5 + 8) * (*(DWORD *)(v5 + 12) - 22)),\r\n\t\t\t\t\t\t    (void *)(*(DWORD *)(v5 + 40) + 22 * ((~*(BYTE *)v5 & 4 | 8u) >> 2) * *(DWORD *)(v5 + 44)),\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 8),\r\n\t\t\t\t\t\t    22,\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 8),\r\n\t\t\t\t\t\t    *(DWORD *)(v5 + 44),\r\n\t\t\t\t\t\t    0,\r\n\t\t\t\t\t\t    0xCC0020u);\r\n\t\t\t\t\t\tInvalidateRect(hWnda, 0, 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x10009BF1\r\nvoid __fastcall Sbar_LoadScrBarGFX(HWND hWnd, int nIDDlgItem)\r\n{\r\n\tDWORD *v2;           // eax MAPDST\r\n\tvoid *v4;            // eax\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-14h]\r\n\tHWND hWnda;          // [esp+1Ch] [ebp-4h]\r\n\r\n\thWnda = GetDlgItem(hWnd, nIDDlgItem);\r\n\tif (hWnda) {\r\n\t\tv2 = (DWORD *)SMemAlloc(0x3Cu, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Sbar.cpp\", 221, 0);\r\n\t\tif (v2) {\r\n\t\t\tSetWindowLongA(hWnda, -21, (LONG)v2);\r\n\t\t\t*v2 = 0;\r\n\t\t\tGetClientRect(hWnda, &Rect);\r\n\t\t\tv2[2] = Rect.right;\r\n\t\t\tv2[3] = Rect.bottom;\r\n\t\t\tv4    = SMemAlloc(Rect.right * Rect.bottom, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Sbar.cpp\", 230, 0);\r\n\t\t\tv2[1] = (DWORD)v4;\r\n\t\t\tif (v4) {\r\n\t\t\t\tSDlgSetBitmapI(hWnda, 0, &nullcharacter, -1, 1, v4, 0, v2[2], v2[3], -1);\r\n\t\t\t\tlocal_LoadArtImage(\"ui_art\\\\sb_bg.pcx\", (BYTE **)v2 + 4, v2 + 5);\r\n\t\t\t\tlocal_LoadArtImage(\"ui_art\\\\sb_thumb.pcx\", (BYTE **)v2 + 7, v2 + 8);\r\n\t\t\t\tlocal_LoadArtImage(\"ui_art\\\\sb_arrow.pcx\", (BYTE **)v2 + 10, v2 + 11);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x10009CC7\r\nvoid __cdecl Sbar_cpp_init2()\r\n{\r\n\tSbar_cpp_float2 = Sbar_cpp_float_value2;\r\n}\r\n// 1001F44C: using guessed type int Sbar_cpp_float_value2;\r\n// 1002A344: using guessed type int Sbar_cpp_float2;\r\n\r\n// ref: 0x10009CD2\r\nvoid __fastcall Sbar_FreeScrollBar(HWND hWnd, int nIDDlgItem)\r\n{\r\n\tHWND v2;    // eax MAPDST\r\n\tDWORD *v4; // eax MAPDST\r\n\tvoid *v6;   // eax\r\n\tvoid *v7;   // eax\r\n\tvoid *v8;   // eax\r\n\tvoid *v9;   // eax\r\n\r\n\tv2 = GetDlgItem(hWnd, nIDDlgItem);\r\n\tif (v2) {\r\n\t\tv4 = (DWORD *)GetWindowLongA(v2, -21);\r\n\t\tif (v4) {\r\n\t\t\tv6 = (void *)v4[1];\r\n\t\t\tif (v6)\r\n\t\t\t\tSMemFree(v6, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Sbar.cpp\", 267, 0);\r\n\t\t\tv7 = (void *)v4[4];\r\n\t\t\tif (v7)\r\n\t\t\t\tSMemFree(v7, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Sbar.cpp\", 269, 0);\r\n\t\t\tv8 = (void *)v4[7];\r\n\t\t\tif (v8)\r\n\t\t\t\tSMemFree(v8, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Sbar.cpp\", 271, 0);\r\n\t\t\tv9 = (void *)v4[10];\r\n\t\t\tif (v9)\r\n\t\t\t\tSMemFree(v9, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Sbar.cpp\", 273, 0);\r\n\t\t\tSMemFree(v4, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Sbar.cpp\", 275, 0);\r\n\t\t\tSetWindowLongA(v2, -21, 0);\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "DiabloUI/selclass.cpp",
    "content": "// ref: 0x10009D66\r\nLRESULT __stdcall SelClass_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v4; // eax\r\n\tint v5;  // edx\r\n\tHWND v6; // eax\r\n\tHWND v7; // eax\r\n\tHWND v9; // eax\r\n\r\n\tif (Msg == 2) {\r\n\t\tSelClass_FreeClassMsgTbl(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg <= 0x103)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tif (Msg <= 0x105) {\r\n\t\tv9 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v9, Msg, wParam, lParam);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg == 272) {\r\n\t\tSelClass_LoadClassFocus(hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tif (Msg != 273) {\r\n\t\tif (Msg != 275) {\r\n\t\t\tif (Msg == 513) {\r\n\t\t\t\tv4 = GetDlgItem(hWnd, 1056);\r\n\t\t\t\tif (local_GetBottomRect(hWnd, v4, (unsigned short)lParam, (unsigned int)lParam >> 16)) {\r\n\t\t\t\t\tv5 = 1;\r\n\t\t\t\tLABEL_19:\r\n\t\t\t\t\tSelClass_CheckClassSpawn(hWnd, v5);\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\t}\r\n\t\t\t\tv6 = GetDlgItem(hWnd, 1054);\r\n\t\t\t\tif (local_GetBottomRect(hWnd, v6, (unsigned short)lParam, (unsigned int)lParam >> 16)) {\r\n\t\t\t\tLABEL_21:\r\n\t\t\t\t\tv5 = 2;\r\n\t\t\t\t\tgoto LABEL_19;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tv7 = GetFocus();\r\n\t\tFocus_DoBlitSpinIncFrame(hWnd, v7);\r\n\t\treturn 0;\r\n\t}\r\n\tif (HIWORD(wParam) == 7) {\r\n\t\tFocus_GetAndBlitSpin(hWnd, lParam);\r\n\t} else {\r\n\t\tif (HIWORD(wParam) != 6) {\r\n\t\t\tv5 = 1;\r\n\t\t\tif (HIWORD(wParam) == 5 || (WORD)wParam == 1)\r\n\t\t\t\tgoto LABEL_19;\r\n\t\t\tif ((WORD)wParam != 2)\r\n\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\tgoto LABEL_21;\r\n\t\t}\r\n\t\tFocus_CheckPlayMove(lParam);\r\n\t\tFocus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);\r\n\t\tSelClass_SetDefaultStats(hWnd, (unsigned short)wParam);\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10009EC0\r\nvoid __fastcall SelClass_FreeClassMsgTbl(HWND hWnd)\r\n{\r\n\tHWND v2; // eax\r\n\r\n\tFocus_DeleteSpinners();\r\n\tDoom_DeleteFreeProcs(hWnd, selclass_msgtbl3);\r\n\tDoom_DeleteFreeProcs(hWnd, selclass_msgtbl2);\r\n\tDoom_DeleteFreeProcs(hWnd, selclass_msgtbl1);\r\n\tv2 = GetParent(hWnd);\r\n\tSelHero_SetStringWithMsg(v2, 0);\r\n}\r\n\r\n// ref: 0x10009EFD\r\nvoid __fastcall SelClass_LoadClassFocus(HWND hWnd)\r\n{\r\n\tHWND v1;         // edi\r\n\tHWND v2;         // esi\r\n\tLONG v3;         // eax\r\n\tchar Buffer[32]; // [esp+8h] [ebp-20h]\r\n\r\n\tv1 = hWnd;\r\n\tv2 = GetParent(hWnd);\r\n\tif (SelHero_GetHeroIsGood() == 1)\r\n\t\tLoadStringA(ghUiInst, 0x20u, Buffer, 31);\r\n\telse\r\n\t\tLoadStringA(ghUiInst, 0x1Fu, Buffer, 31);\r\n\tSelHero_SetStringWithMsg(v2, Buffer);\r\n\tv3 = GetWindowLongA(v2, -21);\r\n\tSetWindowLongA(v1, -21, v3);\r\n\tlocal_DoUiWndProc(v1, (DWORD *)selclass_msgtbl3);\r\n\tDoom_ParseWndProc3(v1, selclass_msgtbl1, AF_BIGGRAY);\r\n\tDoom_ParseWndProcs(v1, selclass_msgtbl2, AF_BIG, 0);\r\n\tDoom_ParseWndProcs(v1, selclass_msgtbl3, AF_MED, 1);\r\n\tFocus_LoadSpinner(\"ui_art\\\\focus.pcx\");\r\n\tSDlgSetTimer((int)v1, 1, 55, 0);\r\n}\r\n\r\n// ref: 0x10009FA2\r\nvoid __fastcall SelClass_SetDefaultStats(HWND hWnd, int a2)\r\n{\r\n\tchar v2;             // bl\r\n\tHWND v4;             // eax\r\n\t_uiheroinfo pInfo;   // [esp+8h] [ebp-34h]\r\n\t_uidefaultstats a2a; // [esp+34h] [ebp-8h]\r\n\r\n\tv2 = a2;\r\n\tSelHero_SetClassStats(a2 - 1062, &a2a);\r\n\tmemset(&pInfo, 0, 0x2Cu);\r\n\tpInfo.strength  = a2a.strength;\r\n\tpInfo.magic     = a2a.magic;\r\n\tpInfo.dexterity = a2a.dexterity;\r\n\tpInfo.vitality  = a2a.vitality;\r\n\tpInfo.level     = 1;\r\n\tpInfo.heroclass = v2 - 38;\r\n\tv4              = GetParent(hWnd);\r\n\tSelHero_PrintHeroInfo(v4, &pInfo);\r\n}\r\n\r\n// ref: 0x1000A00D\r\nvoid __fastcall SelClass_CheckClassSpawn(HWND hWnd, int a2)\r\n{\r\n\tHWND v4; // eax\r\n\tHWND v5; // eax\r\n\r\n\tif (DiabloUI_GetSpawned() && a2 == 1 && (v4 = GetFocus(), GetWindowLongA(v4, -12) != 1062)) {\r\n\t\tSelYesNo_SpawnErrDialog(hWnd, 69, 0);\r\n\t} else {\r\n\t\tTitleSnd_PlaySelectSound();\r\n\t\tSDlgKillTimer((int)hWnd, 1);\r\n\t\tif (a2 == 1) {\r\n\t\t\tv5 = GetFocus();\r\n\t\t\ta2 = GetWindowLongA(v5, -12);\r\n\t\t}\r\n\t\tSDlgEndDialog(hWnd, (HANDLE)a2);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000A077\r\nvoid __cdecl SelClass_cpp_init()\r\n{\r\n\tSelClass_cpp_float = SelClass_cpp_float_value;\r\n}\r\n// 1001F450: using guessed type int SelClass_cpp_float_value;\r\n// 1002A348: using guessed type int SelClass_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/selconn.cpp",
    "content": "// ref: 0x1000A082\r\nvoid *SelConn_1000A082() { return 0; }\r\n/* {\r\n\treturn SMemAlloc(272, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelConn.cpp\", 124, 0);\r\n} */\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000A09B\r\nsigned int SelConn_1000A09B() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A350 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A350: using guessed type int dword_1002A350;\r\n\r\n// ref: 0x1000A0A6\r\nint __stdcall SelConn_1000A0A6(HWND hWnd, UINT Msg, WPARAM wParam, unsigned int lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tHWND v6; // eax\r\n\tchar *v7; // [esp+0h] [ebp-Ch]\r\n\tint v8; // [esp+4h] [ebp-8h]\r\n\r\n\tif ( Msg > 0x201 )\r\n\t{\r\n\t\tif ( Msg == 514 )\r\n\t\t{\r\n\t\t\tv6 = GetDlgItem(hWnd, 1105);\r\n\t\t\tif ( !Sbar_100099C0(v6) )\r\n\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\tgoto LABEL_27;\r\n\t\t}\r\n\t\tif ( Msg != 515 )\r\n\t\t{\r\n\t\t\tif ( Msg != 2024 )\r\n\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\tif ( !Fade_1000739F() )\r\n\t\t\t\tFade_100073FD(hWnd, (int)v7);\r\n\t\t\treturn 0;\r\n\t\t}\r\nLABEL_25:\r\n\t\tSelConn_1000AE59(hWnd, (unsigned short)lParam, lParam >> 16);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 513 )\r\n\t\tgoto LABEL_25;\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tSelConn_1000A43A(hWnd);\r\n\t\tBNetGW_10002A07(&unk_10029480);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg <= 0x103 )\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tif ( Msg <= 0x105 )\r\n\t{\r\n\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 272 )\r\n\t{\r\n\t\tBNetGW_100028C2(&unk_10029480);\r\n\t\tSelConn_1000A4E4(hWnd, v7, v8);\r\n\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 273 )\r\n\t{\r\n\t\tif ( HIWORD(wParam) == 7 )\r\n\t\t{\r\n\t\t\tFocus_100075B7(hWnd, (HWND)lParam);\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tif ( HIWORD(wParam) != 6 )\r\n\t\t{\r\n\t\t\tif ( wParam == 327681 )\r\n\t\t\t{\r\n\t\t\t\tSelConn_1000AC30(hWnd);\r\n\t\t\t}\r\n\t\t\telse if ( (WORD)wParam == 2 )\r\n\t\t\t{\r\n\t\t\t\tSelConn_1000AC07((int)hWnd, 2);\r\n\t\t\t}\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tFocus_10007458((void *)lParam);\r\n\t\tFocus_100075DC(hWnd, (HWND)lParam);\r\n\t\tSelConn_1000A226(hWnd, (unsigned short)wParam);\r\nLABEL_27:\r\n\t\tSelConn_1000A3E2(hWnd);\r\n\t}\r\n\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000A226\r\nHWND __fastcall SelConn_1000A226(HWND hDlg, int nIDDlgItem) { return 0; }\r\n/* {\r\n\tHWND v2; // edi\r\n\tHWND result; // eax\r\n\tint v4; // ebx\r\n\tint v5; // eax\r\n\tHWND v6; // ebp\r\n\tunsigned int v7; // eax\r\n\tint v8; // eax\r\n\tconst char *v9; // ebx\r\n\tint v10; // eax\r\n\tHWND v11; // eax\r\n\tHWND v12; // eax\r\n\tHWND v13; // eax\r\n\tHWND v14; // eax\r\n\tHWND v15; // eax\r\n\tHWND v16; // eax\r\n\tHWND v17; // eax\r\n\tHWND v18; // eax\r\n\tHWND hWnd; // [esp+10h] [ebp-8Ch]\r\n\tCHAR Buffer; // [esp+14h] [ebp-88h]\r\n\tCHAR v21; // [esp+54h] [ebp-48h]\r\n\r\n\tv2 = hDlg;\r\n\tresult = GetDlgItem(hDlg, nIDDlgItem);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv4 = *((DWORD *)result + 3);\r\n\t\t\tif ( v4 )\r\n\t\t\t{\r\n\t\t\t\tresult = GetDlgItem(v2, 1081);\r\n\t\t\t\tif ( result )\r\n\t\t\t\t{\r\n\t\t\t\t\tv5 = GetWindowLongA(result, -21);\r\n\t\t\t\t\tlocal_10007FA4(v5, (const char *)(v4 + 144));\r\n\t\t\t\t\tresult = GetDlgItem(v2, 1076);\r\n\t\t\t\t\tv6 = result;\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tLoadStringA(hInstance, 0x21u, &Buffer, 63);\r\n\t\t\t\t\t\tif ( dword_1002A370 )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv7 = *(DWORD *)(dword_1002A370 + 24);\r\n\t\t\t\t\t\t\tif ( v7 >= *(DWORD *)(v4 + 12) )\r\n\t\t\t\t\t\t\t\tv7 = *(DWORD *)(v4 + 12);\r\n\t\t\t\t\t\t\twsprintfA(&v21, &Buffer, v7);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\twsprintfA(&v21, &Buffer, *(DWORD *)(v4 + 12));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tv8 = GetWindowLongA(v6, -21);\r\n\t\t\t\t\t\tlocal_10007FA4(v8, &v21);\r\n\t\t\t\t\t\tif ( *(DWORD *)(v4 + 8) == 1112425812 )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\thWnd = GetDlgItem(v2, 1144);\r\n\t\t\t\t\t\t\tv9 = BNetGW_10002B21(&unk_10029480, dword_1002948C);\r\n\t\t\t\t\t\t\tif ( !v9 )\r\n\t\t\t\t\t\t\t\tv9 = &byte_10029448;\r\n\t\t\t\t\t\t\tif ( hWnd )\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tv10 = GetWindowLongA(hWnd, -21);\r\n\t\t\t\t\t\t\t\tlocal_10007FA4(v10, v9);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tv11 = GetDlgItem(v2, 1143);\r\n\t\t\t\t\t\t\tShowWindow(v11, 5);\r\n\t\t\t\t\t\t\tv12 = GetDlgItem(v2, 1147);\r\n\t\t\t\t\t\t\tShowWindow(v12, 0);\r\n\t\t\t\t\t\t\tv13 = GetDlgItem(v2, 1144);\r\n\t\t\t\t\t\t\tShowWindow(v13, 5);\r\n\t\t\t\t\t\t\tv14 = GetDlgItem(v2, 1145);\r\n\t\t\t\t\t\t\tShowWindow(v14, 5);\r\n\t\t\t\t\t\t\tdword_1002A354 = 1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv15 = GetDlgItem(v2, 1143);\r\n\t\t\t\t\t\t\tShowWindow(v15, 0);\r\n\t\t\t\t\t\t\tv16 = GetDlgItem(v2, 1147);\r\n\t\t\t\t\t\t\tShowWindow(v16, 5);\r\n\t\t\t\t\t\t\tv17 = GetDlgItem(v2, 1144);\r\n\t\t\t\t\t\t\tShowWindow(v17, 0);\r\n\t\t\t\t\t\t\tv18 = GetDlgItem(v2, 1145);\r\n\t\t\t\t\t\t\tShowWindow(v18, 0);\r\n\t\t\t\t\t\t\tdword_1002A354 = 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tresult = (HWND)Doom_10006A13(v2, (int *)&unk_10022EF0, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002948C: using guessed type int dword_1002948C;\r\n// 1002A354: using guessed type int dword_1002A354;\r\n// 1002A370: using guessed type int dword_1002A370;\r\n\r\n// ref: 0x1000A3E2\r\nHWND UNKCALL SelConn_1000A3E2(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = SelConn_1000A3FF();\r\n\treturn Sbar_10009A99(v1, 1105, dword_1002A360, v2);\r\n} */\r\n\r\n// ref: 0x1000A3FF\r\nint SelConn_1000A3FF() { return 0; }\r\n/* {\r\n\tHWND v0; // eax\r\n\tLONG v1; // eax\r\n\tDWORD *v2; // ecx\r\n\tDWORD *v3; // eax\r\n\tint v5; // edx\r\n\r\n\tv0 = GetFocus();\r\n\tif ( !v0 )\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(v0, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = (DWORD *)dword_1002A35C;\r\n\tif ( !dword_1002A35C )\r\n\t\treturn 0;\r\n\tv3 = *(DWORD **)(v1 + 12);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( v2 == v3 )\r\n\t\t\tbreak;\r\n\t\tv2 = (DWORD *)*v2;\r\n\t\t++v5;\r\n\t}\r\n\twhile ( v2 );\r\n\treturn v5;\r\n} */\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n\r\n// ref: 0x1000A43A\r\nvoid UNKCALL SelConn_1000A43A(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tDWORD *v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tTitle_100100E7(hDlg);\r\n\tFocus_10007818(v1);\r\n\tSbar_10009CD2(v1, 1105);\r\n\tSelConn_1000A4B9((DWORD *)dword_1002A35C);\r\n\tDoom_10006C53(v1, &dword_10022F18);\r\n\tDoom_10006C53(v1, (int *)&unk_10022F08);\r\n\tDoom_10006C53(v1, (int *)&unk_10022ED8);\r\n\tDoom_10006C53(v1, (int *)&unk_10022EE4);\r\n\tDoom_10006C53(v1, (int *)&unk_10022F00);\r\n\tDoom_10006C53(v1, (int *)&unk_10022EF0);\r\n\tv2 = (DWORD *)GetWindowLongA(v1, -21);\r\n\tlocal_10007F72(v2);\r\n} */\r\n// 10022F18: using guessed type int dword_10022F18;\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n\r\n// ref: 0x1000A4B9\r\nint __fastcall SelConn_1000A4B9(DWORD *a1) { return 0; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tint result; // eax\r\n\r\n\tif ( a1 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv1 = (DWORD *)*a1;\r\n\t\t\tresult = SelConn_1000A4CD(a1);\r\n\t\t\ta1 = v1;\r\n\t\t}\r\n\t\twhile ( v1 );\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000A4CD\r\nint UNKCALL SelConn_1000A4CD(void *arg) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tif ( arg )\r\n\t\tresult = SMemFree(arg, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelConn.cpp\", 130, 0);\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000A4E4\r\nHWND UNKCALL SelConn_1000A4E4(HWND hWnd, char *a2, int a3) { return 0; }\r\n/* {\r\n\tHWND v3; // esi\r\n\tHWND v4; // ST1C_4\r\n\tint v5; // eax\r\n\tint *v6; // edi\r\n\tHWND result; // eax\r\n\tHWND v8; // eax\r\n\tHWND v9; // [esp+0h] [ebp-Ch]\r\n\r\n\tv3 = hWnd;\r\n\tSelConn_1000A6EC(hWnd);\r\n\tFocus_100077E9((int)v3, \"ui_art\\\\focus16.pcx\", v9);\r\n\tTitle_1001009E(v3, (int)\"ui_art\\\\smlogo.pcx\", v4);\r\n\tv5 = local_10007F46();\r\n\tv6 = (int *)v5;\r\n\tif ( v5 )\r\n\t{\r\n\t\tSetWindowLongA(v3, -21, v5);\r\n\t\tlocal_10007944((int)v3, 0, &byte_10029448, -1, 1, (int)\"ui_art\\\\selconn.pcx\", v6, v6 + 1, 0);\r\n\t\tFade_100073C5(v3, 1);\r\n\t}\r\n\tDoom_100068AB(v3, (int *)&unk_10022EF0, 1);\r\n\tDoom_100068AB(v3, (int *)&unk_10022F00, 1);\r\n\tDoom_100068AB(v3, (int *)&unk_10022ED8, 5);\r\n\tDoom_100068AB(v3, (int *)&unk_10022EE4, 3);\r\n\tDoom_1000658C(v3, (int *)&unk_10022F08, 4, 0);\r\n\tDoom_1000658C(v3, &dword_10022F18, 0, 1);\r\n\tdword_1002A360 = 0;\r\n\tdword_1002A368 = dword_10029488;\r\n\tdword_1002A35C = 0;\r\n\tSNetEnumProviders(0, SelConn_1000A5F3);\r\n\tSelConn_1000A670(v3, (const char *)dword_1002A35C);\r\n\tresult = Sbar_10009BF1(v3, 1105);\r\n\tif ( dword_1002A360 <= 6 )\r\n\t{\r\n\t\tv8 = GetDlgItem(v3, 1105);\r\n\t\tresult = (HWND)ShowWindow(v8, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010472: using guessed type int __stdcall SNetEnumProviders(DWORD, DWORD);\r\n// 10022F18: using guessed type int dword_10022F18;\r\n// 10029488: using guessed type int dword_10029488;\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n// 1002A368: using guessed type int dword_1002A368;\r\n\r\n// ref: 0x1000A5F3\r\nsigned int __stdcall SelConn_1000A5F3(int a1, char *a2, char *a3, int a4) { return 0; }\r\n/* {\r\n\tint v4; // esi\r\n\tint v6; // edx\r\n\tDWORD *v7; // eax\r\n\r\n\tv4 = SelConn_1000A082();\r\n\tif ( !v4 || a1 == 1112425812 && !dword_1002A368 )\r\n\t\treturn 0;\r\n\t*(DWORD *)v4 = 0;\r\n\tv6 = *(DWORD *)(a4 + 4);\r\n\t*(DWORD *)(v4 + 8) = a1;\r\n\t*(DWORD *)(v4 + 4) = v6 & 2;\r\n\t*(DWORD *)(v4 + 12) = *(DWORD *)(a4 + 16);\r\n\tstrcpy((char *)(v4 + 16), a2);\r\n\tstrcpy((char *)(v4 + 144), a3);\r\n\tv7 = SelRegn_1000EF56(dword_1002A35C, (DWORD *)v4);\r\n\t++dword_1002A360;\r\n\tdword_1002A35C = (int)v7;\r\n\treturn 1;\r\n} */\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n// 1002A368: using guessed type int dword_1002A368;\r\n\r\n// ref: 0x1000A670\r\nint __fastcall SelConn_1000A670(HWND a1, const char *a2) { return 0; }\r\n/* {\r\n\tconst char *v2; // edi\r\n\tint *v3; // ebx\r\n\tHWND v4; // eax\r\n\tHWND v5; // esi\r\n\tint v6; // eax\r\n\tHWND hDlg; // [esp+8h] [ebp-4h]\r\n\r\n\tv2 = a2;\r\n\thDlg = a1;\r\n\tv3 = &dword_10022F18;\r\n\tif ( dword_10022F18 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv4 = GetDlgItem(hDlg, *v3);\r\n\t\t\tv5 = v4;\r\n\t\t\tif ( v4 )\r\n\t\t\t{\r\n\t\t\t\tif ( v2 )\r\n\t\t\t\t{\r\n\t\t\t\t\tEnableWindow(v4, 1);\r\n\t\t\t\t\tv6 = GetWindowLongA(v5, -21);\r\n\t\t\t\t\tif ( v6 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t*(DWORD *)(v6 + 12) = v2;\r\n\t\t\t\t\t\tlocal_10007FA4(v6, v2 + 16);\r\n\t\t\t\t\t\tv2 = *(const char **)v2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tEnableWindow(v4, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t++v3;\r\n\t\t}\r\n\t\twhile ( *v3 );\r\n\t}\r\n\treturn Doom_1000680A(hDlg, &dword_10022F18, 0, 1);\r\n} */\r\n// 10022F18: using guessed type int dword_10022F18;\r\n\r\n// ref: 0x1000A6EC\r\nvoid UNKCALL SelConn_1000A6EC(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // ebx\r\n\tint *v2; // edi\r\n\tHWND v3; // eax\r\n\tHWND v4; // esi\r\n\tvoid *v5; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = &dword_10022F18;\r\n\tif ( dword_10022F18 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv3 = GetDlgItem(v1, *v2);\r\n\t\t\tv4 = v3;\r\n\t\t\tif ( v3 )\r\n\t\t\t{\r\n\t\t\t\tv5 = (void *)GetWindowLongA(v3, -4);\r\n\t\t\t\tSetPropA(v4, \"UIOLDPROC\", v5);\r\n\t\t\t\tSetWindowLongA(v4, -4, (LONG)SelConn_1000A73E);\r\n\t\t\t}\r\n\t\t\t++v2;\r\n\t\t}\r\n\t\twhile ( *v2 );\r\n\t}\r\n} */\r\n// 10022F18: using guessed type int dword_10022F18;\r\n\r\n// ref: 0x1000A73E\r\nLRESULT __stdcall SelConn_1000A73E(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tLRESULT (__stdcall *v4)(HWND, UINT, WPARAM, LPARAM); // edi\r\n\tHWND v5; // eax\r\n\tWPARAM v7; // [esp-8h] [ebp-14h]\r\n\r\n\tv4 = (LRESULT (__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, \"UIOLDPROC\");\r\n\tswitch ( Msg )\r\n\t{\r\n\t\tcase 2u:\r\n\t\t\tRemovePropA(hWnd, \"UIOLDPROC\");\r\n\t\t\tif ( !v4 )\r\n\t\t\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t\t\tSetWindowLongA(hWnd, -4, (LONG)v4);\r\n\t\t\tbreak;\r\n\t\tcase 0xFu:\r\n\t\t\tlocal_10007C95(hWnd);\r\n\t\t\treturn 0;\r\n\t\tcase 0x87u:\r\n\t\t\treturn 4;\r\n\t\tcase 0x100u:\r\n\t\t\tif ( wParam > 0x21 )\r\n\t\t\t{\r\n\t\t\t\tif ( wParam == 34 )\r\n\t\t\t\t{\r\n\t\t\t\t\tSelConn_1000A948(hWnd);\r\n\t\t\t\t}\r\n\t\t\t\telse if ( wParam > 0x24 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( wParam <= 0x26 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelConn_1000AB83(hWnd);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ( wParam <= 0x28 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelConn_1000AAEB(hWnd);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam == 33 )\r\n\t\t\t{\r\n\t\t\t\tSelConn_1000AA3B(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam == 9 )\r\n\t\t\t{\r\n\t\t\t\tif ( GetKeyState(16) >= 0 )\r\n\t\t\t\t\tSelConn_1000A866(hWnd);\r\n\t\t\t\telse\r\n\t\t\t\t\tSelConn_1000A8D7(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam != 13 )\r\n\t\t\t{\r\n\t\t\t\tif ( wParam == 27 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv7 = 2;\r\n\t\t\t\t\tgoto LABEL_13;\r\n\t\t\t\t}\r\n\t\t\t\tif ( wParam != 32 )\r\n\t\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tv7 = 1;\r\nLABEL_13:\r\n\t\t\tv5 = GetParent(hWnd);\r\n\t\t\tSendMessageA(v5, 0x111u, v7, 0);\r\n\t\t\treturn 0;\r\n\t}\r\n\tif ( v4 )\r\n\t\treturn CallWindowProcA(v4, hWnd, Msg, wParam, lParam);\r\n\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n} */\r\n\r\n// ref: 0x1000A866\r\nHWND UNKCALL SelConn_1000A866(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1066]; // [esp+0h] [ebp-10CCh]\r\n\tint v5; // [esp+10A8h] [ebp-24h]\r\n\tint v6; // [esp+10B4h] [ebp-18h]\r\n\tint v7; // [esp+10B8h] [ebp-14h]\r\n\tint v8; // [esp+10BCh] [ebp-10h]\r\n\tint v9; // [esp+10C0h] [ebp-Ch]\r\n\tint v10; // [esp+10C4h] [ebp-8h]\r\n\tint v11; // [esp+10C8h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1070;\r\n\tv7 = 1071;\r\n\tv8 = 1072;\r\n\tv9 = 1073;\r\n\tv10 = 1074;\r\n\tv11 = 1069;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000A866: using guessed type int nIDDlgItem[1066];\r\n\r\n// ref: 0x1000A8D7\r\nHWND UNKCALL SelConn_1000A8D7(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1066]; // [esp+0h] [ebp-10CCh]\r\n\tint v5; // [esp+10A8h] [ebp-24h]\r\n\tint v6; // [esp+10B4h] [ebp-18h]\r\n\tint v7; // [esp+10B8h] [ebp-14h]\r\n\tint v8; // [esp+10BCh] [ebp-10h]\r\n\tint v9; // [esp+10C0h] [ebp-Ch]\r\n\tint v10; // [esp+10C4h] [ebp-8h]\r\n\tint v11; // [esp+10C8h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1074;\r\n\tv7 = 1069;\r\n\tv8 = 1070;\r\n\tv9 = 1071;\r\n\tv10 = 1072;\r\n\tv11 = 1073;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000A8D7: using guessed type int nIDDlgItem[1066];\r\n\r\n// ref: 0x1000A948\r\nHWND UNKCALL SelConn_1000A948(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // ebp\r\n\tHWND result; // eax\r\n\tHWND v3; // esi\r\n\tHWND v4; // ebx\r\n\tHWND v5; // eax\r\n\tDWORD *v6; // eax\r\n\tint v7; // eax\r\n\tconst char *v8; // ebx\r\n\tint v9; // eax\r\n\r\n\tv1 = hWnd;\r\n\tresult = GetParent(hWnd);\r\n\tv3 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1069);\r\n\t\tv4 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv5 = GetDlgItem(v3, 1074);\r\n\t\t\tresult = (HWND)GetWindowLongA(v5, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tv6 = (DWORD *)*((DWORD *)result + 3);\r\n\t\t\t\tif ( v6 && *v6 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv7 = SelConn_1000A9F3(v4) + 6;\r\n\t\t\t\t\tif ( v7 > dword_1002A360 - 6 )\r\n\t\t\t\t\t\tv7 = dword_1002A360 - 6;\r\n\t\t\t\t\tresult = (HWND)SelConn_1000AA28(v7);\r\n\t\t\t\t\tv8 = (const char *)result;\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\tSelConn_1000A670(v3, v8);\r\n\t\t\t\t\t\tv9 = GetWindowLongA(v1, -12);\r\n\t\t\t\t\t\tSelConn_1000A226(v3, v9);\r\n\t\t\t\t\t\tresult = SelConn_1000A3E2(v3);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelConn_1000A8D7(v4);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000A9F3\r\nint UNKCALL SelConn_1000A9F3(HWND hWnd) { return 0; }\r\n/* {\r\n\tLONG v1; // eax\r\n\tDWORD *v2; // ecx\r\n\tDWORD *v3; // eax\r\n\tint v5; // edx\r\n\r\n\tif ( !hWnd )\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(hWnd, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = (DWORD *)dword_1002A35C;\r\n\tif ( !dword_1002A35C )\r\n\t\treturn 0;\r\n\tv3 = *(DWORD **)(v1 + 12);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( v2 == v3 )\r\n\t\t\tbreak;\r\n\t\tv2 = (DWORD *)*v2;\r\n\t\t++v5;\r\n\t}\r\n\twhile ( v2 );\r\n\treturn v5;\r\n} */\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n\r\n// ref: 0x1000AA28\r\nDWORD *__fastcall SelConn_1000AA28(int a1) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\r\n\tresult = (DWORD *)dword_1002A35C;\r\n\twhile ( result && a1 )\r\n\t{\r\n\t\tresult = (DWORD *)*result;\r\n\t\t--a1;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n\r\n// ref: 0x1000AA3B\r\nHWND UNKCALL SelConn_1000AA3B(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND result; // eax\r\n\tHWND v2; // esi\r\n\tHWND v3; // edi\r\n\tHWND v4; // eax\r\n\tint v5; // eax\r\n\tconst char *v6; // edi\r\n\tint v7; // eax\r\n\tHWND hWnda; // [esp+10h] [ebp-4h]\r\n\r\n\thWnda = hWnd;\r\n\tresult = GetParent(hWnd);\r\n\tv2 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1069);\r\n\t\tv3 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\t\t\tif ( result )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( result == (HWND)dword_1002A35C )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv4 = GetDlgItem(v2, 1074);\r\n\t\t\t\t\t\tresult = SelConn_1000A866(v4);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv5 = SelConn_1000A9F3(v3) - 6;\r\n\t\t\t\t\t\tif ( v5 < 0 )\r\n\t\t\t\t\t\t\tv5 = 0;\r\n\t\t\t\t\t\tresult = (HWND)SelConn_1000AA28(v5);\r\n\t\t\t\t\t\tv6 = (const char *)result;\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\tSelConn_1000A670(v2, v6);\r\n\t\t\t\t\t\t\tv7 = GetWindowLongA(hWnda, -12);\r\n\t\t\t\t\t\t\tSelConn_1000A226(v2, v7);\r\n\t\t\t\t\t\t\tresult = SelConn_1000A3E2(v2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n\r\n// ref: 0x1000AAEB\r\nHWND UNKCALL SelConn_1000AAEB(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tHWND v3; // eax\r\n\tconst char *v4; // ebp\r\n\tHWND v5; // eax\r\n\tint v6; // ebx\r\n\tHWND v7; // eax\r\n\tHWND v8; // eax\r\n\r\n\tv1 = hWnd;\r\n\tresult = (HWND)GetWindowLongA(hWnd, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tif ( *(DWORD *)result )\r\n\t\t\t{\r\n\t\t\t\tif ( GetWindowLongA(v1, -12) >= 1074 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv3 = GetParent(v1);\r\n\t\t\t\t\tresult = GetDlgItem(v3, 1070);\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv4 = (const char *)*((DWORD *)result + 3);\r\n\t\t\t\t\t\t\tif ( v4 )\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\t\tv5 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tSelConn_1000A670(v5, v4);\r\n\t\t\t\t\t\t\t\tv6 = GetWindowLongA(v1, -12);\r\n\t\t\t\t\t\t\t\tv7 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tSelConn_1000A226(v7, v6);\r\n\t\t\t\t\t\t\t\tv8 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tresult = SelConn_1000A3E2(v8);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelConn_1000A866(v1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000AB83\r\nHWND UNKCALL SelConn_1000AB83(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tconst char *v3; // ebx\r\n\tHWND v4; // eax\r\n\tint v5; // ebx\r\n\tHWND v6; // eax\r\n\tHWND v7; // eax\r\n\r\n\tv1 = hWnd;\r\n\tif ( GetWindowLongA(hWnd, -12) > 1069 )\r\n\t\treturn SelConn_1000A8D7(v1);\r\n\tresult = (HWND)GetWindowLongA(v1, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv3 = (const char *)dword_1002A35C;\r\n\t\t\tif ( result != (HWND)dword_1002A35C )\r\n\t\t\t{\r\n\t\t\t\twhile ( v3 && *(HWND *)v3 != result )\r\n\t\t\t\t\tv3 = *(const char **)v3;\r\n\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\tv4 = GetParent(v1);\r\n\t\t\t\tSelConn_1000A670(v4, v3);\r\n\t\t\t\tv5 = GetWindowLongA(v1, -12);\r\n\t\t\t\tv6 = GetParent(v1);\r\n\t\t\t\tSelConn_1000A226(v6, v5);\r\n\t\t\t\tv7 = GetParent(v1);\r\n\t\t\t\tresult = SelConn_1000A3E2(v7);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A35C: using guessed type int dword_1002A35C;\r\n\r\n// ref: 0x1000AC07\r\nint __fastcall SelConn_1000AC07(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // esi\r\n\tint v3; // edi\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tif ( a2 == 2 )\r\n\t\tTitleSnd_1001031F();\r\n\tFade_100073B4();\r\n\tFade_100072BE(10);\r\n\treturn SDlgEndDialog(v3, v2);\r\n} */\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n\r\n// ref: 0x1000AC30\r\nint UNKCALL SelConn_1000AC30(HWND arg) { return 0; }\r\n/* {\r\n\tint v1; // esi\r\n\tint v2; // edx\r\n\tint result; // eax\r\n\tint v4; // eax\r\n\tint v5; // ecx\r\n\tUINT v6; // [esp-4h] [ebp-8h]\r\n\r\n\tv1 = (int)arg;\r\n\tif ( SelConn_1000AC9E(arg) )\r\n\t{\r\n\t\tv2 = 1;\r\n\t\treturn SelConn_1000AC07(v1, v2);\r\n\t}\r\n\tif ( SErrGetLastError() == -2062548873 )\r\n\t{\r\n\t\tdword_1002A374 = 1;\r\n\t\tv2 = 0;\r\n\t\treturn SelConn_1000AC07(v1, v2);\r\n\t}\r\n\tresult = SelGame_1000B67E();\r\n\tswitch ( result )\r\n\t{\r\n\t\tcase 1230002254:\r\n\t\t\tgoto LABEL_17;\r\n\t\tcase 1297040461:\r\n\t\t\tv4 = SErrGetLastError();\r\n\t\t\tv5 = v1;\r\n\t\t\tif ( v4 == 1222 )\r\n\t\t\t\tv6 = 46;\r\n\t\t\telse\r\n\t\t\t\tv6 = 53;\r\n\t\t\tgoto LABEL_14;\r\n\t\tcase 1396916812:\r\nLABEL_17:\r\n\t\t\tv6 = 44;\r\n\t\t\tv5 = v1;\r\nLABEL_14:\r\n\t\t\tresult = SelConn_1000AE19(v5, v6);\r\n\t\t\tbreak;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 1002A374: using guessed type int dword_1002A374;\r\n\r\n// ref: 0x1000AC9E\r\nint UNKCALL SelConn_1000AC9E(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // ebx\r\n\tHWND v2; // eax\r\n\tLONG v3; // eax\r\n\tint v4; // esi\r\n\tchar *v6; // ST10_4\r\n\tint v7; // ST08_4\r\n\tint v8; // eax\r\n\tint v9; // esi\r\n\tchar *v10; // ST14_4\r\n\tint v11; // ST0C_4\r\n\tvoid *v12; // eax\r\n\tchar v13; // [esp+8h] [ebp-8Ch]\r\n\tHWND v14; // [esp+10h] [ebp-84h]\r\n\tchar v15; // [esp+58h] [ebp-3Ch]\r\n\r\n\tv1 = hWnd;\r\n\tTitleSnd_1001031F();\r\n\tSelGame_1000B677(0);\r\n\tSelGame_1000B66A(0);\r\n\tv2 = GetFocus();\r\n\tv3 = GetWindowLongA(v2, -21);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv4 = *(DWORD *)(v3 + 12);\r\n\tif ( !v4 )\r\n\t\treturn 0;\r\n\tSelGame_1000B677(*(void **)(v4 + 8));\r\n\tSelGame_1000B66A(*(void **)(v4 + 4));\r\n\tif ( SelGame_1000B67E() == 1112425812 )\r\n\t{\r\n\t\tBNetGW_10002A07(&unk_10029480);\r\n\t\tBNetGW_100028C2(&unk_10029480);\r\n\t}\r\n\tif ( dword_1002A364 )\r\n\t\tmemcpy(&v13, (const void *)dword_1002A364, 0x50u);\r\n\tv14 = v1;\r\n\tif ( dword_1002A370 )\r\n\t\tmemcpy(&v15, (const void *)dword_1002A370, 0x3Cu);\r\n\tSelConn_1000ADA8(v1);\r\n\tv6 = dword_1002A358;\r\n\tv7 = dword_1002A34C;\r\n\tv8 = SelGame_1000B67E();\r\n\tv9 = SNetInitializeProvider(v8, &v15, v7, &v13, v6);\r\n\tif ( v9 )\r\n\t{\r\n\t\tv10 = dword_1002A358;\r\n\t\tv11 = dword_1002A34C;\r\n\t\tv12 = (void *)SelGame_1000B67E();\r\n\t\tv9 = SelModem_1000E435(v12, (int)&v15, v11, &v13, v10);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tSNetDestroy();\r\n\t}\r\n\tif ( !v9 )\r\n\t\tSelConn_1000ADD0(v1);\r\n\treturn v9;\r\n} */\r\n// 10010478: using guessed type DWORD __stdcall SNetDestroy();\r\n// 1001047E: using guessed type int __stdcall SNetInitializeProvider(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A364: using guessed type int dword_1002A364;\r\n// 1002A370: using guessed type int dword_1002A370;\r\n\r\n// ref: 0x1000ADA8\r\nint UNKCALL SelConn_1000ADA8(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\r\n\tv1 = hWnd;\r\n\tFade_100072BE(10);\r\n\tlocal_1000811B();\r\n\tShowWindow(v1, 0);\r\n\tTitle_100100E7(v1);\r\n\treturn Focus_10007818(v1);\r\n} */\r\n\r\n// ref: 0x1000ADD0\r\nBOOL UNKCALL SelConn_1000ADD0(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // ST10_4\r\n\tHWND v4; // [esp+0h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tFocus_100077E9((int)hWnd, \"ui_art\\\\focus16.pcx\", v4);\r\n\tTitle_1001009E(v1, (int)\"ui_art\\\\smlogo.pcx\", v2);\r\n\tlocal_100080F1();\r\n\tFade_100073C5(v1, 0);\r\n\tPostMessageA(v1, 0x7E8u, 0, 0);\r\n\tShowWindow(v1, 5);\r\n\treturn UpdateWindow(v1);\r\n} */\r\n\r\n// ref: 0x1000AE19\r\nint __fastcall SelConn_1000AE19(int a1, UINT a2) { return 0; }\r\n/* {\r\n\tUINT v2; // esi\r\n\tint v3; // edi\r\n\tint result; // eax\r\n\tCHAR Buffer; // [esp+8h] [ebp-80h]\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tresult = SErrGetLastError();\r\n\tif ( result != 1223 )\r\n\t{\r\n\t\tLoadStringA(hInstance, v2, &Buffer, 127);\r\n\t\tresult = SelYesNo_1000FD39(v3, &Buffer, 0, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n\r\n// ref: 0x1000AE59\r\nHWND __fastcall SelConn_1000AE59(HWND hWnd, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // ebp\r\n\tint v4; // ebx\r\n\tint v5; // ST0C_4\r\n\tHWND v6; // esi\r\n\tint v7; // ST08_4\r\n\tHWND v8; // eax\r\n\tHWND result; // eax\r\n\tHWND v10; // eax\r\n\tHWND v11; // eax\r\n\tHWND v12; // eax\r\n\tHWND v13; // eax\r\n\tint v14; // eax\r\n\tint v15; // eax\r\n\tint v16; // eax\r\n\tHWND v17; // eax\r\n\tHWND v18; // eax\r\n\tHWND v19; // eax\r\n\tHWND v20; // eax\r\n\r\n\tv3 = a3;\r\n\tv4 = a2;\r\n\tv5 = a3;\r\n\tv6 = hWnd;\r\n\tv7 = a2;\r\n\tv8 = GetDlgItem(hWnd, 1056);\r\n\tif ( local_10007C3B(v6, v8, v7, v5) )\r\n\t\treturn (HWND)SelConn_1000AC30(v6);\r\n\tv10 = GetDlgItem(v6, 1054);\r\n\tif ( local_10007C3B(v6, v10, v4, v3) )\r\n\t\treturn (HWND)SelConn_1000AC07((int)v6, 2);\r\n\tif ( dword_1002A354 && (v11 = GetDlgItem(v6, 1145), local_10007C3B(v6, v11, v4, v3)) )\r\n\t{\r\n\t\tSelConn_1000ADA8(v6);\r\n\t\tTitleSnd_1001031F();\r\n\t\tUiSelectRegion(&a3);\r\n\t\tresult = (HWND)SelConn_1000ADD0(v6);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv12 = GetDlgItem(v6, 1105);\r\n\t\tresult = (HWND)local_10007C3B(v6, v12, v4, v3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv13 = GetDlgItem(v6, 1105);\r\n\t\t\tv14 = Sbar_100099DC(v13, v4, v3) - 1;\r\n\t\t\tif ( v14 )\r\n\t\t\t{\r\n\t\t\t\tv15 = v14 - 1;\r\n\t\t\t\tif ( v15 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv16 = v15 - 1;\r\n\t\t\t\t\tif ( v16 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresult = (HWND)(v16 - 1);\r\n\t\t\t\t\t\tif ( !result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv17 = GetFocus();\r\n\t\t\t\t\t\t\tresult = SelConn_1000A948(v17);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv18 = GetFocus();\r\n\t\t\t\t\t\tresult = SelConn_1000AA3B(v18);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tv19 = GetFocus();\r\n\t\t\t\t\tresult = SelConn_1000AAEB(v19);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv20 = GetFocus();\r\n\t\t\t\tresult = SelConn_1000AB83(v20);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A354: using guessed type int dword_1002A354;\r\n\r\n// ref: 0x1000AF69\r\nint __stdcall UiSelectProvider(int a1, _SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, _SNETVERSIONDATA *file_info, int *type) { return 0; }\r\n/* {\r\n\tint v6; // eax\r\n\tint v7; // ebx\r\n\r\n\tdword_1002A374 = 0;\r\n\tdword_1002A36C = a1;\r\n\tdword_1002A370 = a2;\r\n\tdword_1002A34C = a3;\r\n\tdword_1002A364 = a4;\r\n\tdword_1002A358 = a5;\r\n\tartfont_10001159();\r\n\tv6 = SDrawGetFrameWindow(NULL);\r\n\tv7 = SDlgDialogBoxParam(hInstance, \"SELCONNECT_DIALOG\", v6, SelConn_1000A0A6, 0);\r\n\tif ( a6 )\r\n\t\t*a6 = SelGame_1000B67E();\r\n\tif ( dword_1002A374 )\r\n\t{\r\n\t\tartfont_100010C8();\r\n\t\tlocal_100078B6();\r\n\t\tSErrSetLastError(-2062548873);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tif ( v7 == 1 )\r\n\t\t{\r\n\t\t\tartfont_100010C8();\r\n\t\t\tlocal_100078B6();\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\tSErrSetLastError(1223);\r\n\t}\r\n\treturn 0;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 1001041E: using guessed type int __stdcall SErrSetLastError(DWORD);\r\n// 1002A364: using guessed type int dword_1002A364;\r\n// 1002A36C: using guessed type int dword_1002A36C;\r\n// 1002A370: using guessed type int dword_1002A370;\r\n// 1002A374: using guessed type int dword_1002A374;\r\n"
  },
  {
    "path": "DiabloUI/seldial.cpp",
    "content": "// ref: 0x1000B011\r\nint UNKCALL SelDial_1000B011(char *arg) { return 0; }\r\n/* {\r\n\tsigned int v1; // edi\r\n\tint i; // edi\r\n\tchar v4; // [esp+8h] [ebp-24h]\r\n\tchar v5; // [esp+27h] [ebp-5h]\r\n\tchar *v6; // [esp+28h] [ebp-4h]\r\n\r\n\tv6 = arg;\r\n\tv1 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( SRegLoadString(\"Diablo\\\\Phone Book\", off_10022F8C[v1], 1u, &v4, 0x20u) )\r\n\t\t{\r\n\t\t\tv5 = 0;\r\n\t\t\tif ( !strcmp(&v4, v6) )\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\t++v1;\r\n\t}\r\n\twhile ( v1 < 4 );\r\n\tif ( v1 == 4 )\r\n\t\tv1 = 3;\r\n\tfor ( i = v1 - 1; i >= 0; --i )\r\n\t{\r\n\t\tv4 = 0;\r\n\t\tif ( SRegLoadString(\"Diablo\\\\Phone Book\", off_10022F8C[i], 1u, &v4, 0x20u) )\r\n\t\t{\r\n\t\t\tv5 = 0;\r\n\t\t\tif ( strlen(&v4) )\r\n\t\t\t\tSRegSaveString(\"Diablo\\\\Phone Book\", off_10022F90[i], 1u, &v4);\r\n\t\t}\r\n\t}\r\n\treturn SRegSaveString(\"Diablo\\\\Phone Book\", off_10022F8C[0], 1u, v6);\r\n} */\r\n// 10010484: using guessed type int __stdcall SRegSaveString(const char *, const char *, unsigned int, const char *);\r\n// 1001048A: using guessed type int __stdcall SRegLoadString(const char *, const char *, unsigned int, char *, unsigned int);\r\n// 10022F8C: using guessed type char *off_10022F8C[4];\r\n// 10022F90: using guessed type char *off_10022F90[3];\r\n\r\n// ref: 0x1000B0C4\r\nsigned int SelDial_1000B0C4() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A37C = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A37C: using guessed type int dword_1002A37C;\r\n\r\n// ref: 0x1000B0CF\r\nint __stdcall SelDial_1000B0CF(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tint v6; // edx\r\n\tHWND v7; // eax\r\n\tint savedregs; // [esp+Ch] [ebp+0h]\r\n\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tSelDial_1000B29A(hWnd);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg > 0x103 )\r\n\t{\r\n\t\tif ( Msg <= 0x105 )\r\n\t\t{\r\n\t\t\tv7 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\tSendMessageA(v7, Msg, wParam, lParam);\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tif ( Msg == 272 )\r\n\t\t{\r\n\t\t\tdword_1002A378 = (char *)lParam;\r\n\t\t\tSelDial_1000B483(hWnd, (int)&savedregs);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif ( Msg != 273 )\r\n\t\t{\r\n\t\t\tif ( Msg != 275 )\r\n\t\t\t{\r\n\t\t\t\tif ( Msg == 513 )\r\n\t\t\t\t\tSelDial_1000B614(hWnd, (unsigned short)lParam, (unsigned int)lParam >> 16);\r\n\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\t}\r\n\t\t\tif ( wParam == 1 )\r\n\t\t\t{\r\n\t\t\t\tv4 = GetFocus();\r\n\t\t\t\tFocus_100075DC(hWnd, v4);\r\n\t\t\t}\r\n\t\t\telse if ( wParam == 2 )\r\n\t\t\t{\r\n\t\t\t\tSelDial_1000B354(hWnd);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif ( HIWORD(wParam) == 7 )\r\n\t\t{\r\n\t\t\tFocus_100075B7(hWnd, (HWND)lParam);\r\n\t\t}\r\n\t\telse if ( HIWORD(wParam) == 6 )\r\n\t\t{\r\n\t\t\tFocus_10007458((void *)lParam);\r\n\t\t\tFocus_100075DC(hWnd, (HWND)lParam);\r\n\t\t\tSelDial_1000B1FB(hWnd, (unsigned short)wParam);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tv6 = 1;\r\n\t\t\tif ( wParam != 327681 )\r\n\t\t\t{\r\n\t\t\t\tif ( (WORD)wParam != 2 )\r\n\t\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\t\tv6 = 2;\r\n\t\t\t}\r\n\t\t\tSelDial_1000B2D8((int)hWnd, v6);\r\n\t\t}\r\n\t}\r\n\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000B1FB\r\nHWND __fastcall SelDial_1000B1FB(HWND hWnd, int a2) { return 0; }\r\n/* {\r\n\tint v2; // edi\r\n\tHWND v3; // ebx\r\n\tHWND v4; // eax\r\n\tCHAR v6; // [esp+Ch] [ebp-140h]\r\n\tCHAR Buffer; // [esp+10Ch] [ebp-40h]\r\n\r\n\tv2 = a2;\r\n\tv3 = hWnd;\r\n\tLoadStringA(hInstance, 0x39u, &Buffer, 63);\r\n\tif ( v2 == 1117 )\r\n\t{\r\n\t\tif ( Modem_1000855D() )\r\n\t\t\tLoadStringA(hInstance, 0x43u, &v6, 255);\r\n\t\telse\r\n\t\t\tLoadStringA(hInstance, 0x36u, &v6, 255);\r\n\t}\r\n\telse if ( v2 == 1118 )\r\n\t{\r\n\t\tif ( Modem_1000855D() )\r\n\t\t\tLoadStringA(hInstance, 0x44u, &v6, 255);\r\n\t\telse\r\n\t\t\tLoadStringA(hInstance, 0x37u, &v6, 255);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tLoadStringA(hInstance, 0x38u, &v6, 255);\r\n\t}\r\n\tv4 = GetParent(v3);\r\n\treturn Modem_10008563(v4, &Buffer, (int)&v6);\r\n} */\r\n\r\n// ref: 0x1000B29A\r\nHWND UNKCALL SelDial_1000B29A(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tDoom_10006C53(hDlg, (int *)&unk_10022FB0);\r\n\tDoom_10006C53(v1, (int *)&unk_10022FA4);\r\n\tDoom_10006C53(v1, (int *)&unk_10022F9C);\r\n\tFocus_100076C3();\r\n\tv2 = GetParent(v1);\r\n\treturn Modem_10008563(v2, 0, 0);\r\n} */\r\n\r\n// ref: 0x1000B2D8\r\nint __fastcall SelDial_1000B2D8(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // esi\r\n\tint v3; // edi\r\n\tHWND v4; // eax\r\n\tLONG v5; // eax\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tif ( a2 == 1 || a2 == 2 )\r\n\t\tTitleSnd_1001031F();\r\n\tSDlgKillTimer(v3, 1);\r\n\tSDlgKillTimer(v3, 2);\r\n\tif ( v2 != 1 )\r\n\t\treturn SDlgEndDialog(v3, v2);\r\n\tv4 = GetFocus();\r\n\tv5 = GetWindowLongA(v4, -12);\r\n\tif ( v5 == 1117 )\r\n\t\treturn SDlgEndDialog(v3, 3);\r\n\tif ( v5 == 1118 )\r\n\t\treturn SDlgEndDialog(v3, 5);\r\n\tif ( dword_1002A378 )\r\n\t\tstrcpy(dword_1002A378, &byte_1002A380[32 * (v5 - 1119)]);\r\n\treturn SDlgEndDialog(v3, 4);\r\n} */\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n// 10010418: using guessed type int __stdcall SDlgKillTimer(DWORD, DWORD);\r\n\r\n// ref: 0x1000B354\r\nHWND UNKCALL SelDial_1000B354(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tHWND v3; // esi\r\n\tHWND v4; // eax\r\n\r\n\tv1 = hDlg;\r\n\tresult = GetDlgItem(hDlg, 1118);\r\n\tv3 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tif ( Modem_10008606() )\r\n\t\t{\r\n\t\t\tSelDial_1000B3D8(v1);\r\n\t\t\tEnableWindow(v3, 1);\r\n\t\t\tresult = (HWND)ShowWindow(v3, 1);\r\n\t\t}\r\n\t\telse if ( SErrGetLastError() == 1222 )\r\n\t\t{\r\n\t\t\tresult = (HWND)SelDial_1000B2D8((int)v1, 1222);\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif ( GetFocus() == v3 )\r\n\t\t\t{\r\n\t\t\t\tv4 = GetDlgItem(v1, 1117);\r\n\t\t\t\tSetFocus(v4);\r\n\t\t\t}\r\n\t\t\tSelDial_1000B44C(v1);\r\n\t\t\tEnableWindow(v3, 0);\r\n\t\t\tresult = (HWND)ShowWindow(v3, 0);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n\r\n// ref: 0x1000B3D8\r\nHWND UNKCALL SelDial_1000B3D8(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND result; // eax\r\n\tHWND v3; // edi\r\n\tchar *v4; // eax\r\n\tint v5; // ebx\r\n\tint v6; // eax\r\n\tCHAR Buffer; // [esp+8h] [ebp-40h]\r\n\r\n\tv1 = hDlg;\r\n\tresult = GetDlgItem(hDlg, 1118);\r\n\tv3 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tv4 = Modem_1000863D();\r\n\t\tv5 = Modem_1000865F(v4);\r\n\t\tif ( v5 <= Modem_10008659() )\r\n\t\t\tLoadStringA(hInstance, 0x4Au, &Buffer, 63);\r\n\t\telse\r\n\t\t\tLoadStringA(hInstance, 0x4Bu, &Buffer, 63);\r\n\t\tv6 = GetWindowLongA(v3, -21);\r\n\t\tlocal_10007FA4(v6, &Buffer);\r\n\t\tresult = (HWND)Doom_1000680A(v1, (int *)&unk_10022FB0, 0, 1);\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000B44C\r\nHWND UNKCALL SelDial_1000B44C(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND result; // eax\r\n\tint v3; // eax\r\n\r\n\tv1 = hDlg;\r\n\tresult = GetDlgItem(hDlg, 1118);\r\n\tif ( result )\r\n\t{\r\n\t\tv3 = GetWindowLongA(result, -21);\r\n\t\tlocal_10007FA4(v3, 0);\r\n\t\tresult = (HWND)Doom_1000680A(v1, (int *)&unk_10022FB0, 0, 1);\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000B483\r\nHWND USERCALL SelDial_1000B483(HWND hWnd, int a2) { return 0; }\r\n/* {\r\n\tHWND v2; // esi\r\n\tHWND v3; // eax\r\n\tLONG v4; // eax\r\n\tHWND result; // eax\r\n\tchar *v6; // eax\r\n\tint v7; // ebx\r\n\tHWND v8; // eax\r\n\tHWND v9; // edi\r\n\tint v10; // esi\r\n\tconst char *v11; // edx\r\n\tint v12; // [esp-64h] [ebp-6Ch]\r\n\tint v13; // [esp-24h] [ebp-2Ch]\r\n\tHWND v14; // [esp-4h] [ebp-Ch]\r\n\tconst char *v15; // [esp+0h] [ebp-8h]\r\n\tint v16; // [esp+4h] [ebp-4h]\r\n\r\n\tv2 = hWnd;\r\n\tv3 = GetParent(hWnd);\r\n\tv4 = GetWindowLongA(v3, -21);\r\n\tSetWindowLongA(v2, -21, v4);\r\n\tFocus_10007719(\"ui_art\\\\focus16.pcx\");\r\n\tSDlgSetTimer(v2, 1, 55, 0);\r\n\tlocal_10007CB5(v2, (int *)&unk_10022FB0);\r\n\tDoom_100068AB(v2, (int *)&unk_10022F9C, 5);\r\n\tDoom_1000658C(v2, (int *)&unk_10022FA4, 4, 0);\r\n\tDoom_1000658C(v2, (int *)&unk_10022FB0, 0, 1);\r\n\tif ( Modem_1000855D() )\r\n\t{\r\n\t\tSDlgSetTimer(v2, 2, 2000, 0);\r\n\t\tresult = SelDial_1000B354(v2);\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv16 = a2;\r\n\t\tv14 = v2;\r\n\t\tv6 = byte_1002A380;\r\n\t\tdo\r\n\t\t{\r\n\t\t\t*v6 = 0;\r\n\t\t\tv6 += 32;\r\n\t\t}\r\n\t\twhile ( (signed int)v6 < (signed int)&dword_1002A400 );\r\n\t\tSelDial_1000B5D9();\r\n\t\tLoadStringA(hInstance, 0x34u, (LPSTR)&v13, 31);\r\n\t\tv7 = 0;\r\n\t\tv15 = byte_1002A380;\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv8 = GetDlgItem(v14, v7 + 1119);\r\n\t\t\tv9 = v8;\r\n\t\t\tif ( v8 )\r\n\t\t\t{\r\n\t\t\t\tv10 = GetWindowLongA(v8, -21);\r\n\t\t\t\tif ( v10 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( strlen(v15) )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twsprintfA((LPSTR)&v12, (LPCSTR)&v13, v15);\r\n\t\t\t\t\t\tv11 = (const char *)&v12;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tEnableWindow(v9, 0);\r\n\t\t\t\t\t\tv11 = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlocal_10007FA4(v10, v11);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tv15 += 32;\r\n\t\t\t++v7;\r\n\t\t}\r\n\t\twhile ( (signed int)v15 < (signed int)&dword_1002A400 );\r\n\t\tresult = (HWND)Doom_1000680A(v14, (int *)&unk_10022FB0, 0, 1);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1000B483: could not find valid save-restore pair for ebp\r\n// 10010412: using guessed type int __stdcall SDlgSetTimer(DWORD, DWORD, DWORD, DWORD);\r\n// 1002A400: using guessed type int dword_1002A400;\r\n\r\n// ref: 0x1000B5D9\r\nint SelDial_1000B5D9() { return 0; }\r\n/* {\r\n\tchar *v0; // esi\r\n\tconst char **v1; // edi\r\n\tint result; // eax\r\n\r\n\tv0 = byte_1002A380;\r\n\tv1 = (const char **)off_10022F8C;\r\n\tdo\r\n\t{\r\n\t\tresult = SRegLoadString(\"Diablo\\\\Phone Book\", *v1, 1u, v0, 0x20u);\r\n\t\tif ( result )\r\n\t\t\tv0[31] = 0;\r\n\t\telse\r\n\t\t\t*v0 = 0;\r\n\t\t++v1;\r\n\t\tv0 += 32;\r\n\t}\r\n\twhile ( (signed int)v1 < (signed int)&unk_10022F9C );\r\n\treturn result;\r\n} */\r\n// 1001048A: using guessed type int __stdcall SRegLoadString(const char *, const char *, unsigned int, char *, unsigned int);\r\n// 10022F8C: using guessed type char *off_10022F8C[4];\r\n\r\n// ref: 0x1000B614\r\nint __fastcall SelDial_1000B614(HWND hWnd, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // ebx\r\n\tHWND v4; // esi\r\n\tint v5; // ST08_4\r\n\tHWND v6; // eax\r\n\tint v7; // edx\r\n\tHWND v8; // eax\r\n\tint result; // eax\r\n\r\n\tv3 = a2;\r\n\tv4 = hWnd;\r\n\tv5 = a2;\r\n\tv6 = GetDlgItem(hWnd, 1056);\r\n\tif ( local_10007C3B(v4, v6, v5, a3) )\r\n\t{\r\n\t\tv7 = 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv8 = GetDlgItem(v4, 1054);\r\n\t\tresult = local_10007C3B(v4, v8, v3, a3);\r\n\t\tif ( !result )\r\n\t\t\treturn result;\r\n\t\tv7 = 2;\r\n\t}\r\n\treturn SelDial_1000B2D8((int)v4, v7);\r\n} */\r\n"
  },
  {
    "path": "DiabloUI/selgame.cpp",
    "content": "// ref: 0x1000B66A\r\nvoid UNKCALL SelGame_1000B66A(void *arg) { return; }\r\n/* {\r\n\tdword_1002A408 = (int)arg;\r\n} */\r\n// 1002A408: using guessed type int dword_1002A408;\r\n\r\n// ref: 0x1000B671\r\nint SelGame_1000B671() { return 0; }\r\n/* {\r\n\treturn dword_1002A408;\r\n} */\r\n// 1002A408: using guessed type int dword_1002A408;\r\n\r\n// ref: 0x1000B677\r\nvoid UNKCALL SelGame_1000B677(void *arg) { return; }\r\n/* {\r\n\tdword_1002A404 = (int)arg;\r\n} */\r\n// 1002A404: using guessed type int dword_1002A404;\r\n\r\n// ref: 0x1000B67E\r\nint SelGame_1000B67E() { return 0; }\r\n/* {\r\n\treturn dword_1002A404;\r\n} */\r\n// 1002A404: using guessed type int dword_1002A404;\r\n\r\n// ref: 0x1000B684\r\nint __stdcall UiSelectGame(int a1, _SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, _SNETVERSIONDATA *file_info, int *playerid) { return 0; }\r\n/* {\r\n\tint v6; // eax\r\n\tCHAR v8; // [esp+4h] [ebp-110h]\r\n\tchar v9; // [esp+5h] [ebp-10Fh]\r\n\tshort v10; // [esp+81h] [ebp-93h]\r\n\tchar v11; // [esp+83h] [ebp-91h]\r\n\tCHAR v12; // [esp+84h] [ebp-90h]\r\n\tchar v13; // [esp+85h] [ebp-8Fh]\r\n\tshort v14; // [esp+101h] [ebp-13h]\r\n\tchar v15; // [esp+103h] [ebp-11h]\r\n\tint v16; // [esp+104h] [ebp-10h]\r\n\tCHAR *v17; // [esp+108h] [ebp-Ch]\r\n\tCHAR *v18; // [esp+10Ch] [ebp-8h]\r\n\r\n\tv12 = byte_10029448;\r\n\tmemset(&v13, 0, 0x7Cu);\r\n\tv14 = 0;\r\n\tv15 = 0;\r\n\tv8 = byte_10029448;\r\n\tmemset(&v9, 0, 0x7Cu);\r\n\tv10 = 0;\r\n\tv11 = 0;\r\n\tConnect_10004028((int)&v12, 128, (int)&v8, 128);\r\n\tmemset(&v16, 0, 0x10u);\r\n\tif ( a3 )\r\n\t\tmemcpy(&v16, a3, 0x10u);\r\n\tv16 = 16;\r\n\tv17 = &v12;\r\n\tv18 = &v8;\r\n\tif ( SelGame_1000B671() )\r\n\t\treturn SelIPX_1000C634(a1, a2, (int)&v16, (DWORD *)a4, a5, playerid);\r\n\tv6 = SelGame_1000B67E();\r\n\tswitch ( v6 )\r\n\t{\r\n\t\tcase 1230002254:\r\n\t\t\treturn SelIPX_1000C634(a1, a2, (int)&v16, (DWORD *)a4, a5, playerid);\r\n\t\tcase 1297040461:\r\n\t\t\treturn Modem_10008680(a1, a2, (int)&v16, (DWORD *)a4, a5, playerid);\r\n\t\tcase 1396916812:\r\n\t\t\treturn DirLink_10005D05(a1, a2, (int)&v16, (DWORD *)a4, a5, playerid);\r\n\t}\r\n\treturn SNetSelectGame(a1, a2, &v16, a4, a5, playerid);\r\n} */\r\n// 10010490: using guessed type int __stdcall SNetSelectGame(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000B795\r\nsigned int SelGame_1000B795() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A400 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A400: using guessed type int dword_1002A400;\r\n"
  },
  {
    "path": "DiabloUI/selhero.cpp",
    "content": "// ref: 0x1000B7A0\r\n_uiheroinfo *__cdecl SelHero_GetCurrentHeroInfo()\r\n{\r\n\treturn sgpHeroInfo;\r\n}\r\n\r\n// ref: 0x1000B7A6\r\nint __cdecl SelHero_GetNumHeroesLeft()\r\n{\r\n\treturn selhero_numheroesleft;\r\n}\r\n// 1002A428: using guessed type int selhero_numheroesleft;\r\n\r\n// ref: 0x1000B7AC\r\nvoid __fastcall SelHero_SetHeroDifficulty(int diff)\r\n{\r\n\tselhero_difficulty = diff;\r\n}\r\n// 1002A420: using guessed type int selhero_difficulty;\r\n\r\n// ref: 0x1000B7B3\r\nchar *__cdecl SelHero_GetHeroNameStr()\r\n{\r\n\treturn selhero_heronamestr;\r\n}\r\n\r\n// ref: 0x1000B7B9\r\n_uiheroinfo *__cdecl SelHero_AllocHeroInfo()\r\n{\r\n\treturn (_uiheroinfo *)SMemAlloc(0x2Cu, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelHero.cpp\", 123, 0);\r\n}\r\n\r\n// ref: 0x1000B7CA\r\nint __cdecl SelHero_GetHeroIsGood()\r\n{\r\n\treturn selhero_is_good;\r\n}\r\n\r\n// ref: 0x1000B7D0\r\nint __fastcall SelHero_SetClassStats(int heroclass, _uidefaultstats *pStats)\r\n{\r\n\treturn selhero_fnstats(heroclass, pStats);\r\n}\r\n\r\n// ref: 0x1000B7DE\r\nvoid __cdecl SelHero_cpp_init()\r\n{\r\n\tSelHero_cpp_float = SelHero_cpp_float_value;\r\n}\r\n// 1001F460: using guessed type int SelHero_cpp_float_value;\r\n// 1002A414: using guessed type int SelHero_cpp_float;\r\n\r\n// ref: 0x1000B899\r\nvoid __fastcall SelHero_SetStaticBMP(HWND hWnd, int adjust_size)\r\n{\r\n\tHWND v3;             // esi\r\n\tstruct tagRECT Rect; // [esp+8h] [ebp-10h]\r\n\r\n\tv3 = GetDlgItem(hWnd, 1040);\r\n\tInvalidateRect(v3, 0, 0);\r\n\tGetClientRect(v3, &Rect);\r\n\tlocal_AdjustRectSize(&Rect, 0, adjust_size * Rect.bottom);\r\n\tSDlgSetBitmapI(v3, 0, \"Static\", -1, 1, selhero_buffer, (int)&Rect, selhero_sizedata[0], selhero_sizedata[1], -1);\r\n}\r\n\r\n// ref: 0x1000B905\r\nvoid __fastcall SelHero_PrintHeroInfo(HWND hWnd, _uiheroinfo *pInfo)\r\n{\r\n\tHWND v3;  // eax\r\n\tint v4;   // eax\r\n\tHWND v5;  // eax\r\n\tint v6;   // eax\r\n\tHWND v7;  // eax\r\n\tint v8;   // eax\r\n\tHWND v9;  // eax\r\n\tint v10;  // eax\r\n\tHWND v11; // eax\r\n\tint v12;  // eax\r\n\tHWND v15; // ebp\r\n\tint v16;  // eax\r\n\tHWND v17; // ST1C_4\r\n\tint v18;  // eax\r\n\tHWND v19; // ST1C_4\r\n\tint v20;  // eax\r\n\tHWND v21; // ST1C_4\r\n\tint v22;  // eax\r\n\tHWND v23; // ST1C_4\r\n\tint v24;  // eax\r\n\r\n\tif (pInfo->level) {\r\n\t\tselhero_hero_hassaved = pInfo->hassaved;\r\n\t\tstrcpy(selhero_heronamestr, pInfo->name);\r\n\t\tv15 = GetDlgItem(hWnd, 1014);\r\n\t\twsprintfA(selhero_herolevel, \"%d\", pInfo->level);\r\n\t\tv16 = GetWindowLongA(v15, -21);\r\n\t\tlocal_SetWndLongStr(v16, selhero_herolevel);\r\n\t\tv17 = GetDlgItem(hWnd, 1018);\r\n\t\twsprintfA(selhero_herostr, \"%d\", pInfo->strength);\r\n\t\tv18 = GetWindowLongA(v17, -21);\r\n\t\tlocal_SetWndLongStr(v18, selhero_herostr);\r\n\t\tv19 = GetDlgItem(hWnd, 1017);\r\n\t\twsprintfA(selhero_heromag, \"%d\", pInfo->magic);\r\n\t\tv20 = GetWindowLongA(v19, -21);\r\n\t\tlocal_SetWndLongStr(v20, selhero_heromag);\r\n\t\tv21 = GetDlgItem(hWnd, 1016);\r\n\t\twsprintfA(selhero_herodex, \"%d\", pInfo->dexterity);\r\n\t\tv22 = GetWindowLongA(v21, -21);\r\n\t\tlocal_SetWndLongStr(v22, selhero_herodex);\r\n\t\tv23 = GetDlgItem(hWnd, 1015);\r\n\t\twsprintfA(selhero_herovit, \"%d\", pInfo->vitality);\r\n\t\tv24 = GetWindowLongA(v23, -21);\r\n\t\tlocal_SetWndLongStr(v24, selhero_herovit);\r\n\t\tSelHero_SetStaticBMP(hWnd, pInfo->heroclass);\r\n\t\tDoom_ParseWndProc4(hWnd, selhero_msgtbl_info, AF_SMALLGRAY);\r\n\t} else {\r\n\t\tselhero_hero_hassaved  = 0;\r\n\t\tselhero_heronamestr[0] = 0;\r\n\t\tv3                     = GetDlgItem(hWnd, 1014);\r\n\t\tv4                     = GetWindowLongA(v3, -21);\r\n\t\tlocal_SetWndLongStr(v4, \"--\");\r\n\t\tv5 = GetDlgItem(hWnd, 1018);\r\n\t\tv6 = GetWindowLongA(v5, -21);\r\n\t\tlocal_SetWndLongStr(v6, \"--\");\r\n\t\tv7 = GetDlgItem(hWnd, 1017);\r\n\t\tv8 = GetWindowLongA(v7, -21);\r\n\t\tlocal_SetWndLongStr(v8, \"--\");\r\n\t\tv9  = GetDlgItem(hWnd, 1016);\r\n\t\tv10 = GetWindowLongA(v9, -21);\r\n\t\tlocal_SetWndLongStr(v10, \"--\");\r\n\t\tv11 = GetDlgItem(hWnd, 1015);\r\n\t\tv12 = GetWindowLongA(v11, -21);\r\n\t\tlocal_SetWndLongStr(v12, \"--\");\r\n\t\tSelHero_SetStaticBMP(hWnd, 3);\r\n\t\tDoom_ParseWndProc4(hWnd, selhero_msgtbl_info, AF_SMALLGRAY);\r\n\t}\r\n}\r\n// 1002A424: using guessed type int selhero_hero_hassaved;\r\n\r\n// ref: 0x1000BA7B\r\nvoid __fastcall SelHero_SetStringWithMsg(HWND hWnd, const char *str)\r\n{\r\n\tHWND v4; // eax\r\n\tint v5;  // eax\r\n\r\n\tv4 = GetDlgItem(hWnd, 1038);\r\n\tif (v4) {\r\n\t\tv5 = GetWindowLongA(v4, -21);\r\n\t\tlocal_SetWndLongStr(v5, str);\r\n\t\tDoom_ParseWndProc4(hWnd, selhero_msgtbl_string, AF_BIGGRAY);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000BAB4\r\nBOOL __fastcall SelHero_IsNameReserved(const char *name)\r\n{\r\n\tUINT v1;          // esi\r\n\tBOOL result;      // eax\r\n\tchar SrcStr[128]; // [esp+4h] [ebp-90h]\r\n\tchar Buffer[16];  // [esp+84h] [ebp-10h]\r\n\r\n\tstrcpy(SrcStr, name);\r\n\t_strlwr(SrcStr);\r\n\tv1 = 19;\r\n\twhile (1) {\r\n\t\tLoadStringA(ghUiInst, v1, Buffer, 15);\r\n\t\tSelHero_SetLastNamePos(Buffer);\r\n\t\t_strlwr(Buffer);\r\n\t\tresult = (BOOL)strstr(SrcStr, Buffer);\r\n\t\tif (result)\r\n\t\t\tbreak;\r\n\t\tif ((signed int)++v1 > 26)\r\n\t\t\treturn result;\r\n\t}\r\n\treturn 1;\r\n}\r\n\r\n// ref: 0x1000BB26\r\nvoid __fastcall SelHero_SetLastNamePos(char *name)\r\n{\r\n\twhile (*name)\r\n\t\t--*name++;\r\n}\r\n\r\n// ref: 0x1000BB34\r\nBOOL __fastcall SelHero_NameHasChar(const char *name, char *illegalchrs)\r\n{\r\n\tchar v5; // al\r\n\r\n\tif (strpbrk(name, \",<>%&\\\\\\\"?*#/:\") || strpbrk(name, illegalchrs))\r\n\t\treturn 1;\r\n\twhile (1) {\r\n\t\tv5 = *name;\r\n\t\tif (!*name)\r\n\t\t\tbreak;\r\n\t\tif ((unsigned char)v5 < 0x20u || (unsigned char)v5 > 0x7Eu && (unsigned char)v5 < 0xC0u)\r\n\t\t\treturn 1;\r\n\t\t++name;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\n// ref: 0x1000BB75\r\nBOOL __fastcall UiValidPlayerName(const char *name)\r\n{\r\n\tBOOL v2; // edi\r\n\r\n\tv2 = 1;\r\n\tif (!strlen(name))\r\n\t\tv2 = 0;\r\n\tif (selhero_is_good == 1 && (SelHero_IsNameReserved(name) || SelHero_NameHasChar(name, \" \")))\r\n\t\tv2 = 0;\r\n\treturn v2;\r\n}\r\n\r\n// ref: 0x1000BBB4\r\nBOOL __stdcall UiSelHeroMultDialog(\r\n    BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)),\r\n    BOOL(__stdcall *fncreate)(_uiheroinfo *),\r\n    BOOL(__stdcall *fnremove)(_uiheroinfo *),\r\n    BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *),\r\n    int *dlgresult,\r\n    int *hero_is_created,\r\n    char *name)\r\n{\r\n\tint v7; // eax\r\n\tint v8; // eax\r\n\r\n\tartfont_LoadAllFonts();\r\n\tselhero_fninfo     = fninfo;\r\n\tselhero_fncreate   = fncreate;\r\n\tselhero_fnremove   = fnremove;\r\n\tselhero_fnstats    = fnstats;\r\n\tsgpHeroInfo        = 0;\r\n\tselhero_is_good    = 1;\r\n\tselhero_is_created = 0;\r\n\tv7                 = (int)SDrawGetFrameWindow(NULL);\r\n\tv8                 = SDlgDialogBoxParam(ghUiInst, \"SELHERO_DIALOG\", v7, SelHero_WndProc, 0);\r\n\tif (dlgresult)\r\n\t\t*dlgresult = v8;\r\n\tif (name)\r\n\t\tstrcpy(name, selhero_heronamestr);\r\n\tif (hero_is_created)\r\n\t\t*hero_is_created = selhero_is_created;\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 1002A45C: using guessed type int selhero_is_created;\r\n\r\n// ref: 0x1000BC46\r\nLRESULT __stdcall SelHero_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v4;       // eax\r\n\tint v6;        // edx\r\n\tHWND v7;       // ecx\r\n\tsigned int v8; // [esp-4h] [ebp-8h]\r\n\r\n\tif (Msg > 0xBD2) {\r\n\t\tswitch (Msg) {\r\n\t\tcase 0xBD3u:\r\n\t\t\tSelHero_DoSelLoad(hWnd);\r\n\t\t\treturn 0;\r\n\t\tcase 0xBD4u:\r\n\t\t\tSelHero_DoSelDiff(hWnd);\r\n\t\t\treturn 0;\r\n\t\tcase 0xBD5u:\r\n\t\t\tv7 = hWnd;\r\n\t\t\tif (selhero_is_good != 1) {\r\n\t\t\t\tv8 = 2;\r\n\t\t\t\tgoto LABEL_30;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 0xBD6u:\r\n\t\t\tstrcpy(selhero_heronamestr, heroinfo_create.name);\r\n\t\t\tv6 = 1;\r\n\t\t\tv7 = hWnd;\r\n\t\t\tif (selhero_is_good != 1) {\r\n\t\t\t\tselhero_difficulty = 0;\r\n\t\t\tLABEL_31:\r\n\t\t\t\tSelHero_DoHeroEndFade(v7, v6);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 0xBD7u:\r\n\t\t\tSelHero_DoStuffWithStrings(hWnd);\r\n\t\t\treturn 0;\r\n\t\tdefault:\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tv8 = 3;\r\n\tLABEL_30:\r\n\t\tv6 = v8;\r\n\t\tgoto LABEL_31;\r\n\t}\r\n\tif (Msg == 3026) {\r\n\t\tSelHero_DoEnterName(hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tif (Msg == 2) {\r\n\t\tSelHero_DeleteAndFree(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg <= 0x103)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tif (Msg <= 0x105) {\r\n\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tswitch (Msg) {\r\n\tcase 0x110u:\r\n\t\tSelHero_LoadHeroGFX(hWnd);\r\n\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\treturn 0;\r\n\tcase 0x7E8u:\r\n\t\tif (!Fade_CheckRange5())\r\n\t\t\tFade_SetFadeTimer((int)hWnd);\r\n\t\treturn 0;\r\n\tcase 0xBD0u:\r\n\t\tSelHero_DoHeroSelList(hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tif (Msg != 3025)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tSelHero_DoHeroSelClass(hWnd);\r\n\treturn 0;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 1002A420: using guessed type int selhero_difficulty;\r\n\r\n// ref: 0x1000BDAD\r\nvoid __fastcall SelHero_DoStuffWithStrings(HWND hWnd)\r\n{\r\n\t_uiheroinfo *v1;    // eax\r\n\tchar dialogstr[80]; // [esp+Ch] [ebp-B4h]\r\n\tchar string64[64];  // [esp+5Ch] [ebp-64h]\r\n\tchar Buffer[32];    // [esp+9Ch] [ebp-24h]\r\n\r\n\tif (SelHero_GetHeroIsGood() == 1)\r\n\t\tLoadStringA(ghUiInst, 0x23u, Buffer, 31);\r\n\telse\r\n\t\tLoadStringA(ghUiInst, 0x22u, Buffer, 31);\r\n\tLoadStringA(ghUiInst, 7u, string64, 63);\r\n\twsprintfA(dialogstr, string64, selhero_heronamestr);\r\n\tif (SelYesNo_YesNoDialog(hWnd, dialogstr, Buffer, 1) != 2) {\r\n\t\tv1 = SelHero_GetHeroSlotFromName(sgpHeroInfo, selhero_heronamestr);\r\n\t\tif (v1) {\r\n\t\t\tif (selhero_fnremove(v1)) {\r\n\t\t\t\tsgpHeroInfo = SelHero_GetNextHeroFromStr(sgpHeroInfo, selhero_heronamestr);\r\n\t\t\t\t--selhero_numheroesleft;\r\n\t\t\t\tLoadStringA(ghUiInst, 0x1Eu, string64, 15);\r\n\t\t\t\tif (!strcmp(string64, sgpHeroInfo->name)) {\r\n\t\t\t\t\tPostMessageA(hWnd, 0xBD1u, 0, 0);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tSelHero_PrintHeroInfo(hWnd, sgpHeroInfo);\r\n\t\t\t} else {\r\n\t\t\t\tLoadStringA(ghUiInst, 0x11u, string64, 63);\r\n\t\t\t\tSelYesNo_SelOkDialog(hWnd, string64, Buffer, 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPostMessageA(hWnd, 0xBD0u, 0, 0);\r\n}\r\n// 1002A428: using guessed type int selhero_numheroesleft;\r\n\r\n// ref: 0x1000BEDB\r\n_uiheroinfo *__fastcall SelHero_GetNextHeroFromStr(_uiheroinfo *pInfo, char *name)\r\n{\r\n\t_uiheroinfo *v2; // ebx\r\n\t_uiheroinfo *v3; // ebp\r\n\t_uiheroinfo *v4; // edi\r\n\r\n\tv2 = pInfo;\r\n\tv3 = 0;\r\n\tv4 = 0;\r\n\tif (pInfo) {\r\n\t\twhile (!v4) {\r\n\t\t\tif (!strcmp(pInfo->name, name)) {\r\n\t\t\t\tv4 = pInfo;\r\n\t\t\t} else {\r\n\t\t\t\tv3    = pInfo;\r\n\t\t\t\tpInfo = pInfo->next;\r\n\t\t\t}\r\n\t\t\tif (!pInfo) {\r\n\t\t\t\tif (!v4)\r\n\t\t\t\t\treturn v2;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (v3)\r\n\t\t\tv3->next = v4->next;\r\n\t\telse\r\n\t\t\tv2 = v4->next;\r\n\t\tSelHero_FreeSomeMemory(v4);\r\n\t}\r\n\treturn v2;\r\n}\r\n\r\n// ref: 0x1000BF33\r\nvoid __fastcall SelHero_FreeSomeMemory(void *ptr)\r\n{\r\n\tif (ptr)\r\n\t\tSMemFree(ptr, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelHero.cpp\", 131, 0);\r\n}\r\n\r\n// ref: 0x1000BF4A\r\n_uiheroinfo *__fastcall SelHero_GetHeroSlotFromName(_uiheroinfo *pInfo, const char *name)\r\n{\r\n\t_uiheroinfo *i; // esi\r\n\r\n\tfor (i = pInfo; i && _strcmpi(i->name, name); i = i->next)\r\n\t\t;\r\n\treturn i;\r\n}\r\n\r\n// ref: 0x1000BF6D\r\nvoid __fastcall SelHero_DoHeroSelList(HWND hWnd)\r\n{\r\n\tBOOL v2; // eax\r\n\tint v3;  // edx\r\n\r\n\tv2 = SDlgDialogBoxParam(ghUiInst, \"SELLIST_DIALOG\", (int)hWnd, SelList_WndProc, 0);\r\n\tif (v2 == 1) {\r\n\t\tif (!strlen(selhero_heronamestr)) {\r\n\t\t\tPostMessageA(hWnd, 0xBD1u, 0, 0);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (selhero_is_good == 1) {\r\n\t\t\tPostMessageA(hWnd, 0xBD5u, 0, 0);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (selhero_hero_hassaved) {\r\n\t\t\tPostMessageA(hWnd, 0xBD3u, 0, 0);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tselhero_difficulty = 0;\r\n\t\tv3                 = 1;\r\n\tLABEL_13:\r\n\t\tSelHero_DoHeroEndFade(hWnd, v3);\r\n\t\treturn;\r\n\t}\r\n\tif (v2 != 1006) {\r\n\t\tv3 = 4;\r\n\t\tgoto LABEL_13;\r\n\t}\r\n\tPostMessageA(hWnd, 0xBD7u, 0, 0);\r\n}\r\n// 1002A420: using guessed type int selhero_difficulty;\r\n// 1002A424: using guessed type int selhero_hero_hassaved;\r\n\r\n// ref: 0x1000BFF9\r\nvoid __fastcall SelHero_DoHeroSelClass(HWND hWnd)\r\n{\r\n\tBOOL v2;         // eax\r\n\tint v3;          // eax\r\n\tchar Buffer[32]; // [esp+8h] [ebp-20h]\r\n\r\n\tv2 = SDlgDialogBoxParam(ghUiInst, \"SELCLASS_DIALOG\", (int)hWnd, SelClass_WndProc, 0);\r\n\tif (v2 == -1 || v2 == 2) {\r\n\t\tLoadStringA(ghUiInst, 0x1Eu, Buffer, 31);\r\n\t\tif (!strcmp(Buffer, sgpHeroInfo->name))\r\n\t\t\tSelHero_DoHeroEndFade(hWnd, 4);\r\n\t\telse\r\n\t\t\tPostMessageA(hWnd, 0xBD0u, 0, 0);\r\n\t} else {\r\n\t\tv3 = v2 - 1063;\r\n\t\tif (v3) {\r\n\t\t\tif (v3 == 1)\r\n\t\t\t\theroinfo_create.heroclass = 2;\r\n\t\t\telse\r\n\t\t\t\theroinfo_create.heroclass = 0;\r\n\t\t} else {\r\n\t\t\theroinfo_create.heroclass = 1;\r\n\t\t}\r\n\t\tPostMessageA(hWnd, 0xBD2u, 0, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000C09B\r\nvoid __fastcall SelHero_DoEnterName(HWND hWnd)\r\n{\r\n\tchar namestr[16]; // [esp+8h] [ebp-10h]\r\n\r\n\tif (SDlgDialogBoxParam(ghUiInst, \"ENTERNAME_DIALOG\", (int)hWnd, EntName_WndProc, (int)namestr) == 1) {\r\n\t\tnamestr[15] = 0;\r\n\t\tif (SelHero_CreateHero(hWnd, namestr))\r\n\t\t\tPostMessageA(hWnd, 0xBD6u, 0, 0);\r\n\t\telse\r\n\t\t\tPostMessageA(hWnd, 0xBD2u, 0, 0);\r\n\t} else {\r\n\t\tPostMessageA(hWnd, 0xBD1u, 0, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000C0F9\r\nBOOL __fastcall SelHero_CreateHero(HWND hWnd, char *name)\r\n{\r\n\t_uiheroinfo *v2;     // edi\r\n\tchar dialogstr[144]; // [esp+Ch] [ebp-138h]\r\n\tchar v5[128];        // [esp+9Ch] [ebp-A8h]\r\n\tchar Buffer[32];     // [esp+11Ch] [ebp-28h]\r\n\r\n\tif (SelHero_GetHeroIsGood() == 1)\r\n\t\tLoadStringA(ghUiInst, 0x20u, Buffer, 31);\r\n\telse\r\n\t\tLoadStringA(ghUiInst, 0x1Fu, Buffer, 31);\r\n\tif (!UiValidPlayerName(name)) {\r\n\t\tLoadStringA(ghUiInst, 0xFu, v5, 127);\r\n\t\tSelYesNo_SelOkDialog(hWnd, v5, Buffer, 1);\r\n\t\treturn 0;\r\n\t}\r\n\tv2 = SelHero_GetHeroSlotFromName(sgpHeroInfo, name);\r\n\tif (v2) {\r\n\t\tLoadStringA(ghUiInst, 8u, v5, 127);\r\n\t\twsprintfA(dialogstr, v5, v2->name);\r\n\t\tif (SelYesNo_YesNoDialog(hWnd, dialogstr, Buffer, 1) == 2)\r\n\t\t\treturn 0;\r\n\t}\r\n\tstrcpy(heroinfo_create.name, name);\r\n\theroinfo_create.hassaved = 0;\r\n\tif (!selhero_fncreate(&heroinfo_create)) {\r\n\t\tLoadStringA(ghUiInst, 0x10u, v5, 127);\r\n\t\tOkCancel_DoOkDialog(hWnd, v5, 1);\r\n\t\treturn 0;\r\n\t}\r\n\tselhero_is_created = 1;\r\n\treturn 1;\r\n}\r\n// 1002A45C: using guessed type int selhero_is_created;\r\n\r\n// ref: 0x1000C21A\r\nvoid __fastcall SelHero_DoSelLoad(HWND hWnd)\r\n{\r\n\tBOOL v2; // eax\r\n\r\n\tv2 = SDlgDialogBoxParam(ghUiInst, \"SELLOAD_DIALOG\", (int)hWnd, SelLoad_WndProc, 0);\r\n\tif (v2 == -1 || v2 == 2) {\r\n\t\tPostMessageA(hWnd, 0xBD0u, 0, 0);\r\n\t} else if (v2 == 1106) {\r\n\t\tPostMessageA(hWnd, 0xBD5u, 0, 0);\r\n\t} else {\r\n\t\tPostMessageA(hWnd, 0xBD4u, 0, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000C269\r\nvoid __fastcall SelHero_DoSelDiff(HWND hWnd)\r\n{\r\n\t_uiheroinfo *v3;    // eax\r\n\tint v4;             // eax\r\n\tchar Buffer[256];   // [esp+4h] [ebp-208h]\r\n\tchar v6[128];       // [esp+104h] [ebp-108h]\r\n\tchar v7[128];       // [esp+184h] [ebp-88h]\r\n\t_gamedata gameData; // [esp+204h] [ebp-8h]\r\n\r\n\tif (!SelHero_GetHeroIsGood()) {\r\n\t\tSelHero_SetHeroDifficulty(0);\r\n\tLABEL_3:\r\n\t\tSelHero_DoHeroEndFade(hWnd, 1);\r\n\t\treturn;\r\n\t}\r\n\tCreaDung_SetDelSpin(1);\r\n\tif (SDlgDialogBoxParam(ghUiInst, \"SELDIFF_DIALOG\", (int)hWnd, CreaDung_WndProc, selhero_is_good) == 1) {\r\n\t\tv3 = SelHero_GetHeroSlotFromName(sgpHeroInfo, selhero_heronamestr);\r\n\t\tUiCreatePlayerDescription(v3, 'DBLO', v7);\r\n\t\tgameData.bDiff = selhero_difficulty;\r\n\t\tConnect_SetDiffString(&gameData, selhero_heronamestr, v7, v6, 128);\r\n\t\tv4 = UiAuthCallback(2, selhero_heronamestr, v7, 0, v6, Buffer, 256);\r\n\t\tif (v4)\r\n\t\t\tgoto LABEL_3;\r\n\t\tSelYesNo_SelOkDialog(hWnd, Buffer, 0, 1);\r\n\t\tPostMessageA(hWnd, 0xBD4u, 0, 0);\r\n\t} else {\r\n\t\tPostMessageA(hWnd, 0xBD3u, 0, 0);\r\n\t}\r\n}\r\n// 1002A420: using guessed type int selhero_difficulty;\r\n\r\n// ref: 0x1000C364\r\nvoid __fastcall SelHero_DeleteAndFree(HWND hWnd)\r\n{\r\n\tvoid **v2; // eax\r\n\r\n\tDoom_DeleteFreeProcs(hWnd, selhero_msgtbl_info);\r\n\tDoom_DeleteFreeProcs(hWnd, selhero_msgtbl_3);\r\n\tDoom_DeleteFreeProcs(hWnd, selhero_msgtbl_string);\r\n\tTitle_KillTitleTimer(hWnd);\r\n\tSelHero_FreeAllHeroes(sgpHeroInfo);\r\n\tif (selhero_buffer) {\r\n\t\tSMemFree(selhero_buffer, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelHero.cpp\", 744, 0);\r\n\t\tselhero_buffer = 0;\r\n\t}\r\n\tv2 = (void **)GetWindowLongA(hWnd, -21);\r\n\tlocal_FreeMemPtr(v2);\r\n}\r\n\r\n// ref: 0x1000C3CE\r\nvoid __fastcall SelHero_FreeAllHeroes(_uiheroinfo *pInfo)\r\n{\r\n\t_uiheroinfo *v1; // esi\r\n\r\n\tif (pInfo) {\r\n\t\tdo {\r\n\t\t\tv1 = pInfo->next;\r\n\t\t\tSelHero_FreeSomeMemory(pInfo);\r\n\t\t\tpInfo = v1;\r\n\t\t} while (v1);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000C3E2\r\nvoid __fastcall SelHero_DoHeroEndFade(HWND hWnd, int a2)\r\n{\r\n\tvoid *v2; // edi\r\n\r\n\tv2 = (void *)a2;\r\n\tFade_Range5SetZero();\r\n\tFade_UpdatePaletteRange(10);\r\n\tSDlgEndDialog(hWnd, v2);\r\n}\r\n\r\n// ref: 0x1000C3FF\r\nvoid __fastcall SelHero_LoadHeroGFX(HWND hWnd)\r\n{\r\n\tHWND v1;    // eax\r\n\tint v2;     // eax\r\n\tHWND v3;    // eax\r\n\tint v4;     // eax\r\n\tHWND v5;    // eax\r\n\tint v6;     // eax\r\n\tHWND v7;    // eax\r\n\tint v8;     // eax\r\n\tHWND v9;    // eax\r\n\tint v10;    // eax\r\n\tDWORD *v12; // eax MAPDST\r\n\r\n\tSelHero_SelectHeroRegion(hWnd);\r\n\tv12 = local_AllocWndLongData();\r\n\tif (v12) {\r\n\t\tSetWindowLongA(hWnd, -21, (LONG)v12);\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, \"ui_art\\\\selhero.pcx\", (BYTE **)v12, v12 + 1, 0);\r\n\t\tFade_NoInputAndArt(hWnd, 1);\r\n\t}\r\n\tlocal_LoadArtImage(\"ui_art\\\\heros.pcx\", &selhero_buffer, selhero_sizedata);\r\n\tSetActiveWindow(hWnd);\r\n\tTitle_LoadImgSetTimer(hWnd, \"ui_art\\\\smlogo.pcx\");\r\n\tDoom_ParseWndProc3(hWnd, selhero_msgtbl_string, AF_BIGGRAY);\r\n\tDoom_ParseWndProc3(hWnd, selhero_msgtbl_3, AF_SMALLGRAY);\r\n\tDoom_ParseWndProc3(hWnd, selhero_msgtbl_info, AF_SMALLGRAY);\r\n\tselhero_hero_hassaved  = 0;\r\n\tselhero_heronamestr[0] = 0;\r\n\tv1                     = GetDlgItem(hWnd, 1014);\r\n\tv2                     = GetWindowLongA(v1, -21);\r\n\tlocal_SetWndLongStr(v2, \"--\");\r\n\tv3 = GetDlgItem(hWnd, 1018);\r\n\tv4 = GetWindowLongA(v3, -21);\r\n\tlocal_SetWndLongStr(v4, \"--\");\r\n\tv5 = GetDlgItem(hWnd, 1017);\r\n\tv6 = GetWindowLongA(v5, -21);\r\n\tlocal_SetWndLongStr(v6, \"--\");\r\n\tv7 = GetDlgItem(hWnd, 1016);\r\n\tv8 = GetWindowLongA(v7, -21);\r\n\tlocal_SetWndLongStr(v8, \"--\");\r\n\tv9  = GetDlgItem(hWnd, 1015);\r\n\tv10 = GetWindowLongA(v9, -21);\r\n\tlocal_SetWndLongStr(v10, \"--\");\r\n\tSelHero_SetStaticBMP(hWnd, 3);\r\n\tDoom_ParseWndProc4(hWnd, selhero_msgtbl_info, AF_SMALLGRAY);\r\n}\r\n// 1002A424: using guessed type int selhero_hero_hassaved;\r\n\r\n// ref: 0x1000C49F\r\nvoid __fastcall SelHero_SelectHeroRegion(HWND hWnd)\r\n{\r\n\t_uiheroinfo *v2; // esi\r\n\t_uiheroinfo *v3; // [esp+10h] [ebp-44h]\r\n\tchar Buffer[64]; // [esp+14h] [ebp-40h]\r\n\r\n\tv2       = SelHero_AllocHeroInfo();\r\n\tv2->next = 0;\r\n\tLoadStringA(ghUiInst, 0x1Eu, v2->name, 15);\r\n\tv2->level             = 0;\r\n\tsgpHeroInfo           = SelRegn_SetNextHero(sgpHeroInfo, v2);\r\n\tv3                    = sgpHeroInfo;\r\n\tselhero_numheroesleft = 1;\r\n\tif (!selhero_fninfo(SelHero_GetHeroInfo)) {\r\n\t\tLoadStringA(ghUiInst, 0x12u, Buffer, 64);\r\n\t\tOkCancel_DoOkDialog(hWnd, Buffer, 1);\r\n\t}\r\n\tif (v3 == sgpHeroInfo)\r\n\t\tPostMessageA(hWnd, 0xBD1u, 0, 0);\r\n\telse\r\n\t\tPostMessageA(hWnd, 0xBD0u, 0, 0);\r\n}\r\n// 1002A428: using guessed type int selhero_numheroesleft;\r\n\r\n// ref: 0x1000C541\r\nBOOL __stdcall SelHero_GetHeroInfo(_uiheroinfo *pInfo)\r\n{\r\n\t_uiheroinfo *v1; // esi\r\n\t_uiheroinfo *v2; // eax\r\n\r\n\tv1 = SelHero_AllocHeroInfo();\r\n\tmemcpy(v1, pInfo, 0x2Cu);\r\n\tv1->next = 0;\r\n\tv2       = SelRegn_SetNextHero(sgpHeroInfo, v1);\r\n\t++selhero_numheroesleft;\r\n\tsgpHeroInfo = v2;\r\n\treturn 1;\r\n}\r\n// 1002A428: using guessed type int selhero_numheroesleft;\r\n\r\n// ref: 0x1000C57A\r\nBOOL __stdcall UiSelHeroSingDialog(\r\n    BOOL(__stdcall *fninfo)(BOOL(__stdcall *fninfofunc)(_uiheroinfo *)),\r\n    BOOL(__stdcall *fncreate)(_uiheroinfo *),\r\n    BOOL(__stdcall *fnremove)(_uiheroinfo *),\r\n    BOOL(__stdcall *fnstats)(unsigned int, _uidefaultstats *),\r\n    int *dlgresult,\r\n    char *name,\r\n    int *difficulty)\r\n{\r\n\tint v7; // eax\r\n\tint v8; // edi\r\n\r\n\tartfont_LoadAllFonts();\r\n\tselhero_fninfo   = fninfo;\r\n\tselhero_fncreate = fncreate;\r\n\tselhero_fnremove = fnremove;\r\n\tselhero_fnstats  = fnstats;\r\n\tsgpHeroInfo      = 0;\r\n\tselhero_is_good  = 0;\r\n\tv7               = (int)SDrawGetFrameWindow(NULL);\r\n\tv8               = SDlgDialogBoxParam(ghUiInst, \"SELHERO_DIALOG\", v7, SelHero_WndProc, 0);\r\n\tif (dlgresult)\r\n\t\t*dlgresult = v8;\r\n\tif (name)\r\n\t\tstrcpy(name, selhero_heronamestr);\r\n\tif (difficulty)\r\n\t\t*difficulty = selhero_difficulty;\r\n\tif (v8 != 4)\r\n\t\tartfont_FreeAllFonts();\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 1002A420: using guessed type int selhero_difficulty;\r\n"
  },
  {
    "path": "DiabloUI/selipx.cpp",
    "content": "// ref: 0x1000C610\r\nvoid *SelIPX_1000C610() { return 0; }\r\n/* {\r\n\treturn SMemAlloc(268, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelIPX.cpp\", 105, 0);\r\n} */\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000C629\r\nsigned int SelIPX_1000C629() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A4A4 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A4A4: using guessed type int dword_1002A4A4;\r\n\r\n// ref: 0x1000C634\r\nBOOL __fastcall SelIPX_1000C634(int a1, int a2, int a3, DWORD *a4, int a5, int playerid) { return 0; }\r\n/* {\r\n\tint v6; // esi\r\n\r\n\tdword_1002A49C = a3;\r\n\tdword_1002A4AC = a2;\r\n\tdword_1002A4BC = a5;\r\n\tdword_1002A4A0 = a4;\r\n\tgnIpxPlayerid = playerid;\r\n\tartfont_10001159();\r\n\tv6 = SDlgDialogBoxParam(hInstance, \"SELIPXGAME_DIALOG\", a4[2], SelIPX_1000C692, 0);\r\n\tartfont_100010C8();\r\n\treturn v6 == 1;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A49C: using guessed type int dword_1002A49C;\r\n// 1002A4A8: using guessed type int gnIpxPlayerid;\r\n// 1002A4AC: using guessed type int dword_1002A4AC;\r\n// 1002A4BC: using guessed type int dword_1002A4BC;\r\n\r\n// ref: 0x1000C692\r\nint __stdcall SelIPX_1000C692(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tHWND v6; // eax\r\n\tint v7; // [esp+0h] [ebp-Ch]\r\n\tint savedregs; // [esp+Ch] [ebp+0h]\r\n\r\n\tif ( Msg > 0x113 )\r\n\t{\r\n\t\tswitch ( Msg )\r\n\t\t{\r\n\t\t\tcase 0x201u:\r\n\t\t\t\tgoto LABEL_35;\r\n\t\t\tcase 0x202u:\r\n\t\t\t\tv6 = GetDlgItem(hWnd, 1105);\r\n\t\t\t\tif ( !Sbar_100099C0(v6) )\r\n\t\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\t\tgoto LABEL_12;\r\n\t\t\tcase 0x203u:\r\nLABEL_35:\r\n\t\t\t\tSelIPX_1000D696(hWnd, (unsigned short)lParam, (unsigned int)lParam >> 16);\r\n\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tif ( Msg != 2024 )\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\tif ( !Fade_1000739F() )\r\n\t\t\tFade_100073FD(hWnd, v7);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 275 )\r\n\t{\r\n\t\tif ( wParam == 3 )\r\n\t\t\tSelIPX_1000C9DA(hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tSelIPX_1000CC41(hWnd);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg <= 0x103 )\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tif ( Msg <= 0x105 )\r\n\t{\r\n\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 272 )\r\n\t{\r\n\t\tSelIPX_1000CD4A(hWnd);\r\n\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 273 )\r\n\t{\r\n\t\tif ( HIWORD(wParam) == 7 )\r\n\t\t{\r\n\t\t\tFocus_100075B7(hWnd, (HWND)lParam);\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tif ( HIWORD(wParam) != 6 )\r\n\t\t{\r\n\t\t\tif ( wParam == 327681 )\r\n\t\t\t{\r\n\t\t\t\tSelIPX_1000D3C5(hWnd, (int)&savedregs);\r\n\t\t\t}\r\n\t\t\telse if ( (WORD)wParam == 2 )\r\n\t\t\t{\r\n\t\t\t\tSelIPX_1000D3A0((int)hWnd, 2);\r\n\t\t\t}\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tFocus_10007458((void *)lParam);\r\n\t\tFocus_100075DC(hWnd, (HWND)lParam);\r\n\t\tSelIPX_1000C818(hWnd, (unsigned short)wParam);\r\nLABEL_12:\r\n\t\tSelIPX_1000C982(hWnd);\r\n\t}\r\n\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000C818\r\nLONG __fastcall SelIPX_1000C818(HWND hDlg, int nIDDlgItem) { return 0; }\r\n/* {\r\n\tHWND v2; // ebx\r\n\tHWND v3; // edi\r\n\tLONG result; // eax\r\n\tconst char *v5; // edi\r\n\tint v6; // eax\r\n\tCHAR *v7; // edx\r\n\tCHAR v8; // [esp+Ch] [ebp-280h]\r\n\tCHAR v9; // [esp+10Ch] [ebp-180h]\r\n\tchar v10; // [esp+18Ch] [ebp-100h]\r\n\tCHAR Buffer; // [esp+20Ch] [ebp-80h]\r\n\tCHAR v12; // [esp+22Ch] [ebp-60h]\r\n\tchar v13; // [esp+24Ch] [ebp-40h]\r\n\tunsigned short v14; // [esp+260h] [ebp-2Ch]\r\n\tunsigned char v15; // [esp+262h] [ebp-2Ah]\r\n\tchar v16; // [esp+278h] [ebp-14h]\r\n\tunsigned char v17; // [esp+27Ch] [ebp-10h]\r\n\tint v18; // [esp+280h] [ebp-Ch]\r\n\tint v19; // [esp+284h] [ebp-8h]\r\n\tHWND hWnd; // [esp+288h] [ebp-4h]\r\n\r\n\tv2 = hDlg;\r\n\tv3 = GetDlgItem(hDlg, nIDDlgItem);\r\n\thWnd = GetDlgItem(v2, 1098);\r\n\tresult = GetWindowLongA(v3, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = *(DWORD *)(result + 12);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv5 = (const char *)(result + 140);\r\n\t\t\tif ( *(DWORD *)(result + 4) )\r\n\t\t\t{\r\n\t\t\t\tif ( result == -140 || strlen((const char *)(result + 140)) < 0x10 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv6 = GetWindowLongA(hWnd, -21);\r\n\t\t\t\t\tv7 = (CHAR *)&byte_10029448;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tv19 = (int)&byte_10029448;\r\n\t\t\t\t\tv18 = (int)&byte_10029448;\r\n\t\t\t\t\tstrcpy(&v10, v5);\r\n\t\t\t\t\tif ( Connect_10003DAF(&v10, (int)&v16, (int)&v19, (int)&v18)\r\n\t\t\t\t\t  && Connect_10003E61((const char *)v18, &v13) )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tLoadStringA(hInstance, v17 + 1003, &Buffer, 31);\r\n\t\t\t\t\t\tLoadStringA(hInstance, v15 + 4, &v12, 31);\r\n\t\t\t\t\t\tLoadStringA(hInstance, 0x31u, &v9, 127);\r\n\t\t\t\t\t\twsprintfA(&v8, &v9, &Buffer, v19, v14, &v12);\r\n\t\t\t\t\t\tv6 = GetWindowLongA(hWnd, -21);\r\n\t\t\t\t\t\tv7 = &v8;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv6 = GetWindowLongA(hWnd, -21);\r\n\t\t\t\t\t\tv7 = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv6 = GetWindowLongA(hWnd, -21);\r\n\t\t\t\tv7 = (CHAR *)v5;\r\n\t\t\t}\r\n\t\t\tlocal_10007FA4(v6, v7);\r\n\t\t\tresult = Doom_10006A13(v2, (int *)&unk_10023104, 1);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000C982\r\nHWND UNKCALL SelIPX_1000C982(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = SelIPX_1000C99F();\r\n\treturn Sbar_10009A99(v1, 1105, dword_1002A4B8, v2);\r\n} */\r\n\r\n// ref: 0x1000C99F\r\nint SelIPX_1000C99F() { return 0; }\r\n/* {\r\n\tHWND v0; // eax\r\n\tLONG v1; // eax\r\n\tDWORD *v2; // ecx\r\n\tDWORD *v3; // eax\r\n\tint v5; // edx\r\n\r\n\tv0 = GetFocus();\r\n\tif ( !v0 )\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(v0, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = (DWORD *)dword_1002A4B4;\r\n\tif ( !dword_1002A4B4 )\r\n\t\treturn 0;\r\n\tv3 = *(DWORD **)(v1 + 12);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( v2 == v3 )\r\n\t\t\tbreak;\r\n\t\tv2 = (DWORD *)*v2;\r\n\t\t++v5;\r\n\t}\r\n\twhile ( v2 );\r\n\treturn v5;\r\n} */\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000C9DA\r\nconst char *UNKCALL SelIPX_1000C9DA(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tconst char *result; // eax\r\n\tint v3; // ST0C_4\r\n\tHWND v4; // eax\r\n\tHWND v5; // eax\r\n\tint v6; // eax\r\n\r\n\tv1 = hDlg;\r\n\tdword_1002A4B0 = 0;\r\n\tSelIPX_1000CA64((DWORD *)dword_1002A4B4);\r\n\tSNetEnumGames(0, 0, SelIPX_1000CAD5, 0);\r\n\tresult = (const char *)SelIPX_1000CA71((DWORD *)dword_1002A4B4);\r\n\tdword_1002A4B4 = (int)result;\r\n\tif ( dword_1002A4B0 )\r\n\t{\r\n\t\tSelIPX_1000CB83(v1, result);\r\n\t\tv3 = dword_1002A4B8 > 6;\r\n\t\tv4 = GetDlgItem(v1, 1105);\r\n\t\tShowWindow(v4, v3);\r\n\t\tv5 = GetFocus();\r\n\t\tv6 = GetWindowLongA(v5, -12);\r\n\t\tSelIPX_1000C818(v1, v6);\r\n\t\tresult = (const char *)SelIPX_1000C982(v1);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010436: using guessed type int __stdcall SNetEnumGames(DWORD, DWORD, DWORD, DWORD);\r\n// 1002A4B0: using guessed type int dword_1002A4B0;\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000CA64\r\nvoid __fastcall SelIPX_1000CA64(DWORD *a1) { return; }\r\n/* {\r\n\twhile ( a1 )\r\n\t{\r\n\t\ta1[2] = 0;\r\n\t\ta1 = (DWORD *)*a1;\r\n\t}\r\n} */\r\n\r\n// ref: 0x1000CA71\r\nDWORD **__fastcall SelIPX_1000CA71(DWORD *a1) { return 0; }\r\n/* {\r\n\tDWORD **v1; // edi\r\n\tDWORD *v2; // esi\r\n\r\n\tv1 = (DWORD **)a1;\r\n\tv2 = 0;\r\n\twhile ( a1 )\r\n\t{\r\n\t\tif ( a1[2] || !a1[1] )\r\n\t\t{\r\n\t\t\tv2 = a1;\r\n\t\t\ta1 = (DWORD *)*a1;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tif ( v2 )\r\n\t\t\t\t*v2 = *a1;\r\n\t\t\telse\r\n\t\t\t\tv1 = (DWORD **)*a1;\r\n\t\t\tSelIPX_1000CAC1(a1);\r\n\t\t\t--dword_1002A4B8;\r\n\t\t\tdword_1002A4B0 = 1;\r\n\t\t\tif ( v2 )\r\n\t\t\t\ta1 = (DWORD *)*v2;\r\n\t\t\telse\r\n\t\t\t\ta1 = *v1;\r\n\t\t}\r\n\t}\r\n\treturn v1;\r\n} */\r\n// 1002A4B0: using guessed type int dword_1002A4B0;\r\n\r\n// ref: 0x1000CAC1\r\nint UNKCALL SelIPX_1000CAC1(void *arg) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tif ( arg )\r\n\t\tresult = SMemFree(arg, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelIPX.cpp\", 110, 0);\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000CAD5\r\nvoid *__stdcall SelIPX_1000CAD5(int a1, char *a2, char *a3) { return 0; }\r\n/* {\r\n\tDWORD *v3; // eax\r\n\tint result; // eax\r\n\tint v5; // esi\r\n\tDWORD *v6; // eax\r\n\r\n\tv3 = SelIPX_1000CB73((DWORD *)dword_1002A4B4, a1);\r\n\tif ( v3 )\r\n\t{\r\n\t\tv3[2] = 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tresult = SelIPX_1000C610();\r\n\t\tv5 = result;\r\n\t\tif ( !result )\r\n\t\t\treturn result;\r\n\t\t*(DWORD *)result = 0;\r\n\t\t*(DWORD *)(result + 4) = a1;\r\n\t\t*(DWORD *)(result + 8) = 1;\r\n\t\tstrcpy((char *)(result + 12), a2);\r\n\t\tstrcpy((char *)(v5 + 140), a3);\r\n\t\tv6 = SelIPX_1000CB50((DWORD *)dword_1002A4B4, (DWORD *)v5);\r\n\t\t++dword_1002A4B8;\r\n\t\tdword_1002A4B4 = (int)v6;\r\n\t\tdword_1002A4B0 = 1;\r\n\t}\r\n\treturn 1;\r\n} */\r\n// 1002A4B0: using guessed type int dword_1002A4B0;\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000CB50\r\nDWORD *__fastcall SelIPX_1000CB50(DWORD *a1, DWORD *a2) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\tDWORD *v3; // edi\r\n\tDWORD *i; // esi\r\n\r\n\tresult = a1;\r\n\tv3 = 0;\r\n\tfor ( i = a1; i; i = (DWORD *)*i )\r\n\t\tv3 = i;\r\n\t*a2 = i;\r\n\tif ( !v3 )\r\n\t\treturn a2;\r\n\t*v3 = a2;\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000CB73\r\nDWORD *__fastcall SelIPX_1000CB73(DWORD *a1, int a2) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\r\n\tfor ( result = a1; result && result[1] != a2; result = (DWORD *)*result )\r\n\t\t;\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000CB83\r\nint __fastcall SelIPX_1000CB83(HWND a1, const char *a2) { return 0; }\r\n/* {\r\n\tint *v2; // ebp\r\n\tHWND v3; // eax\r\n\tHWND v4; // esi\r\n\tint v5; // eax\r\n\tint v6; // eax\r\n\tconst char *v8; // [esp+4h] [ebp-8h]\r\n\tHWND hDlg; // [esp+8h] [ebp-4h]\r\n\r\n\tv8 = a2;\r\n\thDlg = a1;\r\n\tv2 = &dword_10023118;\r\n\tif ( dword_10023118 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv3 = GetDlgItem(hDlg, *v2);\r\n\t\t\tv4 = v3;\r\n\t\t\tif ( v3 )\r\n\t\t\t{\r\n\t\t\t\tif ( v8 )\r\n\t\t\t\t{\r\n\t\t\t\t\tEnableWindow(v3, 1);\r\n\t\t\t\t\tv6 = GetWindowLongA(v4, -21);\r\n\t\t\t\t\tif ( v6 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t*(DWORD *)(v6 + 12) = v8;\r\n\t\t\t\t\t\tlocal_10007FA4(v6, v8 + 12);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tv8 = *(const char **)v8;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( v3 == GetFocus() )\r\n\t\t\t\t\t\tSelIPX_1000CCD9(v4);\r\n\t\t\t\t\tEnableWindow(v4, 0);\r\n\t\t\t\t\tv5 = GetWindowLongA(v4, -21);\r\n\t\t\t\t\tif ( v5 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t*(DWORD *)(v5 + 12) = 0;\r\n\t\t\t\t\t\tlocal_10007FA4(v5, &byte_10029448);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t++v2;\r\n\t\t}\r\n\t\twhile ( *v2 );\r\n\t}\r\n\treturn Doom_1000680A(hDlg, &dword_10023118, 2, 1);\r\n} */\r\n// 10023118: using guessed type int dword_10023118;\r\n\r\n// ref: 0x1000CC41\r\nint UNKCALL SelIPX_1000CC41(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tDWORD *v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tSelIPX_1000CCC5((DWORD *)dword_1002A4B4);\r\n\tdword_1002A4B4 = 0;\r\n\tSbar_10009CD2(v1, 1105);\r\n\tDoom_10006C53(v1, &dword_10023118);\r\n\tDoom_10006C53(v1, (int *)&unk_1002310C);\r\n\tDoom_10006C53(v1, (int *)&unk_10023104);\r\n\tDoom_10006C53(v1, (int *)&unk_100230FC);\r\n\tDoom_10006C53(v1, (int *)&unk_100230F0);\r\n\tv2 = (DWORD *)GetWindowLongA(v1, -21);\r\n\tlocal_10007F72(v2);\r\n\tTitle_100100E7(v1);\r\n\tFocus_10007818(v1);\r\n\treturn SDrawClearSurface();\r\n} */\r\n// 1001043C: using guessed type DWORD __stdcall SDrawClearSurface();\r\n// 10023118: using guessed type int dword_10023118;\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000CCC5\r\nint __fastcall SelIPX_1000CCC5(DWORD *a1) { return 0; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tint result; // eax\r\n\r\n\tif ( a1 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv1 = (DWORD *)*a1;\r\n\t\t\tresult = SelIPX_1000CAC1(a1);\r\n\t\t\ta1 = v1;\r\n\t\t}\r\n\t\twhile ( v1 );\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000CCD9\r\nHWND UNKCALL SelIPX_1000CCD9(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1085]; // [esp+0h] [ebp-1118h]\r\n\tint v5; // [esp+10F4h] [ebp-24h]\r\n\tint v6; // [esp+1100h] [ebp-18h]\r\n\tint v7; // [esp+1104h] [ebp-14h]\r\n\tint v8; // [esp+1108h] [ebp-10h]\r\n\tint v9; // [esp+110Ch] [ebp-Ch]\r\n\tint v10; // [esp+1110h] [ebp-8h]\r\n\tint v11; // [esp+1114h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1093;\r\n\tv7 = 1088;\r\n\tv8 = 1089;\r\n\tv9 = 1090;\r\n\tv10 = 1091;\r\n\tv11 = 1092;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000CCD9: using guessed type int nIDDlgItem[1085];\r\n\r\n// ref: 0x1000CD4A\r\nHWND UNKCALL SelIPX_1000CD4A(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // ST1C_4\r\n\tint v3; // eax\r\n\tint *v4; // edi\r\n\tHWND v5; // ebp\r\n\tint v6; // eax\r\n\tHWND result; // eax\r\n\tHWND v8; // eax\r\n\tHWND v9; // [esp+0h] [ebp-4Ch]\r\n\tCHAR Buffer; // [esp+Ch] [ebp-40h]\r\n\r\n\tv1 = hWnd;\r\n\tSelIPX_1000CEE6(hWnd);\r\n\tFocus_100077E9((int)v1, \"ui_art\\\\focus16.pcx\", v9);\r\n\tTitle_1001009E(v1, (int)\"ui_art\\\\smlogo.pcx\", v2);\r\n\tv3 = local_10007F46();\r\n\tv4 = (int *)v3;\r\n\tif ( v3 )\r\n\t{\r\n\t\tSetWindowLongA(v1, -21, v3);\r\n\t\tlocal_10007944((int)v1, 0, &byte_10029448, -1, 1, (int)\"ui_art\\\\selgame.pcx\", v4, v4 + 1, 0);\r\n\t\tFade_100073C5(v1, 1);\r\n\t}\r\n\tif ( SelGame_1000B67E() != 1230002254 )\r\n\t{\r\n\t\tv5 = GetDlgItem(v1, 1038);\r\n\t\tLoadStringA(hInstance, 0x4Du, &Buffer, 63);\r\n\t\tSetWindowTextA(v5, &Buffer);\r\n\t}\r\n\tDoom_100068AB(v1, (int *)&unk_100230F0, 5);\r\n\tDoom_100068AB(v1, (int *)&unk_100230FC, 3);\r\n\tDoom_100068AB(v1, (int *)&unk_10023104, 1);\r\n\tDoom_1000658C(v1, (int *)&unk_1002310C, 4, 0);\r\n\tDoom_1000658C(v1, &dword_10023118, 2, 1);\r\n\tdword_1002A4B8 = 0;\r\n\tv6 = SelIPX_1000C610();\r\n\tdword_1002A4B4 = v6;\r\n\tif ( v6 )\r\n\t{\r\n\t\t++dword_1002A4B8;\r\n\t\t*(DWORD *)(v6 + 4) = 0;\r\n\t\t*(BYTE *)(dword_1002A4B4 + 140) = 0;\r\n\t\t*(DWORD *)dword_1002A4B4 = 0;\r\n\t\tLoadStringA(hInstance, 0x24u, (LPSTR)(dword_1002A4B4 + 12), 127);\r\n\t\tLoadStringA(hInstance, 0x2Au, (LPSTR)(dword_1002A4B4 + 140), 127);\r\n\t}\r\n\tSNetEnumGames(0, 0, SelIPX_1000CAD5, 0);\r\n\tSelIPX_1000CB83(v1, (const char *)dword_1002A4B4);\r\n\tSDlgSetTimer(v1, 3, 1000, 0);\r\n\tresult = Sbar_10009BF1(v1, 1105);\r\n\tif ( dword_1002A4B8 <= 6 )\r\n\t{\r\n\t\tv8 = GetDlgItem(v1, 1105);\r\n\t\tresult = (HWND)ShowWindow(v8, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010412: using guessed type int __stdcall SDlgSetTimer(DWORD, DWORD, DWORD, DWORD);\r\n// 10010436: using guessed type int __stdcall SNetEnumGames(DWORD, DWORD, DWORD, DWORD);\r\n// 10023118: using guessed type int dword_10023118;\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000CEE6\r\nvoid UNKCALL SelIPX_1000CEE6(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // ebx\r\n\tint *v2; // edi\r\n\tHWND v3; // eax\r\n\tHWND v4; // esi\r\n\tvoid *v5; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = &dword_10023118;\r\n\tif ( dword_10023118 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv3 = GetDlgItem(v1, *v2);\r\n\t\t\tv4 = v3;\r\n\t\t\tif ( v3 )\r\n\t\t\t{\r\n\t\t\t\tv5 = (void *)GetWindowLongA(v3, -4);\r\n\t\t\t\tSetPropA(v4, \"UIOLDPROC\", v5);\r\n\t\t\t\tSetWindowLongA(v4, -4, (LONG)SelIPX_1000CF38);\r\n\t\t\t}\r\n\t\t\t++v2;\r\n\t\t}\r\n\t\twhile ( *v2 );\r\n\t}\r\n} */\r\n// 10023118: using guessed type int dword_10023118;\r\n\r\n// ref: 0x1000CF38\r\nLRESULT __stdcall SelIPX_1000CF38(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tLRESULT (__stdcall *v4)(HWND, UINT, WPARAM, LPARAM); // edi\r\n\tHWND v5; // eax\r\n\tUINT v7; // [esp-Ch] [ebp-18h]\r\n\tWPARAM v8; // [esp-8h] [ebp-14h]\r\n\tLPARAM v9; // [esp-4h] [ebp-10h]\r\n\r\n\tv4 = (LRESULT (__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, \"UIOLDPROC\");\r\n\tswitch ( Msg )\r\n\t{\r\n\t\tcase 2u:\r\n\t\t\tRemovePropA(hWnd, \"UIOLDPROC\");\r\n\t\t\tif ( !v4 )\r\n\t\t\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t\t\tSetWindowLongA(hWnd, -4, (LONG)v4);\r\n\t\t\tbreak;\r\n\t\tcase 0xFu:\r\n\t\t\tlocal_10007C95(hWnd);\r\n\t\t\treturn 0;\r\n\t\tcase 0x87u:\r\n\t\t\treturn 4;\r\n\t\tcase 0x100u:\r\n\t\t\tif ( wParam > 0x21 )\r\n\t\t\t{\r\n\t\t\t\tif ( wParam == 34 )\r\n\t\t\t\t{\r\n\t\t\t\t\tSelIPX_1000D0E1(hWnd);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\tif ( wParam > 0x24 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( wParam <= 0x26 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelIPX_1000D31C(hWnd);\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( wParam <= 0x28 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelIPX_1000D284(hWnd);\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( wParam == 46 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv9 = lParam;\r\n\t\t\t\t\t\tv8 = 46;\r\n\t\t\t\t\t\tv7 = 256;\r\n\t\t\t\t\t\tgoto LABEL_24;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tswitch ( wParam )\r\n\t\t\t\t{\r\n\t\t\t\t\tcase 0x21u:\r\n\t\t\t\t\t\tSelIPX_1000D1D4(hWnd);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 9u:\r\n\t\t\t\t\t\tif ( GetKeyState(16) >= 0 )\r\n\t\t\t\t\t\t\tSelIPX_1000D070(hWnd);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tSelIPX_1000CCD9(hWnd);\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t\tcase 0xDu:\r\n\t\t\t\t\t\tgoto LABEL_38;\r\n\t\t\t\t\tcase 0x1Bu:\r\n\t\t\t\t\t\tv9 = 0;\r\n\t\t\t\t\t\tv8 = 2;\r\n\t\t\t\t\t\tgoto LABEL_12;\r\n\t\t\t\t\tcase 0x20u:\r\nLABEL_38:\r\n\t\t\t\t\t\tv9 = 0;\r\n\t\t\t\t\t\tv8 = 1;\r\nLABEL_12:\r\n\t\t\t\t\t\tv7 = 273;\r\nLABEL_24:\r\n\t\t\t\t\t\tv5 = GetParent(hWnd);\r\n\t\t\t\t\t\tSendMessageA(v5, v7, v8, v9);\r\n\t\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t}\r\n\tif ( v4 )\r\n\t\treturn CallWindowProcA(v4, hWnd, Msg, wParam, lParam);\r\n\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n} */\r\n\r\n// ref: 0x1000D070\r\nHWND UNKCALL SelIPX_1000D070(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1085]; // [esp+0h] [ebp-1118h]\r\n\tint v5; // [esp+10F4h] [ebp-24h]\r\n\tint v6; // [esp+1100h] [ebp-18h]\r\n\tint v7; // [esp+1104h] [ebp-14h]\r\n\tint v8; // [esp+1108h] [ebp-10h]\r\n\tint v9; // [esp+110Ch] [ebp-Ch]\r\n\tint v10; // [esp+1110h] [ebp-8h]\r\n\tint v11; // [esp+1114h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1089;\r\n\tv7 = 1090;\r\n\tv8 = 1091;\r\n\tv9 = 1092;\r\n\tv10 = 1093;\r\n\tv11 = 1088;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000D070: using guessed type int nIDDlgItem[1085];\r\n\r\n// ref: 0x1000D0E1\r\nHWND UNKCALL SelIPX_1000D0E1(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // ebp\r\n\tHWND result; // eax\r\n\tHWND v3; // esi\r\n\tHWND v4; // ebx\r\n\tHWND v5; // eax\r\n\tDWORD *v6; // eax\r\n\tint v7; // eax\r\n\tconst char *v8; // ebx\r\n\tint v9; // eax\r\n\r\n\tv1 = hWnd;\r\n\tresult = GetParent(hWnd);\r\n\tv3 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1088);\r\n\t\tv4 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv5 = GetDlgItem(v3, 1093);\r\n\t\t\tresult = (HWND)GetWindowLongA(v5, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tv6 = (DWORD *)*((DWORD *)result + 3);\r\n\t\t\t\tif ( v6 && *v6 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv7 = SelIPX_1000D18C(v4) + 6;\r\n\t\t\t\t\tif ( v7 > dword_1002A4B8 - 6 )\r\n\t\t\t\t\t\tv7 = dword_1002A4B8 - 6;\r\n\t\t\t\t\tresult = (HWND)SelIPX_1000D1C1(v7);\r\n\t\t\t\t\tv8 = (const char *)result;\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\tSelIPX_1000CB83(v3, v8);\r\n\t\t\t\t\t\tv9 = GetWindowLongA(v1, -12);\r\n\t\t\t\t\t\tSelIPX_1000C818(v3, v9);\r\n\t\t\t\t\t\tresult = SelIPX_1000C982(v3);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelIPX_1000CCD9(v4);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000D18C\r\nint UNKCALL SelIPX_1000D18C(HWND hWnd) { return 0; }\r\n/* {\r\n\tLONG v1; // eax\r\n\tDWORD *v2; // ecx\r\n\tDWORD *v3; // eax\r\n\tint v5; // edx\r\n\r\n\tif ( !hWnd )\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(hWnd, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = (DWORD *)dword_1002A4B4;\r\n\tif ( !dword_1002A4B4 )\r\n\t\treturn 0;\r\n\tv3 = *(DWORD **)(v1 + 12);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( v2 == v3 )\r\n\t\t\tbreak;\r\n\t\tv2 = (DWORD *)*v2;\r\n\t\t++v5;\r\n\t}\r\n\twhile ( v2 );\r\n\treturn v5;\r\n} */\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000D1C1\r\nDWORD *__fastcall SelIPX_1000D1C1(int a1) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\r\n\tresult = (DWORD *)dword_1002A4B4;\r\n\twhile ( result && a1 )\r\n\t{\r\n\t\tresult = (DWORD *)*result;\r\n\t\t--a1;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000D1D4\r\nHWND UNKCALL SelIPX_1000D1D4(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND result; // eax\r\n\tHWND v2; // esi\r\n\tHWND v3; // edi\r\n\tHWND v4; // eax\r\n\tint v5; // eax\r\n\tconst char *v6; // edi\r\n\tint v7; // eax\r\n\tHWND hWnda; // [esp+10h] [ebp-4h]\r\n\r\n\thWnda = hWnd;\r\n\tresult = GetParent(hWnd);\r\n\tv2 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1088);\r\n\t\tv3 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\t\t\tif ( result )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( result == (HWND)dword_1002A4B4 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv4 = GetDlgItem(v2, 1093);\r\n\t\t\t\t\t\tresult = SelIPX_1000D070(v4);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv5 = SelIPX_1000D18C(v3) - 6;\r\n\t\t\t\t\t\tif ( v5 < 0 )\r\n\t\t\t\t\t\t\tv5 = 0;\r\n\t\t\t\t\t\tresult = (HWND)SelIPX_1000D1C1(v5);\r\n\t\t\t\t\t\tv6 = (const char *)result;\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\tSelIPX_1000CB83(v2, v6);\r\n\t\t\t\t\t\t\tv7 = GetWindowLongA(hWnda, -12);\r\n\t\t\t\t\t\t\tSelIPX_1000C818(v2, v7);\r\n\t\t\t\t\t\t\tresult = SelIPX_1000C982(v2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000D284\r\nHWND UNKCALL SelIPX_1000D284(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tHWND v3; // eax\r\n\tconst char *v4; // ebp\r\n\tHWND v5; // eax\r\n\tint v6; // ebx\r\n\tHWND v7; // eax\r\n\tHWND v8; // eax\r\n\r\n\tv1 = hWnd;\r\n\tresult = (HWND)GetWindowLongA(hWnd, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tif ( *(DWORD *)result )\r\n\t\t\t{\r\n\t\t\t\tif ( GetWindowLongA(v1, -12) >= 1093 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv3 = GetParent(v1);\r\n\t\t\t\t\tresult = GetDlgItem(v3, 1089);\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv4 = (const char *)*((DWORD *)result + 3);\r\n\t\t\t\t\t\t\tif ( v4 )\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\t\tv5 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tSelIPX_1000CB83(v5, v4);\r\n\t\t\t\t\t\t\t\tv6 = GetWindowLongA(v1, -12);\r\n\t\t\t\t\t\t\t\tv7 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tSelIPX_1000C818(v7, v6);\r\n\t\t\t\t\t\t\t\tv8 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tresult = SelIPX_1000C982(v8);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelIPX_1000D070(v1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000D31C\r\nHWND UNKCALL SelIPX_1000D31C(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tconst char *v3; // ebx\r\n\tHWND v4; // eax\r\n\tint v5; // ebx\r\n\tHWND v6; // eax\r\n\tHWND v7; // eax\r\n\r\n\tv1 = hWnd;\r\n\tif ( GetWindowLongA(hWnd, -12) > 1088 )\r\n\t\treturn SelIPX_1000CCD9(v1);\r\n\tresult = (HWND)GetWindowLongA(v1, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv3 = (const char *)dword_1002A4B4;\r\n\t\t\tif ( result != (HWND)dword_1002A4B4 )\r\n\t\t\t{\r\n\t\t\t\twhile ( v3 && *(HWND *)v3 != result )\r\n\t\t\t\t\tv3 = *(const char **)v3;\r\n\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\tv4 = GetParent(v1);\r\n\t\t\t\tSelIPX_1000CB83(v4, v3);\r\n\t\t\t\tv5 = GetWindowLongA(v1, -12);\r\n\t\t\t\tv6 = GetParent(v1);\r\n\t\t\t\tSelIPX_1000C818(v6, v5);\r\n\t\t\t\tv7 = GetParent(v1);\r\n\t\t\t\tresult = SelIPX_1000C982(v7);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000D3A0\r\nint __fastcall SelIPX_1000D3A0(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // edi\r\n\tint v3; // esi\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tFade_100073B4();\r\n\tSDlgKillTimer(v3, 3);\r\n\tFade_100072BE(10);\r\n\treturn SDlgEndDialog(v3, v2);\r\n} */\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n// 10010418: using guessed type int __stdcall SDlgKillTimer(DWORD, DWORD);\r\n\r\n// ref: 0x1000D3C5\r\nHWND USERCALL SelIPX_1000D3C5(HWND hDlg, int a2) { return 0; }\r\n/* {\r\n\tHWND v2; // edi\r\n\tHWND v3; // eax\r\n\tHWND v4; // esi\r\n\tHWND result; // eax\r\n\tint v6; // esi\r\n\tHWND v7; // esi\r\n\tint v8; // eax\r\n\tHWND v9; // edi\r\n\tint v10; // [esp-DCh] [ebp-E4h]\r\n\tsigned int v11; // [esp-5Ch] [ebp-64h]\r\n\tHWND v12; // [esp-54h] [ebp-5Ch]\r\n\tsigned int v13; // [esp-Ch] [ebp-14h]\r\n\tsigned int v14; // [esp-8h] [ebp-10h]\r\n\tint v15; // [esp-4h] [ebp-Ch]\r\n\tint v16; // [esp+0h] [ebp-8h]\r\n\tint v17; // [esp+4h] [ebp-4h]\r\n\r\n\tv2 = hDlg;\r\n\tv3 = GetFocus();\r\n\tv4 = v3;\r\n\tresult = GetParent(v3);\r\n\tif ( v2 == result )\r\n\t{\r\n\t\tresult = (HWND)GetWindowLongA(v4, -21);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv6 = *((DWORD *)result + 3);\r\n\t\t\tTitleSnd_1001031F();\r\n\t\t\tif ( *(DWORD *)(v6 + 4) )\r\n\t\t\t{\r\n\t\t\t\tresult = (HWND)SelIPX_1000D5B0((int)v2, v6);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv17 = a2;\r\n\t\t\t\tv7 = v2;\r\n\t\t\t\tSelIPX_1000C9DA(v2);\r\n\t\t\t\tmemcpy(&v11, dword_1002A4A0, 0x50u);\r\n\t\t\t\tv11 = 80;\r\n\t\t\t\tv12 = v2;\r\n\t\t\t\tmemset(&v13, 0, 0x10u);\r\n\t\t\t\tv13 = 16;\r\n\t\t\t\tv14 = 1230002254;\r\n\t\t\t\tv8 = *(DWORD *)(dword_1002A4AC + 24);\r\n\t\t\t\tv16 = 0;\r\n\t\t\t\tv15 = v8;\r\n\t\t\t\tv9 = GetFocus();\r\n\t\t\t\tSelIPX_1000D4CA(v7, 0);\r\n\t\t\t\tSelIPX_1000D520((char *)&v10);\r\n\t\t\t\tif ( CreaDung_100051D8(\r\n\t\t\t\t\t\t (int)&v13,\r\n\t\t\t\t\t\t dword_1002A4AC,\r\n\t\t\t\t\t\t dword_1002A49C,\r\n\t\t\t\t\t\t (int)&v11,\r\n\t\t\t\t\t\t dword_1002A4BC,\r\n\t\t\t\t\t\t gnIpxPlayerid,\r\n\t\t\t\t\t\t 0,\r\n\t\t\t\t\t\t (int)&v10) )\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = (HWND)SelIPX_1000D3A0((int)v7, 1);\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tSelIPX_1000D4CA(v7, 1);\r\n\t\t\t\t\tresult = SetFocus(v9);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1000D3C5: could not find valid save-restore pair for ebp\r\n// 1002A49C: using guessed type int dword_1002A49C;\r\n// 1002A4A8: using guessed type int gnIpxPlayerid;\r\n// 1002A4AC: using guessed type int dword_1002A4AC;\r\n// 1002A4BC: using guessed type int dword_1002A4BC;\r\n\r\n// ref: 0x1000D4CA\r\nBOOL __fastcall SelIPX_1000D4CA(HWND hDlg, int a2) { return 0; }\r\n/* {\r\n\tHWND v2; // ebx\r\n\tint v3; // ebp\r\n\tHWND v4; // eax\r\n\tHWND v5; // eax\r\n\tBOOL result; // eax\r\n\tint nCmdShow; // [esp+10h] [ebp-4h]\r\n\r\n\tnCmdShow = a2;\r\n\tv2 = hDlg;\r\n\tv3 = 1088;\r\n\tdo\r\n\t{\r\n\t\tv4 = GetDlgItem(v2, v3);\r\n\t\tif ( v4 )\r\n\t\t\tShowWindow(v4, nCmdShow);\r\n\t\t++v3;\r\n\t}\r\n\twhile ( v3 <= 1093 );\r\n\tv5 = GetDlgItem(v2, 1105);\r\n\tif ( dword_1002A4B8 > 6 )\r\n\t\tresult = ShowWindow(v5, nCmdShow);\r\n\telse\r\n\t\tresult = ShowWindow(v5, 0);\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000D520\r\nchar *UNKCALL SelIPX_1000D520(char *arg) { return 0; }\r\n/* {\r\n\tchar *v1; // esi\r\n\tchar *result; // eax\r\n\tsigned int v3; // edi\r\n\tsigned int v4; // eax\r\n\tchar v5; // [esp+4h] [ebp-80h]\r\n\r\n\tv1 = arg;\r\n\tConnect_10004028((int)&v5, 128, 0, 0);\r\n\tif ( !SelIPX_1000D58D((const char *)dword_1002A4B4, &v5) )\r\n\t\treturn strcpy(v1, &v5);\r\n\tv3 = 2;\r\n\tdo\r\n\t{\r\n\t\tv4 = v3++;\r\n\t\twsprintfA(v1, \"%s %d\", &v5, v4);\r\n\t\tresult = (char *)SelIPX_1000D58D((const char *)dword_1002A4B4, v1);\r\n\t}\r\n\twhile ( result );\r\n\treturn result;\r\n} */\r\n// 1002A4B4: using guessed type int dword_1002A4B4;\r\n\r\n// ref: 0x1000D58D\r\nconst char *__fastcall SelIPX_1000D58D(const char *a1, const char *a2) { return 0; }\r\n/* {\r\n\tconst char *v2; // edi\r\n\tconst char *i; // esi\r\n\r\n\tv2 = a2;\r\n\tfor ( i = a1; i && _strcmpi(i + 12, v2); i = *(const char **)i )\r\n\t\t;\r\n\treturn i;\r\n} */\r\n\r\n// ref: 0x1000D5B0\r\nint __fastcall SelIPX_1000D5B0(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // esi\r\n\tCHAR *v3; // edx\r\n\tCHAR v5; // [esp+Ch] [ebp-384h]\r\n\tCHAR v6; // [esp+10Ch] [ebp-284h]\r\n\tchar v7; // [esp+20Ch] [ebp-184h]\r\n\tCHAR Buffer; // [esp+28Ch] [ebp-104h]\r\n\tint v9; // [esp+30Ch] [ebp-84h]\r\n\tint v10; // [esp+38Ch] [ebp-4h]\r\n\r\n\tv2 = a2;\r\n\tv10 = a1;\r\n\tConnect_10004028((int)&v9, 128, (int)&v7, 128);\r\n\tif ( UiAuthCallback(2, (int)&v9, &v7, 0, (char *)(v2 + 140), &v6, 256) )\r\n\t{\r\n\t\tif ( SNetJoinGame(*(DWORD *)(v2 + 4), v2 + 12, 0, &v9, &v7, gnIpxPlayerid) )\r\n\t\t\treturn SelIPX_1000D3A0(v10, 1);\r\n\t\tif ( SErrGetLastError() == -2062548871 )\r\n\t\t\tLoadStringA(hInstance, 0x32u, &Buffer, 127);\r\n\t\telse\r\n\t\t\tLoadStringA(hInstance, 0x25u, &Buffer, 127);\r\n\t\twsprintfA(&v5, &Buffer, v2 + 12);\r\n\t\tv3 = &v5;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tv3 = &v6;\r\n\t}\r\n\treturn SelYesNo_1000FD39(v10, v3, 0, 0);\r\n} */\r\n// 10010406: using guessed type DWORD __stdcall SErrGetLastError();\r\n// 10010430: using guessed type int __stdcall SNetJoinGame(DWORD, DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A4A8: using guessed type int gnIpxPlayerid;\r\n\r\n// ref: 0x1000D696\r\nHWND __fastcall SelIPX_1000D696(HWND hDlg, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // ebx\r\n\tHWND v4; // esi\r\n\tint v5; // ST08_4\r\n\tHWND v6; // eax\r\n\tHWND result; // eax\r\n\tHWND v8; // eax\r\n\tHWND v9; // eax\r\n\tHWND v10; // eax\r\n\tint v11; // eax\r\n\tint v12; // eax\r\n\tint v13; // eax\r\n\tHWND v14; // eax\r\n\tHWND v15; // eax\r\n\tHWND v16; // eax\r\n\tHWND v17; // eax\r\n\r\n\tv3 = a2;\r\n\tv4 = hDlg;\r\n\tv5 = a2;\r\n\tv6 = GetDlgItem(hDlg, 1056);\r\n\tif ( local_10007C3B(v4, v6, v5, a3) )\r\n\t\treturn SelIPX_1000D3C5(v4, a3);\r\n\tv8 = GetDlgItem(v4, 1054);\r\n\tif ( local_10007C3B(v4, v8, v3, a3) )\r\n\t\treturn (HWND)SelIPX_1000D3A0((int)v4, 2);\r\n\tv9 = GetDlgItem(v4, 1105);\r\n\tresult = (HWND)local_10007C3B(v4, v9, v3, a3);\r\n\tif ( result )\r\n\t{\r\n\t\tv10 = GetDlgItem(v4, 1105);\r\n\t\tv11 = Sbar_100099DC(v10, v3, a3) - 1;\r\n\t\tif ( v11 )\r\n\t\t{\r\n\t\t\tv12 = v11 - 1;\r\n\t\t\tif ( v12 )\r\n\t\t\t{\r\n\t\t\t\tv13 = v12 - 1;\r\n\t\t\t\tif ( v13 )\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = (HWND)(v13 - 1);\r\n\t\t\t\t\tif ( !result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv14 = GetFocus();\r\n\t\t\t\t\t\tresult = SelIPX_1000D0E1(v14);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tv15 = GetFocus();\r\n\t\t\t\t\tresult = SelIPX_1000D1D4(v15);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv16 = GetFocus();\r\n\t\t\t\tresult = SelIPX_1000D284(v16);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tv17 = GetFocus();\r\n\t\t\tresult = SelIPX_1000D31C(v17);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n"
  },
  {
    "path": "DiabloUI/sellist.cpp",
    "content": "// ref: 0x1000D769\r\nvoid __cdecl SelList_cpp_init()\r\n{\r\n\tSelList_cpp_float = SelList_cpp_float_value;\r\n}\r\n// 1001F468: using guessed type int SelList_cpp_float_value;\r\n// 1002A4C0: using guessed type int SelList_cpp_float;\r\n\r\n// ref: 0x1000D774\r\nLRESULT __stdcall SelList_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v4;  // eax\r\n\tchar *v5; // eax\r\n\tint v6;   // edx\r\n\tHWND v8;  // eax\r\n\tHWND v9;  // eax\r\n\r\n\tif (Msg > 0x111) {\r\n\t\tif (Msg == 275) {\r\n\t\t\tv9 = GetFocus();\r\n\t\t\tFocus_DoBlitSpinIncFrame(hWnd, v9);\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif (Msg != 513) {\r\n\t\t\tif (Msg == 514) {\r\n\t\t\t\tv8 = GetDlgItem(hWnd, 1105);\r\n\t\t\t\tif (!Sbar_CheckIfNextHero(v8))\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\tgoto LABEL_23;\r\n\t\t\t}\r\n\t\t\tif (Msg != 515)\r\n\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tSelList_ChooseDlgFromSize(hWnd, (unsigned short)lParam, (unsigned int)lParam >> 16);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tswitch (Msg) {\r\n\tcase 0x111u:\r\n\t\tif (HIWORD(wParam) == 7) {\r\n\t\t\tFocus_GetAndBlitSpin(hWnd, lParam);\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tif (HIWORD(wParam) != 6) {\r\n\t\t\tv6 = 1;\r\n\t\t\tif (HIWORD(wParam) != 5 && (WORD)wParam != 1) {\r\n\t\t\t\tv6 = 2;\r\n\t\t\t\tif ((WORD)wParam != 2)\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t}\r\n\t\tLABEL_25:\r\n\t\t\tOkCancel_PlaySndEndDlg(hWnd, v6);\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tFocus_CheckPlayMove(lParam);\r\n\t\tFocus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);\r\n\t\tSelList_GetHeroStats(hWnd, (unsigned short)wParam);\r\n\tLABEL_23:\r\n\t\tSelList_CountHeroList(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tcase 2u:\r\n\t\tSelList_DeleteFreeProcs(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tcase 6u:\r\n\t\tif ((WORD)wParam == 1 || (WORD)wParam == 2)\r\n\t\t\tSelList_LoadFocus16(hWnd);\r\n\t\telse\r\n\t\t\tSelList_KillFocus16(hWnd);\r\n\t\treturn 0;\r\n\tcase 0x100u:\r\n\t\tif (wParam != 46)\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\tv5 = SelHero_GetHeroNameStr();\r\n\t\tif (!strlen(v5))\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\tv6 = 1006;\r\n\t\tgoto LABEL_25;\r\n\t}\r\n\tif (Msg <= 0x103)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tif (Msg <= 0x105) {\r\n\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg != 272)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tSelList_ShowListWindow(hWnd);\r\n\treturn 0;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000D916\r\nvoid __fastcall SelList_DeleteFreeProcs(HWND hWnd)\r\n{\r\n\tHWND v2; // eax\r\n\r\n\tSbar_FreeScrollBar(hWnd, 1105);\r\n\tDoom_DeleteFreeProcs(hWnd, sellist_msgtbl4);\r\n\tDoom_DeleteFreeProcs(hWnd, sellist_msgtbl3);\r\n\tDoom_DeleteFreeProcs(hWnd, sellist_msgtbl2);\r\n\tDoom_DeleteFreeProcs(hWnd, sellist_msgtbl1);\r\n\tv2 = GetParent(hWnd);\r\n\tSelHero_SetStringWithMsg(v2, 0);\r\n}\r\n\r\n// ref: 0x1000D964\r\nvoid __fastcall SelList_GetHeroStats(HWND hWnd, int nIDDlgItem)\r\n{\r\n\tHWND v2;          // ebp\r\n\tHWND v3;          // eax\r\n\tint v4;           // eax\r\n\tHWND v5;          // eax\r\n\tint v6;           // eax\r\n\tHWND v7;          // eax\r\n\tint v8;           // eax\r\n\tHWND v9;          // eax\r\n\tint v10;          // eax\r\n\tHWND v11;         // eax\r\n\tint v12;          // eax\r\n\tHWND v14;         // eax\r\n\tLONG v15;         // eax\r\n\t_uiheroinfo *v16; // edi\r\n\tHWND v17;         // eax\r\n\tHWND v18;         // eax\r\n\r\n\tv14 = GetDlgItem(hWnd, nIDDlgItem);\r\n\tif (v14) {\r\n\t\tv15 = GetWindowLongA(v14, -21);\r\n\t\tif (v15) {\r\n\t\t\tv16 = *(_uiheroinfo **)(v15 + 12);\r\n\t\t\tif (v16) {\r\n\t\t\t\tif (v16->level)\r\n\t\t\t\t\tDoom_ParseWndProc2(hWnd, sellist_msgtbl3, AF_BIG, 0);\r\n\t\t\t\telse\r\n\t\t\t\t\tDoom_ParseWndProc2(hWnd, sellist_msgtbl3, AF_BIGGRAY, 0);\r\n\t\t\t\tv17 = GetParent(hWnd);\r\n\t\t\t\tSelHero_PrintHeroInfo(v17, v16);\r\n\t\t\t} else {\r\n\t\t\t\tDoom_ParseWndProc2(hWnd, sellist_msgtbl3, AF_BIGGRAY, 0);\r\n\t\t\t\tv18                    = GetParent(hWnd);\r\n\t\t\t\tselhero_hero_hassaved  = 0;\r\n\t\t\t\tselhero_heronamestr[0] = 0;\r\n\t\t\t\tv2                     = v18;\r\n\t\t\t\tv3                     = GetDlgItem(v18, 1014);\r\n\t\t\t\tv4                     = GetWindowLongA(v3, -21);\r\n\t\t\t\tlocal_SetWndLongStr(v4, \"--\");\r\n\t\t\t\tv5 = GetDlgItem(v2, 1018);\r\n\t\t\t\tv6 = GetWindowLongA(v5, -21);\r\n\t\t\t\tlocal_SetWndLongStr(v6, \"--\");\r\n\t\t\t\tv7 = GetDlgItem(v2, 1017);\r\n\t\t\t\tv8 = GetWindowLongA(v7, -21);\r\n\t\t\t\tlocal_SetWndLongStr(v8, \"--\");\r\n\t\t\t\tv9  = GetDlgItem(v2, 1016);\r\n\t\t\t\tv10 = GetWindowLongA(v9, -21);\r\n\t\t\t\tlocal_SetWndLongStr(v10, \"--\");\r\n\t\t\t\tv11 = GetDlgItem(v2, 1015);\r\n\t\t\t\tv12 = GetWindowLongA(v11, -21);\r\n\t\t\t\tlocal_SetWndLongStr(v12, \"--\");\r\n\t\t\t\tSelHero_SetStaticBMP(v2, 3);\r\n\t\t\t\tDoom_ParseWndProc4(v2, selhero_msgtbl_info, AF_SMALLGRAY);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n// 1002A424: using guessed type int selhero_hero_hassaved;\r\n\r\n// ref: 0x1000D9CF\r\nvoid __fastcall SelList_CountHeroList(HWND hWnd)\r\n{\r\n\tHWND v2; // eax\r\n\tint v3;  // ST04_4\r\n\tint v4;  // eax\r\n\r\n\tv2 = GetFocus();\r\n\tv3 = SelList_GetNextHeroLong(v2);\r\n\tv4 = SelHero_GetNumHeroesLeft();\r\n\tSbar_DrawScrollBar(hWnd, 1105, v4, v3);\r\n}\r\n\r\n// ref: 0x1000D9F4\r\nint __fastcall SelList_GetNextHeroLong(HWND hWnd)\r\n{\r\n\tLONG v1;         // esi\r\n\t_uiheroinfo *v2; // eax\r\n\t_uiheroinfo *v3; // esi\r\n\tint v5;          // ecx\r\n\r\n\tif (!hWnd)\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(hWnd, -21);\r\n\tif (!v1)\r\n\t\treturn 0;\r\n\tv2 = SelHero_GetCurrentHeroInfo();\r\n\tif (!v2)\r\n\t\treturn 0;\r\n\tv3 = *(_uiheroinfo **)(v1 + 12);\r\n\tif (!v3)\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo {\r\n\t\tif (v2 == v3)\r\n\t\t\tbreak;\r\n\t\tv2 = v2->next;\r\n\t\t++v5;\r\n\t} while (v2);\r\n\treturn v5;\r\n}\r\n\r\n// ref: 0x1000DA2D\r\nvoid __fastcall SelList_LoadFocus16(HWND hWnd)\r\n{\r\n\tFocus_LoadSpinner(\"ui_art\\\\focus16.pcx\");\r\n\tSDlgSetTimer((int)hWnd, 1, 55, 0);\r\n}\r\n\r\n// ref: 0x1000DA48\r\nvoid __fastcall SelList_KillFocus16(HWND hWnd)\r\n{\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tFocus_DeleteSpinners();\r\n}\r\n\r\n// ref: 0x1000DA55\r\nvoid __fastcall SelList_ShowListWindow(HWND hWnd)\r\n{\r\n\tHWND v2;         // edi\r\n\tLONG v3;         // eax\r\n\tHWND v4;         // eax\r\n\tchar Buffer[32]; // [esp+8h] [ebp-20h]\r\n\r\n\tv2 = GetParent(hWnd);\r\n\tSelList_DoListOldProc(hWnd);\r\n\tif (SelHero_GetHeroIsGood() == 1)\r\n\t\tLoadStringA(ghUiInst, 0x1Cu, Buffer, 31);\r\n\telse\r\n\t\tLoadStringA(ghUiInst, 0x1Du, Buffer, 31);\r\n\tSelHero_SetStringWithMsg(v2, Buffer);\r\n\tv3 = GetWindowLongA(v2, -21);\r\n\tSetWindowLongA(hWnd, -21, v3);\r\n\tDoom_ParseWndProc3(hWnd, sellist_msgtbl1, AF_BIGGRAY);\r\n\tDoom_ParseWndProcs(hWnd, sellist_msgtbl2, AF_BIG, 0);\r\n\tDoom_ParseWndProcs(hWnd, sellist_msgtbl3, AF_BIG, 0);\r\n\tDoom_ParseWndProcs(hWnd, sellist_msgtbl4, AF_MED, 1);\r\n\tsellist_pheroinfo = SelHero_GetCurrentHeroInfo();\r\n\tSelList_SetHeroDlgLong(hWnd, sellist_pheroinfo);\r\n\tSbar_LoadScrBarGFX(hWnd, 1105);\r\n\tif (SelHero_GetNumHeroesLeft() <= 6) {\r\n\t\tv4 = GetDlgItem(hWnd, 1105);\r\n\t\tShowWindow(v4, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000DB2C\r\nvoid __fastcall SelList_SetHeroDlgLong(HWND hWnd, _uiheroinfo *pInfo)\r\n{\r\n\tint *i;  // ebp\r\n\tHWND v4; // eax MAPDST\r\n\tint v6;  // esi\r\n\r\n\tfor (i = sellist_msgtbl4; *i; ++i) {\r\n\t\tv4 = GetDlgItem(hWnd, *i);\r\n\t\tif (v4) {\r\n\t\t\tif (pInfo) {\r\n\t\t\t\tEnableWindow(v4, 1);\r\n\t\t\t\tv6 = GetWindowLongA(v4, -21);\r\n\t\t\t\tlocal_SetWndLongStr(v6, pInfo->name);\r\n\t\t\t\tif (v6)\r\n\t\t\t\t\t*(DWORD *)(v6 + 12) = (unsigned int)pInfo;\r\n\t\t\t\tpInfo                    = pInfo->next;\r\n\t\t\t} else {\r\n\t\t\t\tEnableWindow(v4, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tDoom_ParseWndProc2(hWnd, sellist_msgtbl4, AF_MED, 1);\r\n}\r\n\r\n// ref: 0x1000DBAC\r\nvoid __fastcall SelList_DoListOldProc(HWND hWnd)\r\n{\r\n\tint *i;   // edi\r\n\tHWND v3;  // eax MAPDST\r\n\tvoid *v5; // eax\r\n\r\n\tfor (i = sellist_msgtbl4; *i; ++i) {\r\n\t\tv3 = GetDlgItem(hWnd, *i);\r\n\t\tif (v3) {\r\n\t\t\tv5 = (void *)GetWindowLongA(v3, -4);\r\n\t\t\tSetPropA(v3, \"UIOLDPROC\", v5);\r\n\t\t\tSetWindowLongA(v3, -4, (LONG)SelList_OldListWndProc);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x1000DBFE\r\nLRESULT __stdcall SelList_OldListWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tLRESULT(__stdcall * v4)\r\n\t(HWND, UINT, WPARAM, LPARAM); // edi\r\n\tHWND v5;                      // eax\r\n\tUINT v7;                      // [esp-Ch] [ebp-18h]\r\n\tWPARAM v8;                    // [esp-8h] [ebp-14h]\r\n\tLPARAM v9;                    // [esp-4h] [ebp-10h]\r\n\r\n\tv4 = (LRESULT(__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, \"UIOLDPROC\");\r\n\tswitch (Msg) {\r\n\tcase 2u:\r\n\t\tRemovePropA(hWnd, \"UIOLDPROC\");\r\n\t\tif (!v4)\r\n\t\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t\tSetWindowLongA(hWnd, -4, (LONG)v4);\r\n\t\tbreak;\r\n\tcase 0xFu:\r\n\t\tlocal_DlgDoPaint(hWnd);\r\n\t\treturn 0;\r\n\tcase 0x87u:\r\n\t\treturn 4;\r\n\tcase 0x100u:\r\n\t\tif (wParam > 0x21) {\r\n\t\t\tif (wParam == 34) {\r\n\t\t\t\tSelList_HeroesWithBigDialogs(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif (wParam > 0x24) {\r\n\t\t\t\tif (wParam <= 0x26) {\r\n\t\t\t\t\tSelList_HeroDlgWithSnd2(hWnd);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (wParam <= 0x28) {\r\n\t\t\t\t\tSelList_HeroDlgWithSound(hWnd);\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (wParam == 46) {\r\n\t\t\t\t\tv9 = lParam;\r\n\t\t\t\t\tv8 = 46;\r\n\t\t\t\t\tv7 = 256;\r\n\t\t\t\t\tgoto LABEL_24;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tswitch (wParam) {\r\n\t\t\tcase 0x21u:\r\n\t\t\t\tSelList_HeroesWithHugeDlg(hWnd);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 9u:\r\n\t\t\t\tif (GetKeyState(16) >= 0)\r\n\t\t\t\t\tSelList_ShiftHeroDlgItems(hWnd);\r\n\t\t\t\telse\r\n\t\t\t\t\tSelList_ShiftHeroDlgItm2(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\tcase 0xDu:\r\n\t\t\t\tgoto LABEL_38;\r\n\t\t\tcase 0x1Bu:\r\n\t\t\t\tv9 = 0;\r\n\t\t\t\tv8 = 2;\r\n\t\t\t\tgoto LABEL_12;\r\n\t\t\tcase 0x20u:\r\n\t\t\tLABEL_38:\r\n\t\t\t\tv9 = 0;\r\n\t\t\t\tv8 = 1;\r\n\t\t\tLABEL_12:\r\n\t\t\t\tv7 = 273;\r\n\t\t\tLABEL_24:\r\n\t\t\t\tv5 = GetParent(hWnd);\r\n\t\t\t\tSendMessageA(v5, v7, v8, v9);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\tif (v4)\r\n\t\treturn CallWindowProcA(v4, hWnd, Msg, wParam, lParam);\r\n\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n}\r\n\r\n// ref: 0x1000DD36\r\nvoid __fastcall SelList_ShiftHeroDlgItems(HWND hWnd)\r\n{\r\n\tHWND v2;              // ebx\r\n\tint nIDDlgItem[1053]; // [esp+0h] [ebp-1074h]\r\n\r\n\tnIDDlgItem[1047] = 1048;\r\n\tnIDDlgItem[1048] = 1049;\r\n\tnIDDlgItem[1049] = 1050;\r\n\tnIDDlgItem[1050] = 1051;\r\n\tnIDDlgItem[1051] = 1052;\r\n\tnIDDlgItem[1052] = 1047;\r\n\tv2               = GetParent(hWnd);\r\n\tdo {\r\n\t\tnIDDlgItem[1044] = nIDDlgItem[GetWindowLongA(hWnd, -12)];\r\n\t\thWnd             = GetDlgItem(v2, nIDDlgItem[1044]);\r\n\t} while (!IsWindowEnabled(hWnd));\r\n\tSetFocus(hWnd);\r\n}\r\n\r\n// ref: 0x1000DDA7\r\nvoid __fastcall SelList_ShiftHeroDlgItm2(HWND hWnd)\r\n{\r\n\tHWND v2;              // ebx\r\n\tint nIDDlgItem[1053]; // [esp+0h] [ebp-1074h]\r\n\r\n\tnIDDlgItem[1047] = 1052;\r\n\tnIDDlgItem[1048] = 1047;\r\n\tnIDDlgItem[1049] = 1048;\r\n\tnIDDlgItem[1050] = 1049;\r\n\tnIDDlgItem[1051] = 1050;\r\n\tnIDDlgItem[1052] = 1051;\r\n\tv2               = GetParent(hWnd);\r\n\tdo {\r\n\t\tnIDDlgItem[1044] = nIDDlgItem[GetWindowLongA(hWnd, -12)];\r\n\t\thWnd             = GetDlgItem(v2, nIDDlgItem[1044]);\r\n\t} while (!IsWindowEnabled(hWnd));\r\n\tSetFocus(hWnd);\r\n}\r\n\r\n// ref: 0x1000DE18\r\nvoid __fastcall SelList_HeroesWithBigDialogs(HWND hWnd)\r\n{\r\n\tHWND v1;         // eax MAPDST\r\n\tHWND v3;         // ebp\r\n\tHWND v4;         // eax\r\n\tLONG v5;         // eax\r\n\t_uiheroinfo *v6; // eax\r\n\tint v7;          // esi\r\n\t_uiheroinfo *v8; // esi\r\n\tint v9;          // eax\r\n\r\n\tv1 = GetParent(hWnd);\r\n\tif (v1) {\r\n\t\tv3 = GetDlgItem(v1, 1047);\r\n\t\tif (v3) {\r\n\t\t\tv4 = GetDlgItem(v1, 1052);\r\n\t\t\tv5 = GetWindowLongA(v4, -21);\r\n\t\t\tif (v5) {\r\n\t\t\t\tv6 = *(_uiheroinfo **)(v5 + 12);\r\n\t\t\t\tif (v6 && v6->next) {\r\n\t\t\t\t\tv7 = SelList_GetNextHeroLong(v3) + 6;\r\n\t\t\t\t\tif (v7 > SelHero_GetNumHeroesLeft() - 6)\r\n\t\t\t\t\t\tv7 = SelHero_GetNumHeroesLeft() - 6;\r\n\t\t\t\t\tv8     = SelList_GetHeroFromNum(v7);\r\n\t\t\t\t\tif (v8) {\r\n\t\t\t\t\t\tTitleSnd_PlayMoveSound();\r\n\t\t\t\t\t\tSelList_SetHeroDlgLong(v1, v8);\r\n\t\t\t\t\t\tv9 = GetWindowLongA(hWnd, -12);\r\n\t\t\t\t\t\tSelList_GetHeroStats(v1, v9);\r\n\t\t\t\t\t\tSelList_CountHeroList(v1);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSelList_ShiftHeroDlgItm2(v3);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x1000DEDD\r\n_uiheroinfo *__fastcall SelList_GetHeroFromNum(int heronum)\r\n{\r\n\t_uiheroinfo *result; // eax\r\n\r\n\tresult = SelHero_GetCurrentHeroInfo();\r\n\twhile (result && heronum) {\r\n\t\tresult = result->next;\r\n\t\t--heronum;\r\n\t}\r\n\treturn result;\r\n}\r\n\r\n// ref: 0x1000DEF4\r\nvoid __fastcall SelList_HeroesWithHugeDlg(HWND hWnd)\r\n{\r\n\tHWND v1;         // eax MAPDST\r\n\tHWND v3;         // eax MAPDST\r\n\tLONG v5;         // eax\r\n\t_uiheroinfo *v6; // ebp\r\n\tHWND v7;         // eax\r\n\tint v8;          // eax\r\n\t_uiheroinfo *v9; // edi\r\n\tint v10;         // eax\r\n\r\n\tv1 = GetParent(hWnd);\r\n\tif (v1) {\r\n\t\tv3 = GetDlgItem(v1, 1047);\r\n\t\tif (v3) {\r\n\t\t\tv5 = GetWindowLongA(v3, -21);\r\n\t\t\tif (v5) {\r\n\t\t\t\tv6 = *(_uiheroinfo **)(v5 + 12);\r\n\t\t\t\tif (v6) {\r\n\t\t\t\t\tif (v6 == SelHero_GetCurrentHeroInfo()) {\r\n\t\t\t\t\t\tv7 = GetDlgItem(v1, 1052);\r\n\t\t\t\t\t\tSelList_ShiftHeroDlgItems(v7);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tv8 = SelList_GetNextHeroLong(v3) - 6;\r\n\t\t\t\t\t\tif (v8 < 0)\r\n\t\t\t\t\t\t\tv8 = 0;\r\n\t\t\t\t\t\tv9     = SelList_GetHeroFromNum(v8);\r\n\t\t\t\t\t\tif (v9) {\r\n\t\t\t\t\t\t\tTitleSnd_PlayMoveSound();\r\n\t\t\t\t\t\t\tSelList_SetHeroDlgLong(v1, v9);\r\n\t\t\t\t\t\t\tv10 = GetWindowLongA(hWnd, -12);\r\n\t\t\t\t\t\t\tSelList_GetHeroStats(v1, v10);\r\n\t\t\t\t\t\t\tSelList_CountHeroList(v1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x1000DFAB\r\nvoid __fastcall SelList_HeroDlgWithSound(HWND hWnd)\r\n{\r\n\tLONG v2;         // eax\r\n\t_uiheroinfo *v3; // eax\r\n\tHWND v4;         // eax\r\n\tHWND v5;         // eax\r\n\tLONG v6;         // eax\r\n\t_uiheroinfo *v7; // ebp\r\n\tHWND v8;         // eax\r\n\tint v9;          // ebx\r\n\tHWND v10;        // eax\r\n\tHWND v11;        // eax\r\n\r\n\tv2 = GetWindowLongA(hWnd, -21);\r\n\tif (v2) {\r\n\t\tv3 = *(_uiheroinfo **)(v2 + 12);\r\n\t\tif (v3) {\r\n\t\t\tif (v3->next) {\r\n\t\t\t\tif (GetWindowLongA(hWnd, -12) >= 1052) {\r\n\t\t\t\t\tv4 = GetParent(hWnd);\r\n\t\t\t\t\tv5 = GetDlgItem(v4, 1048);\r\n\t\t\t\t\tif (v5) {\r\n\t\t\t\t\t\tv6 = GetWindowLongA(v5, -21);\r\n\t\t\t\t\t\tif (v6) {\r\n\t\t\t\t\t\t\tv7 = *(_uiheroinfo **)(v6 + 12);\r\n\t\t\t\t\t\t\tif (v7) {\r\n\t\t\t\t\t\t\t\tTitleSnd_PlayMoveSound();\r\n\t\t\t\t\t\t\t\tv8 = GetParent(hWnd);\r\n\t\t\t\t\t\t\t\tSelList_SetHeroDlgLong(v8, v7);\r\n\t\t\t\t\t\t\t\tv9  = GetWindowLongA(hWnd, -12);\r\n\t\t\t\t\t\t\t\tv10 = GetParent(hWnd);\r\n\t\t\t\t\t\t\t\tSelList_GetHeroStats(v10, v9);\r\n\t\t\t\t\t\t\t\tv11 = GetParent(hWnd);\r\n\t\t\t\t\t\t\t\tSelList_CountHeroList(v11);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tSelList_ShiftHeroDlgItems(hWnd);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// ref: 0x1000E043\r\nvoid __fastcall SelList_HeroDlgWithSnd2(HWND hWnd)\r\n{\r\n\tLONG v2;         // eax\r\n\t_uiheroinfo *v3; // esi\r\n\t_uiheroinfo *v4; // ebx\r\n\tHWND v5;         // eax\r\n\tint v6;          // ebx\r\n\tHWND v7;         // eax\r\n\tHWND v8;         // eax\r\n\r\n\tif (GetWindowLongA(hWnd, -12) <= 1047) {\r\n\t\tv2 = GetWindowLongA(hWnd, -21);\r\n\t\tif (v2) {\r\n\t\t\tv3 = *(_uiheroinfo **)(v2 + 12);\r\n\t\t\tif (v3) {\r\n\t\t\t\tv4 = SelHero_GetCurrentHeroInfo();\r\n\t\t\t\tif (v3 != v4) {\r\n\t\t\t\t\twhile (v4 && v4->next != v3)\r\n\t\t\t\t\t\tv4 = v4->next;\r\n\t\t\t\t\tTitleSnd_PlayMoveSound();\r\n\t\t\t\t\tv5 = GetParent(hWnd);\r\n\t\t\t\t\tSelList_SetHeroDlgLong(v5, v4);\r\n\t\t\t\t\tv6 = GetWindowLongA(hWnd, -12);\r\n\t\t\t\t\tv7 = GetParent(hWnd);\r\n\t\t\t\t\tSelList_GetHeroStats(v7, v6);\r\n\t\t\t\t\tv8 = GetParent(hWnd);\r\n\t\t\t\t\tSelList_CountHeroList(v8);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tSelList_ShiftHeroDlgItm2(hWnd);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000E0CA\r\nvoid __fastcall SelList_ChooseDlgFromSize(HWND hWnd, int width, int height)\r\n{\r\n\tHWND v6;   // eax\r\n\tint v7;    // edx\r\n\tHWND v8;   // eax\r\n\tHWND v9;   // eax\r\n\tchar *v10; // eax\r\n\tHWND v11;  // eax\r\n\tHWND v12;  // eax\r\n\tint v13;   // eax\r\n\tint v14;   // eax\r\n\tint v15;   // eax\r\n\tHWND v16;  // eax\r\n\tHWND v17;  // eax\r\n\tHWND v18;  // eax\r\n\tHWND v19;  // eax\r\n\r\n\tv6 = GetDlgItem(hWnd, 1056);\r\n\tif (local_GetBottomRect(hWnd, v6, width, height)) {\r\n\t\tv7 = 1;\r\n\tLABEL_3:\r\n\t\tOkCancel_PlaySndEndDlg(hWnd, v7);\r\n\t\treturn;\r\n\t}\r\n\tv8 = GetDlgItem(hWnd, 1054);\r\n\tif (local_GetBottomRect(hWnd, v8, width, height)) {\r\n\t\tv7 = 2;\r\n\t\tgoto LABEL_3;\r\n\t}\r\n\tv9 = GetDlgItem(hWnd, 1006);\r\n\tif (local_GetBottomRect(hWnd, v9, width, height)) {\r\n\t\tv10 = SelHero_GetHeroNameStr();\r\n\t\tif (strlen(v10)) {\r\n\t\t\tv7 = 1006;\r\n\t\t\tgoto LABEL_3;\r\n\t\t}\r\n\t} else {\r\n\t\tv11 = GetDlgItem(hWnd, 1105);\r\n\t\tif (local_GetBottomRect(hWnd, v11, width, height)) {\r\n\t\t\tv12 = GetDlgItem(hWnd, 1105);\r\n\t\t\tv13 = Sbar_NumScrollLines(v12, width, height) - 1;\r\n\t\t\tif (v13) {\r\n\t\t\t\tv14 = v13 - 1;\r\n\t\t\t\tif (v14) {\r\n\t\t\t\t\tv15 = v14 - 1;\r\n\t\t\t\t\tif (v15) {\r\n\t\t\t\t\t\tif (v15 == 1) {\r\n\t\t\t\t\t\t\tv16 = GetFocus();\r\n\t\t\t\t\t\t\tSelList_HeroesWithBigDialogs(v16);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tv17 = GetFocus();\r\n\t\t\t\t\t\tSelList_HeroesWithHugeDlg(v17);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tv18 = GetFocus();\r\n\t\t\t\t\tSelList_HeroDlgWithSound(v18);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tv19 = GetFocus();\r\n\t\t\t\tSelList_HeroDlgWithSnd2(v19);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "DiabloUI/selload.cpp",
    "content": "// ref: 0x1000E1C2\r\nLRESULT __stdcall SelLoad_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v4; // eax\r\n\tint v5;  // edx\r\n\tHWND v6; // eax\r\n\tHWND v7; // eax\r\n\tHWND v9; // eax\r\n\r\n\tif (Msg == 2) {\r\n\t\tSelLoad_DeleteProcsAndSpin(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg <= 0x103)\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\tif (Msg <= 0x105) {\r\n\t\tv9 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v9, Msg, wParam, lParam);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg == 272) {\r\n\t\tSelLoad_LoadFocusAndMsg(hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tif (Msg != 273) {\r\n\t\tif (Msg != 275) {\r\n\t\t\tif (Msg == 513) {\r\n\t\t\t\tv4 = GetDlgItem(hWnd, 1056);\r\n\t\t\t\tif (local_GetBottomRect(hWnd, v4, (unsigned short)lParam, (unsigned int)lParam >> 16)) {\r\n\t\t\t\t\tv5 = 1;\r\n\t\t\t\tLABEL_19:\r\n\t\t\t\t\tSelLoad_SelectSndLoad(hWnd, v5);\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\t}\r\n\t\t\t\tv6 = GetDlgItem(hWnd, 1054);\r\n\t\t\t\tif (local_GetBottomRect(hWnd, v6, (unsigned short)lParam, (unsigned int)lParam >> 16)) {\r\n\t\t\t\tLABEL_21:\r\n\t\t\t\t\tv5 = 2;\r\n\t\t\t\t\tgoto LABEL_19;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tv7 = GetFocus();\r\n\t\tFocus_DoBlitSpinIncFrame(hWnd, v7);\r\n\t\treturn 0;\r\n\t}\r\n\tif (HIWORD(wParam) == 7) {\r\n\t\tFocus_GetAndBlitSpin(hWnd, lParam);\r\n\t} else {\r\n\t\tif (HIWORD(wParam) != 6) {\r\n\t\t\tv5 = 1;\r\n\t\t\tif (HIWORD(wParam) == 5 || (WORD)wParam == 1)\r\n\t\t\t\tgoto LABEL_19;\r\n\t\t\tif ((WORD)wParam != 2)\r\n\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\tgoto LABEL_21;\r\n\t\t}\r\n\t\tFocus_CheckPlayMove(lParam);\r\n\t\tFocus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000E30E\r\nvoid __fastcall SelLoad_DeleteProcsAndSpin(HWND hWnd)\r\n{\r\n\tHWND v2; // eax\r\n\r\n\tFocus_DeleteSpinners();\r\n\tDoom_DeleteFreeProcs(hWnd, selload_msgtbl3);\r\n\tDoom_DeleteFreeProcs(hWnd, selload_msgtbl2);\r\n\tDoom_DeleteFreeProcs(hWnd, selload_msgtbl1);\r\n\tv2 = GetParent(hWnd);\r\n\tSelHero_SetStringWithMsg(v2, 0);\r\n}\r\n\r\n// ref: 0x1000E34B\r\nvoid __fastcall SelLoad_LoadFocusAndMsg(HWND hWnd)\r\n{\r\n\tHWND v2;         // edi\r\n\tLONG v3;         // eax\r\n\tchar Buffer[32]; // [esp+8h] [ebp-20h]\r\n\r\n\tv2 = GetParent(hWnd);\r\n\tLoadStringA(ghUiInst, 0x1Du, Buffer, 31);\r\n\tSelHero_SetStringWithMsg(v2, Buffer);\r\n\tv3 = GetWindowLongA(v2, -21);\r\n\tSetWindowLongA(hWnd, -21, v3);\r\n\tlocal_DoUiWndProc(hWnd, (DWORD *)selload_msgtbl3);\r\n\tDoom_ParseWndProc3(hWnd, selload_msgtbl1, AF_BIGGRAY);\r\n\tDoom_ParseWndProcs(hWnd, selload_msgtbl2, AF_BIG, 0);\r\n\tDoom_ParseWndProcs(hWnd, selload_msgtbl3, AF_MED, 1);\r\n\tFocus_LoadSpinner(\"ui_art\\\\focus16.pcx\");\r\n\tSDlgSetTimer((int)hWnd, 1, 55, 0);\r\n}\r\n\r\n// ref: 0x1000E3E2\r\nvoid __fastcall SelLoad_SelectSndLoad(HWND hWnd, int a2)\r\n{\r\n\tint v2;  // esi\r\n\tHWND v4; // eax\r\n\r\n\tv2 = a2;\r\n\tTitleSnd_PlaySelectSound();\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tif (v2 == 1) {\r\n\t\tv4 = GetFocus();\r\n\t\tv2 = GetWindowLongA(v4, -12);\r\n\t}\r\n\tSDlgEndDialog(hWnd, (HANDLE)v2);\r\n}\r\n\r\n// ref: 0x1000E41A\r\nvoid __cdecl SelLoad_cpp_init()\r\n{\r\n\tSelLoad_cpp_float = SelLoad_cpp_float_value;\r\n}\r\n// 1001F46C: using guessed type int SelLoad_cpp_float_value;\r\n// 1002A4C8: using guessed type int SelLoad_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/selmodem.cpp",
    "content": "// ref: 0x1000E42A\r\nsigned int SelModem_1000E42A() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A4CC = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A4CC: using guessed type int dword_1002A4CC;\r\n\r\n// ref: 0x1000E435\r\nint __fastcall SelModem_1000E435(void *a1, int a2, int a3, char *a4, char *a5) { return 0; }\r\n/* {\r\n\tvoid *v5; // edi\r\n\r\n\tdword_1002A4DC = 0;\r\n\tdword_1002A4D8 = 0;\r\n\tdword_1002A4E8 = a3;\r\n\tdword_1002A4D4 = a4;\r\n\tv5 = a1;\r\n\tdword_1002A4E0 = a2;\r\n\tdword_1002A4D0 = (int)a5;\r\n\tSNetEnumDevices(SelModem_1000E497);\r\n\tif ( !dword_1002A4D8 )\r\n\t\treturn SelModem_1000E505(v5);\r\n\tif ( dword_1002A4D8 == 1 )\r\n\t\treturn SelModem_1000E51E();\r\n\treturn SelModem_1000E5CC();\r\n} */\r\n// 10010496: using guessed type int __stdcall SNetEnumDevices(DWORD);\r\n// 1002A4D0: using guessed type int dword_1002A4D0;\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n// 1002A4E0: using guessed type int dword_1002A4E0;\r\n// 1002A4E8: using guessed type int dword_1002A4E8;\r\n\r\n// ref: 0x1000E497\r\nchar *__stdcall SelModem_1000E497(int a1, char *a2, char *a3) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\tint v4; // esi\r\n\tDWORD *v5; // eax\r\n\r\n\tresult = SelModem_1000E4EC();\r\n\tv4 = result;\r\n\tif ( result )\r\n\t{\r\n\t\t*(DWORD *)result = 0;\r\n\t\t*(DWORD *)(result + 4) = a1;\r\n\t\tstrcpy((char *)(result + 8), a2);\r\n\t\tstrcpy((char *)(v4 + 136), a3);\r\n\t\tv5 = SelModem_1000E500(dword_1002A4DC, (DWORD *)v4);\r\n\t\t++dword_1002A4D8;\r\n\t\tdword_1002A4DC = (int)v5;\r\n\t\tresult = 1;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n\r\n// ref: 0x1000E4EC\r\nvoid *SelModem_1000E4EC() { return 0; }\r\n/* {\r\n\treturn SMemAlloc(264, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelModem.cpp\", 72, 0);\r\n} */\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000E500\r\nDWORD *__fastcall SelModem_1000E500(int a1, DWORD *a2) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\r\n\tresult = a2;\r\n\t*a2 = a1;\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000E505\r\nsigned int UNKCALL SelModem_1000E505(void *arg) { return 0; }\r\n/* {\r\n\tif ( arg != (void *)1297040461 )\r\n\t\treturn 1;\r\n\tSErrSetLastError(1222);\r\n\treturn 0;\r\n} */\r\n// 1001041E: using guessed type int __stdcall SErrSetLastError(DWORD);\r\n\r\n// ref: 0x1000E51E\r\nsigned int SelModem_1000E51E() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tif ( SelModem_1000E57B(*((DWORD *)dword_1002A4D4 + 2), *(DWORD *)(dword_1002A4DC + 4)) )\r\n\t{\r\n\t\tSelModem_1000E553((DWORD *)dword_1002A4DC);\r\n\t\tresult = 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tSErrSetLastError(-2062548879);\r\n\t\tresult = 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1001041E: using guessed type int __stdcall SErrSetLastError(DWORD);\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n\r\n// ref: 0x1000E553\r\nint __fastcall SelModem_1000E553(DWORD *a1) { return 0; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tint result; // eax\r\n\r\n\tif ( a1 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv1 = (DWORD *)*a1;\r\n\t\t\tresult = SelModem_1000E567(a1);\r\n\t\t\ta1 = v1;\r\n\t\t}\r\n\t\twhile ( v1 );\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000E567\r\nint UNKCALL SelModem_1000E567(void *arg) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tif ( arg )\r\n\t\tresult = SMemFree(arg, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelModem.cpp\", 77, 0);\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000E57B\r\nint __fastcall SelModem_1000E57B(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // ebx\r\n\tint v3; // esi\r\n\tint v5; // [esp+8h] [ebp-50h]\r\n\tint v6; // [esp+10h] [ebp-48h]\r\n\tint (__stdcall *v7)(char *, int, int, int, int); // [esp+30h] [ebp-28h]\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tmemcpy(&v5, dword_1002A4D4, 0x50u);\r\n\tv7 = ModmStat_10008C62;\r\n\tv5 = 80;\r\n\tv6 = v3;\r\n\treturn SNetInitializeDevice(v2, dword_1002A4E0, dword_1002A4E8, &v5, dword_1002A4D0);\r\n} */\r\n// 1001049C: using guessed type int __stdcall SNetInitializeDevice(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1002A4D0: using guessed type int dword_1002A4D0;\r\n// 1002A4E0: using guessed type int dword_1002A4E0;\r\n// 1002A4E8: using guessed type int dword_1002A4E8;\r\n\r\n// ref: 0x1000E5CC\r\nsigned int SelModem_1000E5CC() { return 0; }\r\n/* {\r\n\tsigned int v0; // esi\r\n\tsigned int result; // eax\r\n\r\n\tv0 = 1;\r\n\tif ( SDlgDialogBoxParam(hInstance, \"SELMODEM_DIALOG\", *((DWORD *)dword_1002A4D4 + 2), SelModem_1000E63E, 0) == 1 )\r\n\t{\r\n\t\tif ( !SelModem_1000E57B(*((DWORD *)dword_1002A4D4 + 2), dword_1002A4E4) )\r\n\t\t{\r\n\t\t\tSErrSetLastError(-2062548879);\r\n\t\t\tv0 = 0;\r\n\t\t}\r\n\t\tSelModem_1000E553((DWORD *)dword_1002A4DC);\r\n\t\tresult = v0;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tSelModem_1000E553((DWORD *)dword_1002A4DC);\r\n\t\tSErrSetLastError(1223);\r\n\t\tresult = 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 1001041E: using guessed type int __stdcall SErrSetLastError(DWORD);\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n// 1002A4E4: using guessed type int dword_1002A4E4;\r\n\r\n// ref: 0x1000E63E\r\nint __stdcall SelModem_1000E63E(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tint v4; // edx\r\n\tHWND v5; // eax\r\n\tHWND v7; // eax\r\n\tint v8; // [esp+0h] [ebp-Ch]\r\n\r\n\tif ( Msg > 0x201 )\r\n\t{\r\n\t\tif ( Msg == 514 )\r\n\t\t{\r\n\t\t\tv7 = GetDlgItem(hDlg, 1105);\r\n\t\t\tif ( !Sbar_100099C0(v7) )\r\n\t\t\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\nLABEL_27:\r\n\t\t\tSelModem_1000E7E9(hDlg);\r\n\t\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tif ( Msg != 515 )\r\n\t\t{\r\n\t\t\tif ( Msg != 2024 )\r\n\t\t\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t\t\tif ( !Fade_1000739F() )\r\n\t\t\t\tFade_100073FD(hDlg, v8);\r\n\t\t\treturn 0;\r\n\t\t}\r\nLABEL_25:\r\n\t\tSelModem_1000EE78(hDlg, (unsigned short)lParam, (unsigned int)lParam >> 16);\r\n\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 513 )\r\n\t\tgoto LABEL_25;\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tSelModem_1000E783(hDlg);\r\n\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg <= 0x103 )\r\n\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\tif ( Msg <= 0x105 )\r\n\t{\r\n\t\tv5 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v5, Msg, wParam, lParam);\r\n\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 272 )\r\n\t{\r\n\t\tSelModem_1000E843(hDlg);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 273 )\r\n\t{\r\n\t\tif ( HIWORD(wParam) == 7 )\r\n\t\t{\r\n\t\t\tFocus_100075B7(hDlg, (HWND)lParam);\r\n\t\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tif ( HIWORD(wParam) == 6 )\r\n\t\t{\r\n\t\t\tFocus_10007458((void *)lParam);\r\n\t\t\tFocus_100075DC(hDlg, (HWND)lParam);\r\n\t\t\tgoto LABEL_27;\r\n\t\t}\r\n\t\tv4 = 1;\r\n\t\tif ( wParam != 327681 )\r\n\t\t{\r\n\t\t\tif ( (WORD)wParam != 2 )\r\n\t\t\t\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n\t\t\tv4 = 2;\r\n\t\t}\r\n\t\tSelModem_1000EE29((int)hDlg, v4);\r\n\t}\r\n\treturn SDlgDefDialogProc(hDlg, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000E783\r\nvoid UNKCALL SelModem_1000E783(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tDWORD *v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tSbar_10009CD2(hDlg, 1105);\r\n\tDoom_10006C53(v1, &dword_100231F4);\r\n\tDoom_10006C53(v1, (int *)&unk_100231E8);\r\n\tDoom_10006C53(v1, (int *)&unk_100231CC);\r\n\tDoom_10006C53(v1, (int *)&unk_100231D4);\r\n\tDoom_10006C53(v1, (int *)&unk_100231E0);\r\n\tFocus_10007818(v1);\r\n\tlocal_1000811B();\r\n\tv2 = (DWORD *)GetWindowLongA(v1, -21);\r\n\tlocal_10007F72(v2);\r\n} */\r\n// 100231F4: using guessed type int dword_100231F4;\r\n\r\n// ref: 0x1000E7E9\r\nHWND UNKCALL SelModem_1000E7E9(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // eax\r\n\tint v3; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = GetFocus();\r\n\tv3 = SelModem_1000E80E(v2);\r\n\treturn Sbar_10009A99(v1, 1105, dword_1002A4D8, v3);\r\n} */\r\n\r\n// ref: 0x1000E80E\r\nint UNKCALL SelModem_1000E80E(HWND hWnd) { return 0; }\r\n/* {\r\n\tLONG v1; // eax\r\n\tDWORD *v2; // ecx\r\n\tDWORD *v3; // eax\r\n\tint v5; // edx\r\n\r\n\tif ( !hWnd )\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(hWnd, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = (DWORD *)dword_1002A4DC;\r\n\tif ( !dword_1002A4DC )\r\n\t\treturn 0;\r\n\tv3 = *(DWORD **)(v1 + 12);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( v2 == v3 )\r\n\t\t\tbreak;\r\n\t\tv2 = (DWORD *)*v2;\r\n\t\t++v5;\r\n\t}\r\n\twhile ( v2 );\r\n\treturn v5;\r\n} */\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n\r\n// ref: 0x1000E843\r\nHWND UNKCALL SelModem_1000E843(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\tint *v3; // edi\r\n\tHWND result; // eax\r\n\tHWND v5; // eax\r\n\tHWND v6; // [esp+0h] [ebp-Ch]\r\n\r\n\tv1 = hWnd;\r\n\tGetParent(hWnd);\r\n\tSelModem_1000E9B2(v1);\r\n\tFocus_100077E9((int)v1, \"ui_art\\\\focus16.pcx\", v6);\r\n\tlocal_100080F1();\r\n\tv2 = local_10007F46();\r\n\tv3 = (int *)v2;\r\n\tif ( v2 )\r\n\t{\r\n\t\tSetWindowLongA(v1, -21, v2);\r\n\t\tlocal_10007944((int)v1, 0, \"popup\", -1, 1, (int)\"ui_art\\\\seldiff.pcx\", v3, v3 + 1, 0);\r\n\t}\r\n\tFade_100073C5(v1, 0);\r\n\tPostMessageA(v1, 0x7E8u, 0, 0);\r\n\tDoom_100068AB(v1, (int *)&unk_100231E0, 1);\r\n\tDoom_100068AB(v1, (int *)&unk_100231D4, 3);\r\n\tDoom_100068AB(v1, (int *)&unk_100231CC, 5);\r\n\tDoom_1000658C(v1, (int *)&unk_100231E8, 4, 0);\r\n\tDoom_1000658C(v1, &dword_100231F4, 0, 1);\r\n\tSelModem_1000E932(v1, (const char *)dword_1002A4DC);\r\n\tresult = Sbar_10009BF1(v1, 1105);\r\n\tif ( dword_1002A4D8 <= 6 )\r\n\t{\r\n\t\tv5 = GetDlgItem(v1, 1105);\r\n\t\tresult = (HWND)ShowWindow(v5, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 100231F4: using guessed type int dword_100231F4;\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n\r\n// ref: 0x1000E932\r\nint __fastcall SelModem_1000E932(HWND a1, const char *a2) { return 0; }\r\n/* {\r\n\tconst char *v2; // edi\r\n\tint *v3; // ebp\r\n\tHWND v4; // eax\r\n\tHWND v5; // esi\r\n\tint v6; // esi\r\n\tHWND hDlg; // [esp+8h] [ebp-4h]\r\n\r\n\tv2 = a2;\r\n\thDlg = a1;\r\n\tv3 = &dword_100231F4;\r\n\tif ( dword_100231F4 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv4 = GetDlgItem(hDlg, *v3);\r\n\t\t\tv5 = v4;\r\n\t\t\tif ( v4 )\r\n\t\t\t{\r\n\t\t\t\tif ( v2 )\r\n\t\t\t\t{\r\n\t\t\t\t\tEnableWindow(v4, 1);\r\n\t\t\t\t\tv6 = GetWindowLongA(v5, -21);\r\n\t\t\t\t\tlocal_10007FA4(v6, v2 + 8);\r\n\t\t\t\t\tif ( v6 )\r\n\t\t\t\t\t\t*(DWORD *)(v6 + 12) = v2;\r\n\t\t\t\t\tv2 = *(const char **)v2;\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tEnableWindow(v4, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t++v3;\r\n\t\t}\r\n\t\twhile ( *v3 );\r\n\t}\r\n\treturn Doom_1000680A(hDlg, &dword_100231F4, 0, 1);\r\n} */\r\n// 100231F4: using guessed type int dword_100231F4;\r\n\r\n// ref: 0x1000E9B2\r\nvoid UNKCALL SelModem_1000E9B2(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // ebx\r\n\tint *v2; // edi\r\n\tHWND v3; // eax\r\n\tHWND v4; // esi\r\n\tvoid *v5; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = &dword_100231F4;\r\n\tif ( dword_100231F4 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv3 = GetDlgItem(v1, *v2);\r\n\t\t\tv4 = v3;\r\n\t\t\tif ( v3 )\r\n\t\t\t{\r\n\t\t\t\tv5 = (void *)GetWindowLongA(v3, -4);\r\n\t\t\t\tSetPropA(v4, \"UIOLDPROC\", v5);\r\n\t\t\t\tSetWindowLongA(v4, -4, (LONG)SelModem_1000EA04);\r\n\t\t\t}\r\n\t\t\t++v2;\r\n\t\t}\r\n\t\twhile ( *v2 );\r\n\t}\r\n} */\r\n// 100231F4: using guessed type int dword_100231F4;\r\n\r\n// ref: 0x1000EA04\r\nLRESULT __stdcall SelModem_1000EA04(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tLRESULT (__stdcall *v4)(HWND, UINT, WPARAM, LPARAM); // edi\r\n\tHWND v5; // eax\r\n\tWPARAM v7; // [esp-8h] [ebp-14h]\r\n\r\n\tv4 = (LRESULT (__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, \"UIOLDPROC\");\r\n\tswitch ( Msg )\r\n\t{\r\n\t\tcase 2u:\r\n\t\t\tRemovePropA(hWnd, \"UIOLDPROC\");\r\n\t\t\tif ( !v4 )\r\n\t\t\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t\t\tSetWindowLongA(hWnd, -4, (LONG)v4);\r\n\t\t\tbreak;\r\n\t\tcase 0xFu:\r\n\t\t\tlocal_10007C95(hWnd);\r\n\t\t\treturn 0;\r\n\t\tcase 0x87u:\r\n\t\t\treturn 4;\r\n\t\tcase 0x100u:\r\n\t\t\tif ( wParam > 0x21 )\r\n\t\t\t{\r\n\t\t\t\tif ( wParam == 34 )\r\n\t\t\t\t{\r\n\t\t\t\t\tSelModem_1000EC0E(hWnd);\r\n\t\t\t\t}\r\n\t\t\t\telse if ( wParam > 0x24 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( wParam <= 0x26 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelModem_1000EDBC(hWnd);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ( wParam <= 0x28 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelModem_1000ED3B(hWnd);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam == 33 )\r\n\t\t\t{\r\n\t\t\t\tSelModem_1000ECB2(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam == 9 )\r\n\t\t\t{\r\n\t\t\t\tif ( GetKeyState(16) >= 0 )\r\n\t\t\t\t\tSelModem_1000EB2C(hWnd);\r\n\t\t\t\telse\r\n\t\t\t\t\tSelModem_1000EB9D(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam != 13 )\r\n\t\t\t{\r\n\t\t\t\tif ( wParam == 27 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv7 = 2;\r\n\t\t\t\t\tgoto LABEL_13;\r\n\t\t\t\t}\r\n\t\t\t\tif ( wParam != 32 )\r\n\t\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tv7 = 1;\r\nLABEL_13:\r\n\t\t\tv5 = GetParent(hWnd);\r\n\t\t\tSendMessageA(v5, 0x111u, v7, 0);\r\n\t\t\treturn 0;\r\n\t}\r\n\tif ( v4 )\r\n\t\treturn CallWindowProcA(v4, hWnd, Msg, wParam, lParam);\r\n\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n} */\r\n\r\n// ref: 0x1000EB2C\r\nHWND UNKCALL SelModem_1000EB2C(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1107]; // [esp+0h] [ebp-1170h]\r\n\tint v5; // [esp+114Ch] [ebp-24h]\r\n\tint v6; // [esp+1158h] [ebp-18h]\r\n\tint v7; // [esp+115Ch] [ebp-14h]\r\n\tint v8; // [esp+1160h] [ebp-10h]\r\n\tint v9; // [esp+1164h] [ebp-Ch]\r\n\tint v10; // [esp+1168h] [ebp-8h]\r\n\tint v11; // [esp+116Ch] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1111;\r\n\tv7 = 1112;\r\n\tv8 = 1113;\r\n\tv9 = 1114;\r\n\tv10 = 1115;\r\n\tv11 = 1110;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000EB2C: using guessed type int nIDDlgItem[1107];\r\n\r\n// ref: 0x1000EB9D\r\nHWND UNKCALL SelModem_1000EB9D(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1107]; // [esp+0h] [ebp-1170h]\r\n\tint v5; // [esp+114Ch] [ebp-24h]\r\n\tint v6; // [esp+1158h] [ebp-18h]\r\n\tint v7; // [esp+115Ch] [ebp-14h]\r\n\tint v8; // [esp+1160h] [ebp-10h]\r\n\tint v9; // [esp+1164h] [ebp-Ch]\r\n\tint v10; // [esp+1168h] [ebp-8h]\r\n\tint v11; // [esp+116Ch] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1115;\r\n\tv7 = 1110;\r\n\tv8 = 1111;\r\n\tv9 = 1112;\r\n\tv10 = 1113;\r\n\tv11 = 1114;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000EB9D: using guessed type int nIDDlgItem[1107];\r\n\r\n// ref: 0x1000EC0E\r\nHWND UNKCALL SelModem_1000EC0E(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND result; // eax\r\n\tHWND v2; // edi\r\n\tHWND v3; // ebx\r\n\tHWND v4; // eax\r\n\tDWORD *v5; // eax\r\n\tint v6; // eax\r\n\tconst char *v7; // esi\r\n\r\n\tresult = GetParent(hWnd);\r\n\tv2 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1110);\r\n\t\tv3 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv4 = GetDlgItem(v2, 1115);\r\n\t\t\tresult = (HWND)GetWindowLongA(v4, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tv5 = (DWORD *)*((DWORD *)result + 3);\r\n\t\t\t\tif ( v5 && *v5 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv6 = SelModem_1000E80E(v3) + 6;\r\n\t\t\t\t\tif ( v6 > dword_1002A4D8 - 6 )\r\n\t\t\t\t\t\tv6 = dword_1002A4D8 - 6;\r\n\t\t\t\t\tresult = (HWND)SelModem_1000EC9F(v6);\r\n\t\t\t\t\tv7 = (const char *)result;\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\tSelModem_1000E932(v2, v7);\r\n\t\t\t\t\t\tresult = SelModem_1000E7E9(v2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelModem_1000EB9D(v3);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000EC9F\r\nDWORD *__fastcall SelModem_1000EC9F(int a1) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\r\n\tresult = (DWORD *)dword_1002A4DC;\r\n\twhile ( result && a1 )\r\n\t{\r\n\t\tresult = (DWORD *)*result;\r\n\t\t--a1;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n\r\n// ref: 0x1000ECB2\r\nHWND UNKCALL SelModem_1000ECB2(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND result; // eax\r\n\tHWND v2; // edi\r\n\tHWND v3; // esi\r\n\tHWND v4; // eax\r\n\tint v5; // eax\r\n\tconst char *v6; // esi\r\n\r\n\tresult = GetParent(hWnd);\r\n\tv2 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1110);\r\n\t\tv3 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\t\t\tif ( result )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( result == (HWND)dword_1002A4DC )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv4 = GetDlgItem(v2, 1115);\r\n\t\t\t\t\t\tresult = SelModem_1000EB2C(v4);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv5 = SelModem_1000E80E(v3) - 6;\r\n\t\t\t\t\t\tif ( v5 < 0 )\r\n\t\t\t\t\t\t\tv5 = 0;\r\n\t\t\t\t\t\tresult = (HWND)SelModem_1000EC9F(v5);\r\n\t\t\t\t\t\tv6 = (const char *)result;\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\tSelModem_1000E932(v2, v6);\r\n\t\t\t\t\t\t\tresult = SelModem_1000E7E9(v2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n\r\n// ref: 0x1000ED3B\r\nHWND UNKCALL SelModem_1000ED3B(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tHWND v3; // eax\r\n\tconst char *v4; // esi\r\n\tHWND v5; // eax\r\n\tHWND v6; // eax\r\n\r\n\tv1 = hWnd;\r\n\tresult = (HWND)GetWindowLongA(hWnd, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tif ( *(DWORD *)result )\r\n\t\t\t{\r\n\t\t\t\tif ( GetWindowLongA(v1, -12) >= 1115 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv3 = GetParent(v1);\r\n\t\t\t\t\tresult = GetDlgItem(v3, 1111);\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv4 = (const char *)*((DWORD *)result + 3);\r\n\t\t\t\t\t\t\tif ( v4 )\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\t\tv5 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tSelModem_1000E932(v5, v4);\r\n\t\t\t\t\t\t\t\tv6 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tresult = SelModem_1000E7E9(v6);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelModem_1000EB2C(v1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000EDBC\r\nHWND UNKCALL SelModem_1000EDBC(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // ebx\r\n\tHWND result; // eax\r\n\tconst char *v3; // esi\r\n\tHWND v4; // eax\r\n\tHWND v5; // eax\r\n\r\n\tv1 = hWnd;\r\n\tif ( GetWindowLongA(hWnd, -12) > 1110 )\r\n\t\treturn SelModem_1000EB9D(v1);\r\n\tresult = (HWND)GetWindowLongA(v1, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv3 = (const char *)dword_1002A4DC;\r\n\t\t\tif ( result != (HWND)dword_1002A4DC )\r\n\t\t\t{\r\n\t\t\t\twhile ( v3 && *(HWND *)v3 != result )\r\n\t\t\t\t\tv3 = *(const char **)v3;\r\n\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\tv4 = GetParent(v1);\r\n\t\t\t\tSelModem_1000E932(v4, v3);\r\n\t\t\t\tv5 = GetParent(v1);\r\n\t\t\t\tresult = SelModem_1000E7E9(v5);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4DC: using guessed type int dword_1002A4DC;\r\n\r\n// ref: 0x1000EE29\r\nint __fastcall SelModem_1000EE29(int a1, int a2) { return 0; }\r\n/* {\r\n\tint v2; // esi\r\n\tint v3; // edi\r\n\tHWND v4; // eax\r\n\tLONG v5; // eax\r\n\tint v6; // eax\r\n\r\n\tv2 = a2;\r\n\tv3 = a1;\r\n\tTitleSnd_1001031F();\r\n\tif ( v2 == 1 )\r\n\t{\r\n\t\tv4 = GetFocus();\r\n\t\tif ( v4 )\r\n\t\t{\r\n\t\t\tv5 = GetWindowLongA(v4, -21);\r\n\t\t\tif ( v5 )\r\n\t\t\t{\r\n\t\t\t\tv6 = *(DWORD *)(v5 + 12);\r\n\t\t\t\tif ( v6 )\r\n\t\t\t\t\tdword_1002A4E4 = *(DWORD *)(v6 + 4);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tFade_100073B4();\r\n\tFade_100072BE(10);\r\n\treturn SDlgEndDialog(v3, v2);\r\n} */\r\n// 10010376: using guessed type int __stdcall SDlgEndDialog(DWORD, DWORD);\r\n// 1002A4E4: using guessed type int dword_1002A4E4;\r\n\r\n// ref: 0x1000EE78\r\nHWND __fastcall SelModem_1000EE78(HWND hWnd, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // ebx\r\n\tHWND v4; // esi\r\n\tint v5; // ST08_4\r\n\tHWND v6; // eax\r\n\tint v7; // edx\r\n\tHWND result; // eax\r\n\tHWND v9; // eax\r\n\tHWND v10; // eax\r\n\tHWND v11; // eax\r\n\tint v12; // eax\r\n\tint v13; // eax\r\n\tint v14; // eax\r\n\tHWND v15; // eax\r\n\tHWND v16; // eax\r\n\tHWND v17; // eax\r\n\tHWND v18; // eax\r\n\r\n\tv3 = a2;\r\n\tv4 = hWnd;\r\n\tv5 = a2;\r\n\tv6 = GetDlgItem(hWnd, 1056);\r\n\tif ( local_10007C3B(v4, v6, v5, a3) )\r\n\t{\r\n\t\tv7 = 1;\r\n\t\treturn (HWND)SelModem_1000EE29((int)v4, v7);\r\n\t}\r\n\tv9 = GetDlgItem(v4, 1054);\r\n\tif ( local_10007C3B(v4, v9, v3, a3) )\r\n\t{\r\n\t\tv7 = 2;\r\n\t\treturn (HWND)SelModem_1000EE29((int)v4, v7);\r\n\t}\r\n\tv10 = GetDlgItem(v4, 1105);\r\n\tresult = (HWND)local_10007C3B(v4, v10, v3, a3);\r\n\tif ( result )\r\n\t{\r\n\t\tv11 = GetDlgItem(v4, 1105);\r\n\t\tv12 = Sbar_100099DC(v11, v3, a3) - 1;\r\n\t\tif ( v12 )\r\n\t\t{\r\n\t\t\tv13 = v12 - 1;\r\n\t\t\tif ( v13 )\r\n\t\t\t{\r\n\t\t\t\tv14 = v13 - 1;\r\n\t\t\t\tif ( v14 )\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = (HWND)(v14 - 1);\r\n\t\t\t\t\tif ( !result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv15 = GetFocus();\r\n\t\t\t\t\t\tresult = SelModem_1000EC0E(v15);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tv16 = GetFocus();\r\n\t\t\t\t\tresult = SelModem_1000ECB2(v16);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv17 = GetFocus();\r\n\t\t\t\tresult = SelModem_1000ED3B(v17);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tv18 = GetFocus();\r\n\t\t\tresult = SelModem_1000EDBC(v18);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n"
  },
  {
    "path": "DiabloUI/selregn.cpp",
    "content": "// ref: 0x1000EF42\r\nvoid *SelRegn_1000EF42() { return 0; }\r\n/* {\r\n\treturn SMemAlloc(136, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelRegn.cpp\", 76, 0);\r\n} */\r\n// 10010364: using guessed type int __stdcall SMemAlloc(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000EF56\r\n_uiheroinfo *__fastcall SelRegn_SetNextHero(_uiheroinfo *pNext, _uiheroinfo *pCurrent)\r\n{\r\n    _uiheroinfo *result; // eax\r\n\r\n    result         = pCurrent;\r\n    pCurrent->next = pNext;\r\n    return result;\r\n}\r\n\r\n// ref: 0x1000EF60\r\nsigned int SelRegn_1000EF60() { return 0; }\r\n/* {\r\n\tsigned int result; // eax\r\n\r\n\tresult = 2139095040;\r\n\tdword_1002A4F0 = 2139095040;\r\n\treturn result;\r\n} */\r\n// 1002A4F0: using guessed type int dword_1002A4F0;\r\n\r\n// ref: 0x1000EF6B\r\nint __stdcall SelRegn_1000EF6B(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tHWND v4; // eax\r\n\tHWND v6; // eax\r\n\tint v7; // [esp+0h] [ebp-Ch]\r\n\r\n\tif ( Msg > 0x201 )\r\n\t{\r\n\t\tif ( Msg == 514 )\r\n\t\t{\r\n\t\t\tv6 = GetDlgItem(hWnd, 1105);\r\n\t\t\tif ( !Sbar_100099C0(v6) )\r\n\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\tgoto LABEL_27;\r\n\t\t}\r\n\t\tif ( Msg != 515 )\r\n\t\t{\r\n\t\t\tif ( Msg != 2024 )\r\n\t\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t\tif ( !Fade_1000739F() )\r\n\t\t\t\tFade_100073FD(hWnd, v7);\r\n\t\t\treturn 0;\r\n\t\t}\r\nLABEL_25:\r\n\t\tSelRegn_1000F929(hWnd, (unsigned short)lParam, (unsigned int)lParam >> 16);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 513 )\r\n\t\tgoto LABEL_25;\r\n\tif ( Msg == 2 )\r\n\t{\r\n\t\tSelRegn_1000F161(hWnd);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg <= 0x103 )\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\tif ( Msg <= 0x105 )\r\n\t{\r\n\t\tv4 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\tSendMessageA(v4, Msg, wParam, lParam);\r\n\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t}\r\n\tif ( Msg == 272 )\r\n\t{\r\n\t\tSelRegn_1000F1FC(hWnd);\r\n\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\treturn 0;\r\n\t}\r\n\tif ( Msg == 273 )\r\n\t{\r\n\t\tif ( HIWORD(wParam) == 7 )\r\n\t\t{\r\n\t\t\tFocus_100075B7(hWnd, (HWND)lParam);\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tif ( HIWORD(wParam) != 6 )\r\n\t\t{\r\n\t\t\tif ( wParam == 327681 )\r\n\t\t\t{\r\n\t\t\t\tSelRegn_1000F8DD(hWnd);\r\n\t\t\t}\r\n\t\t\telse if ( (WORD)wParam == 2 )\r\n\t\t\t{\r\n\t\t\t\tSelConn_1000AC07((int)hWnd, 2);\r\n\t\t\t}\r\n\t\t\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n\t\t}\r\n\t\tFocus_10007458((void *)lParam);\r\n\t\tFocus_100075DC(hWnd, (HWND)lParam);\r\n\t\tSelRegn_1000F0D7(hWnd, (unsigned short)wParam);\r\nLABEL_27:\r\n\t\tSelRegn_1000F109(hWnd);\r\n\t}\r\n\treturn SDlgDefDialogProc(hWnd, Msg, wParam, lParam);\r\n} */\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000F0D7\r\nHWND __fastcall SelRegn_1000F0D7(HWND hDlg, int nIDDlgItem) { return 0; }\r\n/* {\r\n\tHWND v2; // esi\r\n\tHWND result; // eax\r\n\r\n\tv2 = hDlg;\r\n\tresult = GetDlgItem(hDlg, nIDDlgItem);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tif ( *((DWORD *)result + 3) )\r\n\t\t\t\tresult = (HWND)Doom_10006A13(v2, (int *)&unk_10023250, 1);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000F109\r\nHWND UNKCALL SelRegn_1000F109(HWND hDlg) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tint v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = SelRegn_1000F126();\r\n\treturn Sbar_10009A99(v1, 1105, dword_1002A4F4, v2);\r\n} */\r\n\r\n// ref: 0x1000F126\r\nint SelRegn_1000F126() { return 0; }\r\n/* {\r\n\tHWND v0; // eax\r\n\tLONG v1; // eax\r\n\tDWORD *v2; // ecx\r\n\tDWORD *v3; // eax\r\n\tint v5; // edx\r\n\r\n\tv0 = GetFocus();\r\n\tif ( !v0 )\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(v0, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = (DWORD *)dword_1002A4EC;\r\n\tif ( !dword_1002A4EC )\r\n\t\treturn 0;\r\n\tv3 = *(DWORD **)(v1 + 12);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( v2 == v3 )\r\n\t\t\tbreak;\r\n\t\tv2 = (DWORD *)*v2;\r\n\t\t++v5;\r\n\t}\r\n\twhile ( v2 );\r\n\treturn v5;\r\n} */\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F161\r\nvoid UNKCALL SelRegn_1000F161(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tDWORD *v2; // eax\r\n\r\n\tv1 = hDlg;\r\n\tTitle_100100E7(hDlg);\r\n\tFocus_10007818(v1);\r\n\tSbar_10009CD2(v1, 1105);\r\n\tSelRegn_1000F1D4((DWORD *)dword_1002A4EC);\r\n\tDoom_10006C53(v1, &dword_1002326C);\r\n\tDoom_10006C53(v1, (int *)&unk_10023260);\r\n\tDoom_10006C53(v1, (int *)&unk_10023244);\r\n\tDoom_10006C53(v1, (int *)&unk_10023258);\r\n\tDoom_10006C53(v1, (int *)&unk_10023250);\r\n\tv2 = (DWORD *)GetWindowLongA(v1, -21);\r\n\tlocal_10007F72(v2);\r\n} */\r\n// 1002326C: using guessed type int dword_1002326C;\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F1D4\r\nint __fastcall SelRegn_1000F1D4(DWORD *a1) { return 0; }\r\n/* {\r\n\tDWORD *v1; // esi\r\n\tint result; // eax\r\n\r\n\tif ( a1 )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv1 = (DWORD *)*a1;\r\n\t\t\tresult = SelRegn_1000F1E8(a1);\r\n\t\t\ta1 = v1;\r\n\t\t}\r\n\t\twhile ( v1 );\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000F1E8\r\nint UNKCALL SelRegn_1000F1E8(void *arg) { return 0; }\r\n/* {\r\n\tint result; // eax\r\n\r\n\tif ( arg )\r\n\t\tresult = SMemFree(arg, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\SelRegn.cpp\", 82, 0);\r\n\treturn result;\r\n} */\r\n// 10010340: using guessed type int __stdcall SMemFree(DWORD, DWORD, DWORD, DWORD);\r\n\r\n// ref: 0x1000F1FC\r\nHWND UNKCALL SelRegn_1000F1FC(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // esi\r\n\tHWND v2; // ST1C_4\r\n\tint v3; // eax\r\n\tint *v4; // edi\r\n\tHWND result; // eax\r\n\tHWND v6; // eax\r\n\tHWND v7; // [esp+0h] [ebp-Ch]\r\n\r\n\tv1 = hWnd;\r\n\tSelRegn_1000F3C2(hWnd);\r\n\tFocus_100077E9((int)v1, \"ui_art\\\\focus16.pcx\", v7);\r\n\tTitle_1001009E(v1, (int)\"ui_art\\\\smlogo.pcx\", v2);\r\n\tv3 = local_10007F46();\r\n\tv4 = (int *)v3;\r\n\tif ( v3 )\r\n\t{\r\n\t\tSetWindowLongA(v1, -21, v3);\r\n\t\tlocal_10007944((int)v1, 0, &byte_10029448, -1, 1, (int)\"ui_art\\\\selregn.pcx\", v4, v4 + 1, 0);\r\n\t\tFade_100073C5(v1, 1);\r\n\t}\r\n\tDoom_100068AB(v1, (int *)&unk_10023250, 1);\r\n\tDoom_100068AB(v1, (int *)&unk_10023258, 1);\r\n\tDoom_100068AB(v1, (int *)&unk_10023244, 5);\r\n\tDoom_1000658C(v1, (int *)&unk_10023260, 4, 0);\r\n\tDoom_1000658C(v1, &dword_1002326C, 0, 1);\r\n\tdword_1002A4F4 = 0;\r\n\tdword_1002A4EC = 0;\r\n\tSelRegn_1000F2ED();\r\n\tSelRegn_1000F346(v1, (const char *)dword_1002A4EC);\r\n\tresult = Sbar_10009BF1(v1, 1105);\r\n\tif ( dword_1002A4F4 <= 6 )\r\n\t{\r\n\t\tv6 = GetDlgItem(v1, 1105);\r\n\t\tresult = (HWND)ShowWindow(v6, 0);\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002326C: using guessed type int dword_1002326C;\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F2ED\r\nsigned int SelRegn_1000F2ED() { return 0; }\r\n/* {\r\n\tsigned int i; // edi\r\n\tchar *v1; // eax\r\n\tchar *v2; // esi\r\n\tconst char *v3; // eax\r\n\tDWORD *v4; // eax\r\n\r\n\tfor ( i = dword_10029488; ; --i )\r\n\t{\r\n\t\tif ( i <= 0 )\r\n\t\t\treturn 1;\r\n\t\tv1 = (char *)SelRegn_1000EF42();\r\n\t\tv2 = v1;\r\n\t\tif ( !v1 )\r\n\t\t\tbreak;\r\n\t\t*(DWORD *)v1 = 0;\r\n\t\t*((DWORD *)v1 + 1) = i;\r\n\t\tv3 = BNetGW_10002B21(&unk_10029480, i);\r\n\t\tstrcpy(v2 + 8, v3);\r\n\t\tv4 = SelRegn_1000EF56(dword_1002A4EC, v2);\r\n\t\t++dword_1002A4F4;\r\n\t\tdword_1002A4EC = (int)v4;\r\n\t}\r\n\treturn 0;\r\n} */\r\n// 10029488: using guessed type int dword_10029488;\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F346\r\nint __fastcall SelRegn_1000F346(HWND a1, const char *a2) { return 0; }\r\n/* {\r\n\tconst char *v2; // edi\r\n\tint *v3; // ebx\r\n\tHWND v4; // eax\r\n\tHWND v5; // esi\r\n\tint v6; // eax\r\n\tHWND hDlg; // [esp+8h] [ebp-4h]\r\n\r\n\tv2 = a2;\r\n\thDlg = a1;\r\n\tv3 = &dword_1002326C;\r\n\tif ( dword_1002326C )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv4 = GetDlgItem(hDlg, *v3);\r\n\t\t\tv5 = v4;\r\n\t\t\tif ( v4 )\r\n\t\t\t{\r\n\t\t\t\tif ( v2 )\r\n\t\t\t\t{\r\n\t\t\t\t\tEnableWindow(v4, 1);\r\n\t\t\t\t\tv6 = GetWindowLongA(v5, -21);\r\n\t\t\t\t\tif ( v6 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t*(DWORD *)(v6 + 12) = v2;\r\n\t\t\t\t\t\tlocal_10007FA4(v6, v2 + 8);\r\n\t\t\t\t\t\tv2 = *(const char **)v2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tEnableWindow(v4, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t++v3;\r\n\t\t}\r\n\t\twhile ( *v3 );\r\n\t}\r\n\treturn Doom_1000680A(hDlg, &dword_1002326C, 0, 1);\r\n} */\r\n// 1002326C: using guessed type int dword_1002326C;\r\n\r\n// ref: 0x1000F3C2\r\nvoid UNKCALL SelRegn_1000F3C2(HWND hDlg) { return; }\r\n/* {\r\n\tHWND v1; // ebx\r\n\tint *v2; // edi\r\n\tHWND v3; // eax\r\n\tHWND v4; // esi\r\n\tvoid *v5; // eax\r\n\r\n\tv1 = hDlg;\r\n\tv2 = &dword_1002326C;\r\n\tif ( dword_1002326C )\r\n\t{\r\n\t\tdo\r\n\t\t{\r\n\t\t\tv3 = GetDlgItem(v1, *v2);\r\n\t\t\tv4 = v3;\r\n\t\t\tif ( v3 )\r\n\t\t\t{\r\n\t\t\t\tv5 = (void *)GetWindowLongA(v3, -4);\r\n\t\t\t\tSetPropA(v4, \"UIOLDPROC\", v5);\r\n\t\t\t\tSetWindowLongA(v4, -4, (LONG)SelRegn_1000F414);\r\n\t\t\t}\r\n\t\t\t++v2;\r\n\t\t}\r\n\t\twhile ( *v2 );\r\n\t}\r\n} */\r\n// 1002326C: using guessed type int dword_1002326C;\r\n\r\n// ref: 0x1000F414\r\nLRESULT __stdcall SelRegn_1000F414(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; }\r\n/* {\r\n\tLRESULT (__stdcall *v4)(HWND, UINT, WPARAM, LPARAM); // edi\r\n\tHWND v5; // eax\r\n\tWPARAM v7; // [esp-8h] [ebp-14h]\r\n\r\n\tv4 = (LRESULT (__stdcall *)(HWND, UINT, WPARAM, LPARAM))GetPropA(hWnd, \"UIOLDPROC\");\r\n\tswitch ( Msg )\r\n\t{\r\n\t\tcase 2u:\r\n\t\t\tRemovePropA(hWnd, \"UIOLDPROC\");\r\n\t\t\tif ( !v4 )\r\n\t\t\t\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n\t\t\tSetWindowLongA(hWnd, -4, (LONG)v4);\r\n\t\t\tbreak;\r\n\t\tcase 0xFu:\r\n\t\t\tlocal_10007C95(hWnd);\r\n\t\t\treturn 0;\r\n\t\tcase 0x87u:\r\n\t\t\treturn 4;\r\n\t\tcase 0x100u:\r\n\t\t\tif ( wParam > 0x21 )\r\n\t\t\t{\r\n\t\t\t\tif ( wParam == 34 )\r\n\t\t\t\t{\r\n\t\t\t\t\tSelRegn_1000F61E(hWnd);\r\n\t\t\t\t}\r\n\t\t\t\telse if ( wParam > 0x24 )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( wParam <= 0x26 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelRegn_1000F859(hWnd);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if ( wParam <= 0x28 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tSelRegn_1000F7C1(hWnd);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam == 33 )\r\n\t\t\t{\r\n\t\t\t\tSelRegn_1000F711(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam == 9 )\r\n\t\t\t{\r\n\t\t\t\tif ( GetKeyState(16) >= 0 )\r\n\t\t\t\t\tSelRegn_1000F53C(hWnd);\r\n\t\t\t\telse\r\n\t\t\t\t\tSelRegn_1000F5AD(hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tif ( wParam != 13 )\r\n\t\t\t{\r\n\t\t\t\tif ( wParam == 27 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv7 = 2;\r\n\t\t\t\t\tgoto LABEL_13;\r\n\t\t\t\t}\r\n\t\t\t\tif ( wParam != 32 )\r\n\t\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tv7 = 1;\r\nLABEL_13:\r\n\t\t\tv5 = GetParent(hWnd);\r\n\t\t\tSendMessageA(v5, 0x111u, v7, 0);\r\n\t\t\treturn 0;\r\n\t}\r\n\tif ( v4 )\r\n\t\treturn CallWindowProcA(v4, hWnd, Msg, wParam, lParam);\r\n\treturn DefWindowProcA(hWnd, Msg, wParam, lParam);\r\n} */\r\n\r\n// ref: 0x1000F53C\r\nHWND UNKCALL SelRegn_1000F53C(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1132]; // [esp+0h] [ebp-11D4h]\r\n\tint v5; // [esp+11B0h] [ebp-24h]\r\n\tint v6; // [esp+11BCh] [ebp-18h]\r\n\tint v7; // [esp+11C0h] [ebp-14h]\r\n\tint v8; // [esp+11C4h] [ebp-10h]\r\n\tint v9; // [esp+11C8h] [ebp-Ch]\r\n\tint v10; // [esp+11CCh] [ebp-8h]\r\n\tint v11; // [esp+11D0h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1136;\r\n\tv7 = 1137;\r\n\tv8 = 1138;\r\n\tv9 = 1139;\r\n\tv10 = 1140;\r\n\tv11 = 1135;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000F53C: using guessed type int nIDDlgItem[1132];\r\n\r\n// ref: 0x1000F5AD\r\nHWND UNKCALL SelRegn_1000F5AD(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND v2; // ebx\r\n\tint nIDDlgItem[1132]; // [esp+0h] [ebp-11D4h]\r\n\tint v5; // [esp+11B0h] [ebp-24h]\r\n\tint v6; // [esp+11BCh] [ebp-18h]\r\n\tint v7; // [esp+11C0h] [ebp-14h]\r\n\tint v8; // [esp+11C4h] [ebp-10h]\r\n\tint v9; // [esp+11C8h] [ebp-Ch]\r\n\tint v10; // [esp+11CCh] [ebp-8h]\r\n\tint v11; // [esp+11D0h] [ebp-4h]\r\n\r\n\tv1 = hWnd;\r\n\tv6 = 1140;\r\n\tv7 = 1135;\r\n\tv8 = 1136;\r\n\tv9 = 1137;\r\n\tv10 = 1138;\r\n\tv11 = 1139;\r\n\tv2 = GetParent(hWnd);\r\n\tdo\r\n\t{\r\n\t\tv5 = nIDDlgItem[GetWindowLongA(v1, -12)];\r\n\t\tv1 = GetDlgItem(v2, v5);\r\n\t}\r\n\twhile ( !IsWindowEnabled(v1) );\r\n\treturn SetFocus(v1);\r\n} */\r\n// 1000F5AD: using guessed type int nIDDlgItem[1132];\r\n\r\n// ref: 0x1000F61E\r\nHWND UNKCALL SelRegn_1000F61E(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // ebp\r\n\tHWND result; // eax\r\n\tHWND v3; // esi\r\n\tHWND v4; // ebx\r\n\tHWND v5; // eax\r\n\tDWORD *v6; // eax\r\n\tint v7; // eax\r\n\tconst char *v8; // ebx\r\n\tint v9; // eax\r\n\r\n\tv1 = hWnd;\r\n\tresult = GetParent(hWnd);\r\n\tv3 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1135);\r\n\t\tv4 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv5 = GetDlgItem(v3, 1140);\r\n\t\t\tresult = (HWND)GetWindowLongA(v5, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tv6 = (DWORD *)*((DWORD *)result + 3);\r\n\t\t\t\tif ( v6 && *v6 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv7 = SelRegn_1000F6C9(v4) + 6;\r\n\t\t\t\t\tif ( v7 > dword_1002A4F4 - 6 )\r\n\t\t\t\t\t\tv7 = dword_1002A4F4 - 6;\r\n\t\t\t\t\tresult = (HWND)SelRegn_1000F6FE(v7);\r\n\t\t\t\t\tv8 = (const char *)result;\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\tSelRegn_1000F346(v3, v8);\r\n\t\t\t\t\t\tv9 = GetWindowLongA(v1, -12);\r\n\t\t\t\t\t\tSelRegn_1000F0D7(v3, v9);\r\n\t\t\t\t\t\tresult = SelRegn_1000F109(v3);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelRegn_1000F5AD(v4);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000F6C9\r\nint UNKCALL SelRegn_1000F6C9(HWND hWnd) { return 0; }\r\n/* {\r\n\tLONG v1; // eax\r\n\tDWORD *v2; // ecx\r\n\tDWORD *v3; // eax\r\n\tint v5; // edx\r\n\r\n\tif ( !hWnd )\r\n\t\treturn 0;\r\n\tv1 = GetWindowLongA(hWnd, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = (DWORD *)dword_1002A4EC;\r\n\tif ( !dword_1002A4EC )\r\n\t\treturn 0;\r\n\tv3 = *(DWORD **)(v1 + 12);\r\n\tif ( !v3 )\r\n\t\treturn 0;\r\n\tv5 = 0;\r\n\tdo\r\n\t{\r\n\t\tif ( v2 == v3 )\r\n\t\t\tbreak;\r\n\t\tv2 = (DWORD *)*v2;\r\n\t\t++v5;\r\n\t}\r\n\twhile ( v2 );\r\n\treturn v5;\r\n} */\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F6FE\r\nDWORD *__fastcall SelRegn_1000F6FE(int a1) { return 0; }\r\n/* {\r\n\tDWORD *result; // eax\r\n\r\n\tresult = (DWORD *)dword_1002A4EC;\r\n\twhile ( result && a1 )\r\n\t{\r\n\t\tresult = (DWORD *)*result;\r\n\t\t--a1;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F711\r\nHWND UNKCALL SelRegn_1000F711(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND result; // eax\r\n\tHWND v2; // esi\r\n\tHWND v3; // edi\r\n\tHWND v4; // eax\r\n\tint v5; // eax\r\n\tconst char *v6; // edi\r\n\tint v7; // eax\r\n\tHWND hWnda; // [esp+10h] [ebp-4h]\r\n\r\n\thWnda = hWnd;\r\n\tresult = GetParent(hWnd);\r\n\tv2 = result;\r\n\tif ( result )\r\n\t{\r\n\t\tresult = GetDlgItem(result, 1135);\r\n\t\tv3 = result;\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\tif ( result )\r\n\t\t\t{\r\n\t\t\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\t\t\tif ( result )\r\n\t\t\t\t{\r\n\t\t\t\t\tif ( result == (HWND)dword_1002A4EC )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv4 = GetDlgItem(v2, 1140);\r\n\t\t\t\t\t\tresult = SelRegn_1000F53C(v4);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv5 = SelRegn_1000F6C9(v3) - 6;\r\n\t\t\t\t\t\tif ( v5 < 0 )\r\n\t\t\t\t\t\t\tv5 = 0;\r\n\t\t\t\t\t\tresult = (HWND)SelRegn_1000F6FE(v5);\r\n\t\t\t\t\t\tv6 = (const char *)result;\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\tSelRegn_1000F346(v2, v6);\r\n\t\t\t\t\t\t\tv7 = GetWindowLongA(hWnda, -12);\r\n\t\t\t\t\t\t\tSelRegn_1000F0D7(v2, v7);\r\n\t\t\t\t\t\t\tresult = SelRegn_1000F109(v2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F7C1\r\nHWND UNKCALL SelRegn_1000F7C1(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tHWND v3; // eax\r\n\tconst char *v4; // ebp\r\n\tHWND v5; // eax\r\n\tint v6; // ebx\r\n\tHWND v7; // eax\r\n\tHWND v8; // eax\r\n\r\n\tv1 = hWnd;\r\n\tresult = (HWND)GetWindowLongA(hWnd, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tif ( *(DWORD *)result )\r\n\t\t\t{\r\n\t\t\t\tif ( GetWindowLongA(v1, -12) >= 1140 )\r\n\t\t\t\t{\r\n\t\t\t\t\tv3 = GetParent(v1);\r\n\t\t\t\t\tresult = GetDlgItem(v3, 1136);\r\n\t\t\t\t\tif ( result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tresult = (HWND)GetWindowLongA(result, -21);\r\n\t\t\t\t\t\tif ( result )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tv4 = (const char *)*((DWORD *)result + 3);\r\n\t\t\t\t\t\t\tif ( v4 )\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\t\t\t\t\tv5 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tSelRegn_1000F346(v5, v4);\r\n\t\t\t\t\t\t\t\tv6 = GetWindowLongA(v1, -12);\r\n\t\t\t\t\t\t\t\tv7 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tSelRegn_1000F0D7(v7, v6);\r\n\t\t\t\t\t\t\t\tv8 = GetParent(v1);\r\n\t\t\t\t\t\t\t\tresult = SelRegn_1000F109(v8);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = SelRegn_1000F53C(v1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000F859\r\nHWND UNKCALL SelRegn_1000F859(HWND hWnd) { return 0; }\r\n/* {\r\n\tHWND v1; // edi\r\n\tHWND result; // eax\r\n\tconst char *v3; // ebx\r\n\tHWND v4; // eax\r\n\tint v5; // ebx\r\n\tHWND v6; // eax\r\n\tHWND v7; // eax\r\n\r\n\tv1 = hWnd;\r\n\tif ( GetWindowLongA(hWnd, -12) > 1135 )\r\n\t\treturn SelRegn_1000F5AD(v1);\r\n\tresult = (HWND)GetWindowLongA(v1, -21);\r\n\tif ( result )\r\n\t{\r\n\t\tresult = (HWND)*((DWORD *)result + 3);\r\n\t\tif ( result )\r\n\t\t{\r\n\t\t\tv3 = (const char *)dword_1002A4EC;\r\n\t\t\tif ( result != (HWND)dword_1002A4EC )\r\n\t\t\t{\r\n\t\t\t\twhile ( v3 && *(HWND *)v3 != result )\r\n\t\t\t\t\tv3 = *(const char **)v3;\r\n\t\t\t\tTitleSnd_10010315();\r\n\t\t\t\tv4 = GetParent(v1);\r\n\t\t\t\tSelRegn_1000F346(v4, v3);\r\n\t\t\t\tv5 = GetWindowLongA(v1, -12);\r\n\t\t\t\tv6 = GetParent(v1);\r\n\t\t\t\tSelRegn_1000F0D7(v6, v5);\r\n\t\t\t\tv7 = GetParent(v1);\r\n\t\t\t\tresult = SelRegn_1000F109(v7);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n// 1002A4EC: using guessed type int dword_1002A4EC;\r\n\r\n// ref: 0x1000F8DD\r\nsigned int UNKCALL SelRegn_1000F8DD(void *arg) { return 0; }\r\n/* {\r\n\tint v1; // esi\r\n\tsigned int result; // eax\r\n\r\n\tv1 = (int)arg;\r\n\tresult = SelRegn_1000F8F6();\r\n\tif ( result )\r\n\t\tresult = SelConn_1000AC07(v1, 1);\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000F8F6\r\nsigned int SelRegn_1000F8F6() { return 0; }\r\n/* {\r\n\tHWND v0; // eax\r\n\tLONG v1; // eax\r\n\tint v2; // eax\r\n\r\n\tTitleSnd_1001031F();\r\n\tv0 = GetFocus();\r\n\tv1 = GetWindowLongA(v0, -21);\r\n\tif ( !v1 )\r\n\t\treturn 0;\r\n\tv2 = *(DWORD *)(v1 + 12);\r\n\tif ( !v2 )\r\n\t\treturn 0;\r\n\tBNetGW_10002B51(&unk_10029480, *(DWORD *)(v2 + 4));\r\n\treturn 1;\r\n} */\r\n\r\n// ref: 0x1000F929\r\nHWND __fastcall SelRegn_1000F929(HWND hWnd, int a2, int a3) { return 0; }\r\n/* {\r\n\tint v3; // ebx\r\n\tHWND v4; // esi\r\n\tint v5; // ST08_4\r\n\tHWND v6; // eax\r\n\tHWND result; // eax\r\n\tHWND v8; // eax\r\n\tHWND v9; // eax\r\n\tHWND v10; // eax\r\n\tint v11; // eax\r\n\tint v12; // eax\r\n\tint v13; // eax\r\n\tHWND v14; // eax\r\n\tHWND v15; // eax\r\n\tHWND v16; // eax\r\n\tHWND v17; // eax\r\n\r\n\tv3 = a2;\r\n\tv4 = hWnd;\r\n\tv5 = a2;\r\n\tv6 = GetDlgItem(hWnd, 1056);\r\n\tif ( local_10007C3B(v4, v6, v5, a3) )\r\n\t\treturn (HWND)SelRegn_1000F8DD(v4);\r\n\tv8 = GetDlgItem(v4, 1054);\r\n\tif ( local_10007C3B(v4, v8, v3, a3) )\r\n\t\treturn (HWND)SelConn_1000AC07((int)v4, 2);\r\n\tv9 = GetDlgItem(v4, 1105);\r\n\tresult = (HWND)local_10007C3B(v4, v9, v3, a3);\r\n\tif ( result )\r\n\t{\r\n\t\tv10 = GetDlgItem(v4, 1105);\r\n\t\tv11 = Sbar_100099DC(v10, v3, a3) - 1;\r\n\t\tif ( v11 )\r\n\t\t{\r\n\t\t\tv12 = v11 - 1;\r\n\t\t\tif ( v12 )\r\n\t\t\t{\r\n\t\t\t\tv13 = v12 - 1;\r\n\t\t\t\tif ( v13 )\r\n\t\t\t\t{\r\n\t\t\t\t\tresult = (HWND)(v13 - 1);\r\n\t\t\t\t\tif ( !result )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tv14 = GetFocus();\r\n\t\t\t\t\t\tresult = SelRegn_1000F61E(v14);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tv15 = GetFocus();\r\n\t\t\t\t\tresult = SelRegn_1000F711(v15);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tv16 = GetFocus();\r\n\t\t\t\tresult = SelRegn_1000F7C1(v16);\r\n\t\t\t}\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tv17 = GetFocus();\r\n\t\t\tresult = SelRegn_1000F859(v17);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n} */\r\n\r\n// ref: 0x1000F9F7\r\nsigned int __stdcall UiSelectRegion(DWORD *a1) { return 0; }\r\n/* {\r\n\tint v1; // eax\r\n\tint v2; // eax\r\n\tsigned int result; // eax\r\n\r\n\tartfont_10001159();\r\n\tv1 = SDrawGetFrameWindow(NULL);\r\n\tv2 = SDlgDialogBoxParam(hInstance, \"SELREGION_DIALOG\", v1, SelRegn_1000EF6B, 0);\r\n\tif ( a1 )\r\n\t\t*a1 = dword_1002948C;\r\n\tif ( v2 == 1 )\r\n\t{\r\n\t\tlocal_100078B6();\r\n\t\tresult = 1;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tSErrSetLastError(1223);\r\n\t\tresult = 0;\r\n\t}\r\n\treturn result;\r\n} */\r\n// 10010370: using guessed type int __stdcall SDlgDialogBoxParam(DWORD, DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n// 1001041E: using guessed type int __stdcall SErrSetLastError(DWORD);\r\n// 1002948C: using guessed type int dword_1002948C;\r\n"
  },
  {
    "path": "DiabloUI/selyesno.cpp",
    "content": "// ref: 0x1000FA49\r\nint __fastcall SelYesNo_YesNoDialog(HWND hWnd, char *dialogstr, char *hero, int nofocus)\r\n{\r\n\tyesno_dialog_string = dialogstr;\r\n\tyesno_hero_name     = hero;\r\n\tyesno_remove_focus  = nofocus;\r\n\tyesno_is_popup      = 0;\r\n\tYesNoFunc           = 0;\r\n\treturn SDlgDialogBoxParam(ghUiInst, \"SELYESNO_DIALOG\", (int)hWnd, SelYesNo_WndProc, 0);\r\n}\r\n// 1002A500: using guessed type int yesno_remove_focus;\r\n// 1002A508: using guessed type int (*YesNoFunc)(void);\r\n// 1002A50C: using guessed type int yesno_is_popup;\r\n\r\n// ref: 0x1000FA87\r\nLRESULT __stdcall SelYesNo_WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v4;  // eax\r\n\tHWND v5;  // eax\r\n\tint v7;   // edx\r\n\tHWND v8;  // eax\r\n\tLONG v9;  // eax\r\n\tHWND v10; // ecx\r\n\tHWND v11; // eax\r\n\r\n\tif (Msg == 2) {\r\n\t\tSelYesNo_RemoveYNDialog(hWnd);\r\n\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t}\r\n\tif (Msg > 0x103) {\r\n\t\tif (Msg <= 0x105) {\r\n\t\t\tv11 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\tSendMessageA(v11, Msg, wParam, lParam);\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tswitch (Msg) {\r\n\t\tcase 0x110u:\r\n\t\t\tSelYesNo_LoadSelYN_GFX(hWnd);\r\n\t\t\treturn 0;\r\n\t\tcase 0x111u:\r\n\t\t\tif (HIWORD(wParam) == 7) {\r\n\t\t\t\tFocus_GetAndBlitSpin(hWnd, lParam);\r\n\t\t\t} else if (HIWORD(wParam) == 6) {\r\n\t\t\t\tFocus_CheckPlayMove(lParam);\r\n\t\t\t\tFocus_DoBlitSpinIncFrame(hWnd, (HWND)lParam);\r\n\t\t\t} else {\r\n\t\t\t\tv7 = 1;\r\n\t\t\t\tif ((WORD)wParam == 1) {\r\n\t\t\t\t\tv8  = GetFocus();\r\n\t\t\t\t\tv9  = GetWindowLongA(v8, -12);\r\n\t\t\t\t\tv10 = hWnd;\r\n\t\t\t\t\tif (v9 == 1109)\r\n\t\t\t\t\t\tv7 = 1;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tv7 = 2;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif ((WORD)wParam == 2) {\r\n\t\t\t\t\t\tv7 = 2;\r\n\t\t\t\t\t} else if ((WORD)wParam != 1109) {\r\n\t\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tv10 = hWnd;\r\n\t\t\t\t}\r\n\t\t\t\tSelYesNo_DoSelectYesNo(v10, v7);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 0x113u:\r\n\t\t\tv4 = GetFocus();\r\n\t\t\tif (!Focus_DoBlitSpinIncFrame(hWnd, v4)) {\r\n\t\t\t\tv5 = GetDlgItem(hWnd, 1109);\r\n\t\t\t\tif (!v5)\r\n\t\t\t\t\tv5 = GetDlgItem(hWnd, 2);\r\n\t\t\t\tSetFocus(v5);\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\treturn (LRESULT)SDlgDefDialogProc(hWnd, Msg, (HDC)wParam, (HWND)lParam);\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x1000FBC7\r\nvoid __fastcall SelYesNo_RemoveYNDialog(HWND hWnd)\r\n{\r\n\tHWND v1;   // esi\r\n\tvoid **v2; // eax\r\n\tHWND v3;   // eax\r\n\r\n\tv1 = hWnd;\r\n\tv2 = (void **)GetWindowLongA(hWnd, -21);\r\n\tlocal_FreeMemPtr(v2);\r\n\tif (yesno_remove_focus)\r\n\t\tFocus_DeleteSpinners();\r\n\tDoom_DeleteFreeProcs(v1, yesno_msgtbl1);\r\n\tDoom_DeleteFreeProcs(v1, yesno_msgtbl2);\r\n\tif (yesno_hero_name) {\r\n\t\tv3 = GetParent(v1);\r\n\t\tSelHero_SetStringWithMsg(v3, 0);\r\n\t}\r\n}\r\n// 1002A500: using guessed type int yesno_remove_focus;\r\n\r\n// ref: 0x1000FC1C\r\nvoid __fastcall SelYesNo_LoadSelYN_GFX(HWND hWnd)\r\n{\r\n\tHWND v2;        // eax\r\n\tDWORD *v3;      // eax\r\n\tDWORD *v4;      // edi\r\n\tconst char *v5; // eax\r\n\tchar *v6;       // ST18_4\r\n\tHWND v7;        // eax\r\n\r\n\tv2 = GetParent(hWnd);\r\n\tif (yesno_hero_name)\r\n\t\tSelHero_SetStringWithMsg(v2, yesno_hero_name);\r\n\tv3 = local_AllocWndLongData();\r\n\tv4 = v3;\r\n\tif (v3) {\r\n\t\tSetWindowLongA(hWnd, -21, (LONG)v3);\r\n\t\tif (yesno_is_popup) {\r\n\t\t\tif (DiabloUI_GetSpawned())\r\n\t\t\t\tv5 = \"ui_art\\\\swmmpop.pcx\";\r\n\t\t\telse\r\n\t\t\t\tv5 = \"ui_art\\\\mmpopup.pcx\";\r\n\t\t} else {\r\n\t\t\tv5 = \"ui_art\\\\black.pcx\";\r\n\t\t}\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, \"Popup\", -1, 1, v5, (BYTE **)v4, v4 + 1, 1);\r\n\t}\r\n\tv6 = yesno_dialog_string;\r\n\tv7 = GetDlgItem(hWnd, 1026);\r\n\tSetWindowTextA(v7, v6);\r\n\tDoom_ParseWndProc3(hWnd, yesno_msgtbl2, AF_MEDGRAY);\r\n\tDoom_ParseWndProcs(hWnd, yesno_msgtbl1, AF_BIG, 1);\r\n\tif (yesno_remove_focus)\r\n\t\tFocus_LoadSpinner(\"ui_art\\\\focus.pcx\");\r\n\telse\r\n\t\tFocus_ResetSpinToZero();\r\n\tSDlgSetTimer((int)hWnd, 1, 55, 0);\r\n\tlocal_DoUiWndProc2(hWnd, (DWORD *)yesno_msgtbl1);\r\n}\r\n// 1002A500: using guessed type int yesno_remove_focus;\r\n// 1002A50C: using guessed type int yesno_is_popup;\r\n\r\n// ref: 0x1000FCF6\r\nvoid __fastcall SelYesNo_DoSelectYesNo(HWND hWnd, int option)\r\n{\r\n\tHWND v4; // eax\r\n\r\n\tTitleSnd_PlaySelectSound();\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tif (option == 2) {\r\n\t\tif (!YesNoFunc)\r\n\t\t\tgoto LABEL_6;\r\n\t\tYesNoFunc();\r\n\t}\r\n\tif (option == 1) {\r\n\t\tv4     = GetFocus();\r\n\t\toption = GetWindowLongA(v4, -12);\r\n\t}\r\nLABEL_6:\r\n\tSDlgEndDialog(hWnd, (HANDLE)option);\r\n}\r\n// 1002A508: using guessed type int (*YesNoFunc)(void);\r\n\r\n// ref: 0x1000FD39\r\nint __fastcall SelYesNo_SelOkDialog(HWND hWnd, char *dialogstr, char *hero, int nofocus)\r\n{\r\n\tyesno_dialog_string = dialogstr;\r\n\tyesno_hero_name     = hero;\r\n\tyesno_remove_focus  = nofocus;\r\n\tyesno_is_popup      = 0;\r\n\tYesNoFunc           = 0;\r\n\treturn SDlgDialogBoxParam(ghUiInst, \"SELOK_DIALOG\", (int)hWnd, SelYesNo_WndProc, 0);\r\n}\r\n// 1002A500: using guessed type int yesno_remove_focus;\r\n// 1002A508: using guessed type int (*YesNoFunc)(void);\r\n// 1002A50C: using guessed type int yesno_is_popup;\r\n\r\n// ref: 0x1000FD77\r\nint __fastcall SelYesNo_SpawnErrDialog(HWND hWnd, int string_rsrc, int is_popup)\r\n{\r\n\tchar Buffer[256]; // [esp+4h] [ebp-100h]\r\n\r\n\tLoadStringA(ghUiInst, string_rsrc, Buffer, 255);\r\n\tyesno_is_popup      = is_popup;\r\n\tyesno_remove_focus  = 0;\r\n\tyesno_hero_name     = 0;\r\n\tyesno_dialog_string = Buffer;\r\n\tYesNoFunc           = 0;\r\n\treturn SDlgDialogBoxParam(ghUiInst, \"SPAWNERR_DIALOG\", (int)hWnd, SelYesNo_WndProc, 0);\r\n}\r\n// 1002A500: using guessed type int yesno_remove_focus;\r\n// 1002A508: using guessed type int (*YesNoFunc)(void);\r\n// 1002A50C: using guessed type int yesno_is_popup;\r\n\r\n// ref: 0x1000FDE3\r\nvoid __cdecl SelYesNo_cpp_init()\r\n{\r\n\tSelYesNo_cpp_float = SelYesNo_cpp_float_value;\r\n}\r\n// 1001F478: using guessed type int SelYesNo_cpp_float_value;\r\n// 1002A4FC: using guessed type int SelYesNo_cpp_float;\r\n"
  },
  {
    "path": "DiabloUI/title.cpp",
    "content": "// ref: 0x1000FDEE\r\nvoid __fastcall Title_BlitTitleBuffer(HWND hWnd)\r\n{\r\n\tDWORD *v2;          // edi\r\n\tint v3;              // eax\r\n\tHANDLE v4;           // esi\r\n\tstruct tagRECT Rect; // [esp+Ch] [ebp-18h]\r\n\tHWND hWnda;          // [esp+20h] [ebp-4h]\r\n\r\n\tv2    = (DWORD *)GetWindowLongA(hWnd, -21);\r\n\thWnda = GetDlgItem(hWnd, 1043);\r\n\tif (IsWindowVisible(hWnd) && hWnda && v2 && *v2 && titlePHTrans[0]) {\r\n\t\tv3            = titleTransIdx + 1;\r\n\t\ttitleTransIdx = v3;\r\n\t\tif (!titlePHTrans[v3] || v3 >= 30)\r\n\t\t\ttitleTransIdx = 0;\r\n\t\tGetWindowRect(hWnda, &Rect);\r\n\t\tScreenToClient(hWnd, (LPPOINT)&Rect);\r\n\t\tScreenToClient(hWnd, (LPPOINT)&Rect.right);\r\n\t\tv4 = GetPropA(hWnd, \"TITLE_BUFFER\");\r\n\t\tif (v4) {\r\n\t\t\tSBltROP3(\r\n\t\t\t    *(void **)v4,\r\n\t\t\t    (void *)(Rect.left + *v2 + Rect.top * v2[1]),\r\n\t\t\t    *((DWORD *)v4 + 1),\r\n\t\t\t    *((DWORD *)v4 + 2),\r\n\t\t\t    *((DWORD *)v4 + 1),\r\n\t\t\t    v2[1],\r\n\t\t\t    0,\r\n\t\t\t    0xCC0020u);\r\n\t\t\tSTransBlt(*(void **)v4, 0, 0, *((DWORD *)v4 + 1), (HANDLE)titlePHTrans[titleTransIdx]);\r\n\t\t\tInvalidateRect(hWnda, 0, 0);\r\n\t\t}\r\n\t}\r\n}\r\n// 1002A58C: using guessed type int titleTransIdx;\r\n\r\n// ref: 0x1000FEED\r\nvoid __cdecl Title_DeletePhTrans()\r\n{\r\n\tint *v0; // esi\r\n\r\n\tv0 = (int *)titlePHTrans;\r\n\tdo {\r\n\t\tif (*v0) {\r\n\t\t\tSTransDelete((HANDLE)*v0);\r\n\t\t\t*v0 = 0;\r\n\t\t}\r\n\t\t++v0;\r\n\t} while ((signed int)v0 < (signed int)&titlePHTrans[30]);\r\n}\r\n\r\n// ref: 0x1000FF0F\r\nvoid __fastcall Title_FreeTransMem(HWND hWnd)\r\n{\r\n\tvoid **v2; // eax MAPDST\r\n\tvoid *v4;  // eax\r\n\r\n\tTitle_DeletePhTrans();\r\n\tv2 = (void **)RemovePropA(hWnd, \"TITLE_BUFFER\");\r\n\tif (v2) {\r\n\t\tv4 = *v2;\r\n\t\tif (v4) {\r\n\t\t\tSMemFree(v4, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Title.cpp\", 114, 0);\r\n\t\t\t*v2 = 0;\r\n\t\t}\r\n\t\tSMemFree(v2, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Title.cpp\", 117, 0);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000FF51\r\nvoid __fastcall Title_SetTitleBMP(HWND hWnd)\r\n{\r\n\tHWND v1;             // eax MAPDST\r\n\tDWORD *v2;          // esi\r\n\tvoid *v3;            // eax\r\n\tstruct tagRECT Rect; // [esp+0h] [ebp-18h]\r\n\r\n\tTitle_FreeTransMem(hWnd);\r\n\tv1 = GetDlgItem(hWnd, 1043);\r\n\tif (v1) {\r\n\t\tGetClientRect(v1, &Rect);\r\n\t\tv2    = (DWORD *)SMemAlloc(0xCu, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Title.cpp\", 134, 0);\r\n\t\tv3    = SMemAlloc(Rect.right * Rect.bottom, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Title.cpp\", 136, 8);\r\n\t\t*v2   = (DWORD)v3;\r\n\t\tv2[1] = Rect.right;\r\n\t\tv2[2] = Rect.bottom;\r\n\t\tSDlgSetBitmapI(v1, 0, 0, -1, 1, v3, 0, Rect.right, Rect.bottom, -1);\r\n\t\tSetPropA(hWnd, \"TITLE_BUFFER\", v2);\r\n\t}\r\n}\r\n\r\n// ref: 0x1000FFE8\r\nvoid __fastcall Title_LoadTitleImage(HWND hWnd, const char *pszFileName)\r\n{\r\n\tint v3;             // edi\r\n\tDWORD *v4;         // eax\r\n\tDWORD *v5;         // esi\r\n\tint v6;             // ebx\r\n\tint a5[4];          // [esp+8h] [ebp-20h]\r\n\tint data[2];        // [esp+18h] [ebp-10h]\r\n\tHANDLE *phTransOut; // [esp+20h] [ebp-8h]\r\n\tBYTE *pBuffer;      // [esp+24h] [ebp-4h]\r\n\r\n\tv3      = 0;\r\n\tpBuffer = 0;\r\n\tlocal_LoadArtImage(pszFileName, &pBuffer, (DWORD *)data);\r\n\tv4 = (DWORD *)GetPropA(hWnd, \"TITLE_BUFFER\");\r\n\tv5 = v4;\r\n\tif (pBuffer) {\r\n\t\tif (v4) {\r\n\t\t\tv6 = data[1] / v4[2];\r\n\t\t\tif (v6 > 30)\r\n\t\t\t\tv6 = 30;\r\n\t\t\tif (v6 > 0) {\r\n\t\t\t\tphTransOut = (HANDLE *)titlePHTrans;\r\n\t\t\t\tdo {\r\n\t\t\t\t\ta5[0] = 0;\r\n\t\t\t\t\ta5[2] = v5[1] - 1;\r\n\t\t\t\t\ta5[1] = v3 * v5[2];\r\n\t\t\t\t\ta5[3] = v5[2] + a5[1] - 1;\r\n\t\t\t\t\tSTransCreateI(pBuffer, v5[1], v5[2], 8, (int)a5, 16777466, phTransOut);\r\n\t\t\t\t\t++phTransOut;\r\n\t\t\t\t\t++v3;\r\n\t\t\t\t} while (v3 < v6);\r\n\t\t\t}\r\n\t\t}\r\n\t\tSMemFree(pBuffer, \"C:\\\\Src\\\\Diablo\\\\DiabloUI\\\\Title.cpp\", 197, 0);\r\n\t}\r\n\ttitleTransIdx = 0;\r\n}\r\n// 1002A58C: using guessed type int titleTransIdx;\r\n\r\n// ref: 0x1001009E\r\nvoid __fastcall Title_LoadImgSetTimer(HWND hWnd, const char *pszFileName)\r\n{\r\n\tTitle_SetTitleBMP(hWnd);\r\n\tTitle_LoadTitleImage(hWnd, pszFileName);\r\n\tTitle_BlitTitleBuffer(hWnd);\r\n\tSDlgSetTimer((int)hWnd, 2, 55, Title_BlitTitleBufFnc);\r\n}\r\n\r\n// ref: 0x100100CB\r\nvoid __stdcall Title_BlitTitleBufFnc(int hWnd, int a2, int a3, int a4)\r\n{\r\n\tTitle_BlitTitleBuffer((HWND)hWnd);\r\n}\r\n\r\n// ref: 0x100100DC\r\nvoid __cdecl Title_cpp_init()\r\n{\r\n\tTitle_cpp_float = Title_cpp_float_value;\r\n}\r\n// 1001F47C: using guessed type int Title_cpp_float_value;\r\n// 1002A588: using guessed type int Title_cpp_float;\r\n\r\n// ref: 0x100100E7\r\nvoid __fastcall Title_KillTitleTimer(HWND hWnd)\r\n{\r\n\tHWND v1; // esi\r\n\r\n\tv1 = hWnd;\r\n\tSDlgKillTimer((int)hWnd, 2);\r\n\tTitle_FreeTransMem(v1);\r\n}\r\n\r\n// ref: 0x100100FA\r\nBOOL __stdcall UiTitleDialog(int a1)\r\n{\r\n\tint v1; // eax\r\n\r\n\tartfont_LoadAllFonts();\r\n\tv1 = (int)SDrawGetFrameWindow(NULL);\r\n\tSDlgDialogBoxParam(ghUiInst, \"TITLESCREEN_DIALOG\", v1, Title_MainProc, a1);\r\n\treturn 1;\r\n}\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10010126\r\nLRESULT __stdcall Title_MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tHWND v5; // eax\r\n\r\n\tif (uMsg <= 0x111) {\r\n\t\tif (uMsg != 273) {\r\n\t\t\tif (uMsg != 2) {\r\n\t\t\t\tif (uMsg == 135)\r\n\t\t\t\t\treturn 4;\r\n\t\t\t\tif (uMsg != 256) {\r\n\t\t\t\t\tif (uMsg > 0x103) {\r\n\t\t\t\t\t\tif (uMsg <= 0x105) {\r\n\t\t\t\t\t\t\tv5 = (HWND)SDrawGetFrameWindow(NULL);\r\n\t\t\t\t\t\t\tSendMessageA(v5, uMsg, wParam, lParam);\r\n\t\t\t\t\t\t} else if (uMsg == 272) {\r\n\t\t\t\t\t\t\tTitle_LoadAllTitleImgs(hWnd, lParam);\r\n\t\t\t\t\t\t\tPostMessageA(hWnd, 0x7E8u, 0, 0);\r\n\t\t\t\t\t\t\treturn 1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam);\r\n\t\t\t\t}\r\n\t\t\t\tgoto LABEL_25;\r\n\t\t\t}\r\n\t\t\tTitle_KillTimerAndFree(hWnd);\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\t\tgoto LABEL_25;\r\n\t}\r\n\tif (uMsg != 275) {\r\n\t\tif (uMsg != 513 && uMsg != 516) {\r\n\t\t\tif (uMsg == 528) {\r\n\t\t\t\tif ((WORD)wParam == 513 || (WORD)wParam == 516)\r\n\t\t\t\t\tTitle_KillAndFadeDlg(hWnd);\r\n\t\t\t} else if (uMsg == 2024) {\r\n\t\t\t\tif (!Fade_CheckRange5())\r\n\t\t\t\t\tFade_SetFadeTimer((int)hWnd);\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\treturn (LRESULT)SDlgDefDialogProc(hWnd, uMsg, (HDC)wParam, (HWND)lParam);\r\n\t\t}\r\n\tLABEL_25:\r\n\t\tTitle_KillAndFadeDlg(hWnd);\r\n\t\treturn 0;\r\n\t}\r\n\tif (wParam == 1)\r\n\t\tgoto LABEL_25;\r\n\treturn 0;\r\n}\r\n// 1001037C: using guessed type int __stdcall SDlgDefDialogProc(DWORD, DWORD, DWORD, DWORD);\r\n// 10010382: using guessed type DWORD __stdcall SDrawGetFrameWindow();\r\n\r\n// ref: 0x10010235\r\nvoid __fastcall Title_KillTimerAndFree(HWND hWnd)\r\n{\r\n\tvoid **v2; // eax\r\n\r\n\tTitle_KillTitleTimer(hWnd);\r\n\tDoom_DeleteFreeProcs(hWnd, titlemsgtbl);\r\n\tv2 = (void **)GetWindowLongA(hWnd, -21);\r\n\tlocal_FreeMemPtr(v2);\r\n}\r\n\r\n// ref: 0x1001025A\r\nvoid __fastcall Title_LoadAllTitleImgs(HWND hWnd, int time)\r\n{\r\n\tDWORD *v4; // edi\r\n\r\n\tv4 = local_AllocWndLongData();\r\n\tSetWindowLongA(hWnd, -21, (LONG)v4);\r\n\tif (v4) {\r\n\t\tlocal_LoadArtWithPal(hWnd, 0, &nullcharacter, -1, 1, \"ui_art\\\\title.pcx\", (BYTE **)v4, v4 + 1, 0);\r\n\t\tFade_NoInputAndArt(hWnd, 0);\r\n\t}\r\n\tDoom_ParseWndProc3(hWnd, titlemsgtbl, AF_MEDGRAY);\r\n\tTitle_LoadImgSetTimer(hWnd, \"ui_art\\\\logo.pcx\");\r\n\tif (time)\r\n\t\tSDlgSetTimer((int)hWnd, 1, 1000 * time, 0);\r\n\telse\r\n\t\tSDlgSetTimer((int)hWnd, 1, 5000, 0);\r\n}\r\n\r\n// ref: 0x100102D7\r\nvoid __fastcall Title_KillAndFadeDlg(HWND hWnd)\r\n{\r\n\tFade_Range5SetZero();\r\n\tSDlgKillTimer((int)hWnd, 1);\r\n\tFade_UpdatePaletteRange(10);\r\n\tSDlgEndDialog(hWnd, (void *)HANDLE_FLAG_INHERIT);\r\n}\r\n"
  },
  {
    "path": "DiabloUI/titlesnd.cpp",
    "content": "// ref: 0x10010306\r\nvoid __fastcall TitleSnd_SetSoundFunction(void(__stdcall *func)(const char *file))\r\n{\r\n\tgfnSoundFunction = func;\r\n}\r\n\r\n// ref: 0x1001030D\r\nvoid __cdecl TitleSnd_InitSoundFunc()\r\n{\r\n\tgfnSoundFunction = 0;\r\n}\r\n\r\n// ref: 0x10010315\r\nvoid __cdecl TitleSnd_PlayMoveSound()\r\n{\r\n\tif (gfnSoundFunction)\r\n\t\tgfnSoundFunction(\"sfx\\\\items\\\\titlemov.wav\");\r\n}\r\n\r\n// ref: 0x1001031F\r\nvoid __cdecl TitleSnd_PlaySelectSound()\r\n{\r\n\tif (gfnSoundFunction)\r\n\t\tgfnSoundFunction(\"sfx\\\\items\\\\titlslct.wav\");\r\n}\r\n\r\n// ref: 0x1001032E\r\nvoid __cdecl TitleSnd_cpp_init()\r\n{\r\n\ttitlesnd_cpp_float = titlesnd_cpp_float_value;\r\n}\r\n// 1001F480: using guessed type int titlesnd_cpp_float_value;\r\n// 1002A590: using guessed type int titlesnd_cpp_float;\r\n"
  },
  {
    "path": "Hellfire.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"Hellfire\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 5.00\n# ** DO NOT EDIT **\n\n# TARGTYPE \"Win32 (x86) Application\" 0x0101\n\nCFG=Hellfire - Win32 Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE \n!MESSAGE NMAKE /f \"Hellfire.mak\".\n!MESSAGE \n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE \n!MESSAGE NMAKE /f \"Hellfire.mak\" CFG=\"Hellfire - Win32 Debug\"\n!MESSAGE \n!MESSAGE Possible choices for configuration are:\n!MESSAGE \n!MESSAGE \"Hellfire - Win32 Release\" (based on \"Win32 (x86) Application\")\n!MESSAGE \"Hellfire - Win32 Debug\" (based on \"Win32 (x86) Application\")\n!MESSAGE \"Hellfire - Win32 Release with PDB\" (based on\\\n \"Win32 (x86) Application\")\n!MESSAGE \n\n# Begin Project\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nMTL=midl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"Hellfire - Win32 Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Source/WinRel\"\n# PROP BASE Intermediate_Dir \"Source/WinRel\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"bld/WinRel\"\n# PROP Intermediate_Dir \"Source/WinRel\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\n# ADD CPP /nologo /Gr /MT /W3 /GX /O1 /D \"NDEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /D \"HELLFIRE\" /YX /FD /c\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /o /win32 \"NUL\"\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /o /win32 \"NUL\"\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /machine:I386\n\n!ELSEIF  \"$(CFG)\" == \"Hellfire - Win32 Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Hellfire__\"\n# PROP BASE Intermediate_Dir \"Hellfire__\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"bld/WinDebug\"\n# PROP Intermediate_Dir \"Source/WinDebug\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_WINDOWS\" /YX /FD /c\n# ADD CPP /nologo /Gr /MTd /W3 /Gm /GX /Zi /O1 /D \"_DEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /D \"HELLFIRE\" /YX /FD /c\n# ADD BASE MTL /nologo /D \"_DEBUG\" /mktyplib203 /o /win32 \"NUL\"\n# ADD MTL /nologo /D \"_DEBUG\" /mktyplib203 /o /win32 \"NUL\"\n# ADD BASE RSC /l 0x409 /d \"_DEBUG\"\n# ADD RSC /l 0x409 /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /debug /machine:I386\n\n!ELSEIF  \"$(CFG)\" == \"Hellfire - Win32 Release with PDB\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"Hellfire___Win32_Release_with_PDB\"\n# PROP BASE Intermediate_Dir \"Hellfire___Win32_Release_with_PDB\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"bld/WinRel\"\n# PROP Intermediate_Dir \"Source/WinRel\"\n# PROP Ignore_Export_Lib 0\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /MT /W3 /GX /O1 /D \"WIN32\" /D \"NDEBUG\" /D \"_WINDOWS\" /YX /FD /c\n# SUBTRACT BASE CPP /WX\n# ADD CPP /nologo /Gr /MT /W3 /GX /Zi /O1 /D \"NDEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /D \"HELLFIRE\" /FAs /YX /FD /c\n# SUBTRACT CPP /WX\n# ADD BASE MTL /nologo /D \"NDEBUG\" /mktyplib203 /o /win32 \"NUL\"\n# ADD MTL /nologo /D \"NDEBUG\" /mktyplib203 /o /win32 \"NUL\"\n# ADD BASE RSC /l 0x409 /d \"NDEBUG\"\n# ADD RSC /l 0x409 /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib /nologo /subsystem:windows /machine:I386\n# ADD LINK32 DiabloUI/WinRel/diabloui.lib 3rdParty/Storm/Source/WinRel/storm.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib 3rdParty/PKWare/WinRel/pkware.lib /nologo /subsystem:windows /debug /machine:I386\n\n!ENDIF \n\n# Begin Target\n\n# Name \"Hellfire - Win32 Release\"\n# Name \"Hellfire - Win32 Debug\"\n# Name \"Hellfire - Win32 Release with PDB\"\n# Begin Group \"Source Files\"\n\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\n# Begin Source File\n\nSOURCE=.\\Source\\appfat.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\automap.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\capture.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\codec.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\control.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\cursor.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\dead.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\debug.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\diablo.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\doom.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l1.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l2.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l3.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l4.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\dthread.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\dx.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\effects.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\encrypt.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\engine.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\error.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\fault.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\gamemenu.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\gendung.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\gmenu.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\help.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\init.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\interfac.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\inv.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\itemdat.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\items.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\lighting.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\loadsave.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\logging.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\mainmenu.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\minitext.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\misdat.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\missiles.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\monstdat.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\monster.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\movie.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\mpqapi.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\msg.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\msgcmd.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\multi.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\nthread.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\objdat.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\objects.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\pack.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\palette.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\path.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\pfile.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\player.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\plrmsg.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\portal.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\quests.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\render.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\restrict.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\scrollrt.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\setmaps.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\sha.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\sound.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\spelldat.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\spells.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\stores.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\sync.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\textdat.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\themes.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\tmsg.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\town.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\towners.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\track.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\trigs.cpp\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\wave.cpp\n# End Source File\n# End Group\n# Begin Group \"Resource Files\"\n\n# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\n# Begin Source File\n\nSOURCE=.\\Hellfire.ico\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Hellfire.rc\n# End Source File\n# End Group\n# Begin Group \"Header Files\"\n\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\n# Begin Source File\n\nSOURCE=.\\Source\\appfat.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\automap.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\capture.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\codec.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\control.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\cursor.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\dead.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\debug.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\defs.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\diablo.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\doom.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l1.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l2.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l3.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\drlg_l4.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\dthread.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\dx.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\effects.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\encrypt.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\engine.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\enums.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\error.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\fault.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\gamemenu.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\gendung.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\gmenu.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\help.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\init.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\interfac.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\inv.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\items.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\lighting.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\loadsave.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\logging.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\mainmenu.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\minitext.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\missiles.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\monster.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\movie.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\mpqapi.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\msg.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\msgcmd.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\multi.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\nthread.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\objects.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\pack.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\palette.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\path.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\pfile.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\player.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\plrmsg.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\portal.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\quests.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\render.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\resource.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\restrict.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\scrollrt.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\setmaps.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\sha.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\sound.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\spells.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\stores.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\structs.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\sync.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\textdat.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\themes.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\tmsg.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\town.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\towners.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\track.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\trigs.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\types.h\n# End Source File\n# Begin Source File\n\nSOURCE=.\\Source\\wave.h\n# End Source File\n# End Group\n# End Target\n# End Project\n"
  },
  {
    "path": "Hellfire.dsw",
    "content": "Microsoft Developer Studio Workspace File, Format Version 5.00\n# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n\n###############################################################################\n\nProject: \"Hellfire\"=\".\\Hellfire.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n    Begin Project Dependency\n    Project_Dep_Name DiabloUI\n    End Project Dependency\n    Begin Project Dependency\n    Project_Dep_Name Storm\n    End Project Dependency\n    Begin Project Dependency\n    Project_Dep_Name Pkware\n    End Project Dependency\n}}}\n\n###############################################################################\n\nProject: \"DiabloUI\"=\".\\DiabloUI\\DiabloUI.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n    Begin Project Dependency\n    Project_Dep_Name Storm\n    End Project Dependency\n}}}\n\n###############################################################################\n\nProject: \"Pkware\"=\".\\3rdParty\\PKWare\\Pkware.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n}}}\n\n###############################################################################\n\nProject: \"Storm\"=\".\\3rdParty\\Storm\\Source\\Storm.dsp\" - Package Owner=<4>\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<4>\n{{{\n}}}\n\n###############################################################################\n\nGlobal:\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<3>\n{{{\n}}}\n\n###############################################################################\n\n"
  },
  {
    "path": "Hellfire.rc",
    "content": "//Microsoft Developer Studio generated resource script.\n//\n#include \"resource.h\"\n\n#define APSTUDIO_READONLY_SYMBOLS\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 2 resource.\n//\n#include \"afxres.h\"\n\n/////////////////////////////////////////////////////////////////////////////\n#undef APSTUDIO_READONLY_SYMBOLS\n\n/////////////////////////////////////////////////////////////////////////////\n// English (U.S.) resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\n#ifdef _WIN32\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n#pragma code_page(1252)\n#endif //_WIN32\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Icon\n//\n\n// Icon with lowest ID value placed first to ensure application icon\n// remains consistent on all systems.\nIDI_ICON1               ICON    DISCARDABLE     \"Hellfire.ico\"\n\n#ifdef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// TEXTINCLUDE\n//\n\n1 TEXTINCLUDE DISCARDABLE \nBEGIN\n    \"resource.h\\0\"\nEND\n\n2 TEXTINCLUDE DISCARDABLE \nBEGIN\n    \"#include \"\"afxres.h\"\"\\r\\n\"\n    \"\\0\"\nEND\n\n3 TEXTINCLUDE DISCARDABLE \nBEGIN\n    \"\\r\\n\"\n    \"\\0\"\nEND\n\n#endif    // APSTUDIO_INVOKED\n\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Dialog\n//\n\nIDD_DIALOG1 DIALOG DISCARDABLE  0, 0, 250, 241\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Direct Draw Error\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,193,220,50,14\n    LTEXT           \"Hellfire was unable to properly initialize your video card using DirectX.  Please try the following solutions to correct the problem:\",\n                    -1,7,7,236,18\n    LTEXT           \"Use the Diablo setup program \"\"SETUP.EXE\"\" provided on the Diablo CD-ROM to install DirectX 3.0.\",\n                    -1,19,26,210,18\n    LTEXT           \"Install the most recent DirectX video drivers provided by the manufacturer of your video card.  A list of video card manufactuers can be found at: http://www.sierracom\",\n                    -1,19,48,210,27\n    LTEXT           \"The error encountered while trying to initialize the video card was:\",\n                    -1,7,175,236,9\n    LTEXT           \"unknown error\",1000,19,186,210,27\n    LTEXT           \"If you continue to have problems, we have also included Microsoft DirectX 2.0 drivers on the Diablo CD-ROM.  This older version of DirectX may work in cases where DirectX 3.0 does not.\",\n                    -1,7,79,236,27\n    LTEXT           \"USA telephone: 1-800-426-9400\\nInternational telephone: 206-882-8080\\nhttp://www.microsoft.com\",\n                    -1,19,137,210,27\n    LTEXT           \"If you continue to have problems with DirectX, please contact Microsoft's Technical Support at:\",\n                    -1,7,116,236,18\nEND\n\nIDD_DIALOG2 DIALOG DISCARDABLE  0, 0, 250, 213\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Out of Memory Error\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,193,192,50,14\n    LTEXT           \"Hellfire has exhausted all the memory on your system.  This problem can likely be corrected by changing the virtual memory settings for Windows.  Ensure that your system has at least 10 megabytes of free disk space, then check your virtual memory settings:\",\n                    -1,7,7,236,36\n    LTEXT           \"Select \"\"Settings - Control Panel\"\" from the \"\"Start\"\" menu\\nRun the \"\"System\"\" control panel applet\\nSelect the \"\"Performance\"\" tab, and press \"\"Virtual Memory\"\"\\nUse the \"\"Let Windows manage my virtual memory...\"\" option\",\n                    -1,23,54,197,36\n    LTEXT           \"The error encountered was:\",-1,7,146,236,11\n    LTEXT           \"unknown location\",1000,20,157,210,27\n    LTEXT           \"For Windows 95:\",-1,7,45,236,9\n    LTEXT           \"Select \"\"Settings - Control Panel\"\" from the \"\"Start\"\" menu\\nRun the \"\"System\"\" control panel applet\\nSelect the \"\"Performance\"\" tab\\nPress \"\"Change\"\" in \"\"Virtual Memory\"\" settings\\nEnsure that the virtual memory file is at least 32 megabytes\",\n                    -1,17,98,197,45\n    LTEXT           \"For Windows NT:\",-1,7,89,236,9\nEND\n\nIDD_DIALOG3 DIALOG DISCARDABLE  0, 0, 265, 114\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Data File Error\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,208,93,50,14\n    LTEXT           \"Hellfire was unable to open a required file.  Please ensure that the Diablo disc is in the CDROM drive.  If this problem persists, try uninstalling and reinstalling Hellfire using the program \"\"SETUP.EXE\"\" on the Hellfire CD-ROM.\",\n                    -1,7,7,251,36\n    LTEXT           \"The problem occurred while trying to load a file\",-1,7,\n                    48,232,9\n    LTEXT           \"unknown file\",1000,20,59,210,27\nEND\n\nIDD_DIALOG4 DIALOG DISCARDABLE  0, 0, 250, 161\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Direct Draw Error\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,193,140,50,14\n    LTEXT           \"Hellfire was unable to find the file \"\"ddraw.dll\"\", which is a component of Microsoft DirectX.  Please run the program \"\"SETUP.EXE\"\" on the Diablo CD-ROM and install Microsoft DirectX.\",\n                    -1,7,7,236,27\n    LTEXT           \"The error encountered while trying to initialize DirectX was:\",\n                    -1,7,95,236,9\n    LTEXT           \"unknown error\",1000,19,106,210,29\n    LTEXT           \"USA telephone: 1-800-426-9400\\nInternational telephone: 206-882-8080\\nhttp://www.microsoft.com\",\n                    -1,19,60,210,27\n    LTEXT           \"If you continue to have problems with DirectX, please contact Microsoft's Technical Support at:\",\n                    -1,7,39,236,18\nEND\n\nIDD_DIALOG5 DIALOG DISCARDABLE  0, 0, 250, 161\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Direct Sound Error\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,193,140,50,14\n    LTEXT           \"Hellfire was unable to find the file \"\"dsound.dll\"\", which is a component of Microsoft DirectX.  Please run the program \"\"SETUP.EXE\"\" on the Diablo CD-ROM and install Microsoft DirectX.\",\n                    -1,7,7,236,27\n    LTEXT           \"The error encountered while trying to initialize DirectX was:\",\n                    -1,7,95,236,9\n    LTEXT           \"unknown error\",1000,19,106,210,27\n    LTEXT           \"USA telephone: 1-800-426-9400\\nInternational telephone: 206-882-8080\\nhttp://www.microsoft.com\",\n                    -1,19,60,210,27\n    LTEXT           \"If you continue to have problems with DirectX, please contact Microsoft's Technical Support at:\",\n                    -1,7,39,236,18\nEND\n\n/* IDD_DIALOG6 DIALOG DISCARDABLE  0, 0, 250, 92\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"System warning\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"&OK\",1,130,71,50,14\n    LTEXT           \"Diablo requires an Intel Pentium-class processor to run properly.  Your system does not appear to have a Pentium-class processor installed.\",\n                    -1,7,7,236,18\n    LTEXT           \"You may still be able to play Diablo if your processor has the performance characteristics of a Pentium.\",\n                    -1,7,30,236,18\n    LTEXT           \"Press \"\"OK\"\" to proceed, otherwise press \"\"Cancel\"\" to exit this program.\",\n                    -1,7,53,236,9\n    PUSHBUTTON      \"&Cancel\",2,193,71,50,14\nEND */\n\nIDD_DIALOG7 DIALOG DISCARDABLE  0, 0, 250, 100\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Out of Disk Space\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,193,79,50,14\n    LTEXT           \"Hellfire requires at least 10 megabytes of free disk space to run properly.  The disk:\",\n                    -1,7,7,236,18\n    LTEXT           \"\",-1,7,43,232,9\n    LTEXT           \"unknown drive\",1000,7,33,210,9\n    LTEXT           \"has less than 10 megabytes of free space left.  Please free some space on your drive and run Hellfire again.\",\n                    -1,7,52,236,18\nEND\n\nIDD_DIALOG8 DIALOG DISCARDABLE  0, 0, 250, 161\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Direct Draw Error\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,193,140,50,14\n    LTEXT           \"Hellfire was unable to switch video modes.  This is a common problem for computers with more than one video card.  To correct this problem, please set your video resolution to 640 x 480 and try running Hellfire again.\",\n                    -1,7,7,236,27\n    LTEXT           \"The error encountered while trying to switch video modes was:\",\n                    -1,7,95,236,9\n    LTEXT           \"unknown error\",1000,19,106,210,27\n    LTEXT           \"Select \"\"Settings - Control Panel\"\" from the \"\"Start\"\" menu\\nRun the \"\"Display\"\" control panel applet\\nSelect the \"\"Settings\"\" tab\\nSet the \"\"Desktop Area\"\" to \"\"640 x 480 pixels\"\"\",\n                    -1,23,50,197,36\n    LTEXT           \"For Windows 95 and Windows NT\",-1,7,41,236,9\nEND\n\nIDD_DIALOG9 DIALOG DISCARDABLE  0, 0, 250, 92\nSTYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU\nCAPTION \"Data File Error\"\nFONT 8, \"MS Sans Serif\"\nBEGIN\n    DEFPUSHBUTTON   \"OK\",1,136,71,50,14\n    LTEXT           \"Hellfire cannot read a required data file.  Your Diablo CD may not be in the CDROM drive.  Please ensure that the Diablo disc is in the CDROM drive and press OK.  To leave the program, press Exit.\",\n                    -1,7,7,236,27\n    LTEXT           \"unknown file\",1000,20,37,210,27\n    PUSHBUTTON      \"Exit\",2,193,71,50,14\nEND\n\n\n#ifndef _MAC\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION 1,0,0,0\n PRODUCTVERSION 97,5,23,1\n FILEFLAGSMASK 0x3fL\n#ifdef _DEBUG\n FILEFLAGS 0x1L\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS 0x4L\n FILETYPE 0x1L\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904b0\"\n        BEGIN\n            VALUE \"CompanyName\", \"Synergistic Software\\0\"\n            VALUE \"FileDescription\", \"Hellfire\\0\"\n            VALUE \"FileVersion\", \"1, 0, 1, 0\\0\"\n            VALUE \"InternalName\", \"Hellfire\\0\"\n            VALUE \"LegalCopyright\", \"Copyright  1997\\0\"\n            VALUE \"OriginalFilename\", \"hellfire.exe\\0\"\n            VALUE \"ProductName\", \"Synergistic Software Hellfire\\0\"\n            VALUE \"ProductVersion\", \"98, 1, 13, 1\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x409, 1200\n    END\nEND\n\n#endif    // !_MAC\n\n#endif    // English (U.S.) resources\n/////////////////////////////////////////////////////////////////////////////\n\n\n\n#ifndef APSTUDIO_INVOKED\n/////////////////////////////////////////////////////////////////////////////\n//\n// Generated from the TEXTINCLUDE 3 resource.\n//\n\n\n/////////////////////////////////////////////////////////////////////////////\n#endif    // not APSTUDIO_INVOKED\n\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# Sustainable Use License\n\nVersion 1.0\n\n## Acceptance\n\nBy using the software, you agree to all of the terms and conditions below.\n\n## Copyright License\n\nThe licensor grants you a non-exclusive, royalty-free, worldwide, non-sublicensable, non-transferable license to use, copy, distribute, make available, and prepare derivative works of the software, in each case subject to the limitations below.\n\n## Limitations\n\nYou may use or modify the software only for your own internal business purposes or for non-commercial or personal use.\nYou may distribute the software or provide it to others only if you do so free of charge for non-commercial purposes.\nYou may not alter, remove, or obscure any licensing, copyright, or other notices of the licensor in the software. Any use of the licensor’s trademarks is subject to applicable law.\n\n## Patents\n\nThe licensor grants you a license, under any patent claims the licensor can license, or becomes able to license, to make, have made, use, sell, offer for sale, import and have imported the software, in each case subject to the limitations and conditions in this license. This license does not cover any patent claims that you cause to be infringed by modifications or additions to the software. If you or your company make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.\n\n## Notices\n\nYou must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms.\nIf you modify the software, you must include in any modified copies of the software a prominent notice stating that you have modified the software.\n\n## No Other Rights\n\nThese terms do not imply any licenses other than those expressly granted in these terms.\n\n## Termination\n\nIf you use the software in violation of these terms, such use is not licensed, and your license will automatically terminate. If the licensor provides you with a notice of your violation, and you cease all violation of this license no later than 30 days after you receive that notice, your license will be reinstated retroactively. However, if you violate these terms after such reinstatement, any additional violation of these terms will cause your license to terminate automatically and permanently.\n\n## No Liability\n\nAs far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.\n\n## Definitions\n\nThe “licensor” is the entity offering these terms.\n\nThe “software” is the software the licensor makes available under these terms, including any portion of it.\n\n“You” refers to the individual or entity agreeing to these terms.\n\n“Your company” is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. Control means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.\n\n“Your license” is the license granted to you for the software under these terms.\n\n“Use” means anything you do with the software requiring your license.\n\n“Trademark” means trademarks, service marks, and similar rights.\n"
  },
  {
    "path": "Makefile",
    "content": "# mingw32 and mingw64 have different executables\r\nifdef MINGW32\r\n\tCXX=mingw32-g++\r\n\tDLLTOOL=dlltool\r\n\tWINDRES=windres\r\nelse\r\n\tCXX=i686-w64-mingw32-g++\r\n\tDLLTOOL=i686-w64-mingw32-dlltool\r\n\tWINDRES=i686-w64-mingw32-windres\r\nendif\r\n\r\n# Clang doesn't understand permissive compilation, we need to \"fix\" invalid\r\n# casts from a pointer type there using\r\n#     static_cast<NEW_TYPE>(reinterpret_cast<uintptr_t>(ptr))\r\n# instead of\r\n#     (NEW_TYPE)(ptr)\r\nCXXFLAGS=-fpermissive\r\nCPPFLAGS=-MMD -MF $*.d\r\nLDLIBS=-lgdi32 -lversion -ldiabloui -lstorm\r\nLDFLAGS=-L./ -static-libgcc -mwindows\r\n\r\nall: devilution.exe\r\n\r\ndebug: CXXFLAGS += -D_DEBUG\r\ndebug: CPPFLAGS += -D_DEBUG\r\ndebug: devilution.exe\r\n\r\nDIABLO_SRC=$(sort $(filter-out Source/_asm.cpp Source/_render.cpp, $(wildcard Source/*.cpp)))\r\nOBJS=$(DIABLO_SRC:.cpp=.o)\r\n\r\nPKWARE_SRC=$(wildcard 3rdParty/PKWare/*.cpp)\r\nPKWARE_OBJS=$(PKWARE_SRC:.cpp=.o)\r\n\r\ndevilution.exe: $(OBJS) $(PKWARE_OBJS) diabres.o diabloui.lib storm.lib\r\n\t$(CXX) $(LDFLAGS) -o $@ $^ $(LDLIBS)\r\n\r\ndiabres.o: Diablo.rc\r\n\t$(WINDRES) $< $@\r\n\r\ndiabloui.lib: diabloui.dll DiabloUI/diabloui_gcc.def\r\n\t$(DLLTOOL) -d DiabloUI/diabloui_gcc.def -D $< -l $@\r\n\r\ndiabloui.dll:\r\n#\t$(error Please copy diabloui.dll (version 1.09[b]) here)\r\n\r\nstorm.lib: storm.dll 3rdParty/Storm/Source/storm_gcc.def\r\n\t$(DLLTOOL) -d 3rdParty/Storm/Source/storm_gcc.def -D $< -l $@\r\n\r\nstorm.dll:\r\n#\t$(error Please copy storm.dll (version 1.09[b]) here)\r\n\r\nclean:\r\n\t@$(RM) -v $(OBJS) $(OBJS:.o=.d) $(PKWARE_OBJS) $(PKWARE_OBJS:.o=d) diabres.o storm.lib diabloui.lib devilution.exe\r\n\r\n.PHONY: clean all\r\n"
  },
  {
    "path": "MakefileVC",
    "content": "# The $(VC5_DIR)/.. and $(VS6_DIR) directories are copies \"Microsoft Visual Studio\".\r\n#\r\n# To get a working setup on Linux or other \"portable\" copies of VS,\r\n# the following DLLs have to be copied to the\r\n# $(VS6_DIR)/VC98/Bin directory.\r\n#\r\n#     - $(VS6_DIR)/Common/MSDev98/Bin/MSPDB60.DLL\r\n#\r\n# And to the $(VC5_DIR)/bin directory.\r\n#\r\n#     - $(VC5_DIR)/SharedIDE/bin/MSDIS100.DLL\r\n#     - $(VC5_DIR)/SharedIDE/bin/MSPDB50.DLL\r\nVS6_DIR ?= $(HOME)/VS6\r\n\r\nVC6_DIR     = $(VS6_DIR)/VC98\r\n\r\nVC6_BIN_DIR = $(VC6_DIR)/Bin\r\nVC6_INC_DIR = $(VC6_DIR)/Include\r\nVC6_LIB_DIR = $(VC6_DIR)/Lib\r\n\r\nVC5_DIR ?= $(HOME)/DevStudio_5.10/VC\r\n\r\nVC5_BIN_DIR = $(VC5_DIR)/bin\r\nVC5_INC_DIR = $(VC5_DIR)/include\r\nVC5_LIB_DIR = $(VC5_DIR)/lib\r\n\r\nIDE_DIR ?= $(VS6_DIR)/Common/MSDev98\r\nIDE_BIN_DIR = $(IDE_DIR)/bin\r\nifeq ($(OS),Windows_NT)\r\n\tCL5 = $(VC5_BIN_DIR)/CL.EXE\r\n\tCL6 = $(VC6_BIN_DIR)/CL.EXE\r\n\tRC = $(IDE_BIN_DIR)/RC.EXE\r\n\tVC5_LINK = $(VC5_BIN_DIR)/link.exe\r\n\tVC6_LINK = $(VC6_BIN_DIR)/link.exe\r\nelse\r\n\tCL5 = wine $(VC5_BIN_DIR)/CL.EXE\r\n\tCL6 = wine $(VC6_BIN_DIR)/CL.EXE\r\n\tRC = wine $(IDE_BIN_DIR)/RC.EXE\r\n\tVC5_LINK = wine $(VC5_BIN_DIR)/link.exe\r\n\tVC6_LINK = wine $(VC6_BIN_DIR)/link.exe\r\nendif\r\n\r\nifeq ($(HELLFIRE),1)\r\n\tCL = $(CL5)\r\n\tVC_INC_DIR = $(VC5_INC_DIR)\r\nelse\r\n\tCL = $(CL6)\r\n\tVC_INC_DIR = $(VC6_INC_DIR)\r\nendif\r\n\r\nCFLAGS=/nologo /c /GX /W3 /O1 /I $(VC_INC_DIR) /FD /Gr /MT /D \"NDEBUG\" /D \"WIN32\" /D \"_WINDOWS\" /Fp\"Diablo.pch\" /YX /G5 /Zi /FAs\r\nLINKFLAGS=/nologo /subsystem:windows /machine:I386 /incremental:no\r\n\r\nVERSION := 109\r\n\r\nCFLAGS += /D \"VERSION=$(VERSION)\"\r\n\r\nifeq ($(HELLFIRE),1)\r\n\tCFLAGS += /D \"HELLFIRE\"\r\nendif\r\n\r\nifeq ($(SPAWN),1)\r\n\tCFLAGS += /D \"SPAWN\"\r\nendif\r\n\r\nifeq ($(MAKE_BUILD),pdb)\r\nifeq ($(HELLFIRE),1)\r\n\tVC_LINK = $(VC5_LINK)\r\n\tLINKFLAGS += /pdb:\"hellfire.pdb\" /LIBPATH:$(VC5_LIB_DIR) /debug\r\nelse\r\n\tVC_LINK = $(VC6_LINK)\r\n\tLINKFLAGS += /pdb:\"Diablo.pdb\" /LIBPATH:$(VC6_LIB_DIR) /debug\r\nendif\r\nelse\r\n\tVC_LINK = $(VC5_LINK)\r\n\tLINKFLAGS += /LIBPATH:$(VC5_LIB_DIR)\r\nendif\r\n\r\nall: Diablo.exe\r\n\r\ndebug: CFLAGS += /D \"_DEBUG\"\r\ndebug: Diablo.exe\r\n\r\n# fix compilation order to match the VC6 workspace files and exclude local assembly functions\r\nDIABLO_SRC=$(sort $(filter-out Source/_asm.cpp Source/_render.cpp Source/render.cpp, $(wildcard Source/*.cpp)))\r\nDIABLO_SRC += Source/render.cpp\r\nOBJS=$(DIABLO_SRC:.cpp=.obj)\r\n\r\nDiablo.exe: main_files diablo.res DiabloUI/diabloui.lib 3rdParty/Storm/storm.lib 3rdParty/PKWare/pkware.lib\r\n\t$(VC_LINK) /OUT:$@ $(LINKFLAGS) $(OBJS) diablo.res DiabloUI/diabloui.lib 3rdParty/Storm/storm.lib kernel32.lib user32.lib gdi32.lib advapi32.lib shell32.lib version.lib 3rdParty/PKWare/pkware.lib\r\n\r\nDiabloUI/diabloui.lib:\r\n\tmake -C DiabloUI\r\n\r\n3rdParty/Storm/storm.lib:\r\n\tmake -C 3rdParty/Storm\r\n\r\n3rdParty/PKWare/pkware.lib:\r\n\tmake -C 3rdParty/PKWare\r\n\r\n# compiles all main source files with once compiler call\r\nmain_files:\r\n\t$(CL) $(CFLAGS) /FoSource/ $(DIABLO_SRC)\r\n\r\n%.obj: %.cpp\r\n\t$(CL) $(CFLAGS) /Fo$@ $<\r\n\r\ndiablo.res: Diablo.rc\r\n\t$(RC) /i $(VC_INC_DIR) /l 0x409 /fo $@ $<\r\n\r\nclean:\r\n\t@$(RM) -v $(OBJS) vc60.idb vc60.pdb Diablo.pdb Diablo.pch vc50.idb vc50.pdb hellfire.pdb\r\n\tmake -C DiabloUI clean\r\n\tmake -C 3rdParty/Storm clean\r\n\tmake -C 3rdParty/PKWare clean\r\n\r\n.PHONY: clean all\r\n"
  },
  {
    "path": "README.md",
    "content": "[![Build Status](https://circleci.com/gh/diasurgical/devilution.svg?style=svg)](https://circleci.com/gh/diasurgical/devilution)\n[![Build Status](https://www.travis-ci.com/diasurgical/devilution.svg?branch=master)](https://www.travis-ci.com/diasurgical/devilution)\n[![Build status](https://ci.appveyor.com/api/projects/status/ce9wnf46gqqk6prp?svg=true)](https://ci.appveyor.com/project/AJenbo/devilution)\n[![Downloads](https://img.shields.io/github/downloads/diasurgical/devilution/total.svg)](https://github.com/diasurgical/devilution/releases)\n[![github stars](https://img.shields.io/github/stars/diasurgical/devilution.svg)](https://github.com/diasurgical/devilution/stargazers)\n\n![Discord Channel](https://avatars3.githubusercontent.com/u/1965106?s=16&v=4) [Discord Chat Channel](https://discord.gg/YQKCAYQ)\n\n# Devilution\nDiablo devolved - magic behind the 1996 computer game\n\n**Note**, Devilution requires an original copy of `diabdat.mpq`. None of the Diablo 1 game assets are provided by this project. To get a legitimate copy of the game assets, please refer to the [GoG release of Diablo 1](https://www.gog.com/game/diablo).\n\n# Introduction\nWhile most titles from Blizzard receive years of love and support, Diablo stayed in the shadows. Abandoned in favor of a sequel, it remained full of bugs and unfinished potential. The game was last patched in 2001 before being discontinued altogether, a problem I wanted to fix. I played Diablo extensively as a teenager, but as time passed it became difficult to run the game on newer hardware. The lack of many improvements made in Diablo II also laid it to rest. At first the game appeared to be a lost cause, but thankfully a little oversight in 1997 made it not so.\n\nDiablo's development team moved on to Diablo II while passing the source code down to **Synergistic Software** for Hellfire. Less known however is that it was also given to **Climax Studios** to create a PlayStation port. Now Sony has long been known for letting things slide; _especially_ in Japan. Anything from leaking prototypes to entire game source codes and Diablo was no exception. Symbolic information was accidentally left on the Japanese port. Normally used for debugging, a symbol file contains a map of everything generated during compile time. This includes file names, functions, structures, variables, and more! To top it all off a special build is hidden on the PC release in `DIABDAT.MPQ -> D1221A.MPQ -> DIABLO.EXE`! This build contains debug tools and assert strings further giving away code information.\n\nAfter months of piecing these mistakes together, Devilution was born. I present to you a reconstructed form of Diablo's original source code! Once more shall the heroes of Sanctuary return to the depths below!\n\n# Purpose\nHaving the source code makes Diablo much easier to update and maintain. For years mod-makers had to rely on tedious code editing and memory injection. A few even went further and reversed most or all of the game. The problem is that they rarely shared their work. Usually being a one-person job, they move on with their lives due to the amount of time required or lack of interest. This brings us back to square one having to do countless hours of work all over again. Devilution aims to fix this by finally making the source code open to the community.\n\nIn order to ensure that everything is preserved, Devilution keeps everything as it was originally designed. This goes as far as bugs and badly written code in the original game. With that it serves as a base for developers to work with making it much easier than before to update, fix, and port the game to other platforms.\n\nAs a side goal Devilution tries to document the unused and cut content from the final game. Development of Diablo was rushed near the end--many ideas were scrapped and multiplayer was quickly hacked in. By examining the source, we can see various quirks of planned development.\n\n# Compiling\nDiablo was developed on Windows 95 using Visual C++ 4.20 and later 5.10 and 6 for newer patches. Devilution aims to be compatible with both the original and modern tools, but will adhere to standards used for the original compiler.\n\n### Building with Visual C++ 6\n- Open the project workspace `Diablo.dsw`, choose `Debug` or `Release`, and then `Build Diablo.exe`.\n\nTo build a binary with functions compiled as close as possible to the original, use Visual C++ 6 with Service Pack 5 and the [Processor Pack](https://download.microsoft.com/download/vb60ent/update/6/w9x2kxp/en-us/vcpp5.exe) (**important for proper code generation!**) You will also need [Visual C++ 5](https://winworldpc.com/product/visual-c/5x) with [Service Pack 3](http://www.mediafire.com/file/jw4j4sd5dnzze4p/VS97SP3.zip), since the original binary was linked with the older linker from that. Sadly, you cannot use the old linker right out of VC6, so you'll need to link manually or via the `MakefileVC` in the project root.\n\n### Building with Visual Studio 2010-2017\n- Open the project solution `Diablo.sln`, choose `Debug` or `Release`, and then `Build Solution`.\n\nMake sure to disable Data Execution Prevention. `Storm.dll` uses dynamic compilation to improve rendering performance but fails to mark the resulting memory page as executable, leading to a protection fault when trying to draw.\n- Configuration options -> Linker -> Advanced -> Data Execution Prevention (DEP).\n- Set this value to: No (/NXCOMPAT: NO).\n\nYou will also need the following dependencies installed if you are using Visual Studio 2017.\nMake sure to enable these when installing (or modify your installation):\n- Requires \"Windows 8.1 SDK\" (Target Platform)\n- Requires \"Visual C++ MFC for x86 and x64\" (For afxres.h)\n- Requires \"Windows Universal CRT SDK\" (For ctype.h)\n\n### Building with MinGW\n- Execute `make MINGW32=1` for **MinGW32** or `make` for **MinGW64**. Optionally add `debug` to build with debug features.\n\nTo compile with MinGW64 on different platforms, refer to the respective documentation: [Linux](docs/INSTALL_linux.md) | [Windows](docs/INSTALL_windows.md) | [Mac](docs/INSTALL_mac.md).\n\n[Debug Build Features](docs/debug.md)\n| [Compatibility Matrix](docs/compatibility_matrix.md)\n| [Troubleshooting](docs/troubleshooting.md)\n\n# Installing\nOnce compiled, the Devilution binary will serve as a replacement for `Diablo.exe`. The following files from the original game patched to 1.09(b) need to be present: `DIABDAT.MPQ`, `DiabloUI.dll`, `SmackW32.dll`, `Standard.snp`, and `Storm.dll`. If `COPYPROT` was defined when compiling, the Diablo CD will also be required.\n\nAdditionally, Strange Bytes' [DirectDraw patch](http://www.strangebytes.com/index.php/projects/1-diablo-1-windows-7-vista-patch) is recommended to help fix compatibility issues and run the game in windowed mode.\n\n# Multiplayer\nDevilution is functional over both GoG's Battle.net server and IPX using an ipx-wrapper. Additionally if `Standard.snp` from StarCraft 1.16.1 is used, local UDP play also becomes available. There are programs like ZeroTier to connect UDP globally.\n\n# Contributing\n[Guidelines](docs/CONTRIBUTING.md)\n\n# Modding\nBelow are a few examples of some simple improvements made to the game. It is planned in the future to create tools for designing dungeons and graphics.\n\n<details><summary>Example 1: Monster lifebar and item highlighting</summary>\n\n![Monster lifebar+items](https://github.com/diasurgical/scalpel/blob/master/screens/mod1.png)\n</details>\n<details><summary>Example 2: New Diablo 2-like trade screen</summary>\n\n![New trade screen](https://github.com/diasurgical/scalpel/blob/master/screens/mod2.png)\n</details>\n\n# F.A.Q.\n<details><summary>Click to reveal</summary>\n\n> Wow, does this mean I can download and play Diablo for free now?\n\nNo, you'll need access to the data from the original game. If you don't have an original CD then you can [buy Diablo from GoG.com](https://www.gog.com/game/diablo). Alternatively you can also use `spawn.mpq` from the [http://ftp.blizzard.com/pub/demos/diablosw.exe](shareware) version and compile the with the SPAWN flag defined.\n> Cool, so I fired your mod up, but there's no 1080p or new features?\n\nDevilution aims to keep the original code unaltered, for documentation purposes.\n> So will you ever add cross-platform support or new features in the future?\n\nYes! This has been done as a side project, please see [DevilutionX](https://github.com/diasurgical/devilutionX).\n> What about Hellfire?\n\nHellfire was a bit of a flop on the developer's part. Support may come in the future once the base game is finished.\n> I think that's about all, but is Devilution even legal?\n\nThat's a tricky question. Under the DMCA, reverse-engineering has exceptions for the purpose of documentation and interoperability. Devilution provides the necessary documentation needed to achieve the latter. However, it falls into an entirely gray area. The real question is whether or not Blizzard deems it necessary to take action.\n</details>\n\n# Credits\n- Reverse engineered by GalaXyHaXz in 2018\n- [sanctuary](https://github.com/sanctuary) - extensively documenting Diablo's game engine\n- [BWAPI Team](https://github.com/bwapi) - providing library API to work with Storm\n- [Ladislav Zezula](https://github.com/ladislav-zezula) - reversing PKWARE library, further documenting Storm\n- [fearedbliss](https://github.com/fearedbliss) - being awe-inspiring\n- Diablodin - providing additional info about the PSX release\n- Climax Studios & Sony - secretly helping with their undercover QA :P\n- Blizzard North - wait, this was a typo!\n- Depression - reason to waste four months of my life doing this ;)\n\nAnd a special thanks to all the support and people who work on this project to make it possible! <3\n\n# Changelog\n[From the beginning until release](docs/CHANGELOG.md)\n\n# Legal\nDevilution is made publicly available and released under the Sustainable Use License (see [LICENSE](LICENSE.md))\n\nThe source code in this repository is for non-commerical use only. If you use the source code you may not charge others for access to it or any derivative work thereof.\n\nBattle.net(R) - Copyright (C) 1996 Blizzard Entertainment, Inc. All rights reserved. Battle.net and Blizzard Entertainment are trademarks or registered trademarks of Blizzard Entertainment, Inc. in the U.S. and/or other countries.\n\nDiablo(R) - Copyright (C) 1996 Blizzard Entertainment, Inc. All rights reserved. Diablo and Blizzard Entertainment are trademarks or registered trademarks of Blizzard Entertainment, Inc. in the U.S. and/or other countries.\n\nDevilution and any of its' maintainers are in no way associated with or endorsed by Blizzard Entertainment(R).\n"
  },
  {
    "path": "Source/.clang-format",
    "content": "BasedOnStyle: webkit\nAlignTrailingComments: true\nAllowShortBlocksOnASingleLine: true\nAllowShortFunctionsOnASingleLine: None\nPointerAlignment: Right\nTabWidth: 4\nUseTab: ForIndentation\nSortIncludes: false\n"
  },
  {
    "path": "Source/_asm.cpp",
    "content": "static __inline void asm_cel_light_edge(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline void asm_cel_light_square(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline void asm_trans_light_cel_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline void asm_trans_light_edge_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline void asm_trans_light_square_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline void asm_trans_light_cel_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline void asm_trans_light_edge_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline void asm_trans_light_square_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src);\nstatic __inline unsigned int asm_trans_light_mask(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src, unsigned int mask);\n\nstatic __inline void asm_cel_light_edge(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tunsigned char l = w >> 1;\n\n\tif (w & 1) {\n\t\t(*dst)[0] = tbl[(*src)[0]];\n\t\t(*src)++;\n\t\t(*dst)++;\n\t}\n\tif (l & 1) {\n\t\t(*dst)[0] = tbl[(*src)[0]];\n\t\t(*dst)[1] = tbl[(*src)[1]];\n\t\t*src += 2;\n\t\t*dst += 2;\n\t}\n\n\tasm_cel_light_square(l >> 1, tbl, dst, src);\n}\n\nstatic __inline void asm_cel_light_square(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tfor (; w; --w) {\n\t\t(*dst)[0] = tbl[(*src)[0]];\n\t\t(*dst)[1] = tbl[(*src)[1]];\n\t\t(*dst)[2] = tbl[(*src)[2]];\n\t\t(*dst)[3] = tbl[(*src)[3]];\n\t\t*src += 4;\n\t\t*dst += 4;\n\t}\n}\n\nstatic __inline void asm_trans_light_cel_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tif (!(w & 1)) {\n\t\tasm_trans_light_edge_1_3(w >> 1, tbl, dst, src);\n\t} else {\n\t\t(*src)++;\n\t\t(*dst)++;\n\t\tasm_trans_light_edge_0_2(w >> 1, tbl, dst, src);\n\t}\n}\n\nstatic __inline void asm_trans_light_edge_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tunsigned char l = w >> 1;\n\n\tif (w & 1) {\n\t\t(*dst)[0] = tbl[(*src)[0]];\n\t\t*src += 2;\n\t\t*dst += 2;\n\t}\n\tif (l) {\n\t\tasm_trans_light_square_0_2(l, tbl, dst, src);\n\t}\n}\n\nstatic __inline void asm_trans_light_square_0_2(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tfor (; w; --w) {\n\t\t(*dst)[0] = tbl[(*src)[0]];\n\t\t(*dst)[2] = tbl[(*src)[2]];\n\t\t*src += 4;\n\t\t*dst += 4;\n\t}\n}\n\nstatic __inline void asm_trans_light_cel_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tif (!(w & 1)) {\n\t\tasm_trans_light_edge_0_2(w >> 1, tbl, dst, src);\n\t} else {\n\t\t(*dst)[0] = tbl[(*src)[0]];\n\t\t(*src)++;\n\t\t(*dst)++;\n\t\tasm_trans_light_edge_1_3(w >> 1, tbl, dst, src);\n\t}\n}\n\nstatic __inline void asm_trans_light_edge_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tunsigned char l = w >> 1;\n\n\tif (w & 1) {\n\t\t(*dst)[1] = tbl[(*src)[1]];\n\t\t*src += 2;\n\t\t*dst += 2;\n\t}\n\tif (l) {\n\t\tasm_trans_light_square_1_3(l, tbl, dst, src);\n\t}\n}\n\nstatic __inline void asm_trans_light_square_1_3(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src)\n{\n\tfor (; w; --w) {\n\t\t(*dst)[1] = tbl[(*src)[1]];\n\t\t(*dst)[3] = tbl[(*src)[3]];\n\t\t*src += 4;\n\t\t*dst += 4;\n\t}\n}\n\nstatic __inline unsigned int asm_trans_light_mask(unsigned char w, BYTE *tbl, BYTE **dst, BYTE **src, unsigned int mask)\n{\n\tfor (; w; --w, (*src)++, (*dst)++, mask *= 2) {\n\t\tif (mask & 0x80000000)\n\t\t\t(*dst)[0] = tbl[(*src)[0]];\n\t}\n\n\treturn mask;\n}\n"
  },
  {
    "path": "Source/_render.cpp",
    "content": "__declspec(naked) void drawTopArchesUpperScreen(BYTE *pBuff)\n{\n\t__asm {\n\t\tpush\tebx\n\t\tpush\tedx\n\t\tpush\tedi\n\t\tpush\tesi\n\t\tmov\t\tedi, offset SpeedFrameTbl\n\t\tmov\t\tgpCelFrame, edi\n\t\tmov\t\tedi, ecx\n\t\tmov\t\teax, light_table_index\n\t\ttest\tal, al\n\t\tjz\t\tloc_46316A\n\t\tcmp\t\tal, lightmax\n\t\tjz\t\tloc_4631CA\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjnz\t\tloc_4630FE\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\tebx, light_table_index\n\t\tshl\t\tebx, 8\n\t\tadd\t\tebx, pLightTbl\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\t\tjz\t\tloc_463255\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_4632C5\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_463425\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_463698\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_46390B\n\t\tjmp\t\tloc_463AB3\n\tloc_4630FE:\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 4\n\t\tadd\t\teax, light_table_index\n\t\tshl\t\teax, 2\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, [esi]\n\t\tmov\t\tesi, pSpeedCels\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\tloc_463133:\n\t\tcmp\t\tax, 8\n\t\tjz\t\tloc_463C5B\n\t\tcmp\t\tax, 9\n\t\tjz\t\tloc_463CC2\n\t\tcmp\t\tax, 0Ah\n\t\tjz\t\tloc_463DA3\n\t\tcmp\t\tax, 0Bh\n\t\tjz\t\tloc_463ED8\n\t\tcmp\t\tax, 0Ch\n\t\tjz\t\tloc_464011\n\t\tjmp\t\tloc_464112\n\tloc_46316A:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_46319C\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_46319C:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tadd\t\teax, 8\n\t\tjmp\t\tloc_463133\n\tloc_4631CA:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_4631FC\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_4631FC:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tjz\t\tloc_46420F\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_464263\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_464321\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_46440E\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_4644FB\n\t\tjmp\t\tloc_4645C7\n\tloc_463255:\n\t\tpush\tebp\n\t\tmov\t\tebp, 10h\n\tloc_46325B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4632BF\n\t\tmov\t\tecx, 8\n\tloc_463268:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463268\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4632BF\n\t\tmov\t\tecx, 8\n\tloc_463299:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463299\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_46325B\n\tloc_4632BF:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_4632C5:\n\t\tpush\tebp\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 20h\n\tloc_4632D5:\n\t\tmov\t\tedx, 20h\n\tloc_4632DA:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_4633F8\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46341F\n\t\tmov\t\tecx, eax\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tcmp\t\teax, WorldBoolFlag\n\t\tjnz\t\tloc_463377\n\t\tpush\tedx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463340\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46331C\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_46331C:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_46333E\n\tloc_463320:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463320\n\tloc_46333E:\n\t\tjmp\t\tloc_463374\n\tloc_463340:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463353\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463353:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463374\n\tloc_463357:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463357\n\tloc_463374:\n\t\tpop\t\tedx\n\t\tjmp\t\tloc_4633EF\n\tloc_463377:\n\t\tpush\tedx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4633B0\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46338D\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_46338D:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4633AE\n\tloc_463391:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463391\n\tloc_4633AE:\n\t\tjmp\t\tloc_4633EE\n\tloc_4633B0:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4633CC\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4633CC:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4633EE\n\tloc_4633D0:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4633D0\n\tloc_4633EE:\n\t\tpop\t\tedx\n\tloc_4633EF:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_463404\n\t\tjmp\t\tloc_4632DA\n\tloc_4633F8:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_4632DA\n\tloc_463404:\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_4632D5\n\tloc_46341F:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_463425:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\tloc_463432:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463692\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4634D2\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463499\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463475\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_463475:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463497\n\tloc_463479:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463479\n\tloc_463497:\n\t\tjmp\t\tloc_4634CD\n\tloc_463499:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4634AC\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_4634AC:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4634CD\n\tloc_4634B0:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_4634B0\n\tloc_4634CD:\n\t\tjmp\t\t$+82h\n\tloc_4634D2:\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463511\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4634EE\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_4634EE:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_46350F\n\tloc_4634F2:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_4634F2\n\tloc_46350F:\n\t\tjmp\t\tloc_46354F\n\tloc_463511:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46352D\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_46352D:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_46354F\n\tloc_463531:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463531\n\tloc_46354F:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_463432\n\t\tmov\t\tebp, 2\n\tloc_463563:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463692\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463603\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4635CA\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4635A6\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4635A6:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4635C8\n\tloc_4635AA:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4635AA\n\tloc_4635C8:\n\t\tjmp\t\tloc_4635FE\n\tloc_4635CA:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4635DD\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_4635DD:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4635FE\n\tloc_4635E1:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_4635E1\n\tloc_4635FE:\n\t\tjmp\t\t$+82h\n\tloc_463603:\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463642\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46361F\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_46361F:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463640\n\tloc_463623:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463623\n\tloc_463640:\n\t\tjmp\t\tloc_463680\n\tloc_463642:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46365E\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_46365E:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463680\n\tloc_463662:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463662\n\tloc_463680:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tebp, 2\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_463563\n\tloc_463692:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_463698:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\tloc_4636A5:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463905\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463743\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463703\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4636DF\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4636DF:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463701\n\tloc_4636E3:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4636E3\n\tloc_463701:\n\t\tjmp\t\tloc_463737\n\tloc_463703:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463716\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463716:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463737\n\tloc_46371A:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46371A\n\tloc_463737:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tjmp\t\t$+82h\n\tloc_463743:\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_46377B\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463758\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463758:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463779\n\tloc_46375C:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46375C\n\tloc_463779:\n\t\tjmp\t\tloc_4637B9\n\tloc_46377B:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463797\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_463797:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4637B9\n\tloc_46379B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_46379B\n\tloc_4637B9:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\t    // loc_4637C0:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_4636A5\n\t\tmov\t\tebp, 2\n\tloc_4637D6:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463905\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463874\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463834\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463810\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_463810:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463832\n\tloc_463814:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463814\n\tloc_463832:\n\t\tjmp\t\tloc_463868\n\tloc_463834:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463847\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463847:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463868\n\tloc_46384B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46384B\n\tloc_463868:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tjmp\t\t$+82h\n\tloc_463874:\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4638AC\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463889\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463889:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4638AA\n\tloc_46388D:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46388D\n\tloc_4638AA:\n\t\tjmp\t\tloc_4638EA\n\tloc_4638AC:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4638C8\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4638C8:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4638EA\n\tloc_4638CC:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4638CC\n\tloc_4638EA:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\t    // loc_4638F1:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tadd\t\tebp, 2\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_4637D6\n\tloc_463905:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_46390B:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\tloc_463918:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463AAD\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4639B8\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_46397F\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46395B\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_46395B:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_46397D\n\tloc_46395F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_46395F\n\tloc_46397D:\n\t\tjmp\t\tloc_4639B3\n\tloc_46397F:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463992\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463992:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4639B3\n\tloc_463996:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463996\n\tloc_4639B3:\n\t\tjmp\t\t$+82h\n\tloc_4639B8:\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4639F7\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4639D4\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_4639D4:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4639F5\n\tloc_4639D8:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_4639D8\n\tloc_4639F5:\n\t\tjmp\t\tloc_463A35\n\tloc_4639F7:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463A13\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_463A13:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463A35\n\tloc_463A17:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463A17\n\tloc_463A35:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_463918\n\t\tmov\t\tebp, 8\n\tloc_463A49:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463AAD\n\t\tmov\t\tecx, 8\n\tloc_463A56:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463A56\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463AAD\n\t\tmov\t\tecx, 8\n\tloc_463A87:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463A87\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_463A49\n\tloc_463AAD:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_463AB3:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\tloc_463AC0:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463C55\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463B5E\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463B1E\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463AFA\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_463AFA:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463B1C\n\tloc_463AFE:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463AFE\n\tloc_463B1C:\n\t\tjmp\t\tloc_463B52\n\tloc_463B1E:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463B31\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463B31:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463B52\n\tloc_463B35:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463B35\n\tloc_463B52:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tjmp\t\t$+82h\n\tloc_463B5E:\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_463B96\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463B73\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_463B73:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463B94\n\tloc_463B77:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463B77\n\tloc_463B94:\n\t\tjmp\t\tloc_463BD4\n\tloc_463B96:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463BB2\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_463BB2:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_463BD4\n\tloc_463BB6:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463BB6\n\tloc_463BD4:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\t    // loc_463BDB:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_463AC0\n\t\tmov\t\tebp, 8\n\tloc_463BF1:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463C55\n\t\tmov\t\tecx, 8\n\tloc_463BFE:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_463BFE\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463C55\n\t\tmov\t\tecx, 8\n\tloc_463C2F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_463C2F\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_463BF1\n\tloc_463C55:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_463C5B:\n\t\tmov\t\tedx, 10h\n\tloc_463C60:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_463C71:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463C71\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_463C9F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463C9F\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_463C60\n\t\tjmp\t\tloc_464688\n\tloc_463CC2:\n\t\tpush\tebp\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 20h\n\tloc_463CD2:\n\t\tmov\t\tedx, 20h\n\tloc_463CD7:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_463D76\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_463D9D\n\t\tmov\t\tecx, eax\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tcmp\t\teax, WorldBoolFlag\n\t\tjnz\t\tloc_463D36\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463D0D\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463D6D\n\t\tjmp\t\tloc_463D46\n\tloc_463D0D:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463D1D\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463D6D\n\tloc_463D1D:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463D1D\n\t\tjmp\t\tloc_463D6D\n\tloc_463D36:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463D46\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463D6D\n\t\tjmp\t\tloc_463D0D\n\tloc_463D46:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_463D58\n\t\tmov\t\tal, [esi]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463D6D\n\tloc_463D58:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463D58\n\tloc_463D6D:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_463D82\n\t\tjmp\t\tloc_463CD7\n\tloc_463D76:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_463CD7\n\tloc_463D82:\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_463CD2\n\tloc_463D9D:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_463DA3:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_463DAF:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463E04\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_463DEB\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463E2E\n\tloc_463DEB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463DEB\n\t\tjmp\t\tloc_463E2E\n\tloc_463E04:\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_463E19\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463E2E\n\tloc_463E19:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463E19\n\tloc_463E2E:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_463DAF\n\t\tmov\t\tedx, 2\n\tloc_463E42:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463E97\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_463E7E\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463EC1\n\tloc_463E7E:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463E7E\n\t\tjmp\t\tloc_463EC1\n\tloc_463E97:\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_463EAC\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_463EC1\n\tloc_463EAC:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463EAC\n\tloc_463EC1:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_463E42\n\t\tjmp\t\tloc_464688\n\tloc_463ED8:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_463EE5:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46400B\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tebp, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463F3A\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_463F26\n\tloc_463F0F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463F0F\n\tloc_463F26:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_463F64\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tjmp\t\tloc_463F64\n\tloc_463F3A:\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_463F54\n\tloc_463F3F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463F3F\n\tloc_463F54:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_463F64\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\tloc_463F64:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_463EE5\n\t\tmov\t\tedx, 2\n\tloc_463F7A:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46400B\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_463FCD\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_463FB9\n\tloc_463FA2:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463FA2\n\tloc_463FB9:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_463FF7\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tjmp\t\tloc_463FF7\n\tloc_463FCD:\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_463FE7\n\tloc_463FD2:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_463FD2\n\tloc_463FE7:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_463FF7\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\tloc_463FF7:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_463F7A\n\tloc_46400B:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_464011:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_46401D:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_464072\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464059\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46409C\n\tloc_464059:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464059\n\t\tjmp\t\tloc_46409C\n\tloc_464072:\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464087\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46409C\n\tloc_464087:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464087\n\tloc_46409C:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_46401D\n\t\tmov\t\tedx, 8\n\tloc_4640B0:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_4640C1:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4640C1\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_4640EF:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4640EF\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_4640B0\n\t\tjmp\t\tloc_464688\n\tloc_464112:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_46411F:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464209\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tebp, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_464174\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_464160\n\tloc_464149:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464149\n\tloc_464160:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_46419E\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tjmp\t\tloc_46419E\n\tloc_464174:\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_46418E\n\tloc_464179:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464179\n\tloc_46418E:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_46419E\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\tloc_46419E:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_46411F\n\t\tmov\t\tedx, 8\n\tloc_4641B4:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464209\n\t\tmov\t\tecx, 8\n\tloc_4641C1:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4641C1\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464209\n\t\tmov\t\tecx, 8\n\tloc_4641EB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4641EB\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_4641B4\n\tloc_464209:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_46420F:\n\t\tmov\t\tedx, 10h\n\t\txor\t\teax, eax\n\tloc_464216:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_464227:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464227\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_46424A:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46424A\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464216\n\t\tjmp\t\tloc_464688\n\tloc_464263:\n\t\tpush\tebp\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 20h\n\tloc_464273:\n\t\tmov\t\tedx, 20h\n\tloc_464278:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_4642F4\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46431B\n\t\tmov\t\tecx, eax\n\t\tadd\t\tesi, ecx\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tcmp\t\teax, WorldBoolFlag\n\t\tjnz\t\tloc_4642C7\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4642AD\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4642EE\n\t\tjmp\t\tloc_4642D6\n\tloc_4642AD:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4642B9\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4642EE\n\tloc_4642B9:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4642B9\n\t\tjmp\t\tloc_4642EE\n\tloc_4642C7:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4642D6\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4642EE\n\t\tjmp\t\tloc_4642AD\n\tloc_4642D6:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4642E3\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4642EE\n\tloc_4642E3:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4642E3\n\tloc_4642EE:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_464300\n\t\tjmp\t\tloc_464278\n\tloc_4642F4:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_464278\n\tloc_464300:\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_464273\n\tloc_46431B:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_464688\n\tloc_464321:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_46432D:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_46436F\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464361\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46438A\n\tloc_464361:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464361\n\t\tjmp\t\tloc_46438A\n\tloc_46436F:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46437F\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46438A\n\tloc_46437F:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46437F\n\tloc_46438A:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_464399\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46432D\n\tloc_464399:\n\t\tmov\t\tedx, 2\n\tloc_46439E:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4643E0\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4643D2\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4643FB\n\tloc_4643D2:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4643D2\n\t\tjmp\t\tloc_4643FB\n\tloc_4643E0:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4643F0\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4643FB\n\tloc_4643F0:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4643F0\n\tloc_4643FB:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_46439E\n\t\tjmp\t\tloc_464688\n\tloc_46440E:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_46441A:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_46445A\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46444C\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464475\n\tloc_46444C:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46444C\n\t\tjmp\t\tloc_464475\n\tloc_46445A:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46446A\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464475\n\tloc_46446A:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46446A\n\tloc_464475:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_464486\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46441A\n\tloc_464486:\n\t\tmov\t\tedx, 2\n\tloc_46448B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4644CB\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4644BD\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4644E6\n\tloc_4644BD:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4644BD\n\t\tjmp\t\tloc_4644E6\n\tloc_4644CB:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4644DB\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4644E6\n\tloc_4644DB:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4644DB\n\tloc_4644E6:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_46448B\n\t\tjmp\t\tloc_464688\n\tloc_4644FB:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_464507:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_464549\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46453B\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464564\n\tloc_46453B:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46453B\n\t\tjmp\t\tloc_464564\n\tloc_464549:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464559\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464564\n\tloc_464559:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464559\n\tloc_464564:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_464573\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_464507\n\tloc_464573:\n\t\tmov\t\tedx, 8\n\t\txor\t\teax, eax\n\tloc_46457A:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_46458B:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46458B\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_4645AE:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4645AE\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_46457A\n\t\tjmp\t\tloc_464688\n\tloc_4645C7:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_4645D3:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_464613\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464605\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46462E\n\tloc_464605:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464605\n\t\tjmp\t\tloc_46462E\n\tloc_464613:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464623\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46462E\n\tloc_464623:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464623\n\tloc_46462E:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_46463F\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_4645D3\n\tloc_46463F:\n\t\tmov\t\tedx, 8\n\t\txor\t\teax, eax\n\tloc_464646:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_464653:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464653\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464688\n\t\tmov\t\tecx, 8\n\tloc_464672:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464672\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464646\n\t\tjmp\t\tloc_464688\n\tloc_464688:\n\t\tpop\t\tesi\n\t\tpop\t\tedi\n\t\tpop\t\tedx\n\t\tpop\t\tebx\n\t\tretn\n\t}\n}\n\n__declspec(naked) void drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *pMask)\n{\n\t__asm {\n\t\tpush\tebx\n\t\tpush\tedi\n\t\tpush\tesi\n\t\tmov\t\tedi, offset SpeedFrameTbl\n\t\tmov\t\tgpCelFrame, edi\n\t\tmov\t\tedi, ecx\n\t\tmov\t\tgpDrawMask, edx\n\t\tmov\t\teax, light_table_index\n\t\ttest\tal, al\n\t\tjz\t\tloc_4647A2\n\t\tcmp\t\tal, lightmax\n\t\tjz\t\tloc_464802\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjnz\t\tloc_464736\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\tebx, light_table_index\n\t\tshl\t\tebx, 8\n\t\tadd\t\tebx, pLightTbl\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\t\tjz\t\tloc_46488D\n\t\tjz\t\tloc_464FBC\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_4648D5\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_464964\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_464A30\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_464AFE\n\t\tjmp\t\tloc_464BBC\n\tloc_464736:\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 4\n\t\tadd\t\teax, light_table_index\n\t\tshl\t\teax, 2\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, [esi]\n\t\tmov\t\tesi, pSpeedCels\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\tloc_46476B:\n\t\tcmp\t\tax, 8\n\t\tjz\t\tloc_464C7A\n\t\tcmp\t\tax, 9\n\t\tjz\t\tloc_464CC1\n\t\tcmp\t\tax, 0Ah\n\t\tjz\t\tloc_464D4B\n\t\tcmp\t\tax, 0Bh\n\t\tjz\t\tloc_464DE3\n\t\tcmp\t\tax, 0Ch\n\t\tjz\t\tloc_464E7D\n\t\tjmp\t\tloc_464F19\n\tloc_4647A2:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_4647D4\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_4647D4:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tadd\t\teax, 8\n\t\tjmp\t\tloc_46476B\n\tloc_464802:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_464834\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_464834:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tjz\t\tloc_464FBC\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_465002\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_465091\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_465117\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_46519D\n\t\tjmp\t\tloc_465232\n\tloc_46488D:\n\t\tmov\t\tedx, 20h\n\tloc_464892:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_4648AB:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_4648B5\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_4648B5:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4648AB\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464892\n\t\tjmp\t\tloc_4652C1\n\tloc_4648D5:\n\t\tmov\t\tecx, 20h\n\tloc_4648DA:\n\t\tpush\tecx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\teax, [eax]\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tmov\t\tedx, 20h\n\tloc_4648EC:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_464927\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C0\n\t\tmov\t\tecx, eax\n\t\tpush\tedx\n\t\tmov\t\tedx, gdwCurrentMask\n\tloc_46490C:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464916\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_464916:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46490C\n\t\tmov\t\tgdwCurrentMask, edx\n\t\tpop\t\tedx\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_464944\n\t\tjmp\t\tloc_4648EC\n\tloc_464927:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tmov\t\tecx, eax\n\t\tand\t\tecx, 1Fh\n\t\tjz\t\tloc_464940\n\t\tpush\teax\n\t\tmov\t\teax, gdwCurrentMask\n\t\tshl\t\teax, cl\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tpop\t\teax\n\tloc_464940:\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_4648EC\n\tloc_464944:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4648DA\n\t\tjmp\t\tloc_4652C1\n\tloc_464964:\n\t\tmov\t\tedx, 1Eh\n\tloc_464969:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46499E\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4649BB\n\tloc_46499E:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46499E\n\tloc_4649BB:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464969\n\t\tmov\t\tedx, 2\n\tloc_4649CB:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464A00\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464A1D\n\tloc_464A00:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464A00\n\tloc_464A1D:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_4649CB\n\t\tjmp\t\tloc_4652C1\n\tloc_464A30:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\tloc_464A36:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464AF8\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_464A6D\n\tloc_464A50:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464A50\n\tloc_464A6D:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_464A88\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_464A88:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464A36\n\t\tmov\t\tedx, 2\n\tloc_464A9A:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464AF8\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_464ACD\n\tloc_464AB0:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464AB0\n\tloc_464ACD:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_464AE8\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_464AE8:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_464A9A\n\tloc_464AF8:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4652C1\n\tloc_464AFE:\n\t\tmov\t\tedx, 1Eh\n\tloc_464B03:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464B38\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464B55\n\tloc_464B38:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464B38\n\tloc_464B55:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464B03\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_464B72:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\t\tmov\t\teax, esi\n\t\tand\t\teax, 2\n\t\tadd\t\tesi, eax\n\tloc_464B92:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464B9C\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_464B9C:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464B92\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464B72\n\t\tjmp\t\tloc_4652C1\n\tloc_464BBC:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\tloc_464BC2:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464C74\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_464BF9\n\tloc_464BDC:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464BDC\n\tloc_464BF9:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_464C14\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_464C14:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464BC2\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_464C33:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464C74\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_464C48:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464C52\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_464C52:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464C48\n\t\tmov\t\tebp, esi\n\t\tand\t\tebp, 2\n\t\tadd\t\tesi, ebp\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464C33\n\tloc_464C74:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4652C1\n\tloc_464C7A:\n\t\tmov\t\tedx, 20h\n\tloc_464C7F:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_464C98:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464CA1\n\t\tmov\t\t[edi], al\n\tloc_464CA1:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464C98\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464C7F\n\t\tjmp\t\tloc_4652C1\n\tloc_464CC1:\n\t\tmov\t\tecx, 20h\n\tloc_464CC6:\n\t\tpush\tecx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\teax, [eax]\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tmov\t\tedx, 20h\n\tloc_464CD8:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_464D12\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C0\n\t\tpush\tedx\n\t\tmov\t\tedx, gdwCurrentMask\n\t\tmov\t\tecx, eax\n\tloc_464CF8:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464D01\n\t\tmov\t\t[edi], al\n\tloc_464D01:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464CF8\n\t\tmov\t\tgdwCurrentMask, edx\n\t\tpop\t\tedx\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_464D2F\n\t\tjmp\t\tloc_464CD8\n\tloc_464D12:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tmov\t\tecx, eax\n\t\tand\t\tecx, 1Fh\n\t\tjz\t\tloc_464D2B\n\t\tmov\t\tebx, gdwCurrentMask\n\t\tshl\t\tebx, cl\n\t\tmov\t\tgdwCurrentMask, ebx\n\tloc_464D2B:\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_464CD8\n\tloc_464D2F:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464CC6\n\t\tjmp\t\tloc_4652C1\n\tloc_464D4B:\n\t\tmov\t\tedx, 1Eh\n\tloc_464D50:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464D7B\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464D88\n\tloc_464D7B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tdec\t\tecx\n\t\tlea\t\tedi, [edi+4]\n\t\tjnz\t\tloc_464D7B\n\tloc_464D88:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464D50\n\t\tmov\t\tedx, 2\n\tloc_464D98:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464DC3\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\ttest\tecx, ecx\n\t\tlea\t\tedi, [edi+2]\n\t\tjz\t\tloc_464DD0\n\tloc_464DC3:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464DC3\n\tloc_464DD0:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_464D98\n\t\tjmp\t\tloc_4652C1\n\tloc_464DE3:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\tloc_464DE9:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464E77\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_464E10\n\tloc_464E03:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464E03\n\tloc_464E10:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_464E21\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_464E21:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464DE9\n\t\tmov\t\tedx, 2\n\tloc_464E33:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464E77\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_464E56\n\tloc_464E49:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464E49\n\tloc_464E56:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_464E67\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_464E67:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_464E33\n\tloc_464E77:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4652C1\n\tloc_464E7D:\n\t\tmov\t\tedx, 1Eh\n\tloc_464E82:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_464EAD\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_464EBA\n\tloc_464EAD:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464EAD\n\tloc_464EBA:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464E82\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_464ED7:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_464EF0:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464EF9\n\t\tmov\t\t[edi], al\n\tloc_464EF9:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464EF0\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464ED7\n\t\tjmp\t\tloc_4652C1\n\tloc_464F19:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\tloc_464F1F:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464FB6\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_464F46\n\tloc_464F39:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464F39\n\tloc_464F46:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_464F57\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_464F57:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_464F1F\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_464F76:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_464FB6\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_464F8B:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464F94\n\t\tmov\t\t[edi], al\n\tloc_464F94:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464F8B\n\t\tmov\t\tebp, esi\n\t\tand\t\tebp, 2\n\t\tadd\t\tesi, ebp\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464F76\n\tloc_464FB6:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4652C1\n\tloc_464FBC:\n\t\tmov\t\tedx, 20h\n\tloc_464FC1:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\txor\t\teax, eax\n\t\tmov\t\tecx, 20h\n\tloc_464FDC:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_464FE2\n\t\tmov\t\t[edi], al\n\tloc_464FE2:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_464FDC\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_464FC1\n\t\tjmp\t\tloc_4652C1\n\tloc_465002:\n\t\tmov\t\tecx, 20h\n\tloc_465007:\n\t\tpush\tecx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\teax, [eax]\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tmov\t\tedx, 20h\n\tloc_465019:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_465054\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C0\n\t\tpush\tedx\n\t\tmov\t\tedx, gdwCurrentMask\n\t\tmov\t\tecx, eax\n\t\tadd\t\tesi, ecx\n\t\txor\t\teax, eax\n\tloc_46503D:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_465043\n\t\tmov\t\t[edi], al\n\tloc_465043:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46503D\n\t\tmov\t\tgdwCurrentMask, edx\n\t\tpop\t\tedx\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465071\n\t\tjmp\t\tloc_465019\n\tloc_465054:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tmov\t\tecx, eax\n\t\tand\t\tecx, 1Fh\n\t\tjz\t\tloc_46506D\n\t\tmov\t\tebx, gdwCurrentMask\n\t\tshl\t\tebx, cl\n\t\tmov\t\tgdwCurrentMask, ebx\n\tloc_46506D:\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_465019\n\tloc_465071:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465007\n\t\tjmp\t\tloc_4652C1\n\tloc_465091:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_465098:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4650BC\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4650C4\n\tloc_4650BC:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4650BC\n\tloc_4650C4:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_4650D3\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_465098\n\tloc_4650D3:\n\t\tmov\t\tedx, 2\n\tloc_4650D8:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4650FC\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465104\n\tloc_4650FC:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4650FC\n\tloc_465104:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_4650D8\n\t\tjmp\t\tloc_4652C1\n\tloc_465117:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_46511E:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465140\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465148\n\tloc_465140:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465140\n\tloc_465148:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465159\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46511E\n\tloc_465159:\n\t\tmov\t\tedx, 2\n\tloc_46515E:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465180\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465188\n\tloc_465180:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465180\n\tloc_465188:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_46515E\n\t\tjmp\t\tloc_4652C1\n\tloc_46519D:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_4651A4:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4651C8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4651D0\n\tloc_4651C8:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4651C8\n\tloc_4651D0:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_4651DF\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_4651A4\n\tloc_4651DF:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_4651F1:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\txor\t\teax, eax\n\t\tmov\t\tecx, 20h\n\tloc_46520C:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_465212\n\t\tmov\t\t[edi], al\n\tloc_465212:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46520C\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_4651F1\n\t\tjmp\t\tloc_4652C1\n\tloc_465232:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_465239:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\t$+82h\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46525B\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465263\n\tloc_46525B:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46525B\n\tloc_465263:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465274\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_465239\n\tloc_465274:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_465286:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4652C1\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\txor\t\teax, eax\n\t\tmov\t\tecx, 20h\n\tloc_46529D:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_4652A3\n\t\tmov\t\t[edi], al\n\tloc_4652A3:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46529D\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465286\n\t\tjmp\t\tloc_4652C1\n\tloc_4652C0:\n\t\tpop\t\teax\n\tloc_4652C1:\n\t\tpop\t\tesi\n\t\tpop\t\tedi\n\t\tpop\t\tebx\n\t\tretn\n\t}\n}\n\n__declspec(naked) void drawUpperScreen(BYTE *pBuff)\n{\n\t__asm {\n\t\tpush\tebx\n\t\tpush\tedx\n\t\tpush\tedi\n\t\tpush\tesi\n\t\tmov\t\tedx, cel_transparency_active\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465372\n\t\tmov\t\tdl, arch_draw_type\n\t\tcmp\t\tdl, 0\n\t\tjnz\t\tloc_4652EC\n\t\tcall\tdrawTopArchesUpperScreen\n\t\tjmp\t\tloc_465F33\n\tloc_4652EC:\n\t\tcmp\t\tdl, 1\n\t\tjnz\t\tloc_46532F\n\t\tmov\t\tebx, level_piece_id\n\t\tmov\t\tal, block_lvid[ebx]\n\t\tcmp\t\tal, 1\n\t\tjz\t\tloc_465307\n\t\tcmp\t\tal, 3\n\t\tjz\t\tloc_465307\n\t\tjmp\t\tloc_46532F\n\tloc_465307:\n\t\tmov\t\tedx, offset LeftMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesUpperScreen\n\t\tjmp\t\tloc_465F33\n\t\tcmp\t\tal, 4\n\t\tjnz\t\tloc_46532F\n\t\tmov\t\tedx, offset RightMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesUpperScreen\n\t\tjmp\t\tloc_465F33\n\tloc_46532F:\n\t\tcmp\t\tdl, 2\n\t\tjnz\t\tloc_465372\n\t\tmov\t\tebx, level_piece_id\n\t\tmov\t\tal, block_lvid[ebx]\n\t\tcmp\t\tal, 2\n\t\tjz\t\tloc_46534A\n\t\tcmp\t\tal, 3\n\t\tjz\t\tloc_46534A\n\t\tjmp\t\tloc_465372\n\tloc_46534A:\n\t\tmov\t\tedx, offset RightMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesUpperScreen\n\t\tjmp\t\tloc_465F33\n\t\tcmp\t\tal, 4\n\t\tjnz\t\tloc_465372\n\t\tmov\t\tedx, offset LeftMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesUpperScreen\n\t\tjmp\t\tloc_465F33\n\tloc_465372:\n\t\tmov\t\tedi, offset SpeedFrameTbl\n\t\tmov\t\tgpCelFrame, edi\n\t\tmov\t\tedi, ecx\n\t\tmov\t\teax, light_table_index\n\t\ttest\tal, al\n\t\tjz\t\tloc_465474\n\t\tcmp\t\tal, lightmax\n\t\tjz\t\tloc_4654D4\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjnz\t\tloc_46540A\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\tebx, light_table_index\n\t\tshl\t\tebx, 8\n\t\tadd\t\tebx, pLightTbl\n\t\tmov\t\teax, level_cel_block\n\t\tshr\t\teax, 0Ch\n\t\tand\t\teax, 0Fh\n\t\tjz\t\tloc_46555D\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_4655B5\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_465663\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_465765\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_465867\n\t\tjmp\t\tloc_465939\n\tloc_46540A:\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 4\n\t\tadd\t\teax, light_table_index\n\t\tshl\t\teax, 2\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, [esi]\n\t\tmov\t\tesi, pSpeedCels\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tshr\t\teax, 0Ch\n\t\tand\t\teax, 0Fh\n\tloc_46543D:\n\t\tcmp\t\tax, 8\n\t\tjz\t\tloc_465A0B\n\t\tcmp\t\tax, 9\n\t\tjz\t\tloc_465A3C\n\t\tcmp\t\tax, 0Ah\n\t\tjz\t\tloc_465AA8\n\t\tcmp\t\tax, 0Bh\n\t\tjz\t\tloc_465B40\n\t\tcmp\t\tax, 0Ch\n\t\tjz\t\tloc_465BDA\n\t\tjmp\t\tloc_465C53\n\tloc_465474:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_4654A6\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_4654A6:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tadd\t\teax, 8\n\t\tjmp\t\tloc_46543D\n\tloc_4654D4:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_465506\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_465506:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tshr\t\teax, 0Ch\n\t\tand\t\teax, 7\n\t\tjz\t\tloc_465CC8\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_465CF6\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_465D58\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_465DDE\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_465E64\n\t\tjmp\t\tloc_465ECF\n\tloc_46555D:\n\t\tmov\t\tedx, 20h\n\tloc_465562:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 20h\n\t\tpush\tedx\n\tloc_465574:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_465574\n\t\tpop\t\tedx\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465562\n\t\tjmp\t\tloc_465F33\n\tloc_4655B5:\n\t\tpush\tebp\n\t\tmov\t\tebp, 20h\n\tloc_4655BB:\n\t\tmov\t\tedx, 20h\n\tloc_4655C0:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_465644\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46565D\n\t\tmov\t\tecx, eax\n\t\tpush\tedx\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_465611\n\tloc_4655DF:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_4655DF\n\tloc_465611:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_46562C\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_46562C:\n\t\tand\t\tcl, 1\n\t\tjz\t\tloc_46563A\n\t\tmov\t\tdl, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\tloc_46563A:\n\t\tpop\t\tedx\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465650\n\t\tjmp\t\tloc_4655C0\n\tloc_465644:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_4655C0\n\tloc_465650:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_4655BB\n\tloc_46565D:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465663:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\tloc_465669:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46575F\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_4656BC\n\tloc_46568A:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_46568A\n\tloc_4656BC:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_4656D7\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_4656D7:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_465669\n\t\tmov\t\tebp, 2\n\tloc_4656E7:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46575F\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_465736\n\tloc_465704:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_465704\n\tloc_465736:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_465751\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_465751:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tebp, 2\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_4656E7\n\tloc_46575F:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465765:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\tloc_46576B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465861\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_4657B5\n\tloc_465783:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_465783\n\tloc_4657B5:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_4657D0\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_4657D0:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_46576B\n\t\tmov\t\tebp, 2\n\tloc_4657E9:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465861\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_46582F\n\tloc_4657FD:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_4657FD\n\tloc_46582F:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_46584A\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_46584A:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tadd\t\tebp, 2\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_4657E9\n\tloc_465861:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465867:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\tloc_46586D:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465933\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_4658C0\n\tloc_46588E:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_46588E\n\tloc_4658C0:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_4658DB\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_4658DB:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_46586D\n\t\tmov\t\tebp, 10h\n\tloc_4658EB:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465933\n\t\tmov\t\tecx, 20h\n\tloc_4658F8:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_4658F8\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_4658EB\n\tloc_465933:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465939:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\tloc_46593F:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465A05\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_465989\n\tloc_465957:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_465957\n\tloc_465989:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_4659A4\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_4659A4:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_46593F\n\t\tmov\t\tebp, 10h\n\tloc_4659BD:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465A05\n\t\tmov\t\tecx, 20h\n\tloc_4659CA:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_4659CA\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_4659BD\n\tloc_465A05:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465A0B:\n\t\tmov\t\tedx, 20h\n\tloc_465A10:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 8\n\tloc_465A21:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465A21\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465A10\n\t\tjmp\t\tloc_465F33\n\tloc_465A3C:\n\t\tpush\tebp\n\t\tmov\t\tebp, 20h\n\tloc_465A42:\n\t\tmov\t\tedx, 20h\n\tloc_465A47:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_465A91\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465AA2\n\t\tmov\t\tecx, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_465A6A\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465A8B\n\tloc_465A6A:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_465A7E\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465A8B\n\tloc_465A7E:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465A7E\n\tloc_465A8B:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465A99\n\t\tjmp\t\tloc_465A47\n\tloc_465A91:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_465A47\n\tloc_465A99:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_465A42\n\tloc_465AA2:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465AA8:\n\t\tmov\t\tedx, 1Eh\n\tloc_465AAD:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465AD8\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465AE5\n\tloc_465AD8:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465AD8\n\tloc_465AE5:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_465AAD\n\t\tmov\t\tedx, 2\n\tloc_465AF5:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465B20\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465B2D\n\tloc_465B20:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465B20\n\tloc_465B2D:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_465AF5\n\t\tjmp\t\tloc_465F33\n\tloc_465B40:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\tloc_465B46:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465BD4\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_465B6D\n\tloc_465B60:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465B60\n\tloc_465B6D:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_465B7E\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_465B7E:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_465B46\n\t\tmov\t\tedx, 2\n\tloc_465B90:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465BD4\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_465BB3\n\tloc_465BA6:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465BA6\n\tloc_465BB3:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_465BC4\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_465BC4:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_465B90\n\tloc_465BD4:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465BDA:\n\t\tmov\t\tedx, 1Eh\n\tloc_465BDF:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465C0A\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465C17\n\tloc_465C0A:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465C0A\n\tloc_465C17:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_465BDF\n\t\tmov\t\tedx, 10h\n\tloc_465C27:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 8\n\tloc_465C38:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465C38\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465C27\n\t\tjmp\t\tloc_465F33\n\tloc_465C53:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\tloc_465C59:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465CC2\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_465C7C\n\tloc_465C6F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465C6F\n\tloc_465C7C:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_465C8D\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_465C8D:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_465C59\n\t\tmov\t\tedx, 10h\n\tloc_465C9F:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465CC2\n\t\tmov\t\tecx, 8\n\tloc_465CAC:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465CAC\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465C9F\n\tloc_465CC2:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465CC8:\n\t\tmov\t\tedx, 20h\n\t\txor\t\teax, eax\n\tloc_465CCF:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 8\n\tloc_465CE0:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465CE0\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465CCF\n\t\tjmp\t\tloc_465F33\n\tloc_465CF6:\n\t\tpush\tebp\n\t\tmov\t\tebp, 20h\n\tloc_465CFC:\n\t\tmov\t\tedx, 20h\n\tloc_465D01:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_465D41\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465D52\n\t\tmov\t\tecx, eax\n\t\tadd\t\tesi, ecx\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_465D25\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465D3B\n\tloc_465D25:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_465D33\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465D3B\n\tloc_465D33:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465D33\n\tloc_465D3B:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465D49\n\t\tjmp\t\tloc_465D01\n\tloc_465D41:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_465D01\n\tloc_465D49:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_465CFC\n\tloc_465D52:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_465F33\n\tloc_465D58:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_465D5F:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465D83\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465D8B\n\tloc_465D83:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465D83\n\tloc_465D8B:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465D9A\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_465D5F\n\tloc_465D9A:\n\t\tmov\t\tedx, 2\n\tloc_465D9F:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465DC3\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465DCB\n\tloc_465DC3:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465DC3\n\tloc_465DCB:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_465D9F\n\t\tjmp\t\tloc_465F33\n\tloc_465DDE:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_465DE5:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465E07\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465E0F\n\tloc_465E07:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465E07\n\tloc_465E0F:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465E20\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_465DE5\n\tloc_465E20:\n\t\tmov\t\tedx, 2\n\tloc_465E25:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465E47\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465E4F\n\tloc_465E47:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465E47\n\tloc_465E4F:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_465E25\n\t\tjmp\t\tloc_465F33\n\tloc_465E64:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_465E6B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465E8F\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465E97\n\tloc_465E8F:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465E8F\n\tloc_465E97:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465EA6\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_465E6B\n\tloc_465EA6:\n\t\tmov\t\tedx, 10h\n\tloc_465EAB:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\t$+82h\n\t\tmov\t\tecx, 8\n\tloc_465EBC:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465EBC\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465EAB\n\t\tjmp\t\tloc_465F33\n\tloc_465ECF:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_465ED6:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_465EF4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_465EFC\n\tloc_465EF4:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465EF4\n\tloc_465EFC:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_465F0D\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_465ED6\n\tloc_465F0D:\n\t\tmov\t\tedx, 10h\n\tloc_465F12:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_465F33\n\t\tmov\t\tecx, 8\n\tloc_465F1F:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_465F1F\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_465F12\n\t\tjmp\t\tloc_465F33\n\t\tpop\t\teax\n\tloc_465F33:\n\t\tpop\t\tesi\n\t\tpop\t\tedi\n\t\tpop\t\tedx\n\t\tpop\t\tebx\n\t\tretn\n\t}\n}\n\n__declspec(naked) void drawTopArchesLowerScreen(BYTE *pBuff)\n{\n\t__asm {\n\t\tpush\tebx\n\t\tpush\tedx\n\t\tpush\tedi\n\t\tpush\tesi\n\t\tmov\t\tedi, offset SpeedFrameTbl\n\t\tmov\t\tgpCelFrame, edi\n\t\tmov\t\tedi, ecx\n\t\tmov\t\teax, light_table_index\n\t\ttest\tal, al\n\t\tjz\t\tloc_466042\n\t\tcmp\t\tal, lightmax\n\t\tjz\t\tloc_4660A2\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjnz\t\tloc_465FD6\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\tebx, light_table_index\n\t\tshl\t\tebx, 8\n\t\tadd\t\tebx, pLightTbl\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\t\tjz\t\tloc_46612D\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_4661AD\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_466310\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_466611\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_466912\n\t\tjmp\t\tloc_466B11\n\tloc_465FD6:\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 4\n\t\tadd\t\teax, light_table_index\n\t\tshl\t\teax, 2\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, [esi]\n\t\tmov\t\tesi, pSpeedCels\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\tloc_46600B:\n\t\tcmp\t\tax, 8\n\t\tjz\t\tloc_466D10\n\t\tcmp\t\tax, 9\n\t\tjz\t\tloc_466D7F\n\t\tcmp\t\tax, 0Ah\n\t\tjz\t\tloc_466E62\n\t\tcmp\t\tax, 0Bh\n\t\tjz\t\tloc_46701C\n\t\tcmp\t\tax, 0Ch\n\t\tjz\t\tloc_4671E1\n\t\tjmp\t\tloc_46732D\n\tloc_466042:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_466074\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_466074:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tadd\t\teax, 8\n\t\tjmp\t\tloc_46600B\n\tloc_4660A2:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_4660D4\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_4660D4:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tjz\t\tloc_46747D\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_4674D9\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_467599\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_467692\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_46778F\n\t\tjmp\t\tloc_46786B\n\tloc_46612D:\n\t\tpush\tebp\n\t\tmov\t\tebp, 10h\n\tloc_466133:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466143\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_466166\n\tloc_466143:\n\t\tmov\t\tecx, 8\n\tloc_466148:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466148\n\tloc_466166:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46617C\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46619E\n\tloc_46617C:\n\t\tmov\t\tecx, 8\n\tloc_466181:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466181\n\tloc_46619E:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_466133\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_4661AD:\n\t\tpush\tebp\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tecx, 20h\n\tloc_4661BD:\n\t\tpush\tecx\n\t\tmov\t\tebp, 20h\n\tloc_4661C3:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_4662E2\n\t\tsub\t\tebp, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4661E3\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_4662D9\n\tloc_4661E3:\n\t\tmov\t\tecx, eax\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tcmp\t\teax, WorldBoolFlag\n\t\tjnz\t\tloc_466263\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_46622D\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466209\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_466209:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_46622B\n\tloc_46620D:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_46620D\n\tloc_46622B:\n\t\tjmp\t\tloc_466261\n\tloc_46622D:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466240\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466240:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466261\n\tloc_466244:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466244\n\tloc_466261:\n\t\tjmp\t\tloc_4662D9\n\tloc_466263:\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_46629B\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466278\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466278:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466299\n\tloc_46627C:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46627C\n\tloc_466299:\n\t\tjmp\t\tloc_4662D9\n\tloc_46629B:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4662B7\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4662B7:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4662D9\n\tloc_4662BB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4662BB\n\tloc_4662D9:\n\t\ttest\tebp, ebp\n\t\tjz\t\tloc_4662EE\n\t\tjmp\t\tloc_4661C3\n\tloc_4662E2:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tebp, eax\n\t\tjnz\t\tloc_4661C3\n\tloc_4662EE:\n\t\tpop\t\tecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4661BD\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_466310:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_466370\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_46635F\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_466370\n\tloc_46635F:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_466490\n\tloc_466370:\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_466404\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4663CB\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4663A7\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4663A7:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4663C9\n\tloc_4663AB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4663AB\n\tloc_4663C9:\n\t\tjmp\t\tloc_4663FF\n\tloc_4663CB:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4663DE\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_4663DE:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4663FF\n\tloc_4663E2:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_4663E2\n\tloc_4663FF:\n\t\tjmp\t\t$+82h\n\tloc_466404:\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_466443\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466420\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466420:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466441\n\tloc_466424:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466424\n\tloc_466441:\n\t\tjmp\t\tloc_466481\n\tloc_466443:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46645F\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_46645F:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466481\n\tloc_466463:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466463\n\tloc_466481:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_466370\n\tloc_466490:\n\t\tmov\t\tebp, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4664E8\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_4664D7\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tebp, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_4664E8\n\tloc_4664D7:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_46660B\n\tloc_4664E8:\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_46657C\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_466543\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46651F\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_46651F:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466541\n\tloc_466523:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466523\n\tloc_466541:\n\t\tjmp\t\tloc_466577\n\tloc_466543:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466556\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466556:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466577\n\tloc_46655A:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46655A\n\tloc_466577:\n\t\tjmp\t\t$+82h\n\tloc_46657C:\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4665BB\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466598\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466598:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4665B9\n\tloc_46659C:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46659C\n\tloc_4665B9:\n\t\tjmp\t\tloc_4665F9\n\tloc_4665BB:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4665D7\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4665D7:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4665F9\n\tloc_4665DB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4665DB\n\tloc_4665F9:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tebp, 2\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_4664E8\n\tloc_46660B:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_466611:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_466671\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_466660\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_466671\n\tloc_466660:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_466791\n\tloc_466671:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_466703\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4666C3\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46669F\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_46669F:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4666C1\n\tloc_4666A3:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4666A3\n\tloc_4666C1:\n\t\tjmp\t\tloc_4666F7\n\tloc_4666C3:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4666D6\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_4666D6:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4666F7\n\tloc_4666DA:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_4666DA\n\tloc_4666F7:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tjmp\t\t$+82h\n\tloc_466703:\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_46673B\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466718\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466718:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466739\n\tloc_46671C:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_46671C\n\tloc_466739:\n\t\tjmp\t\tloc_466779\n\tloc_46673B:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466757\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_466757:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466779\n\tloc_46675B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_46675B\n\tloc_466779:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\t    // loc_466780:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_466671\n\tloc_466791:\n\t\tmov\t\tebp, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4667E9\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_4667D8\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tebp, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_4667E9\n\tloc_4667D8:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_46690C\n\tloc_4667E9:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_46687B\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_46683B\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466817\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_466817:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466839\n\tloc_46681B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_46681B\n\tloc_466839:\n\t\tjmp\t\tloc_46686F\n\tloc_46683B:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46684E\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_46684E:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_46686F\n\tloc_466852:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466852\n\tloc_46686F:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tjmp\t\t$+82h\n\tloc_46687B:\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4668B3\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466890\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466890:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4668B1\n\tloc_466894:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466894\n\tloc_4668B1:\n\t\tjmp\t\tloc_4668F1\n\tloc_4668B3:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4668CF\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4668CF:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4668F1\n\tloc_4668D3:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4668D3\n\tloc_4668F1:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\t    // loc_4668F8:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tadd\t\tebp, 2\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_4667E9\n\tloc_46690C:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_466912:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_466972\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_466961\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_466972\n\tloc_466961:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_466A92\n\tloc_466972:\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_466A06\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_4669CD\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4669A9\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_4669A9:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_4669CB\n\tloc_4669AD:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_4669AD\n\tloc_4669CB:\n\t\tjmp\t\tloc_466A01\n\tloc_4669CD:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_4669E0\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_4669E0:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466A01\n\tloc_4669E4:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_4669E4\n\tloc_466A01:\n\t\tjmp\t\t$+82h\n\tloc_466A06:\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_466A45\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466A22\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466A22:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466A43\n\tloc_466A26:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466A26\n\tloc_466A43:\n\t\tjmp\t\tloc_466A83\n\tloc_466A45:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466A61\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_466A61:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466A83\n\tloc_466A65:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466A65\n\tloc_466A83:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_466972\n\tloc_466A92:\n\t\tmov\t\tebp, 8\n\tloc_466A97:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466AA7\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_466ACA\n\tloc_466AA7:\n\t\tmov\t\tecx, 8\n\tloc_466AAC:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466AAC\n\tloc_466ACA:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466AE0\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_466B02\n\tloc_466AE0:\n\t\tmov\t\tecx, 8\n\tloc_466AE5:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466AE5\n\tloc_466B02:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_466A97\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_466B11:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_466B71\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_466B60\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_466B71\n\tloc_466B60:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_466C91\n\tloc_466B71:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_466C03\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_466BC3\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466B9F\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_466B9F:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466BC1\n\tloc_466BA3:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466BA3\n\tloc_466BC1:\n\t\tjmp\t\tloc_466BF7\n\tloc_466BC3:\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466BD6\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466BD6:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466BF7\n\tloc_466BDA:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466BDA\n\tloc_466BF7:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tjmp\t\t$+82h\n\tloc_466C03:\n\t\tshr\t\tecx, 1\n\t\tjb\t\tloc_466C3B\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466C18\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], dl\n\t\tadd\t\tedi, 2\n\tloc_466C18:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466C39\n\tloc_466C1C:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466C1C\n\tloc_466C39:\n\t\tjmp\t\tloc_466C79\n\tloc_466C3B:\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466C57\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tdl, [ebx+edx]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi+1], dl\n\t\tadd\t\tedi, 2\n\tloc_466C57:\n\t\ttest\tcl, cl\n\t\tjz\t\tloc_466C79\n\tloc_466C5B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466C5B\n\tloc_466C79:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\t    // loc_466C80:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_466B71\n\tloc_466C91:\n\t\tmov\t\tebp, 8\n\tloc_466C96:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466CA6\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_466CC9\n\tloc_466CA6:\n\t\tmov\t\tecx, 8\n\tloc_466CAB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, ah\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi+1], dl\n\t\tmov\t\tdl, ah\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-1], dl\n\t\tjnz\t\tloc_466CAB\n\tloc_466CC9:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466CDF\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_466D01\n\tloc_466CDF:\n\t\tmov\t\tecx, 8\n\tloc_466CE4:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tshr\t\teax, 10h\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tmov\t\tdl, al\n\t\tadd\t\tedi, 4\n\t\tmov\t\tdl, [ebx+edx]\n\t\tdec\t\tecx\n\t\tmov\t\t[edi-2], dl\n\t\tjnz\t\tloc_466CE4\n\tloc_466D01:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_466C96\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_466D10:\n\t\tmov\t\tedx, 10h\n\tloc_466D15:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466D25\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_466D41\n\tloc_466D25:\n\t\tmov\t\tecx, 8\n\tloc_466D2A:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466D2A\n\tloc_466D41:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466D57\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_466D71\n\tloc_466D57:\n\t\tmov\t\tecx, 8\n\tloc_466D5C:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466D5C\n\tloc_466D71:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_466D15\n\t\tjmp\t\tloc_467944\n\tloc_466D7F:\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tecx, 20h\n\tloc_466D8E:\n\t\tpush\tecx\n\t\tmov\t\tedx, 20h\n\tloc_466D94:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_466E35\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_466DB1\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_466E2C\n\tloc_466DB1:\n\t\tmov\t\tecx, eax\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tcmp\t\teax, WorldBoolFlag\n\t\tjnz\t\tloc_466DF5\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466DCC\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_466E2C\n\t\tjmp\t\tloc_466E05\n\tloc_466DCC:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466DDC\n\t\tinc\t\tesi\n\t\tinc\t\tedi\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_466E2C\n\tloc_466DDC:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466DDC\n\t\tjmp\t\tloc_466E2C\n\tloc_466DF5:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466E05\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_466E2C\n\t\tjmp\t\tloc_466DCC\n\tloc_466E05:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_466E17\n\t\tmov\t\tal, [esi]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_466E2C\n\tloc_466E17:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466E17\n\tloc_466E2C:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_466E41\n\t\tjmp\t\tloc_466D94\n\tloc_466E35:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_466D94\n\tloc_466E41:\n\t\tpop\t\tecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466D8E\n\t\tjmp\t\tloc_467944\n\tloc_466E62:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_466EC1\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_466EB0\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_466EC1\n\tloc_466EB0:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\t$+83h\n\tloc_466EC1:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_466F0A\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_466EF1\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_466F34\n\tloc_466EF1:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466EF1\n\t\tjmp\t\tloc_466F34\n\tloc_466F0A:\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_466F1F\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_466F34\n\tloc_466F1F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466F1F\n\tloc_466F34:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_466EC1\n\t\t    // loc_466F3F:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_466F97\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_466F86\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_466F97\n\tloc_466F86:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_467944\n\tloc_466F97:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_466FE0\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_466FC7\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467009\n\tloc_466FC7:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466FC7\n\t\tjmp\t\tloc_467009\n\tloc_466FE0:\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_466FF4\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjz\t\tloc_467009\n\tloc_466FF4:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_466FF4\n\tloc_467009:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_466F97\n\t\tjmp\t\tloc_467944\n\tloc_46701C:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_46707C\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_46706B\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_46707C\n\tloc_46706B:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_4670FC\n\tloc_46707C:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tebp, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4670C5\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4670B1\n\tloc_46709A:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46709A\n\tloc_4670B1:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_4670EF\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tjmp\t\tloc_4670EF\n\tloc_4670C5:\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4670DF\n\tloc_4670CA:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4670CA\n\tloc_4670DF:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_4670EF\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\tloc_4670EF:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_46707C\n\tloc_4670FC:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467154\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_467143\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_467154\n\tloc_467143:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_4671DB\n\tloc_467154:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tebp, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_46719D\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_467189\n\tloc_467172:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467172\n\tloc_467189:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_4671C7\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tjmp\t\tloc_4671C7\n\tloc_46719D:\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4671B7\n\tloc_4671A2:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4671A2\n\tloc_4671B7:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_4671C7\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\tloc_4671C7:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_467154\n\tloc_4671DB:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_4671E1:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467240\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_46722F\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_467240\n\tloc_46722F:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\t$+83h\n\tloc_467240:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_467289\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_467270\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4672B3\n\tloc_467270:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467270\n\t\tjmp\t\tloc_4672B3\n\tloc_467289:\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46729E\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\ttest\tecx, ecx\n\t\tlea\t\tedi, [edi+2]\n\t\tjz\t\tloc_4672B3\n\tloc_46729E:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tdec\t\tecx\n\t\tlea\t\tedi, [edi+2]\n\t\tjnz\t\tloc_46729E\n\tloc_4672B3:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_467240\n\t\t    // loc_4672BE:\n\t\tmov\t\tedx, 8\n\tloc_4672C3:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4672D3\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4672EF\n\tloc_4672D3:\n\t\tmov\t\tecx, 8\n\tloc_4672D8:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4672D8\n\tloc_4672EF:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467305\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46731F\n\tloc_467305:\n\t\tmov\t\tecx, 8\n\tloc_46730A:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46730A\n\tloc_46731F:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_4672C3\n\t\tjmp\t\tloc_467944\n\tloc_46732D:\n\t\tpush\tebp\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_46738D\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_46737C\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tshr\t\tecx, 1\n\t\tadd\t\teax, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjmp\t\tloc_46738D\n\tloc_46737C:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_46740D\n\tloc_46738D:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tebp, ecx\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4673D6\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4673C2\n\tloc_4673AB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4673AB\n\tloc_4673C2:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_467400\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tjmp\t\tloc_467400\n\tloc_4673D6:\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4673F0\n\tloc_4673DB:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4673DB\n\tloc_4673F0:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_467400\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\tloc_467400:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_46738D\n\tloc_46740D:\n\t\tmov\t\tedx, 8\n\tloc_467412:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467422\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46743E\n\tloc_467422:\n\t\tmov\t\tecx, 8\n\tloc_467427:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tinc\t\tedi\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467427\n\tloc_46743E:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467454\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46746E\n\tloc_467454:\n\t\tmov\t\tecx, 8\n\tloc_467459:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467459\n\tloc_46746E:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_467412\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_467944\n\tloc_46747D:\n\t\tmov\t\tedx, 10h\n\t\txor\t\teax, eax\n\tloc_467484:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467494\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4674A5\n\tloc_467494:\n\t\tmov\t\tecx, 8\n\tloc_467499:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467499\n\tloc_4674A5:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4674BB\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4674CB\n\tloc_4674BB:\n\t\tmov\t\tecx, 8\n\tloc_4674C0:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4674C0\n\tloc_4674CB:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_467484\n\t\tjmp\t\tloc_467944\n\tloc_4674D9:\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tecx, 20h\n\tloc_4674E8:\n\t\tpush\tecx\n\t\tmov\t\tedx, 20h\n\tloc_4674EE:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_46756C\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467507\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_467566\n\tloc_467507:\n\t\tmov\t\tecx, eax\n\t\tadd\t\tesi, ecx\n\t\tmov\t\teax, edi\n\t\tand\t\teax, 1\n\t\tcmp\t\teax, WorldBoolFlag\n\t\tjnz\t\tloc_46753F\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_467525\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467566\n\t\tjmp\t\tloc_46754E\n\tloc_467525:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_467531\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467566\n\tloc_467531:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467531\n\t\tjmp\t\tloc_467566\n\tloc_46753F:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46754E\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467566\n\t\tjmp\t\tloc_467525\n\tloc_46754E:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46755B\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467566\n\tloc_46755B:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46755B\n\tloc_467566:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_467578\n\t\tjmp\t\tloc_4674EE\n\tloc_46756C:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_4674EE\n\tloc_467578:\n\t\tpop\t\tecx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4674E8\n\t\tjmp\t\tloc_467944\n\tloc_467599:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_4675A5:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4675B7\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_467608\n\tloc_4675B7:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4675ED\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4675DF\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467608\n\tloc_4675DF:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4675DF\n\t\tjmp\t\tloc_467608\n\tloc_4675ED:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4675FD\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467608\n\tloc_4675FD:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4675FD\n\tloc_467608:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_467617\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_4675A5\n\tloc_467617:\n\t\tmov\t\tedx, 2\n\tloc_46761C:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46762E\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46767F\n\tloc_46762E:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_467664\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_467656\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46767F\n\tloc_467656:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467656\n\t\tjmp\t\tloc_46767F\n\tloc_467664:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_467674\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46767F\n\tloc_467674:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467674\n\tloc_46767F:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_46761C\n\t\tjmp\t\tloc_467944\n\tloc_467692:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_46769E:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4676B2\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_467701\n\tloc_4676B2:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4676E6\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4676D8\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467701\n\tloc_4676D8:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4676D8\n\t\tjmp\t\tloc_467701\n\tloc_4676E6:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4676F6\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467701\n\tloc_4676F6:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4676F6\n\tloc_467701:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_467712\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46769E\n\tloc_467712:\n\t\tmov\t\tedx, 2\n\tloc_467717:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46772B\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_46777A\n\tloc_46772B:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_46775F\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_467751\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46777A\n\tloc_467751:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467751\n\t\tjmp\t\tloc_46777A\n\tloc_46775F:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46776F\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46777A\n\tloc_46776F:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46776F\n\tloc_46777A:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_467717\n\t\tjmp\t\tloc_467944\n\tloc_46778F:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_46779B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4677AD\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4677FE\n\tloc_4677AD:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4677E3\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4677D5\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4677FE\n\tloc_4677D5:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4677D5\n\t\tjmp\t\tloc_4677FE\n\tloc_4677E3:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4677F3\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4677FE\n\tloc_4677F3:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4677F3\n\tloc_4677FE:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_46780D\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46779B\n\tloc_46780D:\n\t\tmov\t\tedx, 8\n\tloc_467812:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467822\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_467835\n\tloc_467822:\n\t\tmov\t\tecx, 8\n\t\txor\t\teax, eax\n\tloc_467829:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467829\n\tloc_467835:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46784B\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46785D\n\tloc_46784B:\n\t\tmov\t\tecx, 8\n\t\txor\t\teax, eax\n\tloc_467852:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467852\n\tloc_46785D:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_467812\n\t\tjmp\t\tloc_467944\n\tloc_46786B:\n\t\txor\t\teax, eax\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tmov\t\tedx, 1Eh\n\tloc_467877:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46788B\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_4678DA\n\tloc_46788B:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\teax, WorldBoolFlag\n\t\tinc\t\teax\n\t\tand\t\teax, 1\n\t\tmov\t\tWorldBoolFlag, eax\n\t\tjz\t\tloc_4678BF\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4678B1\n\t\tinc\t\tedi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4678DA\n\tloc_4678B1:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4678B1\n\t\tjmp\t\tloc_4678DA\n\tloc_4678BF:\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4678CF\n\t\tmov\t\t[edi], al\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4678DA\n\tloc_4678CF:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4678CF\n\tloc_4678DA:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_4678EB\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_467877\n\tloc_4678EB:\n\t\tmov\t\tedx, 8\n\tloc_4678F0:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467900\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_467913\n\tloc_467900:\n\t\tmov\t\tecx, 8\n\t\txor\t\teax, eax\n\tloc_467907:\n\t\tmov\t\t[edi+1], al\n\t\tmov\t\t[edi+3], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467907\n\tloc_467913:\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467929\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46793B\n\tloc_467929:\n\t\tmov\t\tecx, 8\n\t\txor\t\teax, eax\n\tloc_467930:\n\t\tmov\t\t[edi], al\n\t\tmov\t\t[edi+2], al\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467930\n\tloc_46793B:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_4678F0\n\tloc_467944:\n\t\tpop\t\tesi\n\t\tpop\t\tedi\n\t\tpop\t\tedx\n\t\tpop\t\tebx\n\t\tretn\n\t}\n}\n\n__declspec(naked) void drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *pMask)\n{\n\t__asm {\n\t\tpush\tebx\n\t\tpush\tedi\n\t\tpush\tesi\n\t\tmov\t\tedi, offset SpeedFrameTbl\n\t\tmov\t\tgpCelFrame, edi\n\t\tmov\t\tedi, ecx\n\t\tmov\t\tgpDrawMask, edx\n\t\tmov\t\teax, light_table_index\n\t\ttest\tal, al\n\t\tjz\t\tloc_467A58\n\t\tcmp\t\tal, lightmax\n\t\tjz\t\tloc_467AB8\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjnz\t\tloc_4679EC\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\tebx, light_table_index\n\t\tshl\t\tebx, 8\n\t\tadd\t\tebx, pLightTbl\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\t\tjz\t\tloc_467B43\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_467B8F\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_467C20\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_467D5B\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_467E99\n\t\tjmp\t\tloc_467F8A\n\tloc_4679EC:\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 4\n\t\tadd\t\teax, light_table_index\n\t\tshl\t\teax, 2\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, [esi]\n\t\tmov\t\tesi, pSpeedCels\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 0Fh\n\tloc_467A21:\n\t\tcmp\t\tax, 8\n\t\tjz\t\tloc_468086\n\t\tcmp\t\tax, 9\n\t\tjz\t\tloc_4680D1\n\t\tcmp\t\tax, 0Ah\n\t\tjz\t\tloc_468161\n\t\tcmp\t\tax, 0Bh\n\t\tjz\t\tloc_468268\n\t\tcmp\t\tax, 0Ch\n\t\tjz\t\tloc_468372\n\t\tjmp\t\tloc_468448\n\tloc_467A58:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_467A8A\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_467A8A:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tadd\t\teax, 8\n\t\tjmp\t\tloc_467A21\n\tloc_467AB8:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_467AEA\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_467AEA:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tjz\t\tloc_468529\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_468573\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_468604\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_468696\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_46872C\n\t\tjmp\t\tloc_4687CB\n\tloc_467B43:\n\t\tpush\tebp\n\t\tmov\t\tebp, 20h\n\tloc_467B49:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467B59\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_467B73\n\tloc_467B59:\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_467B65:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_467B6F\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_467B6F:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467B65\n\tloc_467B73:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_467B49\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_468867\n\tloc_467B8F:\n\t\tmov\t\tecx, 20h\n\tloc_467B94:\n\t\tpush\tecx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\teax, [eax]\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tmov\t\tedx, 20h\n\tloc_467BA6:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_467BE3\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467BBF\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_467BDD\n\tloc_467BBF:\n\t\tmov\t\tecx, eax\n\t\tpush\tedx\n\t\tmov\t\tedx, gdwCurrentMask\n\tloc_467BC8:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_467BD2\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_467BD2:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467BC8\n\t\tmov\t\tgdwCurrentMask, edx\n\t\tpop\t\tedx\n\tloc_467BDD:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_467C00\n\t\tjmp\t\tloc_467BA6\n\tloc_467BE3:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tmov\t\tecx, eax\n\t\tand\t\tecx, 1Fh\n\t\tjz\t\tloc_467BFC\n\t\tpush\teax\n\t\tmov\t\teax, gdwCurrentMask\n\t\tshl\t\teax, cl\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tpop\t\teax\n\tloc_467BFC:\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_467BA6\n\tloc_467C00:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467B94\n\t\tjmp\t\tloc_468867\n\tloc_467C20:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467C67\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_467C59\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_467C67\n\tloc_467C59:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_467CB8\n\tloc_467C67:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_467C90\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467CAD\n\tloc_467C90:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467C90\n\tloc_467CAD:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_467C67\n\tloc_467CB8:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467D02\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_467CF1\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tjmp\t\tloc_467D02\n\tloc_467CF1:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_468867\n\tloc_467D02:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_467D2B\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467D48\n\tloc_467D2B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467D2B\n\tloc_467D48:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_467D02\n\t\tjmp\t\tloc_468867\n\tloc_467D5B:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467DA3\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_467D95\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_467DA3\n\tloc_467D95:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_467DF6\n\tloc_467DA3:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_467DCE\n\tloc_467DB1:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467DB1\n\tloc_467DCE:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_467DE9\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_467DE9:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_467DA3\n\tloc_467DF6:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467E3D\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_467E2F\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tjmp\t\tloc_467E3D\n\tloc_467E2F:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_467E93\n\tloc_467E3D:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_467E68\n\tloc_467E4B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467E4B\n\tloc_467E68:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_467E83\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 2\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_467E83:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_467E3D\n\tloc_467E93:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_468867\n\tloc_467E99:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467EE0\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_467ED2\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_467EE0\n\tloc_467ED2:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_467F31\n\tloc_467EE0:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_467F09\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_467F26\n\tloc_467F09:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467F09\n\tloc_467F26:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_467EE0\n\tloc_467F31:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_467F43:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_467F53\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_467F6F\n\tloc_467F53:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_467F60:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_467F6A\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_467F6A:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467F60\n\t\tpop\t\tedx\n\tloc_467F6F:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_467F43\n\t\tjmp\t\tloc_468867\n\tloc_467F8A:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_467FD2\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_467FC4\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_467FD2\n\tloc_467FC4:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_468025\n\tloc_467FD2:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_467FFD\n\tloc_467FE0:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\txlat\n\t\tror\t\teax, 8\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_467FE0\n\tloc_467FFD:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_468018\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\txlat\n\t\tror\t\tax, 8\n\t\txlat\n\t\tror\t\tax, 8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_468018:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_467FD2\n\tloc_468025:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_468037:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468047\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46806A\n\tloc_468047:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_468054:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_46805E\n\t\txlat\n\t\tmov\t\t[edi], al\n\tloc_46805E:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468054\n\t\tmov\t\tebp, esi\n\t\tand\t\tebp, 2\n\t\tadd\t\tesi, ebp\n\t\tpop\t\tedx\n\tloc_46806A:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_468037\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_468867\n\tloc_468086:\n\t\tmov\t\tedx, 20h\n\tloc_46808B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46809B\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4680B6\n\tloc_46809B:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_4680A8:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_4680B1\n\t\tmov\t\t[edi], al\n\tloc_4680B1:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4680A8\n\t\tpop\t\tedx\n\tloc_4680B6:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_46808B\n\t\tjmp\t\tloc_468867\n\tloc_4680D1:\n\t\tmov\t\tecx, 20h\n\tloc_4680D6:\n\t\tpush\tecx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\teax, [eax]\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tmov\t\tedx, 20h\n\tloc_4680E8:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_468124\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468101\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_46811E\n\tloc_468101:\n\t\tmov\t\tecx, eax\n\t\tpush\tedx\n\t\tmov\t\tedx, gdwCurrentMask\n\tloc_46810A:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_468113\n\t\tmov\t\t[edi], al\n\tloc_468113:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46810A\n\t\tmov\t\tgdwCurrentMask, edx\n\t\tpop\t\tedx\n\tloc_46811E:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_468141\n\t\tjmp\t\tloc_4680E8\n\tloc_468124:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tmov\t\tecx, eax\n\t\tand\t\tecx, 1Fh\n\t\tjz\t\tloc_46813D\n\t\tmov\t\tebx, gdwCurrentMask\n\t\tshl\t\tebx, cl\n\t\tmov\t\tgdwCurrentMask, ebx\n\tloc_46813D:\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_4680E8\n\tloc_468141:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4680D6\n\t\tjmp\t\tloc_468867\n\tloc_468161:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4681A8\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_46819A\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_4681A8\n\tloc_46819A:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_4681DF\n\tloc_4681A8:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4681C7\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4681D4\n\tloc_4681C7:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4681C7\n\tloc_4681D4:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_4681A8\n\tloc_4681DF:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468229\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_468218\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tjmp\t\tloc_468229\n\tloc_468218:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_468867\n\tloc_468229:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_468248\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_468255\n\tloc_468248:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468248\n\tloc_468255:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_468229\n\t\tjmp\t\tloc_468867\n\tloc_468268:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4682B0\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_4682A2\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_4682B0\n\tloc_4682A2:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_4682E9\n\tloc_4682B0:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4682CB\n\tloc_4682BE:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4682BE\n\tloc_4682CB:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_4682DC\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_4682DC:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_4682B0\n\tloc_4682E9:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468330\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_468322\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tjmp\t\tloc_468330\n\tloc_468322:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_46836C\n\tloc_468330:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_46834B\n\tloc_46833E:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46833E\n\tloc_46834B:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_46835C\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_46835C:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_468330\n\tloc_46836C:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_468867\n\tloc_468372:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4683B9\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_4683AB\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_4683B9\n\tloc_4683AB:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_4683F0\n\tloc_4683B9:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4683D8\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4683E5\n\tloc_4683D8:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4683D8\n\tloc_4683E5:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_4683B9\n\tloc_4683F0:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_468402:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468412\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46842D\n\tloc_468412:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_46841F:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_468428\n\t\tmov\t\t[edi], al\n\tloc_468428:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46841F\n\t\tpop\t\tedx\n\tloc_46842D:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_468402\n\t\tjmp\t\tloc_468867\n\tloc_468448:\n\t\tpush\tebp\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468490\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_468482\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_468490\n\tloc_468482:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_4684C9\n\tloc_468490:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebp, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4684AB\n\tloc_46849E:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46849E\n\tloc_4684AB:\n\t\tand\t\tebp, 2\n\t\tjz\t\tloc_4684BC\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_4684BC:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_468490\n\tloc_4684C9:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_4684DB:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4684EB\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46850D\n\tloc_4684EB:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\tmov\t\tecx, 20h\n\tloc_4684F8:\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_468501\n\t\tmov\t\t[edi], al\n\tloc_468501:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4684F8\n\t\tmov\t\tebp, esi\n\t\tand\t\tebp, 2\n\t\tadd\t\tesi, ebp\n\t\tpop\t\tedx\n\tloc_46850D:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_4684DB\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_468867\n\tloc_468529:\n\t\tmov\t\tedx, 20h\n\tloc_46852E:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46853E\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_468558\n\tloc_46853E:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\txor\t\teax, eax\n\t\tmov\t\tecx, 20h\n\tloc_46854D:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_468553\n\t\tmov\t\t[edi], al\n\tloc_468553:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46854D\n\t\tpop\t\tedx\n\tloc_468558:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_46852E\n\t\tjmp\t\tloc_468867\n\tloc_468573:\n\t\tmov\t\tecx, 20h\n\tloc_468578:\n\t\tpush\tecx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\teax, [eax]\n\t\tmov\t\tgdwCurrentMask, eax\n\t\tmov\t\tedx, 20h\n\tloc_46858A:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_4685C7\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4685A3\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_4685C1\n\tloc_4685A3:\n\t\tmov\t\tecx, eax\n\t\tadd\t\tesi, ecx\n\t\tpush\tedx\n\t\tmov\t\tedx, gdwCurrentMask\n\t\txor\t\teax, eax\n\tloc_4685B0:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_4685B6\n\t\tmov\t\t[edi], al\n\tloc_4685B6:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4685B0\n\t\tmov\t\tgdwCurrentMask, edx\n\t\tpop\t\tedx\n\tloc_4685C1:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_4685E4\n\t\tjmp\t\tloc_46858A\n\tloc_4685C7:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tmov\t\tecx, eax\n\t\tand\t\tecx, 1Fh\n\t\tjz\t\tloc_4685E0\n\t\tmov\t\tebx, gdwCurrentMask\n\t\tshl\t\tebx, cl\n\t\tmov\t\tgdwCurrentMask, ebx\n\tloc_4685E0:\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_46858A\n\tloc_4685E4:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468578\n\t\tjmp\t\tloc_468867\n\tloc_468604:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_46860B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46861D\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46863D\n\tloc_46861D:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_468635\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46863D\n\tloc_468635:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468635\n\tloc_46863D:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_46864C\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46860B\n\tloc_46864C:\n\t\tmov\t\tedx, 2\n\tloc_468651:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468663\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_468683\n\tloc_468663:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46867B\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_468683\n\tloc_46867B:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46867B\n\tloc_468683:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_468651\n\t\tjmp\t\tloc_468867\n\tloc_468696:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_46869D:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4686B1\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_4686CF\n\tloc_4686B1:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4686C7\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4686CF\n\tloc_4686C7:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4686C7\n\tloc_4686CF:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_4686E0\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46869D\n\tloc_4686E0:\n\t\tmov\t\tedx, 2\n\tloc_4686E5:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4686F9\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_468717\n\tloc_4686F9:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46870F\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_468717\n\tloc_46870F:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46870F\n\tloc_468717:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_4686E5\n\t\tjmp\t\tloc_468867\n\tloc_46872C:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_468733:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468745\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_468765\n\tloc_468745:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46875D\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_468765\n\tloc_46875D:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46875D\n\tloc_468765:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_468774\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_468733\n\tloc_468774:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_468786:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468796\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4687B0\n\tloc_468796:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\txor\t\teax, eax\n\t\tmov\t\tecx, 20h\n\tloc_4687A5:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_4687AB\n\t\tmov\t\t[edi], al\n\tloc_4687AB:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4687A5\n\t\tpop\t\tedx\n\tloc_4687B0:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_468786\n\t\tjmp\t\tloc_468867\n\tloc_4687CB:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_4687D2:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4687E6\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_468804\n\tloc_4687E6:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4687FC\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_468804\n\tloc_4687FC:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4687FC\n\tloc_468804:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_468815\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_4687D2\n\tloc_468815:\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 40h\n\t\tmov\t\tgpDrawMask, eax\n\t\tmov\t\tedx, 10h\n\tloc_468827:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468837\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_468851\n\tloc_468837:\n\t\tpush\tedx\n\t\tmov\t\teax, gpDrawMask\n\t\tmov\t\tedx, [eax]\n\t\txor\t\teax, eax\n\t\tmov\t\tecx, 20h\n\tloc_468846:\n\t\tshl\t\tedx, 1\n\t\tjnb\t\tloc_46884C\n\t\tmov\t\t[edi], al\n\tloc_46884C:\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468846\n\t\tpop\t\tedx\n\tloc_468851:\n\t\tsub\t\tedi, 320h\n\t\tmov\t\teax, gpDrawMask\n\t\tsub\t\teax, 4\n\t\tmov\t\tgpDrawMask, eax\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_468827\n\tloc_468867:\n\t\tpop\t\tesi\n\t\tpop\t\tedi\n\t\tpop\t\tebx\n\t\tretn\n\t}\n}\n\n__declspec(naked) void drawLowerScreen(BYTE *pBuff)\n{\n\t__asm {\n\t\tpush\tebx\n\t\tpush\tedx\n\t\tpush\tedi\n\t\tpush\tesi\n\t\tmov\t\tedx, cel_transparency_active\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_468918\n\t\tmov\t\tdl, arch_draw_type\n\t\tcmp\t\tdl, 0\n\t\tjnz\t\tloc_468892\n\t\tcall\tdrawTopArchesLowerScreen\n\t\tjmp\t\tloc_4696B9\n\tloc_468892:\n\t\tcmp\t\tdl, 1\n\t\tjnz\t\tloc_4688D5\n\t\tmov\t\tebx, level_piece_id\n\t\tmov\t\tal, block_lvid[ebx]\n\t\tcmp\t\tal, 1\n\t\tjz\t\tloc_4688AD\n\t\tcmp\t\tal, 3\n\t\tjz\t\tloc_4688AD\n\t\tjmp\t\tloc_4688D5\n\tloc_4688AD:\n\t\tmov\t\tedx, offset LeftMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesLowerScreen\n\t\tjmp\t\tloc_4696B9\n\t\tcmp\t\tal, 4\n\t\tjnz\t\tloc_4688D5\n\t\tmov\t\tedx, offset RightMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesLowerScreen\n\t\tjmp\t\tloc_4696B9\n\tloc_4688D5:\n\t\tcmp\t\tdl, 2\n\t\tjnz\t\tloc_468918\n\t\tmov\t\tebx, level_piece_id\n\t\tmov\t\tal, block_lvid[ebx]\n\t\tcmp\t\tal, 2\n\t\tjz\t\tloc_4688F0\n\t\tcmp\t\tal, 3\n\t\tjz\t\tloc_4688F0\n\t\tjmp\t\tloc_468918\n\tloc_4688F0:\n\t\tmov\t\tedx, offset RightMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesLowerScreen\n\t\tjmp\t\tloc_4696B9\n\t\tcmp\t\tal, 4\n\t\tjnz\t\tloc_468918\n\t\tmov\t\tedx, offset LeftMask\n\t\tadd\t\tedx, 7Ch\n\t\tcall\tdrawBottomArchesLowerScreen\n\t\tjmp\t\tloc_4696B9\n\tloc_468918:\n\t\tmov\t\tedi, offset SpeedFrameTbl\n\t\tmov\t\tgpCelFrame, edi\n\t\tmov\t\tedi, ecx\n\t\tmov\t\teax, light_table_index\n\t\ttest\tal, al\n\t\tjz\t\tloc_468A1A\n\t\tcmp\t\tal, lightmax\n\t\tjz\t\tloc_468A78\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjnz\t\tloc_4689B0\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\tebx, light_table_index\n\t\tshl\t\tebx, 8\n\t\tadd\t\tebx, pLightTbl\n\t\tmov\t\teax, level_cel_block\n\t\tshr\t\teax, 0Ch\n\t\tand\t\teax, 0Fh\n\t\tjz\t\tloc_468B03\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_468B5B\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_468C06\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_468CEC\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_468DD2\n\t\tjmp\t\tloc_468EE2\n\tloc_4689B0:\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 4\n\t\tadd\t\teax, light_table_index\n\t\tshl\t\teax, 2\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, [esi]\n\t\tmov\t\tesi, pSpeedCels\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tshr\t\teax, 0Ch\n\t\tand\t\teax, 0Fh\n\tloc_4689E3:\n\t\tcmp\t\tax, 8\n\t\tjz\t\tloc_468FF2\n\t\tcmp\t\tax, 9\n\t\tjz\t\tloc_469027\n\t\tcmp\t\tax, 0Ah\n\t\tjz\t\tloc_469099\n\t\tcmp\t\tax, 0Bh\n\t\tjz\t\tloc_46919D\n\t\tcmp\t\tax, 0Ch\n\t\tjz\t\tloc_4692A5\n\t\tjmp\t\tloc_469358\n\tloc_468A1A:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_468A4C\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_468A4C:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tshr\t\teax, 0Ch\n\t\tand\t\teax, 7\n\t\tadd\t\teax, 8\n\t\tjmp\t\tloc_4689E3\n\tloc_468A78:\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 8000h\n\t\tjz\t\tloc_468AAA\n\t\tmov\t\tesi, gpCelFrame\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 6\n\t\tadd\t\tesi, eax\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0F000h\n\t\tadd\t\teax, [esi]\n\t\tmov\t\tlevel_cel_block, eax\n\tloc_468AAA:\n\t\tmov\t\tebx, pDungeonCels\n\t\tmov\t\tesi, ebx\n\t\tmov\t\teax, level_cel_block\n\t\tand\t\teax, 0FFFh\n\t\tshl\t\teax, 2\n\t\tadd\t\tebx, eax\n\t\tadd\t\tesi, [ebx]\n\t\tmov\t\teax, level_cel_block\n\t\tmov\t\tal, ah\n\t\tshr\t\teax, 4\n\t\tand\t\teax, 7\n\t\tjz\t\tloc_46940D\n\t\tcmp\t\tax, 1\n\t\tjz\t\tloc_46943F\n\t\tcmp\t\tax, 2\n\t\tjz\t\tloc_4694A7\n\t\tcmp\t\tax, 3\n\t\tjz\t\tloc_469539\n\t\tcmp\t\tax, 4\n\t\tjz\t\tloc_4695CF\n\t\tjmp\t\tloc_469644\n\tloc_468B03:\n\t\tmov\t\tedx, 20h\n\t\tpush\tebp\n\tloc_468B09:\n\t\tpush\tedx\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468B1A\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_468B4B\n\tloc_468B1A:\n\t\txor\t\tedx, edx\n\t\tmov\t\tebp, 8\n\tloc_468B21:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tror\t\teax, 10h\n\t\tmov\t\tdl, al\n\t\tmov\t\tcl, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\tch, [ebx+edx]\n\t\tror\t\teax, 10h\n\t\tshl\t\tecx, 10h\n\t\tmov\t\tdl, al\n\t\tmov\t\tcl, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ecx\n\t\tadd\t\tedi, 4\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_468B21\n\tloc_468B4B:\n\t\tsub\t\tedi, 320h\n\t\tpop\t\tedx\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_468B09\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4696B9\n\tloc_468B5B:\n\t\tpush\tebp\n\t\tmov\t\tecx, 20h\n\tloc_468B61:\n\t\tpush\tecx\n\t\tmov\t\tebp, 20h\n\tloc_468B67:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjns\t\tloc_468B78\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tebp, eax\n\t\tjmp\t\tloc_468BEA\n\tloc_468B78:\n\t\tsub\t\tebp, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468B88\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_468BEA\n\tloc_468B88:\n\t\tmov\t\tecx, eax\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_468BC1\n\tloc_468B8F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_468B8F\n\tloc_468BC1:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_468BDC\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_468BDC:\n\t\tand\t\tcl, 1\n\t\tjz\t\tloc_468BEA\n\t\tmov\t\tdl, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\tloc_468BEA:\n\t\ttest\tebp, ebp\n\t\tjnz\t\tloc_468B67\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468B61\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4696B9\n\tloc_468C06:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468C4E\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_468C40\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tjmp\t\tloc_468C4E\n\tloc_468C40:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_468C75\n\tloc_468C4E:\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\tloc_468C5E:\n\t\tmov\t\tdl, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468C5E\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_468C4E\n\tloc_468C75:\n\t\tmov\t\tebp, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468CBC\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_468CAE\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tebp, ecx\n\t\tjmp\t\tloc_468CBC\n\tloc_468CAE:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_468CE6\n\tloc_468CBC:\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\tloc_468CCC:\n\t\tmov\t\tdl, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468CCC\n\t\tadd\t\tebp, 2\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_468CBC\n\tloc_468CE6:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4696B9\n\tloc_468CEC:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468D34\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_468D26\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tjmp\t\tloc_468D34\n\tloc_468D26:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_468D5B\n\tloc_468D34:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\tloc_468D3B:\n\t\tmov\t\tdl, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468D3B\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_468D34\n\tloc_468D5B:\n\t\tmov\t\tebp, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468DA2\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_468D94\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tebp, ecx\n\t\tjmp\t\tloc_468DA2\n\tloc_468D94:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_468DCC\n\tloc_468DA2:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\tloc_468DA9:\n\t\tmov\t\tdl, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\tdl, [ebx+edx]\n\t\tmov\t\t[edi], dl\n\t\tinc\t\tedi\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_468DA9\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tadd\t\tebp, 2\n\t\tcmp\t\tebp, 20h\n\t\tjnz\t\tloc_468DA2\n\tloc_468DCC:\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4696B9\n\tloc_468DD2:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468E1A\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_468E0C\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tjmp\t\tloc_468E1A\n\tloc_468E0C:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_468E87\n\tloc_468E1A:\n\t\tadd\t\tedi, ebp\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tmov\t\tedx, ecx\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_468E61\n\tloc_468E2F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_468E2F\n\tloc_468E61:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_468E7C\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_468E7C:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_468E1A\n\tloc_468E87:\n\t\tmov\t\tebp, 10h\n\tloc_468E8C:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468E9C\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_468ED3\n\tloc_468E9C:\n\t\tmov\t\tecx, 20h\n\tloc_468EA1:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_468EA1\n\tloc_468ED3:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_468E8C\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4696B9\n\tloc_468EE2:\n\t\tpush\tebp\n\t\tmov\t\tebp, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_468F2A\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_468F1C\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tebp, ecx\n\t\tjmp\t\tloc_468F2A\n\tloc_468F1C:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_468F97\n\tloc_468F2A:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, ebp\n\t\tcmp\t\tcl, 4\n\t\tjl\t\tloc_468F68\n\tloc_468F36:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_468F36\n\tloc_468F68:\n\t\tcmp\t\tcl, 2\n\t\tjl\t\tloc_468F83\n\t\tmov\t\tdl, [esi]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tdl, [esi+1]\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+1], ch\n\t\tadd\t\tesi, 2\n\t\tadd\t\tedi, 2\n\tloc_468F83:\n\t\tmov\t\tedx, esi\n\t\tand\t\tedx, 2\n\t\tadd\t\tesi, edx\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, ebp\n\t\tsub\t\tebp, 2\n\t\tjge\t\tloc_468F2A\n\tloc_468F97:\n\t\tmov\t\tebp, 10h\n\tloc_468F9C:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_468FAC\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_468FE3\n\tloc_468FAC:\n\t\tmov\t\tecx, 20h\n\tloc_468FB1:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\tdl, al\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tror\t\teax, 10h\n\t\tmov\t\t[edi], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, al\n\t\tmov\t\t[edi+1], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\tdl, ah\n\t\tmov\t\t[edi+2], ch\n\t\tmov\t\tch, [ebx+edx]\n\t\tmov\t\t[edi+3], ch\n\t\tadd\t\tedi, 4\n\t\tsub\t\tcl, 4\n\t\tcmp\t\tcl, 4\n\t\tjge\t\tloc_468FB1\n\tloc_468FE3:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tebp\n\t\tjnz\t\tloc_468F9C\n\t\tpop\t\tebp\n\t\tjmp\t\tloc_4696B9\n\tloc_468FF2:\n\t\tmov\t\tedx, 20h\n\tloc_468FF7:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_469007\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_469019\n\tloc_469007:\n\t\tmov\t\tecx, 8\n\tloc_46900C:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46900C\n\tloc_469019:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_468FF7\n\t\tjmp\t\tloc_4696B9\n\tloc_469027:\n\t\tmov\t\tecx, 20h\n\tloc_46902C:\n\t\tpush\tecx\n\t\tmov\t\tedx, 20h\n\tloc_469032:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_469082\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46904B\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_46907C\n\tloc_46904B:\n\t\tmov\t\tecx, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46905B\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46907C\n\tloc_46905B:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_46906F\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 2\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46907C\n\tloc_46906F:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46906F\n\tloc_46907C:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_46908A\n\t\tjmp\t\tloc_469032\n\tloc_469082:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_469032\n\tloc_46908A:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46902C\n\t\tjmp\t\tloc_4696B9\n\tloc_469099:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4690E0\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_4690D2\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_4690E0\n\tloc_4690D2:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_469117\n\tloc_4690E0:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4690FF\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46910C\n\tloc_4690FF:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4690FF\n\tloc_46910C:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_4690E0\n\tloc_469117:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_46915E\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_469150\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tjmp\t\tloc_46915E\n\tloc_469150:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_469198\n\tloc_46915E:\n\t\tmov\t\tecx, 20h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46917D\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46918A\n\tloc_46917D:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46917D\n\tloc_46918A:\n\t\tadd\t\tedx, 2\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedx, 20h\n\t\tjl\t\tloc_46915E\n\tloc_469198:\n\t\tjmp\t\tloc_4696B9\n\tloc_46919D:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4691E4\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_4691D6\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_4691E4\n\tloc_4691D6:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_46921D\n\tloc_4691E4:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebx, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4691FF\n\tloc_4691F2:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4691F2\n\tloc_4691FF:\n\t\tand\t\tebx, 2\n\t\tjz\t\tloc_469210\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_469210:\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_4691E4\n\tloc_46921D:\n\t\tmov\t\tedx, 2\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_469264\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Ah\n\t\tjg\t\tloc_469256\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_2[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tadd\t\tedx, ecx\n\t\tjmp\t\tloc_469264\n\tloc_469256:\n\t\tsub\t\tedi, 2D00h\n\t\tadd\t\tesi, 100h\n\t\tjmp\t\tloc_4692A0\n\tloc_469264:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebx, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_46927F\n\tloc_469272:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_469272\n\tloc_46927F:\n\t\tand\t\tebx, 2\n\t\tjz\t\tloc_469290\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_469290:\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tsub\t\tedi, 320h\n\t\tcmp\t\tedx, 20h\n\t\tjl\t\tloc_469264\n\tloc_4692A0:\n\t\tjmp\t\tloc_4696B9\n\tloc_4692A5:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_4692EC\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_4692DE\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_4692EC\n\tloc_4692DE:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_469323\n\tloc_4692EC:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46930B\n\t\tmov\t\tax, [esi+2]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_469318\n\tloc_46930B:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46930B\n\tloc_469318:\n\t\tsub\t\tedi, 320h\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_4692EC\n\tloc_469323:\n\t\tmov\t\tedx, 10h\n\tloc_469328:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_469338\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_46934A\n\tloc_469338:\n\t\tmov\t\tecx, 8\n\tloc_46933D:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46933D\n\tloc_46934A:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_469328\n\t\tjmp\t\tloc_4696B9\n\tloc_469358:\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\teax, edi\n\t\tsub\t\teax, gpBufEnd\n\t\tjb\t\tloc_46939F\n\t\tadd\t\teax, 3FFh\n\t\tshr\t\teax, 8\n\t\tcmp\t\teax, 2Dh\n\t\tjg\t\tloc_469391\n\t\tmov\t\tecx, WorldTbl3x16[eax*4]\n\t\tmov\t\teax, ecx\n\t\tadd\t\tesi, WorldTbl17_1[ecx]\n\t\tshl\t\teax, 6\n\t\tlea\t\teax, [eax+eax*2]\n\t\tshr\t\tecx, 1\n\t\tsub\t\tedi, eax\n\t\tsub\t\tedx, ecx\n\t\tjmp\t\tloc_46939F\n\tloc_469391:\n\t\tsub\t\tedi, 3000h\n\t\tadd\t\tesi, 120h\n\t\tjmp\t\tloc_4693D8\n\tloc_46939F:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tmov\t\tebx, ecx\n\t\tshr\t\tecx, 2\n\t\tjz\t\tloc_4693BA\n\tloc_4693AD:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4693AD\n\tloc_4693BA:\n\t\tand\t\tebx, 2\n\t\tjz\t\tloc_4693CB\n\t\tmov\t\tax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\tloc_4693CB:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjge\t\tloc_46939F\n\tloc_4693D8:\n\t\tmov\t\tedx, 10h\n\tloc_4693DD:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4693ED\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4693FF\n\tloc_4693ED:\n\t\tmov\t\tecx, 8\n\tloc_4693F2:\n\t\tmov\t\teax, [esi]\n\t\tadd\t\tesi, 4\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4693F2\n\tloc_4693FF:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_4693DD\n\t\tjmp\t\tloc_4696B9\n\tloc_46940D:\n\t\tmov\t\tedx, 20h\n\t\txor\t\teax, eax\n\tloc_469414:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_469424\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_469431\n\tloc_469424:\n\t\tmov\t\tecx, 8\n\tloc_469429:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_469429\n\tloc_469431:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_469414\n\t\tjmp\t\tloc_4696B9\n\tloc_46943F:\n\t\tmov\t\tecx, 20h\n\tloc_469444:\n\t\tpush\tecx\n\t\tmov\t\tedx, 20h\n\tloc_46944A:\n\t\txor\t\teax, eax\n\t\tmov\t\tal, [esi]\n\t\tinc\t\tesi\n\t\ttest\tal, al\n\t\tjs\t\tloc_469490\n\t\tsub\t\tedx, eax\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_469463\n\t\tadd\t\tesi, eax\n\t\tadd\t\tedi, eax\n\t\tjmp\t\tloc_46948A\n\tloc_469463:\n\t\tmov\t\tecx, eax\n\t\tadd\t\tesi, ecx\n\t\txor\t\teax, eax\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_469474\n\t\tmov\t\t[edi], al\n\t\tinc\t\tedi\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46948A\n\tloc_469474:\n\t\tshr\t\tecx, 1\n\t\tjnb\t\tloc_469482\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46948A\n\tloc_469482:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_469482\n\tloc_46948A:\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_469498\n\t\tjmp\t\tloc_46944A\n\tloc_469490:\n\t\tneg\t\tal\n\t\tadd\t\tedi, eax\n\t\tsub\t\tedx, eax\n\t\tjnz\t\tloc_46944A\n\tloc_469498:\n\t\tpop\t\tecx\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_469444\n\t\tjmp\t\tloc_4696B9\n\tloc_4694A7:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_4694AE:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4694C0\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4694E0\n\tloc_4694C0:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4694D8\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4694E0\n\tloc_4694D8:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4694D8\n\tloc_4694E0:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_4694EF\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_4694AE\n\tloc_4694EF:\n\t\tmov\t\tedx, 2\n\tloc_4694F4:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_469506\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_469526\n\tloc_469506:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46951E\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_469526\n\tloc_46951E:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46951E\n\tloc_469526:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_4694F4\n\t\tjmp\t\tloc_4696B9\n\tloc_469539:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_469540:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_469554\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_469572\n\tloc_469554:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_46956A\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_469572\n\tloc_46956A:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_46956A\n\tloc_469572:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_469583\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_469540\n\tloc_469583:\n\t\tmov\t\tedx, 2\n\tloc_469588:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46959C\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_4695BA\n\tloc_46959C:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_4695B2\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_4695BA\n\tloc_4695B2:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4695B2\n\tloc_4695BA:\n\t\tsub\t\tedi, 320h\n\t\tadd\t\tedi, edx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_469588\n\t\tjmp\t\tloc_4696B9\n\tloc_4695CF:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_4695D6:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4695E8\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_469608\n\tloc_4695E8:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_469600\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_469608\n\tloc_469600:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_469600\n\tloc_469608:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_469617\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_4695D6\n\tloc_469617:\n\t\tmov\t\tedx, 10h\n\tloc_46961C:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46962C\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_469639\n\tloc_46962C:\n\t\tmov\t\tecx, 8\n\tloc_469631:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_469631\n\tloc_469639:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_46961C\n\t\tjmp\t\tloc_4696B9\n\tloc_469644:\n\t\tmov\t\tedx, 1Eh\n\t\txor\t\teax, eax\n\tloc_46964B:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_46965F\n\t\tadd\t\tesi, 20h\n\t\tsub\t\tesi, edx\n\t\tadd\t\tedi, 20h\n\t\tsub\t\tedi, edx\n\t\tjmp\t\tloc_46967D\n\tloc_46965F:\n\t\tmov\t\tecx, 20h\n\t\tsub\t\tecx, edx\n\t\tshr\t\tecx, 2\n\t\tjnb\t\tloc_469675\n\t\tmov\t\t[edi], ax\n\t\tadd\t\tedi, 2\n\t\ttest\tecx, ecx\n\t\tjz\t\tloc_46967D\n\tloc_469675:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_469675\n\tloc_46967D:\n\t\tsub\t\tedi, 320h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_46968E\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedx, 2\n\t\tjmp\t\tloc_46964B\n\tloc_46968E:\n\t\tmov\t\tedx, 10h\n\tloc_469693:\n\t\tcmp\t\tedi, gpBufEnd\n\t\tjb\t\tloc_4696A3\n\t\tadd\t\tesi, 20h\n\t\tadd\t\tedi, 20h\n\t\tjmp\t\tloc_4696B0\n\tloc_4696A3:\n\t\tmov\t\tecx, 8\n\tloc_4696A8:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4696A8\n\tloc_4696B0:\n\t\tsub\t\tedi, 320h\n\t\tdec\t\tedx\n\t\tjnz\t\tloc_469693\n\tloc_4696B9:\n\t\tpop\t\tesi\n\t\tpop\t\tedi\n\t\tpop\t\tedx\n\t\tpop\t\tebx\n\t\tretn\n\t}\n}\n\n__declspec(naked) void world_draw_black_tile(BYTE *pBuff)\n{\n\t__asm {\n\t\tpush\tebx\n\t\tpush\tedx\n\t\tpush\tedi\n\t\tpush\tesi\n\t\tmov\t\tedi, ecx\n\t\tmov\t\tedx, 1Eh\n\t\tmov\t\tebx, 1\n\t\txor\t\teax, eax\n\tloc_4696D0:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, ebx\n\tloc_4696D4:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4696D4\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedi, 340h\n\t\ttest\tedx, edx\n\t\tjz\t\tloc_4696EE\n\t\tsub\t\tedx, 2\n\t\tinc\t\tebx\n\t\tjmp\t\tloc_4696D0\n\tloc_4696EE:\n\t\tmov\t\tedx, 2\n\t\tmov\t\tebx, 0Fh\n\tloc_4696F8:\n\t\tadd\t\tedi, edx\n\t\tmov\t\tecx, ebx\n\tloc_4696FC:\n\t\tmov\t\t[edi], eax\n\t\tadd\t\tedi, 4\n\t\tdec\t\tecx\n\t\tjnz\t\tloc_4696FC\n\t\tadd\t\tedi, edx\n\t\tsub\t\tedi, 340h\n\t\tdec\t\tebx\n\t\tadd\t\tedx, 2\n\t\tcmp\t\tedx, 20h\n\t\tjnz\t\tloc_4696F8\n\t\tpop\t\tesi\n\t\tpop\t\tedi\n\t\tpop\t\tedx\n\t\tpop\t\tebx\n\t\tretn\n\t}\n}\n"
  },
  {
    "path": "Source/all.h",
    "content": "/**\r\n * @file all.h\r\n *\r\n * Include all application headers.\r\n */\r\n#ifndef __ALL_H__\r\n#define __ALL_H__\r\n\r\n#include \"../types.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n#include \"appfat.h\"\r\n#include \"automap.h\"\r\n#include \"capture.h\"\r\n#include \"codec.h\"\r\n#include \"control.h\"\r\n#include \"cursor.h\"\r\n#include \"dead.h\"\r\n#include \"debug.h\"\r\n#include \"diablo.h\"\r\n#include \"doom.h\"\r\n#include \"drlg_l1.h\"\r\n#include \"drlg_l2.h\"\r\n#include \"drlg_l3.h\"\r\n#include \"drlg_l4.h\"\r\n#include \"dthread.h\"\r\n#include \"dx.h\"\r\n#include \"effects.h\"\r\n#include \"encrypt.h\"\r\n#include \"engine.h\"\r\n#include \"error.h\"\r\n#include \"fault.h\"\r\n#include \"gamemenu.h\"\r\n#include \"gendung.h\"\r\n#include \"gmenu.h\"\r\n#include \"help.h\"\r\n#include \"init.h\"\r\n#include \"interfac.h\"\r\n#include \"inv.h\"\r\n#include \"itemdat.h\"\r\n#include \"items.h\"\r\n#include \"lighting.h\"\r\n#include \"loadsave.h\"\r\n#include \"logging.h\"\r\n#include \"mainmenu.h\"\r\n#include \"minitext.h\"\r\n#include \"misdat.h\"\r\n#include \"missiles.h\"\r\n#include \"monstdat.h\"\r\n#include \"monster.h\"\r\n#include \"movie.h\"\r\n#include \"mpqapi.h\"\r\n#include \"msg.h\"\r\n#include \"msgcmd.h\"\r\n#include \"multi.h\"\r\n#include \"nthread.h\"\r\n#include \"objdat.h\"\r\n#include \"objects.h\"\r\n#include \"pack.h\"\r\n#include \"palette.h\"\r\n#include \"path.h\"\r\n#include \"pfile.h\"\r\n#include \"player.h\"\r\n#include \"plrmsg.h\"\r\n#include \"portal.h\"\r\n#include \"quests.h\"\r\n#include \"restrict.h\"\r\n#include \"scrollrt.h\"\r\n#include \"setmaps.h\"\r\n#include \"sha.h\"\r\n#include \"sound.h\"\r\n#include \"spelldat.h\"\r\n#include \"spells.h\"\r\n#include \"stores.h\"\r\n#include \"sync.h\"\r\n#include \"textdat.h\" // check file name\r\n#include \"themes.h\"\r\n#include \"tmsg.h\"\r\n#include \"town.h\"\r\n#include \"towners.h\"\r\n#include \"track.h\"\r\n#include \"trigs.h\"\r\n#include \"wave.h\"\r\n#include \"render.h\" // linked last, likely .s/.asm\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* __ALL_H__ */\r\n"
  },
  {
    "path": "Source/appfat.cpp",
    "content": "/**\r\n * @file appfat.cpp\r\n *\r\n * Implementation of error dialogs.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n/** Buffer used by GetErrorStr for its return value */\r\nchar sz_error_buf[256];\r\n/** Set to true when a fatal error is encountered and the application should shut down. */\r\nBOOL terminating;\r\n/** Thread id of the last callee to FreeDlg(). */\r\nint cleanup_thread_id;\r\n\r\n// delete overloads the delete operator.\r\nvoid __cdecl operator delete(void *ptr)\r\n{\r\n\tif (ptr != NULL) {\r\n\t\tSMemFree(ptr, \"delete\", -1, 0);\r\n\t}\r\n}\r\n\r\n#ifdef _DEBUG\r\nstatic LONG __stdcall BreakFilter(PEXCEPTION_POINTERS pExc)\r\n{\r\n\tif (pExc->ExceptionRecord == NULL) {\r\n\t\treturn EXCEPTION_CONTINUE_SEARCH;\r\n\t}\r\n\tif (pExc->ExceptionRecord->ExceptionCode != EXCEPTION_BREAKPOINT) {\r\n\t\treturn EXCEPTION_CONTINUE_SEARCH;\r\n\t}\r\n\r\n\tif (((BYTE *)pExc->ContextRecord->Eip)[0] == 0xCC) { // int 3\r\n\t\tpExc->ContextRecord->Eip++;\r\n\t}\r\n\r\n\treturn EXCEPTION_CONTINUE_EXECUTION;\r\n}\r\n#endif\r\n\r\nvoid TriggerBreak()\r\n{\r\n#ifdef _DEBUG\r\n\tLPTOP_LEVEL_EXCEPTION_FILTER pFilter;\r\n\r\n\tpFilter = SetUnhandledExceptionFilter(BreakFilter);\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tint\t\t3\r\n\t}\r\n#else\r\n\t__debugbreak();\r\n#endif\r\n\tSetUnhandledExceptionFilter(pFilter);\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Generate a textual message for DirectDraw error codes\r\n * @param hError DirectDraw error code\r\n * @param pszBuffer Buffer for the error message\r\n * @param dwMaxChars Length of pszBuffer\r\n */\r\nstatic void TraceErrorDD(HRESULT hError, char *pszBuffer, DWORD dwMaxChars)\r\n{\r\n\tconst char *szError;\r\n\r\n\tswitch (hError) {\r\n\tcase DD_OK:\r\n\t\tszError = \"DD_OK\";\r\n\t\tbreak;\r\n\tcase DDERR_ALREADYINITIALIZED:\r\n\t\tszError = \"DDERR_ALREADYINITIALIZED\";\r\n\t\tbreak;\r\n\tcase DDERR_BLTFASTCANTCLIP:\r\n\t\tszError = \"DDERR_BLTFASTCANTCLIP\";\r\n\t\tbreak;\r\n\tcase DDERR_CANNOTATTACHSURFACE:\r\n\t\tszError = \"DDERR_CANNOTATTACHSURFACE\";\r\n\t\tbreak;\r\n\tcase DDERR_CANNOTDETACHSURFACE:\r\n\t\tszError = \"DDERR_CANNOTDETACHSURFACE\";\r\n\t\tbreak;\r\n\tcase DDERR_CANTCREATEDC:\r\n\t\tszError = \"DDERR_CANTCREATEDC\";\r\n\t\tbreak;\r\n\tcase DDERR_CANTDUPLICATE:\r\n\t\tszError = \"DDERR_CANTDUPLICATE\";\r\n\t\tbreak;\r\n\tcase DDERR_CLIPPERISUSINGHWND:\r\n\t\tszError = \"DDERR_CLIPPERISUSINGHWND\";\r\n\t\tbreak;\r\n\tcase DDERR_COLORKEYNOTSET:\r\n\t\tszError = \"DDERR_COLORKEYNOTSET\";\r\n\t\tbreak;\r\n\tcase DDERR_CURRENTLYNOTAVAIL:\r\n\t\tszError = \"DDERR_CURRENTLYNOTAVAIL\";\r\n\t\tbreak;\r\n\tcase DDERR_DIRECTDRAWALREADYCREATED:\r\n\t\tszError = \"DDERR_DIRECTDRAWALREADYCREATED\";\r\n\t\tbreak;\r\n\tcase DDERR_EXCEPTION:\r\n\t\tszError = \"DDERR_EXCEPTION\";\r\n\t\tbreak;\r\n\tcase DDERR_EXCLUSIVEMODEALREADYSET:\r\n\t\tszError = \"DDERR_EXCLUSIVEMODEALREADYSET\";\r\n\t\tbreak;\r\n\tcase DDERR_GENERIC:\r\n\t\tszError = \"DDERR_GENERIC\";\r\n\t\tbreak;\r\n\tcase DDERR_HEIGHTALIGN:\r\n\t\tszError = \"DDERR_HEIGHTALIGN\";\r\n\t\tbreak;\r\n\tcase DDERR_HWNDALREADYSET:\r\n\t\tszError = \"DDERR_HWNDALREADYSET\";\r\n\t\tbreak;\r\n\tcase DDERR_HWNDSUBCLASSED:\r\n\t\tszError = \"DDERR_HWNDSUBCLASSED\";\r\n\t\tbreak;\r\n\tcase DDERR_IMPLICITLYCREATED:\r\n\t\tszError = \"DDERR_IMPLICITLYCREATED\";\r\n\t\tbreak;\r\n\tcase DDERR_INCOMPATIBLEPRIMARY:\r\n\t\tszError = \"DDERR_INCOMPATIBLEPRIMARY\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDCAPS:\r\n\t\tszError = \"DDERR_INVALIDCAPS\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDCLIPLIST:\r\n\t\tszError = \"DDERR_INVALIDCLIPLIST\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDDIRECTDRAWGUID:\r\n\t\tszError = \"DDERR_INVALIDDIRECTDRAWGUID\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDMODE:\r\n\t\tszError = \"DDERR_INVALIDMODE\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDOBJECT:\r\n\t\tszError = \"DDERR_INVALIDOBJECT\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDPARAMS:\r\n\t\tszError = \"DDERR_INVALIDPARAMS\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDPIXELFORMAT:\r\n\t\tszError = \"DDERR_INVALIDPIXELFORMAT\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDPOSITION:\r\n\t\tszError = \"DDERR_INVALIDPOSITION\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDRECT:\r\n\t\tszError = \"DDERR_INVALIDRECT\";\r\n\t\tbreak;\r\n\tcase DDERR_LOCKEDSURFACES:\r\n\t\tszError = \"DDERR_LOCKEDSURFACES\";\r\n\t\tbreak;\r\n\tcase DDERR_NO3D:\r\n\t\tszError = \"DDERR_NO3D\";\r\n\t\tbreak;\r\n\tcase DDERR_NOALPHAHW:\r\n\t\tszError = \"DDERR_NOALPHAHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOBLTHW:\r\n\t\tszError = \"DDERR_NOBLTHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOCLIPLIST:\r\n\t\tszError = \"DDERR_NOCLIPLIST\";\r\n\t\tbreak;\r\n\tcase DDERR_NOCLIPPERATTACHED:\r\n\t\tszError = \"DDERR_NOCLIPPERATTACHED\";\r\n\t\tbreak;\r\n\tcase DDERR_NOCOLORCONVHW:\r\n\t\tszError = \"DDERR_NOCOLORCONVHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOCOLORKEY:\r\n\t\tszError = \"DDERR_NOCOLORKEY\";\r\n\t\tbreak;\r\n\tcase DDERR_NOCOLORKEYHW:\r\n\t\tszError = \"DDERR_NOCOLORKEYHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOCOOPERATIVELEVELSET:\r\n\t\tszError = \"DDERR_NOCOOPERATIVELEVELSET\";\r\n\t\tbreak;\r\n\tcase DDERR_NODC:\r\n\t\tszError = \"DDERR_NODC\";\r\n\t\tbreak;\r\n\tcase DDERR_NODDROPSHW:\r\n\t\tszError = \"DDERR_NODDROPSHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NODIRECTDRAWHW:\r\n\t\tszError = \"DDERR_NODIRECTDRAWHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOEMULATION:\r\n\t\tszError = \"DDERR_NOEMULATION\";\r\n\t\tbreak;\r\n\tcase DDERR_NOEXCLUSIVEMODE:\r\n\t\tszError = \"DDERR_NOEXCLUSIVEMODE\";\r\n\t\tbreak;\r\n\tcase DDERR_NOFLIPHW:\r\n\t\tszError = \"DDERR_NOFLIPHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOGDI:\r\n\t\tszError = \"DDERR_NOGDI\";\r\n\t\tbreak;\r\n\tcase DDERR_NOHWND:\r\n\t\tszError = \"DDERR_NOHWND\";\r\n\t\tbreak;\r\n\tcase DDERR_NOMIRRORHW:\r\n\t\tszError = \"DDERR_NOMIRRORHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOOVERLAYDEST:\r\n\t\tszError = \"DDERR_NOOVERLAYDEST\";\r\n\t\tbreak;\r\n\tcase DDERR_NOOVERLAYHW:\r\n\t\tszError = \"DDERR_NOOVERLAYHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOPALETTEATTACHED:\r\n\t\tszError = \"DDERR_NOPALETTEATTACHED\";\r\n\t\tbreak;\r\n\tcase DDERR_NOPALETTEHW:\r\n\t\tszError = \"DDERR_NOPALETTEHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NORASTEROPHW:\r\n\t\tszError = \"DDERR_NORASTEROPHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOROTATIONHW:\r\n\t\tszError = \"DDERR_NOROTATIONHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOSTRETCHHW:\r\n\t\tszError = \"DDERR_NOSTRETCHHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOT4BITCOLOR:\r\n\t\tszError = \"DDERR_NOT4BITCOLOR\";\r\n\t\tbreak;\r\n\tcase DDERR_NOT4BITCOLORINDEX:\r\n\t\tszError = \"DDERR_NOT4BITCOLORINDEX\";\r\n\t\tbreak;\r\n\tcase DDERR_NOT8BITCOLOR:\r\n\t\tszError = \"DDERR_NOT8BITCOLOR\";\r\n\t\tbreak;\r\n\tcase DDERR_NOTAOVERLAYSURFACE:\r\n\t\tszError = \"DDERR_NOTAOVERLAYSURFACE\";\r\n\t\tbreak;\r\n\tcase DDERR_NOTEXTUREHW:\r\n\t\tszError = \"DDERR_NOTEXTUREHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOTFLIPPABLE:\r\n\t\tszError = \"DDERR_NOTFLIPPABLE\";\r\n\t\tbreak;\r\n\tcase DDERR_NOTFOUND:\r\n\t\tszError = \"DDERR_NOTFOUND\";\r\n\t\tbreak;\r\n\tcase DDERR_NOTLOCKED:\r\n\t\tszError = \"DDERR_NOTLOCKED\";\r\n\t\tbreak;\r\n\tcase DDERR_NOTPALETTIZED:\r\n\t\tszError = \"DDERR_NOTPALETTIZED\";\r\n\t\tbreak;\r\n\tcase DDERR_NOVSYNCHW:\r\n\t\tszError = \"DDERR_NOVSYNCHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOZBUFFERHW:\r\n\t\tszError = \"DDERR_NOZBUFFERHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOZOVERLAYHW:\r\n\t\tszError = \"DDERR_NOZOVERLAYHW\";\r\n\t\tbreak;\r\n\tcase DDERR_OUTOFCAPS:\r\n\t\tszError = \"DDERR_OUTOFCAPS\";\r\n\t\tbreak;\r\n\tcase DDERR_OUTOFMEMORY:\r\n\t\tszError = \"DDERR_OUTOFMEMORY\";\r\n\t\tbreak;\r\n\tcase DDERR_OUTOFVIDEOMEMORY:\r\n\t\tszError = \"DDERR_OUTOFVIDEOMEMORY\";\r\n\t\tbreak;\r\n\tcase DDERR_OVERLAYCANTCLIP:\r\n\t\tszError = \"DDERR_OVERLAYCANTCLIP\";\r\n\t\tbreak;\r\n\tcase DDERR_OVERLAYCOLORKEYONLYONEACTIVE:\r\n\t\tszError = \"DDERR_OVERLAYCOLORKEYONLYONEACTIVE\";\r\n\t\tbreak;\r\n\tcase DDERR_OVERLAYNOTVISIBLE:\r\n\t\tszError = \"DDERR_OVERLAYNOTVISIBLE\";\r\n\t\tbreak;\r\n\tcase DDERR_PALETTEBUSY:\r\n\t\tszError = \"DDERR_PALETTEBUSY\";\r\n\t\tbreak;\r\n\tcase DDERR_PRIMARYSURFACEALREADYEXISTS:\r\n\t\tszError = \"DDERR_PRIMARYSURFACEALREADYEXISTS\";\r\n\t\tbreak;\r\n\tcase DDERR_REGIONTOOSMALL:\r\n\t\tszError = \"DDERR_REGIONTOOSMALL\";\r\n\t\tbreak;\r\n\tcase DDERR_SURFACEALREADYATTACHED:\r\n\t\tszError = \"DDERR_SURFACEALREADYATTACHED\";\r\n\t\tbreak;\r\n\tcase DDERR_SURFACEALREADYDEPENDENT:\r\n\t\tszError = \"DDERR_SURFACEALREADYDEPENDENT\";\r\n\t\tbreak;\r\n\tcase DDERR_SURFACEBUSY:\r\n\t\tszError = \"DDERR_SURFACEBUSY\";\r\n\t\tbreak;\r\n\tcase DDERR_SURFACEISOBSCURED:\r\n\t\tszError = \"DDERR_SURFACEISOBSCURED\";\r\n\t\tbreak;\r\n\tcase DDERR_SURFACELOST:\r\n\t\tszError = \"DDERR_SURFACELOST\";\r\n\t\tbreak;\r\n\tcase DDERR_SURFACENOTATTACHED:\r\n\t\tszError = \"DDERR_SURFACENOTATTACHED\";\r\n\t\tbreak;\r\n\tcase DDERR_TOOBIGHEIGHT:\r\n\t\tszError = \"DDERR_TOOBIGHEIGHT\";\r\n\t\tbreak;\r\n\tcase DDERR_TOOBIGSIZE:\r\n\t\tszError = \"DDERR_TOOBIGSIZE\";\r\n\t\tbreak;\r\n\tcase DDERR_TOOBIGWIDTH:\r\n\t\tszError = \"DDERR_TOOBIGWIDTH\";\r\n\t\tbreak;\r\n\tcase DDERR_UNSUPPORTED:\r\n\t\tszError = \"DDERR_UNSUPPORTED\";\r\n\t\tbreak;\r\n\tcase DDERR_UNSUPPORTEDFORMAT:\r\n\t\tszError = \"DDERR_UNSUPPORTEDFORMAT\";\r\n\t\tbreak;\r\n\tcase DDERR_UNSUPPORTEDMASK:\r\n\t\tszError = \"DDERR_UNSUPPORTEDMASK\";\r\n\t\tbreak;\r\n\tcase DDERR_VERTICALBLANKINPROGRESS:\r\n\t\tszError = \"DDERR_VERTICALBLANKINPROGRESS\";\r\n\t\tbreak;\r\n\tcase DDERR_WASSTILLDRAWING:\r\n\t\tszError = \"DDERR_WASSTILLDRAWING\";\r\n\t\tbreak;\r\n\tcase DDERR_WRONGMODE:\r\n\t\tszError = \"DDERR_WRONGMODE\";\r\n\t\tbreak;\r\n\tcase DDERR_XALIGN:\r\n\t\tszError = \"DDERR_XALIGN\";\r\n\t\tbreak;\r\n\tcase DDERR_CANTLOCKSURFACE:\r\n\t\tszError = \"DDERR_CANTLOCKSURFACE\";\r\n\t\tbreak;\r\n\tcase DDERR_CANTPAGELOCK:\r\n\t\tszError = \"DDERR_CANTPAGELOCK\";\r\n\t\tbreak;\r\n\tcase DDERR_CANTPAGEUNLOCK:\r\n\t\tszError = \"DDERR_CANTPAGEUNLOCK\";\r\n\t\tbreak;\r\n\tcase DDERR_DCALREADYCREATED:\r\n\t\tszError = \"DDERR_DCALREADYCREATED\";\r\n\t\tbreak;\r\n\tcase DDERR_INVALIDSURFACETYPE:\r\n\t\tszError = \"DDERR_INVALIDSURFACETYPE\";\r\n\t\tbreak;\r\n\tcase DDERR_NOMIPMAPHW:\r\n\t\tszError = \"DDERR_NOMIPMAPHW\";\r\n\t\tbreak;\r\n\tcase DDERR_NOTPAGELOCKED:\r\n\t\tszError = \"DDERR_NOTPAGELOCKED\";\r\n\t\tbreak;\r\n\tdefault: {\r\n\t\tconst char szUnknown[] = \"DDERR unknown 0x%x\";\r\n\t\tassert(dwMaxChars >= sizeof(szUnknown) + 10);\r\n\t\tsprintf(pszBuffer, szUnknown, hError);\r\n\t\treturn;\r\n\t}\r\n\t}\r\n\r\n\tstrncpy(pszBuffer, szError, dwMaxChars);\r\n}\r\n\r\n/**\r\n * @brief Generate a textual message for DirectSound error codes\r\n * @param hError DirectSound error code\r\n * @param pszBuffer Buffer for the error message\r\n * @param dwMaxChars Length of pszBuffer\r\n */\r\nstatic void TraceErrorDS(HRESULT hError, char *pszBuffer, DWORD dwMaxChars)\r\n{\r\n\tconst char *szError;\r\n\r\n\tswitch (hError) {\r\n\tcase DSERR_PRIOLEVELNEEDED:\r\n\t\tszError = \"DSERR_PRIOLEVELNEEDED\";\r\n\t\tbreak;\r\n\tcase DSERR_BADFORMAT:\r\n\t\tszError = \"DSERR_BADFORMAT\";\r\n\t\tbreak;\r\n\tcase DSERR_NODRIVER:\r\n\t\tszError = \"DSERR_NODRIVER\";\r\n\t\tbreak;\r\n\tcase DSERR_ALREADYINITIALIZED:\r\n\t\tszError = \"DSERR_ALREADYINITIALIZED\";\r\n\t\tbreak;\r\n\tcase DSERR_BUFFERLOST:\r\n\t\tszError = \"DSERR_BUFFERLOST\";\r\n\t\tbreak;\r\n\tcase DS_OK:\r\n\t\tszError = \"DS_OK\";\r\n\t\tbreak;\r\n\tcase DSERR_INVALIDCALL:\r\n\t\tszError = \"DSERR_INVALIDCALL\";\r\n\t\tbreak;\r\n\tcase E_NOINTERFACE:\r\n\t\tszError = \"E_NOINTERFACE\";\r\n\t\tbreak;\r\n\tcase DSERR_NOAGGREGATION:\r\n\t\tszError = \"DSERR_NOAGGREGATION\";\r\n\t\tbreak;\r\n\tcase DSERR_OUTOFMEMORY:\r\n\t\tszError = \"DSERR_OUTOFMEMORY\";\r\n\t\tbreak;\r\n\tcase DSERR_INVALIDPARAM:\r\n\t\tszError = \"DSERR_INVALIDPARAM\";\r\n\t\tbreak;\r\n\tcase DSERR_ALLOCATED:\r\n\t\tszError = \"DSERR_ALLOCATED\";\r\n\t\tbreak;\r\n\tcase DSERR_CONTROLUNAVAIL:\r\n\t\tszError = \"DSERR_CONTROLUNAVAIL\";\r\n\t\tbreak;\r\n\tdefault: {\r\n\t\tconst char szUnknown[] = \"DSERR unknown 0x%x\";\r\n\t\tassert(dwMaxChars >= sizeof(szUnknown) + 10);\r\n\t\tsprintf(pszBuffer, szUnknown, hError);\r\n\t\treturn;\r\n\t}\r\n\t}\r\n\r\n\tstrncpy(pszBuffer, szError, dwMaxChars);\r\n}\r\n\r\n/**\r\n * @brief Returns a formatted error message based on the given error code.\r\n * @param error_code DirectX error code\r\n */\r\nconst char *GetErrorStr(DWORD error_code)\r\n{\r\n\tint size;\r\n\tchar *chr;\r\n\r\n\tif (HRESULT_FACILITY(error_code) == _FACDS) {\r\n\t\tTraceErrorDS(error_code, sz_error_buf, sizeof(sz_error_buf) / sizeof(sz_error_buf[0]));\r\n\t} else if (HRESULT_FACILITY(error_code) == _FACDD) {\r\n\t\tTraceErrorDD(error_code, sz_error_buf, sizeof(sz_error_buf) / sizeof(sz_error_buf[0]));\r\n\t} else if (!SErrGetErrorStr(error_code, sz_error_buf, sizeof(sz_error_buf) / sizeof(sz_error_buf[0]))\r\n\t    && !FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), sz_error_buf, sizeof(sz_error_buf) / sizeof(sz_error_buf[0]), NULL)) {\r\n\t\twsprintf(sz_error_buf, \"unknown error 0x%08x\", error_code);\r\n\t}\r\n\r\n\tsize = strlen(sz_error_buf);\r\n\r\n\tchr = &sz_error_buf[size - 1];\r\n\twhile (size-- > 0) {\r\n\t\tchr--;\r\n\r\n\t\tif (*chr != '\\r' && *chr != '\\n')\r\n\t\t\tbreak;\r\n\r\n\t\t*chr = 0x00;\r\n\t}\r\n\r\n\treturn sz_error_buf;\r\n}\r\n\r\n/**\r\n * @brief Returns a formatted error message of the last error.\r\n */\r\nconst char *TraceLastError()\r\n{\r\n\treturn GetErrorStr(GetLastError());\r\n}\r\n\r\n/**\r\n * @brief Displays an error message box based on the given format string and variable argument list.\r\n * @param pszFmt Error message format\r\n * @param va Additional parameters for message format\r\n */\r\nstatic void MsgBox(const char *pszFmt, va_list va)\r\n{\r\n\tchar Text[256];\r\n\r\n\twvsprintf(Text, pszFmt, va);\r\n\tif (ghMainWnd)\r\n\t\tSetWindowPos(ghMainWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);\r\n\tMessageBox(ghMainWnd, Text, \"ERROR\", MB_TASKMODAL | MB_ICONHAND);\r\n}\r\n\r\n/**\r\n * @brief Cleans up after a fatal application error.\r\n */\r\nstatic void FreeDlg()\r\n{\r\n\tif (terminating && cleanup_thread_id != GetCurrentThreadId())\r\n\t\tSleep(20000);\r\n\r\n\tterminating = TRUE;\r\n\tcleanup_thread_id = GetCurrentThreadId();\r\n\r\n\tdx_cleanup();\r\n\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tif (SNetLeaveGame(3))\r\n\t\t\tSleep(2000);\r\n\t}\r\n\r\n\tSNetDestroy();\r\n\tShowCursor(TRUE);\r\n}\r\n\r\n/**\r\n * @brief Terminates the game and displays an error message box.\r\n * @param pszFmt Optional error message.\r\n * @param ... (see printf)\r\n */\r\n#ifdef HELLFIRE\r\n__declspec(naked)\r\n#endif\r\n    void __cdecl app_fatal(const char *pszFmt, ...)\r\n{\r\n\tva_list va;\r\n\r\n\tva_start(va, pszFmt);\r\n\tFreeDlg();\r\n#if defined(_DEBUG) || defined(HELLFIRE)\r\n\tTriggerBreak();\r\n#endif\r\n\r\n\tif (pszFmt)\r\n\t\tMsgBox(pszFmt, va);\r\n\r\n\tva_end(va);\r\n\r\n\tinit_cleanup(FALSE);\r\n\texit(1);\r\n\tExitProcess(1);\r\n}\r\n\r\n/**\r\n * @brief Displays a warning message box based on the given formatted error message.\r\n * @param pszFmt Error message format\r\n * @param ... Additional parameters for message format\r\n */\r\nvoid __cdecl DrawDlg(const char *pszFmt, ...)\r\n{\r\n\tchar text[256];\r\n\tva_list arglist;\r\n\r\n\tva_start(arglist, pszFmt);\r\n\twvsprintf(text, pszFmt, arglist);\r\n\tva_end(arglist);\r\n\tSDrawMessageBox(text, APP_NAME, MB_TASKMODAL | MB_ICONEXCLAMATION);\r\n}\r\n\r\n#ifdef _DEBUG\r\n/**\r\n * @brief Show an error and exit the application.\r\n * @param nLineNo The line number of the assertion\r\n * @param pszFile File name where the assertion is located\r\n * @param pszFail Fail message\r\n */\r\nvoid assert_fail(int nLineNo, const char *pszFile, const char *pszFail)\r\n{\r\n\tapp_fatal(\"assertion failed (%d:%s)\\n%s\", nLineNo, pszFile, pszFail);\r\n}\r\n#endif\r\n\r\n/**\r\n * @brief Terminates the game with a DirectDraw assertion message box.\r\n */\r\nvoid DDErrMsg(DWORD error_code, int log_line_nr, const char *log_file_path)\r\n{\r\n\tconst char *msg;\r\n\r\n\tif (error_code) {\r\n\t\tmsg = GetErrorStr(error_code);\r\n\t\tapp_fatal(\"Direct draw error (%s:%d)\\n%s\", log_file_path, log_line_nr, msg);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Terminates the game with a DirectSound assertion message box.\r\n */\r\nvoid DSErrMsg(DWORD error_code, int log_line_nr, const char *log_file_path)\r\n{\r\n\tconst char *msg;\r\n\r\n\tif (error_code) {\r\n\t\tmsg = GetErrorStr(error_code);\r\n\t\tapp_fatal(\"Direct sound error (%s:%d)\\n%s\", log_file_path, log_line_nr, msg);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Centres the given dialog box.\r\n */\r\nvoid center_window(HWND hDlg)\r\n{\r\n\tLONG w, h;\r\n\tint screenW, screenH;\r\n\ttagRECT Rect;\r\n\tHDC hdc;\r\n\r\n\tGetWindowRect(hDlg, &Rect);\r\n\tw = Rect.right - Rect.left;\r\n\th = Rect.bottom - Rect.top;\r\n\thdc = GetDC(hDlg);\r\n\tscreenW = GetDeviceCaps(hdc, HORZRES);\r\n\tscreenH = GetDeviceCaps(hdc, VERTRES);\r\n\tReleaseDC(hDlg, hdc);\r\n\r\n\tif (!SetWindowPos(hDlg, HWND_TOP, (screenW - w) / 2, (screenH - h) / 2, 0, 0, SWP_NOZORDER | SWP_NOSIZE)) {\r\n\t\tapp_fatal(\"center_window: %s\", TraceLastError());\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Sets the text of the given dialog.\r\n */\r\nstatic void TextDlg(HWND hDlg, const char *text)\r\n{\r\n\tcenter_window(hDlg);\r\n\r\n\tif (text)\r\n\t\tSetDlgItemText(hDlg, 1000, text);\r\n}\r\n\r\n/**\r\n * @brief Callback function which processes messages sent to the given dialog box.\r\n */\r\nstatic BOOL CALLBACK FuncDlg(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tswitch (uMsg) {\r\n\tcase WM_INITDIALOG:\r\n\t\tTextDlg(hDlg, (char *)lParam);\r\n\t\tbreak;\r\n\tcase WM_COMMAND:\r\n\t\tif (LOWORD(wParam) == IDOK) {\r\n\t\t\tEndDialog(hDlg, TRUE);\r\n\t\t} else if (LOWORD(wParam) == IDCANCEL) {\r\n\t\t\tEndDialog(hDlg, FALSE);\r\n\t\t}\r\n\t\tbreak;\r\n\tdefault:\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\n/**\r\n * @brief Terminates the game and displays an error dialog box based on the given dialog_id.\r\n */\r\nvoid ErrDlg(int dialog_id, DWORD error_code, const char *log_file_path, int log_line_nr)\r\n{\r\n\tconst char *size;\r\n\tLPARAM dwInitParam[128];\r\n\r\n\tFreeDlg();\r\n\r\n\tsize = strrchr(log_file_path, '\\\\');\r\n\tif (size)\r\n\t\tlog_file_path = size + 1;\r\n\r\n\twsprintf((LPSTR)dwInitParam, \"%s\\nat: %s line %d\", GetErrorStr(error_code), log_file_path, log_line_nr);\r\n\tif (DialogBoxParam(ghInst, MAKEINTRESOURCE(dialog_id), ghMainWnd, (DLGPROC)FuncDlg, (LPARAM)dwInitParam) == -1)\r\n\t\tapp_fatal(\"ErrDlg: %d\", dialog_id);\r\n\r\n\tapp_fatal(NULL);\r\n}\r\n\r\n#ifndef HELLFIRE\r\n/**\r\n * @brief Displays a warning dialog box based on the given dialog_id and error code.\r\n */\r\nvoid ErrOkDlg(int dialog_id, DWORD error_code, const char *log_file_path, int log_line_nr)\r\n{\r\n\tconst char *size;\r\n\tLPARAM dwInitParam[128];\r\n\r\n\tsize = strrchr(log_file_path, '\\\\');\r\n\tif (size)\r\n\t\tlog_file_path = size + 1;\r\n\r\n\twsprintf((LPSTR)dwInitParam, \"%s\\nat: %s line %d\", GetErrorStr(error_code), log_file_path, log_line_nr);\r\n\tDialogBoxParam(ghInst, MAKEINTRESOURCE(dialog_id), ghMainWnd, (DLGPROC)FuncDlg, (LPARAM)dwInitParam);\r\n}\r\n#endif\r\n\r\n/**\r\n * @brief Terminates the game with a file not found error dialog.\r\n */\r\nvoid FileErrDlg(const char *error)\r\n{\r\n\tFreeDlg();\r\n\r\n\tif (!error)\r\n\t\terror = \"\";\r\n\r\n\tif (DialogBoxParam(ghInst, MAKEINTRESOURCE(IDD_DIALOG3), ghMainWnd, (DLGPROC)FuncDlg, (LPARAM)error) == -1)\r\n\t\tapp_fatal(\"FileErrDlg\");\r\n\r\n\tapp_fatal(NULL);\r\n}\r\n\r\n/**\r\n * @brief Terminates the game with an out of disk space error dialog.\r\n */\r\nvoid DiskFreeDlg(const char *error)\r\n{\r\n\tFreeDlg();\r\n\r\n\tif (DialogBoxParam(ghInst, MAKEINTRESOURCE(IDD_DIALOG7), ghMainWnd, (DLGPROC)FuncDlg, (LPARAM)error) == -1)\r\n\t\tapp_fatal(\"DiskFreeDlg\");\r\n\r\n\tapp_fatal(NULL);\r\n}\r\n\r\n/**\r\n * @brief Terminates the game with an insert CD error dialog.\r\n */\r\nBOOL InsertCDDlg()\r\n{\r\n\tint nResult;\r\n\r\n\tShowCursor(TRUE);\r\n\r\n\tnResult = DialogBoxParam(ghInst, MAKEINTRESOURCE(IDD_DIALOG9), ghMainWnd, (DLGPROC)FuncDlg, (LPARAM) \"\");\r\n\tif (nResult == -1)\r\n\t\tapp_fatal(\"InsertCDDlg\");\r\n\r\n\tShowCursor(FALSE);\r\n\r\n\treturn nResult == IDOK;\r\n}\r\n\r\n#ifndef HELLFIRE\r\n/**\r\n * @brief Terminates the game with a read-only directory error dialog.\r\n */\r\nvoid DirErrorDlg(const char *error)\r\n{\r\n\tFreeDlg();\r\n\r\n\tif (DialogBoxParam(ghInst, MAKEINTRESOURCE(IDD_DIALOG11), ghMainWnd, (DLGPROC)FuncDlg, (LPARAM)error) == -1)\r\n\t\tapp_fatal(\"DirErrorDlg\");\r\n\r\n\tapp_fatal(NULL);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/appfat.h",
    "content": "/**\r\n * @file appfat.h\r\n *\r\n * Interface of error dialogs.\r\n */\r\n#ifndef __APPFAT_H__\r\n#define __APPFAT_H__\r\n\r\nvoid TriggerBreak();\r\nconst char *TraceLastError();\r\nvoid __cdecl app_fatal(const char *pszFmt, ...);\r\nvoid __cdecl DrawDlg(const char *pszFmt, ...);\r\n#ifdef _DEBUG\r\nvoid assert_fail(int nLineNo, const char *pszFile, const char *pszFail);\r\n#endif\r\nvoid DDErrMsg(DWORD error_code, int log_line_nr, const char *log_file_path);\r\nvoid DSErrMsg(DWORD error_code, int log_line_nr, const char *log_file_path);\r\nvoid ErrDlg(int template_id, DWORD error_code, const char *log_file_path, int log_line_nr);\r\nvoid ErrOkDlg(int template_id, DWORD error_code, const char *log_file_path, int log_line_nr);\r\nvoid FileErrDlg(const char *error);\r\nvoid DiskFreeDlg(const char *error);\r\nBOOL InsertCDDlg();\r\nvoid DirErrorDlg(const char *error);\r\n\r\n#endif /* __APPFAT_H__ */\r\n"
  },
  {
    "path": "Source/asm_trans_rect.inc",
    "content": "/*  Draws a half-transparent rectangle by blacking out odd pixels on odd lines,\r\n *  even pixels on even lines.\r\n *\r\n *  TRANS_RECT_X = x offset of upper-left corner\r\n *  TRANS_RECT_Y = y offset of upper-left corner\r\n *  TRANS_RECT_WIDTH = width of rectangle\r\n *  TRANS_RECT_HEIGHT = height of rectangle\r\n */\r\n\r\n#if !defined(TRANS_RECT_X) || !defined(TRANS_RECT_Y) || !defined(TRANS_RECT_WIDTH) || !defined(TRANS_RECT_HEIGHT)\r\n#error ASM_TRANS_RECT: Parameter not set\r\n#endif\r\n\r\n#if defined(_MSC_VER) && defined(_M_IX86)\r\n__asm {\r\n\tmov edi, gpBuffer\r\n\t; origin is at 64,160\r\n\tadd edi, (SCREEN_Y + TRANS_RECT_Y + TRANS_RECT_HEIGHT - 1) * BUFFER_WIDTH + 64 + TRANS_RECT_X\r\n\txor eax, eax\r\n\tmov edx, TRANS_RECT_HEIGHT >> 1\r\nyloop:\r\n\tmov ecx, TRANS_RECT_WIDTH >> 1\r\nx0loop:\r\n\tstosb\r\n\tinc edi\r\n\tloop x0loop\r\n#if (TRANS_RECT_WIDTH & 1)\r\n\tstosb\r\n#endif\r\n\tsub edi, BUFFER_WIDTH + TRANS_RECT_WIDTH\r\n\tmov ecx, TRANS_RECT_WIDTH >> 1\r\nx1loop:\r\n\tinc edi\r\n\tstosb\r\n\tloop x1loop\r\n\tsub edi, BUFFER_WIDTH + (TRANS_RECT_WIDTH & ~1)\r\n\tdec edx\r\n\tjnz yloop\r\n#if (TRANS_RECT_HEIGHT & 1)\r\n\tmov ecx, TRANS_RECT_WIDTH >> 1\r\nx2loop:\r\n\tstosb\r\n\tinc edi\r\n\tloop x2loop\r\n#if (TRANS_RECT_WIDTH & 1)\r\n\tstosb\r\n#endif\r\n#endif\r\n}\r\n#else // _MSC_VER && _M_IX86\r\n{\r\n\tint row, col;\r\n\tBYTE *pix = &gpBuffer[SCREENXY(TRANS_RECT_X, TRANS_RECT_Y + TRANS_RECT_HEIGHT - 1)];\r\n\tfor (row = TRANS_RECT_HEIGHT >> 1; row != 0; row--) {\r\n\t\tfor (col = TRANS_RECT_WIDTH >> 1; col != 0; col--) {\r\n\t\t\t*pix++ = 0;\r\n\t\t\tpix++;\r\n\t\t}\r\n#if (TRANS_RECT_WIDTH & 1)\r\n\t\t*pix++ = 0;\r\n#endif\r\n\t\tpix -= BUFFER_WIDTH + TRANS_RECT_WIDTH;\r\n\t\tfor (col = TRANS_RECT_WIDTH >> 1; col != 0; col--) {\r\n\t\t\tpix++;\r\n\t\t\t*pix++ = 0;\r\n\t\t}\r\n\t\tpix -= BUFFER_WIDTH + (TRANS_RECT_WIDTH & ~1);\r\n\t}\r\n#if (TRANS_RECT_HEIGHT & 1)\r\n\tfor (col = TRANS_RECT_WIDTH >> 1; col != 0; col--) {\r\n\t\t*pix++ = 0;\r\n\t\tpix++;\r\n\t}\r\n#if (TRANS_RECT_WIDTH & 1)\r\n\t*pix++ = 0;\r\n#endif\r\n#endif\r\n}\r\n#endif\r\n\r\n#undef TRANS_RECT_Y\r\n#undef TRANS_RECT_X\r\n#undef TRANS_RECT_WIDTH\r\n#undef TRANS_RECT_HEIGHT\r\n"
  },
  {
    "path": "Source/automap.cpp",
    "content": "/**\r\n * @file automap.cpp\r\n *\r\n * Implementation of the in-game map overlay.\r\n */\r\n#include \"all.h\"\r\n\r\n/**\r\n * Maps from tile_id to automap type.\r\n * BUGFIX: only the first 256 elements are ever read\r\n */\r\nWORD automaptype[512];\r\nstatic int AutoMapX;\r\nstatic int AutoMapY;\r\n/** Specifies whether the automap is enabled. */\r\nBOOL automapflag;\r\nchar AmShiftTab[32];\r\n/** Tracks the explored areas of the map. */\r\nBOOLEAN automapview[DMAXX][DMAXY];\r\n/** Specifies the scale of the automap. */\r\nint AutoMapScale;\r\nint AutoMapXOfs;\r\nint AutoMapYOfs;\r\nint AmLine64;\r\nint AmLine32;\r\nint AmLine16;\r\nint AmLine8;\r\nint AmLine4;\r\n\r\n/** color used to draw the player's arrow */\r\n#define COLOR_PLAYER (PAL8_ORANGE + 1)\r\n/** color for bright map lines (doors, stairs etc.) */\r\n#define COLOR_BRIGHT PAL8_YELLOW\r\n/** color for dim map lines/dots */\r\n#define COLOR_DIM (PAL16_YELLOW + 8)\r\n#ifdef HELLFIRE\r\n// color for items on automap\r\n#define COLOR_ITEM (PAL8_BLUE + 1)\r\n#endif\r\n\r\n#define MAPFLAG_TYPE 0x000F\r\n/** these are in the second byte */\r\n#define MAPFLAG_VERTDOOR 0x01\r\n#define MAPFLAG_HORZDOOR 0x02\r\n#define MAPFLAG_VERTARCH 0x04\r\n#define MAPFLAG_HORZARCH 0x08\r\n#define MAPFLAG_VERTGRATE 0x10\r\n#define MAPFLAG_HORZGRATE 0x20\r\n#define MAPFLAG_DIRT 0x40\r\n#define MAPFLAG_STAIRS 0x80\r\n\r\n/**\r\n * @brief Initializes the automap.\r\n */\r\nvoid InitAutomapOnce()\r\n{\r\n\tautomapflag = FALSE;\r\n\tAutoMapScale = 50;\r\n\tAmLine64 = 32;\r\n\tAmLine32 = 16;\r\n\tAmLine16 = 8;\r\n\tAmLine8 = 4;\r\n\tAmLine4 = 2;\r\n}\r\n\r\n/**\r\n * @brief Loads the mapping between tile IDs and automap shapes.\r\n */\r\nvoid InitAutomap()\r\n{\r\n\tBYTE b1, b2;\r\n\tDWORD dwTiles;\r\n\tint x, y;\r\n\tBYTE *pAFile, *pTmp;\r\n\tint i, j;\r\n\tint d;\r\n\r\n\tj = 50;\r\n\r\n\tfor (i = 0; i < 31; i++) {\r\n\t\td = (j << 6) / 100;\r\n\t\tAmShiftTab[i] = 2 * (SCREEN_WIDTH / 2 / d) + 1;\r\n\t\tif ((SCREEN_WIDTH / 2) % d)\r\n\t\t\tAmShiftTab[i]++;\r\n\t\tif ((SCREEN_WIDTH / 2) % d >= (j << 5) / 100)\r\n\t\t\tAmShiftTab[i]++;\r\n\t\tj += 5;\r\n\t}\r\n\r\n\tmemset(automaptype, 0, sizeof(automaptype));\r\n\r\n\tswitch (leveltype) {\r\n\tcase DTYPE_CATHEDRAL:\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 21)\r\n\t\t\tpAFile = LoadFileInMem(\"Levels\\\\L1Data\\\\L1.AMP\", &dwTiles);\r\n\t\telse\r\n\t\t\tpAFile = LoadFileInMem(\"NLevels\\\\L5Data\\\\L5.AMP\", &dwTiles);\r\n#else\r\n\t\tpAFile = LoadFileInMem(\"Levels\\\\L1Data\\\\L1.AMP\", &dwTiles);\r\n#endif\r\n\t\tbreak;\r\n\tcase DTYPE_CATACOMBS:\r\n\t\tpAFile = LoadFileInMem(\"Levels\\\\L2Data\\\\L2.AMP\", &dwTiles);\r\n\t\tbreak;\r\n\tcase DTYPE_CAVES:\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17)\r\n\t\t\tpAFile = LoadFileInMem(\"Levels\\\\L3Data\\\\L3.AMP\", &dwTiles);\r\n\t\telse\r\n\t\t\tpAFile = LoadFileInMem(\"NLevels\\\\L6Data\\\\L6.AMP\", &dwTiles);\r\n#else\r\n\t\tpAFile = LoadFileInMem(\"Levels\\\\L3Data\\\\L3.AMP\", &dwTiles);\r\n#endif\r\n\t\tbreak;\r\n\tcase DTYPE_HELL:\r\n\t\tpAFile = LoadFileInMem(\"Levels\\\\L4Data\\\\L4.AMP\", &dwTiles);\r\n\t\tbreak;\r\n\tdefault:\r\n\t\treturn;\r\n\t}\r\n\r\n\tdwTiles /= 2;\r\n\tpTmp = pAFile;\r\n\r\n\tfor (i = 1; i <= dwTiles; i++) {\r\n\t\tb1 = *pTmp++;\r\n\t\tb2 = *pTmp++;\r\n\t\tautomaptype[i] = b1 + (b2 << 8);\r\n\t}\r\n\r\n\tmem_free_dbg(pAFile);\r\n\tmemset(automapview, 0, sizeof(automapview));\r\n\r\n\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\tfor (x = 0; x < MAXDUNX; x++)\r\n\t\t\tdFlags[x][y] &= ~BFLAG_EXPLORED;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Displays the automap.\r\n */\r\nvoid StartAutomap()\r\n{\r\n\tAutoMapXOfs = 0;\r\n\tAutoMapYOfs = 0;\r\n\tautomapflag = TRUE;\r\n}\r\n\r\n/**\r\n * @brief Scrolls the automap upwards.\r\n */\r\nvoid AutomapUp()\r\n{\r\n\tAutoMapXOfs--;\r\n\tAutoMapYOfs--;\r\n}\r\n\r\n/**\r\n * @brief Scrolls the automap downwards.\r\n */\r\nvoid AutomapDown()\r\n{\r\n\tAutoMapXOfs++;\r\n\tAutoMapYOfs++;\r\n}\r\n\r\n/**\r\n * @brief Scrolls the automap leftwards.\r\n */\r\nvoid AutomapLeft()\r\n{\r\n\tAutoMapXOfs--;\r\n\tAutoMapYOfs++;\r\n}\r\n\r\n/**\r\n * @brief Scrolls the automap rightwards.\r\n */\r\nvoid AutomapRight()\r\n{\r\n\tAutoMapXOfs++;\r\n\tAutoMapYOfs--;\r\n}\r\n\r\n/**\r\n * @brief Increases the zoom level of the automap.\r\n */\r\nvoid AutomapZoomIn()\r\n{\r\n\tif (AutoMapScale < 200) {\r\n\t\tAutoMapScale += 5;\r\n\t\tAmLine64 = (AutoMapScale << 6) / 100;\r\n\t\tAmLine32 = AmLine64 >> 1;\r\n\t\tAmLine16 = AmLine32 >> 1;\r\n\t\tAmLine8 = AmLine16 >> 1;\r\n\t\tAmLine4 = AmLine8 >> 1;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Decreases the zoom level of the automap.\r\n */\r\nvoid AutomapZoomOut()\r\n{\r\n\tif (AutoMapScale > 50) {\r\n\t\tAutoMapScale -= 5;\r\n\t\tAmLine64 = (AutoMapScale << 6) / 100;\r\n\t\tAmLine32 = AmLine64 >> 1;\r\n\t\tAmLine16 = AmLine32 >> 1;\r\n\t\tAmLine8 = AmLine16 >> 1;\r\n\t\tAmLine4 = AmLine8 >> 1;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Renders the given automap shape at the specified screen coordinates.\r\n */\r\nstatic void DrawAutomapTile(int sx, int sy, WORD automap_type)\r\n{\r\n\tBOOL do_vert;\r\n\tBOOL do_horz;\r\n\tBOOL do_cave_horz;\r\n\tBOOL do_cave_vert;\r\n\tint x1, y1, x2, y2;\r\n\r\n\tBYTE flags = automap_type >> 8;\r\n\r\n\tif (flags & MAPFLAG_DIRT) {\r\n\t\tENG_set_pixel(sx, sy, COLOR_DIM);\r\n\t\tENG_set_pixel(sx - AmLine8, sy - AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx - AmLine8, sy + AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx + AmLine8, sy - AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx + AmLine8, sy + AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx - AmLine16, sy, COLOR_DIM);\r\n\t\tENG_set_pixel(sx + AmLine16, sy, COLOR_DIM);\r\n\t\tENG_set_pixel(sx, sy - AmLine8, COLOR_DIM);\r\n\t\tENG_set_pixel(sx, sy + AmLine8, COLOR_DIM);\r\n\t\tENG_set_pixel(sx + AmLine8 - AmLine32, sy + AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx - AmLine8 + AmLine32, sy + AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx - AmLine16, sy + AmLine8, COLOR_DIM);\r\n\t\tENG_set_pixel(sx + AmLine16, sy + AmLine8, COLOR_DIM);\r\n\t\tENG_set_pixel(sx - AmLine8, sy + AmLine16 - AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx + AmLine8, sy + AmLine16 - AmLine4, COLOR_DIM);\r\n\t\tENG_set_pixel(sx, sy + AmLine16, COLOR_DIM);\r\n\t}\r\n\r\n\tif (flags & MAPFLAG_STAIRS) {\r\n\t\tDrawLine(sx - AmLine8, sy - AmLine8 - AmLine4, sx + AmLine8 + AmLine16, sy + AmLine4, COLOR_BRIGHT);\r\n\t\tDrawLine(sx - AmLine16, sy - AmLine8, sx + AmLine16, sy + AmLine8, COLOR_BRIGHT);\r\n\t\tDrawLine(sx - AmLine16 - AmLine8, sy - AmLine4, sx + AmLine8, sy + AmLine8 + AmLine4, COLOR_BRIGHT);\r\n\t\tDrawLine(sx - AmLine32, sy, sx, sy + AmLine16, COLOR_BRIGHT);\r\n\t}\r\n\r\n\tdo_vert = FALSE;\r\n\tdo_horz = FALSE;\r\n\tdo_cave_horz = FALSE;\r\n\tdo_cave_vert = FALSE;\r\n\tswitch (automap_type & MAPFLAG_TYPE) {\r\n\tcase 1: // stand-alone column or other unpassable object\r\n\t\tx1 = sx - AmLine16;\r\n\t\ty1 = sy - AmLine16;\r\n\t\tx2 = x1 + AmLine32;\r\n\t\ty2 = sy - AmLine8;\r\n\t\tDrawLine(sx, y1, x1, y2, COLOR_DIM);\r\n\t\tDrawLine(sx, y1, x2, y2, COLOR_DIM);\r\n\t\tDrawLine(sx, sy, x1, y2, COLOR_DIM);\r\n\t\tDrawLine(sx, sy, x2, y2, COLOR_DIM);\r\n\t\tbreak;\r\n\tcase 2:\r\n\tcase 5:\r\n\t\tdo_vert = TRUE;\r\n\t\tbreak;\r\n\tcase 3:\r\n\tcase 6:\r\n\t\tdo_horz = TRUE;\r\n\t\tbreak;\r\n\tcase 4:\r\n\t\tdo_vert = TRUE;\r\n\t\tdo_horz = TRUE;\r\n\t\tbreak;\r\n\tcase 8:\r\n\t\tdo_vert = TRUE;\r\n\t\tdo_cave_horz = TRUE;\r\n\t\tbreak;\r\n\tcase 9:\r\n\t\tdo_horz = TRUE;\r\n\t\tdo_cave_vert = TRUE;\r\n\t\tbreak;\r\n\tcase 10:\r\n\t\tdo_cave_horz = TRUE;\r\n\t\tbreak;\r\n\tcase 11:\r\n\t\tdo_cave_vert = TRUE;\r\n\t\tbreak;\r\n\tcase 12:\r\n\t\tdo_cave_horz = TRUE;\r\n\t\tdo_cave_vert = TRUE;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (do_vert) {                      // right-facing obstacle\r\n\t\tif (flags & MAPFLAG_VERTDOOR) { // two wall segments with a door in the middle\r\n\t\t\tx1 = sx - AmLine32;\r\n\t\t\tx2 = sx - AmLine16;\r\n\t\t\ty1 = sy - AmLine16;\r\n\t\t\ty2 = sy - AmLine8;\r\n\r\n\t\t\tDrawLine(sx, y1, sx - AmLine8, y1 + AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x1, sy, x1 + AmLine8, sy - AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x2, y1, x1, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x2, y1, sx, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x2, sy, x1, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x2, sy, sx, y2, COLOR_BRIGHT);\r\n\t\t}\r\n\t\tif (flags & MAPFLAG_VERTGRATE) { // right-facing half-wall\r\n\t\t\tDrawLine(sx - AmLine16, sy - AmLine8, sx - AmLine32, sy, COLOR_DIM);\r\n\t\t\tflags |= MAPFLAG_VERTARCH;\r\n\t\t}\r\n\t\tif (flags & MAPFLAG_VERTARCH) { // window or passable column\r\n\t\t\tx1 = sx - AmLine16;\r\n\t\t\ty1 = sy - AmLine16;\r\n\t\t\tx2 = x1 + AmLine32;\r\n\t\t\ty2 = sy - AmLine8;\r\n\r\n\t\t\tDrawLine(sx, y1, x1, y2, COLOR_DIM);\r\n\t\t\tDrawLine(sx, y1, x2, y2, COLOR_DIM);\r\n\t\t\tDrawLine(sx, sy, x1, y2, COLOR_DIM);\r\n\t\t\tDrawLine(sx, sy, x2, y2, COLOR_DIM);\r\n\t\t}\r\n\t\tif ((flags & (MAPFLAG_VERTDOOR | MAPFLAG_VERTGRATE | MAPFLAG_VERTARCH)) == 0)\r\n\t\t\tDrawLine(sx, sy - AmLine16, sx - AmLine32, sy, COLOR_DIM);\r\n\t}\r\n\r\n\tif (do_horz) { // left-facing obstacle\r\n\t\tif (flags & MAPFLAG_HORZDOOR) {\r\n\t\t\tx1 = sx + AmLine16;\r\n\t\t\tx2 = sx + AmLine32;\r\n\t\t\ty1 = sy - AmLine16;\r\n\t\t\ty2 = sy - AmLine8;\r\n\r\n\t\t\tDrawLine(sx, y1, sx + AmLine8, y1 + AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x2, sy, x2 - AmLine8, sy - AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x1, y1, sx, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x1, y1, x2, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x1, sy, sx, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x1, sy, x2, y2, COLOR_BRIGHT);\r\n\t\t}\r\n\t\tif (flags & MAPFLAG_HORZGRATE) {\r\n\t\t\tDrawLine(sx + AmLine16, sy - AmLine8, sx + AmLine32, sy, COLOR_DIM);\r\n\t\t\tflags |= MAPFLAG_HORZARCH;\r\n\t\t}\r\n\t\tif (flags & MAPFLAG_HORZARCH) {\r\n\t\t\tx1 = sx - AmLine16;\r\n\t\t\ty1 = sy - AmLine16;\r\n\t\t\tx2 = x1 + AmLine32;\r\n\t\t\ty2 = sy - AmLine8;\r\n\r\n\t\t\tDrawLine(sx, y1, x1, y2, COLOR_DIM);\r\n\t\t\tDrawLine(sx, y1, x2, y2, COLOR_DIM);\r\n\t\t\tDrawLine(sx, sy, x1, y2, COLOR_DIM);\r\n\t\t\tDrawLine(sx, sy, x2, y2, COLOR_DIM);\r\n\t\t}\r\n\t\tif ((flags & (MAPFLAG_HORZDOOR | MAPFLAG_HORZGRATE | MAPFLAG_HORZARCH)) == 0)\r\n\t\t\tDrawLine(sx, sy - AmLine16, sx + AmLine32, sy, COLOR_DIM);\r\n\t}\r\n\r\n\t// for caves the horz/vert flags are switched\r\n\tif (do_cave_horz) {\r\n\t\tif (flags & MAPFLAG_VERTDOOR) {\r\n\t\t\tx1 = sx - AmLine32;\r\n\t\t\tx2 = sx - AmLine16;\r\n\t\t\ty1 = sy + AmLine16;\r\n\t\t\ty2 = sy + AmLine8;\r\n\r\n\t\t\tDrawLine(sx, y1, sx - AmLine8, y1 - AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x1, sy, x1 + AmLine8, sy + AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x2, y1, x1, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x2, y1, sx, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x2, sy, x1, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x2, sy, sx, y2, COLOR_BRIGHT);\r\n\t\t} else\r\n\t\t\tDrawLine(sx, sy + AmLine16, sx - AmLine32, sy, COLOR_DIM);\r\n\t}\r\n\r\n\tif (do_cave_vert) {\r\n\t\tif (flags & MAPFLAG_HORZDOOR) {\r\n\t\t\tx1 = sx + AmLine16;\r\n\t\t\tx2 = sx + AmLine32;\r\n\t\t\ty1 = sy + AmLine16;\r\n\t\t\ty2 = sy + AmLine8;\r\n\r\n\t\t\tDrawLine(sx, y1, sx + AmLine8, y1 - AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x2, sy, x2 - AmLine8, sy + AmLine4, COLOR_DIM);\r\n\t\t\tDrawLine(x1, y1, sx, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x1, y1, x2, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x1, sy, sx, y2, COLOR_BRIGHT);\r\n\t\t\tDrawLine(x1, sy, x2, y2, COLOR_BRIGHT);\r\n\t\t} else\r\n\t\t\tDrawLine(sx, sy + AmLine16, sx + AmLine32, sy, COLOR_DIM);\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic void DrawAutomapItem(int x, int y, BYTE color)\r\n{\r\n\tint x1, y1, x2, y2;\r\n\r\n\tx1 = x - AmLine32 / 2;\r\n\ty1 = y - AmLine16 / 2;\r\n\tx2 = x1 + AmLine64 / 2;\r\n\ty2 = y1 + AmLine32 / 2;\r\n\tDrawLine(x, y1, x1, y, color);\r\n\tDrawLine(x, y1, x2, y, color);\r\n\tDrawLine(x, y2, x1, y, color);\r\n\tDrawLine(x, y2, x2, y, color);\r\n}\r\n\r\nvoid SearchAutomapItem()\r\n{\r\n\tint x, y;\r\n\tint x1, y1, x2, y2;\r\n\tint px, py;\r\n\tint i, j;\r\n\r\n\tif (plr[myplr]._pmode == PM_WALK3) {\r\n\t\tx = plr[myplr]._pfutx;\r\n\t\ty = plr[myplr]._pfuty;\r\n\t\tif (plr[myplr]._pdir == DIR_W)\r\n\t\t\tx++;\r\n\t\telse\r\n\t\t\ty++;\r\n\t} else {\r\n\t\tx = plr[myplr]._px;\r\n\t\ty = plr[myplr]._py;\r\n\t}\r\n\r\n\tx1 = x - 8;\r\n\tif (x1 < 0)\r\n\t\tx1 = 0;\r\n\telse if (x1 > MAXDUNX)\r\n\t\tx1 = MAXDUNX;\r\n\r\n\ty1 = y - 8;\r\n\tif (y1 < 0)\r\n\t\ty1 = 0;\r\n\telse if (y1 > MAXDUNY)\r\n\t\ty1 = MAXDUNY;\r\n\r\n\tx2 = x + 8;\r\n\tif (x2 < 0)\r\n\t\tx2 = 0;\r\n\telse if (x2 > MAXDUNX)\r\n\t\tx2 = MAXDUNX;\r\n\r\n\ty2 = y + 8;\r\n\tif (y2 < 0)\r\n\t\ty2 = 0;\r\n\telse if (y2 > MAXDUNY)\r\n\t\ty2 = MAXDUNY;\r\n\r\n\tfor (i = x1; i < x2; i++) {\r\n\t\tfor (j = y1; j < y2; j++) {\r\n\t\t\tif (dItem[i][j] != 0) {\r\n\t\t\t\tpx = i - 2 * AutoMapXOfs - ViewX;\r\n\t\t\t\tpy = j - 2 * AutoMapYOfs - ViewY;\r\n\r\n\t\t\t\tx = (ScrollInfo._sxoff * AutoMapScale / 100 >> 1) + (px - py) * AmLine16 + SCREEN_WIDTH / 2 + SCREEN_X;\r\n\t\t\t\ty = (ScrollInfo._syoff * AutoMapScale / 100 >> 1) + (px + py) * AmLine8 + (SCREEN_HEIGHT - PANEL_HEIGHT) / 2 + SCREEN_Y;\r\n\r\n\t\t\t\tif (invflag || sbookflag)\r\n\t\t\t\t\tx -= 160;\r\n\t\t\t\tif (chrflag || questlog)\r\n\t\t\t\t\tx += 160;\r\n\t\t\t\ty -= AmLine8;\r\n\t\t\t\tDrawAutomapItem(x, y, COLOR_ITEM);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\n/**\r\n * @brief Renders an arrow on the automap, centered on and facing the direction of the player.\r\n */\r\nstatic void DrawAutomapPlr()\r\n{\r\n\tint px, py;\r\n\tint x, y;\r\n\r\n\tif (plr[myplr]._pmode == PM_WALK3) {\r\n\t\tx = plr[myplr]._pfutx;\r\n\t\ty = plr[myplr]._pfuty;\r\n\t\tif (plr[myplr]._pdir == DIR_W)\r\n\t\t\tx++;\r\n\t\telse\r\n\t\t\ty++;\r\n\t} else {\r\n\t\tx = plr[myplr]._px;\r\n\t\ty = plr[myplr]._py;\r\n\t}\r\n\tpx = x - 2 * AutoMapXOfs - ViewX;\r\n\tpy = y - 2 * AutoMapYOfs - ViewY;\r\n\r\n\tx = (plr[myplr]._pxoff * AutoMapScale / 100 >> 1) + (ScrollInfo._sxoff * AutoMapScale / 100 >> 1) + (px - py) * AmLine16 + SCREEN_WIDTH / 2 + SCREEN_X;\r\n\ty = (plr[myplr]._pyoff * AutoMapScale / 100 >> 1) + (ScrollInfo._syoff * AutoMapScale / 100 >> 1) + (px + py) * AmLine8 + (SCREEN_HEIGHT - PANEL_HEIGHT) / 2 + SCREEN_Y;\r\n\r\n\tif (invflag || sbookflag)\r\n\t\tx -= SCREEN_WIDTH / 4;\r\n\tif (chrflag || questlog)\r\n\t\tx += SCREEN_WIDTH / 4;\r\n\ty -= AmLine8;\r\n\r\n\tswitch (plr[myplr]._pdir) {\r\n\tcase DIR_N:\r\n\t\tDrawLine(x, y, x, y - AmLine16, COLOR_PLAYER);\r\n\t\tDrawLine(x, y - AmLine16, x - AmLine4, y - AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x, y - AmLine16, x + AmLine4, y - AmLine8, COLOR_PLAYER);\r\n\t\tbreak;\r\n\tcase DIR_NE:\r\n\t\tDrawLine(x, y, x + AmLine16, y - AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x + AmLine16, y - AmLine8, x + AmLine8, y - AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x + AmLine16, y - AmLine8, x + AmLine8 + AmLine4, y, COLOR_PLAYER);\r\n\t\tbreak;\r\n\tcase DIR_E:\r\n\t\tDrawLine(x, y, x + AmLine16, y, COLOR_PLAYER);\r\n\t\tDrawLine(x + AmLine16, y, x + AmLine8, y - AmLine4, COLOR_PLAYER);\r\n\t\tDrawLine(x + AmLine16, y, x + AmLine8, y + AmLine4, COLOR_PLAYER);\r\n\t\tbreak;\r\n\tcase DIR_SE:\r\n\t\tDrawLine(x, y, x + AmLine16, y + AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x + AmLine16, y + AmLine8, x + AmLine8 + AmLine4, y, COLOR_PLAYER);\r\n\t\tDrawLine(x + AmLine16, y + AmLine8, x + AmLine8, y + AmLine8, COLOR_PLAYER);\r\n\t\tbreak;\r\n\tcase DIR_S:\r\n\t\tDrawLine(x, y, x, y + AmLine16, COLOR_PLAYER);\r\n\t\tDrawLine(x, y + AmLine16, x + AmLine4, y + AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x, y + AmLine16, x - AmLine4, y + AmLine8, COLOR_PLAYER);\r\n\t\tbreak;\r\n\tcase DIR_SW:\r\n\t\tDrawLine(x, y, x - AmLine16, y + AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x - AmLine16, y + AmLine8, x - AmLine4 - AmLine8, y, COLOR_PLAYER);\r\n\t\tDrawLine(x - AmLine16, y + AmLine8, x - AmLine8, y + AmLine8, COLOR_PLAYER);\r\n\t\tbreak;\r\n\tcase DIR_W:\r\n\t\tDrawLine(x, y, x - AmLine16, y, COLOR_PLAYER);\r\n\t\tDrawLine(x - AmLine16, y, x - AmLine8, y - AmLine4, COLOR_PLAYER);\r\n\t\tDrawLine(x - AmLine16, y, x - AmLine8, y + AmLine4, COLOR_PLAYER);\r\n\t\tbreak;\r\n\tcase DIR_NW:\r\n\t\tDrawLine(x, y, x - AmLine16, y - AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x - AmLine16, y - AmLine8, x - AmLine8, y - AmLine8, COLOR_PLAYER);\r\n\t\tDrawLine(x - AmLine16, y - AmLine8, x - AmLine4 - AmLine8, y, COLOR_PLAYER);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Returns the automap shape at the given coordinate.\r\n */\r\nstatic WORD GetAutomapType(int x, int y, BOOL view)\r\n{\r\n\tWORD rv;\r\n\r\n\tif (view && x == -1 && y >= 0 && y < DMAXY && automapview[0][y]) {\r\n\t\tif (GetAutomapType(0, y, FALSE) & (MAPFLAG_DIRT << 8)) {\r\n\t\t\treturn 0;\r\n\t\t} else {\r\n\t\t\treturn MAPFLAG_DIRT << 8;\r\n\t\t}\r\n\t}\r\n\r\n\tif (view && y == -1 && x >= 0 && x < DMAXY && automapview[x][0]) {\r\n\t\tif (GetAutomapType(x, 0, FALSE) & (MAPFLAG_DIRT << 8)) {\r\n\t\t\treturn 0;\r\n\t\t} else {\r\n\t\t\treturn MAPFLAG_DIRT << 8;\r\n\t\t}\r\n\t}\r\n\r\n\tif (x < 0 || x >= DMAXX) {\r\n\t\treturn 0;\r\n\t}\r\n\tif (y < 0 || y >= DMAXX) {\r\n\t\treturn 0;\r\n\t}\r\n\tif (!automapview[x][y] && view) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\trv = automaptype[(BYTE)dungeon[x][y]];\r\n\tif (rv == 7) {\r\n#ifdef HELLFIRE\r\n\t\tif ((BYTE)(GetAutomapType(x - 1, y, FALSE) >> 8) & MAPFLAG_HORZARCH) {\r\n\t\t\tif ((BYTE)(GetAutomapType(x, y - 1, FALSE) >> 8) & MAPFLAG_VERTARCH) {\r\n#else\r\n\t\tif ((GetAutomapType(x - 1, y, FALSE) >> 8) & MAPFLAG_HORZARCH) {\r\n\t\t\tif ((GetAutomapType(x, y - 1, FALSE) >> 8) & MAPFLAG_VERTARCH) {\r\n#endif\r\n\t\t\t\trv = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn rv;\r\n}\r\n\r\n/**\r\n * @brief Renders game info, such as the name of the current level, and in multi player the name of the game and the game password.\r\n */\r\nstatic void DrawAutomapText()\r\n{\r\n\tchar desc[256];\r\n\tint nextline = 20;\r\n\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tstrcat(strcpy(desc, \"game: \"), szPlayerName);\r\n\t\tPrintGameStr(8, 20, desc, COL_GOLD);\r\n\t\tnextline = 35;\r\n\t\tif (szPlayerDescript[0]) {\r\n\t\t\tstrcat(strcpy(desc, \"password: \"), szPlayerDescript);\r\n\t\t\tPrintGameStr(8, 35, desc, COL_GOLD);\r\n\t\t\tnextline = 50;\r\n\t\t}\r\n\t}\r\n\tif (setlevel) {\r\n\t\tPrintGameStr(8, nextline, quest_level_names[(BYTE)setlvlnum], COL_GOLD);\r\n\t} else if (currlevel != 0) {\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17 || currlevel > 20) {\r\n\t\t\tif (currlevel < 21 || currlevel > 24)\r\n\t\t\t\tsprintf(desc, \"Level: %i\", currlevel);\r\n\t\t\telse\r\n\t\t\t\tsprintf(desc, \"Level: Crypt %i\", currlevel - 20);\r\n\t\t} else {\r\n\t\t\tsprintf(desc, \"Level: Nest %i\", currlevel - 16);\r\n\t\t}\r\n#else\r\n\t\tsprintf(desc, \"Level: %i\", currlevel);\r\n#endif\r\n\t\tPrintGameStr(8, nextline, desc, COL_GOLD);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Renders the automap on screen.\r\n */\r\nvoid DrawAutomap()\r\n{\r\n\tint cells;\r\n\tint sx, sy;\r\n\tint i, j;\r\n\tint mapx, mapy;\r\n\r\n\tif (leveltype == DTYPE_TOWN) {\r\n\t\tDrawAutomapText();\r\n\t\treturn;\r\n\t}\r\n\r\n\tgpBufEnd = &gpBuffer[BUFFER_WIDTH * (SCREEN_Y + VIEWPORT_HEIGHT)];\r\n\r\n\tAutoMapX = (ViewX - 16) >> 1;\r\n\twhile (AutoMapX + AutoMapXOfs < 0)\r\n\t\tAutoMapXOfs++;\r\n\twhile (AutoMapX + AutoMapXOfs >= DMAXX)\r\n\t\tAutoMapXOfs--;\r\n\tAutoMapX += AutoMapXOfs;\r\n\r\n\tAutoMapY = (ViewY - 16) >> 1;\r\n\twhile (AutoMapY + AutoMapYOfs < 0)\r\n\t\tAutoMapYOfs++;\r\n\twhile (AutoMapY + AutoMapYOfs >= DMAXY)\r\n\t\tAutoMapYOfs--;\r\n\tAutoMapY += AutoMapYOfs;\r\n\r\n\tcells = AmShiftTab[(AutoMapScale - 50) / 5];\r\n\tif (ScrollInfo._sxoff + ScrollInfo._syoff)\r\n\t\tcells++;\r\n\tmapx = AutoMapX - cells;\r\n\tmapy = AutoMapY - 1;\r\n\r\n\tif (cells & 1) {\r\n\t\tsx = SCREEN_WIDTH / 2 + SCREEN_X - AmLine64 * ((cells - 1) >> 1);\r\n\t\tsy = (SCREEN_HEIGHT - PANEL_HEIGHT) / 2 + SCREEN_Y - AmLine32 * ((cells + 1) >> 1);\r\n\t} else {\r\n\t\tsx = SCREEN_WIDTH / 2 + SCREEN_X - AmLine64 * (cells >> 1) + AmLine32;\r\n\t\tsy = (SCREEN_HEIGHT - PANEL_HEIGHT) / 2 + SCREEN_Y - AmLine32 * (cells >> 1) - AmLine16;\r\n\t}\r\n\tif (ViewX & 1) {\r\n\t\tsx -= AmLine16;\r\n\t\tsy -= AmLine8;\r\n\t}\r\n\tif (ViewY & 1) {\r\n\t\tsx += AmLine16;\r\n\t\tsy -= AmLine8;\r\n\t}\r\n\r\n\tsx += AutoMapScale * ScrollInfo._sxoff / 100 >> 1;\r\n\tsy += AutoMapScale * ScrollInfo._syoff / 100 >> 1;\r\n\tif (invflag || sbookflag) {\r\n\t\tsx -= SCREEN_WIDTH / 4;\r\n\t}\r\n\tif (chrflag || questlog) {\r\n\t\tsx += SCREEN_WIDTH / 4;\r\n\t}\r\n\r\n\tfor (i = 0; i <= cells + 1; i++) {\r\n\t\tint x = sx;\r\n\t\tint y;\r\n\r\n\t\tfor (j = 0; j < cells; j++) {\r\n\t\t\tWORD maptype = GetAutomapType(mapx + j, mapy - j, TRUE);\r\n\t\t\tif (maptype != 0)\r\n\t\t\t\tDrawAutomapTile(x, sy, maptype);\r\n\t\t\tx += AmLine64;\r\n\t\t}\r\n\t\tmapy++;\r\n\t\tx = sx - AmLine32;\r\n\t\ty = sy + AmLine16;\r\n\t\tfor (j = 0; j <= cells; j++) {\r\n\t\t\tWORD maptype = GetAutomapType(mapx + j, mapy - j, TRUE);\r\n\t\t\tif (maptype != 0)\r\n\t\t\t\tDrawAutomapTile(x, y, maptype);\r\n\t\t\tx += AmLine64;\r\n\t\t}\r\n\t\tmapx++;\r\n\t\tsy += AmLine32;\r\n\t}\r\n\tDrawAutomapPlr();\r\n#ifdef HELLFIRE\r\n\tif (AutoMapShowItems)\r\n\t\tSearchAutomapItem();\r\n#endif\r\n\tDrawAutomapText();\r\n}\r\n\r\n/**\r\n * @brief Marks the given coordinate as within view on the automap.\r\n */\r\nvoid SetAutomapView(int x, int y)\r\n{\r\n\tWORD maptype, solid;\r\n\tint xx, yy;\r\n\r\n\txx = (x - 16) >> 1;\r\n\tyy = (y - 16) >> 1;\r\n\r\n\tif (xx < 0 || xx >= DMAXX || yy < 0 || yy >= DMAXY) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tautomapview[xx][yy] = TRUE;\r\n\r\n\tmaptype = GetAutomapType(xx, yy, FALSE);\r\n\tsolid = maptype & 0x4000;\r\n\r\n\tswitch (maptype & MAPFLAG_TYPE) {\r\n\tcase 2:\r\n\t\tif (solid) {\r\n\t\t\tif (GetAutomapType(xx, yy + 1, FALSE) == 0x4007)\r\n\t\t\t\tautomapview[xx][yy + 1] = TRUE;\r\n\t\t} else if (GetAutomapType(xx - 1, yy, FALSE) & 0x4000) {\r\n\t\t\tautomapview[xx - 1][yy] = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 3:\r\n\t\tif (solid) {\r\n\t\t\tif (GetAutomapType(xx + 1, yy, FALSE) == 0x4007)\r\n\t\t\t\tautomapview[xx + 1][yy] = TRUE;\r\n\t\t} else if (GetAutomapType(xx, yy - 1, FALSE) & 0x4000) {\r\n\t\t\tautomapview[xx][yy - 1] = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 4:\r\n\t\tif (solid) {\r\n\t\t\tif (GetAutomapType(xx, yy + 1, FALSE) == 0x4007)\r\n\t\t\t\tautomapview[xx][yy + 1] = TRUE;\r\n\t\t\tif (GetAutomapType(xx + 1, yy, FALSE) == 0x4007)\r\n\t\t\t\tautomapview[xx + 1][yy] = TRUE;\r\n\t\t} else {\r\n\t\t\tif (GetAutomapType(xx - 1, yy, FALSE) & 0x4000)\r\n\t\t\t\tautomapview[xx - 1][yy] = TRUE;\r\n\t\t\tif (GetAutomapType(xx, yy - 1, FALSE) & 0x4000)\r\n\t\t\t\tautomapview[xx][yy - 1] = TRUE;\r\n\t\t\tif (GetAutomapType(xx - 1, yy - 1, FALSE) & 0x4000)\r\n\t\t\t\tautomapview[xx - 1][yy - 1] = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 5:\r\n\t\tif (solid) {\r\n\t\t\tif (GetAutomapType(xx, yy - 1, FALSE) & 0x4000)\r\n\t\t\t\tautomapview[xx][yy - 1] = TRUE;\r\n\t\t\tif (GetAutomapType(xx, yy + 1, FALSE) == 0x4007)\r\n\t\t\t\tautomapview[xx][yy + 1] = TRUE;\r\n\t\t} else if (GetAutomapType(xx - 1, yy, FALSE) & 0x4000) {\r\n\t\t\tautomapview[xx - 1][yy] = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 6:\r\n\t\tif (solid) {\r\n\t\t\tif (GetAutomapType(xx - 1, yy, FALSE) & 0x4000)\r\n\t\t\t\tautomapview[xx - 1][yy] = TRUE;\r\n\t\t\tif (GetAutomapType(xx + 1, yy, FALSE) == 0x4007)\r\n\t\t\t\tautomapview[xx + 1][yy] = TRUE;\r\n\t\t} else if (GetAutomapType(xx, yy - 1, FALSE) & 0x4000) {\r\n\t\t\tautomapview[xx][yy - 1] = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Resets the zoom level of the automap.\r\n */\r\nvoid AutomapZoomReset()\r\n{\r\n\tAutoMapXOfs = 0;\r\n\tAutoMapYOfs = 0;\r\n\tAmLine64 = (AutoMapScale << 6) / 100;\r\n\tAmLine32 = AmLine64 >> 1;\r\n\tAmLine16 = AmLine32 >> 1;\r\n\tAmLine8 = AmLine16 >> 1;\r\n\tAmLine4 = AmLine8 >> 1;\r\n}\r\n"
  },
  {
    "path": "Source/automap.h",
    "content": "/**\r\n * @file automap.h\r\n *\r\n * Interface of the in-game map overlay.\r\n */\r\n#ifndef __AUTOMAP_H__\r\n#define __AUTOMAP_H__\r\n\r\nextern BOOL automapflag;\r\nextern BOOLEAN automapview[DMAXX][DMAXY];\r\nextern int AutoMapScale;\r\n\r\nvoid InitAutomapOnce();\r\nvoid InitAutomap();\r\nvoid StartAutomap();\r\nvoid AutomapUp();\r\nvoid AutomapDown();\r\nvoid AutomapLeft();\r\nvoid AutomapRight();\r\nvoid AutomapZoomIn();\r\nvoid AutomapZoomOut();\r\nvoid DrawAutomap();\r\nvoid SetAutomapView(int x, int y);\r\nvoid AutomapZoomReset();\r\n\r\n#endif /* __AUTOMAP_H__ */\r\n"
  },
  {
    "path": "Source/capture.cpp",
    "content": "/**\r\n * @file capture.cpp\r\n *\r\n * Implementation of the screenshot function.\r\n */\r\n#include \"all.h\"\r\n\r\n/**\r\n * @brief Write the PCX-file header\r\n * @param hFile File handler for the PCX file.\r\n * @param width Image width\r\n * @param height Image height\r\n * @return True on success\r\n */\r\nstatic BOOL CaptureHdr(HANDLE hFile, short width, short height)\r\n{\r\n\tDWORD lpNumBytes;\r\n\tPCXHEADER Buffer;\r\n\r\n\tmemset(&Buffer, 0, sizeof(Buffer));\r\n\tBuffer.Manufacturer = 10;\r\n\tBuffer.Version = 5;\r\n\tBuffer.Encoding = 1;\r\n\tBuffer.BitsPerPixel = 8;\r\n\tBuffer.Xmax = width - 1;\r\n\tBuffer.Ymax = height - 1;\r\n\tBuffer.HDpi = width;\r\n\tBuffer.VDpi = height;\r\n\tBuffer.NPlanes = 1;\r\n\tBuffer.BytesPerLine = width;\r\n\r\n\treturn WriteFile(hFile, &Buffer, sizeof(Buffer), &lpNumBytes, NULL) && lpNumBytes == sizeof(Buffer);\r\n}\r\n\r\n/**\r\n * @brief Write the current ingame palette to the PCX file\r\n * @param hFile File handler for the PCX file.\r\n * @param palette Current palette\r\n * @return True if successful, else false\r\n */\r\nstatic BOOL CapturePal(HANDLE hFile, PALETTEENTRY *palette)\r\n{\r\n\tDWORD NumberOfBytesWritten;\r\n\tBYTE pcx_palette[1 + 256 * 3];\r\n\tint i;\r\n\r\n\tpcx_palette[0] = 12;\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\tpcx_palette[1 + 3 * i + 0] = palette[i].peRed;\r\n\t\tpcx_palette[1 + 3 * i + 1] = palette[i].peGreen;\r\n\t\tpcx_palette[1 + 3 * i + 2] = palette[i].peBlue;\r\n\t}\r\n\r\n\treturn WriteFile(hFile, pcx_palette, sizeof(pcx_palette), &NumberOfBytesWritten, NULL) && NumberOfBytesWritten == sizeof(pcx_palette);\r\n}\r\n\r\n/**\r\n * @brief RLE compress the pixel data\r\n * @param src Raw pixel buffer\r\n * @param dst Output buffer\r\n * @param width Width of pixel buffer\r\n\r\n * @return Output buffer\r\n */\r\nstatic BYTE *CaptureEnc(BYTE *src, BYTE *dst, int width)\r\n{\r\n\tint rleLength;\r\n\r\n\tdo {\r\n\t\tBYTE rlePixel = *src;\r\n\t\t*src++;\r\n\t\trleLength = 1;\r\n\r\n\t\twidth--;\r\n\r\n\t\twhile (rlePixel == *src) {\r\n\t\t\tif (rleLength >= 63)\r\n\t\t\t\tbreak;\r\n\t\t\tif (!width)\r\n\t\t\t\tbreak;\r\n\t\t\trleLength++;\r\n\r\n\t\t\twidth--;\r\n\t\t\tsrc++;\r\n\t\t}\r\n\r\n\t\tif (rleLength > 1 || rlePixel > 0xBF) {\r\n\t\t\t*dst = rleLength | 0xC0;\r\n\t\t\t*dst++;\r\n\t\t}\r\n\r\n\t\t*dst = rlePixel;\r\n\t\t*dst++;\r\n\t} while (width);\r\n\r\n\treturn dst;\r\n}\r\n\r\n/**\r\n * @brief Write the pixel data to the PCX file\r\n * @param hFile File handler for the PCX file.\r\n * @param width Image width\r\n * @param height Image height\r\n * @param stride Buffer width\r\n * @param pixels Raw pixel buffer\r\n * @return True if successful, else false\r\n */\r\nstatic BOOL CapturePix(HANDLE hFile, WORD width, WORD height, WORD stride, BYTE *pixels)\r\n{\r\n\tint writeSize;\r\n\tDWORD lpNumBytes;\r\n\tBYTE *pBuffer, *pBufferEnd;\r\n\r\n\tpBuffer = (BYTE *)DiabloAllocPtr(2 * width);\r\n\twhile (height--) {\r\n\t\tpBufferEnd = CaptureEnc(pixels, pBuffer, width);\r\n\t\tpixels += stride;\r\n\t\twriteSize = pBufferEnd - pBuffer;\r\n\t\tif (!(WriteFile(hFile, pBuffer, writeSize, &lpNumBytes, NULL) && lpNumBytes == writeSize)) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\tmem_free_dbg(pBuffer);\r\n\treturn TRUE;\r\n}\r\n\r\nstatic HANDLE CaptureFile(char *dst_path)\r\n{\r\n\tBOOLEAN num_used[100];\r\n\tint free_num, hFind;\r\n\tstruct _finddata_t finder;\r\n\r\n\tmemset(num_used, FALSE, sizeof(num_used));\r\n\thFind = _findfirst(\"screen??.PCX\", &finder);\r\n\tif (hFind != -1) {\r\n\t\tdo {\r\n\t\t\tif (isdigit(finder.name[6]) && isdigit(finder.name[7])) {\r\n\t\t\t\tfree_num = 10 * (finder.name[6] - '0');\r\n\t\t\t\tfree_num += (finder.name[7] - '0');\r\n\t\t\t\tnum_used[free_num] = TRUE;\r\n\t\t\t}\r\n\t\t} while (_findnext(hFind, &finder) == 0);\r\n\t}\r\n\r\n\tfor (free_num = 0; free_num < 100; free_num++) {\r\n\t\tif (!num_used[free_num]) {\r\n\t\t\tsprintf(dst_path, \"screen%02d.PCX\", free_num);\r\n\t\t\treturn CreateFile(dst_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r\n\t\t}\r\n\t}\r\n\r\n\treturn INVALID_HANDLE_VALUE;\r\n}\r\n\r\n/**\r\n * @brief Make a red version of the given palette and apply it to the screen.\r\n * @param pal The original palette\r\n */\r\nstatic void RedPalette(PALETTEENTRY *pal)\r\n{\r\n\tPALETTEENTRY red[256];\r\n\tint i;\r\n\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\tred[i].peRed = pal[i].peRed;\r\n\t\tred[i].peGreen = 0;\r\n\t\tred[i].peBlue = 0;\r\n\t\tred[i].peFlags = 0;\r\n\t}\r\n\r\n\tlpDDPalette->SetEntries(0, 0, 256, red);\r\n}\r\n\r\n/**\r\n * @brief Save the current screen to a screen??.PCX (00-99) in file if available, then make the screen red for 200ms.\r\n\r\n */\r\nvoid CaptureScreen()\r\n{\r\n\tHANDLE hObject;\r\n\tPALETTEENTRY palette[256];\r\n\tchar FileName[MAX_PATH];\r\n\tBOOL success;\r\n\r\n\thObject = CaptureFile(FileName);\r\n\tif (hObject != INVALID_HANDLE_VALUE) {\r\n\t\tDrawAndBlit();\r\n\t\tlpDDPalette->GetEntries(0, 0, 256, palette);\r\n\t\tRedPalette(palette);\r\n\r\n\t\tlock_buf(2);\r\n\t\tsuccess = CaptureHdr(hObject, SCREEN_WIDTH, SCREEN_HEIGHT);\r\n\t\tif (success) {\r\n\t\t\tsuccess = CapturePix(hObject, SCREEN_WIDTH, SCREEN_HEIGHT, BUFFER_WIDTH, &gpBuffer[SCREENXY(0, 0)]);\r\n\t\t}\r\n\t\tif (success) {\r\n\t\t\tsuccess = CapturePal(hObject, palette);\r\n\t\t}\r\n\t\tunlock_buf(2);\r\n\t\tCloseHandle(hObject);\r\n\r\n\t\tif (!success)\r\n\t\t\tDeleteFile(FileName);\r\n\r\n\t\tSleep(300);\r\n\t\tlpDDPalette->SetEntries(0, 0, 256, palette);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/capture.h",
    "content": "/**\r\n * @file capture.h\r\n *\r\n * Interface of the screenshot function.\r\n */\r\n#ifndef __CAPTURE_H__\r\n#define __CAPTURE_H__\r\n\r\nvoid CaptureScreen();\r\n\r\n#endif /* __CAPTURE_H__ */\r\n"
  },
  {
    "path": "Source/codec.cpp",
    "content": "/**\r\n * @file codec.cpp\r\n *\r\n * Implementation of save game encryption algorithm.\r\n */\r\n#include \"all.h\"\r\n\r\ntypedef struct CodecSignature {\r\n\tDWORD checksum;\r\n\tBYTE error;\r\n\tBYTE last_chunk_size;\r\n\tWORD unused;\r\n} CodecSignature;\r\n\r\n#define BLOCKSIZE 64\r\n\r\nstatic void codec_init_key(int unused, const char *pszPassword)\r\n{\r\n\tint i, ch, n;\r\n\tchar key[136]; // last 64 bytes are the SHA1\r\n\tchar pw[64];\r\n\tchar digest[SHA1HashSize];\r\n\tchar *keyInit;\r\n\r\n\tsrand(0x7058);\r\n\r\n\tkeyInit = key;\r\n\tfor (i = 0; i < sizeof(key); i++) {\r\n\t\t*keyInit = rand();\r\n\t\tkeyInit++;\r\n\t}\r\n\tch = 0;\r\n\tfor (i = 0; i < 64; i++) {\r\n\t\tif (!pszPassword[ch])\r\n\t\t\tch = 0;\r\n\t\tpw[i] = pszPassword[ch];\r\n\t\tch++;\r\n\t}\r\n\tSHA1Reset(0);\r\n\tSHA1Calculate(0, pw, digest);\r\n\tSHA1Clear();\r\n\tfor (i = 0; i < sizeof(key); i++)\r\n\t\tkey[i] ^= digest[i % SHA1HashSize];\r\n\tmemset(pw, 0, sizeof(pw));\r\n\tmemset(digest, 0, sizeof(digest));\r\n\tfor (n = 0; n < 3; n++) {\r\n\t\tSHA1Reset(n);\r\n\t\tSHA1Calculate(n, &key[72], NULL);\r\n\t}\r\n\tmemset(key, 0, sizeof(key));\r\n}\r\n\r\nint codec_decode(BYTE *pbSrcDst, DWORD size, const char *pszPassword)\r\n{\r\n\tchar buf[128];\r\n\tchar dst[SHA1HashSize];\r\n\tint i;\r\n\tCodecSignature *sig;\r\n\r\n\tcodec_init_key(0, pszPassword);\r\n\tif (size <= sizeof(CodecSignature))\r\n\t\treturn 0;\r\n\tsize -= sizeof(CodecSignature);\r\n\tif (size % BLOCKSIZE != 0)\r\n\t\treturn 0;\r\n\tfor (i = size; i != 0; pbSrcDst += BLOCKSIZE, i -= BLOCKSIZE) {\r\n\t\tmemcpy(buf, pbSrcDst, BLOCKSIZE);\r\n\t\tSHA1Result(0, dst);\r\n\t\tfor (int j = 0; j < BLOCKSIZE; j++) {\r\n\t\t\tbuf[j] ^= dst[j % SHA1HashSize];\r\n\t\t}\r\n\t\tSHA1Calculate(0, buf, NULL);\r\n\t\tmemset(dst, 0, sizeof(dst));\r\n\t\tmemcpy(pbSrcDst, buf, BLOCKSIZE);\r\n\t}\r\n\r\n\tmemset(buf, 0, sizeof(buf));\r\n\tsig = (CodecSignature *)pbSrcDst;\r\n\tif (sig->error > 0) {\r\n\t\tgoto error;\r\n\t}\r\n\r\n\tSHA1Result(0, dst);\r\n\tif (sig->checksum != *(DWORD *)dst) {\r\n\t\tmemset(dst, 0, sizeof(dst));\r\n\t\tgoto error;\r\n\t}\r\n\r\n\tsize += sig->last_chunk_size - BLOCKSIZE;\r\n\tSHA1Clear();\r\n\treturn size;\r\nerror:\r\n\tSHA1Clear();\r\n\treturn 0;\r\n}\r\n\r\nDWORD codec_get_encoded_len(DWORD dwSrcBytes)\r\n{\r\n\tif (dwSrcBytes % BLOCKSIZE != 0)\r\n\t\tdwSrcBytes += BLOCKSIZE - (dwSrcBytes % BLOCKSIZE);\r\n\treturn dwSrcBytes + sizeof(CodecSignature);\r\n}\r\n\r\nvoid codec_encode(BYTE *pbSrcDst, DWORD size, int size_64, const char *pszPassword)\r\n{\r\n\tchar buf[128];\r\n\tchar tmp[SHA1HashSize];\r\n\tchar dst[SHA1HashSize];\r\n\tDWORD chunk;\r\n\tWORD last_chunk;\r\n\tCodecSignature *sig;\r\n\r\n\tif (size_64 != codec_get_encoded_len(size))\r\n\t\tapp_fatal(\"Invalid encode parameters\");\r\n\tcodec_init_key(1, pszPassword);\r\n\r\n\tlast_chunk = 0;\r\n\twhile (size != 0) {\r\n\t\tchunk = size < BLOCKSIZE ? size : BLOCKSIZE;\r\n\t\tmemcpy(buf, pbSrcDst, chunk);\r\n\t\tif (chunk < BLOCKSIZE)\r\n\t\t\tmemset(buf + chunk, 0, BLOCKSIZE - chunk);\r\n\t\tSHA1Result(0, dst);\r\n\t\tSHA1Calculate(0, buf, NULL);\r\n\t\tfor (int j = 0; j < BLOCKSIZE; j++) {\r\n\t\t\tbuf[j] ^= dst[j % SHA1HashSize];\r\n\t\t}\r\n\t\tmemset(dst, 0, sizeof(dst));\r\n\t\tmemcpy(pbSrcDst, buf, BLOCKSIZE);\r\n\t\tlast_chunk = chunk;\r\n\t\tpbSrcDst += BLOCKSIZE;\r\n\t\tsize -= chunk;\r\n\t}\r\n\tmemset(buf, 0, sizeof(buf));\r\n\tSHA1Result(0, tmp);\r\n\tsig = (CodecSignature *)pbSrcDst;\r\n\tsig->error = 0;\r\n\tsig->unused = 0;\r\n\tsig->checksum = *(DWORD *)&tmp[0];\r\n\tsig->last_chunk_size = last_chunk;\r\n\tSHA1Clear();\r\n}\r\n"
  },
  {
    "path": "Source/codec.h",
    "content": "/**\r\n * @file codec.h\r\n *\r\n * Interface of save game encryption algorithm.\r\n */\r\n#ifndef __CODEC_H__\r\n#define __CODEC_H__\r\n\r\nint codec_decode(BYTE *pbSrcDst, DWORD size, const char *pszPassword);\r\nDWORD codec_get_encoded_len(DWORD dwSrcBytes);\r\nvoid codec_encode(BYTE *pbSrcDst, DWORD size, int size_64, const char *pszPassword);\r\n\r\n#endif /* __CODEC_H__ */\r\n"
  },
  {
    "path": "Source/control.cpp",
    "content": "/**\r\n * @file control.cpp\r\n *\r\n * Implementation of the character and main control panels\r\n */\r\n#include \"all.h\"\r\n\r\nBYTE sgbNextTalkSave;\r\nBYTE sgbTalkSavePos;\r\nBYTE *pDurIcons;\r\nBYTE *pChrButtons;\r\nBOOL drawhpflag;\r\nBOOL dropGoldFlag;\r\nBOOL panbtn[8];\r\nBOOL chrbtn[4];\r\nBYTE *pMultiBtns;\r\nBYTE *pPanelButtons;\r\nBYTE *pChrPanel;\r\nBOOL lvlbtndown;\r\nchar sgszTalkSave[8][80];\r\nint dropGoldValue;\r\nBOOL drawmanaflag;\r\nBOOL chrbtnactive;\r\nchar sgszTalkMsg[MAX_SEND_STR_LEN];\r\nBYTE *pPanelText;\r\n/** current frame # for the pentagram caret in gold input */\r\nint nGoldFrame;\r\nBYTE *pLifeBuff;\r\nBYTE *pBtmBuff;\r\nBYTE *pTalkBtns;\r\nBOOL pstrjust[4];\r\nint pnumlines;\r\nBOOL pinfoflag;\r\nBOOL talkbtndown[3];\r\nint pSpell;\r\nBYTE *pManaBuff;\r\nchar infoclr;\r\nint sgbPlrTalkTbl;\r\nBYTE *pGBoxBuff;\r\nBYTE *pSBkBtnCel;\r\nchar tempstr[256];\r\nBOOLEAN whisper[MAX_PLRS];\r\nint sbooktab;\r\nint pSplType;\r\n/** current frame # for the pentagram caret in chat input */\r\nint frame;\r\nint initialDropGoldIndex;\r\nBOOL talkflag;\r\nBYTE *pSBkIconCels;\r\nBOOL sbookflag;\r\nBOOL chrflag;\r\nBOOL drawbtnflag;\r\nBYTE *pSpellBkCel;\r\nchar infostr[256];\r\nint numpanbtns;\r\nBYTE *pStatusPanel;\r\nchar panelstr[4][64];\r\nBOOL panelflag;\r\nBYTE SplTransTbl[256];\r\nint initialDropGoldValue;\r\nBYTE *pSpellCels;\r\nBOOL panbtndown;\r\nBYTE *pTalkPanel;\r\nBOOL spselflag;\r\n\r\n/** Maps from font index to smaltext.cel frame number. */\r\nconst BYTE fontframe[128] = {\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 54, 44, 57, 58, 56, 55, 47, 40, 41, 59, 39, 50, 37, 51, 52,\r\n\t36, 27, 28, 29, 30, 31, 32, 33, 34, 35, 48, 49, 60, 38, 61, 53,\r\n\t62, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\r\n\t16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 42, 63, 43, 64, 65,\r\n\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\r\n\t16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 40, 66, 41, 67, 0\r\n};\r\n\r\n/**\r\n * Maps from smaltext.cel frame number to character width. Note, the\r\n * character width may be distinct from the frame width, which is 13 for every\r\n * smaltext.cel frame.\r\n */\r\nconst BYTE fontkern[68] = {\r\n\t8, 10, 7, 9, 8, 7, 6, 8, 8, 3,\r\n\t3, 8, 6, 11, 9, 10, 6, 9, 9, 6,\r\n\t9, 11, 10, 13, 10, 11, 7, 5, 7, 7,\r\n\t8, 7, 7, 7, 7, 7, 10, 4, 5, 6,\r\n\t3, 3, 4, 3, 6, 6, 3, 3, 3, 3,\r\n\t3, 2, 7, 6, 3, 10, 10, 6, 6, 7,\r\n\t4, 4, 9, 6, 6, 12, 3, 7\r\n};\r\n/**\r\n * Line start position for info box text when displaying 1, 2, 3, 4 and 5 lines respectivly\r\n */\r\nconst int lineOffsets[5][5] = {\r\n\t{\r\n\t    SCREENXY(177, 434),\r\n\t    SCREENXY(-64, -128),\r\n\t    SCREENXY(-64, -128),\r\n\t    SCREENXY(-64, -128),\r\n\t    SCREENXY(116, -128),\r\n\t},\r\n\t{\r\n\t    SCREENXY(177, 422),\r\n\t    SCREENXY(177, 446),\r\n\t    SCREENXY(-64, -128),\r\n\t    SCREENXY(-64, -128),\r\n\t    SCREENXY(-64, -128),\r\n\t},\r\n\t{\r\n\t    SCREENXY(177, 416),\r\n\t    SCREENXY(177, 434),\r\n\t    SCREENXY(177, 452),\r\n\t    SCREENXY(-64, -128),\r\n\t    SCREENXY(-64, -128),\r\n\t},\r\n\t{\r\n\t    SCREENXY(177, 412),\r\n\t    SCREENXY(177, 427),\r\n\t    SCREENXY(177, 441),\r\n\t    SCREENXY(177, 456),\r\n\t    SCREENXY(-64, -128),\r\n\t},\r\n\t{\r\n\t    SCREENXY(177, 410),\r\n\t    SCREENXY(177, 422),\r\n\t    SCREENXY(177, 434),\r\n\t    SCREENXY(177, 446),\r\n\t    SCREENXY(177, 457),\r\n\t}\r\n};\r\n\r\n/**\r\n * Maps ASCII character code to font index, as used by the\r\n * small, medium and large sized fonts; which corresponds to smaltext.cel,\r\n * medtexts.cel and bigtgold.cel respectively.\r\n */\r\nconst BYTE gbFontTransTbl[256] = {\r\n\t// clang-format off\r\n\t'\\0', 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r\n\t0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r\n\t' ',  '!',  '\\\"', '#',  '$',  '%',  '&',  '\\'', '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',\r\n\t'0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',  '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',\r\n\t'@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',\r\n\t'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z',  '[',  '\\\\', ']',  '^',  '_',\r\n\t'`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',\r\n\t'p',  'q',  'r',  's',  't',  'u',  'v',  'w',  'x',  'y',  'z',  '{',  '|',  '}',  '~',  0x01,\r\n\t'C',  'u',  'e',  'a',  'a',  'a',  'a',  'c',  'e',  'e',  'e',  'i',  'i',  'i',  'A',  'A',\r\n\t'E',  'a',  'A',  'o',  'o',  'o',  'u',  'u',  'y',  'O',  'U',  'c',  'L',  'Y',  'P',  'f',\r\n\t'a',  'i',  'o',  'u',  'n',  'N',  'a',  'o',  '?',  0x01, 0x01, 0x01, 0x01, '!',  '<',  '>',\r\n\t'o',  '+',  '2',  '3',  '\\'', 'u',  'P',  '.',  ',',  '1',  '0',  '>',  0x01, 0x01, 0x01, '?',\r\n\t'A',  'A',  'A',  'A',  'A',  'A',  'A',  'C',  'E',  'E',  'E',  'E',  'I',  'I',  'I',  'I',\r\n\t'D',  'N',  'O',  'O',  'O',  'O',  'O',  'X',  '0',  'U',  'U',  'U',  'U',  'Y',  'b',  'B',\r\n\t'a',  'a',  'a',  'a',  'a',  'a',  'a',  'c',  'e',  'e',  'e',  'e',  'i',  'i',  'i',  'i',\r\n\t'o',  'n',  'o',  'o',  'o',  'o',  'o',  '/',  '0',  'u',  'u',  'u',  'u',  'y',  'b',  'y',\r\n\t// clang-format on\r\n};\r\n\r\n/* data */\r\n\r\n/** Maps from spell_id to spelicon.cel frame number. */\r\nchar SpellITbl[MAX_SPELLS] = {\r\n#ifdef HELLFIRE\r\n\t27,\r\n#else\r\n\t1,\r\n#endif\r\n\t1,\r\n\t2,\r\n\t3,\r\n\t4,\r\n\t5,\r\n\t6,\r\n\t7,\r\n\t8,\r\n\t9,\r\n\t28,\r\n\t13,\r\n\t12,\r\n\t18,\r\n\t16,\r\n\t14,\r\n\t18,\r\n\t19,\r\n\t11,\r\n\t20,\r\n\t15,\r\n\t21,\r\n\t23,\r\n\t24,\r\n\t25,\r\n\t22,\r\n\t26,\r\n\t29,\r\n\t37,\r\n\t38,\r\n\t39,\r\n\t42,\r\n\t41,\r\n\t40,\r\n\t10,\r\n\t36,\r\n\t30,\r\n#ifdef HELLFIRE\r\n\t51,\r\n\t51,\r\n\t50,\r\n\t46,\r\n\t47,\r\n\t43,\r\n\t45,\r\n\t48,\r\n\t49,\r\n\t44,\r\n\t35,\r\n\t35,\r\n\t35,\r\n\t35,\r\n\t35,\r\n#endif\r\n};\r\n/** Maps from panel_button_id to the position and dimensions of a panel button. */\r\nint PanBtnPos[8][5] = {\r\n\t// clang-format off\r\n\t{ PANEL_LEFT +   9, PANEL_TOP +   9, 71, 19, TRUE  }, // char button\r\n\t{ PANEL_LEFT +   9, PANEL_TOP +  35, 71, 19, FALSE }, // quests button\r\n\t{ PANEL_LEFT +   9, PANEL_TOP +  75, 71, 19, TRUE  }, // map button\r\n\t{ PANEL_LEFT +   9, PANEL_TOP + 101, 71, 19, FALSE }, // menu button\r\n\t{ PANEL_LEFT + 560, PANEL_TOP +   9, 71, 19, TRUE  }, // inv button\r\n\t{ PANEL_LEFT + 560, PANEL_TOP +  35, 71, 19, FALSE }, // spells button\r\n\t{ PANEL_LEFT +  87, PANEL_TOP +  91, 33, 32, TRUE  }, // chat button\r\n\t{ PANEL_LEFT + 527, PANEL_TOP +  91, 33, 32, TRUE  }, // friendly fire button\r\n\t// clang-format on\r\n};\r\n/** Maps from panel_button_id to hotkey name. */\r\nconst char *const PanBtnHotKey[8] = { \"'c'\", \"'q'\", \"Tab\", \"Esc\", \"'i'\", \"'b'\", \"Enter\", NULL };\r\n/** Maps from panel_button_id to panel button description. */\r\nconst char *const PanBtnStr[8] = {\r\n\t\"Character Information\",\r\n\t\"Quests log\",\r\n\t\"Automap\",\r\n\t\"Main Menu\",\r\n\t\"Inventory\",\r\n\t\"Spell book\",\r\n\t\"Send Message\",\r\n\t\"Player Attack\"\r\n};\r\n/** Maps from attribute_id to the rectangle on screen used for attribute increment buttons. */\r\nRECT32 ChrBtnsRect[4] = {\r\n\t{ 137, 138, 41, 22 },\r\n\t{ 137, 166, 41, 22 },\r\n\t{ 137, 195, 41, 22 },\r\n\t{ 137, 223, 41, 22 }\r\n};\r\n\r\n/** Maps from spellbook page number and position to spell_id. */\r\nint SpellPages[6][7] = {\r\n\t{ SPL_NULL, SPL_FIREBOLT, SPL_CBOLT, SPL_HBOLT, SPL_HEAL, SPL_HEALOTHER, SPL_FLAME },\r\n\t{ SPL_RESURRECT, SPL_FIREWALL, SPL_TELEKINESIS, SPL_LIGHTNING, SPL_TOWN, SPL_FLASH, SPL_STONE },\r\n\t{ SPL_RNDTELEPORT, SPL_MANASHIELD, SPL_ELEMENT, SPL_FIREBALL, SPL_WAVE, SPL_CHAIN, SPL_GUARDIAN },\r\n\t{ SPL_NOVA, SPL_GOLEM, SPL_TELEPORT, SPL_APOCA, SPL_BONESPIRIT, SPL_FLARE, SPL_ETHEREALIZE },\r\n#ifndef HELLFIRE\r\n\t{ -1, -1, -1, -1, -1, -1, -1 },\r\n#else\r\n\t{ SPL_LIGHTWALL, SPL_IMMOLAT, SPL_WARP, SPL_REFLECT, SPL_BERSERK, SPL_FIRERING, SPL_SEARCH },\r\n#endif\r\n\t{ -1, -1, -1, -1, -1, -1, -1 }\r\n};\r\n\r\n#define SPLICONLENGTH 56\r\n#define SPLROWICONLS 10\r\n#ifdef HELLFIRE\r\n#define SPLICONLAST 52\r\n#else\r\n#define SPLICONLAST 43\r\n#endif\r\n\r\n/**\r\n * Draw spell cell onto the back buffer.\r\n * @param xp Back buffer coordinate\r\n * @param yp Back buffer coordinate\r\n * @param Trans Pointer to the cel buffer.\r\n * @param nCel Index of the cel frame to draw. 0 based.\r\n * @param w Width of the frame.\r\n */\r\nvoid DrawSpellCel(int xp, int yp, BYTE *Trans, int nCel, int w)\r\n{\r\n\tBYTE *dst, *tbl, *end;\r\n\r\n\tassert(gpBuffer);\r\n\r\n\tdst = &gpBuffer[xp + PitchTbl[yp]];\r\n\ttbl = &SplTransTbl[0];\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, Trans\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\teax, [ebx+4]\r\n\t\tsub\t\teax, [ebx]\r\n\t\tmov\t\tend, eax\r\n\t\tmov\t\tesi, Trans\r\n\t\tadd\t\tesi, [ebx]\r\n\t\tmov\t\tedi, dst\r\n\t\tmov\t\teax, end\r\n\t\tadd\t\teax, esi\r\n\t\tmov\t\tend, eax\r\n\t\tmov\t\tebx, tbl\r\n\tlabel1:\r\n\t\tmov\t\tedx, w\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel6\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel3\r\n\t\tlodsb\r\n\t\txlat\r\n\t\tstosb\r\n\t\tjecxz\tlabel5\r\n\tlabel3:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tlodsw\r\n\t\txlat\r\n\t\tror\t\tax, 8\r\n\t\txlat\r\n\t\tror\t\tax, 8\r\n\t\tstosw\r\n\t\tjecxz\tlabel5\r\n\tlabel4:\r\n\t\tlodsd\r\n\t\txlat\r\n\t\tror\t\teax, 8\r\n\t\txlat\r\n\t\tror\t\teax, 8\r\n\t\txlat\r\n\t\tror\t\teax, 8\r\n\t\txlat\r\n\t\tror\t\teax, 8\r\n\t\tstosd\r\n\t\tloop\tlabel4\r\n\tlabel5:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel7\r\n\t\tjmp\t\tlabel2\r\n\tlabel6:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel7:\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tesi, end\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src;\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)&Trans[4 * nCel];\r\n\tsrc = &Trans[pFrameTable[0]];\r\n\tend = &src[pFrameTable[1] - pFrameTable[0]];\r\n\r\n\tfor (; src != end; dst -= BUFFER_WIDTH + w) {\r\n\t\tfor (i = w; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\t// asm_cel_light_edge(width, tbl, dst, src);\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\tsrc++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\tdst[2] = tbl[src[2]];\r\n\t\t\t\t\tdst[3] = tbl[src[3]];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid SetSpellTrans(char t)\r\n{\r\n\tint i;\r\n\r\n\tif (t == RSPLTYPE_SKILL) {\r\n\t\tfor (i = 0; i < 128; i++)\r\n\t\t\tSplTransTbl[i] = i;\r\n\t}\r\n\tfor (i = 128; i < 256; i++)\r\n\t\tSplTransTbl[i] = i;\r\n\tSplTransTbl[255] = 0;\r\n\r\n\tswitch (t) {\r\n\tcase RSPLTYPE_SPELL:\r\n\t\tSplTransTbl[PAL8_YELLOW] = PAL16_BLUE + 1;\r\n\t\tSplTransTbl[PAL8_YELLOW + 1] = PAL16_BLUE + 3;\r\n\t\tSplTransTbl[PAL8_YELLOW + 2] = PAL16_BLUE + 5;\r\n\t\tfor (i = PAL16_BLUE; i < PAL16_BLUE + 16; i++) {\r\n\t\t\tSplTransTbl[PAL16_BEIGE - PAL16_BLUE + i] = i;\r\n\t\t\tSplTransTbl[PAL16_YELLOW - PAL16_BLUE + i] = i;\r\n\t\t\tSplTransTbl[PAL16_ORANGE - PAL16_BLUE + i] = i;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase RSPLTYPE_SCROLL:\r\n\t\tSplTransTbl[PAL8_YELLOW] = PAL16_BEIGE + 1;\r\n\t\tSplTransTbl[PAL8_YELLOW + 1] = PAL16_BEIGE + 3;\r\n\t\tSplTransTbl[PAL8_YELLOW + 2] = PAL16_BEIGE + 5;\r\n\t\tfor (i = PAL16_BEIGE; i < PAL16_BEIGE + 16; i++) {\r\n\t\t\tSplTransTbl[PAL16_YELLOW - PAL16_BEIGE + i] = i;\r\n\t\t\tSplTransTbl[PAL16_ORANGE - PAL16_BEIGE + i] = i;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase RSPLTYPE_CHARGES:\r\n\t\tSplTransTbl[PAL8_YELLOW] = PAL16_ORANGE + 1;\r\n\t\tSplTransTbl[PAL8_YELLOW + 1] = PAL16_ORANGE + 3;\r\n\t\tSplTransTbl[PAL8_YELLOW + 2] = PAL16_ORANGE + 5;\r\n\t\tfor (i = PAL16_ORANGE; i < PAL16_ORANGE + 16; i++) {\r\n\t\t\tSplTransTbl[PAL16_BEIGE - PAL16_ORANGE + i] = i;\r\n\t\t\tSplTransTbl[PAL16_YELLOW - PAL16_ORANGE + i] = i;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase RSPLTYPE_INVALID:\r\n\t\tSplTransTbl[PAL8_YELLOW] = PAL16_GRAY + 1;\r\n\t\tSplTransTbl[PAL8_YELLOW + 1] = PAL16_GRAY + 3;\r\n\t\tSplTransTbl[PAL8_YELLOW + 2] = PAL16_GRAY + 5;\r\n\t\tfor (i = PAL16_GRAY; i < PAL16_GRAY + 15; i++) {\r\n\t\t\tSplTransTbl[PAL16_BEIGE - PAL16_GRAY + i] = i;\r\n\t\t\tSplTransTbl[PAL16_YELLOW - PAL16_GRAY + i] = i;\r\n\t\t\tSplTransTbl[PAL16_ORANGE - PAL16_GRAY + i] = i;\r\n\t\t}\r\n\t\tSplTransTbl[PAL16_BEIGE + 15] = 0;\r\n\t\tSplTransTbl[PAL16_YELLOW + 15] = 0;\r\n\t\tSplTransTbl[PAL16_ORANGE + 15] = 0;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/**\r\n * Sets the spell frame to draw and its position then draws it.\r\n */\r\nvoid DrawSpell()\r\n{\r\n\tchar spl, st;\r\n\tint tlvl;\r\n\r\n\tspl = plr[myplr]._pRSpell;\r\n\tst = plr[myplr]._pRSplType;\r\n\r\n\t// BUGFIX: Move the next line into the if statement to avoid OOB (SPL_INVALID is -1)\r\n\ttlvl = plr[myplr]._pISplLvlAdd + plr[myplr]._pSplLvl[spl];\r\n\tif (st == RSPLTYPE_SPELL && spl != SPL_INVALID) {\r\n\t\tif (!CheckSpell(myplr, spl, RSPLTYPE_SPELL, TRUE))\r\n\t\t\tst = RSPLTYPE_INVALID;\r\n\t\tif (tlvl <= 0)\r\n\t\t\tst = RSPLTYPE_INVALID;\r\n\t}\r\n\tif (currlevel == 0 && st != RSPLTYPE_INVALID && !spelldata[spl].sTownSpell)\r\n\t\tst = RSPLTYPE_INVALID;\r\n\tif (plr[myplr]._pRSpell < 0)\r\n\t\tst = RSPLTYPE_INVALID;\r\n\tSetSpellTrans(st);\r\n\tif (spl != SPL_INVALID)\r\n\t\tDrawSpellCel(PANEL_X + 565, PANEL_Y + 119, pSpellCels, SpellITbl[spl], SPLICONLENGTH);\r\n\telse\r\n\t\tDrawSpellCel(PANEL_X + 565, PANEL_Y + 119, pSpellCels, 27, SPLICONLENGTH);\r\n}\r\n\r\nvoid DrawSpellList()\r\n{\r\n\tint i, j, x, y, c, s, t, v, lx, ly, trans;\r\n\tunsigned __int64 mask, spl;\r\n\r\n\tpSpell = SPL_INVALID;\r\n\tinfostr[0] = '\\0';\r\n\tx = PANEL_X + 12 + SPLICONLENGTH * SPLROWICONLS;\r\n\ty = PANEL_Y - 17;\r\n\tClearPanel();\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tswitch ((spell_type)i) {\r\n\t\tcase RSPLTYPE_SKILL:\r\n\t\t\tSetSpellTrans(RSPLTYPE_SKILL);\r\n\t\t\tmask = plr[myplr]._pAblSpells;\r\n\t\t\tc = SPLICONLAST + 3;\r\n\t\t\tbreak;\r\n\t\tcase RSPLTYPE_SPELL:\r\n\t\t\tmask = plr[myplr]._pMemSpells;\r\n\t\t\tc = SPLICONLAST + 4;\r\n\t\t\tbreak;\r\n\t\tcase RSPLTYPE_SCROLL:\r\n\t\t\tSetSpellTrans(RSPLTYPE_SCROLL);\r\n\t\t\tmask = plr[myplr]._pScrlSpells;\r\n\t\t\tc = SPLICONLAST + 1;\r\n\t\t\tbreak;\r\n\t\tcase RSPLTYPE_CHARGES:\r\n\t\t\tSetSpellTrans(RSPLTYPE_CHARGES);\r\n\t\t\tmask = plr[myplr]._pISpells;\r\n\t\t\tc = SPLICONLAST + 2;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tfor (spl = 1, j = 1; j < MAX_SPELLS; spl <<= 1, j++) {\r\n\t\t\tif (!(mask & spl))\r\n\t\t\t\tcontinue;\r\n\t\t\tif (i == RSPLTYPE_SPELL) {\r\n\t\t\t\ts = plr[myplr]._pISplLvlAdd + plr[myplr]._pSplLvl[j];\r\n\t\t\t\tif (s < 0)\r\n\t\t\t\t\ts = 0;\r\n\t\t\t\tif (s > 0)\r\n\t\t\t\t\ttrans = RSPLTYPE_SPELL;\r\n\t\t\t\telse\r\n\t\t\t\t\ttrans = RSPLTYPE_INVALID;\r\n\t\t\t\tSetSpellTrans(trans);\r\n\t\t\t}\r\n\t\t\tif (currlevel == 0 && !spelldata[j].sTownSpell)\r\n\t\t\t\tSetSpellTrans(RSPLTYPE_INVALID);\r\n\t\t\tDrawSpellCel(x, y, pSpellCels, SpellITbl[j], SPLICONLENGTH);\r\n\t\t\tlx = x - BORDER_LEFT;\r\n\t\t\tly = y - BORDER_TOP - SPLICONLENGTH;\r\n\t\t\tif (MouseX >= lx && MouseX < lx + SPLICONLENGTH && MouseY >= ly && MouseY < ly + SPLICONLENGTH) {\r\n\t\t\t\tpSpell = j;\r\n\t\t\t\tpSplType = i;\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (plr[myplr]._pClass == PC_MONK && j == SPL_SEARCH)\r\n\t\t\t\t\tpSplType = RSPLTYPE_SKILL;\r\n#endif\r\n\t\t\t\tDrawSpellCel(x, y, pSpellCels, c, SPLICONLENGTH);\r\n#ifdef HELLFIRE\r\n\t\t\t\tswitch (pSplType) {\r\n#else\r\n\t\t\t\tswitch (i) {\r\n#endif\r\n\t\t\t\tcase RSPLTYPE_SKILL:\r\n\t\t\t\t\tsprintf(infostr, \"%s Skill\", spelldata[pSpell].sSkillText);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase RSPLTYPE_SPELL:\r\n\t\t\t\t\tsprintf(infostr, \"%s Spell\", spelldata[pSpell].sNameText);\r\n\t\t\t\t\tif (pSpell == SPL_HBOLT) {\r\n\t\t\t\t\t\tsprintf(tempstr, \"Damages undead only\");\r\n\t\t\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (s == 0)\r\n\t\t\t\t\t\tsprintf(tempstr, \"Spell Level 0 - Unusable\");\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tsprintf(tempstr, \"Spell Level %i\", s);\r\n\t\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase RSPLTYPE_SCROLL:\r\n\t\t\t\t\tsprintf(infostr, \"Scroll of %s\", spelldata[pSpell].sNameText);\r\n\t\t\t\t\tv = 0;\r\n\t\t\t\t\tfor (t = 0; t < plr[myplr]._pNumInv; t++) {\r\n\t\t\t\t\t\tif (plr[myplr].InvList[t]._itype != ITYPE_NONE\r\n\t\t\t\t\t\t    && (plr[myplr].InvList[t]._iMiscId == IMISC_SCROLL || plr[myplr].InvList[t]._iMiscId == IMISC_SCROLLT)\r\n\t\t\t\t\t\t    && plr[myplr].InvList[t]._iSpell == pSpell) {\r\n\t\t\t\t\t\t\tv++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (t = 0; t < MAXBELTITEMS; t++) {\r\n\t\t\t\t\t\tif (plr[myplr].SpdList[t]._itype != ITYPE_NONE\r\n\t\t\t\t\t\t    && (plr[myplr].SpdList[t]._iMiscId == IMISC_SCROLL || plr[myplr].SpdList[t]._iMiscId == IMISC_SCROLLT)\r\n\t\t\t\t\t\t    && plr[myplr].SpdList[t]._iSpell == pSpell) {\r\n\t\t\t\t\t\t\tv++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (v == 1)\r\n\t\t\t\t\t\tstrcpy(tempstr, \"1 Scroll\");\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tsprintf(tempstr, \"%i Scrolls\", v);\r\n\t\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase RSPLTYPE_CHARGES:\r\n\t\t\t\t\tsprintf(infostr, \"Staff of %s\", spelldata[pSpell].sNameText);\r\n\t\t\t\t\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges == 1)\r\n\t\t\t\t\t\tstrcpy(tempstr, \"1 Charge\");\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tsprintf(tempstr, \"%i Charges\", plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges);\r\n\t\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tfor (t = 0; t < 4; t++) {\r\n\t\t\t\t\tif (plr[myplr]._pSplHotKey[t] == pSpell && plr[myplr]._pSplTHotKey[t] == pSplType) {\r\n\t\t\t\t\t\tDrawSpellCel(x, y, pSpellCels, t + SPLICONLAST + 5, SPLICONLENGTH);\r\n\t\t\t\t\t\tsprintf(tempstr, \"Spell Hot Key #F%i\", t + 5);\r\n\t\t\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx -= SPLICONLENGTH;\r\n\t\t\tif (x == PANEL_X + 12 - SPLICONLENGTH) {\r\n\t\t\t\tx = PANEL_X + 12 + SPLICONLENGTH * SPLROWICONLS;\r\n\t\t\t\ty -= SPLICONLENGTH;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (mask != 0 && x != PANEL_X + 12 + SPLICONLENGTH * SPLROWICONLS)\r\n\t\t\tx -= SPLICONLENGTH;\r\n\t\tif (x == PANEL_X + 12 - SPLICONLENGTH) {\r\n\t\t\tx = PANEL_X + 12 + SPLICONLENGTH * SPLROWICONLS;\r\n\t\t\ty -= SPLICONLENGTH;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetSpell()\r\n{\r\n\tspselflag = FALSE;\r\n\tif (pSpell != SPL_INVALID) {\r\n\t\tClearPanel();\r\n\t\tplr[myplr]._pRSpell = pSpell;\r\n\t\tplr[myplr]._pRSplType = pSplType;\r\n\t\tforce_redraw = 255;\r\n\t}\r\n}\r\n\r\nvoid SetSpeedSpell(int slot)\r\n{\r\n\tint i;\r\n\r\n\tif (pSpell != SPL_INVALID) {\r\n\t\tfor (i = 0; i < 4; ++i) {\r\n\t\t\tif (plr[myplr]._pSplHotKey[i] == pSpell && plr[myplr]._pSplTHotKey[i] == pSplType)\r\n\t\t\t\tplr[myplr]._pSplHotKey[i] = SPL_INVALID;\r\n\t\t}\r\n\t\tplr[myplr]._pSplHotKey[slot] = pSpell;\r\n\t\tplr[myplr]._pSplTHotKey[slot] = pSplType;\r\n\t}\r\n}\r\n\r\nvoid ToggleSpell(int slot)\r\n{\r\n\tunsigned __int64 spells;\r\n\r\n\tif (plr[myplr]._pSplHotKey[slot] == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tswitch (plr[myplr]._pSplTHotKey[slot]) {\r\n\tcase RSPLTYPE_SKILL:\r\n\t\tspells = plr[myplr]._pAblSpells;\r\n\t\tbreak;\r\n\tcase RSPLTYPE_SPELL:\r\n\t\tspells = plr[myplr]._pMemSpells;\r\n\t\tbreak;\r\n\tcase RSPLTYPE_SCROLL:\r\n\t\tspells = plr[myplr]._pScrlSpells;\r\n\t\tbreak;\r\n\tcase RSPLTYPE_CHARGES:\r\n\t\tspells = plr[myplr]._pISpells;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (spells & SPELLBIT(plr[myplr]._pSplHotKey[slot])) {\r\n\t\tplr[myplr]._pRSpell = plr[myplr]._pSplHotKey[slot];\r\n\t\tplr[myplr]._pRSplType = plr[myplr]._pSplTHotKey[slot];\r\n\t\tforce_redraw = 255;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Print letter to the back buffer\r\n * @param nOffset Back buffer offset\r\n * @param nCel Number of letter in Windows-1252\r\n * @param col text_color color value\r\n */\r\nvoid PrintChar(int nOffset, int nCel, char col)\r\n{\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pPanelText\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\tedx, [ebx+4]\r\n\t\tsub\t\tedx, [ebx]\r\n\t\tmov\t\tesi, pPanelText\r\n\t\tadd\t\tesi, [ebx]\r\n\t\tmov\t\tedi, gpBuffer\r\n\t\tadd\t\tedi, nOffset\r\n\t\tmov\t\tebx, edx\r\n\t\tadd\t\tebx, esi\r\n\t\txor\t\tedx, edx\r\n\t\tmov\t\tdl, col\r\n\t\tcmp\t\tedx, COL_WHITE\r\n\t\tjz\t\tc0_label1\r\n\t\tcmp\t\tedx, COL_BLUE\r\n\t\tjz\t\tc1_label1\r\n\t\tcmp\t\tedx, COL_RED\r\n\t\tjz\t\tc2_label1\r\n\t\tjmp\t\td_label1\r\n\r\n\t\t            // Case 0\r\n\tc0_label1:\r\n\t\tmov\t\tedx, 13\r\n\tc0_label2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tc0_label6\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tc0_label3\r\n\t\tmovsb\r\n\t\tjecxz\tc0_label5\r\n\tc0_label3:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tc0_label4\r\n\t\tmovsw\r\n\t\tjecxz\tc0_label5\r\n\tc0_label4:\r\n\t\trep movsd\r\n\tc0_label5:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tc0_label7\r\n\t\tjmp\t\tc0_label2\r\n\tc0_label6:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tc0_label2\r\n\tc0_label7:\r\n\t\tsub\t\tedi, BUFFER_WIDTH + 13\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tc0_label1\r\n\t\tjmp\t\tlabret\r\n\r\n\t\t            // Case 1\r\n\tc1_label1:\r\n\t\tmov\t\tedx, 13\r\n\tc1_label2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tc1_label6\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\tc1_label3:\r\n\t\tlodsb\r\n\t\tcmp\t\tal, PAL16_GRAY + 13\r\n\t\tja\t\tc1_label4\r\n\t\tcmp\t\tal, PAL16_GRAY\r\n\t\tjb\t\tc1_label5\r\n\t\tsub\t\tal, PAL16_GRAY - (PAL16_BLUE + 2)\r\n\t\tjmp\t\tc1_label5\r\n\tc1_label4:\r\n\t\tmov\t\tal, PAL16_BLUE + 15\r\n\tc1_label5:\r\n\t\tstosb\r\n\t\tloop\tc1_label3\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tc1_label7\r\n\t\tjmp\t\tc1_label2\r\n\tc1_label6:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tc1_label2\r\n\tc1_label7:\r\n\t\tsub\t\tedi, BUFFER_WIDTH + 13\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tc1_label1\r\n\t\tjmp\t\tlabret\r\n\r\n\t\t            // Case 2\r\n\tc2_label1:\r\n\t\tmov\t\tedx, 13\r\n\tc2_label2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tc2_label5\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\tc2_label3:\r\n\t\tlodsb\r\n\t\tcmp\t\tal, PAL16_GRAY\r\n\t\tjb\t\tc2_label4\r\n\t\tsub\t\tal, PAL16_GRAY - PAL16_RED\r\n\tc2_label4:\r\n\t\tstosb\r\n\t\tloop\tc2_label3\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tc2_label6\r\n\t\tjmp\t\tc2_label2\r\n\tc2_label5:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tc2_label2\r\n\tc2_label6:\r\n\t\tsub\t\tedi, BUFFER_WIDTH + 13\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tc2_label1\r\n\t\tjmp\t\tlabret\r\n\r\n\t\t            // Default\r\n\td_label1:\r\n\t\tmov\t\tedx, 13\r\n\td_label2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\td_label6\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\td_label3:\r\n\t\tlodsb\r\n\t\tcmp\t\tal, PAL16_GRAY\r\n\t\tjb\t\td_label5\r\n\t\tcmp\t\tal, PAL16_GRAY + 14\r\n\t\tjnb\t\td_label4\r\n\t\tsub\t\tal, PAL16_GRAY - (PAL16_YELLOW + 2)\r\n\t\tjmp\t\td_label5\r\n\td_label4:\r\n\t\tmov\t\tal, PAL16_YELLOW + 15\r\n\td_label5:\r\n\t\tstosb\r\n\t\tloop\td_label3\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\td_label7\r\n\t\tjmp\t\td_label2\r\n\td_label6:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\td_label2\r\n\td_label7:\r\n\t\tsub\t\tedi, BUFFER_WIDTH + 13\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\td_label1\r\n\r\n\tlabret:\r\n\t}\r\n#else\r\n\tint i, nDataSize;\r\n\tBYTE width, pix;\r\n\tBYTE *src, *dst, *end;\r\n\r\n\tsrc = CelGetFrame(pPanelText, nCel, &nDataSize);\r\n\tend = &src[nDataSize];\r\n\tdst = &gpBuffer[nOffset];\r\n\r\n\tswitch (col) {\r\n\tcase COL_WHITE:\r\n\t\tfor (; src != end; dst -= BUFFER_WIDTH + 13) {\r\n\t\t\tfor (i = 13; i;) {\r\n\t\t\t\twidth = *src++;\r\n\t\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\tcase COL_BLUE:\r\n\t\tfor (; src != end; dst -= BUFFER_WIDTH + 13) {\r\n\t\t\tfor (i = 13; i;) {\r\n\t\t\t\twidth = *src++;\r\n\t\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\tpix = *src++;\r\n\t\t\t\t\t\tif (pix > PAL16_GRAY + 13)\r\n\t\t\t\t\t\t\tpix = PAL16_BLUE + 15;\r\n\t\t\t\t\t\telse if (pix >= PAL16_GRAY)\r\n\t\t\t\t\t\t\tpix -= PAL16_GRAY - (PAL16_BLUE + 2);\r\n\t\t\t\t\t\t*dst++ = pix;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\tcase COL_RED:\r\n\t\tfor (; src != end; dst -= BUFFER_WIDTH + 13) {\r\n\t\t\tfor (i = 13; i;) {\r\n\t\t\t\twidth = *src++;\r\n\t\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\tpix = *src++;\r\n\t\t\t\t\t\tif (pix >= PAL16_GRAY)\r\n\t\t\t\t\t\t\tpix -= PAL16_GRAY - PAL16_RED;\r\n\t\t\t\t\t\t*dst++ = pix;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tfor (; src != end; dst -= BUFFER_WIDTH + 13) {\r\n\t\t\tfor (i = 13; i;) {\r\n\t\t\t\twidth = *src++;\r\n\t\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\tpix = *src++;\r\n\t\t\t\t\t\tif (pix >= PAL16_GRAY) {\r\n\t\t\t\t\t\t\tif (pix >= PAL16_GRAY + 14)\r\n\t\t\t\t\t\t\t\tpix = PAL16_YELLOW + 15;\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tpix -= PAL16_GRAY - (PAL16_YELLOW + 2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t*dst++ = pix;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\ti -= width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid AddPanelString(const char *str, BOOL just)\r\n{\r\n\tstrcpy(panelstr[pnumlines], str);\r\n\tpstrjust[pnumlines] = just;\r\n\r\n\tif (pnumlines < 4)\r\n\t\tpnumlines++;\r\n}\r\n\r\nvoid ClearPanel()\r\n{\r\n\tpnumlines = 0;\r\n\tpinfoflag = FALSE;\r\n}\r\n\r\nvoid DrawPanelBox(int x, int y, int w, int h, int sx, int sy)\r\n{\r\n\tint nSrcOff, nDstOff;\r\n\r\n\tassert(gpBuffer);\r\n\r\n\tnSrcOff = x + PANEL_WIDTH * y;\r\n\tnDstOff = sx + BUFFER_WIDTH * sy;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pBtmBuff\r\n\t\tadd\t\tesi, nSrcOff\r\n\t\tmov\t\tedi, gpBuffer\r\n\t\tadd\t\tedi, nDstOff\r\n\t\txor\t\tebx, ebx\r\n\t\tmov\t\tbx, word ptr w\r\n\t\txor\t\tedx, edx\r\n\t\tmov\t\tdx, word ptr h\r\n\tlabel1:\r\n\t\tmov\t\tecx, ebx\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel2\r\n\t\tmovsb\r\n\t\tjecxz\tlabel4\r\n\tlabel2:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel3\r\n\t\tmovsw\r\n\t\tjecxz\tlabel4\r\n\tlabel3:\r\n\t\trep movsd\r\n\tlabel4:\r\n\t\tadd\t\tesi, PANEL_WIDTH\r\n\t\tsub\t\tesi, ebx\r\n\t\tadd\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint wdt, hgt;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = &pBtmBuff[nSrcOff];\r\n\tdst = &gpBuffer[nDstOff];\r\n\r\n\tfor (hgt = h; hgt; hgt--, src += PANEL_WIDTH - w, dst += BUFFER_WIDTH - w) {\r\n\t\twdt = w;\r\n\t\tif (wdt & 1) {\r\n\t\t\tdst[0] = src[0];\r\n\t\t\tsrc++;\r\n\t\t\tdst++;\r\n\t\t}\r\n\t\twdt >>= 1;\r\n\t\tif (wdt & 1) {\r\n\t\t\tdst[0] = src[0];\r\n\t\t\tdst[1] = src[1];\r\n\t\t\tsrc += 2;\r\n\t\t\tdst += 2;\r\n\t\t}\r\n\t\twdt >>= 1;\r\n\t\twhile (wdt) {\r\n\t\t\tdst[0] = src[0];\r\n\t\t\tdst[1] = src[1];\r\n\t\t\tdst[2] = src[2];\r\n\t\t\tdst[3] = src[3];\r\n\t\t\tsrc += 4;\r\n\t\t\tdst += 4;\r\n\t\t\twdt--;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * Draws a section of the empty flask cel on top of the panel to create the illusion\r\n * of the flask getting empty. This function takes a cel and draws a\r\n * horizontal stripe of height (max-min) onto the back buffer.\r\n * @param pCelBuff Buffer of the empty flask cel.\r\n * @param min Top of the flask cel section to draw.\r\n * @param max Bottom of the flask cel section to draw.\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n */\r\nvoid SetFlaskHeight(BYTE *pCelBuff, int min, int max, int sx, int sy)\r\n{\r\n\tint nSrcOff, nDstOff, w;\r\n\r\n\tassert(gpBuffer);\r\n\r\n\tnSrcOff = 88 * min;\r\n\tnDstOff = sx + BUFFER_WIDTH * sy;\r\n\tw = max - min;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pCelBuff\r\n\t\tadd\t\tesi, nSrcOff\r\n\t\tmov\t\tedi, gpBuffer\r\n\t\tadd\t\tedi, nDstOff\r\n\t\tmov\t\tedx, w\r\n\tlabel1:\r\n\t\tmov\t\tecx, 88 / 4\r\n\t\trep movsd\r\n\t\tadd\t\tedi, BUFFER_WIDTH - 88\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = &pCelBuff[nSrcOff];\r\n\tdst = &gpBuffer[nDstOff];\r\n\r\n\tfor (; w; w--, src += 88, dst += BUFFER_WIDTH)\r\n\t\tmemcpy(dst, src, 88);\r\n#endif\r\n}\r\n\r\n/**\r\n * Draws the dome of the flask that protrudes above the panel top line.\r\n * It draws a rectangle of fixed width 59 and height 'h' from the source buffer\r\n * into the target buffer.\r\n * @param pCelBuff The flask cel buffer.\r\n * @param w Width of the cel.\r\n * @param nSrcOff Offset of the source buffer from where the bytes will start to be copied from.\r\n * @param pBuff Target buffer.\r\n * @param nDstOff Offset of the target buffer where the bytes will start to be copied to.\r\n * @param h How many lines of the source buffer that will be copied.\r\n */\r\nvoid DrawFlask(BYTE *pCelBuff, int w, int nSrcOff, BYTE *pBuff, int nDstOff, int h)\r\n{\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pCelBuff\r\n\t\tadd\t\tesi, nSrcOff\r\n\t\tmov\t\tedi, pBuff\r\n\t\tadd\t\tedi, nDstOff\r\n\t\tmov\t\tedx, h\r\n\tlabel1:\r\n\t\tmov\t\tecx, 59\r\n\tlabel2:\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjz\t\tlabel3\r\n\t\tmov\t\t[edi], al\r\n\tlabel3:\r\n\t\tinc\t\tedi\r\n\t\tloop\tlabel2\r\n\t\tadd\t\tesi, w\r\n\t\tsub\t\tesi, 59\r\n\t\tadd\t\tedi, BUFFER_WIDTH - 59\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint wdt, hgt;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = &pCelBuff[nSrcOff];\r\n\tdst = &pBuff[nDstOff];\r\n\r\n\tfor (hgt = h; hgt; hgt--, src += w - 59, dst += BUFFER_WIDTH - 59) {\r\n\t\tfor (wdt = 59; wdt; wdt--) {\r\n\t\t\tif (*src)\r\n\t\t\t\t*dst = *src;\r\n\t\t\tsrc++;\r\n\t\t\tdst++;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * Draws the top dome of the life flask (that part that protrudes out of the control panel).\r\n * First it draws the empty flask cel and then draws the filled part on top if needed.\r\n */\r\nvoid DrawLifeFlask()\r\n{\r\n\tdouble p;\r\n\tint filled;\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[myplr]._pMaxHP <= 0) {\r\n\t\tp = 0.0;\r\n\t} else {\r\n\t\tp = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;\r\n\t}\r\n#else\r\n\tp = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;\r\n#endif\r\n\tplr[myplr]._pHPPer = p;\r\n\tfilled = plr[myplr]._pHPPer;\r\n\r\n#ifndef HELLFIRE\r\n\tif (filled > 80)\r\n\t\tfilled = 80;\r\n#endif\r\n\tfilled = 80 - filled;\r\n\tif (filled > 11)\r\n\t\tfilled = 11;\r\n\tfilled += 2;\r\n\r\n\tDrawFlask(pLifeBuff, 88, 88 * 3 + 13, gpBuffer, SCREENXY(PANEL_LEFT + 109, PANEL_TOP - 13), filled);\r\n\tif (filled != 13)\r\n\t\tDrawFlask(pBtmBuff, PANEL_WIDTH, PANEL_WIDTH * (filled + 3) + 109, gpBuffer, SCREENXY(PANEL_LEFT + 109, PANEL_TOP - 13 + filled), 13 - filled);\r\n}\r\n\r\n/**\r\n * Controls the drawing of the area of the life flask within the control panel.\r\n * First sets the fill amount then draws the empty flask cel portion then the filled\r\n * flask portion.\r\n */\r\nvoid UpdateLifeFlask()\r\n{\r\n\tdouble p;\r\n\tint filled;\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[myplr]._pMaxHP <= 0) {\r\n\t\tp = 0.0;\r\n\t} else {\r\n\t\tp = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;\r\n\t}\r\n#else\r\n\tp = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;\r\n#endif\r\n\tfilled = p;\r\n\tplr[myplr]._pHPPer = filled;\r\n\r\n\tif (filled > 69)\r\n\t\tfilled = 69;\r\n#ifndef HELLFIRE\r\n\telse if (filled < 0)\r\n\t\tfilled = 0;\r\n#endif\r\n\tif (filled != 69)\r\n\t\tSetFlaskHeight(pLifeBuff, 16, 85 - filled, 96 + PANEL_X, PANEL_Y);\r\n\tif (filled != 0)\r\n\t\tDrawPanelBox(96, 85 - filled, 88, filled, 96 + PANEL_X, PANEL_Y + 69 - filled);\r\n}\r\n\r\nvoid DrawManaFlask()\r\n{\r\n\tint filled = plr[myplr]._pManaPer;\r\n#ifndef HELLFIRE\r\n\tif (filled > 80)\r\n\t\tfilled = 80;\r\n#endif\r\n\tfilled = 80 - filled;\r\n\tif (filled > 11)\r\n\t\tfilled = 11;\r\n\tfilled += 2;\r\n\r\n\tDrawFlask(pManaBuff, 88, 88 * 3 + 13, gpBuffer, SCREENXY(PANEL_LEFT + 475, PANEL_TOP - 13), filled);\r\n\tif (filled != 13)\r\n\t\tDrawFlask(pBtmBuff, PANEL_WIDTH, PANEL_WIDTH * (filled + 3) + 475, gpBuffer, SCREENXY(PANEL_LEFT + 475, PANEL_TOP - 13 + filled), 13 - filled);\r\n}\r\n\r\nvoid control_update_life_mana()\r\n{\r\n\tint manaPer;\r\n\tint maxMana = plr[myplr]._pMaxMana;\r\n\tint mana = plr[myplr]._pMana;\r\n\tif (maxMana < 0)\r\n\t\tmaxMana = 0;\r\n\tif (mana < 0)\r\n\t\tmana = 0;\r\n\tif (maxMana == 0)\r\n\t\tmanaPer = 0;\r\n\telse\r\n\t\tmanaPer = (double)mana / (double)maxMana * 80.0;\r\n\tplr[myplr]._pManaPer = manaPer;\r\n\tplr[myplr]._pHPPer = (double)plr[myplr]._pHitPoints / (double)plr[myplr]._pMaxHP * 80.0;\r\n}\r\n\r\n/**\r\n * Controls the drawing of the area of the life flask within the control panel.\r\n * Also for some reason draws the current right mouse button spell.\r\n */\r\nvoid UpdateManaFlask()\r\n{\r\n\tint filled;\r\n\tint maxMana = plr[myplr]._pMaxMana;\r\n\tint mana = plr[myplr]._pMana;\r\n\tif (maxMana < 0)\r\n\t\tmaxMana = 0;\r\n\tif (mana < 0)\r\n\t\tmana = 0;\r\n\r\n\tif (maxMana == 0)\r\n\t\tfilled = 0;\r\n\telse\r\n\t\tfilled = (double)mana / (double)maxMana * 80.0;\r\n\r\n\tplr[myplr]._pManaPer = filled;\r\n\r\n\tif (filled > 69)\r\n\t\tfilled = 69;\r\n\tif (filled != 69)\r\n\t\tSetFlaskHeight(pManaBuff, 16, 85 - filled, PANEL_X + 464, PANEL_Y);\r\n\tif (filled != 0)\r\n\t\tDrawPanelBox(464, 85 - filled, 88, filled, PANEL_X + 464, PANEL_Y + 69 - filled);\r\n\r\n\tDrawSpell();\r\n}\r\n\r\nvoid InitControlPan()\r\n{\r\n\tint i;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tpBtmBuff = DiabloAllocPtr((PANEL_HEIGHT + 16) * PANEL_WIDTH);\r\n\t\tmemset(pBtmBuff, 0, (PANEL_HEIGHT + 16) * PANEL_WIDTH);\r\n\t} else {\r\n\t\tpBtmBuff = DiabloAllocPtr((PANEL_HEIGHT + 16) * 2 * PANEL_WIDTH);\r\n\t\tmemset(pBtmBuff, 0, (PANEL_HEIGHT + 16) * 2 * PANEL_WIDTH);\r\n\t}\r\n\tpManaBuff = DiabloAllocPtr(88 * 88);\r\n\tmemset(pManaBuff, 0, 88 * 88);\r\n\tpLifeBuff = DiabloAllocPtr(88 * 88);\r\n\tmemset(pLifeBuff, 0, 88 * 88);\r\n\tpPanelText = LoadFileInMem(\"CtrlPan\\\\SmalText.CEL\", NULL);\r\n\tpChrPanel = LoadFileInMem(\"Data\\\\Char.CEL\", NULL);\r\n#ifndef HELLFIRE\r\n\tpSpellCels = LoadFileInMem(\"CtrlPan\\\\SpelIcon.CEL\", NULL);\r\n#else\r\n\tpSpellCels = LoadFileInMem(\"Data\\\\SpelIcon.CEL\", NULL);\r\n#endif\r\n\tSetSpellTrans(RSPLTYPE_SKILL);\r\n\tpStatusPanel = LoadFileInMem(\"CtrlPan\\\\Panel8.CEL\", NULL);\r\n\tCelBlitWidth(pBtmBuff, 0, (PANEL_HEIGHT + 16) - 1, PANEL_WIDTH, pStatusPanel, 1, PANEL_WIDTH);\r\n\tMemFreeDbg(pStatusPanel);\r\n\tpStatusPanel = LoadFileInMem(\"CtrlPan\\\\P8Bulbs.CEL\", NULL);\r\n\tCelBlitWidth(pLifeBuff, 0, 87, 88, pStatusPanel, 1, 88);\r\n\tCelBlitWidth(pManaBuff, 0, 87, 88, pStatusPanel, 2, 88);\r\n\tMemFreeDbg(pStatusPanel);\r\n\ttalkflag = FALSE;\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tpTalkPanel = LoadFileInMem(\"CtrlPan\\\\TalkPanl.CEL\", NULL);\r\n\t\tCelBlitWidth(pBtmBuff, 0, (PANEL_HEIGHT + 16) * 2 - 1, PANEL_WIDTH, pTalkPanel, 1, PANEL_WIDTH);\r\n\t\tMemFreeDbg(pTalkPanel);\r\n\t\tpMultiBtns = LoadFileInMem(\"CtrlPan\\\\P8But2.CEL\", NULL);\r\n\t\tpTalkBtns = LoadFileInMem(\"CtrlPan\\\\TalkButt.CEL\", NULL);\r\n\t\tsgbPlrTalkTbl = 0;\r\n\t\tsgszTalkMsg[0] = '\\0';\r\n\t\tfor (i = 0; i < MAX_PLRS; i++)\r\n\t\t\twhisper[i] = TRUE;\r\n\t\tfor (i = 0; i < sizeof(talkbtndown) / sizeof(talkbtndown[0]); i++)\r\n\t\t\ttalkbtndown[i] = FALSE;\r\n\t}\r\n\tpanelflag = FALSE;\r\n\tlvlbtndown = FALSE;\r\n\tpPanelButtons = LoadFileInMem(\"CtrlPan\\\\Panel8bu.CEL\", NULL);\r\n\tfor (i = 0; i < sizeof(panbtn) / sizeof(panbtn[0]); i++)\r\n\t\tpanbtn[i] = FALSE;\r\n\tpanbtndown = FALSE;\r\n\tif (gbMaxPlayers == 1)\r\n\t\tnumpanbtns = 6;\r\n\telse\r\n\t\tnumpanbtns = 8;\r\n\tpChrButtons = LoadFileInMem(\"Data\\\\CharBut.CEL\", NULL);\r\n\tfor (i = 0; i < sizeof(chrbtn) / sizeof(chrbtn[0]); i++)\r\n\t\tchrbtn[i] = FALSE;\r\n\tchrbtnactive = FALSE;\r\n\tpDurIcons = LoadFileInMem(\"Items\\\\DurIcons.CEL\", NULL);\r\n\tstrcpy(infostr, \"\");\r\n\tClearPanel();\r\n\tdrawhpflag = TRUE;\r\n\tdrawmanaflag = TRUE;\r\n\tchrflag = FALSE;\r\n\tspselflag = FALSE;\r\n\tpSpellBkCel = LoadFileInMem(\"Data\\\\SpellBk.CEL\", NULL);\r\n\tpSBkBtnCel = LoadFileInMem(\"Data\\\\SpellBkB.CEL\", NULL);\r\n\tpSBkIconCels = LoadFileInMem(\"Data\\\\SpellI2.CEL\", NULL);\r\n\tsbooktab = 0;\r\n\tsbookflag = FALSE;\r\n\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\tSpellPages[0][0] = SPL_REPAIR;\r\n#ifndef SPAWN\r\n\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\tSpellPages[0][0] = SPL_DISARM;\r\n\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\tSpellPages[0][0] = SPL_RECHARGE;\r\n#endif\r\n#ifdef HELLFIRE\r\n\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\tSpellPages[0][0] = SPL_SEARCH;\r\n\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\tSpellPages[0][0] = SPL_IDENTIFY;\r\n\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\tSpellPages[0][0] = SPL_BLODBOIL;\r\n#endif\r\n\t}\r\n\tpQLogCel = LoadFileInMem(\"Data\\\\Quest.CEL\", NULL);\r\n\tpGBoxBuff = LoadFileInMem(\"CtrlPan\\\\Golddrop.cel\", NULL);\r\n\tdropGoldFlag = FALSE;\r\n\tdropGoldValue = 0;\r\n\tinitialDropGoldValue = 0;\r\n\tinitialDropGoldIndex = 0;\r\n\tnGoldFrame = 1;\r\n}\r\n\r\nvoid DrawCtrlPan()\r\n{\r\n\tDrawPanelBox(0, sgbPlrTalkTbl + 16, PANEL_WIDTH, PANEL_HEIGHT, PANEL_X, PANEL_Y);\r\n\tDrawInfoBox();\r\n}\r\n\r\n/**\r\n * Draws the control panel buttons in their current state. If the button is in the default\r\n * state draw it from the panel cel(extract its sub-rect). Else draw it from the buttons cel.\r\n */\r\nvoid DrawCtrlBtns()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < 6; i++) {\r\n\t\tif (!panbtn[i])\r\n\t\t\tDrawPanelBox(PanBtnPos[i][0] - PANEL_LEFT, PanBtnPos[i][1] - (PANEL_TOP - 16), 71, 20, PanBtnPos[i][0] + SCREEN_X, PanBtnPos[i][1] + SCREEN_Y);\r\n\t\telse\r\n\t\t\tCelDraw(PanBtnPos[i][0] + SCREEN_X, PanBtnPos[i][1] + SCREEN_Y + 18, pPanelButtons, i + 1, 71);\r\n\t}\r\n\tif (numpanbtns == 8) {\r\n\t\tCelDraw(87 + PANEL_X, 122 + PANEL_Y, pMultiBtns, panbtn[6] + 1, 33);\r\n\t\tif (FriendlyMode)\r\n\t\t\tCelDraw(527 + PANEL_X, 122 + PANEL_Y, pMultiBtns, panbtn[7] + 3, 33);\r\n\t\telse\r\n\t\t\tCelDraw(527 + PANEL_X, 122 + PANEL_Y, pMultiBtns, panbtn[7] + 5, 33);\r\n\t}\r\n}\r\n\r\n/**\r\n * Draws the \"Speed Book\": the rows of known spells for quick-setting a spell that\r\n * show up when you click the spell slot at the control panel.\r\n */\r\nvoid DoSpeedBook()\r\n{\r\n\tunsigned __int64 spell, spells;\r\n\tint xo, yo, X, Y, i, j;\r\n\r\n\tspselflag = TRUE;\r\n\txo = PANEL_X + 12 + SPLICONLENGTH * 10;\r\n\tyo = PANEL_Y - 17;\r\n\tX = xo - (BORDER_LEFT - SPLICONLENGTH / 2);\r\n\tY = yo - (BORDER_TOP + SPLICONLENGTH / 2);\r\n\tif (plr[myplr]._pRSpell != SPL_INVALID) {\r\n\t\tfor (i = 0; i < 4; i++) {\r\n\t\t\tswitch (i) {\r\n\t\t\tcase RSPLTYPE_SKILL:\r\n\t\t\t\tspells = plr[myplr]._pAblSpells;\r\n\t\t\t\tbreak;\r\n\t\t\tcase RSPLTYPE_SPELL:\r\n\t\t\t\tspells = plr[myplr]._pMemSpells;\r\n\t\t\t\tbreak;\r\n\t\t\tcase RSPLTYPE_SCROLL:\r\n\t\t\t\tspells = plr[myplr]._pScrlSpells;\r\n\t\t\t\tbreak;\r\n\t\t\tcase RSPLTYPE_CHARGES:\r\n\t\t\t\tspells = plr[myplr]._pISpells;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tspell = (__int64)1;\r\n\t\t\tfor (j = 1; j < MAX_SPELLS; j++) {\r\n\t\t\t\tif (spell & spells) {\r\n\t\t\t\t\tif (j == plr[myplr]._pRSpell && i == plr[myplr]._pRSplType) {\r\n\t\t\t\t\t\tX = xo - (BORDER_LEFT - SPLICONLENGTH / 2);\r\n\t\t\t\t\t\tY = yo - (BORDER_TOP + SPLICONLENGTH / 2);\r\n\t\t\t\t\t}\r\n\t\t\t\t\txo -= SPLICONLENGTH;\r\n\t\t\t\t\tif (xo == PANEL_X + 12 - SPLICONLENGTH) {\r\n\t\t\t\t\t\txo = PANEL_X + 12 + SPLICONLENGTH * SPLROWICONLS;\r\n\t\t\t\t\t\tyo -= SPLICONLENGTH;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tspell <<= (__int64)1;\r\n\t\t\t}\r\n\t\t\tif (spells && xo != PANEL_X + 12 + SPLICONLENGTH * SPLROWICONLS)\r\n\t\t\t\txo -= SPLICONLENGTH;\r\n\t\t\tif (xo == PANEL_X + 12 - SPLICONLENGTH) {\r\n\t\t\t\txo = PANEL_X + 12 + SPLICONLENGTH * SPLROWICONLS;\r\n\t\t\t\tyo -= SPLICONLENGTH;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tSetCursorPos(X, Y);\r\n}\r\n\r\n/**\r\n * Checks if the mouse cursor is within any of the panel buttons and flag it if so.\r\n */\r\nvoid DoPanBtn()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < numpanbtns; i++) {\r\n\t\tint x = PanBtnPos[i][0] + PanBtnPos[i][2];\r\n\t\tint y = PanBtnPos[i][1] + PanBtnPos[i][3];\r\n\t\tif (MouseX >= PanBtnPos[i][0] && MouseX <= x) {\r\n\t\t\tif (MouseY >= PanBtnPos[i][1] && MouseY <= y) {\r\n\t\t\t\tpanbtn[i] = TRUE;\r\n\t\t\t\tdrawbtnflag = TRUE;\r\n\t\t\t\tpanbtndown = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (!spselflag && MouseX >= 565 + PANEL_LEFT && MouseX < 621 + PANEL_LEFT && MouseY >= 64 + PANEL_TOP && MouseY < 120 + PANEL_TOP) {\r\n\t\tDoSpeedBook();\r\n\t\tgamemenu_off();\r\n\t}\r\n}\r\n\r\nvoid control_set_button_down(int btn_id)\r\n{\r\n\tpanbtn[btn_id] = TRUE;\r\n\tdrawbtnflag = TRUE;\r\n\tpanbtndown = TRUE;\r\n}\r\n\r\nvoid control_check_btn_press()\r\n{\r\n\tint x, y;\r\n\r\n\tx = PanBtnPos[3][0] + PanBtnPos[3][2];\r\n\ty = PanBtnPos[3][1] + PanBtnPos[3][3];\r\n\tif (MouseX >= PanBtnPos[3][0]\r\n\t    && MouseX <= x\r\n\t    && MouseY >= PanBtnPos[3][1]\r\n\t    && MouseY <= y) {\r\n\t\tcontrol_set_button_down(3);\r\n\t}\r\n\tx = PanBtnPos[6][0] + PanBtnPos[6][2];\r\n\ty = PanBtnPos[6][1] + PanBtnPos[6][3];\r\n\tif (MouseX >= PanBtnPos[6][0]\r\n\t    && MouseX <= x\r\n\t    && MouseY >= PanBtnPos[6][1]\r\n\t    && MouseY <= y) {\r\n\t\tcontrol_set_button_down(6);\r\n\t}\r\n}\r\n\r\nvoid DoAutoMap()\r\n{\r\n\tif (currlevel != 0 || gbMaxPlayers != 1) {\r\n\t\tif (!automapflag)\r\n\t\t\tStartAutomap();\r\n\t\telse\r\n\t\t\tautomapflag = FALSE;\r\n\t} else {\r\n\t\tInitDiabloMsg(EMSG_NO_AUTOMAP_IN_TOWN);\r\n\t}\r\n}\r\n\r\n/**\r\n * Checks the mouse cursor position within the control panel and sets information\r\n * strings if needed.\r\n */\r\nvoid CheckPanelInfo()\r\n{\r\n\tint i, c, v, s, xend, yend;\r\n\r\n\tpanelflag = FALSE;\r\n\tClearPanel();\r\n\tfor (i = 0; i < numpanbtns; i++) {\r\n\t\txend = PanBtnPos[i][0] + PanBtnPos[i][2];\r\n\t\tyend = PanBtnPos[i][1] + PanBtnPos[i][3];\r\n\t\tif (MouseX >= PanBtnPos[i][0] && MouseX <= xend && MouseY >= PanBtnPos[i][1] && MouseY <= yend) {\r\n\t\t\tif (i != 7) {\r\n\t\t\t\tstrcpy(infostr, PanBtnStr[i]);\r\n\t\t\t} else {\r\n\t\t\t\tif (FriendlyMode)\r\n\t\t\t\t\tstrcpy(infostr, \"Player friendly\");\r\n\t\t\t\telse\r\n\t\t\t\t\tstrcpy(infostr, \"Player attack\");\r\n\t\t\t}\r\n\t\t\tif (PanBtnHotKey[i] != NULL) {\r\n\t\t\t\tsprintf(tempstr, \"Hotkey : %s\", PanBtnHotKey[i]);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t}\r\n\t\t\tinfoclr = COL_WHITE;\r\n\t\t\tpanelflag = TRUE;\r\n\t\t\tpinfoflag = TRUE;\r\n\t\t}\r\n\t}\r\n\tif (!spselflag && MouseX >= 565 + PANEL_LEFT && MouseX < 621 + PANEL_LEFT && MouseY >= 64 + PANEL_TOP && MouseY < 120 + PANEL_TOP) {\r\n\t\tstrcpy(infostr, \"Select current spell button\");\r\n\t\tinfoclr = COL_WHITE;\r\n\t\tpanelflag = TRUE;\r\n\t\tpinfoflag = TRUE;\r\n\t\tstrcpy(tempstr, \"Hotkey : 's'\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tv = plr[myplr]._pRSpell;\r\n\t\tif (v != SPL_INVALID) {\r\n\t\t\tswitch (plr[myplr]._pRSplType) {\r\n\t\t\tcase RSPLTYPE_SKILL:\r\n\t\t\t\tsprintf(tempstr, \"%s Skill\", spelldata[v].sSkillText);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tbreak;\r\n\t\t\tcase RSPLTYPE_SPELL:\r\n\t\t\t\tsprintf(tempstr, \"%s Spell\", spelldata[v].sNameText);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tc = plr[myplr]._pISplLvlAdd + plr[myplr]._pSplLvl[v];\r\n\t\t\t\tif (c < 0)\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\tif (c == 0)\r\n\t\t\t\t\tsprintf(tempstr, \"Spell Level 0 - Unusable\");\r\n\t\t\t\telse\r\n\t\t\t\t\tsprintf(tempstr, \"Spell Level %i\", c);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tbreak;\r\n\t\t\tcase RSPLTYPE_SCROLL:\r\n\t\t\t\tsprintf(tempstr, \"Scroll of %s\", spelldata[v].sNameText);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\ts = 0;\r\n\t\t\t\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n\t\t\t\t\tif (plr[myplr].InvList[i]._itype != ITYPE_NONE\r\n\t\t\t\t\t    && (plr[myplr].InvList[i]._iMiscId == IMISC_SCROLL || plr[myplr].InvList[i]._iMiscId == IMISC_SCROLLT)\r\n\t\t\t\t\t    && plr[myplr].InvList[i]._iSpell == v) {\r\n\t\t\t\t\t\ts++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\t\t\t\tif (plr[myplr].SpdList[i]._itype != ITYPE_NONE\r\n\t\t\t\t\t    && (plr[myplr].SpdList[i]._iMiscId == IMISC_SCROLL || plr[myplr].SpdList[i]._iMiscId == IMISC_SCROLLT)\r\n\t\t\t\t\t    && plr[myplr].SpdList[i]._iSpell == v) {\r\n\t\t\t\t\t\ts++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (s == 1)\r\n\t\t\t\t\tstrcpy(tempstr, \"1 Scroll\");\r\n\t\t\t\telse\r\n\t\t\t\t\tsprintf(tempstr, \"%i Scrolls\", s);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tbreak;\r\n\t\t\tcase RSPLTYPE_CHARGES:\r\n\t\t\t\tsprintf(tempstr, \"Staff of %s\", spelldata[v].sNameText);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges == 1)\r\n\t\t\t\t\tstrcpy(tempstr, \"1 Charge\");\r\n\t\t\t\telse\r\n\t\t\t\t\tsprintf(tempstr, \"%i Charges\", plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (MouseX > 190 + PANEL_LEFT && MouseX < 437 + PANEL_LEFT && MouseY > 4 + PANEL_TOP && MouseY < 33 + PANEL_TOP)\r\n\t\tpcursinvitem = CheckInvHLight();\r\n}\r\n\r\n/**\r\n * Check if the mouse is within a control panel button that's flagged.\r\n * Takes apropiate action if so.\r\n */\r\nvoid CheckBtnUp()\r\n{\r\n\tint i;\r\n\tBOOLEAN gamemenuOff;\r\n\r\n\tgamemenuOff = TRUE;\r\n\tdrawbtnflag = TRUE;\r\n\tpanbtndown = FALSE;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tif (!panbtn[i]) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tpanbtn[i] = FALSE;\r\n\r\n\t\tif (MouseX < PanBtnPos[i][0]\r\n\t\t    || MouseX > PanBtnPos[i][0] + PanBtnPos[i][2]\r\n\t\t    || MouseY < PanBtnPos[i][1]\r\n\t\t    || MouseY > PanBtnPos[i][1] + PanBtnPos[i][3]) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tswitch (i) {\r\n\t\tcase PANBTN_CHARINFO:\r\n\t\t\tquestlog = FALSE;\r\n\t\t\tchrflag = !chrflag;\r\n\t\t\tbreak;\r\n\t\tcase PANBTN_QLOG:\r\n\t\t\tchrflag = FALSE;\r\n\t\t\tif (!questlog)\r\n\t\t\t\tStartQuestlog();\r\n\t\t\telse\r\n\t\t\t\tquestlog = FALSE;\r\n\t\t\tbreak;\r\n\t\tcase PANBTN_AUTOMAP:\r\n\t\t\tDoAutoMap();\r\n\t\t\tbreak;\r\n\t\tcase PANBTN_MAINMENU:\r\n\t\t\tqtextflag = FALSE;\r\n\t\t\tgamemenu_handle_previous();\r\n\t\t\tgamemenuOff = FALSE;\r\n\t\t\tbreak;\r\n\t\tcase PANBTN_INVENTORY:\r\n\t\t\tsbookflag = FALSE;\r\n\t\t\tinvflag = !invflag;\r\n\t\t\tif (dropGoldFlag) {\r\n\t\t\t\tdropGoldFlag = FALSE;\r\n\t\t\t\tdropGoldValue = 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase PANBTN_SPELLBOOK:\r\n\t\t\tinvflag = FALSE;\r\n\t\t\tif (dropGoldFlag) {\r\n\t\t\t\tdropGoldFlag = FALSE;\r\n\t\t\t\tdropGoldValue = 0;\r\n\t\t\t}\r\n\t\t\tsbookflag = !sbookflag;\r\n\t\t\tbreak;\r\n\t\tcase PANBTN_SENDMSG:\r\n\t\t\tif (talkflag)\r\n\t\t\t\tcontrol_reset_talk();\r\n\t\t\telse\r\n\t\t\t\tcontrol_type_message();\r\n\t\t\tbreak;\r\n\t\tcase PANBTN_FRIENDLY:\r\n\t\t\tFriendlyMode = !FriendlyMode;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (gamemenuOff)\r\n\t\tgamemenu_off();\r\n}\r\n\r\nvoid FreeControlPan()\r\n{\r\n\tMemFreeDbg(pBtmBuff);\r\n\tMemFreeDbg(pManaBuff);\r\n\tMemFreeDbg(pLifeBuff);\r\n\tMemFreeDbg(pPanelText);\r\n\tMemFreeDbg(pChrPanel);\r\n\tMemFreeDbg(pSpellCels);\r\n\tMemFreeDbg(pPanelButtons);\r\n\tMemFreeDbg(pMultiBtns);\r\n\tMemFreeDbg(pTalkBtns);\r\n\tMemFreeDbg(pChrButtons);\r\n\tMemFreeDbg(pDurIcons);\r\n\tMemFreeDbg(pQLogCel);\r\n\tMemFreeDbg(pSpellBkCel);\r\n\tMemFreeDbg(pSBkBtnCel);\r\n\tMemFreeDbg(pSBkIconCels);\r\n\tMemFreeDbg(pGBoxBuff);\r\n}\r\n\r\nBOOL control_WriteStringToBuffer(BYTE *str)\r\n{\r\n\tint k;\r\n\tBYTE ichar;\r\n\r\n\tk = 0;\r\n\twhile (*str) {\r\n\t\tichar = gbFontTransTbl[*str];\r\n\t\tstr++;\r\n\t\tk += fontkern[fontframe[ichar]];\r\n\t\tif (k >= 125)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void CPrintString(int y, const char *str, BOOL center, int lines)\r\n{\r\n\tBYTE c;\r\n\tconst char *tmp;\r\n\tint strWidth, lineOffset, lineStart;\r\n\r\n\tlineOffset = 0;\r\n\tlineStart = lineOffsets[lines][y] + PANEL_LEFT;\r\n\tif (center == TRUE) {\r\n\t\tstrWidth = 0;\r\n\t\ttmp = str;\r\n\t\twhile (*tmp) {\r\n\t\t\tc = gbFontTransTbl[(BYTE)*tmp++];\r\n\t\t\tstrWidth += fontkern[fontframe[c]] + 2;\r\n\t\t}\r\n\t\tif (strWidth < 288)\r\n\t\t\tlineOffset = (288 - strWidth) >> 1;\r\n\t\tlineStart += lineOffset;\r\n\t}\r\n\twhile (*str) {\r\n\t\tc = gbFontTransTbl[(BYTE)*str++];\r\n\t\tc = fontframe[c];\r\n\t\tlineOffset += fontkern[c] + 2;\r\n\t\tif (c) {\r\n\t\t\tif (lineOffset < 288) {\r\n\t\t\t\tPrintChar(lineStart, c, infoclr);\r\n\t\t\t}\r\n\t\t}\r\n\t\tlineStart += fontkern[c] + 2;\r\n\t}\r\n}\r\n\r\nstatic void PrintInfo()\r\n{\r\n\tint yo, lo, i;\r\n\r\n\tif (!talkflag) {\r\n\t\tyo = 0;\r\n\t\tlo = 1;\r\n\t\tif (infostr[0] != '\\0') {\r\n\t\t\tCPrintString(0, infostr, TRUE, pnumlines);\r\n\t\t\tyo = 1;\r\n\t\t\tlo = 0;\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < pnumlines; i++) {\r\n\t\t\tCPrintString(i + yo, panelstr[i], pstrjust[i], pnumlines - lo);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Sets a string to be drawn in the info box and then draws it.\r\n */\r\nvoid DrawInfoBox()\r\n{\r\n\tint nGold;\r\n\r\n\tDrawPanelBox(177, 62, 288, 60, PANEL_X + 177, PANEL_Y + 46);\r\n\tif (!panelflag && !trigflag && pcursinvitem == -1 && !spselflag) {\r\n\t\tinfostr[0] = '\\0';\r\n\t\tinfoclr = COL_WHITE;\r\n\t\tClearPanel();\r\n\t}\r\n\tif (spselflag || trigflag) {\r\n\t\tinfoclr = COL_WHITE;\r\n\t} else if (pcurs >= CURSOR_FIRSTITEM) {\r\n\t\tif (plr[myplr].HoldItem._itype == ITYPE_GOLD) {\r\n\t\t\tnGold = plr[myplr].HoldItem._ivalue;\r\n\t\t\tsprintf(infostr, \"%i gold %s\", nGold, get_pieces_str(nGold));\r\n\t\t} else if (!plr[myplr].HoldItem._iStatFlag) {\r\n\t\t\tClearPanel();\r\n\t\t\tAddPanelString(\"Requirements not met\", TRUE);\r\n\t\t\tpinfoflag = TRUE;\r\n\t\t} else {\r\n\t\t\tif (plr[myplr].HoldItem._iIdentified)\r\n\t\t\t\tstrcpy(infostr, plr[myplr].HoldItem._iIName);\r\n\t\t\telse\r\n\t\t\t\tstrcpy(infostr, plr[myplr].HoldItem._iName);\r\n\t\t\tif (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_MAGIC)\r\n\t\t\t\tinfoclr = COL_BLUE;\r\n\t\t\tif (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_UNIQUE)\r\n\t\t\t\tinfoclr = COL_GOLD;\r\n\t\t}\r\n\t} else {\r\n\t\tif (pcursitem != -1)\r\n\t\t\tGetItemStr(pcursitem);\r\n\t\tif (pcursobj != -1)\r\n\t\t\tGetObjectStr(pcursobj);\r\n\t\tif (pcursmonst != -1) {\r\n\t\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\t\tinfoclr = COL_WHITE;\r\n\t\t\t\tstrcpy(infostr, monster[pcursmonst].mName);\r\n\t\t\t\tClearPanel();\r\n\t\t\t\tif (monster[pcursmonst]._uniqtype != 0) {\r\n\t\t\t\t\tinfoclr = COL_GOLD;\r\n\t\t\t\t\tPrintUniqueHistory();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tPrintMonstHistory(monster[pcursmonst].MType->mtype);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tstrcpy(infostr, towner[pcursmonst]._tName);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (pcursplr != -1) {\r\n\t\t\tinfoclr = COL_GOLD;\r\n\t\t\tstrcpy(infostr, plr[pcursplr]._pName);\r\n\t\t\tClearPanel();\r\n#ifdef HELLFIRE\r\n\t\t\tsprintf(tempstr, \"%s, Level : %i\", ClassStrTbl[plr[pcursplr]._pClass], plr[pcursplr]._pLevel);\r\n#else\r\n\t\t\tsprintf(tempstr, \"Level : %i\", plr[pcursplr]._pLevel);\r\n#endif\r\n\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\tsprintf(tempstr, \"Hit Points %i of %i\", plr[pcursplr]._pHitPoints >> 6, plr[pcursplr]._pMaxHP >> 6);\r\n\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t}\r\n\t}\r\n\tif (infostr[0] != '\\0' || pnumlines != 0)\r\n\t\tPrintInfo();\r\n}\r\n\r\n/**\r\n * @brief Identical to MY_PlrStringXY(x, y, width, pszStr, col, 1)\r\n */\r\nstatic void ADD_PlrStringXY(int x, int y, int width, const char *pszStr, char col)\r\n{\r\n\tBYTE c;\r\n\tconst char *tmp;\r\n\tint nOffset, screen_x, line, widthOffset;\r\n\r\n\tnOffset = x + PitchTbl[y + SCREEN_Y] + SCREEN_X;\r\n\twidthOffset = width - x + 1;\r\n\tline = 0;\r\n\tscreen_x = 0;\r\n\ttmp = pszStr;\r\n\twhile (*tmp) {\r\n\t\tc = gbFontTransTbl[(BYTE)*tmp++];\r\n\t\tscreen_x += fontkern[fontframe[c]] + 1;\r\n\t}\r\n\tif (screen_x < widthOffset)\r\n\t\tline = (widthOffset - screen_x) >> 1;\r\n\tnOffset += line;\r\n\twhile (*pszStr) {\r\n\t\tc = gbFontTransTbl[(BYTE)*pszStr++];\r\n\t\tc = fontframe[c];\r\n\t\tline += fontkern[c] + 1;\r\n\t\tif (c) {\r\n\t\t\tif (line < widthOffset)\r\n\t\t\t\tPrintChar(nOffset, c, col);\r\n\t\t}\r\n\t\tnOffset += fontkern[c] + 1;\r\n\t}\r\n}\r\n\r\nvoid PrintGameStr(int x, int y, const char *str, int color)\r\n{\r\n\tBYTE c;\r\n\tint off;\r\n\toff = PitchTbl[y + SCREEN_Y] + x + SCREEN_X;\r\n\twhile (*str) {\r\n\t\tc = gbFontTransTbl[(BYTE)*str++];\r\n\t\tc = fontframe[c];\r\n\t\tif (c)\r\n\t\t\tPrintChar(off, c, color);\r\n\t\toff += fontkern[c] + 1;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render text string to back buffer\r\n * @param x Screen coordinate\r\n * @param y Screen coordinate\r\n * @param endX End of line in screen coordinate\r\n * @param pszStr String to print, in Windows-1252 encoding\r\n * @param col text_color color value\r\n * @param base Letter spacing\r\n */\r\nstatic void MY_PlrStringXY(int x, int y, int endX, const char *pszStr, char col, int base)\r\n{\r\n\tBYTE c;\r\n\tconst char *tmp;\r\n\tint nOffset, screen_x, line, widthOffset;\r\n\r\n\tnOffset = x + PitchTbl[y + SCREEN_Y] + SCREEN_X;\r\n\twidthOffset = endX - x + 1;\r\n\tline = 0;\r\n\tscreen_x = 0;\r\n\ttmp = pszStr;\r\n\twhile (*tmp) {\r\n\t\tc = gbFontTransTbl[(BYTE)*tmp++];\r\n\t\tscreen_x += fontkern[fontframe[c]] + base;\r\n\t}\r\n\tif (screen_x < widthOffset)\r\n\t\tline = (widthOffset - screen_x) >> 1;\r\n\tnOffset += line;\r\n\twhile (*pszStr) {\r\n\t\tc = gbFontTransTbl[(BYTE)*pszStr++];\r\n\t\tc = fontframe[c];\r\n\t\tline += fontkern[c] + base;\r\n\t\tif (c) {\r\n\t\t\tif (line < widthOffset)\r\n\t\t\t\tPrintChar(nOffset, c, col);\r\n\t\t}\r\n\t\tnOffset += fontkern[c] + base;\r\n\t}\r\n}\r\n\r\nvoid DrawChr()\r\n{\r\n\tchar col;\r\n\tchar chrstr[64];\r\n\tint pc, mindam, maxdam;\r\n\r\n\tCelDraw(SCREEN_X, 351 + SCREEN_Y, pChrPanel, 1, 320);\r\n\tADD_PlrStringXY(20, 32, 151, plr[myplr]._pName, COL_WHITE);\r\n\r\n#ifdef HELLFIRE\r\n\tADD_PlrStringXY(168, 32, 299, ClassStrTbl[plr[myplr]._pClass], COL_WHITE);\r\n#else\r\n\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\tADD_PlrStringXY(168, 32, 299, \"Warrior\", COL_WHITE);\r\n#ifndef SPAWN\r\n\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\tADD_PlrStringXY(168, 32, 299, \"Rogue\", COL_WHITE);\r\n\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\tADD_PlrStringXY(168, 32, 299, \"Sorceror\", COL_WHITE);\r\n#endif\r\n\t}\r\n#endif\r\n\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pLevel);\r\n\tADD_PlrStringXY(66, 69, 109, chrstr, COL_WHITE);\r\n\r\n\tsprintf(chrstr, \"%li\", plr[myplr]._pExperience);\r\n\tADD_PlrStringXY(216, 69, 300, chrstr, COL_WHITE);\r\n\r\n\tif (plr[myplr]._pLevel == MAXCHARLEVEL - 1) {\r\n\t\tstrcpy(chrstr, \"None\");\r\n\t\tcol = COL_GOLD;\r\n\t} else {\r\n\t\tsprintf(chrstr, \"%li\", plr[myplr]._pNextExper);\r\n\t\tcol = COL_WHITE;\r\n\t}\r\n\tADD_PlrStringXY(216, 97, 300, chrstr, col);\r\n\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pGold);\r\n\tADD_PlrStringXY(216, 146, 300, chrstr, COL_WHITE);\r\n\r\n\tcol = COL_WHITE;\r\n\tif (plr[myplr]._pIBonusAC > 0)\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pIBonusAC < 0)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pIBonusAC + plr[myplr]._pIAC + plr[myplr]._pDexterity / 5);\r\n\tADD_PlrStringXY(258, 183, 301, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tif (plr[myplr]._pIBonusToHit > 0)\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pIBonusToHit < 0)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i%%\", (plr[myplr]._pDexterity >> 1) + plr[myplr]._pIBonusToHit + 50);\r\n\tADD_PlrStringXY(258, 211, 301, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tif (plr[myplr]._pIBonusDam > 0)\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pIBonusDam < 0)\r\n\t\tcol = COL_RED;\r\n\tmindam = plr[myplr]._pIMinDam;\r\n\tmindam += plr[myplr]._pIBonusDam * mindam / 100;\r\n\tmindam += plr[myplr]._pIBonusDamMod;\r\n\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_BOW) {\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE)\r\n\t\t\tmindam += plr[myplr]._pDamageMod;\r\n\t\telse\r\n\t\t\tmindam += plr[myplr]._pDamageMod >> 1;\r\n\t} else {\r\n\t\tmindam += plr[myplr]._pDamageMod;\r\n\t}\r\n\tmaxdam = plr[myplr]._pIMaxDam;\r\n\tmaxdam += plr[myplr]._pIBonusDam * maxdam / 100;\r\n\tmaxdam += plr[myplr]._pIBonusDamMod;\r\n\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_BOW) {\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE)\r\n\t\t\tmaxdam += plr[myplr]._pDamageMod;\r\n\t\telse\r\n\t\t\tmaxdam += plr[myplr]._pDamageMod >> 1;\r\n\t} else {\r\n\t\tmaxdam += plr[myplr]._pDamageMod;\r\n\t}\r\n\tsprintf(chrstr, \"%i-%i\", mindam, maxdam);\r\n\tif (mindam >= 100 || maxdam >= 100)\r\n\t\tMY_PlrStringXY(254, 239, 305, chrstr, col, -1);\r\n\telse\r\n\t\tMY_PlrStringXY(258, 239, 301, chrstr, col, 0);\r\n\r\n\tif (plr[myplr]._pMagResist == 0)\r\n\t\tcol = COL_WHITE;\r\n\telse\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pMagResist < MAXRESIST) {\r\n\t\tsprintf(chrstr, \"%i%%\", plr[myplr]._pMagResist);\r\n\t} else {\r\n\t\tcol = COL_GOLD;\r\n\t\tsprintf(chrstr, \"MAX\");\r\n\t}\r\n\tADD_PlrStringXY(257, 276, 300, chrstr, col);\r\n\r\n\tif (plr[myplr]._pFireResist == 0)\r\n\t\tcol = COL_WHITE;\r\n\telse\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pFireResist < MAXRESIST) {\r\n\t\tsprintf(chrstr, \"%i%%\", plr[myplr]._pFireResist);\r\n\t} else {\r\n\t\tcol = COL_GOLD;\r\n\t\tsprintf(chrstr, \"MAX\");\r\n\t}\r\n\tADD_PlrStringXY(257, 304, 300, chrstr, col);\r\n\r\n\tif (plr[myplr]._pLghtResist == 0)\r\n\t\tcol = COL_WHITE;\r\n\telse\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pLghtResist < MAXRESIST) {\r\n\t\tsprintf(chrstr, \"%i%%\", plr[myplr]._pLghtResist);\r\n\t} else {\r\n\t\tcol = COL_GOLD;\r\n\t\tsprintf(chrstr, \"MAX\");\r\n\t}\r\n\tADD_PlrStringXY(257, 332, 300, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pBaseStr);\r\n\tif (MaxStats[plr[myplr]._pClass][ATTRIB_STR] == plr[myplr]._pBaseStr)\r\n\t\tcol = COL_GOLD;\r\n\tADD_PlrStringXY(95, 155, 126, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pBaseMag);\r\n\tif (MaxStats[plr[myplr]._pClass][ATTRIB_MAG] == plr[myplr]._pBaseMag)\r\n\t\tcol = COL_GOLD;\r\n\tADD_PlrStringXY(95, 183, 126, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pBaseDex);\r\n\tif (MaxStats[plr[myplr]._pClass][ATTRIB_DEX] == plr[myplr]._pBaseDex)\r\n\t\tcol = COL_GOLD;\r\n\tADD_PlrStringXY(95, 211, 126, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pBaseVit);\r\n\tif (MaxStats[plr[myplr]._pClass][ATTRIB_VIT] == plr[myplr]._pBaseVit)\r\n\t\tcol = COL_GOLD;\r\n\tADD_PlrStringXY(95, 239, 126, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tif (plr[myplr]._pStrength > plr[myplr]._pBaseStr)\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pStrength < plr[myplr]._pBaseStr)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pStrength);\r\n\tADD_PlrStringXY(143, 155, 173, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tif (plr[myplr]._pMagic > plr[myplr]._pBaseMag)\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pMagic < plr[myplr]._pBaseMag)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pMagic);\r\n\tADD_PlrStringXY(143, 183, 173, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tif (plr[myplr]._pDexterity > plr[myplr]._pBaseDex)\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pDexterity < plr[myplr]._pBaseDex)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pDexterity);\r\n\tADD_PlrStringXY(143, 211, 173, chrstr, col);\r\n\r\n\tcol = COL_WHITE;\r\n\tif (plr[myplr]._pVitality > plr[myplr]._pBaseVit)\r\n\t\tcol = COL_BLUE;\r\n\tif (plr[myplr]._pVitality < plr[myplr]._pBaseVit)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pVitality);\r\n\tADD_PlrStringXY(143, 239, 173, chrstr, col);\r\n\r\n\tif (plr[myplr]._pStatPts > 0) {\r\n\t\tif (CalcStatDiff(myplr) < plr[myplr]._pStatPts) {\r\n\t\t\tplr[myplr]._pStatPts = CalcStatDiff(myplr);\r\n\t\t}\r\n\t}\r\n\tif (plr[myplr]._pStatPts > 0) {\r\n\t\tsprintf(chrstr, \"%i\", plr[myplr]._pStatPts);\r\n\t\tADD_PlrStringXY(95, 266, 126, chrstr, COL_RED);\r\n\t\tpc = plr[myplr]._pClass;\r\n\t\tif (plr[myplr]._pBaseStr < MaxStats[pc][ATTRIB_STR])\r\n\t\t\tCelDraw(137 + SCREEN_X, 159 + SCREEN_Y, pChrButtons, chrbtn[ATTRIB_STR] + 2, 41);\r\n\t\tif (plr[myplr]._pBaseMag < MaxStats[pc][ATTRIB_MAG])\r\n\t\t\tCelDraw(137 + SCREEN_X, 187 + SCREEN_Y, pChrButtons, chrbtn[ATTRIB_MAG] + 4, 41);\r\n\t\tif (plr[myplr]._pBaseDex < MaxStats[pc][ATTRIB_DEX])\r\n\t\t\tCelDraw(137 + SCREEN_X, 216 + SCREEN_Y, pChrButtons, chrbtn[ATTRIB_DEX] + 6, 41);\r\n\t\tif (plr[myplr]._pBaseVit < MaxStats[pc][ATTRIB_VIT])\r\n\t\t\tCelDraw(137 + SCREEN_X, 244 + SCREEN_Y, pChrButtons, chrbtn[ATTRIB_VIT] + 8, 41);\r\n\t}\r\n\r\n\tif (plr[myplr]._pMaxHP > plr[myplr]._pMaxHPBase)\r\n\t\tcol = COL_BLUE;\r\n\telse\r\n\t\tcol = COL_WHITE;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pMaxHP >> 6);\r\n\tADD_PlrStringXY(95, 304, 126, chrstr, col);\r\n\tif (plr[myplr]._pHitPoints != plr[myplr]._pMaxHP)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pHitPoints >> 6);\r\n\tADD_PlrStringXY(143, 304, 174, chrstr, col);\r\n\r\n\tif (plr[myplr]._pMaxMana > plr[myplr]._pMaxManaBase)\r\n\t\tcol = COL_BLUE;\r\n\telse\r\n\t\tcol = COL_WHITE;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pMaxMana >> 6);\r\n\tADD_PlrStringXY(95, 332, 126, chrstr, col);\r\n\tif (plr[myplr]._pMana != plr[myplr]._pMaxMana)\r\n\t\tcol = COL_RED;\r\n\tsprintf(chrstr, \"%i\", plr[myplr]._pMana >> 6);\r\n\tADD_PlrStringXY(143, 332, 174, chrstr, col);\r\n}\r\n\r\nvoid CheckLvlBtn()\r\n{\r\n\tif (!lvlbtndown && MouseX >= 40 + PANEL_LEFT && MouseX <= 81 + PANEL_LEFT && MouseY >= -39 + PANEL_TOP && MouseY <= -17 + PANEL_TOP)\r\n\t\tlvlbtndown = TRUE;\r\n}\r\n\r\nvoid ReleaseLvlBtn()\r\n{\r\n\tif (MouseX >= 40 + PANEL_LEFT && MouseX <= 81 + PANEL_LEFT && MouseY >= -39 + PANEL_TOP && MouseY <= -17 + PANEL_TOP)\r\n\t\tchrflag = TRUE;\r\n\tlvlbtndown = FALSE;\r\n}\r\n\r\nvoid DrawLevelUpIcon()\r\n{\r\n\tint nCel;\r\n\r\n\tif (stextflag == STORE_NONE) {\r\n\t\tnCel = lvlbtndown ? 3 : 2;\r\n\t\tADD_PlrStringXY(PANEL_LEFT + 0, PANEL_TOP - 49, PANEL_LEFT + 120, \"Level Up\", COL_WHITE);\r\n\t\tCelDraw(40 + PANEL_X, -17 + PANEL_Y, pChrButtons, nCel, 41);\r\n\t}\r\n}\r\n\r\nvoid CheckChrBtns()\r\n{\r\n\tint pc, i, x, y;\r\n\r\n\tif (!chrbtnactive && plr[myplr]._pStatPts) {\r\n\t\tpc = plr[myplr]._pClass;\r\n\t\tfor (i = 0; i < 4; i++) {\r\n\t\t\tswitch (i) {\r\n\t\t\tcase ATTRIB_STR:\r\n\t\t\t\tif (plr[myplr]._pBaseStr >= MaxStats[pc][ATTRIB_STR])\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ATTRIB_MAG:\r\n\t\t\t\tif (plr[myplr]._pBaseMag >= MaxStats[pc][ATTRIB_MAG])\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ATTRIB_DEX:\r\n\t\t\t\tif (plr[myplr]._pBaseDex >= MaxStats[pc][ATTRIB_DEX])\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ATTRIB_VIT:\r\n\t\t\t\tif (plr[myplr]._pBaseVit >= MaxStats[pc][ATTRIB_VIT])\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tx = ChrBtnsRect[i].x + ChrBtnsRect[i].w;\r\n\t\t\ty = ChrBtnsRect[i].y + ChrBtnsRect[i].h;\r\n\t\t\tif (MouseX >= ChrBtnsRect[i].x\r\n\t\t\t    && MouseX <= x\r\n\t\t\t    && MouseY >= ChrBtnsRect[i].y\r\n\t\t\t    && MouseY <= y) {\r\n\t\t\t\tchrbtn[i] = TRUE;\r\n\t\t\t\tchrbtnactive = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ReleaseChrBtns()\r\n{\r\n\tint i;\r\n\r\n\tchrbtnactive = FALSE;\r\n\tfor (i = 0; i < 4; ++i) {\r\n\t\tif (chrbtn[i]) {\r\n\t\t\tchrbtn[i] = FALSE;\r\n\t\t\tif (MouseX >= ChrBtnsRect[i].x\r\n\t\t\t    && MouseX <= ChrBtnsRect[i].x + ChrBtnsRect[i].w\r\n\t\t\t    && MouseY >= ChrBtnsRect[i].y\r\n\t\t\t    && MouseY <= ChrBtnsRect[i].y + ChrBtnsRect[i].h) {\r\n\t\t\t\tswitch (i) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tNetSendCmdParam1(TRUE, CMD_ADDSTR, 1);\r\n\t\t\t\t\tplr[myplr]._pStatPts--;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tNetSendCmdParam1(TRUE, CMD_ADDMAG, 1);\r\n\t\t\t\t\tplr[myplr]._pStatPts--;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tNetSendCmdParam1(TRUE, CMD_ADDDEX, 1);\r\n\t\t\t\t\tplr[myplr]._pStatPts--;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tNetSendCmdParam1(TRUE, CMD_ADDVIT, 1);\r\n\t\t\t\t\tplr[myplr]._pStatPts--;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic int DrawDurIcon4Item(ItemStruct *pItem, int x, int c)\r\n{\r\n\tif (pItem->_itype == ITYPE_NONE)\r\n\t\treturn x;\r\n\tif (pItem->_iDurability > 5)\r\n\t\treturn x;\r\n\tif (c == 0) {\r\n\t\tif (pItem->_iClass == ICLASS_WEAPON) {\r\n\t\t\tswitch (pItem->_itype) {\r\n\t\t\tcase ITYPE_SWORD:\r\n\t\t\t\tc = 2;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_AXE:\r\n\t\t\t\tc = 6;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_BOW:\r\n\t\t\t\tc = 7;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_MACE:\r\n\t\t\t\tc = 5;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_STAFF:\r\n\t\t\t\tc = 8;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tc = 1;\r\n\t\t}\r\n\t}\r\n\tif (pItem->_iDurability > 2)\r\n\t\tc += 8;\r\n\tCelDraw(x, -17 + PANEL_Y, pDurIcons, c, 32);\r\n\treturn x - 32 - 8;\r\n}\r\n\r\nvoid DrawDurIcon()\r\n{\r\n\tPlayerStruct *p;\r\n\tint x;\r\n\r\n\tif ((chrflag || questlog) && (invflag || sbookflag))\r\n\t\treturn;\r\n\r\n\tx = PANEL_X + PANEL_WIDTH - 32 - 16;\r\n\tif (invflag || sbookflag)\r\n\t\tx -= SPANEL_WIDTH;\r\n\r\n\tp = &plr[myplr];\r\n\tx = DrawDurIcon4Item(&p->InvBody[INVLOC_HEAD], x, 4);\r\n\tx = DrawDurIcon4Item(&p->InvBody[INVLOC_CHEST], x, 3);\r\n\tx = DrawDurIcon4Item(&p->InvBody[INVLOC_HAND_LEFT], x, 0);\r\n\tDrawDurIcon4Item(&p->InvBody[INVLOC_HAND_RIGHT], x, 0);\r\n}\r\n\r\nvoid RedBack()\r\n{\r\n\tint idx;\r\n\r\n\tidx = light4flag ? 1536 : 4608;\r\n\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\tif (leveltype != DTYPE_HELL) {\r\n\t\t__asm {\r\n\t\t\tmov\t\tedi, gpBuffer\r\n\t\t\tadd\t\tedi, SCREENXY(0, 0)\r\n\t\t\tmov\t\tebx, pLightTbl\r\n\t\t\tadd\t\tebx, idx\r\n\t\t\tmov\t\tedx, PANEL_TOP\r\n\t\tlx_label1:\r\n\t\t\tmov\t\tecx, SCREEN_WIDTH\r\n\t\tlx_label2:\r\n\t\t\tmov\t\tal, [edi]\r\n\t\t\txlat\r\n\t\t\tstosb\r\n\t\t\tloop\tlx_label2\r\n\t\t\tadd\t\tedi, BUFFER_WIDTH - SCREEN_WIDTH\r\n\t\t\tdec\t\tedx\r\n\t\t\tjnz\t\tlx_label1\r\n\t\t}\r\n\t} else {\r\n\t\t__asm {\r\n\t\t\tmov\t\tedi, gpBuffer\r\n\t\t\tadd\t\tedi, SCREENXY(0, 0)\r\n\t\t\tmov\t\tebx, pLightTbl\r\n\t\t\tadd\t\tebx, idx\r\n\t\t\tmov\t\tedx, PANEL_TOP\r\n\t\tl4_label1:\r\n\t\t\tmov\t\tecx, SCREEN_WIDTH\r\n\t\tl4_label2:\r\n\t\t\tmov\t\tal, [edi]\r\n\t\t\tcmp\t\tal, 32\r\n\t\t\tjb\t\tl4_label3\r\n\t\t\txlat\r\n\t\tl4_label3:\r\n\t\t\tstosb\r\n\t\t\tloop\tl4_label2\r\n\t\t\tadd\t\tedi, BUFFER_WIDTH - SCREEN_WIDTH\r\n\t\t\tdec\t\tedx\r\n\t\t\tjnz\t\tl4_label1\r\n\t\t}\r\n\t}\r\n#else\r\n\tint w, h;\r\n\tBYTE *dst, *tbl;\r\n\r\n\tif (leveltype != DTYPE_HELL) {\r\n\t\tdst = &gpBuffer[SCREENXY(0, 0)];\r\n\t\ttbl = &pLightTbl[idx];\r\n\t\tfor (h = VIEWPORT_HEIGHT; h; h--, dst += BUFFER_WIDTH - SCREEN_WIDTH) {\r\n\t\t\tfor (w = SCREEN_WIDTH; w; w--) {\r\n\t\t\t\t*dst = tbl[*dst];\r\n\t\t\t\tdst++;\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tdst = &gpBuffer[SCREENXY(0, 0)];\r\n\t\ttbl = &pLightTbl[idx];\r\n\t\tfor (h = VIEWPORT_HEIGHT; h; h--, dst += BUFFER_WIDTH - SCREEN_WIDTH) {\r\n\t\t\tfor (w = SCREEN_WIDTH; w; w--) {\r\n\t\t\t\tif (*dst >= 32)\r\n\t\t\t\t\t*dst = tbl[*dst];\r\n\t\t\t\tdst++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\nstatic void PrintSBookStr(int x, int y, BOOL cjustflag, const char *pszStr, char col)\r\n{\r\n\tBYTE c;\r\n\tconst char *tmp;\r\n\tint screen_x, line, width;\r\n\r\n\twidth = PitchTbl[y] + x + RIGHT_PANEL_X + SPLICONLENGTH;\r\n\tline = 0;\r\n\tif (cjustflag) {\r\n\t\tscreen_x = 0;\r\n\t\ttmp = pszStr;\r\n\t\twhile (*tmp) {\r\n\t\t\tc = gbFontTransTbl[(BYTE)*tmp++];\r\n\t\t\tscreen_x += fontkern[fontframe[c]] + 1;\r\n\t\t}\r\n\t\tif (screen_x < 222)\r\n\t\t\tline = (222 - screen_x) >> 1;\r\n\t\twidth += line;\r\n\t}\r\n\twhile (*pszStr) {\r\n\t\tc = gbFontTransTbl[(BYTE)*pszStr++];\r\n\t\tc = fontframe[c];\r\n\t\tline += fontkern[c] + 1;\r\n\t\tif (c) {\r\n\t\t\tif (line <= 222)\r\n\t\t\t\tPrintChar(width, c, col);\r\n\t\t}\r\n\t\twidth += fontkern[c] + 1;\r\n\t}\r\n}\r\n\r\nchar GetSBookTrans(int ii, BOOL townok)\r\n{\r\n\tchar st;\r\n\r\n#ifdef HELLFIRE\r\n\tif ((plr[myplr]._pClass == PC_MONK) && (ii == SPL_SEARCH))\r\n\t\treturn RSPLTYPE_SKILL;\r\n#endif\r\n\tst = RSPLTYPE_SPELL;\r\n\tif (plr[myplr]._pISpells & SPELLBIT(ii)) {\r\n\t\tst = RSPLTYPE_CHARGES;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (plr[myplr]._pAblSpells & SPELLBIT(ii)) {\r\n#else\r\n\tif (plr[myplr]._pAblSpells & 1 << (ii - 1)) { /// BUGFIX: missing (__int64) - use SPELLBIT(ii) macro\r\n#endif\r\n\t\tst = RSPLTYPE_SKILL;\r\n\t}\r\n\tif (st == RSPLTYPE_SPELL) {\r\n\t\tif (!CheckSpell(myplr, ii, RSPLTYPE_SPELL, TRUE)) {\r\n\t\t\tst = RSPLTYPE_INVALID;\r\n\t\t}\r\n\t\tif ((char)(plr[myplr]._pSplLvl[ii] + plr[myplr]._pISplLvlAdd) <= 0) {\r\n\t\t\tst = RSPLTYPE_INVALID;\r\n\t\t}\r\n\t}\r\n\tif (townok && currlevel == 0 && st != RSPLTYPE_INVALID && !spelldata[ii].sTownSpell) {\r\n\t\tst = RSPLTYPE_INVALID;\r\n\t}\r\n\r\n\treturn st;\r\n}\r\n\r\nvoid DrawSpellBook()\r\n{\r\n\tint i, sn, mana, lvl, yp, min, max;\r\n\tchar st;\r\n\tunsigned __int64 spl;\r\n\r\n\tCelDraw(RIGHT_PANEL_X, 351 + SCREEN_Y, pSpellBkCel, 1, 320);\r\n#ifdef HELLFIRE\r\n\tif (sbooktab < 5)\r\n\t\tCelDraw(RIGHT_PANEL_X + 61 * sbooktab + 7, 348 + SCREEN_Y, pSBkBtnCel, sbooktab + 1, 61);\r\n#else\r\n\t// BUGFIX: rendering of page 3 and page 4 buttons are both off-by-one pixel.\r\n\t// The fix would look as follows:\r\n\t//\r\n\t//    int sx = RIGHT_PANEL_X + 76 * sbooktab + 7;\r\n\t//    if (sbooktab == 2 || sbooktab == 3) {\r\n\t//       sx++;\r\n\t//    }\r\n\t//    CelDraw(sx, 348 + SCREEN_Y, pSBkBtnCel, sbooktab + 1, 76);\r\n\tCelDraw(RIGHT_PANEL_X + 76 * sbooktab + 7, 348 + SCREEN_Y, pSBkBtnCel, sbooktab + 1, 76);\r\n#endif\r\n\r\n\tspl = plr[myplr]._pMemSpells | plr[myplr]._pISpells | plr[myplr]._pAblSpells;\r\n\r\n\typ = 55 + SCREEN_Y;\r\n\tfor (i = 1; i < 8; i++) {\r\n\t\tsn = SpellPages[sbooktab][i - 1];\r\n\t\tif (sn != -1 && spl & SPELLBIT(sn)) {\r\n\t\t\tst = GetSBookTrans(sn, TRUE);\r\n\t\t\tSetSpellTrans(st);\r\n\t\t\tDrawSpellCel(RIGHT_PANEL_X + 11, yp, pSBkIconCels, SpellITbl[sn], 37);\r\n\t\t\tif (sn == plr[myplr]._pRSpell && st == plr[myplr]._pRSplType) {\r\n\t\t\t\tSetSpellTrans(RSPLTYPE_SKILL);\r\n\t\t\t\tDrawSpellCel(RIGHT_PANEL_X + 11, yp, pSBkIconCels, SPLICONLAST, 37);\r\n\t\t\t}\r\n\t\t\tPrintSBookStr(10, yp - 23, FALSE, spelldata[sn].sNameText, COL_WHITE);\r\n\t\t\tswitch (GetSBookTrans(sn, FALSE)) {\r\n\t\t\tcase RSPLTYPE_SKILL:\r\n\t\t\t\tstrcpy(tempstr, \"Skill\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase RSPLTYPE_CHARGES:\r\n\t\t\t\tsprintf(tempstr, \"Staff (%i charges)\", plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tmana = GetManaAmount(myplr, sn) >> 6;\r\n\t\t\t\tGetDamageAmt(sn, &min, &max);\r\n\t\t\t\tif (min != -1) {\r\n\t\t\t\t\tsprintf(tempstr, \"Mana: %i  Dam: %i - %i\", mana, min, max);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsprintf(tempstr, \"Mana: %i   Dam: n/a\", mana);\r\n\t\t\t\t}\r\n\t\t\t\tif (sn == SPL_BONESPIRIT) {\r\n\t\t\t\t\tsprintf(tempstr, \"Mana: %i  Dam: 1/3 tgt hp\", mana);\r\n\t\t\t\t}\r\n\t\t\t\tPrintSBookStr(10, yp - 1, FALSE, tempstr, COL_WHITE);\r\n\t\t\t\tlvl = plr[myplr]._pSplLvl[sn] + plr[myplr]._pISplLvlAdd;\r\n\t\t\t\tif (lvl < 0) {\r\n\t\t\t\t\tlvl = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (lvl == 0) {\r\n\t\t\t\t\tsprintf(tempstr, \"Spell Level 0 - Unusable\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsprintf(tempstr, \"Spell Level %i\", lvl);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tPrintSBookStr(10, yp - 12, FALSE, tempstr, COL_WHITE);\r\n\t\t}\r\n\t\typ += 43;\r\n\t}\r\n}\r\n\r\nvoid CheckSBook()\r\n{\r\n\tint sn;\r\n\tchar st;\r\n\tunsigned __int64 spl;\r\n\r\n\tif (MouseX >= RIGHT_PANEL + 11 && MouseX < RIGHT_PANEL + 48 && MouseY >= 18 && MouseY < 314) {\r\n\t\tsn = SpellPages[sbooktab][(MouseY - 18) / 43];\r\n\t\tspl = plr[myplr]._pMemSpells | plr[myplr]._pISpells | plr[myplr]._pAblSpells;\r\n\t\tif (sn != -1 && spl & SPELLBIT(sn)) {\r\n\t\t\tst = RSPLTYPE_SPELL;\r\n\t\t\tif (plr[myplr]._pISpells & SPELLBIT(sn)) {\r\n\t\t\t\tst = RSPLTYPE_CHARGES;\r\n\t\t\t}\r\n\t\t\tif (plr[myplr]._pAblSpells & SPELLBIT(sn)) {\r\n\t\t\t\tst = RSPLTYPE_SKILL;\r\n\t\t\t}\r\n\t\t\tplr[myplr]._pRSpell = sn;\r\n\t\t\tplr[myplr]._pRSplType = st;\r\n\t\t\tforce_redraw = 255;\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (MouseX >= RIGHT_PANEL + 7 && MouseX < RIGHT_PANEL + 312 && MouseY >= 320 && MouseY < 349) {\r\n\t\tsbooktab = (MouseX - (RIGHT_PANEL + 7)) / 61;\r\n\t}\r\n#else\r\n\tif (MouseX >= RIGHT_PANEL + 7 && MouseX < RIGHT_PANEL + 313 && MouseY >= 320 && MouseY < 349) { /// BUGFIX: change `< 313` to `< 311`\r\n\t\tsbooktab = (MouseX - (RIGHT_PANEL + 7)) / 76;\r\n\t}\r\n#endif\r\n}\r\n\r\nconst char *get_pieces_str(int nGold)\r\n{\r\n\tconst char *result;\r\n\r\n\tresult = \"piece\";\r\n\tif (nGold != 1)\r\n\t\tresult = \"pieces\";\r\n\treturn result;\r\n}\r\n\r\nvoid DrawGoldSplit(int amount)\r\n{\r\n\tint screen_x, i;\r\n\r\n\tscreen_x = 0;\r\n\tCelDraw(351 + SCREEN_X, 178 + SCREEN_Y, pGBoxBuff, 1, 261);\r\n\tsprintf(tempstr, \"You have %u gold\", initialDropGoldValue);\r\n\tADD_PlrStringXY(366, 87, 600, tempstr, COL_GOLD);\r\n\tsprintf(tempstr, \"%s.  How many do\", get_pieces_str(initialDropGoldValue));\r\n\tADD_PlrStringXY(366, 103, 600, tempstr, COL_GOLD);\r\n\tADD_PlrStringXY(366, 121, 600, \"you want to remove?\", COL_GOLD);\r\n\tif (amount > 0) {\r\n\t\tsprintf(tempstr, \"%u\", amount);\r\n\t\tPrintGameStr(388, 140, tempstr, COL_WHITE);\r\n\t}\r\n\tif (amount > 0) {\r\n\t\t// BUGFIX: loop condition should be `tempstr[i] != 0`, not `i < tempstr[i]`.\r\n\t\tfor (i = 0; i < tempstr[i]; i++) {\r\n\t\t\tBYTE c = fontframe[gbFontTransTbl[(BYTE)tempstr[i]]];\r\n\t\t\tscreen_x += fontkern[c] + 1;\r\n\t\t}\r\n\t\tscreen_x += 452;\r\n\t} else {\r\n\t\tscreen_x = 450;\r\n\t}\r\n\tCelDraw(screen_x, 140 + SCREEN_Y, pSPentSpn2Cels, nGoldFrame, 12);\r\n\tnGoldFrame = (nGoldFrame & 7) + 1;\r\n}\r\n\r\nvoid control_drop_gold(char vkey)\r\n{\r\n\tchar input[6];\r\n\r\n\tif (plr[myplr]._pHitPoints >> 6 <= 0) {\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tdropGoldValue = 0;\r\n\t\treturn;\r\n\t}\r\n\r\n\tmemset(input, 0, sizeof(input));\r\n\t_itoa(dropGoldValue, input, 10);\r\n\tif (vkey == VK_RETURN) {\r\n\t\tif (dropGoldValue > 0)\r\n\t\t\tcontrol_remove_gold(myplr, initialDropGoldIndex);\r\n\t\tdropGoldFlag = FALSE;\r\n\t} else if (vkey == VK_ESCAPE) {\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tdropGoldValue = 0;\r\n\t} else if (vkey == VK_BACK) {\r\n\t\tinput[strlen(input) - 1] = '\\0';\r\n\t\tdropGoldValue = atoi(input);\r\n\t} else if (vkey - '0' >= 0 && vkey - '0' <= 9) {\r\n\t\tif (dropGoldValue != 0 || atoi(input) <= initialDropGoldValue) {\r\n\t\t\tinput[strlen(input)] = vkey;\r\n\t\t\tif (atoi(input) > initialDropGoldValue)\r\n\t\t\t\treturn;\r\n\t\t\tif (strlen(input) > strlen(input))\r\n\t\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tinput[0] = vkey;\r\n\t\t}\r\n\t\tdropGoldValue = atoi(input);\r\n\t}\r\n}\r\n\r\nvoid control_remove_gold(int pnum, int gold_index)\r\n{\r\n\tint gi;\r\n\r\n\tif (gold_index <= INVITEM_INV_LAST) {\r\n\t\tgi = gold_index - INVITEM_INV_FIRST;\r\n\t\tplr[pnum].InvList[gi]._ivalue -= dropGoldValue;\r\n\t\tif (plr[pnum].InvList[gi]._ivalue > 0)\r\n\t\t\tSetGoldCurs(pnum, gi);\r\n\t\telse\r\n\t\t\tRemoveInvItem(pnum, gi);\r\n\t} else {\r\n\t\tgi = gold_index - INVITEM_BELT_FIRST;\r\n\t\tplr[pnum].SpdList[gi]._ivalue -= dropGoldValue;\r\n\t\tif (plr[pnum].SpdList[gi]._ivalue > 0)\r\n\t\t\tSetSpdbarGoldCurs(pnum, gi);\r\n\t\telse\r\n\t\t\tRemoveSpdBarItem(pnum, gi);\r\n\t}\r\n\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\tplr[pnum].HoldItem._ivalue = dropGoldValue;\r\n\tplr[pnum].HoldItem._iStatFlag = TRUE;\r\n\tcontrol_set_gold_curs(pnum);\r\n\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\tdropGoldValue = 0;\r\n}\r\n\r\nvoid control_set_gold_curs(int pnum)\r\n{\r\n\tif (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\tplr[pnum].HoldItem._iCurs = ICURS_GOLD_LARGE;\r\n\telse if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\tplr[pnum].HoldItem._iCurs = ICURS_GOLD_SMALL;\r\n\telse\r\n\t\tplr[pnum].HoldItem._iCurs = ICURS_GOLD_MEDIUM;\r\n\r\n\tNewCursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n}\r\n\r\nstatic char *control_print_talk_msg(char *msg, int x, int y, int *nOffset, int color)\r\n{\r\n\tBYTE c;\r\n\tint width;\r\n\r\n\tx += 200 + SCREEN_X;\r\n\ty += 22 + PANEL_Y;\r\n\twidth = x;\r\n\t*nOffset = PitchTbl[y] + x;\r\n\twhile (*msg) {\r\n\r\n\t\tc = gbFontTransTbl[(BYTE)*msg];\r\n\t\tc = fontframe[c];\r\n\t\twidth += fontkern[c] + 1;\r\n\t\tif (width > 450 + PANEL_X)\r\n\t\t\treturn msg;\r\n\t\tmsg++;\r\n\t\tif (c != 0) {\r\n\t\t\tPrintChar(*nOffset, c, color);\r\n\t\t}\r\n\t\t*nOffset += fontkern[c] + 1;\r\n\t}\r\n\treturn NULL;\r\n}\r\n\r\nvoid DrawTalkPan()\r\n{\r\n\tint i, off, talk_btn, color, nCel, x;\r\n\tchar *msg;\r\n\r\n\tif (!talkflag)\r\n\t\treturn;\r\n\r\n\tDrawPanelBox(175, sgbPlrTalkTbl + 20, 294, 5, PANEL_X + 175, PANEL_Y + 4);\r\n\toff = 0;\r\n\tfor (i = 293; i > 283; off++, i--) {\r\n\t\tDrawPanelBox((off >> 1) + 175, sgbPlrTalkTbl + off + 25, i, 1, (off >> 1) + PANEL_X + 175, off + PANEL_Y + 9);\r\n\t}\r\n\tDrawPanelBox(185, sgbPlrTalkTbl + 35, 274, 30, PANEL_X + 185, PANEL_Y + 19);\r\n\tDrawPanelBox(180, sgbPlrTalkTbl + 65, 284, 5, PANEL_X + 180, PANEL_Y + 49);\r\n\tfor (i = 0; i < 10; i++) {\r\n\t\tDrawPanelBox(180, sgbPlrTalkTbl + i + 70, i + 284, 1, PANEL_X + 180, i + PANEL_Y + 54);\r\n\t}\r\n\tDrawPanelBox(170, sgbPlrTalkTbl + 80, 310, 55, PANEL_X + 170, PANEL_Y + 64);\r\n\tmsg = sgszTalkMsg;\r\n\tfor (i = 0; i < 39; i += 13) {\r\n\t\tmsg = control_print_talk_msg(msg, 0 + PANEL_LEFT, i, &x, 0);\r\n\t\tif (!msg)\r\n\t\t\tbreak;\r\n\t}\r\n\tif (msg)\r\n\t\t*msg = '\\0';\r\n\tCelBlitFrame(gpBuffer + x, pSPentSpn2Cels, frame, 12);\r\n\tframe = (frame & 7) + 1;\r\n\ttalk_btn = 0;\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (i == myplr)\r\n\t\t\tcontinue;\r\n\t\tif (whisper[i]) {\r\n\t\t\tcolor = COL_GOLD;\r\n\t\t\tif (talkbtndown[talk_btn]) {\r\n\t\t\t\tif (talk_btn != 0)\r\n\t\t\t\t\tnCel = 4;\r\n\t\t\t\telse\r\n\t\t\t\t\tnCel = 3;\r\n\t\t\t\tCelDraw(172 + PANEL_X, 84 + 18 * talk_btn + PANEL_Y, pTalkBtns, nCel, 61);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tcolor = COL_RED;\r\n\t\t\tif (talk_btn != 0)\r\n\t\t\t\tnCel = 2;\r\n\t\t\telse\r\n\t\t\t\tnCel = 1;\r\n\t\t\tif (talkbtndown[talk_btn])\r\n\t\t\t\tnCel += 4;\r\n\t\t\tCelDraw(172 + PANEL_X, 84 + 18 * talk_btn + PANEL_Y, pTalkBtns, nCel, 61);\r\n\t\t}\r\n\t\tif (plr[i].plractive) {\r\n\t\t\tcontrol_print_talk_msg(plr[i]._pName, 46 + PANEL_LEFT, 60 + talk_btn * 18, &x, color);\r\n\t\t}\r\n\r\n\t\ttalk_btn++;\r\n\t}\r\n}\r\n\r\nBOOL control_check_talk_btn()\r\n{\r\n\tint i;\r\n\r\n\tif (!talkflag)\r\n\t\treturn FALSE;\r\n\r\n\tif (MouseX < 172 + PANEL_LEFT)\r\n\t\treturn FALSE;\r\n\tif (MouseY < 69 + PANEL_TOP)\r\n\t\treturn FALSE;\r\n\tif (MouseX > 233 + PANEL_LEFT)\r\n\t\treturn FALSE;\r\n\tif (MouseY > 123 + PANEL_TOP)\r\n\t\treturn FALSE;\r\n\r\n\tfor (i = 0; i < sizeof(talkbtndown) / sizeof(talkbtndown[0]); i++) {\r\n\t\ttalkbtndown[i] = FALSE;\r\n\t}\r\n\r\n\ttalkbtndown[(MouseY - (69 + PANEL_TOP)) / 18] = TRUE;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid control_release_talk_btn()\r\n{\r\n\tint i, p, off;\r\n\r\n\tif (talkflag) {\r\n\t\tfor (i = 0; i < sizeof(talkbtndown) / sizeof(talkbtndown[0]); i++)\r\n\t\t\ttalkbtndown[i] = FALSE;\r\n\t\tif (MouseX >= 172 + PANEL_LEFT && MouseY >= 69 + PANEL_TOP && MouseX <= 233 + PANEL_LEFT && MouseY <= 123 + PANEL_TOP) {\r\n\t\t\toff = (MouseY - (69 + PANEL_TOP)) / 18;\r\n\r\n\t\t\tfor (p = 0; p < MAX_PLRS && off != -1; p++) {\r\n\t\t\t\tif (p != myplr)\r\n\t\t\t\t\toff--;\r\n\t\t\t}\r\n\t\t\tif (p <= MAX_PLRS)\r\n\t\t\t\twhisper[p - 1] = !whisper[p - 1];\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifndef HELLFIRE\r\nvoid control_reset_talk_msg(char *msg)\r\n{\r\n\tint i, pmask;\r\n\tpmask = 0;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (whisper[i])\r\n\t\t\tpmask |= 1 << i;\r\n\t}\r\n\r\n\tif (!msgcmd_add_server_cmd_W(sgszTalkMsg))\r\n\t\tNetSendCmdString(pmask, sgszTalkMsg);\r\n}\r\n#endif\r\n\r\nvoid control_type_message()\r\n{\r\n\tint i;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttalkflag = TRUE;\r\n\tsgszTalkMsg[0] = '\\0';\r\n\tframe = 1;\r\n\tfor (i = 0; i < 3; i++) {\r\n\t\ttalkbtndown[i] = FALSE;\r\n\t}\r\n\tsgbPlrTalkTbl = PANEL_HEIGHT + 16;\r\n\tforce_redraw = 255;\r\n\tsgbTalkSavePos = sgbNextTalkSave;\r\n}\r\n\r\nvoid control_reset_talk()\r\n{\r\n\ttalkflag = FALSE;\r\n\tsgbPlrTalkTbl = 0;\r\n\tforce_redraw = 255;\r\n}\r\n\r\nstatic void control_press_enter()\r\n{\r\n\tint i;\r\n\tBYTE talk_save;\r\n\r\n\tif (sgszTalkMsg[0] != 0) {\r\n#ifdef HELLFIRE\r\n\t\tint pmask;\r\n\t\tpmask = 0;\r\n\r\n\t\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\t\tif (whisper[i])\r\n\t\t\t\tpmask |= 1 << i;\r\n\t\t}\r\n\t\tNetSendCmdString(pmask, sgszTalkMsg);\r\n#else\r\n\t\tcontrol_reset_talk_msg(sgszTalkMsg);\r\n#endif\r\n\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\tif (!strcmp(sgszTalkSave[i], sgszTalkMsg))\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (i >= 8) {\r\n\t\t\tstrcpy(sgszTalkSave[sgbNextTalkSave], sgszTalkMsg);\r\n\t\t\tsgbNextTalkSave++;\r\n\t\t\tsgbNextTalkSave &= 7;\r\n\t\t} else {\r\n\t\t\ttalk_save = sgbNextTalkSave - 1;\r\n\t\t\ttalk_save &= 7;\r\n\t\t\tif (i != talk_save) {\r\n\t\t\t\tstrcpy(sgszTalkSave[i], sgszTalkSave[talk_save]);\r\n\t\t\t\tstrcpy(sgszTalkSave[talk_save], sgszTalkMsg);\r\n\t\t\t}\r\n\t\t}\r\n\t\tsgszTalkMsg[0] = '\\0';\r\n\t\tsgbTalkSavePos = sgbNextTalkSave;\r\n\t}\r\n\tcontrol_reset_talk();\r\n}\r\n\r\nBOOL control_talk_last_key(int vkey)\r\n{\r\n\tint result;\r\n\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn FALSE;\r\n\r\n\tif (!talkflag)\r\n\t\treturn FALSE;\r\n\r\n\tif ((DWORD)vkey < VK_SPACE)\r\n\t\treturn FALSE;\r\n\r\n\tresult = strlen(sgszTalkMsg);\r\n\tif (result < 78) {\r\n\t\tsgszTalkMsg[result] = vkey;\r\n\t\tsgszTalkMsg[result + 1] = '\\0';\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void control_up_down(int v)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tsgbTalkSavePos = (v + sgbTalkSavePos) & 7;\r\n\t\tif (sgszTalkSave[sgbTalkSavePos][0]) {\r\n\t\t\tstrcpy(sgszTalkMsg, sgszTalkSave[sgbTalkSavePos]);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL control_presskeys(int vkey)\r\n{\r\n\tint len;\r\n\tBOOL ret;\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tif (!talkflag) {\r\n\t\t\tret = FALSE;\r\n\t\t} else {\r\n\t\t\tif (vkey == VK_SPACE) {\r\n\t\t\t} else if (vkey == VK_ESCAPE) {\r\n\t\t\t\tcontrol_reset_talk();\r\n\t\t\t} else if (vkey == VK_RETURN) {\r\n\t\t\t\tcontrol_press_enter();\r\n\t\t\t} else if (vkey == VK_BACK) {\r\n\t\t\t\tlen = strlen(sgszTalkMsg);\r\n\t\t\t\tif (len > 0)\r\n\t\t\t\t\tsgszTalkMsg[len - 1] = '\\0';\r\n\t\t\t} else if (vkey == VK_DOWN) {\r\n\t\t\t\tcontrol_up_down(1);\r\n\t\t\t} else if (vkey == VK_UP) {\r\n\t\t\t\tcontrol_up_down(-1);\r\n\t\t\t} else {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t\tret = TRUE;\r\n\t\t}\r\n\t} else {\r\n\t\tret = FALSE;\r\n\t}\r\n\treturn ret;\r\n}\r\n"
  },
  {
    "path": "Source/control.h",
    "content": "/**\r\n * @file control.h\r\n *\r\n * Interface of the character and main control panels\r\n */\r\n#ifndef __CONTROL_H__\r\n#define __CONTROL_H__\r\n\r\nextern BOOL drawhpflag;\r\nextern BOOL dropGoldFlag;\r\nextern BOOL panbtn[8];\r\nextern BOOL chrbtn[4];\r\nextern BOOL lvlbtndown;\r\nextern int dropGoldValue;\r\nextern BOOL drawmanaflag;\r\nextern BOOL chrbtnactive;\r\nextern BOOL pinfoflag;\r\nextern int pSpell;\r\nextern char infoclr;\r\nextern char tempstr[256];\r\nextern BOOLEAN whisper[MAX_PLRS];\r\nextern int pSplType;\r\nextern int frame;\r\nextern int initialDropGoldIndex;\r\nextern BOOL talkflag;\r\nextern BOOL sbookflag;\r\nextern BOOL chrflag;\r\nextern BOOL drawbtnflag;\r\nextern char infostr[256];\r\nextern char panelstr[4][64];\r\nextern BOOL panelflag;\r\nextern int initialDropGoldValue;\r\nextern BOOL panbtndown;\r\nextern BOOL spselflag;\r\n\r\nvoid DrawSpellList();\r\nvoid SetSpell();\r\nvoid SetSpeedSpell(int slot);\r\nvoid ToggleSpell(int slot);\r\nvoid PrintChar(int nOffset, int nCel, char col);\r\nvoid AddPanelString(const char *str, BOOL just);\r\nvoid ClearPanel();\r\nvoid DrawPanelBox(int x, int y, int w, int h, int sx, int sy);\r\nvoid DrawLifeFlask();\r\nvoid UpdateLifeFlask();\r\nvoid DrawManaFlask();\r\nvoid control_update_life_mana();\r\nvoid UpdateManaFlask();\r\nvoid InitControlPan();\r\nvoid DrawCtrlPan();\r\nvoid DrawCtrlBtns();\r\nvoid DoSpeedBook();\r\nvoid DoPanBtn();\r\nvoid control_check_btn_press();\r\nvoid DoAutoMap();\r\nvoid CheckPanelInfo();\r\nvoid CheckBtnUp();\r\nvoid FreeControlPan();\r\nBOOL control_WriteStringToBuffer(BYTE *str);\r\nvoid DrawInfoBox();\r\nvoid PrintGameStr(int x, int y, const char *str, int color);\r\nvoid DrawChr();\r\nvoid CheckLvlBtn();\r\nvoid ReleaseLvlBtn();\r\nvoid DrawLevelUpIcon();\r\nvoid CheckChrBtns();\r\nvoid ReleaseChrBtns();\r\nvoid DrawDurIcon();\r\nvoid RedBack();\r\nvoid DrawSpellBook();\r\nvoid CheckSBook();\r\nconst char *get_pieces_str(int nGold);\r\nvoid DrawGoldSplit(int amount);\r\nvoid control_drop_gold(char vkey);\r\nvoid control_remove_gold(int pnum, int gold_index);\r\nvoid control_set_gold_curs(int pnum);\r\nvoid DrawTalkPan();\r\nBOOL control_check_talk_btn();\r\nvoid control_release_talk_btn();\r\nvoid control_type_message();\r\nvoid control_reset_talk();\r\nBOOL control_talk_last_key(int vkey);\r\nBOOL control_presskeys(int vkey);\r\n\r\n/* rdata */\r\nextern const BYTE fontframe[128];\r\nextern const BYTE fontkern[68];\r\nextern const BYTE gbFontTransTbl[256];\r\n\r\n#endif /* __CONTROL_H__ */\r\n"
  },
  {
    "path": "Source/cursor.cpp",
    "content": "/**\r\n * @file cursor.cpp\r\n *\r\n * Implementation of cursor tracking functionality.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Pixel width of the current cursor image */\r\nint cursW;\r\n/** Pixel height of the current cursor image */\r\nint cursH;\r\n/** Current highlighted monster */\r\nint pcursmonst;\r\n/** Width of current cursor in inventory cells */\r\nint icursW28;\r\n/** Height of current cursor in inventory cells */\r\nint icursH28;\r\n/** Cursor images CEL */\r\nBYTE *pCursCels;\r\n#ifdef HELLFIRE\r\nBYTE *pCursCels2;\r\n#endif\r\n\r\n/** inv_item value */\r\nchar pcursinvitem;\r\n/** Pixel width of the current cursor image */\r\nint icursW;\r\n/** Pixel height of the current cursor image */\r\nint icursH;\r\n/** Current highlighted item */\r\nchar pcursitem;\r\n/** Current highlighted object */\r\nchar pcursobj;\r\n/** Current highlighted player */\r\nchar pcursplr;\r\n/** Current highlighted tile row */\r\nint cursmx;\r\n/** Current highlighted tile column */\r\nint cursmy;\r\n/** Previously highlighted monster */\r\nint pcurstemp;\r\n/** Index of current cursor image */\r\nint pcurs;\r\n\r\n/* rdata */\r\n/** Maps from objcurs.cel frame number to frame width. */\r\nconst int InvItemWidth[] = {\r\n\t// clang-format off\r\n\t// Cursors\r\n\t0, 33, 32, 32, 32, 32, 32, 32, 32, 32, 32, 23,\r\n\t// Items\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n#ifdef HELLFIRE\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t2 * 28, 2 * 28, 1 * 28, 1 * 28, 1 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28\r\n#endif\r\n\t// clang-format on\r\n};\r\n\r\n/** Maps from objcurs.cel frame number to frame height. */\r\nconst int InvItemHeight[] = {\r\n\t// clang-format off\r\n\t// Cursors\r\n\t0, 29, 32, 32, 32, 32, 32, 32, 32, 32, 32, 35,\r\n\t// Items\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28, 2 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n#ifdef HELLFIRE\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28, 1 * 28,\r\n\t2 * 28, 2 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28,\r\n\t3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28, 3 * 28\r\n#endif\r\n\t// clang-format on\r\n};\r\n\r\nvoid InitCursor()\r\n{\r\n\tassert(!pCursCels);\r\n\tpCursCels = LoadFileInMem(\"Data\\\\Inv\\\\Objcurs.CEL\", NULL);\r\n#ifdef HELLFIRE\r\n\tpCursCels2 = LoadFileInMem(\"Data\\\\Inv\\\\Objcurs2.CEL\", NULL);\r\n#endif\r\n\tClearCursor();\r\n}\r\n\r\nvoid FreeCursor()\r\n{\r\n\tMemFreeDbg(pCursCels);\r\n#ifdef HELLFIRE\r\n\tMemFreeDbg(pCursCels2);\r\n#endif\r\n\tClearCursor();\r\n}\r\n\r\nvoid SetICursor(int i)\r\n{\r\n\ticursW = InvItemWidth[i];\r\n\ticursH = InvItemHeight[i];\r\n\ticursW28 = icursW / 28;\r\n\ticursH28 = icursH / 28;\r\n}\r\n\r\nvoid SetCursor_(int i)\r\n{\r\n\tpcurs = i;\r\n\tcursW = InvItemWidth[i];\r\n\tcursH = InvItemHeight[i];\r\n\tSetICursor(i);\r\n}\r\n\r\nvoid NewCursor(int i)\r\n{\r\n\tSetCursor_(i);\r\n}\r\n\r\nvoid InitLevelCursor()\r\n{\r\n\tSetCursor_(CURSOR_HAND);\r\n\tcursmx = ViewX;\r\n\tcursmy = ViewY;\r\n\tpcurstemp = -1;\r\n\tpcursmonst = -1;\r\n\tpcursobj = -1;\r\n\tpcursitem = -1;\r\n\tpcursplr = -1;\r\n\tClearCursor();\r\n}\r\n\r\nvoid CheckTown()\r\n{\r\n\tint i, mx;\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmx = missileactive[i];\r\n\t\tif (missile[mx]._mitype == MIS_TOWN) {\r\n\t\t\tif (cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy\r\n\t\t\t    || cursmx == missile[mx]._mix && cursmy == missile[mx]._miy - 1\r\n\t\t\t    || cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 1\r\n\t\t\t    || cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 1\r\n\t\t\t    || cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 2\r\n\t\t\t    || cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 2\r\n\t\t\t    || cursmx == missile[mx]._mix && cursmy == missile[mx]._miy) {\r\n\t\t\t\ttrigflag = TRUE;\r\n\t\t\t\tClearPanel();\r\n\t\t\t\tstrcpy(infostr, \"Town Portal\");\r\n\t\t\t\tsprintf(tempstr, \"from %s\", plr[missile[mx]._misource]._pName);\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tcursmx = missile[mx]._mix;\r\n\t\t\t\tcursmy = missile[mx]._miy;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CheckRportal()\r\n{\r\n\tint i, mx;\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmx = missileactive[i];\r\n\t\tif (missile[mx]._mitype == MIS_RPORTAL) {\r\n\t\t\tif (cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy\r\n\t\t\t    || cursmx == missile[mx]._mix && cursmy == missile[mx]._miy - 1\r\n\t\t\t    || cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 1\r\n\t\t\t    || cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 1\r\n\t\t\t    || cursmx == missile[mx]._mix - 2 && cursmy == missile[mx]._miy - 2\r\n\t\t\t    || cursmx == missile[mx]._mix - 1 && cursmy == missile[mx]._miy - 2\r\n\t\t\t    || cursmx == missile[mx]._mix && cursmy == missile[mx]._miy) {\r\n\t\t\t\ttrigflag = TRUE;\r\n\t\t\t\tClearPanel();\r\n\t\t\t\tstrcpy(infostr, \"Portal to\");\r\n\t\t\t\tif (!setlevel)\r\n\t\t\t\t\tstrcpy(tempstr, \"The Unholy Altar\");\r\n\t\t\t\telse\r\n\t\t\t\t\tstrcpy(tempstr, \"level 15\");\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t\tcursmx = missile[mx]._mix;\r\n\t\t\t\tcursmy = missile[mx]._miy;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CheckCursMove()\r\n{\r\n\tint i, sx, sy, fx, fy, mx, my, tx, ty, px, py, xx, yy, mi;\r\n\tchar bv;\r\n\tBOOL flipflag, flipx, flipy;\r\n\r\n\tsx = MouseX;\r\n\tsy = MouseY;\r\n\r\n\tif (chrflag || questlog) {\r\n\t\tif (sx >= SCREEN_WIDTH / 4) { /// BUGFIX: (sx >= SCREEN_WIDTH / 2)\r\n\r\n\t\t\tsx -= SCREEN_WIDTH / 4;\r\n\t\t} else {\r\n\t\t\tsx = 0;\r\n\t\t}\r\n\t} else if (invflag || sbookflag) {\r\n\t\tif (sx <= SCREEN_WIDTH / 2) {\r\n\t\t\tsx += SCREEN_WIDTH / 4;\r\n\t\t} else {\r\n\t\t\tsx = 0;\r\n\t\t}\r\n\t}\r\n\tif (sy > PANEL_TOP - 1 && track_isscrolling()) {\r\n\t\tsy = PANEL_TOP - 1;\r\n\t}\r\n\tif (!zoomflag) {\r\n\t\tsx >>= 1;\r\n\t\tsy >>= 1;\r\n\t}\r\n\r\n\t// Adjust by player offset\r\n\tsx -= ScrollInfo._sxoff;\r\n\tsy -= ScrollInfo._syoff;\r\n\r\n\t// Predict the next frame when walking to avoid input jitter\r\n\tfx = plr[myplr]._pVar6 >> 8;\r\n\tfy = plr[myplr]._pVar7 >> 8;\r\n\tfx -= (plr[myplr]._pVar6 + plr[myplr]._pxvel) >> 8;\r\n\tfy -= (plr[myplr]._pVar7 + plr[myplr]._pyvel) >> 8;\r\n\tif (ScrollInfo._sdir != SDIR_NONE) {\r\n\t\tsx -= fx;\r\n\t\tsy -= fy;\r\n\t}\r\n\r\n\tif (sx < 0) {\r\n\t\tsx = 0;\r\n\t}\r\n\tif (sx >= SCREEN_WIDTH) {\r\n\t\tsx = SCREEN_WIDTH;\r\n\t}\r\n\tif (sy < 0) {\r\n\t\tsy = 0;\r\n\t}\r\n\tif (sy >= SCREEN_HEIGHT) {\r\n\t\tsy = SCREEN_HEIGHT;\r\n\t}\r\n\r\n\t// Convert to tile grid\r\n\r\n\ttx = sx >> 6; // sx / TILE_WIDTH\r\n\tty = sy >> 5; // sy / TILE_HEIGHT\r\n\tpx = sx & (TILE_WIDTH - 1);\r\n\tpy = sy & (TILE_HEIGHT - 1);\r\n\r\n\t// Center player tile on screen\r\n\tmx = ViewX + tx + ty - (zoomflag ? (SCREEN_WIDTH / TILE_WIDTH) : (SCREEN_WIDTH / 2 / TILE_WIDTH));\r\n\tmy = ViewY + ty - tx;\r\n\r\n\t// Shift position to match diamond grid aligment\r\n\tflipy = py < (px >> 1);\r\n\tif (flipy) {\r\n\t\tmy--;\r\n\t}\r\n\tflipx = py >= TILE_HEIGHT - (px >> 1);\r\n\tif (flipx) {\r\n\t\tmx++;\r\n\t}\r\n\r\n\tif (mx < 0) {\r\n\t\tmx = 0;\r\n\t}\r\n\tif (mx >= MAXDUNX) {\r\n\t\tmx = MAXDUNX - 1;\r\n\t}\r\n\tif (my < 0) {\r\n\t\tmy = 0;\r\n\t}\r\n\tif (my >= MAXDUNY) {\r\n\t\tmy = MAXDUNY - 1;\r\n\t}\r\n\r\n\tflipflag = flipy && flipx || (flipy || flipx) && px < TILE_WIDTH / 2;\r\n\r\n\tpcurstemp = pcursmonst;\r\n\tpcursmonst = -1;\r\n\tpcursobj = -1;\r\n\tpcursitem = -1;\r\n\tif (pcursinvitem != -1) {\r\n\t\tdrawsbarflag = TRUE;\r\n\t}\r\n\tpcursinvitem = -1;\r\n\tpcursplr = -1;\r\n\tuitemflag = FALSE;\r\n\tpanelflag = FALSE;\r\n\ttrigflag = FALSE;\r\n\r\n\tif (plr[myplr]._pInvincible) {\r\n\t\treturn;\r\n\t}\r\n\tif (pcurs >= CURSOR_FIRSTITEM || spselflag) {\r\n\t\tcursmx = mx;\r\n\t\tcursmy = my;\r\n\t\treturn;\r\n\t}\r\n\tif (MouseY > PANEL_TOP) {\r\n\t\tCheckPanelInfo();\r\n\t\treturn;\r\n\t}\r\n\tif (doomflag) {\r\n\t\treturn;\r\n\t}\r\n\tif (invflag && MouseX > RIGHT_PANEL) {\r\n\t\tpcursinvitem = CheckInvHLight();\r\n\t\treturn;\r\n\t}\r\n\tif (sbookflag && MouseX > RIGHT_PANEL) {\r\n\t\treturn;\r\n\t}\r\n\tif ((chrflag || questlog) && MouseX < SPANEL_WIDTH) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tif (pcurstemp != -1) {\r\n\t\t\tif (!flipflag && dMonster[mx + 2][my + 1] != 0 && dFlags[mx + 2][my + 1] & BFLAG_LIT) {\r\n\t\t\t\tmi = dMonster[mx + 2][my + 1] > 0 ? dMonster[mx + 2][my + 1] - 1 : -(dMonster[mx + 2][my + 1] + 1);\r\n\t\t\t\tif (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 4) {\r\n\t\t\t\t\tcursmx = mx + 1; /// BUGFIX: 'mx + 2'\r\n\t\t\t\t\tcursmy = my + 2; /// BUGFIX: 'my + 1'\r\n\t\t\t\t\tpcursmonst = mi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (flipflag && dMonster[mx + 1][my + 2] != 0 && dFlags[mx + 1][my + 2] & BFLAG_LIT) {\r\n\t\t\t\tmi = dMonster[mx + 1][my + 2] > 0 ? dMonster[mx + 1][my + 2] - 1 : -(dMonster[mx + 1][my + 2] + 1);\r\n\t\t\t\tif (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 4) {\r\n\t\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\t\tcursmy = my + 2;\r\n\t\t\t\t\tpcursmonst = mi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dMonster[mx + 2][my + 2] != 0 && dFlags[mx + 2][my + 2] & BFLAG_LIT) {\r\n\t\t\t\tmi = dMonster[mx + 2][my + 2] > 0 ? dMonster[mx + 2][my + 2] - 1 : -(dMonster[mx + 2][my + 2] + 1);\r\n\t\t\t\tif (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 4) {\r\n\t\t\t\t\tcursmx = mx + 2;\r\n\t\t\t\t\tcursmy = my + 2;\r\n\t\t\t\t\tpcursmonst = mi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!flipflag && dMonster[mx + 1][my] != 0 && dFlags[mx + 1][my] & BFLAG_LIT) {\r\n\t\t\t\tmi = dMonster[mx + 1][my] > 0 ? dMonster[mx + 1][my] - 1 : -(dMonster[mx + 1][my] + 1);\r\n\t\t\t\tif (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 2) {\r\n\t\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\t\tcursmy = my;\r\n\t\t\t\t\tpcursmonst = mi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (flipflag && dMonster[mx][my + 1] != 0 && dFlags[mx][my + 1] & BFLAG_LIT) {\r\n\t\t\t\tmi = dMonster[mx][my + 1] > 0 ? dMonster[mx][my + 1] - 1 : -(dMonster[mx][my + 1] + 1);\r\n\t\t\t\tif (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 2) {\r\n\t\t\t\t\tcursmx = mx;\r\n\t\t\t\t\tcursmy = my + 1;\r\n\t\t\t\t\tpcursmonst = mi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dMonster[mx][my] != 0 && dFlags[mx][my] & BFLAG_LIT) {\r\n\t\t\t\tmi = dMonster[mx][my] > 0 ? dMonster[mx][my] - 1 : -(dMonster[mx][my] + 1);\r\n\t\t\t\tif (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 1) {\r\n\t\t\t\t\tcursmx = mx;\r\n\t\t\t\t\tcursmy = my;\r\n\t\t\t\t\tpcursmonst = mi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dMonster[mx + 1][my + 1] != 0 && dFlags[mx + 1][my + 1] & BFLAG_LIT) {\r\n\t\t\t\tmi = dMonster[mx + 1][my + 1] > 0 ? dMonster[mx + 1][my + 1] - 1 : -(dMonster[mx + 1][my + 1] + 1);\r\n\t\t\t\tif (mi == pcurstemp && monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 2) {\r\n\t\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\t\tcursmy = my + 1;\r\n\t\t\t\t\tpcursmonst = mi;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_HIDDEN) {\r\n\t\t\t\tpcursmonst = -1;\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_GOLEM && !(monster[pcursmonst]._mFlags & MFLAG_BERSERK)) {\r\n\t\t\t\tpcursmonst = -1;\r\n\t\t\t}\r\n#else\r\n\t\t\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_GOLEM) {\r\n\t\t\t\tpcursmonst = -1;\r\n\t\t\t}\r\n#endif\r\n\t\t\tif (pcursmonst != -1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!flipflag && dMonster[mx + 2][my + 1] != 0 && dFlags[mx + 2][my + 1] & BFLAG_LIT) {\r\n\t\t\tmi = dMonster[mx + 2][my + 1] > 0 ? dMonster[mx + 2][my + 1] - 1 : -(dMonster[mx + 2][my + 1] + 1);\r\n\t\t\tif (monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 4) {\r\n\t\t\t\tcursmx = mx + 2;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursmonst = mi;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (flipflag && dMonster[mx + 1][my + 2] != 0 && dFlags[mx + 1][my + 2] & BFLAG_LIT) {\r\n\t\t\tmi = dMonster[mx + 1][my + 2] > 0 ? dMonster[mx + 1][my + 2] - 1 : -(dMonster[mx + 1][my + 2] + 1);\r\n\t\t\tif (monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 4) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my + 2;\r\n\t\t\t\tpcursmonst = mi;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dMonster[mx + 2][my + 2] != 0 && dFlags[mx + 2][my + 2] & BFLAG_LIT) {\r\n\t\t\tmi = dMonster[mx + 2][my + 2] > 0 ? dMonster[mx + 2][my + 2] - 1 : -(dMonster[mx + 2][my + 2] + 1);\r\n\t\t\tif (monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 4) {\r\n\t\t\t\tcursmx = mx + 2;\r\n\t\t\t\tcursmy = my + 2;\r\n\t\t\t\tpcursmonst = mi;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!flipflag && dMonster[mx + 1][my] != 0 && dFlags[mx + 1][my] & BFLAG_LIT) {\r\n\t\t\tmi = dMonster[mx + 1][my] > 0 ? dMonster[mx + 1][my] - 1 : -(dMonster[mx + 1][my] + 1);\r\n\t\t\tif (monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 2) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursmonst = mi;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (flipflag && dMonster[mx][my + 1] != 0 && dFlags[mx][my + 1] & BFLAG_LIT) {\r\n\t\t\tmi = dMonster[mx][my + 1] > 0 ? dMonster[mx][my + 1] - 1 : -(dMonster[mx][my + 1] + 1);\r\n\t\t\tif (monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 2) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursmonst = mi;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dMonster[mx][my] != 0 && dFlags[mx][my] & BFLAG_LIT) {\r\n\t\t\tmi = dMonster[mx][my] > 0 ? dMonster[mx][my] - 1 : -(dMonster[mx][my] + 1);\r\n\t\t\tif (monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 1) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursmonst = mi;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dMonster[mx + 1][my + 1] != 0 && dFlags[mx + 1][my + 1] & BFLAG_LIT) {\r\n\t\t\tmi = dMonster[mx + 1][my + 1] > 0 ? dMonster[mx + 1][my + 1] - 1 : -(dMonster[mx + 1][my + 1] + 1);\r\n\t\t\tif (monster[mi]._mhitpoints >> 6 > 0 && monster[mi].MData->mSelFlag & 2) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursmonst = mi;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_HIDDEN) {\r\n\t\t\tpcursmonst = -1;\r\n\t\t\tcursmx = mx;\r\n\t\t\tcursmy = my;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_GOLEM && !(monster[pcursmonst]._mFlags & MFLAG_BERSERK)) {\r\n\t\t\tpcursmonst = -1;\r\n\t\t}\r\n#else\r\n\t\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_GOLEM) {\r\n\t\t\tpcursmonst = -1;\r\n\t\t}\r\n#endif\r\n\t} else {\r\n\t\tif (!flipflag && dMonster[mx + 1][my] > 0) {\r\n\t\t\tpcursmonst = dMonster[mx + 1][my] - 1;\r\n\t\t\tcursmx = mx + 1;\r\n\t\t\tcursmy = my;\r\n\t\t}\r\n\t\tif (flipflag && dMonster[mx][my + 1] > 0) {\r\n\t\t\tpcursmonst = dMonster[mx][my + 1] - 1;\r\n\t\t\tcursmx = mx;\r\n\t\t\tcursmy = my + 1;\r\n\t\t}\r\n\t\tif (dMonster[mx][my] > 0) {\r\n\t\t\tpcursmonst = dMonster[mx][my] - 1;\r\n\t\t\tcursmx = mx;\r\n\t\t\tcursmy = my;\r\n\t\t}\r\n\t\tif (dMonster[mx + 1][my + 1] > 0) {\r\n\t\t\tpcursmonst = dMonster[mx + 1][my + 1] - 1;\r\n\t\t\tcursmx = mx + 1;\r\n\t\t\tcursmy = my + 1;\r\n\t\t}\r\n\t\tif (!towner[pcursmonst]._tSelFlag) { /// BUGFIX: Add check 'pcursmonst != -1'\r\n\t\t\tpcursmonst = -1;\r\n\t\t}\r\n\t}\r\n\r\n\tif (pcursmonst == -1) {\r\n\t\tif (!flipflag && dPlayer[mx + 1][my] != 0) {\r\n\t\t\tbv = dPlayer[mx + 1][my] > 0 ? dPlayer[mx + 1][my] - 1 : -(dPlayer[mx + 1][my] + 1);\r\n\t\t\tif (bv != myplr && plr[bv]._pHitPoints != 0) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursplr = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (flipflag && dPlayer[mx][my + 1] != 0) {\r\n\t\t\tbv = dPlayer[mx][my + 1] > 0 ? dPlayer[mx][my + 1] - 1 : -(dPlayer[mx][my + 1] + 1);\r\n\t\t\tif (bv != myplr && plr[bv]._pHitPoints != 0) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursplr = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dPlayer[mx][my] != 0) {\r\n\t\t\tbv = dPlayer[mx][my] > 0 ? dPlayer[mx][my] - 1 : -(dPlayer[mx][my] + 1);\r\n\t\t\tif (bv != myplr) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursplr = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dFlags[mx][my] & BFLAG_DEAD_PLAYER) {\r\n\t\t\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\t\t\tif (plr[i]._px == mx && plr[i]._py == my && i != myplr) {\r\n\t\t\t\t\tcursmx = mx;\r\n\t\t\t\t\tcursmy = my;\r\n\t\t\t\t\tpcursplr = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (pcurs == CURSOR_RESURRECT) {\r\n\t\t\tfor (xx = -1; xx < 2; xx++) {\r\n\t\t\t\tfor (yy = -1; yy < 2; yy++) {\r\n\t\t\t\t\tif (dFlags[mx + xx][my + yy] & BFLAG_DEAD_PLAYER) {\r\n\t\t\t\t\t\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\t\t\t\t\t\tif (plr[i]._px == mx + xx && plr[i]._py == my + yy && i != myplr) {\r\n\t\t\t\t\t\t\t\tcursmx = mx + xx;\r\n\t\t\t\t\t\t\t\tcursmy = my + yy;\r\n\t\t\t\t\t\t\t\tpcursplr = i;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dPlayer[mx + 1][my + 1] != 0) {\r\n\t\t\tbv = dPlayer[mx + 1][my + 1] > 0 ? dPlayer[mx + 1][my + 1] - 1 : -(dPlayer[mx + 1][my + 1] + 1);\r\n\t\t\tif (bv != myplr && plr[bv]._pHitPoints != 0) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursplr = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (pcursmonst == -1 && pcursplr == -1) {\r\n\t\tif (!flipflag && dObject[mx + 1][my] != 0) {\r\n\t\t\tbv = dObject[mx + 1][my] > 0 ? dObject[mx + 1][my] - 1 : -(dObject[mx + 1][my] + 1);\r\n\t\t\tif (object[bv]._oSelFlag >= 2) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursobj = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (flipflag && dObject[mx][my + 1] != 0) {\r\n\t\t\tbv = dObject[mx][my + 1] > 0 ? dObject[mx][my + 1] - 1 : -(dObject[mx][my + 1] + 1);\r\n\t\t\tif (object[bv]._oSelFlag >= 2) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursobj = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dObject[mx][my] != 0) {\r\n\t\t\tbv = dObject[mx][my] > 0 ? dObject[mx][my] - 1 : -(dObject[mx][my] + 1);\r\n\t\t\tif (object[bv]._oSelFlag == 1 || object[bv]._oSelFlag == 3) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursobj = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dObject[mx + 1][my + 1] != 0) {\r\n\t\t\tbv = dObject[mx + 1][my + 1] > 0 ? dObject[mx + 1][my + 1] - 1 : -(dObject[mx + 1][my + 1] + 1);\r\n\t\t\tif (object[bv]._oSelFlag >= 2) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursobj = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (pcursplr == -1 && pcursobj == -1 && pcursmonst == -1) {\r\n\t\tif (!flipflag && dItem[mx + 1][my] > 0) {\r\n\t\t\tbv = dItem[mx + 1][my] - 1;\r\n\t\t\tif (item[bv]._iSelFlag >= 2) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursitem = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (flipflag && dItem[mx][my + 1] > 0) {\r\n\t\t\tbv = dItem[mx][my + 1] - 1;\r\n\t\t\tif (item[bv]._iSelFlag >= 2) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursitem = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dItem[mx][my] > 0) {\r\n\t\t\tbv = dItem[mx][my] - 1;\r\n\t\t\tif (item[bv]._iSelFlag == 1 || item[bv]._iSelFlag == 3) {\r\n\t\t\t\tcursmx = mx;\r\n\t\t\t\tcursmy = my;\r\n\t\t\t\tpcursitem = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dItem[mx + 1][my + 1] > 0) {\r\n\t\t\tbv = dItem[mx + 1][my + 1] - 1;\r\n\t\t\tif (item[bv]._iSelFlag >= 2) {\r\n\t\t\t\tcursmx = mx + 1;\r\n\t\t\t\tcursmy = my + 1;\r\n\t\t\t\tpcursitem = bv;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (pcursitem == -1) {\r\n\t\t\tcursmx = mx;\r\n\t\t\tcursmy = my;\r\n\t\t\tCheckTrigForce();\r\n\t\t\tCheckTown();\r\n\t\t\tCheckRportal();\r\n\t\t}\r\n\t}\r\n\r\n\tif (pcurs == CURSOR_IDENTIFY) {\r\n\t\tpcursobj = -1;\r\n\t\tpcursmonst = -1;\r\n\t\tpcursitem = -1;\r\n\t\tcursmx = mx;\r\n\t\tcursmy = my;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_GOLEM && !(monster[pcursmonst]._mFlags & MFLAG_BERSERK)) {\r\n\t\tpcursmonst = -1;\r\n\t}\r\n#else\r\n\tif (pcursmonst != -1 && monster[pcursmonst]._mFlags & MFLAG_GOLEM) {\r\n\t\tpcursmonst = -1;\r\n\t}\r\n#endif\r\n}\r\n"
  },
  {
    "path": "Source/cursor.h",
    "content": "/**\r\n * @file cursor.h\r\n *\r\n * Interface of cursor tracking functionality.\r\n */\r\n#ifndef __CURSOR_H__\r\n#define __CURSOR_H__\r\n\r\nextern int cursW;\r\nextern int cursH;\r\nextern int pcursmonst;\r\nextern int icursW28;\r\nextern int icursH28;\r\nextern BYTE *pCursCels;\r\n#ifdef HELLFIRE\r\nextern BYTE *pCursCels2;\r\n#endif\r\nextern int icursH;\r\nextern char pcursinvitem;\r\nextern int icursW;\r\nextern char pcursitem;\r\nextern char pcursobj;\r\nextern char pcursplr;\r\nextern int cursmx;\r\nextern int cursmy;\r\nextern int pcurs;\r\n\r\nvoid InitCursor();\r\nvoid FreeCursor();\r\nvoid SetICursor(int i);\r\nvoid SetCursor_(int i);\r\nvoid NewCursor(int i);\r\nvoid InitLevelCursor();\r\nvoid CheckCursMove();\r\n\r\n/* rdata */\r\nextern const int InvItemWidth[];\r\nextern const int InvItemHeight[];\r\n\r\n#endif /* __CURSOR_H__ */\r\n"
  },
  {
    "path": "Source/dead.cpp",
    "content": "/**\r\n * @file dead.cpp\r\n *\r\n * Implementation of functions for placing dead monsters.\r\n */\r\n#include \"all.h\"\r\n\r\n/** unused, this was probably for blood boil/burn */\r\nint spurtndx;\r\nDeadStruct dead[MAXDEAD];\r\nint stonendx;\r\n\r\nvoid InitDead()\r\n{\r\n\tint i, d, nd, mi;\r\n\tint mtypes[MAXMONSTERS];\r\n\r\n\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\tmtypes[i] = 0;\r\n\r\n\tnd = 0;\r\n\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tif (mtypes[Monsters[i].mtype] == 0) {\r\n\t\t\tfor (d = 0; d < 8; d++)\r\n\t\t\t\tdead[nd]._deadData[d] = Monsters[i].Anims[MA_DEATH].Data[d];\r\n\t\t\tdead[nd]._deadFrame = Monsters[i].Anims[MA_DEATH].Frames;\r\n\t\t\tdead[nd]._deadWidth = Monsters[i].width;\r\n\t\t\tdead[nd]._deadWidth2 = Monsters[i].width2;\r\n\t\t\tdead[nd]._deadtrans = 0;\r\n\t\t\tMonsters[i].mdeadval = nd + 1;\r\n\t\t\tmtypes[Monsters[i].mtype] = nd + 1;\r\n\t\t\tnd++;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (d = 0; d < 8; d++)\r\n\t\tdead[nd]._deadData[d] = misfiledata[MFILE_BLODBUR].mAnimData[0];\r\n\tdead[nd]._deadFrame = 8;\r\n\tdead[nd]._deadWidth = 128;\r\n\tdead[nd]._deadWidth2 = 32;\r\n\tdead[nd]._deadtrans = 0;\r\n\tspurtndx = nd + 1;\r\n\tnd++;\r\n\r\n\tfor (d = 0; d < 8; d++)\r\n\t\tdead[nd]._deadData[d] = misfiledata[MFILE_SHATTER1].mAnimData[0];\r\n\tdead[nd]._deadFrame = 12;\r\n\tdead[nd]._deadWidth = 128;\r\n\tdead[nd]._deadWidth2 = 32;\r\n\tdead[nd]._deadtrans = 0;\r\n\tstonendx = nd + 1;\r\n\tnd++;\r\n\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\tmi = monstactive[i];\r\n\t\tif (monster[mi]._uniqtype != 0) {\r\n\t\t\tfor (d = 0; d < 8; d++)\r\n\t\t\t\tdead[nd]._deadData[d] = monster[mi].MType->Anims[MA_DEATH].Data[d];\r\n\t\t\tdead[nd]._deadFrame = monster[mi].MType->Anims[MA_DEATH].Frames;\r\n\t\t\tdead[nd]._deadWidth = monster[mi].MType->width;\r\n\t\t\tdead[nd]._deadWidth2 = monster[mi].MType->width2;\r\n\t\t\tdead[nd]._deadtrans = monster[mi]._uniqtrans + 4;\r\n\t\t\tmonster[mi]._udeadval = nd + 1;\r\n\t\t\tnd++;\r\n\t\t}\r\n\t}\r\n\r\n\tassert(nd <= MAXDEAD);\r\n}\r\n\r\nvoid AddDead(int dx, int dy, char dv, int ddir)\r\n{\r\n\tdDead[dx][dy] = (dv & 0x1F) + (ddir << 5);\r\n}\r\n\r\nvoid SyncUniqDead()\r\n{\r\n\tint i, mi;\r\n\tint dx, dy;\r\n\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\tmi = monstactive[i];\r\n\t\tif (monster[mi]._uniqtype != 0) {\r\n\t\t\tfor (dx = 0; dx < MAXDUNX; dx++) {\r\n\t\t\t\tfor (dy = 0; dy < MAXDUNY; dy++) {\r\n\t\t\t\t\tif ((dDead[dx][dy] & 0x1F) == monster[mi]._udeadval)\r\n\t\t\t\t\t\tChangeLightXY(monster[mi].mlid, dx, dy);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/dead.h",
    "content": "/**\r\n * @file dead.h\r\n *\r\n * Interface of functions for placing dead monsters.\r\n */\r\n#ifndef __DEAD_H__\r\n#define __DEAD_H__\r\n\r\nextern DeadStruct dead[MAXDEAD];\r\nextern int stonendx;\r\n\r\nvoid InitDead();\r\nvoid AddDead(int dx, int dy, char dv, int ddir);\r\nvoid SyncUniqDead();\r\n\r\n#endif /* __DEAD_H__ */\r\n"
  },
  {
    "path": "Source/debug.cpp",
    "content": "/**\r\n * @file debug.cpp\r\n *\r\n * Implementation of debug functions.\r\n */\r\n#include \"all.h\"\r\n\r\n#ifdef _DEBUG\r\nBOOL update_seed_check = FALSE;\r\n#endif\r\n\r\n#define DEBUGSEEDS 4096\r\nint seed_index;\r\nint level_seeds[NUMLEVELS + 1];\r\nint seed_table[DEBUGSEEDS];\r\n\r\nBYTE *pSquareCel;\r\nchar dMonsDbg[NUMLEVELS][MAXDUNX][MAXDUNY];\r\nchar dFlagDbg[NUMLEVELS][MAXDUNX][MAXDUNY];\r\n\r\nvoid LoadDebugGFX()\r\n{\r\n\tif (visiondebug)\r\n\t\tpSquareCel = LoadFileInMem(\"Data\\\\Square.CEL\", NULL);\r\n}\r\n\r\nvoid FreeDebugGFX()\r\n{\r\n\tMemFreeDbg(pSquareCel);\r\n}\r\n\r\n#ifdef _DEBUG\r\nvoid init_seed_desync()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < DEBUGSEEDS; i++) {\r\n\t\tseed_table[i] = -1;\r\n\t}\r\n\r\n\tseed_index = 0;\r\n\r\n\tfor (i = 0; i < NUMLEVELS; i++) {\r\n\t\tlevel_seeds[i] = 0;\r\n\t}\r\n}\r\n\r\nvoid seed_desync_index_get()\r\n{\r\n\tif (currlevel == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tupdate_seed_check = TRUE;\r\n\tseed_index = level_seeds[currlevel];\r\n}\r\n\r\nvoid seed_desync_index_set()\r\n{\r\n\tif (currlevel == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tupdate_seed_check = FALSE;\r\n\tlevel_seeds[currlevel + 1] = seed_index;\r\n}\r\n\r\nvoid seed_desync_check(int seed)\r\n{\r\n\tif (!update_seed_check || seed_index == DEBUGSEEDS || currlevel == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (seed_table[seed_index] == -1) {\r\n\t\tseed_table[seed_index] = seed;\r\n\t} else if (seed != seed_table[seed_index]) {\r\n\t\tapp_fatal(\"Seeds desynced\");\r\n\t}\r\n\r\n\tseed_index++;\r\n}\r\n#endif\r\n\r\nvoid CheckDungeonClear()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dMonster[i][j] != 0)\r\n\t\t\t\tapp_fatal(\"Monsters not cleared\");\r\n\t\t\tif (dPlayer[i][j] != 0)\r\n\t\t\t\tapp_fatal(\"Players not cleared\");\r\n\r\n\t\t\tdMonsDbg[currlevel][i][j] = dFlags[i][j] & BFLAG_VISIBLE;\r\n\t\t\tdFlagDbg[currlevel][i][j] = dFlags[i][j] & BFLAG_POPULATED;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef _DEBUG\r\nvoid GiveGoldCheat()\r\n{\r\n\tint i, ni;\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\tif (plr[myplr].InvGrid[i] == 0) {\r\n\t\t\tni = plr[myplr]._pNumInv++;\r\n\t\t\tSetPlrHandItem(&plr[myplr].InvList[ni], IDI_GOLD);\r\n\t\t\tGetPlrHandSeed(&plr[myplr].InvList[ni]);\r\n\t\t\tplr[myplr].InvList[ni]._ivalue = GOLD_MAX_LIMIT;\r\n\t\t\tplr[myplr].InvList[ni]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\tplr[myplr]._pGold += GOLD_MAX_LIMIT;\r\n\t\t\tplr[myplr].InvGrid[i] = plr[myplr]._pNumInv;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid StoresCheat()\r\n{\r\n#ifndef HELLFIRE\r\n\tint i;\r\n\r\n\tnumpremium = 0;\r\n\r\n\tfor (i = 0; i < SMITH_PREMIUM_ITEMS; i++)\r\n\t\tpremiumitem[i]._itype = ITYPE_NONE;\r\n\r\n\tSpawnPremium(30);\r\n\r\n\tfor (i = 0; i < 20; i++)\r\n\t\twitchitem[i]._itype = ITYPE_NONE;\r\n\r\n\tSpawnWitch(30);\r\n#endif\r\n}\r\n\r\nvoid TakeGoldCheat()\r\n{\r\n\tint i;\r\n\tchar ig;\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\tig = plr[myplr].InvGrid[i];\r\n\t\tif (ig > 0 && plr[myplr].InvList[ig - 1]._itype == ITYPE_GOLD)\r\n\t\t\tRemoveInvItem(myplr, ig - 1);\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tif (plr[myplr].SpdList[i]._itype == ITYPE_GOLD)\r\n\t\t\tplr[myplr].SpdList[i]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tplr[myplr]._pGold = 0;\r\n}\r\n\r\nvoid MaxSpellsCheat()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 1; i < MAX_SPELLS; i++) {\r\n\t\tif (spelldata[i].sBookLvl != -1) {\r\n\t\t\tplr[myplr]._pMemSpells |= SPELLBIT(i);\r\n\t\t\tplr[myplr]._pSplLvl[i] = 10;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetSpellLevelCheat(char spl, int spllvl)\r\n{\r\n\tplr[myplr]._pMemSpells |= SPELLBIT(spl);\r\n\tplr[myplr]._pSplLvl[spl] = spllvl;\r\n}\r\n\r\nvoid SetAllSpellsCheat()\r\n{\r\n\tSetSpellLevelCheat(SPL_FIREBOLT, 8);\r\n\tSetSpellLevelCheat(SPL_CBOLT, 11);\r\n\tSetSpellLevelCheat(SPL_HBOLT, 10);\r\n\tSetSpellLevelCheat(SPL_HEAL, 7);\r\n\tSetSpellLevelCheat(SPL_HEALOTHER, 5);\r\n\tSetSpellLevelCheat(SPL_LIGHTNING, 9);\r\n\tSetSpellLevelCheat(SPL_FIREWALL, 5);\r\n\tSetSpellLevelCheat(SPL_TELEKINESIS, 3);\r\n\tSetSpellLevelCheat(SPL_TOWN, 3);\r\n\tSetSpellLevelCheat(SPL_FLASH, 3);\r\n\tSetSpellLevelCheat(SPL_RNDTELEPORT, 2);\r\n\tSetSpellLevelCheat(SPL_MANASHIELD, 2);\r\n\tSetSpellLevelCheat(SPL_WAVE, 4);\r\n\tSetSpellLevelCheat(SPL_FIREBALL, 3);\r\n\tSetSpellLevelCheat(SPL_STONE, 1);\r\n\tSetSpellLevelCheat(SPL_CHAIN, 1);\r\n\tSetSpellLevelCheat(SPL_GUARDIAN, 4);\r\n\tSetSpellLevelCheat(SPL_ELEMENT, 3);\r\n\tSetSpellLevelCheat(SPL_NOVA, 1);\r\n\tSetSpellLevelCheat(SPL_GOLEM, 2);\r\n\tSetSpellLevelCheat(SPL_FLARE, 1);\r\n\tSetSpellLevelCheat(SPL_BONESPIRIT, 1);\r\n}\r\n\r\nvoid PrintDebugPlayer(BOOL bNextPlayer)\r\n{\r\n\tchar dstr[128];\r\n\r\n\tif (bNextPlayer)\r\n\t\tdbgplr = ((BYTE)dbgplr + 1) & 3;\r\n\r\n\tsprintf(dstr, \"Plr %i : Active = %i\", dbgplr, plr[dbgplr].plractive);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n\r\n\tif (plr[dbgplr].plractive) {\r\n\t\tsprintf(dstr, \"  Plr %i is %s\", dbgplr, plr[dbgplr]._pName);\r\n\t\tNetSendCmdString(1 << myplr, dstr);\r\n\t\tsprintf(dstr, \"  Lvl = %i : Change = %i\", plr[dbgplr].plrlevel, plr[dbgplr]._pLvlChanging);\r\n\t\tNetSendCmdString(1 << myplr, dstr);\r\n\t\tsprintf(dstr, \"  x = %i, y = %i : tx = %i, ty = %i\", plr[dbgplr]._px, plr[dbgplr]._py, plr[dbgplr]._ptargx, plr[dbgplr]._ptargy);\r\n\t\tNetSendCmdString(1 << myplr, dstr);\r\n\t\tsprintf(dstr, \"  mode = %i : daction = %i : walk[0] = %i\", plr[dbgplr]._pmode, plr[dbgplr].destAction, plr[dbgplr].walkpath[0]);\r\n\t\tNetSendCmdString(1 << myplr, dstr);\r\n\t\tsprintf(dstr, \"  inv = %i : hp = %i\", plr[dbgplr]._pInvincible, plr[dbgplr]._pHitPoints);\r\n\t\tNetSendCmdString(1 << myplr, dstr);\r\n\t}\r\n}\r\n\r\nvoid PrintDebugQuest()\r\n{\r\n\tchar dstr[128];\r\n\r\n\tsprintf(dstr, \"Quest %i :  Active = %i, Var1 = %i\", dbgqst, quests[dbgqst]._qactive, quests[dbgqst]._qvar1);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n\r\n\tdbgqst++;\r\n\tif (dbgqst == MAXQUESTS)\r\n\t\tdbgqst = 0;\r\n}\r\n\r\nvoid PrintDebugMonster(int m)\r\n{\r\n\tBOOL bActive;\r\n\tint i;\r\n\tchar dstr[128];\r\n\r\n\tsprintf(dstr, \"Monster %i = %s\", m, monster[m].mName);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n\tsprintf(dstr, \"X = %i, Y = %i\", monster[m]._mx, monster[m]._my);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n\tsprintf(dstr, \"Enemy = %i, HP = %i\", monster[m]._menemy, monster[m]._mhitpoints);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n\tsprintf(dstr, \"Mode = %i, Var1 = %i\", monster[m]._mmode, monster[m]._mVar1);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n\r\n\tbActive = FALSE;\r\n\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\tif (monstactive[i] == m)\r\n\t\t\tbActive = TRUE;\r\n\t}\r\n\r\n\tsprintf(dstr, \"Active List = %i, Squelch = %i\", bActive, monster[m]._msquelch);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n}\r\n\r\nvoid GetDebugMonster()\r\n{\r\n\tint mi1, mi2;\r\n\r\n\tmi1 = pcursmonst;\r\n\tif (mi1 == -1) {\r\n\t\tmi2 = dMonster[cursmx][cursmy];\r\n\t\tif (mi2 != 0) {\r\n\t\t\tmi1 = mi2 - 1;\r\n\t\t\tif (mi2 <= 0)\r\n\t\t\t\tmi1 = -1 - mi2;\r\n\t\t} else {\r\n\t\t\tmi1 = dbgmon;\r\n\t\t}\r\n\t}\r\n\tPrintDebugMonster(mi1);\r\n}\r\n\r\nvoid NextDebugMonster()\r\n{\r\n\tchar dstr[128];\r\n\r\n\tdbgmon++;\r\n\tif (dbgmon == MAXMONSTERS)\r\n\t\tdbgmon = 0;\r\n\r\n\tsprintf(dstr, \"Current debug monster = %i\", dbgmon);\r\n\tNetSendCmdString(1 << myplr, dstr);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/debug.h",
    "content": "/**\r\n * @file debug.h\r\n *\r\n * Interface of debug functions.\r\n */\r\n#ifndef __DEBUG_H__\r\n#define __DEBUG_H__\r\n\r\nextern BYTE *pSquareCel;\r\n\r\nvoid LoadDebugGFX();\r\nvoid FreeDebugGFX();\r\n#ifdef _DEBUG\r\nvoid init_seed_desync();\r\nvoid seed_desync_index_get();\r\nvoid seed_desync_index_set();\r\nvoid seed_desync_check(int seed);\r\n#endif\r\nvoid CheckDungeonClear();\r\n#ifdef _DEBUG\r\nvoid GiveGoldCheat();\r\nvoid StoresCheat();\r\nvoid TakeGoldCheat();\r\nvoid MaxSpellsCheat();\r\nvoid SetAllSpellsCheat();\r\nvoid PrintDebugPlayer(BOOL bNextPlayer);\r\nvoid PrintDebugQuest();\r\nvoid GetDebugMonster();\r\nvoid NextDebugMonster();\r\n#endif\r\n\r\n#endif /* __DEBUG_H__ */\r\n"
  },
  {
    "path": "Source/diablo.cpp",
    "content": "/**\r\n * @file diablo.cpp\r\n *\r\n * Implementation of the main game initialization functions.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n#include \"../DiabloUI/diabloui.h\"\r\n\r\nHWND ghMainWnd;\r\nDWORD glSeedTbl[NUMLEVELS];\r\nint gnLevelTypeTbl[NUMLEVELS];\r\n#ifndef HELLFIRE\r\nint glEndSeed[NUMLEVELS];\r\nint glMid1Seed[NUMLEVELS];\r\nint glMid2Seed[NUMLEVELS];\r\nint glMid3Seed[NUMLEVELS];\r\n#else\r\nint glEndSeed[NUMLEVELS + 1];\r\nint glMid1Seed[NUMLEVELS + 1];\r\nint glMid2Seed[NUMLEVELS + 1];\r\nint glMid3Seed[NUMLEVELS + 1];\r\n#endif\r\nint MouseX;\r\nint MouseY;\r\nBOOL gbGameLoopStartup;\r\nBOOL gbRunGame;\r\nBOOL gbRunGameResult;\r\nBOOL zoomflag;\r\n/** Enable updating of player character, set to false once Diablo dies */\r\nBOOL gbProcessPlayers;\r\nBOOL gbLoadGame;\r\nHINSTANCE ghInst;\r\nint DebugMonsters[10];\r\nBOOLEAN cineflag;\r\nint force_redraw;\r\nBOOL visiondebug;\r\n/** unused */\r\nBOOL scrollflag;\r\nBOOL light4flag;\r\nBOOL leveldebug;\r\nBOOL monstdebug;\r\n/** unused */\r\nBOOL trigdebug;\r\nint setseed;\r\nint debugmonsttypes;\r\nint PauseMode;\r\n#ifdef HELLFIRE\r\nBOOLEAN UseTheoQuest;\r\nBOOLEAN UseCowFarmer;\r\nBOOLEAN UseNestArt;\r\nBOOLEAN UseBardTest;\r\nBOOLEAN UseBarbarianTest;\r\nBOOLEAN UseMultiTest;\r\n#endif\r\nint sgnTimeoutCurs;\r\nchar sgbMouseDown;\r\nint color_cycle_timer;\r\n\r\n/* rdata */\r\n\r\n/**\r\n * Specifies whether to give the game exclusive access to the\r\n * screen, as needed for efficient rendering in fullscreen mode.\r\n */\r\nBOOL fullscreen = TRUE;\r\n#ifdef _DEBUG\r\nint showintrodebug = 1;\r\nint questdebug = -1;\r\nint debug_mode_key_s;\r\nint debug_mode_key_w;\r\nint debug_mode_key_inverted_v;\r\nint debug_mode_dollar_sign;\r\nint debug_mode_key_d;\r\nint debug_mode_key_i;\r\nint dbgplr;\r\nint dbgqst;\r\nint dbgmon;\r\nint arrowdebug;\r\nint frameflag;\r\nint frameend;\r\nint framerate;\r\nint framestart;\r\n#endif\r\n/** Specifies whether players are in non-PvP mode. */\r\nBOOL FriendlyMode = TRUE;\r\n/** Default quick messages */\r\nconst char *const spszMsgTbl[4] = {\r\n\t\"I need help! Come Here!\",\r\n\t\"Follow me.\",\r\n\t\"Here's something for you.\",\r\n\t\"Now you DIE!\"\r\n};\r\n/** INI files variable names for quick message keys */\r\nconst char *const spszMsgHotKeyTbl[4] = { \"F9\", \"F10\", \"F11\", \"F12\" };\r\n\r\nstatic void diablo_parse_flags(char *args)\r\n{\r\n\tchar c;\r\n#ifdef _DEBUG\r\n\tint i;\r\n#endif\r\n\r\n\twhile (*args != '\\0') {\r\n\t\twhile (isspace(*args)) {\r\n\t\t\targs++;\r\n\t\t}\r\n\t\tstatic char de[] = \"dd_emulate\";\r\n\t\tif (_strnicmp(de, args, strlen(de)) == 0) {\r\n\t\t\tgbEmulate = TRUE;\r\n\t\t\targs += strlen(de);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tstatic char db[] = \"dd_backbuf\";\r\n\t\tif (_strnicmp(db, args, strlen(db)) == 0) {\r\n\t\t\tgbBackBuf = TRUE;\r\n\t\t\targs += strlen(db);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tstatic char ds[] = \"ds_noduplicates\";\r\n\t\tif (_strnicmp(ds, args, strlen(ds)) == 0) {\r\n\t\t\tgbDupSounds = FALSE;\r\n\t\t\targs += strlen(ds);\r\n\t\t\tcontinue;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tchar tq[] = \"Theoquest\";\r\n\t\tif (_strnicmp(tq, args, strlen(tq)) == 0) {\r\n\t\t\tUseTheoQuest = TRUE;\r\n\t\t\targs += strlen(tq);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tchar cq[] = \"Cowquest\";\r\n\t\tif (_strnicmp(cq, args, strlen(cq)) == 0) {\r\n\t\t\tUseCowFarmer = TRUE;\r\n\t\t\targs += strlen(cq);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tchar na[] = \"NestArt\";\r\n\t\tif (_strnicmp(na, args, strlen(na)) == 0) {\r\n\t\t\tUseNestArt = TRUE;\r\n\t\t\targs += strlen(na);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tchar bt[] = \"Bardtest\";\r\n\t\tif (_strnicmp(bt, args, strlen(bt)) == 0) {\r\n\t\t\tUseBardTest = TRUE;\r\n\t\t\targs += strlen(bt);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tchar mt[] = \"Multitest\";\r\n\t\tif (_strnicmp(mt, bt, strlen(mt)) == 0) { // BUGFIX: secound arg should be args\r\n\t\t\tUseMultiTest = TRUE;\r\n\t\t\targs += strlen(mt);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tchar bb[] = \"Barbariantest\";\r\n\t\tif (_strnicmp(bb, args, strlen(bb)) == 0) {\r\n\t\t\tUseBarbarianTest = TRUE;\r\n\t\t\targs += strlen(bb);\r\n\t\t\tcontinue;\r\n\t\t}\r\n#endif\r\n\t\tc = tolower(*args);\r\n\t\targs++;\r\n#ifdef _DEBUG\r\n\t\tswitch (c) {\r\n\t\tcase '^':\r\n\t\t\tdebug_mode_key_inverted_v = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase '$':\r\n\t\t\tdebug_mode_dollar_sign = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase 'b':\r\n\t\t\t/*\r\n\t\t\tdebug_mode_key_b = TRUE;\r\n\t\t*/\r\n\t\t\tbreak;\r\n\t\tcase 'd':\r\n\t\t\tshowintrodebug = FALSE;\r\n\t\t\tdebug_mode_key_d = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase 'f':\r\n\t\t\tEnableFrameCount();\r\n\t\t\tbreak;\r\n\t\tcase 'i':\r\n\t\t\tdebug_mode_key_i = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase 'j':\r\n\t\t\t/*\r\n\t\t\twhile(isspace(*args)) {\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\ti = 0;\r\n\t\t\twhile(isdigit(*args)) {\r\n\t\t\t\ti = *args + 10 * i - '0';\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\tdebug_mode_key_J_trigger = i;\r\n\t\t*/\r\n\t\t\tbreak;\r\n\t\tcase 'l':\r\n\t\t\tsetlevel = FALSE;\r\n\t\t\tleveldebug = TRUE;\r\n\t\t\twhile (isspace(*args)) {\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\ti = 0;\r\n\t\t\twhile (isdigit(*args)) {\r\n\t\t\t\ti = *args + 10 * i - '0';\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\tleveltype = i;\r\n\t\t\twhile (isspace(*args)) {\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\ti = 0;\r\n\t\t\twhile (isdigit(*args)) {\r\n\t\t\t\ti = *args + 10 * i - '0';\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\tcurrlevel = i;\r\n\t\t\tplr[0].plrlevel = i;\r\n\t\t\tbreak;\r\n\t\tcase 'm':\r\n\t\t\tmonstdebug = TRUE;\r\n\t\t\twhile (isspace(*args)) {\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\ti = 0;\r\n\t\t\twhile (isdigit(*args)) {\r\n\t\t\t\ti = *args + 10 * i - '0';\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\tDebugMonsters[debugmonsttypes++] = i;\r\n\t\t\tbreak;\r\n\t\tcase 'n':\r\n\t\t\tshowintrodebug = FALSE;\r\n\t\t\tbreak;\r\n\t\tcase 'q':\r\n\t\t\twhile (isspace(*args)) {\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\ti = 0;\r\n\t\t\twhile (isdigit(*args)) {\r\n\t\t\t\ti = *args + 10 * i - '0';\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\tquestdebug = i;\r\n\t\t\tbreak;\r\n\t\tcase 'r':\r\n\t\t\twhile (isspace(*args)) {\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\ti = 0;\r\n\t\t\twhile (isdigit(*args)) {\r\n\t\t\t\ti = *args + 10 * i - '0';\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\tsetseed = i;\r\n\t\t\tbreak;\r\n\t\tcase 's':\r\n\t\t\tdebug_mode_key_s = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase 't':\r\n\t\t\tleveldebug = TRUE;\r\n\t\t\tsetlevel = TRUE;\r\n\t\t\twhile (isspace(*args)) {\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\ti = 0;\r\n\t\t\twhile (isdigit(*args)) {\r\n\t\t\t\ti = *args + 10 * i - '0';\r\n\t\t\t\targs++;\r\n\t\t\t}\r\n\t\t\tsetlvlnum = i;\r\n\t\t\tbreak;\r\n\t\tcase 'v':\r\n\t\t\tvisiondebug = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase 'w':\r\n\t\t\tdebug_mode_key_w = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase 'x':\r\n\t\t\tfullscreen = FALSE;\r\n\t\t\tbreak;\r\n\t\t}\r\n#endif\r\n\t}\r\n}\r\n\r\nvoid FreeGameMem()\r\n{\r\n\tmusic_stop();\r\n\r\n\tMemFreeDbg(pDungeonCels);\r\n\tMemFreeDbg(pMegaTiles);\r\n\tMemFreeDbg(pLevelPieces);\r\n\tMemFreeDbg(pSpecialCels);\r\n\tMemFreeDbg(pSpeedCels);\r\n\r\n\tFreeMissiles();\r\n\tFreeMonsters();\r\n\tFreeObjectGFX();\r\n\tFreeMonsterSnd();\r\n\tFreeTownerGFX();\r\n}\r\n\r\nstatic void start_game(unsigned int uMsg)\r\n{\r\n\tzoomflag = TRUE;\r\n\tcineflag = FALSE;\r\n\tInitCursor();\r\n\tInitLightTable();\r\n\tLoadDebugGFX();\r\n\tassert(ghMainWnd);\r\n\tmusic_stop();\r\n\tShowProgress(uMsg);\r\n\tgmenu_init_menu();\r\n\tInitLevelCursor();\r\n\tsgnTimeoutCurs = CURSOR_NONE;\r\n\tsgbMouseDown = CLICK_NONE;\r\n\ttrack_repeat_walk(FALSE);\r\n}\r\n\r\nstatic void free_game()\r\n{\r\n\tint i;\r\n\r\n\tFreeControlPan();\r\n\tFreeInvGFX();\r\n\tFreeGMenu();\r\n\tFreeQuestText();\r\n\tFreeStoreMem();\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++)\r\n\t\tFreePlayerGFX(i);\r\n\r\n\tFreeItemGFX();\r\n\tFreeCursor();\r\n\tFreeLightTable();\r\n\tFreeDebugGFX();\r\n\tFreeGameMem();\r\n}\r\n\r\nstatic void run_game_loop(unsigned int uMsg)\r\n{\r\n\tBOOL bLoop;\r\n\tWNDPROC saveProc;\r\n\tMSG msg;\r\n\r\n\tnthread_ignore_mutex(TRUE);\r\n\tstart_game(uMsg);\r\n\tassert(ghMainWnd);\r\n\tsaveProc = SetWindowProc(GM_Game);\r\n\tcontrol_update_life_mana();\r\n\trun_delta_info();\r\n\tgbRunGame = TRUE;\r\n\tgbProcessPlayers = TRUE;\r\n\tgbRunGameResult = TRUE;\r\n\tforce_redraw = 255;\r\n\tDrawAndBlit();\r\n\tPaletteFadeIn(8);\r\n\tforce_redraw = 255;\r\n\tgbGameLoopStartup = TRUE;\r\n\tnthread_ignore_mutex(FALSE);\r\n\r\n\twhile (gbRunGame) {\r\n\t\tdiablo_color_cyc_logic();\r\n\t\tif (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {\r\n\t\t\tSetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);\r\n\t\t\twhile (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {\r\n\t\t\t\tif (msg.message == WM_QUIT) {\r\n\t\t\t\t\tgbRunGameResult = FALSE;\r\n\t\t\t\t\tgbRunGame = FALSE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tTranslateMessage(&msg);\r\n\t\t\t\tDispatchMessage(&msg);\r\n\t\t\t}\r\n\t\t\tbLoop = gbRunGame && nthread_has_500ms_passed(FALSE);\r\n\t\t\tSetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);\r\n\t\t\tif (!bLoop) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t} else if (!nthread_has_500ms_passed(FALSE)) {\r\n#ifdef SLEEPFIX\r\n\t\t\tSleep(1);\r\n#endif\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tmulti_process_network_packets();\r\n\t\tgame_loop(gbGameLoopStartup);\r\n#ifndef HELLFIRE\r\n\t\tmsgcmd_send_chat();\r\n#endif\r\n\t\tgbGameLoopStartup = FALSE;\r\n\t\tDrawAndBlit();\r\n\t}\r\n\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tpfile_write_hero();\r\n\t}\r\n\r\n\tpfile_flush_W();\r\n\tPaletteFadeOut(8);\r\n\tSetCursor_(CURSOR_NONE);\r\n\tClearScreenBuffer();\r\n\tforce_redraw = 255;\r\n\tscrollrt_draw_game_screen(TRUE);\r\n\tsaveProc = SetWindowProc(saveProc);\r\n\tassert(saveProc == GM_Game);\r\n\tfree_game();\r\n\r\n\tif (cineflag) {\r\n\t\tcineflag = FALSE;\r\n\t\tDoEnding();\r\n\t}\r\n}\r\n\r\nBOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer)\r\n{\r\n\tBOOL fExitProgram;\r\n\tunsigned int uMsg;\r\n\r\n\tgbSelectProvider = TRUE;\r\n\r\n\tdo {\r\n\t\tfExitProgram = FALSE;\r\n#ifndef HELLFIRE\r\n\t\tgbLoadGame = FALSE;\r\n#endif\r\n\r\n\t\tif (!NetInit(bSinglePlayer, &fExitProgram)) {\r\n\t\t\tgbRunGameResult = !fExitProgram;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tgbSelectProvider = FALSE;\r\n\r\n\t\tif (bNewGame || !gbValidSaveFile) {\r\n\t\t\tInitLevels();\r\n\t\t\tInitQuests();\r\n\t\t\tInitPortals();\r\n\t\t\tInitDungMsgs(myplr);\r\n#ifndef HELLFIRE\r\n\t\t}\r\n\t\tif (!gbValidSaveFile || !gbLoadGame) {\r\n#else\r\n\t\t\tif (!gbValidSaveFile && gbLoadGame)\r\n\t\t\t\tinv_diablo_to_hellfire(myplr);\r\n#endif\r\n\t\t\tuMsg = WM_DIABNEWGAME;\r\n\t\t} else {\r\n\t\t\tuMsg = WM_DIABLOADGAME;\r\n\t\t}\r\n\t\trun_game_loop(uMsg);\r\n\t\tNetClose();\r\n#ifndef HELLFIRE\r\n\t\tpfile_create_player_description(NULL, 0);\r\n#else\r\n\t\tif (gbMaxPlayers == 1)\r\n\t\t\tbreak;\r\n#endif\r\n\t} while (gbRunGameResult);\r\n\r\n\tSNetDestroy();\r\n\treturn gbRunGameResult;\r\n}\r\n\r\nstatic void diablo_init_screen()\r\n{\r\n\tint i;\r\n\r\n\tMouseX = SCREEN_WIDTH / 2;\r\n\tMouseY = SCREEN_HEIGHT / 2;\r\n\tScrollInfo._sdx = 0;\r\n\tScrollInfo._sdy = 0;\r\n\tScrollInfo._sxoff = 0;\r\n\tScrollInfo._syoff = 0;\r\n\tScrollInfo._sdir = SDIR_NONE;\r\n\r\n\tfor (i = 0; i < 1024; i++)\r\n\t\tPitchTbl[i] = i * BUFFER_WIDTH;\r\n\r\n\tClrDiabloMsg();\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic LONG __stdcall diablo_TopLevelExceptionFilter(PEXCEPTION_POINTERS pExc)\r\n{\r\n\tdx_cleanup();\r\n\tinit_cleanup(FALSE);\r\n\tif (lpTopLevelExceptionFilter)\r\n\t\treturn lpTopLevelExceptionFilter(pExc);\r\n\r\n\treturn EXCEPTION_CONTINUE_SEARCH;\r\n}\r\n#endif\r\n\r\nBOOL diablo_get_not_running()\r\n{\r\n\tSetLastError(0);\r\n\tCreateEvent(NULL, FALSE, FALSE, \"DiabloEvent\");\r\n#ifdef HELLFIRE\r\n\tCreateEvent(NULL, FALSE, FALSE, \"HellfireEvent\");\r\n#endif\r\n\treturn GetLastError() != ERROR_ALREADY_EXISTS;\r\n}\r\n\r\nstatic BOOL diablo_find_window(LPCSTR lpClassName)\r\n{\r\n\tHWND hWnd, active;\r\n\r\n\thWnd = FindWindow(lpClassName, NULL);\r\n\tif (hWnd == NULL)\r\n\t\treturn FALSE;\r\n\r\n\tactive = GetLastActivePopup(hWnd);\r\n\tif (active != NULL)\r\n\t\thWnd = active;\r\n\r\n\tactive = GetTopWindow(hWnd);\r\n\tif (!active)\r\n\t\tactive = hWnd;\r\n\r\n\tSetForegroundWindow(hWnd);\r\n\tSetFocus(active);\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void diablo_reload_process(HINSTANCE hInstance)\r\n{\r\n\tDWORD dwSize, dwProcessId;\r\n\tBOOL bNoExist;\r\n\tchar *s;\r\n\tlong *plMap;\r\n\tHWND hWnd, hPrev;\r\n\tHANDLE hMap;\r\n\tSTARTUPINFO si;\r\n\tSYSTEM_INFO sinf;\r\n\tPROCESS_INFORMATION pi;\r\n\tchar szReload[MAX_PATH + 16];\r\n\tchar szFileName[MAX_PATH] = \"\";\r\n\r\n\tGetModuleFileName(hInstance, szFileName, sizeof(szFileName));\r\n\twsprintf(szReload, \"Reload-%s\", szFileName);\r\n\tfor (s = szReload; *s != '\\0'; s++) {\r\n\t\tif (*s == '\\\\') {\r\n\t\t\t*s = '/';\r\n\t\t}\r\n\t}\r\n\r\n\tGetSystemInfo(&sinf);\r\n\tdwSize = sinf.dwPageSize;\r\n\tif (dwSize < 4096) {\r\n\t\tdwSize = 4096;\r\n\t}\r\n\r\n\thMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, SEC_COMMIT | PAGE_READWRITE, 0, dwSize, szReload);\r\n\tbNoExist = GetLastError() != ERROR_ALREADY_EXISTS;\r\n\tif (hMap == NULL) {\r\n\t\treturn;\r\n\t}\r\n\tplMap = (long *)MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, dwSize);\r\n\tif (plMap == NULL) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (bNoExist) {\r\n\t\tplMap[0] = -1;\r\n\t\tplMap[1] = 0;\r\n\t\tmemset(&si, 0, sizeof(si));\r\n\t\tsi.cb = sizeof(si);\r\n\t\tCreateProcess(szFileName, NULL, NULL, NULL, FALSE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi);\r\n\t\tWaitForInputIdle(pi.hProcess, INFINITE);\r\n\t\tCloseHandle(pi.hThread);\r\n\t\tCloseHandle(pi.hProcess);\r\n\t\twhile (plMap[0] < 0) {\r\n\t\t\tSleep(1000);\r\n\t\t}\r\n\t\tUnmapViewOfFile(plMap);\r\n\t\tCloseHandle(hMap);\r\n\t\tExitProcess(0);\r\n\t}\r\n\r\n\tif (InterlockedIncrement(&plMap[0]) == 0) {\r\n\t\tplMap[1] = GetCurrentProcessId();\r\n\t} else {\r\n\t\thPrev = GetForegroundWindow();\r\n\t\thWnd = hPrev;\r\n\t\twhile (1) {\r\n\t\t\thPrev = GetWindow(hPrev, GW_HWNDPREV);\r\n\t\t\tif (hPrev == NULL) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\thWnd = hPrev;\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tGetWindowThreadProcessId(hWnd, &dwProcessId);\r\n\t\t\tif (dwProcessId == plMap[1]) {\r\n\t\t\t\tSetForegroundWindow(hWnd);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\thWnd = GetWindow(hWnd, GW_HWNDNEXT);\r\n\t\t} while (hWnd != NULL);\r\n\t\tUnmapViewOfFile(plMap);\r\n\t\tCloseHandle(hMap);\r\n\t\tExitProcess(0);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Main entry point, check env, initialize systesm, play intros, start main menu, shut down\r\n * @param hInstance A handle to the current instance of the application.\r\n * @param hPrevInstance Always null\r\n * @param lpCmdLine The command line for the application\r\n * @param nCmdShow Initial window state\r\n */\r\nint APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)\r\n{\r\n\tHINSTANCE hInst;\r\n\tint nData;\r\n\tchar szFileName[MAX_PATH];\r\n\tBOOL bNoEvent;\r\n#ifdef HELLFIRE\r\n\tchar content[256];\r\n\tFILE *file;\r\n#endif\r\n\r\n\thInst = hInstance;\r\n#ifndef DEBUGGER\r\n\tdiablo_reload_process(hInstance);\r\n#endif\r\n\tghInst = hInst;\r\n\r\n#ifndef HELLFIRE\r\n\tif (RestrictedTest())\r\n\t\tErrOkDlg(IDD_DIALOG10, 0, \"C:\\\\Src\\\\Diablo\\\\Source\\\\DIABLO.CPP\", 877);\r\n\tif (ReadOnlyTest()) {\r\n\t\tif (!GetModuleFileName(ghInst, szFileName, sizeof(szFileName)))\r\n\t\t\tszFileName[0] = '\\0';\r\n\t\tDirErrorDlg(szFileName);\r\n\t}\r\n#endif\r\n\r\n\tShowCursor(FALSE);\r\n\tsrand(GetTickCount());\r\n\tInitHash();\r\n#ifdef HELLFIRE\r\n\talloc_plr();\r\n\tlpTopLevelExceptionFilter = SetUnhandledExceptionFilter(diablo_TopLevelExceptionFilter);\r\n#else\r\n\tfault_get_filter();\r\n#endif\r\n\r\n\tbNoEvent = diablo_get_not_running();\r\n#ifdef HELLFIRE\r\n\tif (diablo_find_window(\"DIABLO\"))\r\n\t\treturn 0;\r\n#endif\r\n\tif (diablo_find_window(GAME_NAME) || !bNoEvent)\r\n\t\treturn 0;\r\n\r\n#ifdef _DEBUG\r\n\tSFileEnableDirectAccess(TRUE);\r\n#endif\r\n\tdiablo_init_screen();\r\n#ifdef HELLFIRE\r\n\tif (lpCmdLine[0] == '\\0') {\r\n\t\tcontent[0] = '\\0';\r\n\t\tif (file = fopen(\"command.txt\", \"r\")) {\r\n\t\t\tfgets(content, sizeof(content) / sizeof(char), file);\r\n\t\t\tlpCmdLine = content;\r\n\t\t\tfclose(file);\r\n\t\t}\r\n\t}\r\n#endif\r\n\tdiablo_parse_flags(lpCmdLine);\r\n\tinit_create_window(nCmdShow);\r\n\tui_sound_init();\r\n\tUiInitialize();\r\n#ifdef SPAWN\r\n\tUiSetSpawned(TRUE);\r\n#endif\r\n\r\n#ifdef _DEBUG\r\n\tif (showintrodebug)\r\n#endif\r\n\t\tplay_movie(\"gendata\\\\logo.smk\", TRUE);\r\n\r\n#ifndef SPAWN\r\n\t{\r\n\t\tchar szValueName[] = \"Intro\";\r\n\t\tif (!SRegLoadValue(APP_NAME, szValueName, 0, &nData))\r\n\t\t\tnData = 1;\r\n#ifndef HELLFIRE\r\n\t\tif (nData)\r\n\t\t\tplay_movie(\"gendata\\\\diablo1.smk\", TRUE);\r\n#else\r\n\t\tplay_movie(\"gendata\\\\Hellfire.smk\", TRUE);\r\n#endif\r\n\t\tSRegSaveValue(APP_NAME, szValueName, 0, 0);\r\n\t}\r\n#endif\r\n\r\n#ifdef _DEBUG\r\n\tif (showintrodebug) {\r\n#endif\r\n\t\tUiTitleDialog(7);\r\n\t\tBlackPalette();\r\n#ifdef _DEBUG\r\n\t}\r\n#endif\r\n\r\n\tmainmenu_loop();\r\n\tUiDestroy();\r\n\tSaveGamma();\r\n\r\n\tif (ghMainWnd) {\r\n\t\tSleep(300);\r\n\t\tDestroyWindow(ghMainWnd);\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic BOOL LeftMouseCmd(BOOL bShift)\r\n{\r\n\tBOOL bNear;\r\n\r\n\tassert(MouseY < PANEL_TOP); // 352\r\n\r\n\tif (leveltype == DTYPE_TOWN) {\r\n\t\tif (pcursitem != -1 && pcurs == CURSOR_HAND)\r\n\t\t\tNetSendCmdLocParam1(TRUE, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursmx, cursmy, pcursitem);\r\n\t\tif (pcursmonst != -1)\r\n\t\t\tNetSendCmdLocParam1(TRUE, CMD_TALKXY, cursmx, cursmy, pcursmonst);\r\n\t\tif (pcursitem == -1 && pcursmonst == -1 && pcursplr == -1)\r\n\t\t\treturn TRUE;\r\n\t} else {\r\n\t\tbNear = abs(plr[myplr]._px - cursmx) < 2 && abs(plr[myplr]._py - cursmy) < 2;\r\n\t\tif (pcursitem != -1 && pcurs == CURSOR_HAND && !bShift) {\r\n\t\t\tNetSendCmdLocParam1(TRUE, invflag ? CMD_GOTOGETITEM : CMD_GOTOAGETITEM, cursmx, cursmy, pcursitem);\r\n\t\t} else if (pcursobj != -1 && (!bShift || bNear && object[pcursobj]._oBreak == 1)) {\r\n\t\t\tNetSendCmdLocParam1(TRUE, pcurs == CURSOR_DISARM ? CMD_DISARMXY : CMD_OPOBJXY, cursmx, cursmy, pcursobj);\r\n\t\t} else if (plr[myplr]._pwtype == WT_RANGED) {\r\n\t\t\tif (bShift) {\r\n\t\t\t\tNetSendCmdLoc(TRUE, CMD_RATTACKXY, cursmx, cursmy);\r\n\t\t\t} else if (pcursmonst != -1) {\r\n\t\t\t\tif (CanTalkToMonst(pcursmonst)) {\r\n\t\t\t\t\tNetSendCmdParam1(TRUE, CMD_ATTACKID, pcursmonst);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tNetSendCmdParam1(TRUE, CMD_RATTACKID, pcursmonst);\r\n\t\t\t\t}\r\n\t\t\t} else if (pcursplr != -1 && !FriendlyMode) {\r\n\t\t\t\tNetSendCmdParam1(TRUE, CMD_RATTACKPID, pcursplr);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (bShift) {\r\n\t\t\t\tif (pcursmonst != -1) {\r\n\t\t\t\t\tif (CanTalkToMonst(pcursmonst)) {\r\n\t\t\t\t\t\tNetSendCmdParam1(TRUE, CMD_ATTACKID, pcursmonst);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tNetSendCmdLoc(TRUE, CMD_SATTACKXY, cursmx, cursmy);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tNetSendCmdLoc(TRUE, CMD_SATTACKXY, cursmx, cursmy);\r\n\t\t\t\t}\r\n\t\t\t} else if (pcursmonst != -1) {\r\n\t\t\t\tNetSendCmdParam1(TRUE, CMD_ATTACKID, pcursmonst);\r\n\t\t\t} else if (pcursplr != -1 && !FriendlyMode) {\r\n\t\t\t\tNetSendCmdParam1(TRUE, CMD_ATTACKPID, pcursplr);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!bShift && pcursitem == -1 && pcursobj == -1 && pcursmonst == -1 && pcursplr == -1)\r\n\t\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic BOOL TryIconCurs()\r\n{\r\n\tif (pcurs == CURSOR_RESURRECT) {\r\n\t\tNetSendCmdParam1(TRUE, CMD_RESURRECT, pcursplr);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (pcurs == CURSOR_HEALOTHER) {\r\n\t\tNetSendCmdParam1(TRUE, CMD_HEALOTHER, pcursplr);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (pcurs == CURSOR_TELEKINESIS) {\r\n\t\tDoTelekinesis();\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (pcurs == CURSOR_IDENTIFY) {\r\n\t\tif (pcursinvitem != -1)\r\n\t\t\tCheckIdentify(myplr, pcursinvitem);\r\n\t\telse\r\n\t\t\tNewCursor(CURSOR_HAND);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (pcurs == CURSOR_REPAIR) {\r\n\t\tif (pcursinvitem != -1)\r\n\t\t\tDoRepair(myplr, pcursinvitem);\r\n\t\telse\r\n\t\t\tNewCursor(CURSOR_HAND);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (pcurs == CURSOR_RECHARGE) {\r\n\t\tif (pcursinvitem != -1)\r\n\t\t\tDoRecharge(myplr, pcursinvitem);\r\n\t\telse\r\n\t\t\tNewCursor(CURSOR_HAND);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (pcurs == CURSOR_OIL) {\r\n\t\tif (pcursinvitem != -1)\r\n\t\t\tDoOil(myplr, pcursinvitem);\r\n\t\telse\r\n\t\t\tNewCursor(CURSOR_HAND);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n#endif\r\n\tif (pcurs == CURSOR_TELEPORT) {\r\n\t\tif (pcursmonst != -1)\r\n\t\t\tNetSendCmdParam3(TRUE, CMD_TSPELLID, pcursmonst, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell));\r\n\t\telse if (pcursplr != -1)\r\n\t\t\tNetSendCmdParam3(TRUE, CMD_TSPELLPID, pcursplr, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell));\r\n\t\telse\r\n\t\t\tNetSendCmdLocParam2(TRUE, CMD_TSPELLXY, cursmx, cursmy, plr[myplr]._pTSpell, GetSpellLevel(myplr, plr[myplr]._pTSpell));\r\n\t\tNewCursor(CURSOR_HAND);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (pcurs == CURSOR_DISARM && pcursobj == -1) {\r\n\t\tNewCursor(CURSOR_HAND);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic BOOL LeftMouseDown(int wParam)\r\n{\r\n\tif (gmenu_left_mouse(TRUE))\r\n\t\treturn FALSE;\r\n\r\n\tif (control_check_talk_btn())\r\n\t\treturn FALSE;\r\n\r\n\tif (sgnTimeoutCurs != CURSOR_NONE)\r\n\t\treturn FALSE;\r\n\r\n\tif (deathflag) {\r\n\t\tcontrol_check_btn_press();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (PauseMode == 2) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (doomflag) {\r\n\t\tdoom_close();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (spselflag) {\r\n\t\tSetSpell();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (stextflag != STORE_NONE) {\r\n\t\tCheckStoreBtn();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (MouseY < PANEL_TOP) {\r\n\t\tif (!gmenu_is_active() && !TryIconCurs()) {\r\n\t\t\tif (questlog && MouseX > 32 && MouseX < 288 && MouseY > 32 && MouseY < 308) {\r\n\t\t\t\tQuestlogESC();\r\n\t\t\t} else if (qtextflag) {\r\n\t\t\t\tqtextflag = FALSE;\r\n\t\t\t\tstream_stop();\r\n\t\t\t} else if (chrflag && MouseX < SPANEL_WIDTH) {\r\n\t\t\t\tCheckChrBtns();\r\n\t\t\t} else if (invflag && MouseX > RIGHT_PANEL) {\r\n\t\t\t\tif (!dropGoldFlag)\r\n\t\t\t\t\tCheckInvItem();\r\n\t\t\t} else if (sbookflag && MouseX > RIGHT_PANEL) {\r\n\t\t\t\tCheckSBook();\r\n\t\t\t} else if (pcurs >= CURSOR_FIRSTITEM) {\r\n\t\t\t\tif (TryInvPut()) {\r\n\t\t\t\t\tNetSendCmdPItem(TRUE, CMD_PUTITEM, cursmx, cursmy);\r\n\t\t\t\t\tNewCursor(CURSOR_HAND);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (plr[myplr]._pStatPts != 0 && !spselflag)\r\n\t\t\t\t\tCheckLvlBtn();\r\n\t\t\t\tif (!lvlbtndown)\r\n\t\t\t\t\treturn LeftMouseCmd(wParam == MK_SHIFT + MK_LBUTTON);\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tif (!talkflag && !dropGoldFlag && !gmenu_is_active())\r\n\t\t\tCheckInvScrn();\r\n\t\tDoPanBtn();\r\n\t\tif (pcurs > CURSOR_HAND && pcurs < CURSOR_FIRSTITEM)\r\n\t\t\tNewCursor(CURSOR_HAND);\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic void LeftMouseUp()\r\n{\r\n\tgmenu_left_mouse(FALSE);\r\n\tcontrol_release_talk_btn();\r\n\tif (panbtndown)\r\n\t\tCheckBtnUp();\r\n\tif (chrbtnactive)\r\n\t\tReleaseChrBtns();\r\n\tif (lvlbtndown)\r\n\t\tReleaseLvlBtn();\r\n\tif (stextflag != STORE_NONE)\r\n\t\tReleaseStoreBtn();\r\n}\r\n\r\nstatic void RightMouseDown()\r\n{\r\n\tif (!gmenu_is_active() && sgnTimeoutCurs == CURSOR_NONE && PauseMode != 2 && !plr[myplr]._pInvincible) {\r\n\t\tif (doomflag) {\r\n\t\t\tdoom_close();\r\n\t\t} else if (stextflag == STORE_NONE) {\r\n\t\t\tif (spselflag) {\r\n\t\t\t\tSetSpell();\r\n#ifdef HELLFIRE\r\n\t\t\t} else if ((!sbookflag || MouseX <= RIGHT_PANEL) && (MouseY >= SPANEL_HEIGHT || (!TryIconCurs() && (pcursinvitem == -1 || !UseInvItem(myplr, pcursinvitem))))) {\r\n#else\r\n\t\t\t} else if (MouseY >= SPANEL_HEIGHT\r\n\t\t\t    || (!sbookflag || MouseX <= RIGHT_PANEL)\r\n\t\t\t        && !TryIconCurs()\r\n\t\t\t        && (pcursinvitem == -1 || !UseInvItem(myplr, pcursinvitem))) {\r\n#endif\r\n\t\t\t\tif (pcurs == CURSOR_HAND) {\r\n\t\t\t\t\tif (pcursinvitem == -1 || !UseInvItem(myplr, pcursinvitem))\r\n\t\t\t\t\t\tCheckPlrSpell();\r\n\t\t\t\t} else if (pcurs > CURSOR_HAND && pcurs < CURSOR_FIRSTITEM) {\r\n\t\t\t\t\tNewCursor(CURSOR_HAND);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void diablo_pause_game()\r\n{\r\n\tif (gbMaxPlayers <= 1) {\r\n\t\tif (PauseMode) {\r\n\t\t\tPauseMode = 0;\r\n\t\t} else {\r\n\t\t\tPauseMode = 2;\r\n\t\t\tsound_stop();\r\n\t\t\ttrack_repeat_walk(FALSE);\r\n\t\t}\r\n\t\tforce_redraw = 255;\r\n\t}\r\n}\r\n\r\nstatic void diablo_hotkey_msg(DWORD dwMsg)\r\n{\r\n\tchar *s;\r\n\tchar szFileName[MAX_PATH];\r\n\tchar szMsg[MAX_SEND_STR_LEN];\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\treturn;\r\n\t}\r\n\tif (GetModuleFileName(ghInst, szFileName, sizeof(szFileName)) == 0) {\r\n\t\tapp_fatal(\"Can't get program name\");\r\n\t}\r\n\r\n\ts = strrchr(szFileName, '\\\\');\r\n\tif (s != NULL) {\r\n\t\t*s = '\\0';\r\n\t}\r\n\r\n\tstrcat(szFileName, \"\\\\Diablo.ini\");\r\n\tassert(dwMsg < sizeof(spszMsgTbl) / sizeof(spszMsgTbl[0]));\r\n\tGetPrivateProfileString(\"NetMsg\", spszMsgHotKeyTbl[dwMsg], spszMsgTbl[dwMsg], szMsg, sizeof(szMsg), szFileName);\r\n\tNetSendCmdString(-1, szMsg);\r\n}\r\n\r\nstatic BOOL PressSysKey(int wParam)\r\n{\r\n\tif (gmenu_is_active() || wParam != VK_F10)\r\n\t\treturn FALSE;\r\n\tdiablo_hotkey_msg(1);\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void ReleaseKey(int vkey)\r\n{\r\n\tif (vkey == VK_SNAPSHOT)\r\n\t\tCaptureScreen();\r\n}\r\n\r\nBOOL PressEscKey()\r\n{\r\n\tBOOL rv = FALSE;\r\n\r\n\tif (doomflag) {\r\n\t\tdoom_close();\r\n\t\trv = TRUE;\r\n\t}\r\n\tif (helpflag) {\r\n\t\thelpflag = FALSE;\r\n\t\trv = TRUE;\r\n\t}\r\n\r\n\tif (qtextflag) {\r\n\t\tqtextflag = FALSE;\r\n\t\tstream_stop();\r\n\t\trv = TRUE;\r\n\t} else if (stextflag) {\r\n\t\tSTextESC();\r\n\t\trv = TRUE;\r\n\t}\r\n\r\n\tif (msgflag) {\r\n\t\tmsgdelay = 0;\r\n\t\trv = TRUE;\r\n\t}\r\n\tif (talkflag) {\r\n\t\tcontrol_reset_talk();\r\n\t\trv = TRUE;\r\n\t}\r\n\tif (dropGoldFlag) {\r\n\t\tcontrol_drop_gold(VK_ESCAPE);\r\n\t\trv = TRUE;\r\n\t}\r\n\tif (spselflag) {\r\n\t\tspselflag = FALSE;\r\n\t\trv = TRUE;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nstatic void PressKey(int vkey)\r\n{\r\n\tif (gmenu_presskeys(vkey) || control_presskeys(vkey)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (deathflag) {\r\n\t\tif (sgnTimeoutCurs != CURSOR_NONE) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (vkey == VK_F9) {\r\n\t\t\tdiablo_hotkey_msg(0);\r\n\t\t}\r\n\t\tif (vkey == VK_F10) {\r\n\t\t\tdiablo_hotkey_msg(1);\r\n\t\t}\r\n\t\tif (vkey == VK_F11) {\r\n\t\t\tdiablo_hotkey_msg(2);\r\n\t\t}\r\n\t\tif (vkey == VK_F12) {\r\n\t\t\tdiablo_hotkey_msg(3);\r\n\t\t}\r\n\t\tif (vkey == VK_RETURN) {\r\n\t\t\tcontrol_type_message();\r\n\t\t}\r\n\t\tif (vkey != VK_ESCAPE) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tif (vkey == VK_ESCAPE) {\r\n\t\tif (!PressEscKey()) {\r\n\t\t\ttrack_repeat_walk(FALSE);\r\n\t\t\tgamemenu_on();\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (sgnTimeoutCurs != CURSOR_NONE || dropGoldFlag) {\r\n\t\treturn;\r\n\t}\r\n\tif (vkey == VK_PAUSE) {\r\n\t\tdiablo_pause_game();\r\n\t\treturn;\r\n\t}\r\n\tif (PauseMode == 2) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (vkey == VK_RETURN) {\r\n\t\tif (stextflag) {\r\n\t\t\tSTextEnter();\r\n\t\t} else if (questlog) {\r\n\t\t\tQuestlogEnter();\r\n\t\t} else {\r\n\t\t\tcontrol_type_message();\r\n\t\t}\r\n\t} else if (vkey == VK_F1) {\r\n\t\tif (helpflag) {\r\n\t\t\thelpflag = FALSE;\r\n\t\t} else if (stextflag != STORE_NONE) {\r\n\t\t\tClearPanel();\r\n\t\t\tAddPanelString(\"No help available\", TRUE); /// BUGFIX: message isn't displayed\r\n\t\t\tAddPanelString(\"while in stores\", TRUE);\r\n\t\t\ttrack_repeat_walk(FALSE);\r\n\t\t} else {\r\n\t\t\tinvflag = FALSE;\r\n\t\t\tchrflag = FALSE;\r\n\t\t\tsbookflag = FALSE;\r\n\t\t\tspselflag = FALSE;\r\n\t\t\tif (qtextflag && leveltype == DTYPE_TOWN) {\r\n\t\t\t\tqtextflag = FALSE;\r\n\t\t\t\tstream_stop();\r\n\t\t\t}\r\n\t\t\tquestlog = FALSE;\r\n\t\t\tautomapflag = FALSE;\r\n\t\t\tmsgdelay = 0;\r\n\t\t\tgamemenu_off();\r\n\t\t\tDisplayHelp();\r\n\t\t\tdoom_close();\r\n\t\t}\r\n\t}\r\n#ifdef _DEBUG\r\n\telse if (vkey == VK_F2) {\r\n\t}\r\n#endif\r\n#ifdef _DEBUG\r\n\telse if (vkey == VK_F3) {\r\n\t\tif (pcursitem != -1) {\r\n\t\t\tsprintf(\r\n\t\t\t    tempstr,\r\n\t\t\t    \"IDX = %i  :  Seed = %i  :  CF = %i\",\r\n\t\t\t    item[pcursitem].IDidx,\r\n\t\t\t    item[pcursitem]._iSeed,\r\n\t\t\t    item[pcursitem]._iCreateInfo);\r\n\t\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t\t}\r\n\t\tsprintf(tempstr, \"Numitems : %i\", numitems);\r\n\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t}\r\n#endif\r\n#ifdef _DEBUG\r\n\telse if (vkey == VK_F4) {\r\n\t\tPrintDebugQuest();\r\n\t}\r\n#endif\r\n\telse if (vkey == VK_F5) {\r\n\t\tif (spselflag) {\r\n\t\t\tSetSpeedSpell(0);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tToggleSpell(0);\r\n\t\treturn;\r\n\t} else if (vkey == VK_F6) {\r\n\t\tif (spselflag) {\r\n\t\t\tSetSpeedSpell(1);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tToggleSpell(1);\r\n\t\treturn;\r\n\t} else if (vkey == VK_F7) {\r\n\t\tif (spselflag) {\r\n\t\t\tSetSpeedSpell(2);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tToggleSpell(2);\r\n\t\treturn;\r\n\t} else if (vkey == VK_F8) {\r\n\t\tif (spselflag) {\r\n\t\t\tSetSpeedSpell(3);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tToggleSpell(3);\r\n\t\treturn;\r\n\t} else if (vkey == VK_F9) {\r\n\t\tdiablo_hotkey_msg(0);\r\n\t} else if (vkey == VK_F10) {\r\n\t\tdiablo_hotkey_msg(1);\r\n\t} else if (vkey == VK_F11) {\r\n\t\tdiablo_hotkey_msg(2);\r\n\t} else if (vkey == VK_F12) {\r\n\t\tdiablo_hotkey_msg(3);\r\n\t} else if (vkey == VK_UP) {\r\n\t\tif (stextflag) {\r\n\t\t\tSTextUp();\r\n\t\t} else if (questlog) {\r\n\t\t\tQuestlogUp();\r\n\t\t} else if (helpflag) {\r\n\t\t\tHelpScrollUp();\r\n\t\t} else if (automapflag) {\r\n\t\t\tAutomapUp();\r\n\t\t}\r\n\t} else if (vkey == VK_DOWN) {\r\n\t\tif (stextflag) {\r\n\t\t\tSTextDown();\r\n\t\t} else if (questlog) {\r\n\t\t\tQuestlogDown();\r\n\t\t} else if (helpflag) {\r\n\t\t\tHelpScrollDown();\r\n\t\t} else if (automapflag) {\r\n\t\t\tAutomapDown();\r\n\t\t}\r\n\t} else if (vkey == VK_PRIOR) {\r\n\t\tif (stextflag) {\r\n\t\t\tSTextPrior();\r\n\t\t}\r\n\t} else if (vkey == VK_NEXT) {\r\n\t\tif (stextflag) {\r\n\t\t\tSTextNext();\r\n\t\t}\r\n\t} else if (vkey == VK_LEFT) {\r\n\t\tif (automapflag && !talkflag) {\r\n\t\t\tAutomapLeft();\r\n\t\t}\r\n\t} else if (vkey == VK_RIGHT) {\r\n\t\tif (automapflag && !talkflag) {\r\n\t\t\tAutomapRight();\r\n\t\t}\r\n\t} else if (vkey == VK_TAB) {\r\n\t\tDoAutoMap();\r\n\t} else if (vkey == VK_SPACE) {\r\n\t\tif (!chrflag && invflag && MouseX < 480 && MouseY < PANEL_TOP) {\r\n\t\t\tSetCursorPos(MouseX + 160, MouseY);\r\n\t\t}\r\n\t\tif (!invflag && chrflag && MouseX > 160 && MouseY < PANEL_TOP) {\r\n\t\t\tSetCursorPos(MouseX - 160, MouseY);\r\n\t\t}\r\n\t\thelpflag = FALSE;\r\n\t\tinvflag = FALSE;\r\n\t\tchrflag = FALSE;\r\n\t\tsbookflag = FALSE;\r\n\t\tspselflag = FALSE;\r\n\t\tif (qtextflag && leveltype == DTYPE_TOWN) {\r\n\t\t\tqtextflag = FALSE;\r\n\t\t\tstream_stop();\r\n\t\t}\r\n\t\tquestlog = FALSE;\r\n\t\tautomapflag = FALSE;\r\n\t\tmsgdelay = 0;\r\n\t\tgamemenu_off();\r\n\t\tdoom_close();\r\n\t}\r\n}\r\n\r\n/**\r\n * @internal `return` must be used instead of `break` to be bin exact as C++\r\n */\r\nstatic void PressChar(WPARAM vkey)\r\n{\r\n\tif (gmenu_is_active() || control_talk_last_key(vkey) || sgnTimeoutCurs != CURSOR_NONE || deathflag) {\r\n\t\treturn;\r\n\t}\r\n\tif ((char)vkey == 'p' || (char)vkey == 'P') {\r\n\t\tdiablo_pause_game();\r\n\t\treturn;\r\n\t}\r\n\tif (PauseMode == 2) {\r\n\t\treturn;\r\n\t}\r\n\tif (doomflag) {\r\n\t\tdoom_close();\r\n\t\treturn;\r\n\t}\r\n\tif (dropGoldFlag) {\r\n\t\tcontrol_drop_gold(vkey);\r\n\t\treturn;\r\n\t}\r\n\r\n\tswitch (vkey) {\r\n\tcase 'G':\r\n\tcase 'g':\r\n\t\tDecreaseGamma();\r\n\t\treturn;\r\n\tcase 'F':\r\n\tcase 'f':\r\n\t\tIncreaseGamma();\r\n\t\treturn;\r\n\tcase 'I':\r\n\tcase 'i':\r\n\t\tif (stextflag == STORE_NONE) {\r\n\t\t\tsbookflag = FALSE;\r\n\t\t\tinvflag = !invflag;\r\n\t\t\tif (!invflag || chrflag) {\r\n\t\t\t\tif (MouseX < 480 && MouseY < PANEL_TOP) {\r\n\t\t\t\t\tSetCursorPos(MouseX + 160, MouseY);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (MouseX > 160 && MouseY < PANEL_TOP) {\r\n\t\t\t\t\tSetCursorPos(MouseX - 160, MouseY);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'C':\r\n\tcase 'c':\r\n\t\tif (stextflag == STORE_NONE) {\r\n\t\t\tquestlog = FALSE;\r\n\t\t\tchrflag = !chrflag;\r\n\t\t\tif (!chrflag || invflag) {\r\n\t\t\t\tif (MouseX > 160 && MouseY < PANEL_TOP) {\r\n\t\t\t\t\tSetCursorPos(MouseX - 160, MouseY);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (MouseX < 480 && MouseY < PANEL_TOP) {\r\n\t\t\t\t\tSetCursorPos(MouseX + 160, MouseY);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'Q':\r\n\tcase 'q':\r\n\t\tif (stextflag == STORE_NONE) {\r\n\t\t\tchrflag = FALSE;\r\n\t\t\tif (!questlog) {\r\n\t\t\t\tStartQuestlog();\r\n\t\t\t} else {\r\n\t\t\t\tquestlog = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'Z':\r\n\tcase 'z':\r\n\t\tzoomflag = !zoomflag;\r\n\t\treturn;\r\n\tcase 'S':\r\n\tcase 's':\r\n\t\tif (stextflag == STORE_NONE) {\r\n\t\t\tinvflag = FALSE;\r\n\t\t\tif (!spselflag) {\r\n\t\t\t\tDoSpeedBook();\r\n\t\t\t} else {\r\n\t\t\t\tspselflag = FALSE;\r\n\t\t\t}\r\n\t\t\ttrack_repeat_walk(FALSE);\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'B':\r\n\tcase 'b':\r\n\t\tif (stextflag == STORE_NONE) {\r\n\t\t\tinvflag = FALSE;\r\n\t\t\tsbookflag = !sbookflag;\r\n\t\t}\r\n\t\treturn;\r\n\tcase '+':\r\n\tcase '=':\r\n\t\tif (automapflag) {\r\n\t\t\tAutomapZoomIn();\r\n\t\t}\r\n\t\treturn;\r\n\tcase '-':\r\n\tcase '_':\r\n\t\tif (automapflag) {\r\n\t\t\tAutomapZoomOut();\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'v':\r\n#ifndef HELLFIRE\r\n\t\tNetSendCmdString(1 << myplr, gszProductName);\r\n#else\r\n\t\tchar *local_10[3];\r\n\t\tchar pszStr[120];\r\n\t\tlocal_10[0] = \"Normal\";\r\n\t\tlocal_10[1] = \"Nightmare\";\r\n\t\tlocal_10[2] = \"Hell\";\r\n\t\tsprintf(pszStr, \"%s, mode = %s\", gszProductName, local_10[gnDifficulty]);\r\n\t\tNetSendCmdString(1 << myplr, pszStr);\r\n#endif\r\n\t\treturn;\r\n\tcase 'V':\r\n\t\tNetSendCmdString(1 << myplr, gszVersionNumber);\r\n\t\treturn;\r\n\tcase '!':\r\n\tcase '1':\r\n\t\tif (plr[myplr].SpdList[0]._itype != ITYPE_NONE && plr[myplr].SpdList[0]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '@':\r\n\tcase '2':\r\n\t\tif (plr[myplr].SpdList[1]._itype != ITYPE_NONE && plr[myplr].SpdList[1]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST + 1);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '#':\r\n\tcase '3':\r\n\t\tif (plr[myplr].SpdList[2]._itype != ITYPE_NONE && plr[myplr].SpdList[2]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST + 2);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '$':\r\n\tcase '4':\r\n\t\tif (plr[myplr].SpdList[3]._itype != ITYPE_NONE && plr[myplr].SpdList[3]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST + 3);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '%':\r\n\tcase '5':\r\n\t\tif (plr[myplr].SpdList[4]._itype != ITYPE_NONE && plr[myplr].SpdList[4]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST + 4);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '^':\r\n\tcase '6':\r\n\t\tif (plr[myplr].SpdList[5]._itype != ITYPE_NONE && plr[myplr].SpdList[5]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST + 5);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '&':\r\n\tcase '7':\r\n\t\tif (plr[myplr].SpdList[6]._itype != ITYPE_NONE && plr[myplr].SpdList[6]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST + 6);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '*':\r\n\tcase '8':\r\n#ifdef _DEBUG\r\n\t\tif (debug_mode_key_inverted_v || debug_mode_key_w) {\r\n\t\t\tNetSendCmd(TRUE, CMD_CHEAT_EXPERIENCE);\r\n\t\t\treturn;\r\n\t\t}\r\n#endif\r\n\t\tif (plr[myplr].SpdList[7]._itype != ITYPE_NONE && plr[myplr].SpdList[7]._itype != ITYPE_GOLD) {\r\n\t\t\tUseInvItem(myplr, INVITEM_BELT_FIRST + 7);\r\n\t\t}\r\n\t\treturn;\r\n#ifdef _DEBUG\r\n\tcase ')':\r\n\tcase '0':\r\n\t\tif (debug_mode_key_inverted_v) {\r\n\t\t\tif (arrowdebug > 2) {\r\n\t\t\t\tarrowdebug = 0;\r\n\t\t\t}\r\n\t\t\tif (arrowdebug == 0) {\r\n\t\t\t\tplr[myplr]._pIFlags &= ~ISPL_FIRE_ARROWS;\r\n\t\t\t\tplr[myplr]._pIFlags &= ~ISPL_LIGHT_ARROWS;\r\n\t\t\t}\r\n\t\t\tif (arrowdebug == 1) {\r\n\t\t\t\tplr[myplr]._pIFlags |= ISPL_FIRE_ARROWS;\r\n\t\t\t}\r\n\t\t\tif (arrowdebug == 2) {\r\n\t\t\t\tplr[myplr]._pIFlags |= ISPL_LIGHT_ARROWS;\r\n\t\t\t}\r\n\t\t\tarrowdebug++;\r\n\t\t}\r\n\t\treturn;\r\n\tcase ':':\r\n\t\tif (currlevel == 0 && debug_mode_key_w) {\r\n\t\t\tSetAllSpellsCheat();\r\n\t\t}\r\n\t\treturn;\r\n\tcase '[':\r\n\t\tif (currlevel == 0 && debug_mode_key_w) {\r\n\t\t\tTakeGoldCheat();\r\n\t\t}\r\n\t\treturn;\r\n\tcase ']':\r\n\t\tif (currlevel == 0 && debug_mode_key_w) {\r\n\t\t\tMaxSpellsCheat();\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'a':\r\n\t\tif (debug_mode_key_inverted_v) {\r\n\t\t\tspelldata[SPL_TELEPORT].sTownSpell = 1;\r\n\t\t\tplr[myplr]._pSplLvl[plr[myplr]._pSpell]++;\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'D':\r\n\t\tPrintDebugPlayer(TRUE);\r\n\t\treturn;\r\n\tcase 'd':\r\n\t\tPrintDebugPlayer(FALSE);\r\n\t\treturn;\r\n\tcase 'e':\r\n\t\tif (debug_mode_key_d) {\r\n\t\t\tsprintf(tempstr, \"EFlag = %i\", plr[myplr]._peflag);\r\n\t\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'L':\r\n\tcase 'l':\r\n\t\tif (debug_mode_key_inverted_v) {\r\n\t\t\tToggleLighting();\r\n\t\t}\r\n\t\treturn;\r\n\tcase 'M':\r\n\t\tNextDebugMonster();\r\n\t\treturn;\r\n\tcase 'm':\r\n\t\tGetDebugMonster();\r\n\t\treturn;\r\n\tcase 'R':\r\n\tcase 'r':\r\n\t\tsprintf(tempstr, \"seed = %i\", glSeedTbl[currlevel]);\r\n\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t\tsprintf(tempstr, \"Mid1 = %i : Mid2 = %i : Mid3 = %i\", glMid1Seed[currlevel], glMid2Seed[currlevel], glMid3Seed[currlevel]);\r\n\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t\tsprintf(tempstr, \"End = %i\", glEndSeed[currlevel]);\r\n\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t\treturn;\r\n\tcase 'T':\r\n\tcase 't':\r\n\t\tif (debug_mode_key_inverted_v) {\r\n\t\t\tsprintf(tempstr, \"PX = %i  PY = %i\", plr[myplr]._px, plr[myplr]._py);\r\n\t\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t\t\t// BUGFIX: out-of-bounds access to dungeon; should be `dPiece[cursmx][cursmy]`, was `dungeon[cursmx][cursmy]`.\r\n\t\t\tsprintf(tempstr, \"CX = %i  CY = %i  DP = %i\", cursmx, cursmy, dungeon[cursmx][cursmy]);\r\n\t\t\tNetSendCmdString(1 << myplr, tempstr);\r\n\t\t}\r\n\t\treturn;\r\n\tcase '|':\r\n\t\tif (currlevel == 0 && debug_mode_key_w) {\r\n\t\t\tGiveGoldCheat();\r\n\t\t}\r\n\t\treturn;\r\n\tcase '~':\r\n\t\tif (currlevel == 0 && debug_mode_key_w) {\r\n\t\t\tStoresCheat();\r\n\t\t}\r\n\t\treturn;\r\n#endif\r\n\t}\r\n}\r\n\r\nLRESULT CALLBACK DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tswitch (uMsg) {\r\n\tcase WM_KEYDOWN:\r\n\tcase WM_KEYUP:\r\n\tcase WM_CHAR:\r\n\tcase WM_SYSKEYDOWN:\r\n\tcase WM_SYSCOMMAND:\r\n\tcase WM_MOUSEMOVE:\r\n\t\treturn 0;\r\n\tcase WM_LBUTTONDOWN:\r\n\t\tif (sgbMouseDown != CLICK_NONE)\r\n\t\t\treturn 0;\r\n\t\tsgbMouseDown = CLICK_LEFT;\r\n\t\tSetCapture(hWnd);\r\n\t\treturn 0;\r\n\tcase WM_LBUTTONUP:\r\n\t\tif (sgbMouseDown != CLICK_LEFT)\r\n\t\t\treturn 0;\r\n\t\tsgbMouseDown = CLICK_NONE;\r\n\t\tReleaseCapture();\r\n\t\treturn 0;\r\n\tcase WM_RBUTTONDOWN:\r\n\t\tif (sgbMouseDown != CLICK_NONE)\r\n\t\t\treturn 0;\r\n\t\tsgbMouseDown = CLICK_RIGHT;\r\n\t\tSetCapture(hWnd);\r\n\t\treturn 0;\r\n\tcase WM_RBUTTONUP:\r\n\t\tif (sgbMouseDown != CLICK_RIGHT)\r\n\t\t\treturn 0;\r\n\t\tsgbMouseDown = CLICK_NONE;\r\n\t\tReleaseCapture();\r\n\t\treturn 0;\r\n\tcase WM_CAPTURECHANGED:\r\n\t\tif (hWnd == (HWND)lParam)\r\n\t\t\treturn 0;\r\n\t\tsgbMouseDown = CLICK_NONE;\r\n\t\treturn 0;\r\n\t}\r\n\r\n\treturn MainWndProc(hWnd, uMsg, wParam, lParam);\r\n}\r\n\r\nLRESULT CALLBACK GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tswitch (uMsg) {\r\n\tcase WM_KEYDOWN:\r\n\t\tPressKey(wParam);\r\n\t\treturn 0;\r\n\tcase WM_KEYUP:\r\n\t\tReleaseKey(wParam);\r\n\t\treturn 0;\r\n\tcase WM_CHAR:\r\n\t\tPressChar(wParam);\r\n\t\treturn 0;\r\n\tcase WM_SYSKEYDOWN:\r\n\t\tif (PressSysKey(wParam))\r\n\t\t\treturn 0;\r\n\t\tbreak;\r\n\tcase WM_SYSCOMMAND:\r\n\t\tif (wParam == SC_CLOSE) {\r\n\t\t\tgbRunGame = FALSE;\r\n\t\t\tgbRunGameResult = FALSE;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase WM_MOUSEMOVE:\r\n\t\tMouseX = LOWORD(lParam); // BUGFIX (short)LOWORD coords are signed\r\n\t\tMouseY = HIWORD(lParam); // BUGFIX (short)HIWORD coords are signed\r\n\t\tgmenu_on_mouse_move();\r\n\t\treturn 0;\r\n\tcase WM_LBUTTONDOWN:\r\n\t\tMouseX = LOWORD(lParam); // BUGFIX (short)LOWORD coords are signed\r\n\t\tMouseY = HIWORD(lParam); // BUGFIX (short)HIWORD coords are signed\r\n\t\tif (sgbMouseDown == CLICK_NONE) {\r\n\t\t\tsgbMouseDown = CLICK_LEFT;\r\n\t\t\tSetCapture(hWnd);\r\n\t\t\ttrack_repeat_walk(LeftMouseDown(wParam));\r\n\t\t}\r\n\t\treturn 0;\r\n\tcase WM_LBUTTONUP:\r\n\t\tMouseX = LOWORD(lParam); // BUGFIX (short)LOWORD coords are signed\r\n\t\tMouseY = HIWORD(lParam); // BUGFIX (short)HIWORD coords are signed\r\n\t\tif (sgbMouseDown == CLICK_LEFT) {\r\n\t\t\tsgbMouseDown = CLICK_NONE;\r\n\t\t\tLeftMouseUp();\r\n\t\t\ttrack_repeat_walk(FALSE);\r\n\t\t\tReleaseCapture();\r\n\t\t}\r\n\t\treturn 0;\r\n\tcase WM_RBUTTONDOWN:\r\n\t\tMouseX = LOWORD(lParam); // BUGFIX (short)LOWORD coords are signed\r\n\t\tMouseY = HIWORD(lParam); // BUGFIX (short)HIWORD coords are signed\r\n\t\tif (sgbMouseDown == CLICK_NONE) {\r\n\t\t\tsgbMouseDown = CLICK_RIGHT;\r\n\t\t\tSetCapture(hWnd);\r\n\t\t\tRightMouseDown();\r\n\t\t}\r\n\t\treturn 0;\r\n\tcase WM_RBUTTONUP:\r\n\t\tMouseX = LOWORD(lParam); // BUGFIX (short)LOWORD coords are signed\r\n\t\tMouseY = HIWORD(lParam); // BUGFIX (short)HIWORD coords are signed\r\n\t\tif (sgbMouseDown == CLICK_RIGHT) {\r\n\t\t\tsgbMouseDown = CLICK_NONE;\r\n\t\t\tReleaseCapture();\r\n\t\t}\r\n\t\treturn 0;\r\n\tcase WM_CAPTURECHANGED:\r\n\t\tif (hWnd != (HWND)lParam) {\r\n\t\t\tsgbMouseDown = CLICK_NONE;\r\n\t\t\ttrack_repeat_walk(FALSE);\r\n\t\t}\r\n\t\tbreak;\r\n\tcase WM_DIABNEXTLVL:\r\n\tcase WM_DIABPREVLVL:\r\n\tcase WM_DIABRTNLVL:\r\n\tcase WM_DIABSETLVL:\r\n\tcase WM_DIABWARPLVL:\r\n\tcase WM_DIABTOWNWARP:\r\n\tcase WM_DIABTWARPUP:\r\n\tcase WM_DIABRETOWN:\r\n\t\tif (gbMaxPlayers > 1)\r\n\t\t\tpfile_write_hero();\r\n\t\tnthread_ignore_mutex(TRUE);\r\n\t\tPaletteFadeOut(8);\r\n\t\tsound_stop();\r\n\t\tmusic_stop();\r\n\t\ttrack_repeat_walk(FALSE);\r\n\t\tsgbMouseDown = CLICK_NONE;\r\n\t\tReleaseCapture();\r\n\t\tShowProgress(uMsg);\r\n\t\tforce_redraw = 255;\r\n\t\tDrawAndBlit();\r\n\t\tif (gbRunGame)\r\n\t\t\tPaletteFadeIn(8);\r\n\t\tnthread_ignore_mutex(FALSE);\r\n\t\tgbGameLoopStartup = TRUE;\r\n\t\treturn 0;\r\n\t}\r\n\r\n\treturn MainWndProc(hWnd, uMsg, wParam, lParam);\r\n}\r\n\r\nvoid LoadLvlGFX()\r\n{\r\n\tassert(!pDungeonCels);\r\n\r\n\tswitch (leveltype) {\r\n\tcase DTYPE_TOWN:\r\n#ifdef HELLFIRE\r\n\t\tpDungeonCels = LoadFileInMem(\"NLevels\\\\TownData\\\\Town.CEL\", NULL);\r\n\t\tpMegaTiles = LoadFileInMem(\"NLevels\\\\TownData\\\\Town.TIL\", NULL);\r\n\t\tpLevelPieces = LoadFileInMem(\"NLevels\\\\TownData\\\\Town.MIN\", NULL);\r\n#else\r\n\t\tpDungeonCels = LoadFileInMem(\"Levels\\\\TownData\\\\Town.CEL\", NULL);\r\n\t\tpMegaTiles = LoadFileInMem(\"Levels\\\\TownData\\\\Town.TIL\", NULL);\r\n\t\tpLevelPieces = LoadFileInMem(\"Levels\\\\TownData\\\\Town.MIN\", NULL);\r\n#endif\r\n\t\tpSpecialCels = LoadFileInMem(\"Levels\\\\TownData\\\\TownS.CEL\", NULL);\r\n\t\tbreak;\r\n\tcase DTYPE_CATHEDRAL:\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 21) {\r\n#endif\r\n\t\t\tpDungeonCels = LoadFileInMem(\"Levels\\\\L1Data\\\\L1.CEL\", NULL);\r\n\t\t\tpMegaTiles = LoadFileInMem(\"Levels\\\\L1Data\\\\L1.TIL\", NULL);\r\n\t\t\tpLevelPieces = LoadFileInMem(\"Levels\\\\L1Data\\\\L1.MIN\", NULL);\r\n\t\t\tpSpecialCels = LoadFileInMem(\"Levels\\\\L1Data\\\\L1S.CEL\", NULL);\r\n#ifdef HELLFIRE\r\n\t\t} else {\r\n\t\t\tpDungeonCels = LoadFileInMem(\"NLevels\\\\L5Data\\\\L5.CEL\", NULL);\r\n\t\t\tpMegaTiles = LoadFileInMem(\"NLevels\\\\L5Data\\\\L5.TIL\", NULL);\r\n\t\t\tpLevelPieces = LoadFileInMem(\"NLevels\\\\L5Data\\\\L5.MIN\", NULL);\r\n\t\t\tpSpecialCels = LoadFileInMem(\"NLevels\\\\L5Data\\\\L5S.CEL\", NULL);\r\n\t\t}\r\n#endif\r\n\t\tbreak;\r\n#ifndef SPAWN\r\n\tcase DTYPE_CATACOMBS:\r\n\t\tpDungeonCels = LoadFileInMem(\"Levels\\\\L2Data\\\\L2.CEL\", NULL);\r\n\t\tpMegaTiles = LoadFileInMem(\"Levels\\\\L2Data\\\\L2.TIL\", NULL);\r\n\t\tpLevelPieces = LoadFileInMem(\"Levels\\\\L2Data\\\\L2.MIN\", NULL);\r\n\t\tpSpecialCels = LoadFileInMem(\"Levels\\\\L2Data\\\\L2S.CEL\", NULL);\r\n\t\tbreak;\r\n\tcase DTYPE_CAVES:\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\tpDungeonCels = LoadFileInMem(\"Levels\\\\L3Data\\\\L3.CEL\", NULL);\r\n\t\t\tpMegaTiles = LoadFileInMem(\"Levels\\\\L3Data\\\\L3.TIL\", NULL);\r\n\t\t\tpLevelPieces = LoadFileInMem(\"Levels\\\\L3Data\\\\L3.MIN\", NULL);\r\n#ifdef HELLFIRE\r\n\t\t} else {\r\n\t\t\tpDungeonCels = LoadFileInMem(\"NLevels\\\\L6Data\\\\L6.CEL\", NULL);\r\n\t\t\tpMegaTiles = LoadFileInMem(\"NLevels\\\\L6Data\\\\L6.TIL\", NULL);\r\n\t\t\tpLevelPieces = LoadFileInMem(\"NLevels\\\\L6Data\\\\L6.MIN\", NULL);\r\n\t\t}\r\n#endif\r\n\t\tpSpecialCels = LoadFileInMem(\"Levels\\\\L1Data\\\\L1S.CEL\", NULL);\r\n\t\tbreak;\r\n\tcase DTYPE_HELL:\r\n\t\tpDungeonCels = LoadFileInMem(\"Levels\\\\L4Data\\\\L4.CEL\", NULL);\r\n\t\tpMegaTiles = LoadFileInMem(\"Levels\\\\L4Data\\\\L4.TIL\", NULL);\r\n\t\tpLevelPieces = LoadFileInMem(\"Levels\\\\L4Data\\\\L4.MIN\", NULL);\r\n\t\tpSpecialCels = LoadFileInMem(\"Levels\\\\L2Data\\\\L2S.CEL\", NULL);\r\n\t\tbreak;\r\n#endif\r\n\tdefault:\r\n\t\tapp_fatal(\"LoadLvlGFX\");\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid LoadAllGFX()\r\n{\r\n\tassert(!pSpeedCels);\r\n\tpSpeedCels = DiabloAllocPtr(0x100000);\r\n\tIncProgress();\r\n\tIncProgress();\r\n\tInitObjectGFX();\r\n\tIncProgress();\r\n\tInitMissileGFX();\r\n\tIncProgress();\r\n}\r\n\r\n/**\r\n * @param lvldir method of entry\r\n */\r\nvoid CreateLevel(int lvldir)\r\n{\r\n\tswitch (leveltype) {\r\n\tcase DTYPE_TOWN:\r\n\t\tCreateTown(lvldir);\r\n\t\tInitTownTriggers();\r\n\t\tLoadRndLvlPal(0);\r\n\t\tbreak;\r\n\tcase DTYPE_CATHEDRAL:\r\n\t\tCreateL5Dungeon(glSeedTbl[currlevel], lvldir);\r\n\t\tInitL1Triggers();\r\n\t\tFreeupstairs();\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 21) {\r\n\t\t\tLoadRndLvlPal(1);\r\n\t\t} else {\r\n\t\t\tLoadRndLvlPal(5);\r\n\t\t}\r\n#else\r\n\t\tLoadRndLvlPal(1);\r\n#endif\r\n\t\tbreak;\r\n#ifndef SPAWN\r\n\tcase DTYPE_CATACOMBS:\r\n\t\tCreateL2Dungeon(glSeedTbl[currlevel], lvldir);\r\n\t\tInitL2Triggers();\r\n\t\tFreeupstairs();\r\n\t\tLoadRndLvlPal(2);\r\n\t\tbreak;\r\n\tcase DTYPE_CAVES:\r\n\t\tCreateL3Dungeon(glSeedTbl[currlevel], lvldir);\r\n\t\tInitL3Triggers();\r\n\t\tFreeupstairs();\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17) {\r\n\t\t\tLoadRndLvlPal(3);\r\n\t\t} else {\r\n\t\t\tLoadRndLvlPal(6);\r\n\t\t}\r\n#else\r\n\t\tLoadRndLvlPal(3);\r\n#endif\r\n\t\tbreak;\r\n\tcase DTYPE_HELL:\r\n\t\tCreateL4Dungeon(glSeedTbl[currlevel], lvldir);\r\n\t\tInitL4Triggers();\r\n\t\tFreeupstairs();\r\n\t\tLoadRndLvlPal(4);\r\n\t\tbreak;\r\n#endif\r\n\tdefault:\r\n\t\tapp_fatal(\"CreateLevel\");\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid LoadGameLevel(BOOL firstflag, int lvldir)\r\n{\r\n\tint i, j;\r\n\tBOOL visited;\r\n\r\n\tif (setseed)\r\n\t\tglSeedTbl[currlevel] = setseed;\r\n\r\n\tmusic_stop();\r\n\tSetCursor_(CURSOR_HAND);\r\n\tSetRndSeed(glSeedTbl[currlevel]);\r\n\tIncProgress();\r\n\tMakeLightTable();\r\n\tLoadLvlGFX();\r\n\tIncProgress();\r\n\r\n\tif (firstflag) {\r\n\t\tInitInv();\r\n\t\tInitItemGFX();\r\n\t\tInitQuestText();\r\n\r\n\t\tfor (i = 0; i < gbMaxPlayers; i++)\r\n\t\t\tInitPlrGFXMem(i);\r\n\r\n\t\tInitStores();\r\n\t\tInitAutomapOnce();\r\n\t\tInitHelp();\r\n\t}\r\n\r\n\tSetRndSeed(glSeedTbl[currlevel]);\r\n\r\n\tif (leveltype == DTYPE_TOWN)\r\n\t\tSetupTownStores();\r\n\r\n\tIncProgress();\r\n\tInitAutomap();\r\n\r\n\tif (leveltype != DTYPE_TOWN && lvldir != ENTRY_LOAD) {\r\n\t\tInitLighting();\r\n\t\tInitVision();\r\n\t}\r\n\r\n\tInitLevelMonsters();\r\n\tIncProgress();\r\n\r\n\tif (!setlevel) {\r\n\t\tCreateLevel(lvldir);\r\n\t\tIncProgress();\r\n\t\tFillSolidBlockTbls();\r\n\t\tSetRndSeed(glSeedTbl[currlevel]);\r\n\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tGetLevelMTypes();\r\n\t\t\tInitThemes();\r\n\t\t\tLoadAllGFX();\r\n\t\t} else {\r\n\t\t\tInitMissileGFX();\r\n\t\t}\r\n\r\n\t\tIncProgress();\r\n\r\n\t\tif (lvldir == ENTRY_RTNLVL)\r\n\t\t\tGetReturnLvlPos();\r\n\t\tif (lvldir == ENTRY_WARPLVL)\r\n\t\t\tGetPortalLvlPos();\r\n\r\n\t\tIncProgress();\r\n\r\n\t\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\t\tif (plr[i].plractive && currlevel == plr[i].plrlevel) {\r\n\t\t\t\tInitPlayerGFX(i);\r\n\t\t\t\tif (lvldir != ENTRY_LOAD)\r\n\t\t\t\t\tInitPlayer(i, firstflag);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tPlayDungMsgs();\r\n\t\tInitMultiView();\r\n\t\tIncProgress();\r\n\r\n\t\tvisited = FALSE;\r\n\t\tfor (i = 0; i < gbMaxPlayers; i++) {\r\n\t\t\tif (plr[i].plractive)\r\n\t\t\t\tvisited = visited || plr[i]._pLvlVisited[currlevel];\r\n\t\t}\r\n\r\n\t\tSetRndSeed(glSeedTbl[currlevel]);\r\n\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tif (firstflag || lvldir == ENTRY_LOAD || !plr[myplr]._pLvlVisited[currlevel] || gbMaxPlayers != 1) {\r\n\t\t\t\tHoldThemeRooms();\r\n\t\t\t\tglMid1Seed[currlevel] = GetRndSeed();\r\n\t\t\t\tInitMonsters();\r\n\t\t\t\tglMid2Seed[currlevel] = GetRndSeed();\r\n\t\t\t\tInitObjects();\r\n\t\t\t\tInitItems();\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (currlevel < 17)\r\n#endif\r\n\t\t\t\t\tCreateThemeRooms();\r\n\t\t\t\tglMid3Seed[currlevel] = GetRndSeed();\r\n\t\t\t\tInitMissiles();\r\n\t\t\t\tInitDead();\r\n\t\t\t\tglEndSeed[currlevel] = GetRndSeed();\r\n\r\n\t\t\t\tif (gbMaxPlayers != 1)\r\n\t\t\t\t\tDeltaLoadLevel();\r\n\r\n\t\t\t\tIncProgress();\r\n\t\t\t\tSavePreLighting();\r\n\t\t\t} else {\r\n\t\t\t\tInitMonsters();\r\n\t\t\t\tInitMissiles();\r\n\t\t\t\tInitDead();\r\n\t\t\t\tIncProgress();\r\n\t\t\t\tLoadLevel();\r\n\t\t\t\tIncProgress();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tfor (j = 0; j < MAXDUNY; j++)\r\n\t\t\t\t\tdFlags[i][j] |= BFLAG_LIT;\r\n\t\t\t}\r\n\r\n\t\t\tInitTowners();\r\n\t\t\tInitItems();\r\n\t\t\tInitMissiles();\r\n\t\t\tIncProgress();\r\n\r\n\t\t\tif (!firstflag && lvldir != ENTRY_LOAD && plr[myplr]._pLvlVisited[currlevel] && gbMaxPlayers == 1)\r\n\t\t\t\tLoadLevel();\r\n\t\t\tif (gbMaxPlayers != 1)\r\n\t\t\t\tDeltaLoadLevel();\r\n\r\n\t\t\tIncProgress();\r\n\t\t}\r\n\t\tif (gbMaxPlayers == 1)\r\n\t\t\tResyncQuests();\r\n\t\telse\r\n\t\t\tResyncMPQuests();\r\n#ifndef SPAWN\r\n\t} else {\r\n\t\tassert(!pSpeedCels);\r\n\t\tpSpeedCels = DiabloAllocPtr(0x100000);\r\n\t\tLoadSetMap();\r\n\t\tIncProgress();\r\n\t\tGetLevelMTypes();\r\n\r\n\t\t// BUGFIX: must invoke FillSolidBlockTbls prior to invoking InitMonsters,\r\n\t\t// as placement of unique monsters in set levels require initialization\r\n\t\t// of nSolidTable. In particular, InitMonsters -> PlaceQuestMonsters ->\r\n\t\t// PlaceUniqueMonst -> MonstPlace -> SolidLoc, which requires nSolidTable\r\n\t\t// to be initialized.\r\n\r\n\t\tInitMonsters();\r\n\t\tInitMissileGFX();\r\n\t\tInitDead();\r\n\t\tFillSolidBlockTbls();\r\n\t\tIncProgress();\r\n\r\n\t\tif (lvldir == ENTRY_WARPLVL)\r\n\t\t\tGetPortalLvlPos();\r\n\r\n\t\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\t\tif (plr[i].plractive && currlevel == plr[i].plrlevel) {\r\n\t\t\t\tInitPlayerGFX(i);\r\n\t\t\t\tif (lvldir != ENTRY_LOAD)\r\n\t\t\t\t\tInitPlayer(i, firstflag);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tInitMultiView();\r\n\t\tIncProgress();\r\n\r\n\t\tif (firstflag || lvldir == ENTRY_LOAD || !plr[myplr]._pSLvlVisited[setlvlnum]) {\r\n\t\t\tInitItems();\r\n\t\t\tSavePreLighting();\r\n\t\t} else {\r\n\t\t\tLoadLevel();\r\n\t\t}\r\n\r\n\t\tInitMissiles();\r\n\t\tIncProgress();\r\n#endif\r\n\t}\r\n\r\n\tSyncPortals();\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (plr[i].plractive && plr[i].plrlevel == currlevel && (!plr[i]._pLvlChanging || i == myplr)) {\r\n\t\t\tif (plr[i]._pHitPoints > 0) {\r\n\t\t\t\tif (gbMaxPlayers == 1)\r\n\t\t\t\t\tdPlayer[plr[i]._px][plr[i]._py] = i + 1;\r\n\t\t\t\telse\r\n\t\t\t\t\tSyncInitPlrPos(i);\r\n\t\t\t} else {\r\n\t\t\t\tdFlags[plr[i]._px][plr[i]._py] |= BFLAG_DEAD_PLAYER;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_TOWN)\r\n\t\tSetDungeonMicros();\r\n\r\n\tInitLightMax();\r\n\tIncProgress();\r\n\tIncProgress();\r\n\r\n\tif (firstflag) {\r\n\t\tInitControlPan();\r\n\t\tIncProgress();\r\n\t}\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tProcessLightList();\r\n\t\tProcessVisionList();\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel >= 21) {\r\n\t\tif (currlevel == 21) {\r\n\t\t\tCornerstoneLoad(CornerStone.x, CornerStone.y);\r\n\t\t}\r\n\t\tif (quests[Q_NAKRUL]._qactive == QUEST_DONE && currlevel == 24) {\r\n\t\t\tSyncNakrulRoom();\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel >= 17)\r\n\t\tmusic_start(currlevel > 20 ? TMUSIC_L5 : TMUSIC_L6);\r\n\telse\r\n\t\tmusic_start(leveltype);\r\n#else\r\n\tmusic_start(leveltype);\r\n#endif\r\n\r\n\twhile (!IncProgress())\r\n\t\t;\r\n\r\n#ifndef SPAWN\r\n\tif (setlevel && setlvlnum == SL_SKELKING && quests[Q_SKELKING]._qactive == QUEST_ACTIVE)\r\n\t\tPlaySFX(USFX_SKING1);\r\n#endif\r\n}\r\n\r\nstatic void game_logic()\r\n{\r\n\tif (PauseMode == 2) {\r\n\t\treturn;\r\n\t}\r\n\tif (PauseMode == 1) {\r\n\t\tPauseMode = 2;\r\n\t}\r\n\tif (gbMaxPlayers == 1 && gmenu_is_active()) {\r\n\t\tforce_redraw |= 1;\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!gmenu_is_active() && sgnTimeoutCurs == CURSOR_NONE) {\r\n\t\tCheckCursMove();\r\n\t\ttrack_process();\r\n\t}\r\n\tif (gbProcessPlayers) {\r\n\t\tProcessPlayers();\r\n\t}\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tProcessMonsters();\r\n\t\tProcessObjects();\r\n\t\tProcessMissiles();\r\n\t\tProcessItems();\r\n\t\tProcessLightList();\r\n\t\tProcessVisionList();\r\n\t} else {\r\n\t\tProcessTowners();\r\n\t\tProcessItems();\r\n\t\tProcessMissiles();\r\n\t}\r\n\r\n#ifdef _DEBUG\r\n\tif (debug_mode_key_inverted_v && GetAsyncKeyState(VK_SHIFT) & 0x8000) {\r\n\t\tScrollView();\r\n\t}\r\n#endif\r\n\r\n\tsound_update();\r\n\tClearPlrMsg();\r\n\tCheckTriggers();\r\n\tCheckQuests();\r\n\tforce_redraw |= 1;\r\n\tpfile_update(FALSE);\r\n}\r\n\r\nstatic void timeout_cursor(BOOL bTimeout)\r\n{\r\n\tif (bTimeout) {\r\n\t\tif (sgnTimeoutCurs == CURSOR_NONE && sgbMouseDown == CLICK_NONE) {\r\n\t\t\tsgnTimeoutCurs = pcurs;\r\n\t\t\tmulti_net_ping();\r\n\t\t\tClearPanel();\r\n\t\t\tAddPanelString(\"-- Network timeout --\", TRUE);\r\n\t\t\tAddPanelString(\"-- Waiting for players --\", TRUE);\r\n\t\t\tNewCursor(CURSOR_HOURGLASS);\r\n\t\t\tforce_redraw = 255;\r\n\t\t}\r\n\t\tscrollrt_draw_game_screen(TRUE);\r\n\t} else if (sgnTimeoutCurs != CURSOR_NONE) {\r\n\t\tSetCursor_(sgnTimeoutCurs);\r\n\t\tsgnTimeoutCurs = CURSOR_NONE;\r\n\t\tClearPanel();\r\n\t\tforce_redraw = 255;\r\n\t}\r\n}\r\n\r\n/**\r\n * @param bStartup Process additional ticks before returning\r\n */\r\nvoid game_loop(BOOL bStartup)\r\n{\r\n\tint i;\r\n\r\n\ti = bStartup ? 60 : 3;\r\n\r\n\twhile (i--) {\r\n\t\tif (!multi_handle_delta()) {\r\n\t\t\ttimeout_cursor(TRUE);\r\n\t\t\tbreak;\r\n\t\t} else {\r\n\t\t\ttimeout_cursor(FALSE);\r\n\t\t\tgame_logic();\r\n\t\t}\r\n\t\tif (!gbRunGame || gbMaxPlayers == 1 || !nthread_has_500ms_passed(TRUE))\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid diablo_color_cyc_logic()\r\n{\r\n\tDWORD tc;\r\n\r\n\ttc = GetTickCount();\r\n\tif (tc - color_cycle_timer >= 50) {\r\n\t\tcolor_cycle_timer = tc;\r\n#ifndef HELLFIRE\r\n\t\tif (!palette_get_color_cycling())\r\n\t\t\treturn;\r\n#endif\r\n\t\tif (leveltype == DTYPE_HELL) {\r\n\t\t\tlighting_color_cycling();\r\n#ifdef HELLFIRE\r\n\t\t} else if (currlevel >= 21) {\r\n\t\t\tpalette_update_crypt();\r\n\t\t} else if (currlevel >= 17) {\r\n\t\t\tpalette_update_hive();\r\n#endif\r\n\t\t} else if (leveltype == DTYPE_CAVES) {\r\n\t\t\tif (fullscreen)\r\n\t\t\t\tpalette_update_caves();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic PlayerStruct *get_plr_mem(PlayerStruct *p)\r\n{\r\n\tvoid *r;\r\n\tPlayerStruct *pPlayer;\r\n\r\n\tr = malloc(rand() & 0x7FFF);\r\n\tpPlayer = (PlayerStruct *)malloc(sizeof(PlayerStruct) * MAX_PLRS);\r\n\r\n\tif (r != NULL) {\r\n\t\tfree(r);\r\n\t}\r\n\tif (pPlayer == NULL) {\r\n\t\treturn p;\r\n\t}\r\n\tif (p != NULL) {\r\n\t\tmemcpy(pPlayer, p, sizeof(PlayerStruct) * MAX_PLRS);\r\n\t\tfree(p);\r\n\t}\r\n\r\n\treturn pPlayer;\r\n}\r\n\r\nvoid alloc_plr()\r\n{\r\n\tplr = get_plr_mem(NULL);\r\n\r\n\tif (plr == NULL) {\r\n\t\tapp_fatal(\"Unable to initialize memory\");\r\n\t}\r\n\r\n\tmemset(plr, 0, sizeof(PlayerStruct) * MAX_PLRS);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/diablo.h",
    "content": "/**\r\n * @file diablo.h\r\n *\r\n * Interface of the main game initialization functions.\r\n */\r\n#ifndef __DIABLO_H__\r\n#define __DIABLO_H__\r\n\r\nextern HWND ghMainWnd;\r\nextern DWORD glSeedTbl[NUMLEVELS];\r\nextern int gnLevelTypeTbl[NUMLEVELS];\r\nextern int MouseX;\r\nextern int MouseY;\r\nextern BOOL gbRunGame;\r\nextern BOOL gbRunGameResult;\r\nextern BOOL zoomflag;\r\nextern BOOL gbProcessPlayers;\r\nextern BOOL gbLoadGame;\r\nextern HINSTANCE ghInst;\r\nextern int DebugMonsters[10];\r\nextern BOOLEAN cineflag;\r\nextern int force_redraw;\r\nextern BOOL visiondebug;\r\n/** unused */\r\nextern BOOL light4flag;\r\nextern BOOL leveldebug;\r\nextern BOOL monstdebug;\r\n/** unused */\r\nextern int debugmonsttypes;\r\nextern int PauseMode;\r\n#ifdef HELLFIRE\r\nextern BOOLEAN UseTheoQuest;\r\nextern BOOLEAN UseCowFarmer;\r\nextern BOOLEAN UseNestArt;\r\nextern BOOLEAN UseBardTest;\r\nextern BOOLEAN UseBarbarianTest;\r\nextern BOOLEAN UseMultiTest;\r\n#endif\r\nextern char sgbMouseDown;\r\n\r\nvoid FreeGameMem();\r\nBOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer);\r\nint APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);\r\nBOOL PressEscKey();\r\nLRESULT CALLBACK DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r\nLRESULT CALLBACK GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r\nvoid LoadGameLevel(BOOL firstflag, int lvldir);\r\nvoid game_loop(BOOL bStartup);\r\nvoid diablo_color_cyc_logic();\r\n#ifdef HELLFIRE\r\nvoid alloc_plr();\r\n#endif\r\n\r\n/* rdata */\r\n\r\nextern BOOL fullscreen;\r\n#ifdef _DEBUG\r\nextern int questdebug;\r\nextern int debug_mode_key_w;\r\nextern int debug_mode_key_inverted_v;\r\nextern int debug_mode_dollar_sign;\r\nextern int debug_mode_key_d;\r\nextern int debug_mode_key_i;\r\nextern int dbgplr;\r\nextern int dbgqst;\r\nextern int dbgmon;\r\nextern int frameflag;\r\nextern int frameend;\r\nextern int framerate;\r\nextern int framestart;\r\n#endif\r\nextern BOOL FriendlyMode;\r\n\r\n#endif /* __DIABLO_H__ */\r\n"
  },
  {
    "path": "Source/doom.cpp",
    "content": "/**\r\n * @file doom.cpp\r\n *\r\n * Implementation of the map of the stars quest.\r\n */\r\n#include \"all.h\"\r\n\r\nint doom_quest_time;\r\nint doom_stars_drawn;\r\nBYTE *pDoomCel;\r\nDIABOOL doomflag;\r\nint DoomQuestState;\r\n\r\n/*\r\nvoid doom_reset_state()\r\n{\r\n    if (DoomQuestState <= 0) {\r\n        DoomQuestState = 0;\r\n    }\r\n}\r\n\r\nvoid doom_play_movie()\r\n{\r\n    if (DoomQuestState < 36001) {\r\n        DoomQuestState++;\r\n        if (DoomQuestState == 36001) {\r\n            PlayInGameMovie(\"gendata\\\\doom.smk\");\r\n            DoomQuestState++;\r\n        }\r\n    }\r\n}\r\n*/\r\n\r\nint doom_get_frame_from_time()\r\n{\r\n\tif (DoomQuestState == 36001) {\r\n\t\treturn 31;\r\n\t}\r\n\r\n\treturn DoomQuestState / 1200;\r\n}\r\n\r\nvoid doom_cleanup()\r\n{\r\n#ifdef HELLFIRE\r\n\tif (pDoomCel != NULL) {\r\n\t\tMemFreeDbg(pDoomCel);\r\n\t\tpDoomCel = NULL;\r\n\t}\r\n#else\r\n\tMemFreeDbg(pDoomCel);\r\n#endif\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic BOOLEAN doom_alloc_cel()\r\n#else\r\nstatic void doom_alloc_cel()\r\n#endif\r\n{\r\n#ifdef HELLFIRE\r\n\tdoom_cleanup();\r\n\tpDoomCel = DiabloAllocPtr(0x39000);\r\n\treturn pDoomCel ? TRUE : FALSE;\r\n#else\r\n\tpDoomCel = DiabloAllocPtr(0x38000);\r\n#endif\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic BOOLEAN doom_load_graphics()\r\n#else\r\nstatic void doom_load_graphics()\r\n#endif\r\n{\r\n#ifdef HELLFIRE\r\n\tBOOLEAN ret;\r\n\r\n\tret = FALSE;\r\n\tstrcpy(tempstr, \"Items\\\\Map\\\\MapZtown.CEL\");\r\n\tif (LoadFileWithMem(tempstr, pDoomCel))\r\n\t\tret = TRUE;\r\n\treturn ret;\r\n#else\r\n\tif (doom_quest_time == 31) {\r\n\t\tstrcpy(tempstr, \"Items\\\\Map\\\\MapZDoom.CEL\");\r\n\t} else if (doom_quest_time < 10) {\r\n\t\tsprintf(tempstr, \"Items\\\\Map\\\\MapZ000%i.CEL\", doom_quest_time);\r\n\t} else {\r\n\t\tsprintf(tempstr, \"Items\\\\Map\\\\MapZ00%i.CEL\", doom_quest_time);\r\n\t}\r\n\tLoadFileWithMem(tempstr, pDoomCel);\r\n#endif\r\n}\r\n\r\nvoid doom_init()\r\n{\r\n#ifdef HELLFIRE\r\n\tif (doom_alloc_cel()) {\r\n\t\tdoom_quest_time = doom_get_frame_from_time() == 31 ? 31 : 0;\r\n\t\tif (doom_load_graphics()) {\r\n\t\t\tdoomflag = TRUE;\r\n\t\t} else {\r\n\t\t\tdoom_close();\r\n\t\t}\r\n\t}\r\n#else\r\n\tdoomflag = TRUE;\r\n\tdoom_alloc_cel();\r\n\tdoom_quest_time = doom_get_frame_from_time() == 31 ? 31 : 0;\r\n\tdoom_load_graphics();\r\n#endif\r\n}\r\n\r\nvoid doom_close()\r\n{\r\n#ifndef HELLFIRE\r\n\tif (doomflag) {\r\n#endif\r\n\t\tdoomflag = FALSE;\r\n\t\tdoom_cleanup();\r\n#ifndef HELLFIRE\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid doom_draw()\r\n{\r\n\tif (!doomflag) {\r\n\t\treturn;\r\n\t}\r\n#ifndef HELLFIRE\r\n\tif (doom_quest_time != 31) {\r\n\t\tdoom_stars_drawn++;\r\n\t\tif (doom_stars_drawn >= 5) {\r\n\t\t\tdoom_stars_drawn = 0;\r\n\t\t\tdoom_quest_time++;\r\n\t\t\tif (doom_quest_time > doom_get_frame_from_time()) {\r\n\t\t\t\tdoom_quest_time = 0;\r\n\t\t\t}\r\n\t\t\tdoom_load_graphics();\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tCelDraw(SCREEN_X, PANEL_Y - 1, pDoomCel, 1, 640);\r\n}\r\n"
  },
  {
    "path": "Source/doom.h",
    "content": "/**\r\n * @file doom.h\r\n *\r\n * Interface of the map of the stars quest.\r\n */\r\n#ifndef __DOOM_H__\r\n#define __DOOM_H__\r\n\r\nextern DIABOOL doomflag;\r\nextern int DoomQuestState;\r\n\r\nvoid doom_init();\r\nvoid doom_close();\r\nvoid doom_draw();\r\n\r\n#endif /* __DOOM_H__ */\r\n"
  },
  {
    "path": "Source/drlg_l1.cpp",
    "content": "/**\r\n * @file drlg_l1.cpp\r\n *\r\n * Implementation of the cathedral level generation algorithms.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Represents a tile ID map of twice the size, repeating each tile of the original map in blocks of 4. */\r\nBYTE L5dungeon[80][80];\r\nBYTE L5dflags[DMAXX][DMAXY];\r\n/** Specifies whether a single player quest DUN has been loaded. */\r\nBOOL L5setloadflag;\r\n/** Specifies whether to generate a horizontal room at position 1 in the Cathedral. */\r\nint HR1;\r\n/** Specifies whether to generate a horizontal room at position 2 in the Cathedral. */\r\nint HR2;\r\n/** Specifies whether to generate a horizontal room at position 3 in the Cathedral. */\r\nint HR3;\r\n#ifdef HELLFIRE\r\nint UberRow;\r\nint UberCol;\r\nint dword_577368;\r\nint IsUberRoomOpened;\r\nint UberLeverRow;\r\nint UberLeverCol;\r\nint IsUberLeverActivated;\r\nint UberDiabloMonsterIndex;\r\n#endif\r\n/** Specifies whether to generate a vertical room at position 1 in the Cathedral. */\r\nBOOL VR1;\r\n/** Specifies whether to generate a vertical room at position 2 in the Cathedral. */\r\nBOOL VR2;\r\n/** Specifies whether to generate a vertical room at position 3 in the Cathedral. */\r\nBOOL VR3;\r\n/** Contains the contents of the single player quest DUN file. */\r\nBYTE *L5pSetPiece;\r\n\r\n/** Contains shadows for 2x2 blocks of base tile IDs in the Cathedral. */\r\nconst ShadowStruct SPATS[37] = {\r\n\t// clang-format off\r\n\t// strig, s1, s2, s3, nv1, nv2, nv3\r\n\t{      7, 13,  0, 13, 144,   0, 142 },\r\n\t{     16, 13,  0, 13, 144,   0, 142 },\r\n\t{     15, 13,  0, 13, 145,   0, 142 },\r\n\t{      5, 13, 13, 13, 152, 140, 139 },\r\n\t{      5, 13,  1, 13, 143, 146, 139 },\r\n\t{      5, 13, 13,  2, 143, 140, 148 },\r\n\t{      5,  0,  1,  2,   0, 146, 148 },\r\n\t{      5, 13, 11, 13, 143, 147, 139 },\r\n\t{      5, 13, 13, 12, 143, 140, 149 },\r\n\t{      5, 13, 11, 12, 150, 147, 149 },\r\n\t{      5, 13,  1, 12, 143, 146, 149 },\r\n\t{      5, 13, 11,  2, 143, 147, 148 },\r\n\t{      9, 13, 13, 13, 144, 140, 142 },\r\n\t{      9, 13,  1, 13, 144, 146, 142 },\r\n\t{      9, 13, 11, 13, 151, 147, 142 },\r\n\t{      8, 13,  0, 13, 144,   0, 139 },\r\n\t{      8, 13,  0, 12, 143,   0, 149 },\r\n\t{      8,  0,  0,  2,   0,   0, 148 },\r\n\t{     11,  0,  0, 13,   0,   0, 139 },\r\n\t{     11, 13,  0, 13, 139,   0, 139 },\r\n\t{     11,  2,  0, 13, 148,   0, 139 },\r\n\t{     11, 12,  0, 13, 149,   0, 139 },\r\n\t{     11, 13, 11, 12, 139,   0, 149 },\r\n\t{     14,  0,  0, 13,   0,   0, 139 },\r\n\t{     14, 13,  0, 13, 139,   0, 139 },\r\n\t{     14,  2,  0, 13, 148,   0, 139 },\r\n\t{     14, 12,  0, 13, 149,   0, 139 },\r\n\t{     14, 13, 11, 12, 139,   0, 149 },\r\n\t{     10,  0, 13,  0,   0, 140,   0 },\r\n\t{     10, 13, 13,  0, 140, 140,   0 },\r\n\t{     10,  0,  1,  0,   0, 146,   0 },\r\n\t{     10, 13, 11,  0, 140, 147,   0 },\r\n\t{     12,  0, 13,  0,   0, 140,   0 },\r\n\t{     12, 13, 13,  0, 140, 140,   0 },\r\n\t{     12,  0,  1,  0,   0, 146,   0 },\r\n\t{     12, 13, 11,  0, 140, 147,   0 },\r\n\t{      3, 13, 11, 12, 150,   0,   0 }\r\n\t// clang-format on\r\n};\r\n\r\n// BUGFIX: This array should contain an additional 0 (207 elements).\r\n/** Maps tile IDs to their corresponding base tile ID. */\r\nconst BYTE BSTYPES[206] = {\r\n\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\r\n\t10, 11, 12, 13, 14, 15, 16, 17, 0, 0,\r\n\t0, 0, 0, 0, 0, 1, 2, 10, 4, 5,\r\n\t6, 7, 8, 9, 10, 11, 12, 14, 5, 14,\r\n\t10, 4, 14, 4, 5, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 1,\r\n\t2, 3, 4, 1, 6, 7, 16, 17, 2, 1,\r\n\t1, 2, 2, 1, 1, 2, 2, 2, 2, 2,\r\n\t1, 1, 11, 1, 13, 13, 13, 1, 2, 1,\r\n\t2, 1, 2, 1, 2, 2, 2, 2, 12, 0,\r\n\t0, 11, 1, 11, 1, 13, 0, 0, 0, 0,\r\n\t0, 0, 0, 13, 13, 13, 13, 13, 13, 13,\r\n\t13, 13, 13, 13, 13, 13, 1, 11, 2, 12,\r\n\t13, 13, 13, 12, 2, 1, 2, 2, 4, 14,\r\n\t4, 10, 13, 13, 4, 4, 1, 1, 4, 2,\r\n\t2, 13, 13, 13, 13, 25, 26, 28, 30, 31,\r\n\t41, 43, 40, 41, 42, 43, 25, 41, 43, 28,\r\n\t28, 1, 2, 25, 26, 22, 22, 25, 26, 0,\r\n\t0, 0, 0, 0, 0, 0\r\n};\r\n\r\n// BUGFIX: This array should contain an additional 0 (207 elements).\r\n/** Maps tile IDs to their corresponding undecorated tile ID. */\r\nconst BYTE L5BTYPES[206] = {\r\n\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\r\n\t10, 11, 12, 13, 14, 15, 16, 17, 0, 0,\r\n\t0, 0, 0, 0, 0, 25, 26, 0, 28, 0,\r\n\t30, 31, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t40, 41, 42, 43, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 79,\r\n\t80, 0, 82, 0, 0, 0, 0, 0, 0, 79,\r\n\t0, 80, 0, 0, 79, 80, 0, 2, 2, 2,\r\n\t1, 1, 11, 25, 13, 13, 13, 1, 2, 1,\r\n\t2, 1, 2, 1, 2, 2, 2, 2, 12, 0,\r\n\t0, 11, 1, 11, 1, 13, 0, 0, 0, 0,\r\n\t0, 0, 0, 13, 13, 13, 13, 13, 13, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0\r\n};\r\n/** Miniset: stairs up on a corner wall. */\r\nconst BYTE STAIRSUP[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t13, 13, 13, 13, // search\r\n\t 2,  2,  2,  2,\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\r\n\t 0, 66,  6,  0, // replace\r\n\t63, 64, 65,  0,\r\n\t 0, 67, 68,  0,\r\n\t 0,  0,  0,  0,\r\n\t// clang-format on\r\n};\r\n#ifdef HELLFIRE\r\nconst BYTE L5STAIRSUP[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t22, 22, 22, 22, // search\r\n\t22, 22, 22, 22,\r\n\t 2,  2,  2,  2,\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\r\n\t 0, 54, 23,  0, // replace\r\n\t 0, 53, 18,  0,\r\n\t55, 56, 57,  0,\r\n\t58, 59, 60,  0,\r\n\t 0,  0,  0,  0\r\n\t// clang-format on\r\n};\r\n#else\r\n/** Miniset: stairs up. */\r\nconst BYTE L5STAIRSUP[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t22, 22, 22, 22, // search\r\n\t 2,  2,  2,  2,\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\r\n\t 0, 66, 23,  0, // replace\r\n\t63, 64, 65,  0,\r\n\t 0, 67, 68,  0,\r\n\t 0,  0,  0,  0,\r\n\t// clang-format on\r\n};\r\n#endif\r\n/** Miniset: stairs down. */\r\nconst BYTE STAIRSDOWN[] = {\r\n\t// clang-format off\r\n\t4, 3, // width, height\r\n\r\n\t13, 13, 13, 13, // search\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\r\n\t62, 57, 58,  0, // replace\r\n\t61, 59, 60,  0,\r\n\t 0,  0,  0,  0,\r\n\t// clang-format on\r\n};\r\n#ifdef HELLFIRE\r\nconst BYTE L5STAIRSDOWN[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t13, 13, 13, 13, // search\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\r\n\t 0,  0, 52,  0, // replace\r\n\t 0, 48, 51,  0,\r\n\t 0, 47, 50,  0,\r\n\t45, 46, 49,  0,\r\n\t 0,  0,  0,  0,\r\n\t// clang-format on\r\n};\r\nconst BYTE L5STAIRSTOWN[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t22, 22, 22, 22, // search\r\n\t22, 22, 22, 22,\r\n\t 2,  2,  2,  2,\r\n\t13, 13, 13, 13,\r\n\t13, 13, 13, 13,\r\n\r\n\t 0, 62, 23,  0, // replace\r\n\t 0, 61, 18,  0,\r\n\t63, 64, 65,  0,\r\n\t66, 67, 68,  0,\r\n\t 0,  0,  0,  0,\r\n\t// clang-format on\r\n};\r\n#endif\r\n/** Miniset: candlestick. */\r\nconst BYTE LAMPS[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t13,  0, // search\r\n\t13, 13,\r\n\r\n\t129,   0, // replace\r\n\t130, 128,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Poisoned Water Supply entrance. */\r\nconst BYTE PWATERIN[] = {\r\n\t// clang-format off\r\n\t6, 6, // width, height\r\n\r\n\t13, 13, 13, 13, 13, 13, // search\r\n\t13, 13, 13, 13, 13, 13,\r\n\t13, 13, 13, 13, 13, 13,\r\n\t13, 13, 13, 13, 13, 13,\r\n\t13, 13, 13, 13, 13, 13,\r\n\t13, 13, 13, 13, 13, 13,\r\n\r\n\t 0,   0,   0,   0,   0, 0, // replace\r\n\t 0, 202, 200, 200,  84, 0,\r\n\t 0, 199, 203, 203,  83, 0,\r\n\t 0,  85, 206,  80,  81, 0,\r\n\t 0,   0, 134, 135,   0, 0,\r\n\t 0,   0,   0,   0,   0, 0,\r\n\t// clang-format on\r\n};\r\n#ifdef HELLFIRE\r\nconst BYTE byte_48A1B4[4] = { 1, 1, 11, 95 };\r\nconst BYTE byte_48A1B8[8] = { 1, 1, 12, 96 };\r\nconst BYTE byte_48A1C0[8] = {\r\n\t// clang-format off\r\n\t1, 3, // width, height\r\n\r\n\t1, // search\r\n\t1,\r\n\t1,\r\n\r\n\t91, // replace\r\n\t90,\r\n\t89,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A1C8[8] = {\r\n\t// clang-format off\r\n\t3, 1, // width, height\r\n\r\n\t 2,  2,  2, // search\r\n\r\n\t94, 93, 92, // replace\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A1D0[4] = { 1, 1, 13, 97 };\r\nconst BYTE byte_48A1D4[4] = { 1, 1, 13, 98 };\r\nconst BYTE byte_48A1D8[4] = { 1, 1, 13, 99 };\r\nconst BYTE byte_48A1DC[4] = { 1, 1, 13, 100 };\r\nconst BYTE byte_48A1E0[20] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t13, 13, 13, // search\r\n\t13, 13, 13,\r\n\t13, 13, 13,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 101, 0,\r\n\t0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A1F4[4] = { 1, 1, 11, 185 };\r\nconst BYTE byte_48A1F8[4] = { 1, 1, 11, 186 };\r\nconst BYTE byte_48A1FC[4] = { 1, 1, 12, 187 };\r\nconst BYTE byte_48A200[4] = { 1, 1, 12, 188 };\r\nconst BYTE byte_48A204[4] = { 1, 1, 89, 173 };\r\nconst BYTE byte_48A208[4] = { 1, 1, 89, 174 };\r\nconst BYTE byte_48A20C[4] = { 1, 1, 90, 175 };\r\nconst BYTE byte_48A210[4] = { 1, 1, 90, 176 };\r\nconst BYTE byte_48A214[4] = { 1, 1, 91, 177 };\r\nconst BYTE byte_48A218[4] = { 1, 1, 91, 178 };\r\nconst BYTE byte_48A21C[4] = { 1, 1, 92, 179 };\r\nconst BYTE byte_48A220[4] = { 1, 1, 92, 180 };\r\nconst BYTE byte_48A224[4] = { 1, 1, 92, 181 };\r\nconst BYTE byte_48A228[4] = { 1, 1, 92, 182 };\r\nconst BYTE byte_48A22C[4] = { 1, 1, 92, 183 };\r\nconst BYTE byte_48A230[4] = { 1, 1, 92, 184 };\r\nconst BYTE byte_48A234[4] = { 1, 1, 98, 189 };\r\nconst BYTE byte_48A238[4] = { 1, 1, 98, 190 };\r\nconst BYTE byte_48A23C[4] = { 1, 1, 97, 191 };\r\nconst BYTE byte_48A240[4] = { 1, 1, 15, 192 };\r\nconst BYTE byte_48A244[4] = { 1, 1, 99, 193 };\r\nconst BYTE byte_48A248[4] = { 1, 1, 99, 194 };\r\nconst BYTE byte_48A24C[4] = { 1, 1, 100, 195 };\r\nconst BYTE byte_48A250[4] = { 1, 1, 101, 196 };\r\nconst BYTE byte_48A254[4] = { 1, 1, 101, 197 };\r\nconst BYTE byte_48A258[8] = { 1, 1, 101, 198 };\r\nconst BYTE byte_48A260[24] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t13, 13, 13, // search\r\n\t13, 13, 13,\r\n\t13, 13, 13,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 167, 0,\r\n\t0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A278[24] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t13, 13, 13, // search\r\n\t13, 13, 13,\r\n\t13, 13, 13,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 168, 0,\r\n\t0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A290[24] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t13, 13, 13, // search\r\n\t13, 13, 13,\r\n\t13, 13, 13,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 169, 0,\r\n\t0,   0, 0,\r\n};\r\nconst BYTE byte_48A2A8[24] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t13, 13, 13, // search\r\n\t13, 13, 13,\r\n\t13, 13, 13,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 170, 0,\r\n\t0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A2C0[24] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t13, 13, 13, // search\r\n\t13, 13, 13,\r\n\t13, 13, 13,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 171, 0,\r\n\t0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A2D8[20] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t13, 13, 13, // search\r\n\t13, 13, 13,\r\n\t13, 13, 13,\r\n\r\n\t 0,   0, 0, // replace\r\n\t 0, 172, 0,\r\n\t 0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A2EC[4] = { 1, 1, 13, 163 };\r\nconst BYTE byte_48A2F0[4] = { 1, 1, 13, 164 };\r\nconst BYTE byte_48A2F4[4] = { 1, 1, 13, 165 };\r\nconst BYTE byte_48A2F8[4] = { 1, 1, 13, 166 };\r\nconst BYTE byte_48A2FC[4] = { 1, 1, 1, 112 };\r\nconst BYTE byte_48A300[4] = { 1, 1, 2, 113 };\r\nconst BYTE byte_48A304[4] = { 1, 1, 3, 114 };\r\nconst BYTE byte_48A308[4] = { 1, 1, 4, 115 };\r\nconst BYTE byte_48A30C[4] = { 1, 1, 5, 116 };\r\nconst BYTE byte_48A310[4] = { 1, 1, 6, 117 };\r\nconst BYTE byte_48A314[4] = { 1, 1, 7, 118 };\r\nconst BYTE byte_48A318[4] = { 1, 1, 8, 119 };\r\nconst BYTE byte_48A31C[4] = { 1, 1, 9, 120 };\r\nconst BYTE byte_48A320[4] = { 1, 1, 10, 121 };\r\nconst BYTE byte_48A324[4] = { 1, 1, 11, 122 };\r\nconst BYTE byte_48A328[4] = { 1, 1, 12, 123 };\r\nconst BYTE byte_48A32C[4] = { 1, 1, 13, 124 };\r\nconst BYTE byte_48A330[4] = { 1, 1, 14, 125 };\r\nconst BYTE byte_48A334[4] = { 1, 1, 15, 126 };\r\nconst BYTE byte_48A338[4] = { 1, 1, 16, 127 };\r\nconst BYTE byte_48A33C[4] = { 1, 1, 17, 128 };\r\nconst BYTE byte_48A340[4] = { 1, 1, 1, 129 };\r\nconst BYTE byte_48A344[4] = { 1, 1, 2, 130 };\r\nconst BYTE byte_48A348[4] = { 1, 1, 3, 131 };\r\nconst BYTE byte_48A34C[4] = { 1, 1, 4, 132 };\r\nconst BYTE byte_48A350[4] = { 1, 1, 5, 133 };\r\nconst BYTE byte_48A354[4] = { 1, 1, 6, 134 };\r\nconst BYTE byte_48A358[4] = { 1, 1, 7, 135 };\r\nconst BYTE byte_48A35C[4] = { 1, 1, 8, 136 };\r\nconst BYTE byte_48A360[4] = { 1, 1, 9, 137 };\r\nconst BYTE byte_48A364[4] = { 1, 1, 10, 138 };\r\nconst BYTE byte_48A368[4] = { 1, 1, 11, 139 };\r\nconst BYTE byte_48A36C[4] = { 1, 1, 12, 140 };\r\nconst BYTE byte_48A370[4] = { 1, 1, 13, 141 };\r\nconst BYTE byte_48A374[4] = { 1, 1, 14, 142 };\r\nconst BYTE byte_48A378[4] = { 1, 1, 15, 143 };\r\nconst BYTE byte_48A37C[4] = { 1, 1, 16, 144 };\r\nconst BYTE byte_48A380[4] = { 1, 1, 17, 145 };\r\nconst BYTE byte_48A384[4] = { 1, 1, 1, 146 };\r\nconst BYTE byte_48A388[4] = { 1, 1, 2, 147 };\r\nconst BYTE byte_48A38C[4] = { 1, 1, 3, 148 };\r\nconst BYTE byte_48A390[4] = { 1, 1, 4, 149 };\r\nconst BYTE byte_48A394[4] = { 1, 1, 5, 150 };\r\nconst BYTE byte_48A398[4] = { 1, 1, 6, 151 };\r\nconst BYTE byte_48A39C[4] = { 1, 1, 7, 152 };\r\nconst BYTE byte_48A3A0[4] = { 1, 1, 8, 153 };\r\nconst BYTE byte_48A3A4[4] = { 1, 1, 9, 154 };\r\nconst BYTE byte_48A3A8[4] = { 1, 1, 10, 155 };\r\nconst BYTE byte_48A3AC[4] = { 1, 1, 11, 156 };\r\nconst BYTE byte_48A3B0[4] = { 1, 1, 12, 157 };\r\nconst BYTE byte_48A3B4[4] = { 1, 1, 13, 158 };\r\nconst BYTE byte_48A3B8[4] = { 1, 1, 14, 159 };\r\nconst BYTE byte_48A3BC[4] = { 1, 1, 15, 160 };\r\nconst BYTE byte_48A3C0[4] = { 1, 1, 16, 161 };\r\nconst BYTE byte_48A3C4[4] = { 1, 1, 17, 162 };\r\nconst BYTE byte_48A3C8[4] = { 1, 1, 1, 199 };\r\nconst BYTE byte_48A3CC[4] = { 1, 1, 1, 201 };\r\nconst BYTE byte_48A3D0[4] = { 1, 1, 2, 200 };\r\nconst BYTE byte_48A3D4[4] = { 1, 1, 2, 202 };\r\n#endif\r\n\r\n/* data */\r\n\r\n#ifdef HELLFIRE\r\nBYTE UberRoomPattern[26] = {\r\n\t// clang-format off\r\n\t4, 6, // width, height\r\n\r\n\t115, 130,   6, 13, // pattern\r\n\t129, 108,   1, 13,\r\n\t  1, 107, 103, 13,\r\n\t146, 106, 102, 13,\r\n\t129, 168,   1, 13,\r\n\t  7,   2,   3, 13,\r\n\t// clang-format on\r\n};\r\nBYTE CornerstoneRoomPattern[27] = {\r\n\t// clang-format off\r\n\t5, 5, // width, height\r\n\r\n\t4,   2,   2, 2,  6, // pattern\r\n\t1, 111, 172, 0,  1,\r\n\t1, 172,   0, 0, 25,\r\n\t1,   0,   0, 0,  1,\r\n\t7,   2,   2, 2,  3,\r\n\t// clang-format on\r\n};\r\n#endif\r\n/**\r\n * A lookup table for the 16 possible patterns of a 2x2 area,\r\n * where each cell either contains a SW wall or it doesn't.\r\n */\r\nBYTE L5ConvTbl[16] = { 22, 13, 1, 13, 2, 13, 13, 13, 4, 13, 1, 13, 2, 13, 16, 13 };\r\n\r\n#ifdef HELLFIRE\r\nvoid DRLG_InitL5Vals()\r\n{\r\n\tint i, j, pc;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 77) {\r\n\t\t\t\tpc = 1;\r\n\t\t\t} else if (dPiece[i][j] == 80) {\r\n\t\t\t\tpc = 2;\r\n\t\t\t} else {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tdSpecial[i][j] = pc;\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nstatic void DRLG_PlaceDoor(int x, int y)\r\n{\r\n\tif ((L5dflags[x][y] & DLRG_PROTECTED) == 0) {\r\n\t\tBYTE df = L5dflags[x][y] & 0x7F;\r\n\t\tBYTE c = dungeon[x][y];\r\n\r\n\t\tif (df == 1) {\r\n\t\t\tif (y != 1 && c == 2)\r\n\t\t\t\tdungeon[x][y] = 26;\r\n\t\t\tif (y != 1 && c == 7)\r\n\t\t\t\tdungeon[x][y] = 31;\r\n\t\t\tif (y != 1 && c == 14)\r\n\t\t\t\tdungeon[x][y] = 42;\r\n\t\t\tif (y != 1 && c == 4)\r\n\t\t\t\tdungeon[x][y] = 43;\r\n\t\t\tif (x != 1 && c == 1)\r\n\t\t\t\tdungeon[x][y] = 25;\r\n\t\t\tif (x != 1 && c == 10)\r\n\t\t\t\tdungeon[x][y] = 40;\r\n\t\t\tif (x != 1 && c == 6)\r\n\t\t\t\tdungeon[x][y] = 30;\r\n\t\t}\r\n\t\tif (df == 2) {\r\n\t\t\tif (x != 1 && c == 1)\r\n\t\t\t\tdungeon[x][y] = 25;\r\n\t\t\tif (x != 1 && c == 6)\r\n\t\t\t\tdungeon[x][y] = 30;\r\n\t\t\tif (x != 1 && c == 10)\r\n\t\t\t\tdungeon[x][y] = 40;\r\n\t\t\tif (x != 1 && c == 4)\r\n\t\t\t\tdungeon[x][y] = 41;\r\n\t\t\tif (y != 1 && c == 2)\r\n\t\t\t\tdungeon[x][y] = 26;\r\n\t\t\tif (y != 1 && c == 14)\r\n\t\t\t\tdungeon[x][y] = 42;\r\n\t\t\tif (y != 1 && c == 7)\r\n\t\t\t\tdungeon[x][y] = 31;\r\n\t\t}\r\n\t\tif (df == 3) {\r\n\t\t\tif (x != 1 && y != 1 && c == 4)\r\n\t\t\t\tdungeon[x][y] = 28;\r\n\t\t\tif (x != 1 && c == 10)\r\n\t\t\t\tdungeon[x][y] = 40;\r\n\t\t\tif (y != 1 && c == 14)\r\n\t\t\t\tdungeon[x][y] = 42;\r\n\t\t\tif (y != 1 && c == 2)\r\n\t\t\t\tdungeon[x][y] = 26;\r\n\t\t\tif (x != 1 && c == 1)\r\n\t\t\t\tdungeon[x][y] = 25;\r\n\t\t\tif (y != 1 && c == 7)\r\n\t\t\t\tdungeon[x][y] = 31;\r\n\t\t\tif (x != 1 && c == 6)\r\n\t\t\t\tdungeon[x][y] = 30;\r\n\t\t}\r\n\t}\r\n\r\n\tL5dflags[x][y] = DLRG_PROTECTED;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid drlg_l1_crypt_lavafloor()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 1; j < 40; j++) {\r\n\t\tfor (i = 1; i < 40; i++) {\r\n\t\t\tswitch (dungeon[i][j]) {\r\n\t\t\tcase 5:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 7:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 8:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 9:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 10:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 11:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 12:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 14:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 15:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 17:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 95:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 96:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 208;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 116:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 118:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 119:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 120:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 121:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 122:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 211;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 212;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 123:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 125:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 126:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 128:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 133:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 135:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 136:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 137:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 213;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 214;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 138:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 139:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 215;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 216;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 140:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 217;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 142:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 143:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 213;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 214;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 145:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 213;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 214;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 150:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 217;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 152:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 153:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 154:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 155:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 205;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 156:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 157:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 217;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 159:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 160:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 206;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 207;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 162:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 209;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 210;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 167:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 209;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 210;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 187:\r\n\t\t\t\tif (dungeon[i][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i][j - 1] = 208;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 185:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 186:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 203;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 204;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 192:\r\n\t\t\t\tif (dungeon[i - 1][j] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j] = 209;\r\n\t\t\t\tif (dungeon[i - 1][j - 1] == 13)\r\n\t\t\t\t\tdungeon[i - 1][j - 1] = 210;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nstatic void DRLG_L1Shadows()\r\n{\r\n\tint x, y, i;\r\n\tBYTE sd[2][2];\r\n\tBYTE tnv3;\r\n\tBOOL patflag;\r\n\r\n\tfor (y = 1; y < DMAXY; y++) {\r\n\t\tfor (x = 1; x < DMAXX; x++) {\r\n\t\t\tsd[0][0] = BSTYPES[dungeon[x][y]];\r\n\t\t\tsd[1][0] = BSTYPES[dungeon[x - 1][y]];\r\n\t\t\tsd[0][1] = BSTYPES[dungeon[x][y - 1]];\r\n\t\t\tsd[1][1] = BSTYPES[dungeon[x - 1][y - 1]];\r\n\r\n\t\t\tfor (i = 0; i < 37; i++) {\r\n\t\t\t\tif (SPATS[i].strig == sd[0][0]) {\r\n\t\t\t\t\tpatflag = TRUE;\r\n\t\t\t\t\tif (SPATS[i].s1 && SPATS[i].s1 != sd[1][1])\r\n\t\t\t\t\t\tpatflag = FALSE;\r\n\t\t\t\t\tif (SPATS[i].s2 && SPATS[i].s2 != sd[0][1])\r\n\t\t\t\t\t\tpatflag = FALSE;\r\n\t\t\t\t\tif (SPATS[i].s3 && SPATS[i].s3 != sd[1][0])\r\n\t\t\t\t\t\tpatflag = FALSE;\r\n\t\t\t\t\tif (patflag == TRUE) {\r\n\t\t\t\t\t\tif (SPATS[i].nv1 && !L5dflags[x - 1][y - 1])\r\n\t\t\t\t\t\t\tdungeon[x - 1][y - 1] = SPATS[i].nv1;\r\n\t\t\t\t\t\tif (SPATS[i].nv2 && !L5dflags[x][y - 1])\r\n\t\t\t\t\t\t\tdungeon[x][y - 1] = SPATS[i].nv2;\r\n\t\t\t\t\t\tif (SPATS[i].nv3 && !L5dflags[x - 1][y])\r\n\t\t\t\t\t\t\tdungeon[x - 1][y] = SPATS[i].nv3;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor (y = 1; y < DMAXY; y++) {\r\n\t\tfor (x = 1; x < DMAXX; x++) {\r\n\t\t\tif (dungeon[x - 1][y] == 139 && !L5dflags[x - 1][y]) {\r\n\t\t\t\ttnv3 = 139;\r\n\t\t\t\tif (dungeon[x][y] == 29)\r\n\t\t\t\t\ttnv3 = 141;\r\n\t\t\t\tif (dungeon[x][y] == 32)\r\n\t\t\t\t\ttnv3 = 141;\r\n\t\t\t\tif (dungeon[x][y] == 35)\r\n\t\t\t\t\ttnv3 = 141;\r\n\t\t\t\tif (dungeon[x][y] == 37)\r\n\t\t\t\t\ttnv3 = 141;\r\n\t\t\t\tif (dungeon[x][y] == 38)\r\n\t\t\t\t\ttnv3 = 141;\r\n\t\t\t\tif (dungeon[x][y] == 39)\r\n\t\t\t\t\ttnv3 = 141;\r\n\t\t\t\tdungeon[x - 1][y] = tnv3;\r\n\t\t\t}\r\n\t\t\tif (dungeon[x - 1][y] == 149 && !L5dflags[x - 1][y]) {\r\n\t\t\t\ttnv3 = 149;\r\n\t\t\t\tif (dungeon[x][y] == 29)\r\n\t\t\t\t\ttnv3 = 153;\r\n\t\t\t\tif (dungeon[x][y] == 32)\r\n\t\t\t\t\ttnv3 = 153;\r\n\t\t\t\tif (dungeon[x][y] == 35)\r\n\t\t\t\t\ttnv3 = 153;\r\n\t\t\t\tif (dungeon[x][y] == 37)\r\n\t\t\t\t\ttnv3 = 153;\r\n\t\t\t\tif (dungeon[x][y] == 38)\r\n\t\t\t\t\ttnv3 = 153;\r\n\t\t\t\tif (dungeon[x][y] == 39)\r\n\t\t\t\t\ttnv3 = 153;\r\n\t\t\t\tdungeon[x - 1][y] = tnv3;\r\n\t\t\t}\r\n\t\t\tif (dungeon[x - 1][y] == 148 && !L5dflags[x - 1][y]) {\r\n\t\t\t\ttnv3 = 148;\r\n\t\t\t\tif (dungeon[x][y] == 29)\r\n\t\t\t\t\ttnv3 = 154;\r\n\t\t\t\tif (dungeon[x][y] == 32)\r\n\t\t\t\t\ttnv3 = 154;\r\n\t\t\t\tif (dungeon[x][y] == 35)\r\n\t\t\t\t\ttnv3 = 154;\r\n\t\t\t\tif (dungeon[x][y] == 37)\r\n\t\t\t\t\ttnv3 = 154;\r\n\t\t\t\tif (dungeon[x][y] == 38)\r\n\t\t\t\t\ttnv3 = 154;\r\n\t\t\t\tif (dungeon[x][y] == 39)\r\n\t\t\t\t\ttnv3 = 154;\r\n\t\t\t\tdungeon[x - 1][y] = tnv3;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic int DRLG_PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int noquad, int ldir)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, i, ii, numt, found, t;\r\n\tBOOL abort;\r\n\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tif (tmax - tmin == 0)\r\n\t\tnumt = 1;\r\n\telse\r\n\t\tnumt = random_(0, tmax - tmin) + tmin;\r\n\r\n\tfor (i = 0; i < numt; i++) {\r\n\t\tsx = random_(0, DMAXX - sw);\r\n\t\tsy = random_(0, DMAXY - sh);\r\n\t\tabort = FALSE;\r\n\t\tfound = 0;\r\n\r\n\t\twhile (abort == FALSE) {\r\n\t\t\tabort = TRUE;\r\n\t\t\t// BUGFIX: This code has no purpose but causes the set piece to never appear in x 0-13 or y 0-13\r\n\t\t\tif (cx != -1 && sx >= cx - sw && sx <= cx + 12) {\r\n\t\t\t\tsx++;\r\n\t\t\t\tabort = FALSE;\r\n\t\t\t}\r\n\t\t\tif (cy != -1 && sy >= cy - sh && sy <= cy + 12) {\r\n\t\t\t\tsy++;\r\n\t\t\t\tabort = FALSE;\r\n\t\t\t}\r\n\r\n\t\t\tswitch (noquad) {\r\n\t\t\tcase 0:\r\n\t\t\t\tif (sx < cx && sy < cy)\r\n\t\t\t\t\tabort = FALSE;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tif (sx > cx && sy < cy)\r\n\t\t\t\t\tabort = FALSE;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tif (sx < cx && sy > cy)\r\n\t\t\t\t\tabort = FALSE;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3:\r\n\t\t\t\tif (sx > cx && sy > cy)\r\n\t\t\t\t\tabort = FALSE;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tii = 2;\r\n\r\n\t\t\tfor (yy = 0; yy < sh && abort == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && abort == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] && dungeon[xx + sx][sy + yy] != miniset[ii])\r\n\t\t\t\t\t\tabort = FALSE;\r\n\t\t\t\t\tif (L5dflags[xx + sx][sy + yy])\r\n\t\t\t\t\t\tabort = FALSE;\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (abort == FALSE) {\r\n\t\t\t\tif (++sx == DMAXX - sw) {\r\n\t\t\t\t\tsx = 0;\r\n\t\t\t\t\tif (++sy == DMAXY - sh)\r\n\t\t\t\t\t\tsy = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (++found > 4000)\r\n\t\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tii = sw * sh + 2;\r\n\r\n\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\tif (miniset[ii])\r\n\t\t\t\t\tdungeon[xx + sx][sy + yy] = miniset[ii];\r\n\t\t\t\tii++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (miniset == PWATERIN) {\r\n\t\tt = TransVal;\r\n\t\tTransVal = 0;\r\n\t\tDRLG_MRectTrans(sx, sy + 2, sx + 5, sy + 4);\r\n\t\tTransVal = t;\r\n\r\n\t\tquests[Q_PWATER]._qtx = 2 * sx + 21;\r\n\t\tquests[Q_PWATER]._qty = 2 * sy + 22;\r\n\t}\r\n\r\n\tif (setview == TRUE) {\r\n\t\tViewX = 2 * sx + 19;\r\n\t\tViewY = 2 * sy + 20;\r\n\t}\r\n\r\n\tif (ldir == 0) {\r\n\t\tLvlViewX = 2 * sx + 19;\r\n\t\tLvlViewY = 2 * sy + 20;\r\n\t}\r\n\r\n\tif (sx < cx && sy < cy)\r\n\t\treturn 0;\r\n\tif (sx > cx && sy < cy)\r\n\t\treturn 1;\r\n\tif (sx < cx && sy > cy)\r\n\t\treturn 2;\r\n\telse\r\n\t\treturn 3;\r\n}\r\n\r\nstatic void DRLG_L1Floor()\r\n{\r\n\tint i, j;\r\n\tLONG rv;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (L5dflags[i][j] == 0 && dungeon[i][j] == 13) {\r\n\t\t\t\trv = random_(0, 3);\r\n\r\n\t\t\t\tif (rv == 1)\r\n\t\t\t\t\tdungeon[i][j] = 162;\r\n\t\t\t\tif (rv == 2)\r\n\t\t\t\t\tdungeon[i][j] = 163;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L1Pass3()\r\n{\r\n\tint i, j, xx, yy;\r\n\tlong v1, v2, v3, v4, lv;\r\n\r\n\tlv = 22 - 1;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pMegaTiles\r\n\t\tmov\t\teax, lv\r\n\t\tshl\t\teax, 3\r\n\t\tadd\t\tesi, eax\r\n\t\txor\t\teax, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv1, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv2, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv3, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv4, eax\r\n\t}\r\n#else\r\n\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n#endif\r\n\r\n\tfor (j = 0; j < MAXDUNY; j += 2)\r\n\t{\r\n\t\tfor (i = 0; i < MAXDUNX; i += 2) {\r\n\t\t\tdPiece[i][j] = v1;\r\n\t\t\tdPiece[i + 1][j] = v2;\r\n\t\t\tdPiece[i][j + 1] = v3;\r\n\t\t\tdPiece[i + 1][j + 1] = v4;\r\n\t\t}\r\n\t}\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tlv = dungeon[i][j] - 1;\r\n\t\t\t/// ASSERT: assert(lv >= 0);\r\n#ifdef USE_ASM\r\n\t\t\t__asm {\r\n\t\t\t\tmov\t\tesi, pMegaTiles\r\n\t\t\t\tmov\t\teax, lv\r\n\t\t\t\tshl\t\teax, 3\r\n\t\t\t\tadd\t\tesi, eax\r\n\t\t\t\txor\t\teax, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv1, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv2, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv3, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv4, eax\r\n\t\t\t}\r\n#else\r\n\t\t\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\t\t\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\t\t\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\t\t\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n#endif\r\n\t\t\tdPiece[xx][yy] = v1;\r\n\t\t\tdPiece[xx + 1][yy] = v2;\r\n\t\t\tdPiece[xx][yy + 1] = v3;\r\n\t\t\tdPiece[xx + 1][yy + 1] = v4;\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_LoadL1SP()\r\n{\r\n\tL5setloadflag = FALSE;\r\n\tif (QuestStatus(Q_BUTCHER)) {\r\n\t\tL5pSetPiece = LoadFileInMem(\"Levels\\\\L1Data\\\\rnd6.DUN\", NULL);\r\n\t\tL5setloadflag = TRUE;\r\n\t}\r\n\tif (QuestStatus(Q_SKELKING) && gbMaxPlayers == 1) {\r\n\t\tL5pSetPiece = LoadFileInMem(\"Levels\\\\L1Data\\\\SKngDO.DUN\", NULL);\r\n\t\tL5setloadflag = TRUE;\r\n\t}\r\n\tif (QuestStatus(Q_LTBANNER)) {\r\n\t\tL5pSetPiece = LoadFileInMem(\"Levels\\\\L1Data\\\\Banner2.DUN\", NULL);\r\n\t\tL5setloadflag = TRUE;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_FreeL1SP()\r\n{\r\n\tMemFreeDbg(L5pSetPiece);\r\n}\r\n\r\nvoid DRLG_Init_Globals()\r\n{\r\n\tchar c;\r\n\r\n\tmemset(dFlags, 0, sizeof(dFlags));\r\n\tmemset(dPlayer, 0, sizeof(dPlayer));\r\n\tmemset(dMonster, 0, sizeof(dMonster));\r\n\tmemset(dDead, 0, sizeof(dDead));\r\n\tmemset(dObject, 0, sizeof(dObject));\r\n\tmemset(dItem, 0, sizeof(dItem));\r\n\tmemset(dMissile, 0, sizeof(dMissile));\r\n\tmemset(dSpecial, 0, sizeof(dSpecial));\r\n\tif (!lightflag) {\r\n\t\tif (light4flag)\r\n\t\t\tc = 3;\r\n\t\telse\r\n\t\t\tc = 15;\r\n\t} else {\r\n\t\tc = 0;\r\n\t}\r\n\tmemset(dLight, c, sizeof(dLight));\r\n}\r\n\r\nstatic void DRLG_InitL1Vals()\r\n{\r\n\tint i, j, pc;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 12) {\r\n\t\t\t\tpc = 1;\r\n\t\t\t} else if (dPiece[i][j] == 11) {\r\n\t\t\t\tpc = 2;\r\n\t\t\t} else if (dPiece[i][j] == 71) {\r\n\t\t\t\tpc = 1;\r\n\t\t\t} else if (dPiece[i][j] == 259) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t} else if (dPiece[i][j] == 249) {\r\n\t\t\t\tpc = 2;\r\n\t\t\t} else if (dPiece[i][j] == 325) {\r\n\t\t\t\tpc = 2;\r\n\t\t\t} else if (dPiece[i][j] == 321) {\r\n\t\t\t\tpc = 1;\r\n\t\t\t} else if (dPiece[i][j] == 255) {\r\n\t\t\t\tpc = 4;\r\n\t\t\t} else if (dPiece[i][j] == 211) {\r\n\t\t\t\tpc = 1;\r\n\t\t\t} else if (dPiece[i][j] == 344) {\r\n\t\t\t\tpc = 2;\r\n\t\t\t} else if (dPiece[i][j] == 341) {\r\n\t\t\t\tpc = 1;\r\n\t\t\t} else if (dPiece[i][j] == 331) {\r\n\t\t\t\tpc = 2;\r\n\t\t\t} else if (dPiece[i][j] == 418) {\r\n\t\t\t\tpc = 1;\r\n\t\t\t} else if (dPiece[i][j] == 421) {\r\n\t\t\t\tpc = 2;\r\n\t\t\t} else {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tdSpecial[i][j] = pc;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid LoadL1Dungeon(const char *sFileName, int vx, int vy)\r\n{\r\n\tint i, j, rw, rh;\r\n\tBYTE *pLevelMap, *lm;\r\n\r\n\tdminx = 16;\r\n\tdminy = 16;\r\n\tdmaxx = 96;\r\n\tdmaxy = 96;\r\n\r\n\tDRLG_InitTrans();\r\n\tpLevelMap = LoadFileInMem(sFileName, NULL);\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 22;\r\n\t\t\tL5dflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tlm = pLevelMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tlm += 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm != 0) {\r\n\t\t\t\tdungeon[i][j] = *lm;\r\n\t\t\t\tL5dflags[i][j] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i][j] = 13;\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_L1Floor();\r\n\tViewX = vx;\r\n\tViewY = vy;\r\n\tDRLG_L1Pass3();\r\n\tDRLG_Init_Globals();\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17)\r\n#endif\r\n\t\tDRLG_InitL1Vals();\r\n\tSetMapMonsters(pLevelMap, 0, 0);\r\n\tSetMapObjects(pLevelMap, 0, 0);\r\n\tmem_free_dbg(pLevelMap);\r\n}\r\n\r\nvoid LoadPreL1Dungeon(const char *sFileName, int vx, int vy)\r\n{\r\n\tint i, j, rw, rh;\r\n\tBYTE *pLevelMap, *lm;\r\n\r\n\tdminx = 16;\r\n\tdminy = 16;\r\n\tdmaxx = 96;\r\n\tdmaxy = 96;\r\n\r\n\tpLevelMap = LoadFileInMem(sFileName, NULL);\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 22;\r\n\t\t\tL5dflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tlm = pLevelMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tlm += 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm != 0) {\r\n\t\t\t\tdungeon[i][j] = *lm;\r\n\t\t\t\tL5dflags[i][j] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i][j] = 13;\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_L1Floor();\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tpdungeon[i][j] = dungeon[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\tmem_free_dbg(pLevelMap);\r\n}\r\n#endif\r\n\r\nstatic void InitL5Dungeon()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 0;\r\n\t\t\tL5dflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L5ClearFlags()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tL5dflags[i][j] &= 0xBF;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L5drawRoom(int x, int y, int w, int h)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < h; j++) {\r\n\t\tfor (i = 0; i < w; i++) {\r\n\t\t\tdungeon[x + i][y + j] = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL L5checkRoom(int x, int y, int width, int height)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < height; j++) {\r\n\t\tfor (i = 0; i < width; i++) {\r\n\t\t\tif (i + x < 0 || i + x >= DMAXX || j + y < 0 || j + y >= DMAXY)\r\n\t\t\t\treturn FALSE;\r\n\t\t\tif (dungeon[i + x][j + y])\r\n\t\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void L5roomGen(int x, int y, int w, int h, int dir)\r\n{\r\n\tint num, dirProb;\r\n\tBOOL ran, ran2;\r\n\tint width, height, rx, ry, ry2;\r\n\tint cw, ch, cx1, cy1, cx2;\r\n\r\n\tdirProb = random_(0, 4);\r\n\r\n\tswitch (dir == 1 ? dirProb != 0 : dirProb == 0) {\r\n\tcase FALSE:\r\n\t\tnum = 0;\r\n\t\tdo {\r\n\t\t\tcw = (random_(0, 5) + 2) & 0xFFFFFFFE;\r\n\t\t\tch = (random_(0, 5) + 2) & 0xFFFFFFFE;\r\n\t\t\tcy1 = h / 2 + y - ch / 2;\r\n\t\t\tcx1 = x - cw;\r\n\t\t\tran = L5checkRoom(cx1 - 1, cy1 - 1, ch + 2, cw + 1); /// BUGFIX: swap args 3 and 4 (\"ch+2\" and \"cw+1\")\r\n\t\t\tnum++;\r\n\t\t} while (ran == FALSE && num < 20);\r\n\r\n\t\tif (ran == TRUE)\r\n\t\t\tL5drawRoom(cx1, cy1, cw, ch);\r\n\t\tcx2 = x + w;\r\n\t\tran2 = L5checkRoom(cx2, cy1 - 1, cw + 1, ch + 2);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL5drawRoom(cx2, cy1, cw, ch);\r\n\t\tif (ran == TRUE)\r\n\t\t\tL5roomGen(cx1, cy1, cw, ch, 1);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL5roomGen(cx2, cy1, cw, ch, 1);\r\n\t\tbreak;\r\n\tcase TRUE:\r\n\t\tnum = 0;\r\n\t\tdo {\r\n\t\t\twidth = (random_(0, 5) + 2) & 0xFFFFFFFE;\r\n\t\t\theight = (random_(0, 5) + 2) & 0xFFFFFFFE;\r\n\t\t\trx = w / 2 + x - width / 2;\r\n\t\t\try = y - height;\r\n\t\t\tran = L5checkRoom(rx - 1, ry - 1, width + 2, height + 1);\r\n\t\t\tnum++;\r\n\t\t} while (ran == FALSE && num < 20);\r\n\r\n\t\tif (ran == TRUE)\r\n\t\t\tL5drawRoom(rx, ry, width, height);\r\n\t\try2 = y + h;\r\n\t\tran2 = L5checkRoom(rx - 1, ry2, width + 2, height + 1);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL5drawRoom(rx, ry2, width, height);\r\n\t\tif (ran == TRUE)\r\n\t\t\tL5roomGen(rx, ry, width, height, 0);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL5roomGen(rx, ry2, width, height, 0);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic void L5firstRoom()\r\n{\r\n\tint ys, ye, y;\r\n\tint xs, xe, x;\r\n\r\n\tif (random_(0, 2) == 0) {\r\n\t\tys = 1;\r\n\t\tye = DMAXY - 1;\r\n\r\n\t\tVR1 = random_(0, 2);\r\n\t\tVR2 = random_(0, 2);\r\n\t\tVR3 = random_(0, 2);\r\n\r\n\t\tif (VR1 + VR3 <= 1)\r\n\t\t\tVR2 = 1;\r\n\t\tif (VR1)\r\n\t\t\tL5drawRoom(15, 1, 10, 10);\r\n\t\telse\r\n\t\t\tys = 18;\r\n\r\n\t\tif (VR2)\r\n\t\t\tL5drawRoom(15, 15, 10, 10);\r\n\t\tif (VR3)\r\n\t\t\tL5drawRoom(15, 29, 10, 10);\r\n\t\telse\r\n\t\t\tye = 22;\r\n\r\n\t\tfor (y = ys; y < ye; y++) {\r\n\t\t\tdungeon[17][y] = 1;\r\n\t\t\tdungeon[18][y] = 1;\r\n\t\t\tdungeon[19][y] = 1;\r\n\t\t\tdungeon[20][y] = 1;\r\n\t\t\tdungeon[21][y] = 1;\r\n\t\t\tdungeon[22][y] = 1;\r\n\t\t}\r\n\r\n\t\tif (VR1)\r\n\t\t\tL5roomGen(15, 1, 10, 10, 0);\r\n\t\tif (VR2)\r\n\t\t\tL5roomGen(15, 15, 10, 10, 0);\r\n\t\tif (VR3)\r\n\t\t\tL5roomGen(15, 29, 10, 10, 0);\r\n\r\n\t\tHR3 = 0;\r\n\t\tHR2 = 0;\r\n\t\tHR1 = 0;\r\n\t} else {\r\n\t\txs = 1;\r\n\t\txe = DMAXX - 1;\r\n\r\n\t\tHR1 = random_(0, 2);\r\n\t\tHR2 = random_(0, 2);\r\n\t\tHR3 = random_(0, 2);\r\n\r\n\t\tif (HR1 + HR3 <= 1)\r\n\t\t\tHR2 = 1;\r\n\t\tif (HR1)\r\n\t\t\tL5drawRoom(1, 15, 10, 10);\r\n\t\telse\r\n\t\t\txs = 18;\r\n\r\n\t\tif (HR2)\r\n\t\t\tL5drawRoom(15, 15, 10, 10);\r\n\t\tif (HR3)\r\n\t\t\tL5drawRoom(29, 15, 10, 10);\r\n\t\telse\r\n\t\t\txe = 22;\r\n\r\n\t\tfor (x = xs; x < xe; x++) {\r\n\t\t\tdungeon[x][17] = 1;\r\n\t\t\tdungeon[x][18] = 1;\r\n\t\t\tdungeon[x][19] = 1;\r\n\t\t\tdungeon[x][20] = 1;\r\n\t\t\tdungeon[x][21] = 1;\r\n\t\t\tdungeon[x][22] = 1;\r\n\t\t}\r\n\r\n\t\tif (HR1)\r\n\t\t\tL5roomGen(1, 15, 10, 10, 1);\r\n\t\tif (HR2)\r\n\t\t\tL5roomGen(15, 15, 10, 10, 1);\r\n\t\tif (HR3)\r\n\t\t\tL5roomGen(29, 15, 10, 10, 1);\r\n\r\n\t\tVR3 = 0;\r\n\t\tVR2 = 0;\r\n\t\tVR1 = 0;\r\n\t}\r\n}\r\n\r\nstatic int L5GetArea()\r\n{\r\n\tint i, j;\r\n\tint rv;\r\n\r\n\trv = 0;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 1)\r\n\t\t\t\trv++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nstatic void L5makeDungeon()\r\n{\r\n\tint i, j;\r\n\tint i_2, j_2;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tj_2 = j << 1;\r\n\t\t\ti_2 = i << 1;\r\n\t\t\tL5dungeon[i_2][j_2] = dungeon[i][j];\r\n\t\t\tL5dungeon[i_2][j_2 + 1] = dungeon[i][j];\r\n\t\t\tL5dungeon[i_2 + 1][j_2] = dungeon[i][j];\r\n\t\t\tL5dungeon[i_2 + 1][j_2 + 1] = dungeon[i][j];\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L5makeDmt()\r\n{\r\n\tint i, j, idx, val, dmtx, dmty;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 22;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (j = 0, dmty = 1; dmty <= 77; j++, dmty += 2) {\r\n\t\tfor (i = 0, dmtx = 1; dmtx <= 77; i++, dmtx += 2) {\r\n\t\t\tval = 8 * L5dungeon[dmtx + 1][dmty + 1]\r\n\t\t\t    + 4 * L5dungeon[dmtx][dmty + 1]\r\n\t\t\t    + 2 * L5dungeon[dmtx + 1][dmty]\r\n\t\t\t    + L5dungeon[dmtx][dmty];\r\n\t\t\tidx = L5ConvTbl[val];\r\n\t\t\tdungeon[i][j] = idx;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic int L5HWallOk(int i, int j)\r\n{\r\n\tint x;\r\n\tBOOL wallok;\r\n\r\n\tfor (x = 1; dungeon[i + x][j] == 13; x++) {\r\n\t\tif (dungeon[i + x][j - 1] != 13 || dungeon[i + x][j + 1] != 13 || L5dflags[i + x][j])\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\twallok = FALSE;\r\n\tif (dungeon[i + x][j] >= 3 && dungeon[i + x][j] <= 7)\r\n\t\twallok = TRUE;\r\n\tif (dungeon[i + x][j] >= 16 && dungeon[i + x][j] <= 24)\r\n\t\twallok = TRUE;\r\n\tif (dungeon[i + x][j] == 22)\r\n\t\twallok = FALSE;\r\n\tif (x == 1)\r\n\t\twallok = FALSE;\r\n\r\n\tif (wallok)\r\n\t\treturn x;\r\n\telse\r\n\t\treturn -1;\r\n}\r\n\r\nstatic int L5VWallOk(int i, int j)\r\n{\r\n\tint y;\r\n\tBOOL wallok;\r\n\r\n\tfor (y = 1; dungeon[i][j + y] == 13; y++) {\r\n\t\tif (dungeon[i - 1][j + y] != 13 || dungeon[i + 1][j + y] != 13 || L5dflags[i][j + y])\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\twallok = FALSE;\r\n\tif (dungeon[i][j + y] >= 3 && dungeon[i][j + y] <= 7)\r\n\t\twallok = TRUE;\r\n\tif (dungeon[i][j + y] >= 16 && dungeon[i][j + y] <= 24)\r\n\t\twallok = TRUE;\r\n\tif (dungeon[i][j + y] == 22)\r\n\t\twallok = FALSE;\r\n\tif (y == 1)\r\n\t\twallok = FALSE;\r\n\r\n\tif (wallok)\r\n\t\treturn y;\r\n\telse\r\n\t\treturn -1;\r\n}\r\n\r\nstatic void L5HorizWall(int i, int j, char p, int dx)\r\n{\r\n\tint xx;\r\n\tchar wt, dt;\r\n\r\n\tswitch (random_(0, 4)) {\r\n\tcase 0:\r\n\tcase 1:\r\n\t\tdt = 2;\r\n\t\tbreak;\r\n\tcase 2:\r\n\t\tdt = 12;\r\n\t\tif (p == 2)\r\n\t\t\tp = 12;\r\n\t\tif (p == 4)\r\n\t\t\tp = 10;\r\n\t\tbreak;\r\n\tcase 3:\r\n\t\tdt = 36;\r\n\t\tif (p == 2)\r\n\t\t\tp = 36;\r\n\t\tif (p == 4)\r\n\t\t\tp = 27;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (random_(0, 6) == 5)\r\n\t\twt = 12;\r\n\telse\r\n\t\twt = 26;\r\n\tif (dt == 12)\r\n\t\twt = 12;\r\n\r\n\tdungeon[i][j] = p;\r\n\r\n\tfor (xx = 1; xx < dx; xx++) {\r\n\t\tdungeon[i + xx][j] = dt;\r\n\t}\r\n\r\n\txx = random_(0, dx - 1) + 1;\r\n\r\n\tif (wt == 12) {\r\n\t\tdungeon[i + xx][j] = wt;\r\n\t} else {\r\n\t\tdungeon[i + xx][j] = 2;\r\n\t\tL5dflags[i + xx][j] |= DLRG_HDOOR;\r\n\t}\r\n}\r\n\r\nstatic void L5VertWall(int i, int j, char p, int dy)\r\n{\r\n\tint yy;\r\n\tchar wt, dt;\r\n\r\n\tswitch (random_(0, 4)) {\r\n\tcase 0:\r\n\tcase 1:\r\n\t\tdt = 1;\r\n\t\tbreak;\r\n\tcase 2:\r\n\t\tdt = 11;\r\n\t\tif (p == 1)\r\n\t\t\tp = 11;\r\n\t\tif (p == 4)\r\n\t\t\tp = 14;\r\n\t\tbreak;\r\n\tcase 3:\r\n\t\tdt = 35;\r\n\t\tif (p == 1)\r\n\t\t\tp = 35;\r\n\t\tif (p == 4)\r\n\t\t\tp = 37;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (random_(0, 6) == 5)\r\n\t\twt = 11;\r\n\telse\r\n\t\twt = 25;\r\n\tif (dt == 11)\r\n\t\twt = 11;\r\n\r\n\tdungeon[i][j] = p;\r\n\r\n\tfor (yy = 1; yy < dy; yy++) {\r\n\t\tdungeon[i][j + yy] = dt;\r\n\t}\r\n\r\n\tyy = random_(0, dy - 1) + 1;\r\n\r\n\tif (wt == 11) {\r\n\t\tdungeon[i][j + yy] = wt;\r\n\t} else {\r\n\t\tdungeon[i][j + yy] = 1;\r\n\t\tL5dflags[i][j + yy] |= DLRG_VDOOR;\r\n\t}\r\n}\r\n\r\nstatic void L5AddWall()\r\n{\r\n\tint i, j, x, y;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (!L5dflags[i][j]) {\r\n\t\t\t\tif (dungeon[i][j] == 3 && random_(0, 100) < 100) {\r\n\t\t\t\t\tx = L5HWallOk(i, j);\r\n\t\t\t\t\tif (x != -1)\r\n\t\t\t\t\t\tL5HorizWall(i, j, 2, x);\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[i][j] == 3 && random_(0, 100) < 100) {\r\n\t\t\t\t\ty = L5VWallOk(i, j);\r\n\t\t\t\t\tif (y != -1)\r\n\t\t\t\t\t\tL5VertWall(i, j, 1, y);\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[i][j] == 6 && random_(0, 100) < 100) {\r\n\t\t\t\t\tx = L5HWallOk(i, j);\r\n\t\t\t\t\tif (x != -1)\r\n\t\t\t\t\t\tL5HorizWall(i, j, 4, x);\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[i][j] == 7 && random_(0, 100) < 100) {\r\n\t\t\t\t\ty = L5VWallOk(i, j);\r\n\t\t\t\t\tif (y != -1)\r\n\t\t\t\t\t\tL5VertWall(i, j, 4, y);\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[i][j] == 2 && random_(0, 100) < 100) {\r\n\t\t\t\t\tx = L5HWallOk(i, j);\r\n\t\t\t\t\tif (x != -1)\r\n\t\t\t\t\t\tL5HorizWall(i, j, 2, x);\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[i][j] == 1 && random_(0, 100) < 100) {\r\n\t\t\t\t\ty = L5VWallOk(i, j);\r\n\t\t\t\t\tif (y != -1)\r\n\t\t\t\t\t\tL5VertWall(i, j, 1, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L5GChamber(int sx, int sy, BOOL topflag, BOOL bottomflag, BOOL leftflag, BOOL rightflag)\r\n{\r\n\tint i, j;\r\n\r\n\tif (topflag == TRUE) {\r\n\t\tdungeon[sx + 2][sy] = 12;\r\n\t\tdungeon[sx + 3][sy] = 12;\r\n\t\tdungeon[sx + 4][sy] = 3;\r\n\t\tdungeon[sx + 7][sy] = 9;\r\n\t\tdungeon[sx + 8][sy] = 12;\r\n\t\tdungeon[sx + 9][sy] = 2;\r\n\t}\r\n\tif (bottomflag == TRUE) {\r\n\t\tsy += 11;\r\n\t\tdungeon[sx + 2][sy] = 10;\r\n\t\tdungeon[sx + 3][sy] = 12;\r\n\t\tdungeon[sx + 4][sy] = 8;\r\n\t\tdungeon[sx + 7][sy] = 5;\r\n\t\tdungeon[sx + 8][sy] = 12;\r\n\t\tif (dungeon[sx + 9][sy] != 4) {\r\n\t\t\tdungeon[sx + 9][sy] = 21;\r\n\t\t}\r\n\t\tsy -= 11;\r\n\t}\r\n\tif (leftflag == TRUE) {\r\n\t\tdungeon[sx][sy + 2] = 11;\r\n\t\tdungeon[sx][sy + 3] = 11;\r\n\t\tdungeon[sx][sy + 4] = 3;\r\n\t\tdungeon[sx][sy + 7] = 8;\r\n\t\tdungeon[sx][sy + 8] = 11;\r\n\t\tdungeon[sx][sy + 9] = 1;\r\n\t}\r\n\tif (rightflag == TRUE) {\r\n\t\tsx += 11;\r\n\t\tdungeon[sx][sy + 2] = 14;\r\n\t\tdungeon[sx][sy + 3] = 11;\r\n\t\tdungeon[sx][sy + 4] = 9;\r\n\t\tdungeon[sx][sy + 7] = 5;\r\n\t\tdungeon[sx][sy + 8] = 11;\r\n\t\tif (dungeon[sx][sy + 9] != 4) {\r\n\t\t\tdungeon[sx][sy + 9] = 21;\r\n\t\t}\r\n\t\tsx -= 11;\r\n\t}\r\n\r\n\tfor (j = 1; j < 11; j++) {\r\n\t\tfor (i = 1; i < 11; i++) {\r\n\t\t\tdungeon[i + sx][j + sy] = 13;\r\n\t\t\tL5dflags[i + sx][j + sy] |= DLRG_CHAMBER;\r\n\t\t}\r\n\t}\r\n\r\n\tdungeon[sx + 4][sy + 4] = 15;\r\n\tdungeon[sx + 7][sy + 4] = 15;\r\n\tdungeon[sx + 4][sy + 7] = 15;\r\n\tdungeon[sx + 7][sy + 7] = 15;\r\n}\r\n\r\nstatic void DRLG_L5GHall(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i;\r\n\r\n\tif (y1 == y2) {\r\n\t\tfor (i = x1; i < x2; i++) {\r\n\t\t\tdungeon[i][y1] = 12;\r\n\t\t\tdungeon[i][y1 + 3] = 12;\r\n\t\t}\r\n\t} else {\r\n\t\tfor (i = y1; i < y2; i++) {\r\n\t\t\tdungeon[x1][i] = 11;\r\n\t\t\tdungeon[x1 + 3][i] = 11;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L5tileFix()\r\n{\r\n\tint i, j;\r\n\r\n\t// BUGFIX: Bounds checks are required in all loop bodies.\r\n\t// See https://github.com/diasurgical/devilutionX/pull/401\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 22)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i + 1][j] == 22)\r\n\t\t\t\tdungeon[i + 1][j] = 18;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i + 1][j] == 2)\r\n\t\t\t\tdungeon[i + 1][j] = 7;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i + 1][j] == 22)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 22)\r\n\t\t\t\tdungeon[i][j + 1] = 24;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 1)\r\n\t\t\t\tdungeon[i][j + 1] = 6;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 22)\r\n\t\t\t\tdungeon[i][j + 1] = 19;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i + 1][j] == 19)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i + 1][j] == 22)\r\n\t\t\t\tdungeon[i + 1][j] = 20;\r\n\t\t\tif (dungeon[i][j] == 7 && dungeon[i + 1][j] == 22)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i + 1][j] == 24)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 22)\r\n\t\t\t\tdungeon[i + 1][j] = 20;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 19)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 6;\r\n\t\t\tif (dungeon[i][j] == 7 && dungeon[i + 1][j] == 19)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 6;\r\n\t\t\tif (dungeon[i][j] == 3 && dungeon[i + 1][j] == 22)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 6;\r\n\t\t\tif (dungeon[i][j] == 7 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 6;\r\n\t\t\tif (dungeon[i][j] == 7 && dungeon[i + 1][j] == 24)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 4 && dungeon[i + 1][j] == 16)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 7 && dungeon[i + 1][j] == 13)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 24)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 13)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i - 1][j] == 22)\r\n\t\t\t\tdungeon[i - 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i - 1][j] == 23)\r\n\t\t\t\tdungeon[i - 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i - 1][j] == 22)\r\n\t\t\t\tdungeon[i - 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i - 1][j] == 23)\r\n\t\t\t\tdungeon[i - 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 7;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j + 1] == 18)\r\n\t\t\t\tdungeon[i][j + 1] = 21;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 7;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 7;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 7;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j + 1] == 22)\r\n\t\t\t\tdungeon[i][j + 1] = 24;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j + 1] == 13)\r\n\t\t\t\tdungeon[i][j + 1] = 16;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 13)\r\n\t\t\t\tdungeon[i][j + 1] = 16;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 16)\r\n\t\t\t\tdungeon[i][j + 1] = 17;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j - 1] == 22)\r\n\t\t\t\tdungeon[i][j - 1] = 7;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j - 1] == 22)\r\n\t\t\t\tdungeon[i][j - 1] = 24;\r\n\t\t\tif (dungeon[i][j] == 7 && dungeon[i][j - 1] == 24)\r\n\t\t\t\tdungeon[i][j - 1] = 21;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j - 1] == 24)\r\n\t\t\t\tdungeon[i][j - 1] = 21;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 4 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 7;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 19)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] == 22)\r\n\t\t\t\tdungeon[i][j + 1] = 20;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid drlg_l1_crypt_rndset(const BYTE *miniset, int rndper)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, ii, kk;\r\n\tBOOL found;\r\n\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tfor (sy = 0; sy < DMAXY - sh; sy++) {\r\n\t\tfor (sx = 0; sx < DMAXX - sw; sx++) {\r\n\t\t\tfound = TRUE;\r\n\t\t\tii = 2;\r\n\t\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) { // BUGFIX: Should be L5dflags or it will always be false\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tkk = sw * sh + 2;\r\n\t\t\t// BUGFIX: This code is copied from Cave and should not be applied for crypt\r\n\t\t\tif (miniset[kk] >= 84 && miniset[kk] <= 100 && found == TRUE) {\r\n\t\t\t\t// BUGFIX: accesses to dungeon can go out of bounds\r\n\t\t\t\t// BUGFIX: Comparisons vs 100 should use same tile as comparisons vs 84.\r\n\t\t\t\tif (dungeon[sx - 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx + 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx][sy + 1] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx][sy - 1] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (found == TRUE && random_(0, 100) < rndper) {\r\n\t\t\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\t\t\tif (miniset[kk] != 0) {\r\n\t\t\t\t\t\t\tdungeon[xx + sx][yy + sy] = miniset[kk];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tkk++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nstatic void DRLG_L5Subs()\r\n{\r\n\tint x, y, rv, i;\r\n\r\n\tfor (y = 0; y < DMAXY; y++) {\r\n\t\tfor (x = 0; x < DMAXX; x++) {\r\n\t\t\tif (random_(0, 4) == 0) {\r\n\t\t\t\tBYTE c = L5BTYPES[dungeon[x][y]];\r\n\r\n\t\t\t\tif (c && !L5dflags[x][y]) {\r\n\t\t\t\t\trv = random_(0, 16);\r\n\t\t\t\t\ti = -1;\r\n\r\n\t\t\t\t\twhile (rv >= 0) {\r\n\t\t\t\t\t\tif (++i == sizeof(L5BTYPES))\r\n\t\t\t\t\t\t\ti = 0;\r\n\t\t\t\t\t\tif (c == L5BTYPES[i])\r\n\t\t\t\t\t\t\trv--;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// BUGFIX: Add `&& y > 0` to the if statement.\r\n\t\t\t\t\tif (i == 89) {\r\n\t\t\t\t\t\tif (L5BTYPES[dungeon[x][y - 1]] != 79 || L5dflags[x][y - 1])\r\n\t\t\t\t\t\t\ti = 79;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tdungeon[x][y - 1] = 90;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// BUGFIX: Add `&& x + 1 < DMAXX` to the if statement.\r\n\t\t\t\t\tif (i == 91) {\r\n\t\t\t\t\t\tif (L5BTYPES[dungeon[x + 1][y]] != 80 || L5dflags[x + 1][y])\r\n\t\t\t\t\t\t\ti = 80;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tdungeon[x + 1][y] = 92;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdungeon[x][y] = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L5SetRoom(int rx1, int ry1)\r\n{\r\n\tint rw, rh, i, j;\r\n\tBYTE *sp;\r\n\r\n\trw = *L5pSetPiece;\r\n\trh = *(L5pSetPiece + 2);\r\n\r\n\tsetpc_x = rx1;\r\n\tsetpc_y = ry1;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\r\n\tsp = L5pSetPiece + 4;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*sp) {\r\n\t\t\t\tdungeon[rx1 + i][ry1 + j] = *sp;\r\n\t\t\t\tL5dflags[rx1 + i][ry1 + j] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[rx1 + i][ry1 + j] = 13;\r\n\t\t\t}\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L5FillChambers()\r\n{\r\n\tint c;\r\n\r\n\tif (HR1)\r\n\t\tDRLG_L5GChamber(0, 14, 0, 0, 0, 1);\r\n\r\n\tif (HR2) {\r\n\t\tif (HR1 && !HR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 0, 0, 1, 0);\r\n\t\tif (!HR1 && HR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 0, 0, 0, 1);\r\n\t\tif (HR1 && HR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 0, 0, 1, 1);\r\n\t\tif (!HR1 && !HR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 0, 0, 0, 0);\r\n\t}\r\n\r\n\tif (HR3)\r\n\t\tDRLG_L5GChamber(28, 14, 0, 0, 1, 0);\r\n\tif (HR1 && HR2)\r\n\t\tDRLG_L5GHall(12, 18, 14, 18);\r\n\tif (HR2 && HR3)\r\n\t\tDRLG_L5GHall(26, 18, 28, 18);\r\n\tif (HR1 && !HR2 && HR3)\r\n\t\tDRLG_L5GHall(12, 18, 28, 18);\r\n\tif (VR1)\r\n\t\tDRLG_L5GChamber(14, 0, 0, 1, 0, 0);\r\n\r\n\tif (VR2) {\r\n\t\tif (VR1 && !VR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 1, 0, 0, 0);\r\n\t\tif (!VR1 && VR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 0, 1, 0, 0);\r\n\t\tif (VR1 && VR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 1, 1, 0, 0);\r\n\t\tif (!VR1 && !VR3)\r\n\t\t\tDRLG_L5GChamber(14, 14, 0, 0, 0, 0);\r\n\t}\r\n\r\n\tif (VR3)\r\n\t\tDRLG_L5GChamber(14, 28, 1, 0, 0, 0);\r\n\tif (VR1 && VR2)\r\n\t\tDRLG_L5GHall(18, 12, 18, 14);\r\n\tif (VR2 && VR3)\r\n\t\tDRLG_L5GHall(18, 26, 18, 28);\r\n\tif (VR1 && !VR2 && VR3)\r\n\t\tDRLG_L5GHall(18, 12, 18, 28);\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 24) {\r\n\t\tif (VR1 || VR2 || VR3) {\r\n\t\t\tc = 1;\r\n\t\t\tif (!VR1 && VR2 && VR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 2;\r\n\t\t\tif (VR1 && VR2 && !VR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 0;\r\n\r\n\t\t\tif (VR1 && !VR2 && VR3) {\r\n\t\t\t\tif (random_(0, 2) != 0)\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\tc = 2;\r\n\t\t\t}\r\n\r\n\t\t\tif (VR1 && VR2 && VR3)\r\n\t\t\t\tc = random_(0, 3);\r\n\r\n\t\t\tswitch (c) {\r\n\t\t\tcase 0:\r\n\t\t\t\tdrlg_l1_set_crypt_room(16, 2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tdrlg_l1_set_crypt_room(16, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tdrlg_l1_set_crypt_room(16, 30);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tc = 1;\r\n\t\t\tif (!HR1 && HR2 && HR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 2;\r\n\t\t\tif (HR1 && HR2 && !HR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 0;\r\n\r\n\t\t\tif (HR1 && !HR2 && HR3) {\r\n\t\t\t\tif (random_(0, 2) != 0)\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\tc = 2;\r\n\t\t\t}\r\n\r\n\t\t\tif (HR1 && HR2 && HR3)\r\n\t\t\t\tc = random_(0, 3);\r\n\r\n\t\t\tswitch (c) {\r\n\t\t\tcase 0:\r\n\t\t\t\tdrlg_l1_set_crypt_room(2, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tdrlg_l1_set_crypt_room(16, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tdrlg_l1_set_crypt_room(30, 16);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (currlevel == 21) {\r\n\t\tif (VR1 || VR2 || VR3) {\r\n\t\t\tc = 1;\r\n\t\t\tif (!VR1 && VR2 && VR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 2;\r\n\t\t\tif (VR1 && VR2 && !VR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 0;\r\n\r\n\t\t\tif (VR1 && !VR2 && VR3) {\r\n\t\t\t\tif (random_(0, 2) != 0)\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\tc = 2;\r\n\t\t\t}\r\n\r\n\t\t\tif (VR1 && VR2 && VR3)\r\n\t\t\t\tc = random_(0, 3);\r\n\r\n\t\t\tswitch (c) {\r\n\t\t\tcase 0:\r\n\t\t\t\tdrlg_l1_set_corner_room(16, 2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tdrlg_l1_set_corner_room(16, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tdrlg_l1_set_corner_room(16, 30);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tc = 1;\r\n\t\t\tif (!HR1 && HR2 && HR3 && random_(0, 2))\r\n\t\t\t\tc = 2;\r\n\t\t\tif (HR1 && HR2 && !HR3 && random_(0, 2))\r\n\t\t\t\tc = 0;\r\n\r\n\t\t\tif (HR1 && !HR2 && HR3) {\r\n\t\t\t\tif (random_(0, 2))\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\tc = 2;\r\n\t\t\t}\r\n\r\n\t\t\tif (HR1 && HR2 && HR3)\r\n\t\t\t\tc = random_(0, 3);\r\n\r\n\t\t\tswitch (c) {\r\n\t\t\tcase 0:\r\n\t\t\t\tdrlg_l1_set_corner_room(2, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tdrlg_l1_set_corner_room(16, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tdrlg_l1_set_corner_room(30, 16);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\tif (L5setloadflag) {\r\n\t\tif (VR1 || VR2 || VR3) {\r\n\t\t\tc = 1;\r\n\t\t\tif (!VR1 && VR2 && VR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 2;\r\n\t\t\tif (VR1 && VR2 && !VR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 0;\r\n\r\n\t\t\tif (VR1 && !VR2 && VR3) {\r\n\t\t\t\tif (random_(0, 2) != 0)\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\tc = 2;\r\n\t\t\t}\r\n\r\n\t\t\tif (VR1 && VR2 && VR3)\r\n\t\t\t\tc = random_(0, 3);\r\n\r\n\t\t\tswitch (c) {\r\n\t\t\tcase 0:\r\n\t\t\t\tDRLG_L5SetRoom(16, 2);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tDRLG_L5SetRoom(16, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tDRLG_L5SetRoom(16, 30);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tc = 1;\r\n\t\t\tif (!HR1 && HR2 && HR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 2;\r\n\t\t\tif (HR1 && HR2 && !HR3 && random_(0, 2) != 0)\r\n\t\t\t\tc = 0;\r\n\r\n\t\t\tif (HR1 && !HR2 && HR3) {\r\n\t\t\t\tif (random_(0, 2) != 0)\r\n\t\t\t\t\tc = 0;\r\n\t\t\t\telse\r\n\t\t\t\t\tc = 2;\r\n\t\t\t}\r\n\r\n\t\t\tif (HR1 && HR2 && HR3)\r\n\t\t\t\tc = random_(0, 3);\r\n\r\n\t\t\tswitch (c) {\r\n\t\t\tcase 0:\r\n\t\t\t\tDRLG_L5SetRoom(2, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tDRLG_L5SetRoom(16, 16);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tDRLG_L5SetRoom(30, 16);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid drlg_l1_set_crypt_room(int rx1, int ry1)\r\n{\r\n\tint rw, rh, i, j, sp;\r\n\r\n\trw = UberRoomPattern[0];\r\n\trh = UberRoomPattern[1];\r\n\r\n\tUberRow = 2 * rx1 + 6;\r\n\tUberCol = 2 * ry1 + 8;\r\n\tsetpc_x = rx1;\r\n\tsetpc_y = ry1;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\tIsUberRoomOpened = 0;\r\n\tdword_577368 = 0;\r\n\tIsUberLeverActivated = 0;\r\n\r\n\tsp = 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (UberRoomPattern[sp]) {\r\n\t\t\t\tdungeon[rx1 + i][ry1 + j] = UberRoomPattern[sp];\r\n\t\t\t\tL5dflags[rx1 + i][ry1 + j] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[rx1 + i][ry1 + j] = 13;\r\n\t\t\t}\r\n\t\t\tsp++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid drlg_l1_set_corner_room(int rx1, int ry1)\r\n{\r\n\tint rw, rh, i, j, sp;\r\n\r\n\trw = CornerstoneRoomPattern[0];\r\n\trh = CornerstoneRoomPattern[1];\r\n\r\n\tsetpc_x = rx1;\r\n\tsetpc_y = ry1;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\r\n\tsp = 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (CornerstoneRoomPattern[sp]) {\r\n\t\t\t\tdungeon[rx1 + i][ry1 + j] = CornerstoneRoomPattern[sp];\r\n\t\t\t\tL5dflags[rx1 + i][ry1 + j] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[rx1 + i][ry1 + j] = 13;\r\n\t\t\t}\r\n\t\t\tsp++;\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nstatic void DRLG_L5FTVR(int i, int j, int x, int y, int d)\r\n{\r\n\tif (dTransVal[x][y] || dungeon[i][j] != 13) {\r\n\t\tif (d == 1) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 2) {\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 3) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t}\r\n\t\tif (d == 4) {\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 5)\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\tif (d == 6)\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\tif (d == 7)\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\tif (d == 8)\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t} else {\r\n\t\tdTransVal[x][y] = TransVal;\r\n\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\tDRLG_L5FTVR(i + 1, j, x + 2, y, 1);\r\n\t\tDRLG_L5FTVR(i - 1, j, x - 2, y, 2);\r\n\t\tDRLG_L5FTVR(i, j + 1, x, y + 2, 3);\r\n\t\tDRLG_L5FTVR(i, j - 1, x, y - 2, 4);\r\n\t\tDRLG_L5FTVR(i - 1, j - 1, x - 2, y - 2, 5);\r\n\t\tDRLG_L5FTVR(i + 1, j - 1, x + 2, y - 2, 6);\r\n\t\tDRLG_L5FTVR(i - 1, j + 1, x - 2, y + 2, 7);\r\n\t\tDRLG_L5FTVR(i + 1, j + 1, x + 2, y + 2, 8);\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L5FloodTVal()\r\n{\r\n\tint xx, yy, i, j;\r\n\r\n\tyy = 16;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 13 && !dTransVal[xx][yy]) {\r\n\t\t\t\tDRLG_L5FTVR(i, j, xx, yy, 0);\r\n\t\t\t\tTransVal++;\r\n\t\t\t}\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L5TransFix()\r\n{\r\n\tint xx, yy, i, j;\r\n\r\n\tyy = 16;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\t// BUGFIX: Should check for `j > 0` first.\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i][j - 1] == 18) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\t// BUGFIX: Should check for `i + 1 < DMAXY` first.\r\n\t\t\tif (dungeon[i][j] == 24 && dungeon[i + 1][j] == 19) {\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 18) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 19) {\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 20) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L5DirtFix()\r\n{\r\n\tint i, j;\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 21) {\r\n\t\tfor (j = 0; j < DMAXY - 1; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX - 1; i++) {\r\n\t\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] != 19)\r\n\t\t\t\t\tdungeon[i][j] = 202;\r\n\t\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] != 19)\r\n\t\t\t\t\tdungeon[i][j] = 200;\r\n\t\t\t\tif (dungeon[i][j] == 24 && dungeon[i + 1][j] != 19)\r\n\t\t\t\t\tdungeon[i][j] = 205;\r\n\t\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] != 18)\r\n\t\t\t\t\tdungeon[i][j] = 199;\r\n\t\t\t\tif (dungeon[i][j] == 21 && dungeon[i][j + 1] != 18)\r\n\t\t\t\t\tdungeon[i][j] = 202;\r\n\t\t\t\tif (dungeon[i][j] == 23 && dungeon[i][j + 1] != 18)\r\n\t\t\t\t\tdungeon[i][j] = 204;\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tfor (j = 0; j < DMAXY - 1; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX - 1; i++) {\r\n\t\t\t\tif (dungeon[i][j] == 19)\r\n\t\t\t\t\tdungeon[i][j] = 83;\r\n\t\t\t\tif (dungeon[i][j] == 21)\r\n\t\t\t\t\tdungeon[i][j] = 85;\r\n\t\t\t\tif (dungeon[i][j] == 23)\r\n\t\t\t\t\tdungeon[i][j] = 87;\r\n\t\t\t\tif (dungeon[i][j] == 24)\r\n\t\t\t\t\tdungeon[i][j] = 88;\r\n\t\t\t\tif (dungeon[i][j] == 18)\r\n\t\t\t\t\tdungeon[i][j] = 82;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#else\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] != 19)\r\n\t\t\t\tdungeon[i][j] = 202;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] != 19)\r\n\t\t\t\tdungeon[i][j] = 200;\r\n\t\t\tif (dungeon[i][j] == 24 && dungeon[i + 1][j] != 19)\r\n\t\t\t\tdungeon[i][j] = 205;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] != 18)\r\n\t\t\t\tdungeon[i][j] = 199;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i][j + 1] != 18)\r\n\t\t\t\tdungeon[i][j] = 202;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i][j + 1] != 18)\r\n\t\t\t\tdungeon[i][j] = 204;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\nstatic void DRLG_L5CornerFix()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 1; j < DMAXY - 1; j++) {\r\n\t\tfor (i = 1; i < DMAXX - 1; i++) {\r\n\t\t\tif (!(L5dflags[i][j] & DLRG_PROTECTED) && dungeon[i][j] == 17 && dungeon[i - 1][j] == 13 && dungeon[i][j - 1] == 1) {\r\n\t\t\t\tdungeon[i][j] = 16;\r\n\t\t\t\tL5dflags[i][j - 1] &= DLRG_PROTECTED; // BUGFIX: Should be |= or it will clear all flags\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 202 && dungeon[i + 1][j] == 13 && dungeon[i][j + 1] == 1) {\r\n\t\t\t\tdungeon[i][j] = 8;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L5(int entry)\r\n{\r\n\tint i, j;\r\n\tLONG minarea;\r\n\tBOOL doneflag;\r\n\r\n\tswitch (currlevel) {\r\n\tcase 1:\r\n\t\tminarea = 533;\r\n\t\tbreak;\r\n\tcase 2:\r\n\t\tminarea = 693;\r\n\t\tbreak;\r\n\tcase 3:\r\n\tcase 4:\r\n\t\tminarea = 761;\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tdefault:\r\n\t\tminarea = 761;\r\n\t\tbreak;\r\n#endif\r\n\t}\r\n\r\n\tdo {\r\n\t\tDRLG_InitTrans();\r\n\r\n\t\tdo {\r\n\t\t\tInitL5Dungeon();\r\n\t\t\tL5firstRoom();\r\n\t\t} while (L5GetArea() < minarea);\r\n\r\n\t\tL5makeDungeon();\r\n\t\tL5makeDmt();\r\n\t\tL5FillChambers();\r\n\t\tL5tileFix();\r\n\t\tL5AddWall();\r\n\t\tL5ClearFlags();\r\n\t\tDRLG_L5FloodTVal();\r\n\r\n\t\tdoneflag = TRUE;\r\n\r\n\t\tif (QuestStatus(Q_PWATER)) {\r\n\t\t\tif (entry == ENTRY_MAIN) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(PWATERIN, 1, 1, 0, 0, TRUE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t} else {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(PWATERIN, 1, 1, 0, 0, FALSE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tViewY--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (QuestStatus(Q_LTBANNER)) {\r\n\t\t\tif (entry == ENTRY_MAIN) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, TRUE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t} else {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, FALSE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (entry == ENTRY_PREV) {\r\n\t\t\t\t\tViewX = 2 * setpc_x + 20;\r\n\t\t\t\t\tViewY = 2 * setpc_y + 28;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tViewY--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t} else if (entry == ENTRY_MAIN) {\r\n\t\t\tif (currlevel < 21) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, TRUE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, FALSE, -1, 1) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t} else if (currlevel == 21) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSTOWN, 1, 1, 0, 0, FALSE, -1, 6) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, FALSE, -1, 1) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tViewY++;\r\n\t\t\t} else {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, TRUE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (currlevel != 24) {\r\n\t\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, FALSE, -1, 1) < 0)\r\n\t\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tViewY++;\r\n\t\t\t}\r\n\t\t} else if (entry == ENTRY_PREV) {\r\n\t\t\tif (currlevel < 21) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, FALSE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, TRUE, -1, 1) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tViewY--;\r\n\t\t\t} else if (currlevel == 21) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSTOWN, 1, 1, 0, 0, FALSE, -1, 6) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, TRUE, -1, 1) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tViewY += 3;\r\n\t\t\t} else {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, TRUE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (currlevel != 24) {\r\n\t\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, TRUE, -1, 1) < 0)\r\n\t\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tViewY += 3;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (currlevel < 21) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, FALSE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, FALSE, -1, 1) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t} else if (currlevel == 21) {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSTOWN, 1, 1, 0, 0, TRUE, -1, 6) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, FALSE, -1, 1) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t} else {\r\n\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, TRUE, -1, 0) < 0)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\tif (currlevel != 24) {\r\n\t\t\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, FALSE, -1, 1) < 0)\r\n\t\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n#else\r\n\t\t} else if (entry == ENTRY_MAIN) {\r\n\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, TRUE, -1, 0) < 0)\r\n\t\t\t\tdoneflag = FALSE;\r\n\t\t\telse if (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, FALSE, -1, 1) < 0)\r\n\t\t\t\tdoneflag = FALSE;\r\n\t\t} else {\r\n\t\t\tif (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, FALSE, -1, 0) < 0)\r\n\t\t\t\tdoneflag = FALSE;\r\n\t\t\telse if (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, TRUE, -1, 1) < 0)\r\n\t\t\t\tdoneflag = FALSE;\r\n\t\t\tViewY--;\r\n#endif\r\n\t\t}\r\n\t} while (doneflag == FALSE);\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 64) {\r\n\t\t\t\tint xx = 2 * i + 16; /* todo: fix loop */\r\n\t\t\t\tint yy = 2 * j + 16;\r\n\t\t\t\tDRLG_CopyTrans(xx, yy + 1, xx, yy);\r\n\t\t\t\tDRLG_CopyTrans(xx + 1, yy + 1, xx + 1, yy);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_L5TransFix();\r\n\tDRLG_L5DirtFix();\r\n\tDRLG_L5CornerFix();\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (L5dflags[i][j] & 0x7F)\r\n\t\t\t\tDRLG_PlaceDoor(i, j);\r\n\t\t}\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 21) {\r\n\t\tDRLG_L5Subs();\r\n\t} else {\r\n\t\tdrlg_l1_crypt_pattern1(10);\r\n\t\tdrlg_l1_crypt_rndset(byte_48A1B4, 95);\r\n\t\tdrlg_l1_crypt_rndset(byte_48A1B8, 95);\r\n\t\tdrlg_l1_crypt_rndset(byte_48A1C0, 100);\r\n\t\tdrlg_l1_crypt_rndset(byte_48A1C8, 100);\r\n\t\tdrlg_l1_crypt_rndset(byte_48A1E0, 60);\r\n\t\tdrlg_l1_crypt_lavafloor();\r\n\t\tswitch (currlevel) {\r\n\t\tcase 21:\r\n\t\t\tdrlg_l1_crypt_pattern2(30);\r\n\t\t\tdrlg_l1_crypt_pattern3(15);\r\n\t\t\tdrlg_l1_crypt_pattern4(5);\r\n\t\t\tdrlg_l1_crypt_lavafloor();\r\n\t\t\tdrlg_l1_crypt_pattern7(10);\r\n\t\t\tdrlg_l1_crypt_pattern6(5);\r\n\t\t\tdrlg_l1_crypt_pattern5(20);\r\n\t\t\tbreak;\r\n\t\tcase 22:\r\n\t\t\tdrlg_l1_crypt_pattern7(10);\r\n\t\t\tdrlg_l1_crypt_pattern6(10);\r\n\t\t\tdrlg_l1_crypt_pattern5(20);\r\n\t\t\tdrlg_l1_crypt_pattern2(30);\r\n\t\t\tdrlg_l1_crypt_pattern3(20);\r\n\t\t\tdrlg_l1_crypt_pattern4(10);\r\n\t\t\tdrlg_l1_crypt_lavafloor();\r\n\t\t\tbreak;\r\n\t\tcase 23:\r\n\t\t\tdrlg_l1_crypt_pattern7(10);\r\n\t\t\tdrlg_l1_crypt_pattern6(15);\r\n\t\t\tdrlg_l1_crypt_pattern5(30);\r\n\t\t\tdrlg_l1_crypt_pattern2(30);\r\n\t\t\tdrlg_l1_crypt_pattern3(20);\r\n\t\t\tdrlg_l1_crypt_pattern4(15);\r\n\t\t\tdrlg_l1_crypt_lavafloor();\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tdrlg_l1_crypt_pattern7(10);\r\n\t\t\tdrlg_l1_crypt_pattern6(20);\r\n\t\t\tdrlg_l1_crypt_pattern5(30);\r\n\t\t\tdrlg_l1_crypt_pattern2(30);\r\n\t\t\tdrlg_l1_crypt_pattern3(20);\r\n\t\t\tdrlg_l1_crypt_pattern4(20);\r\n\t\t\tdrlg_l1_crypt_lavafloor();\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n#else\r\n\tDRLG_L5Subs();\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 21)\r\n#endif\r\n\t\tDRLG_L1Shadows();\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 21)\r\n#endif\r\n\t\tDRLG_PlaceMiniSet(LAMPS, 5, 10, 0, 0, FALSE, -1, 4);\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 21)\r\n#endif\r\n\t\tDRLG_L1Floor();\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tpdungeon[i][j] = dungeon[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_Init_Globals();\r\n\tDRLG_CheckQuests(setpc_x, setpc_y);\r\n}\r\n\r\nvoid CreateL5Dungeon(DWORD rseed, int entry)\r\n{\r\n#ifdef HELLFIRE\r\n\tint i, j;\r\n#endif\r\n\r\n\tSetRndSeed(rseed);\r\n\r\n\tdminx = 16;\r\n\tdminy = 16;\r\n\tdmaxx = 96;\r\n\tdmaxy = 96;\r\n\r\n#ifdef HELLFIRE\r\n\tUberRow = 0;\r\n\tUberCol = 0;\r\n\tIsUberRoomOpened = 0;\r\n\tdword_577368 = 0;\r\n\tUberLeverRow = 0;\r\n\tUberLeverCol = 0;\r\n\tIsUberLeverActivated = 0;\r\n\tUberDiabloMonsterIndex = 0;\r\n#endif\r\n\r\n\tDRLG_InitTrans();\r\n\tDRLG_InitSetPC();\r\n\tDRLG_LoadL1SP();\r\n\tDRLG_L5(entry);\r\n\tDRLG_L1Pass3();\r\n\tDRLG_FreeL1SP();\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17)\r\n\t\tDRLG_InitL1Vals();\r\n\telse\r\n\t\tDRLG_InitL5Vals();\r\n\r\n\tDRLG_SetPC();\r\n\r\n\tfor (j = dminy; j < dmaxy; j++) {\r\n\t\tfor (i = dminx; i < dmaxx; i++) {\r\n\t\t\tif (dPiece[i][j] == 290) {\r\n\t\t\t\tUberRow = i;\r\n\t\t\t\tUberCol = j;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 317) {\r\n\t\t\t\tCornerStone.x = i;\r\n\t\t\t\tCornerStone.y = j;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#else\r\n\tDRLG_InitL1Vals();\r\n\tDRLG_SetPC();\r\n#endif\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid drlg_l1_crypt_pattern1(int rndper)\r\n{\r\n\tdrlg_l1_crypt_rndset(byte_48A3C8, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3CC, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3D0, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3D4, rndper);\r\n}\r\n\r\nvoid drlg_l1_crypt_pattern2(int rndper)\r\n{\r\n\tdrlg_l1_crypt_rndset(byte_48A2FC, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A300, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A304, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A308, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A30C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A310, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A314, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A318, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A31C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A320, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A324, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A328, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A32C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A330, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A334, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A338, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A33C, rndper);\r\n}\r\n\r\nvoid drlg_l1_crypt_pattern3(int rndper)\r\n{\r\n\tdrlg_l1_crypt_rndset(byte_48A340, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A344, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A348, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A34C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A350, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A354, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A358, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A35C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A360, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A364, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A368, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A36C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A370, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A374, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A378, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A37C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A380, rndper);\r\n}\r\n\r\nvoid drlg_l1_crypt_pattern4(int rndper)\r\n{\r\n\tdrlg_l1_crypt_rndset(byte_48A384, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A388, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A38C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A390, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A394, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A398, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A39C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3A0, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3A4, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3A8, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3AC, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3B0, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3B4, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3B8, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3BC, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3C0, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A3C4, rndper);\r\n}\r\n\r\nvoid drlg_l1_crypt_pattern5(int rndper)\r\n{\r\n\tdrlg_l1_crypt_rndset(byte_48A260, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A278, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A290, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A2A8, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A2C0, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A2D8, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A2EC, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A2F0, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A2F4, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A2F8, rndper);\r\n}\r\n\r\nvoid drlg_l1_crypt_pattern6(int rndper)\r\n{\r\n\tdrlg_l1_crypt_rndset(byte_48A1F4, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A1FC, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A1F8, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A200, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A204, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A208, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A20C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A210, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A214, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A218, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A21C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A220, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A224, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A228, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A22C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A230, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A234, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A238, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A23C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A240, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A244, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A248, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A24C, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A250, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A254, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A258, rndper);\r\n}\r\n\r\nvoid drlg_l1_crypt_pattern7(int rndper)\r\n{\r\n\tdrlg_l1_crypt_rndset(byte_48A1D0, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A1D4, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A1D8, rndper);\r\n\tdrlg_l1_crypt_rndset(byte_48A1DC, rndper);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/drlg_l1.h",
    "content": "/**\r\n * @file drlg_l1.h\r\n *\r\n * Interface of the cathedral level generation algorithms.\r\n */\r\n#ifndef __DRLG_L1_H__\r\n#define __DRLG_L1_H__\r\n\r\n#ifdef HELLFIRE\r\nextern int UberRow;\r\nextern int UberCol;\r\nextern int IsUberRoomOpened;\r\nextern int UberLeverRow;\r\nextern int UberLeverCol;\r\nextern int IsUberLeverActivated;\r\nextern int UberDiabloMonsterIndex;\r\n#endif\r\n\r\nvoid DRLG_Init_Globals();\r\nvoid LoadL1Dungeon(const char *sFileName, int vx, int vy);\r\nvoid LoadPreL1Dungeon(const char *sFileName, int vx, int vy);\r\nvoid CreateL5Dungeon(DWORD rseed, int entry);\r\n#ifdef HELLFIRE\r\nvoid drlg_l1_set_crypt_room(int rx1, int ry1);\r\nvoid drlg_l1_set_corner_room(int rx1, int ry1);\r\nvoid drlg_l1_crypt_pattern1(int rndper);\r\nvoid drlg_l1_crypt_pattern2(int rndper);\r\nvoid drlg_l1_crypt_pattern3(int rndper);\r\nvoid drlg_l1_crypt_pattern4(int rndper);\r\nvoid drlg_l1_crypt_pattern5(int rndper);\r\nvoid drlg_l1_crypt_pattern6(int rndper);\r\nvoid drlg_l1_crypt_pattern7(int rndper);\r\n#endif\r\n\r\n#endif /* __DRLG_L1_H__ */\r\n"
  },
  {
    "path": "Source/drlg_l2.cpp",
    "content": "/**\r\n * @file drlg_l2.cpp\r\n *\r\n * Implementation of the catacombs level generation algorithms.\r\n */\r\n#ifndef SPAWN\r\n#include \"all.h\"\r\n\r\nint nSx1;\r\nint nSy1;\r\nint nSx2;\r\nint nSy2;\r\nint nRoomCnt;\r\nBYTE predungeon[DMAXX][DMAXY];\r\nROOMNODE RoomList[81];\r\nHALLNODE *pHallList;\r\n\r\nint Area_Min = 2;\r\nint Room_Max = 10;\r\nint Room_Min = 4;\r\nint Dir_Xadd[5] = { 0, 0, 1, 0, -1 };\r\nint Dir_Yadd[5] = { 0, -1, 0, 1, 0 };\r\nShadowStruct SPATSL2[2] = { { 6, 3, 0, 3, 48, 0, 50 }, { 9, 3, 0, 3, 48, 0, 50 } };\r\n//short word_48489A = 0;\r\n\r\nBYTE BTYPESL2[161] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 17, 18, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 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, 2, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\r\nBYTE BSTYPESL2[161] = { 0, 1, 2, 3, 0, 0, 6, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 6, 6, 6, 9, 0, 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, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 6, 2, 2, 2, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 2, 2, 3, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\r\n\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH1[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 7,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH2[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 8,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH3[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 6,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH4[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 9,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH5[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 14,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH6[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 13,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH7[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 16,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH8[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 1,\r\n\t3, 4,\r\n\t0, 15,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH9[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 7,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH10[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 8,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH11[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 6,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH12[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 9,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH13[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 14,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH14[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 13,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH15[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 16,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - corner. */\r\nBYTE VARCH16[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 15,\r\n\r\n\t48,  0, // replace\r\n\t51, 42,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH17[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2, 7, // search\r\n\t3, 4,\r\n\t0, 7,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH18[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2, 7, // search\r\n\t3, 4,\r\n\t0, 8,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH19[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2, 7, // search\r\n\t3, 4,\r\n\t0, 6,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH20[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2, 7, // search\r\n\t3, 4,\r\n\t0, 9,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH21[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2,  7, // search\r\n\t3,  4,\r\n\t0, 14,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH22[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2,  7, // search\r\n\t3,  4,\r\n\t0, 13,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH23[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2,  7, // search\r\n\t3,  4,\r\n\t0, 16,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - open wall. */\r\nBYTE VARCH24[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t2,  7, // search\r\n\t3,  4,\r\n\t0, 15,\r\n\r\n\t141, 39, // replace\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH25[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 4,\r\n\t3, 1,\r\n\t0, 7,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH26[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 4,\r\n\t3, 1,\r\n\t0, 8,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH27[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 4,\r\n\t3, 1,\r\n\t0, 6,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH28[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3, 0, // search\r\n\t3, 4,\r\n\t3, 1,\r\n\t0, 9,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH29[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  4,\r\n\t3,  1,\r\n\t0, 14,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH30[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  4,\r\n\t3,  1,\r\n\t0, 13,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH31[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  4,\r\n\t3,  1,\r\n\t0, 16,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical. */\r\nBYTE VARCH32[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t3,  0, // search\r\n\t3,  4,\r\n\t3,  1,\r\n\t0, 15,\r\n\r\n\t48,  0, // replace\r\n\t51, 39,\r\n\t47, 44,\r\n\t 0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH33[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 7,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH34[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 8,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH35[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 6,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH36[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2, 0, // search\r\n\t3, 8,\r\n\t3, 4,\r\n\t0, 9,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH37[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 14,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH38[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 13,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH39[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 16,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch vertical - room west entrance. */\r\nBYTE VARCH40[] = {\r\n\t// clang-format off\r\n\t2, 4, // width, height\r\n\r\n\t2,  0, // search\r\n\t3,  8,\r\n\t3,  4,\r\n\t0, 15,\r\n\r\n\t142,  0, // replace\r\n\t 51, 42,\r\n\t 47, 44,\r\n\t  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH1[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t2, 5, 9,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH2[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t2, 5, 6,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH3[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t2, 5, 8,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH4[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t2, 5, 7,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH5[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t2, 5, 15,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH6[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t2, 5, 16,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH7[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t2, 5, 13,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH8[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t2, 5, 14,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH9[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t8, 5, 9,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH10[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t8, 5, 6,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH11[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t8, 5, 8,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH12[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t8, 5, 7,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH13[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t8, 5, 15,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH14[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t8, 5, 16,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH15[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t8, 5, 13,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - north corner. */\r\nBYTE HARCH16[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t8, 5, 14,\r\n\r\n\t49, 46, 0, // replace\r\n\t43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH17[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 9,\r\n\r\n\t140, 46, 0, // replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH18[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 6,\r\n\r\n\t140, 46, 0, // Replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH19[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 8,\r\n\r\n\t140, 46, 0, // replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH20[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 7,\r\n\r\n\t140, 46, 0, // replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH21[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 15,\r\n\r\n\t140, 46, 0, // replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH22[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 16,\r\n\r\n\t140, 46, 0, // replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH23[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 13,\r\n\r\n\t140, 46, 0, // replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - wall. */\r\nBYTE HARCH24[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t8, 5, 14,\r\n\r\n\t140, 46, 0, // replace\r\n\t 43, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH25[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t5, 2, 9,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH26[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t5, 2, 6,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH27[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t5, 2, 8,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH28[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3, 0, // search\r\n\t5, 2, 7,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH29[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t5, 2, 15,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH30[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t5, 2, 16,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH31[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t5, 2, 13,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal. */\r\nBYTE HARCH32[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t3, 3,  0, // search\r\n\t5, 2, 14,\r\n\r\n\t49, 46, 0, // replace\r\n\t40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH33[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t9, 5, 9,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH34[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t9, 5, 6,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH35[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t9, 5, 8,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH36[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t9, 5, 7,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH37[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3, 0, // search\r\n\t9, 5, 15,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH38[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3,  0, // search\r\n\t9, 5, 16,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH39[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3,  0, // search\r\n\t9, 5, 13,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Arch horizontal - west corner. */\r\nBYTE HARCH40[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t1, 3,  0, // search\r\n\t9, 5, 14,\r\n\r\n\t140, 46, 0, // replace\r\n\t 40, 45, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stairs up. */\r\nBYTE USTAIRS[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t3, 3, 3, 3, // search\r\n\t3, 3, 3, 3,\r\n\t3, 3, 3, 3,\r\n\t3, 3, 3, 3,\r\n\r\n\t0,  0,  0, 0, // replace\r\n\t0, 72, 77, 0,\r\n\t0, 76,  0, 0,\r\n\t0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stairs down. */\r\nBYTE DSTAIRS[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t3, 3, 3, 3, // search\r\n\t3, 3, 3, 3,\r\n\t3, 3, 3, 3,\r\n\t3, 3, 3, 3,\r\n\r\n\t0,  0,  0, 0, // replace\r\n\t0, 48, 71, 0,\r\n\t0, 50, 78, 0,\r\n\t0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stairs to town. */\r\nBYTE WARPSTAIRS[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t3, 3, 3, 3, // search\r\n\t3, 3, 3, 3,\r\n\t3, 3, 3, 3,\r\n\t3, 3, 3, 3,\r\n\r\n\t0,   0,   0, 0, // replace\r\n\t0, 158, 160, 0,\r\n\t0, 159,   0, 0,\r\n\t0,   0,   0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled south pillar. */\r\nBYTE CRUSHCOL[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3, 1, 3, // search\r\n\t2, 6, 3,\r\n\t3, 3, 3,\r\n\r\n\t0,  0, 0, // replace\r\n\t0, 83, 0,\r\n\t0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Vertical oil spill. */\r\nBYTE BIG1[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t3, 3, // search\r\n\t3, 3,\r\n\r\n\t113, 0, // replace\r\n\t112, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Horizontal oil spill. */\r\nBYTE BIG2[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t3, 3, // search\r\n\t3, 3,\r\n\r\n\t114, 115, // replace\r\n\t  0,   0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Horizontal platform. */\r\nBYTE BIG3[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t1, // search\r\n\t1,\r\n\r\n\t117, // replace\r\n\t116,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Vertical platform. */\r\nBYTE BIG4[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t2, 2, // search\r\n\r\n\t118, 119, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Large oil spill. */\r\nBYTE BIG5[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t3, 3, // search\r\n\t3, 3,\r\n\r\n\t120, 122, // replace\r\n\t121, 123,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Vertical wall with debris. */\r\nBYTE BIG6[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t1, // search\r\n\t1,\r\n\r\n\t125, // replace\r\n\t124,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Horizontal wall with debris. */\r\nBYTE BIG7[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t2, 2, // search\r\n\r\n\t126, 127, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Rock pile. */\r\nBYTE BIG8[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t3, 3, // search\r\n\t3, 3,\r\n\r\n\t128, 130, // replace\r\n\t129, 131,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Vertical wall collapsed. */\r\nBYTE BIG9[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t1, 3, // search\r\n\t1, 3,\r\n\r\n\t133, 135, // replace\r\n\t132, 134,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Horizontal wall collapsed. */\r\nBYTE BIG10[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t2, 2, // search\r\n\t3, 3,\r\n\r\n\t136, 137, // replace\r\n\t  3,   3,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled vertical wall 1. */\r\nBYTE RUINS1[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t1, // search\r\n\r\n\t80, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled vertical wall 2. */\r\nBYTE RUINS2[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t1, // search\r\n\r\n\t81, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled vertical wall 3. */\r\nBYTE RUINS3[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t1, // search\r\n\r\n\t82, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled horizontal wall 1. */\r\nBYTE RUINS4[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t2, // search\r\n\r\n\t84, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled horizontal wall 2. */\r\nBYTE RUINS5[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t2, // search\r\n\r\n\t85, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled horizontal wall 3. */\r\nBYTE RUINS6[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t2, // search\r\n\r\n\t86, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Crumbled north pillar. */\r\nBYTE RUINS7[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t8, // search\r\n\r\n\t87, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Bloody gib 1. */\r\nBYTE PANCREAS1[] = {\r\n\t// clang-format off\r\n\t5, 3, // width, height\r\n\r\n\t3, 3, 3, 3, 3, // search\r\n\t3, 3, 3, 3, 3,\r\n\t3, 3, 3, 3, 3,\r\n\r\n\t0, 0,   0, 0, 0, // replace\r\n\t0, 0, 108, 0, 0,\r\n\t0, 0,   0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Bloody gib 2. */\r\nBYTE PANCREAS2[] = {\r\n\t// clang-format off\r\n\t5, 3, // width, height\r\n\r\n\t3, 3, 3, 3, 3, // search\r\n\t3, 3, 3, 3, 3,\r\n\t3, 3, 3, 3, 3,\r\n\r\n\t0, 0,   0, 0, 0, // replace\r\n\t0, 0, 110, 0, 0,\r\n\t0, 0,   0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 1. */\r\nBYTE CTRDOOR1[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3, 1, 3,  // search\r\n\t0, 4, 0,\r\n\t0, 9, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 2. */\r\nBYTE CTRDOOR2[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3, 1, 3, // search\r\n\t0, 4, 0,\r\n\t0, 8, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 3. */\r\nBYTE CTRDOOR3[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3, 1, 3, // search\r\n\t0, 4, 0,\r\n\t0, 6, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 4. */\r\nBYTE CTRDOOR4[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3, 1, 3, // search\r\n\t0, 4, 0,\r\n\t0, 7, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 5. */\r\nBYTE CTRDOOR5[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3,  1, 3, // search\r\n\t0,  4, 0,\r\n\t0, 15, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 6. */\r\nBYTE CTRDOOR6[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3,  1, 3, // search\r\n\t0,  4, 0,\r\n\t0, 13, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 7. */\r\nBYTE CTRDOOR7[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3,  1, 3, // search\r\n\t0,  4, 0,\r\n\t0, 16, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Move vertical doors away from west pillar 8. */\r\nBYTE CTRDOOR8[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t3,  1, 3, // search\r\n\t0,  4, 0,\r\n\t0, 14, 0,\r\n\r\n\t0, 4, 0, // replace\r\n\t0, 1, 0,\r\n\t0, 0, 0,\r\n\t// clang-format on\r\n};\r\n\r\nint Patterns[100][10] = {\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3 },\r\n\t{ 0, 0, 0, 0, 2, 0, 0, 0, 0, 3 },\r\n\t{ 0, 7, 0, 0, 1, 0, 0, 5, 0, 2 },\r\n\t{ 0, 5, 0, 0, 1, 0, 0, 7, 0, 2 },\r\n\t{ 0, 0, 0, 7, 1, 5, 0, 0, 0, 1 },\r\n\t{ 0, 0, 0, 5, 1, 7, 0, 0, 0, 1 },\r\n\t{ 0, 1, 0, 0, 3, 0, 0, 1, 0, 4 },\r\n\t{ 0, 0, 0, 1, 3, 1, 0, 0, 0, 5 },\r\n\t{ 0, 6, 0, 6, 1, 0, 0, 0, 0, 6 },\r\n\t{ 0, 6, 0, 0, 1, 6, 0, 0, 0, 9 },\r\n\t{ 0, 0, 0, 6, 1, 0, 0, 6, 0, 7 },\r\n\t{ 0, 0, 0, 0, 1, 6, 0, 6, 0, 8 },\r\n\t{ 0, 6, 0, 6, 6, 0, 8, 6, 0, 7 },\r\n\t{ 0, 6, 8, 6, 6, 6, 0, 0, 0, 9 },\r\n\t{ 0, 6, 0, 0, 6, 6, 0, 6, 8, 8 },\r\n\t{ 6, 6, 6, 6, 6, 6, 0, 6, 0, 8 },\r\n\t{ 2, 6, 6, 6, 6, 6, 0, 6, 0, 8 },\r\n\t{ 7, 7, 7, 6, 6, 6, 0, 6, 0, 8 },\r\n\t{ 6, 6, 2, 6, 6, 6, 0, 6, 0, 8 },\r\n\t{ 6, 2, 6, 6, 6, 6, 0, 6, 0, 8 },\r\n\t{ 2, 6, 6, 6, 6, 6, 0, 6, 0, 8 },\r\n\t{ 6, 7, 7, 6, 6, 6, 0, 6, 0, 8 },\r\n\t{ 4, 4, 6, 6, 6, 6, 2, 6, 2, 8 },\r\n\t{ 2, 2, 2, 2, 6, 2, 2, 6, 2, 7 },\r\n\t{ 2, 2, 2, 2, 6, 2, 6, 6, 6, 7 },\r\n\t{ 2, 2, 6, 2, 6, 6, 2, 2, 6, 9 },\r\n\t{ 2, 6, 2, 2, 6, 2, 2, 2, 2, 6 },\r\n\t{ 2, 2, 2, 2, 6, 6, 2, 2, 2, 9 },\r\n\t{ 2, 2, 2, 6, 6, 2, 2, 2, 2, 6 },\r\n\t{ 2, 2, 0, 2, 6, 6, 2, 2, 0, 9 },\r\n\t{ 0, 0, 0, 0, 4, 0, 0, 0, 0, 12 },\r\n\t{ 0, 1, 0, 0, 1, 4, 0, 1, 0, 10 },\r\n\t{ 0, 0, 0, 1, 1, 1, 0, 4, 0, 11 },\r\n\t{ 0, 0, 0, 6, 1, 4, 0, 1, 0, 14 },\r\n\t{ 0, 6, 0, 1, 1, 0, 0, 4, 0, 16 },\r\n\t{ 0, 6, 0, 0, 1, 1, 0, 4, 0, 15 },\r\n\t{ 0, 0, 0, 0, 1, 1, 0, 1, 4, 13 },\r\n\t{ 8, 8, 8, 8, 1, 1, 0, 1, 1, 13 },\r\n\t{ 8, 8, 4, 8, 1, 1, 0, 1, 1, 10 },\r\n\t{ 0, 0, 0, 1, 1, 1, 1, 1, 1, 11 },\r\n\t{ 1, 1, 1, 1, 1, 1, 2, 2, 8, 2 },\r\n\t{ 0, 1, 0, 1, 1, 4, 1, 1, 0, 16 },\r\n\t{ 0, 0, 0, 1, 1, 1, 1, 1, 4, 11 },\r\n\t{ 1, 1, 4, 1, 1, 1, 0, 2, 2, 2 },\r\n\t{ 1, 1, 1, 1, 1, 1, 6, 2, 6, 2 },\r\n\t{ 4, 1, 1, 1, 1, 1, 6, 2, 6, 2 },\r\n\t{ 2, 2, 2, 1, 1, 1, 4, 1, 1, 11 },\r\n\t{ 4, 1, 1, 1, 1, 1, 2, 2, 2, 2 },\r\n\t{ 1, 1, 4, 1, 1, 1, 2, 2, 1, 2 },\r\n\t{ 4, 1, 1, 1, 1, 1, 1, 2, 2, 2 },\r\n\t{ 2, 2, 6, 1, 1, 1, 4, 1, 1, 11 },\r\n\t{ 4, 1, 1, 1, 1, 1, 2, 2, 6, 2 },\r\n\t{ 1, 2, 2, 1, 1, 1, 4, 1, 1, 11 },\r\n\t{ 0, 1, 1, 0, 1, 1, 0, 1, 1, 10 },\r\n\t{ 2, 1, 1, 3, 1, 1, 2, 1, 1, 14 },\r\n\t{ 1, 1, 0, 1, 1, 2, 1, 1, 0, 1 },\r\n\t{ 0, 4, 0, 1, 1, 1, 0, 1, 1, 14 },\r\n\t{ 4, 1, 0, 1, 1, 0, 1, 1, 0, 1 },\r\n\t{ 0, 1, 0, 4, 1, 1, 0, 1, 1, 15 },\r\n\t{ 1, 1, 1, 1, 1, 1, 0, 2, 2, 2 },\r\n\t{ 0, 1, 1, 2, 1, 1, 2, 1, 4, 10 },\r\n\t{ 2, 1, 1, 1, 1, 1, 0, 4, 0, 16 },\r\n\t{ 1, 1, 4, 1, 1, 2, 0, 1, 2, 1 },\r\n\t{ 2, 1, 1, 2, 1, 1, 1, 1, 4, 10 },\r\n\t{ 1, 1, 2, 1, 1, 2, 4, 1, 8, 1 },\r\n\t{ 2, 1, 4, 1, 1, 1, 4, 4, 1, 16 },\r\n\t{ 2, 1, 1, 1, 1, 1, 1, 1, 1, 16 },\r\n\t{ 1, 1, 2, 1, 1, 1, 1, 1, 1, 15 },\r\n\t{ 1, 1, 1, 1, 1, 1, 2, 1, 1, 14 },\r\n\t{ 4, 1, 1, 1, 1, 1, 2, 1, 1, 14 },\r\n\t{ 1, 1, 1, 1, 1, 1, 1, 1, 2, 8 },\r\n\t{ 0, 0, 0, 0, 255, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }\r\n};\r\n\r\nstatic BOOL DRLG_L2PlaceMiniSet(BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, i, ii, numt, bailcnt;\r\n\tBOOL found;\r\n\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tif (tmax - tmin == 0) {\r\n\t\tnumt = 1;\r\n\t} else {\r\n\t\tnumt = random_(0, tmax - tmin) + tmin;\r\n\t}\r\n\r\n\tfor (i = 0; i < numt; i++) {\r\n\t\tsx = random_(0, DMAXX - sw);\r\n\t\tsy = random_(0, DMAXY - sh);\r\n\t\tfound = FALSE;\r\n\t\tfor (bailcnt = 0; !found && bailcnt < 200; bailcnt++) {\r\n\t\t\tfound = TRUE;\r\n\t\t\tif (sx >= nSx1 && sx <= nSx2 && sy >= nSy1 && sy <= nSy2) {\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tif (cx != -1 && sx >= cx - sw && sx <= cx + 12) {\r\n\t\t\t\tsx = random_(0, DMAXX - sw);\r\n\t\t\t\tsy = random_(0, DMAXY - sh);\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tif (cy != -1 && sy >= cy - sh && sy <= cy + 12) {\r\n\t\t\t\tsx = random_(0, DMAXX - sw);\r\n\t\t\t\tsy = random_(0, DMAXY - sh);\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tii = 2;\r\n\t\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!found) {\r\n\t\t\t\tsx++;\r\n\t\t\t\tif (sx == DMAXX - sw) {\r\n\t\t\t\t\tsx = 0;\r\n\t\t\t\t\tsy++;\r\n\t\t\t\t\tif (sy == DMAXY - sh) {\r\n\t\t\t\t\t\tsy = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (bailcnt >= 200) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t\tii = sw * sh + 2;\r\n\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\tif (miniset[ii] != 0) {\r\n\t\t\t\t\tdungeon[xx + sx][yy + sy] = miniset[ii];\r\n\t\t\t\t}\r\n\t\t\t\tii++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (setview == TRUE) {\r\n\t\tViewX = 2 * sx + 21;\r\n\t\tViewY = 2 * sy + 22;\r\n\t}\r\n\tif (ldir == 0) {\r\n\t\tLvlViewX = 2 * sx + 21;\r\n\t\tLvlViewY = 2 * sy + 22;\r\n\t}\r\n\tif (ldir == 6) {\r\n\t\tLvlViewX = 2 * sx + 21;\r\n\t\tLvlViewY = 2 * sy + 22;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void DRLG_L2PlaceRndSet(BYTE *miniset, int rndper)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, ii, kk;\r\n\tBOOL found;\r\n\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tfor (sy = 0; sy < DMAXY - sh; sy++) {\r\n\t\tfor (sx = 0; sx < DMAXX - sw; sx++) {\r\n\t\t\tfound = TRUE;\r\n\t\t\tii = 2;\r\n\t\t\tif (sx >= nSx1 && sx <= nSx2 && sy >= nSy1 && sy <= nSy2) {\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tkk = sw * sh + 2;\r\n\t\t\tif (found == TRUE) {\r\n\t\t\t\tfor (yy = sy - sh; yy < sy + 2 * sh && found == TRUE; yy++) {\r\n\t\t\t\t\tfor (xx = sx - sw; xx < sx + 2 * sw; xx++) {\r\n\t\t\t\t\t\t// BUGFIX: yy and xx can go out of bounds\r\n\t\t\t\t\t\tif (dungeon[xx][yy] == miniset[kk]) {\r\n\t\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (found == TRUE && random_(0, 100) < rndper) {\r\n\t\t\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\t\t\tif (miniset[kk] != 0) {\r\n\t\t\t\t\t\t\tdungeon[xx + sx][yy + sy] = miniset[kk];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tkk++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L2Subs()\r\n{\r\n\tint x, y, i, j, k, rv;\r\n\tBYTE c;\r\n\r\n\tfor (y = 0; y < DMAXY; y++) {\r\n\t\tfor (x = 0; x < DMAXX; x++) {\r\n\t\t\tif ((x < nSx1 || x > nSx2) && (y < nSy1 || y > nSy2) && random_(0, 4) == 0) { // BUGFIX: Should be (x < nSx1 || x > nSx2 || y < nSy1 || y >= nSy2)\r\n\t\t\t\tc = BTYPESL2[dungeon[x][y]];\r\n\t\t\t\tif (c != 0) {\r\n\t\t\t\t\trv = random_(0, 16);\r\n\t\t\t\t\tk = -1;\r\n\t\t\t\t\twhile (rv >= 0) {\r\n\t\t\t\t\t\tk++;\r\n\t\t\t\t\t\tif (k == sizeof(BTYPESL2)) {\r\n\t\t\t\t\t\t\tk = 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (c == BTYPESL2[k]) {\r\n\t\t\t\t\t\t\trv--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (j = y - 2; j < y + 2; j++) {\r\n\t\t\t\t\t\tfor (i = x - 2; i < x + 2; i++) {\r\n\t\t\t\t\t\t\tif (dungeon[i][j] == k) {\r\n\t\t\t\t\t\t\t\tj = y + 3;\r\n\t\t\t\t\t\t\t\ti = x + 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (j < y + 3) {\r\n\t\t\t\t\t\tdungeon[x][y] = k;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L2Shadows()\r\n{\r\n\tint x, y, i;\r\n\tBOOL patflag;\r\n\tBYTE sd[2][2];\r\n\r\n\tfor (y = 1; y < DMAXY; y++) {\r\n\t\tfor (x = 1; x < DMAXX; x++) {\r\n\t\t\tsd[0][0] = BSTYPESL2[dungeon[x][y]];\r\n\t\t\tsd[1][0] = BSTYPESL2[dungeon[x - 1][y]];\r\n\t\t\tsd[0][1] = BSTYPESL2[dungeon[x][y - 1]];\r\n\t\t\tsd[1][1] = BSTYPESL2[dungeon[x - 1][y - 1]];\r\n\t\t\tfor (i = 0; i < 2; i++) {\r\n\t\t\t\tif (SPATSL2[i].strig == sd[0][0]) {\r\n\t\t\t\t\tpatflag = TRUE;\r\n\t\t\t\t\tif (SPATSL2[i].s1 != 0 && SPATSL2[i].s1 != sd[1][1]) {\r\n\t\t\t\t\t\tpatflag = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (SPATSL2[i].s2 != 0 && SPATSL2[i].s2 != sd[0][1]) {\r\n\t\t\t\t\t\tpatflag = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (SPATSL2[i].s3 != 0 && SPATSL2[i].s3 != sd[1][0]) {\r\n\t\t\t\t\t\tpatflag = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (patflag == TRUE) {\r\n\t\t\t\t\t\tif (SPATSL2[i].nv1 != 0) {\r\n\t\t\t\t\t\t\tdungeon[x - 1][y - 1] = SPATSL2[i].nv1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (SPATSL2[i].nv2 != 0) {\r\n\t\t\t\t\t\t\tdungeon[x][y - 1] = SPATSL2[i].nv2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (SPATSL2[i].nv3 != 0) {\r\n\t\t\t\t\t\t\tdungeon[x - 1][y] = SPATSL2[i].nv3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid InitDungeon()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tpredungeon[i][j] = 32;\r\n\t\t\tdflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_LoadL2SP()\r\n{\r\n\tsetloadflag = FALSE;\r\n\r\n\tif (QuestStatus(Q_BLIND)) {\r\n\t\tpSetPiece = LoadFileInMem(\"Levels\\\\L2Data\\\\Blind2.DUN\", NULL);\r\n\t\tsetloadflag = TRUE;\r\n\t} else if (QuestStatus(Q_BLOOD)) {\r\n\t\tpSetPiece = LoadFileInMem(\"Levels\\\\L2Data\\\\Blood1.DUN\", NULL);\r\n\t\tsetloadflag = TRUE;\r\n\t} else if (QuestStatus(Q_SCHAMB)) {\r\n\t\tpSetPiece = LoadFileInMem(\"Levels\\\\L2Data\\\\Bonestr2.DUN\", NULL);\r\n\t\tsetloadflag = TRUE;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_FreeL2SP()\r\n{\r\n\tMemFreeDbg(pSetPiece);\r\n}\r\n\r\nstatic void DRLG_L2SetRoom(int rx1, int ry1)\r\n{\r\n\tint rw, rh, i, j;\r\n\tBYTE *sp;\r\n\r\n\trw = pSetPiece[0];\r\n\trh = pSetPiece[2];\r\n\r\n\tsetpc_x = rx1;\r\n\tsetpc_y = ry1;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\r\n\tsp = &pSetPiece[4];\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tdungeon[i + rx1][j + ry1] = *sp;\r\n\t\t\t\tdflags[i + rx1][j + ry1] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i + rx1][j + ry1] = 3;\r\n\t\t\t}\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DefineRoom(int nX1, int nY1, int nX2, int nY2, BOOL ForceHW)\r\n{\r\n\tint i, j;\r\n\r\n\tpredungeon[nX1][nY1] = 67;\r\n\tpredungeon[nX1][nY2] = 69;\r\n\tpredungeon[nX2][nY1] = 66;\r\n\tpredungeon[nX2][nY2] = 65;\r\n\r\n\tnRoomCnt++;\r\n\tRoomList[nRoomCnt].nRoomx1 = nX1;\r\n\tRoomList[nRoomCnt].nRoomx2 = nX2;\r\n\tRoomList[nRoomCnt].nRoomy1 = nY1;\r\n\tRoomList[nRoomCnt].nRoomy2 = nY2;\r\n\r\n\tif (ForceHW == TRUE) {\r\n\t\tfor (i = nX1; i < nX2; i++) {\r\n\t\t\t/// BUGFIX: Should loop j between nY1 and nY2 instead of always using nY1.\r\n\t\t\twhile (i < nY2) {\r\n\t\t\t\tdflags[i][nY1] |= DLRG_PROTECTED;\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (i = nX1 + 1; i <= nX2 - 1; i++) {\r\n\t\tpredungeon[i][nY1] = 35;\r\n\t\tpredungeon[i][nY2] = 35;\r\n\t}\r\n\tnY2--;\r\n\tfor (j = nY1 + 1; j <= nY2; j++) {\r\n\t\tpredungeon[nX1][j] = 35;\r\n\t\tpredungeon[nX2][j] = 35;\r\n\t\tfor (i = nX1 + 1; i < nX2; i++) {\r\n\t\t\tpredungeon[i][j] = 46;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void CreateDoorType(int nX, int nY)\r\n{\r\n\tBOOL fDoneflag;\r\n\r\n\tfDoneflag = FALSE;\r\n\r\n\tif (predungeon[nX - 1][nY] == 68) {\r\n\t\tfDoneflag = TRUE;\r\n\t}\r\n\tif (predungeon[nX + 1][nY] == 68) {\r\n\t\tfDoneflag = TRUE;\r\n\t}\r\n\tif (predungeon[nX][nY - 1] == 68) {\r\n\t\tfDoneflag = TRUE;\r\n\t}\r\n\tif (predungeon[nX][nY + 1] == 68) {\r\n\t\tfDoneflag = TRUE;\r\n\t}\r\n\tif (predungeon[nX][nY] == 66 || predungeon[nX][nY] == 67 || predungeon[nX][nY] == 65 || predungeon[nX][nY] == 69) {\r\n\t\tfDoneflag = TRUE;\r\n\t}\r\n\r\n\tif (!fDoneflag) {\r\n\t\tpredungeon[nX][nY] = 68;\r\n\t}\r\n}\r\n\r\nstatic void PlaceHallExt(int nX, int nY)\r\n{\r\n\tif (predungeon[nX][nY] == 32) {\r\n\t\tpredungeon[nX][nY] = 44;\r\n\t}\r\n}\r\n\r\nstatic void AddHall(int nX1, int nY1, int nX2, int nY2, int nHd)\r\n{\r\n\tHALLNODE *p1, *p2;\r\n\r\n\tif (pHallList == NULL) {\r\n\t\tpHallList = (HALLNODE *)DiabloAllocPtr(sizeof(*pHallList));\r\n\t\tpHallList->nHallx1 = nX1;\r\n\t\tpHallList->nHally1 = nY1;\r\n\t\tpHallList->nHallx2 = nX2;\r\n\t\tpHallList->nHally2 = nY2;\r\n\t\tpHallList->nHalldir = nHd;\r\n\t\tpHallList->pNext = NULL;\r\n\t} else {\r\n\t\tp1 = (HALLNODE *)DiabloAllocPtr(sizeof(*pHallList));\r\n\t\tp1->nHallx1 = nX1;\r\n\t\tp1->nHally1 = nY1;\r\n\t\tp1->nHallx2 = nX2;\r\n\t\tp1->nHally2 = nY2;\r\n\t\tp1->nHalldir = nHd;\r\n\t\tp1->pNext = NULL;\r\n\t\tp2 = pHallList;\r\n\t\twhile (p2->pNext != NULL) {\r\n\t\t\tp2 = p2->pNext;\r\n\t\t}\r\n\t\tp2->pNext = p1;\r\n\t}\r\n}\r\n\r\n/**\r\n * Draws a random room rectangle, and then subdivides the rest of the passed in rectangle into 4 and recurses.\r\n * @param nX1 Lower X boundary of the area to draw into.\r\n * @param nY1 Lower Y boundary of the area to draw into.\r\n * @param nX2 Upper X boundary of the area to draw into.\r\n * @param nY2 Upper Y boundary of the area to draw into.\r\n * @param nRDest The room number of the parent room this call was invoked for. Zero for empty\r\n * @param nHDir The direction of the hall from nRDest to this room.\r\n * @param ForceHW If set, nH and nW are used for room size instead of random values.\r\n * @param nH Height of the room, if ForceHW is set.\r\n * @param nW Width of the room, if ForceHW is set.\r\n */\r\nstatic void CreateRoom(int nX1, int nY1, int nX2, int nY2, int nRDest, int nHDir, BOOL ForceHW, int nH, int nW)\r\n{\r\n\tint nAw, nAh, nRw, nRh, nRx1, nRy1, nRx2, nRy2, nHw, nHh, nHx1, nHy1, nHx2, nHy2, nRid;\r\n\r\n\tif (nRoomCnt >= 80) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tnAw = nX2 - nX1;\r\n\tnAh = nY2 - nY1;\r\n\tif (nAw < Area_Min || nAh < Area_Min) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (nAw > Room_Max) {\r\n\t\tnRw = random_(0, Room_Max - Room_Min) + Room_Min;\r\n\t} else if (nAw > Room_Min) {\r\n\t\tnRw = random_(0, nAw - Room_Min) + Room_Min;\r\n\t} else {\r\n\t\tnRw = nAw;\r\n\t}\r\n\tif (nAh > Room_Max) {\r\n\t\tnRh = random_(0, Room_Max - Room_Min) + Room_Min;\r\n\t} else if (nAh > Room_Min) {\r\n\t\tnRh = random_(0, nAh - Room_Min) + Room_Min;\r\n\t} else {\r\n\t\tnRh = nAh;\r\n\t}\r\n\r\n\tif (ForceHW == TRUE) {\r\n\t\tnRw = nW;\r\n\t\tnRh = nH;\r\n\t}\r\n\r\n\tnRx1 = random_(0, nX2 - nX1) + nX1;\r\n\tnRy1 = random_(0, nY2 - nY1) + nY1;\r\n\tnRx2 = nRw + nRx1;\r\n\tnRy2 = nRh + nRy1;\r\n\tif (nRx2 > nX2) {\r\n\t\tnRx2 = nX2;\r\n\t\tnRx1 = nX2 - nRw;\r\n\t}\r\n\tif (nRy2 > nY2) {\r\n\t\tnRy2 = nY2;\r\n\t\tnRy1 = nY2 - nRh;\r\n\t}\r\n\r\n\tif (nRx1 >= 38) {\r\n\t\tnRx1 = 38;\r\n\t}\r\n\tif (nRy1 >= 38) {\r\n\t\tnRy1 = 38;\r\n\t}\r\n\tif (nRx1 <= 1) {\r\n\t\tnRx1 = 1;\r\n\t}\r\n\tif (nRy1 <= 1) {\r\n\t\tnRy1 = 1;\r\n\t}\r\n\tif (nRx2 >= 38) {\r\n\t\tnRx2 = 38;\r\n\t}\r\n\tif (nRy2 >= 38) {\r\n\t\tnRy2 = 38;\r\n\t}\r\n\tif (nRx2 <= 1) {\r\n\t\tnRx2 = 1;\r\n\t}\r\n\tif (nRy2 <= 1) {\r\n\t\tnRy2 = 1;\r\n\t}\r\n\tDefineRoom(nRx1, nRy1, nRx2, nRy2, ForceHW);\r\n\r\n\tif (ForceHW == TRUE) {\r\n\t\tnSx1 = nRx1 + 2;\r\n\t\tnSy1 = nRy1 + 2;\r\n\t\tnSx2 = nRx2;\r\n\t\tnSy2 = nRy2;\r\n\t}\r\n\r\n\tnRid = nRoomCnt;\r\n\tRoomList[nRid].nRoomDest = nRDest;\r\n\r\n\tif (nRDest != 0) {\r\n\t\tif (nHDir == 1) {\r\n\t\t\tnHx1 = random_(0, nRx2 - nRx1 - 2) + nRx1 + 1;\r\n\t\t\tnHy1 = nRy1;\r\n\t\t\tnHw = RoomList[nRDest].nRoomx2 - RoomList[nRDest].nRoomx1 - 2;\r\n\t\t\tnHx2 = random_(0, nHw) + RoomList[nRDest].nRoomx1 + 1;\r\n\t\t\tnHy2 = RoomList[nRDest].nRoomy2;\r\n\t\t}\r\n\t\tif (nHDir == 3) {\r\n\t\t\tnHx1 = random_(0, nRx2 - nRx1 - 2) + nRx1 + 1;\r\n\t\t\tnHy1 = nRy2;\r\n\t\t\tnHw = RoomList[nRDest].nRoomx2 - RoomList[nRDest].nRoomx1 - 2;\r\n\t\t\tnHx2 = random_(0, nHw) + RoomList[nRDest].nRoomx1 + 1;\r\n\t\t\tnHy2 = RoomList[nRDest].nRoomy1;\r\n\t\t}\r\n\t\tif (nHDir == 2) {\r\n\t\t\tnHx1 = nRx2;\r\n\t\t\tnHy1 = random_(0, nRy2 - nRy1 - 2) + nRy1 + 1;\r\n\t\t\tnHx2 = RoomList[nRDest].nRoomx1;\r\n\t\t\tnHh = RoomList[nRDest].nRoomy2 - RoomList[nRDest].nRoomy1 - 2;\r\n\t\t\tnHy2 = random_(0, nHh) + RoomList[nRDest].nRoomy1 + 1;\r\n\t\t}\r\n\t\tif (nHDir == 4) {\r\n\t\t\tnHx1 = nRx1;\r\n\t\t\tnHy1 = random_(0, nRy2 - nRy1 - 2) + nRy1 + 1;\r\n\t\t\tnHx2 = RoomList[nRDest].nRoomx2;\r\n\t\t\tnHh = RoomList[nRDest].nRoomy2 - RoomList[nRDest].nRoomy1 - 2;\r\n\t\t\tnHy2 = random_(0, nHh) + RoomList[nRDest].nRoomy1 + 1;\r\n\t\t}\r\n\t\tAddHall(nHx1, nHy1, nHx2, nHy2, nHDir);\r\n\t}\r\n\r\n\tif (nRh > nRw) {\r\n\t\tCreateRoom(nX1 + 2, nY1 + 2, nRx1 - 2, nRy2 - 2, nRid, 2, 0, 0, 0);\r\n\t\tCreateRoom(nRx2 + 2, nRy1 + 2, nX2 - 2, nY2 - 2, nRid, 4, 0, 0, 0);\r\n\t\tCreateRoom(nX1 + 2, nRy2 + 2, nRx2 - 2, nY2 - 2, nRid, 1, 0, 0, 0);\r\n\t\tCreateRoom(nRx1 + 2, nY1 + 2, nX2 - 2, nRy1 - 2, nRid, 3, 0, 0, 0);\r\n\t} else {\r\n\t\tCreateRoom(nX1 + 2, nY1 + 2, nRx2 - 2, nRy1 - 2, nRid, 3, 0, 0, 0);\r\n\t\tCreateRoom(nRx1 + 2, nRy2 + 2, nX2 - 2, nY2 - 2, nRid, 1, 0, 0, 0);\r\n\t\tCreateRoom(nX1 + 2, nRy1 + 2, nRx1 - 2, nY2 - 2, nRid, 2, 0, 0, 0);\r\n\t\tCreateRoom(nRx2 + 2, nY1 + 2, nX2 - 2, nRy2 - 2, nRid, 4, 0, 0, 0);\r\n\t}\r\n}\r\n\r\nstatic void GetHall(int *nX1, int *nY1, int *nX2, int *nY2, int *nHd)\r\n{\r\n\tHALLNODE *p1;\r\n\r\n\tp1 = pHallList->pNext;\r\n\t*nX1 = pHallList->nHallx1;\r\n\t*nY1 = pHallList->nHally1;\r\n\t*nX2 = pHallList->nHallx2;\r\n\t*nY2 = pHallList->nHally2;\r\n\t*nHd = pHallList->nHalldir;\r\n\tMemFreeDbg(pHallList);\r\n\tpHallList = p1;\r\n}\r\n\r\nstatic void ConnectHall(int nX1, int nY1, int nX2, int nY2, int nHd)\r\n{\r\n\tint nCurrd, nDx, nDy, nRp, nOrigX1, nOrigY1, fMinusFlag, fPlusFlag;\r\n\tBOOL fDoneflag, fInroom;\r\n\r\n\tfDoneflag = FALSE;\r\n\tfMinusFlag = random_(0, 100);\r\n\tfPlusFlag = random_(0, 100);\r\n\tnOrigX1 = nX1;\r\n\tnOrigY1 = nY1;\r\n\tCreateDoorType(nX1, nY1);\r\n\tCreateDoorType(nX2, nY2);\r\n\tnDx = abs(nX2 - nX1); /* unused */\r\n\tnDy = abs(nY2 - nY1); /* unused */\r\n\tnCurrd = nHd;\r\n\tnX2 -= Dir_Xadd[nCurrd];\r\n\tnY2 -= Dir_Yadd[nCurrd];\r\n\tpredungeon[nX2][nY2] = 44;\r\n\tfInroom = FALSE;\r\n\r\n\twhile (!fDoneflag) {\r\n\t\tif (nX1 >= 38 && nCurrd == 2) {\r\n\t\t\tnCurrd = 4;\r\n\t\t}\r\n\t\tif (nY1 >= 38 && nCurrd == 3) {\r\n\t\t\tnCurrd = 1;\r\n\t\t}\r\n\t\tif (nX1 <= 1 && nCurrd == 4) {\r\n\t\t\tnCurrd = 2;\r\n\t\t}\r\n\t\tif (nY1 <= 1 && nCurrd == 1) {\r\n\t\t\tnCurrd = 3;\r\n\t\t}\r\n\t\tif (predungeon[nX1][nY1] == 67 && (nCurrd == 1 || nCurrd == 4)) {\r\n\t\t\tnCurrd = 2;\r\n\t\t}\r\n\t\tif (predungeon[nX1][nY1] == 66 && (nCurrd == 1 || nCurrd == 2)) {\r\n\t\t\tnCurrd = 3;\r\n\t\t}\r\n\t\tif (predungeon[nX1][nY1] == 69 && (nCurrd == 4 || nCurrd == 3)) {\r\n\t\t\tnCurrd = 1;\r\n\t\t}\r\n\t\tif (predungeon[nX1][nY1] == 65 && (nCurrd == 2 || nCurrd == 3)) {\r\n\t\t\tnCurrd = 4;\r\n\t\t}\r\n\t\tnX1 += Dir_Xadd[nCurrd];\r\n\t\tnY1 += Dir_Yadd[nCurrd];\r\n\t\tif (predungeon[nX1][nY1] == 32) {\r\n\t\t\tif (fInroom) {\r\n\t\t\t\tCreateDoorType(nX1 - Dir_Xadd[nCurrd], nY1 - Dir_Yadd[nCurrd]);\r\n\t\t\t} else {\r\n\t\t\t\tif (fMinusFlag < 50) {\r\n\t\t\t\t\tif (nCurrd != 1 && nCurrd != 3) {\r\n\t\t\t\t\t\tPlaceHallExt(nX1, nY1 - 1);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tPlaceHallExt(nX1 - 1, nY1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (fPlusFlag < 50) {\r\n\t\t\t\t\tif (nCurrd != 1 && nCurrd != 3) {\r\n\t\t\t\t\t\tPlaceHallExt(nX1, nY1 + 1);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tPlaceHallExt(nX1 + 1, nY1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpredungeon[nX1][nY1] = 44;\r\n\t\t\tfInroom = FALSE;\r\n\t\t} else {\r\n\t\t\tif (!fInroom && predungeon[nX1][nY1] == 35) {\r\n\t\t\t\tCreateDoorType(nX1, nY1);\r\n\t\t\t}\r\n\t\t\tif (predungeon[nX1][nY1] != 44) {\r\n\t\t\t\tfInroom = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tnDx = abs(nX2 - nX1);\r\n\t\tnDy = abs(nY2 - nY1);\r\n\t\tif (nDx > nDy) {\r\n\t\t\tnRp = 2 * nDx;\r\n\t\t\tif (nRp > 30) {\r\n\t\t\t\tnRp = 30;\r\n\t\t\t}\r\n\t\t\tif (random_(0, 100) < nRp) {\r\n\t\t\t\tif (nX2 <= nX1 || nX1 >= DMAXX) {\r\n\t\t\t\t\tnCurrd = 4;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnCurrd = 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tnRp = 5 * nDy;\r\n\t\t\tif (nRp > 80) {\r\n\t\t\t\tnRp = 80;\r\n\t\t\t}\r\n\t\t\tif (random_(0, 100) < nRp) {\r\n\t\t\t\tif (nY2 <= nY1 || nY1 >= DMAXY) {\r\n\t\t\t\t\tnCurrd = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnCurrd = 3;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nDy < 10 && nX1 == nX2 && (nCurrd == 2 || nCurrd == 4)) {\r\n\t\t\tif (nY2 <= nY1 || nY1 >= DMAXY) {\r\n\t\t\t\tnCurrd = 1;\r\n\t\t\t} else {\r\n\t\t\t\tnCurrd = 3;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nDx < 10 && nY1 == nY2 && (nCurrd == 1 || nCurrd == 3)) {\r\n\t\t\tif (nX2 <= nX1 || nX1 >= DMAXX) {\r\n\t\t\t\tnCurrd = 4;\r\n\t\t\t} else {\r\n\t\t\t\tnCurrd = 2;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nDy == 1 && nDx > 1 && (nCurrd == 1 || nCurrd == 3)) {\r\n\t\t\tif (nX2 <= nX1 || nX1 >= DMAXX) {\r\n\t\t\t\tnCurrd = 4;\r\n\t\t\t} else {\r\n\t\t\t\tnCurrd = 2;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nDx == 1 && nDy > 1 && (nCurrd == 2 || nCurrd == 4)) {\r\n\t\t\tif (nY2 <= nY1 || nX1 >= DMAXX) {\r\n\t\t\t\tnCurrd = 1;\r\n\t\t\t} else {\r\n\t\t\t\tnCurrd = 3;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nDx == 0 && predungeon[nX1][nY1] != 32 && (nCurrd == 2 || nCurrd == 4)) {\r\n\t\t\tif (nX2 <= nOrigX1 || nX1 >= DMAXX) {\r\n\t\t\t\tnCurrd = 1;\r\n\t\t\t} else {\r\n\t\t\t\tnCurrd = 3;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nDy == 0 && predungeon[nX1][nY1] != 32 && (nCurrd == 1 || nCurrd == 3)) {\r\n\t\t\tif (nY2 <= nOrigY1 || nY1 >= DMAXY) {\r\n\t\t\t\tnCurrd = 4;\r\n\t\t\t} else {\r\n\t\t\t\tnCurrd = 2;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nX1 == nX2 && nY1 == nY2) {\r\n\t\t\tfDoneflag = TRUE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DoPatternCheck(int i, int j)\r\n{\r\n\tint k, l, x, y, nOk;\r\n\r\n\tfor (k = 0; Patterns[k][4] != 255; k++) {\r\n\t\tx = i - 1;\r\n\t\ty = j - 1;\r\n\t\tnOk = 254;\r\n\t\tfor (l = 0; l < 9 && nOk == 254; l++) {\r\n\t\t\tnOk = 255;\r\n\t\t\tif (l == 3 || l == 6) {\r\n\t\t\t\ty++;\r\n\t\t\t\tx = i - 1;\r\n\t\t\t}\r\n\t\t\tif (x >= 0 && x < DMAXX && y >= 0 && y < DMAXY) {\r\n\t\t\t\tswitch (Patterns[k][l]) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tif (predungeon[x][y] == 35) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tif (predungeon[x][y] == 46) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 4:\r\n\t\t\t\t\tif (predungeon[x][y] == 32) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tif (predungeon[x][y] == 68) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 5:\r\n\t\t\t\t\tif (predungeon[x][y] == 68 || predungeon[x][y] == 46) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 6:\r\n\t\t\t\t\tif (predungeon[x][y] == 68 || predungeon[x][y] == 35) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 7:\r\n\t\t\t\t\tif (predungeon[x][y] == 32 || predungeon[x][y] == 46) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 8:\r\n\t\t\t\t\tif (predungeon[x][y] == 68 || predungeon[x][y] == 35 || predungeon[x][y] == 46) {\r\n\t\t\t\t\t\tnOk = 254;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnOk = 254;\r\n\t\t\t}\r\n\t\t\tx++;\r\n\t\t}\r\n\t\tif (nOk == 254) {\r\n\t\t\tdungeon[i][j] = Patterns[k][9];\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L2TileFix()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 3) {\r\n\t\t\t\tdungeon[i][j + 1] = 1;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 3 && dungeon[i][j + 1] == 1) {\r\n\t\t\t\tdungeon[i][j + 1] = 3;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 3 && dungeon[i + 1][j] == 7) {\r\n\t\t\t\tdungeon[i + 1][j] = 3;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 3) {\r\n\t\t\t\tdungeon[i + 1][j] = 2;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i + 1][j] == 14) {\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL DL2_Cont(BOOL x1f, BOOL y1f, BOOL x2f, BOOL y2f)\r\n{\r\n\tif (x1f && x2f && y1f && y2f) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (x1f && x2f && (y1f || y2f)) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (y1f && y2f && (x1f || x2f)) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic int DL2_NumNoChar()\r\n{\r\n\tint t, ii, jj;\r\n\r\n\tt = 0;\r\n\tfor (jj = 0; jj < DMAXY; jj++) {\r\n\t\tfor (ii = 0; ii < DMAXX; ii++) {\r\n\t\t\tif (predungeon[ii][jj] == 32) {\r\n\t\t\t\tt++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn t;\r\n}\r\n\r\nstatic void DL2_DrawRoom(int x1, int y1, int x2, int y2)\r\n{\r\n\tint ii, jj;\r\n\r\n\tfor (jj = y1; jj <= y2; jj++) {\r\n\t\tfor (ii = x1; ii <= x2; ii++) {\r\n\t\t\tpredungeon[ii][jj] = 46;\r\n\t\t}\r\n\t}\r\n\tfor (jj = y1; jj <= y2; jj++) {\r\n\t\tpredungeon[x1][jj] = 35;\r\n\t\tpredungeon[x2][jj] = 35;\r\n\t}\r\n\tfor (ii = x1; ii <= x2; ii++) {\r\n\t\tpredungeon[ii][y1] = 35;\r\n\t\tpredungeon[ii][y2] = 35;\r\n\t}\r\n}\r\n\r\nstatic void DL2_KnockWalls(int x1, int y1, int x2, int y2)\r\n{\r\n\tint ii, jj;\r\n\r\n\tfor (ii = x1 + 1; ii < x2; ii++) {\r\n\t\tif (predungeon[ii][y1 - 1] == 46 && predungeon[ii][y1 + 1] == 46) {\r\n\t\t\tpredungeon[ii][y1] = 46;\r\n\t\t}\r\n\t\tif (predungeon[ii][y2 - 1] == 46 && predungeon[ii][y2 + 1] == 46) {\r\n\t\t\tpredungeon[ii][y2] = 46;\r\n\t\t}\r\n\t\tif (predungeon[ii][y1 - 1] == 68) {\r\n\t\t\tpredungeon[ii][y1 - 1] = 46;\r\n\t\t}\r\n\t\tif (predungeon[ii][y2 + 1] == 68) {\r\n\t\t\tpredungeon[ii][y2 + 1] = 46;\r\n\t\t}\r\n\t}\r\n\tfor (jj = y1 + 1; jj < y2; jj++) {\r\n\t\tif (predungeon[x1 - 1][jj] == 46 && predungeon[x1 + 1][jj] == 46) {\r\n\t\t\tpredungeon[x1][jj] = 46;\r\n\t\t}\r\n\t\tif (predungeon[x2 - 1][jj] == 46 && predungeon[x2 + 1][jj] == 46) {\r\n\t\t\tpredungeon[x2][jj] = 46;\r\n\t\t}\r\n\t\tif (predungeon[x1 - 1][jj] == 68) {\r\n\t\t\tpredungeon[x1 - 1][jj] = 46;\r\n\t\t}\r\n\t\tif (predungeon[x2 + 1][jj] == 68) {\r\n\t\t\tpredungeon[x2 + 1][jj] = 46;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL DL2_FillVoids()\r\n{\r\n\tint ii, jj, xx, yy, x1, x2, y1, y2;\r\n\tBOOL xf1, xf2, yf1, yf2;\r\n\tint to;\r\n\r\n\tto = 0;\r\n\twhile (DL2_NumNoChar() > 700 && to < 100) {\r\n\t\txx = random_(0, 38) + 1;\r\n\t\tyy = random_(0, 38) + 1;\r\n\t\tif (predungeon[xx][yy] != 35) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\txf1 = xf2 = yf1 = yf2 = FALSE;\r\n\t\tif (predungeon[xx - 1][yy] == 32 && predungeon[xx + 1][yy] == 46) {\r\n\t\t\tif (predungeon[xx + 1][yy - 1] == 46\r\n\t\t\t    && predungeon[xx + 1][yy + 1] == 46\r\n\t\t\t    && predungeon[xx - 1][yy - 1] == 32\r\n\t\t\t    && predungeon[xx - 1][yy + 1] == 32) {\r\n\t\t\t\txf1 = yf1 = yf2 = TRUE;\r\n\t\t\t}\r\n\t\t} else if (predungeon[xx + 1][yy] == 32 && predungeon[xx - 1][yy] == 46) {\r\n\t\t\tif (predungeon[xx - 1][yy - 1] == 46\r\n\t\t\t    && predungeon[xx - 1][yy + 1] == 46\r\n\t\t\t    && predungeon[xx + 1][yy - 1] == 32\r\n\t\t\t    && predungeon[xx + 1][yy + 1] == 32) {\r\n\t\t\t\txf2 = yf1 = yf2 = TRUE;\r\n\t\t\t}\r\n\t\t} else if (predungeon[xx][yy - 1] == 32 && predungeon[xx][yy + 1] == 46) {\r\n\t\t\tif (predungeon[xx - 1][yy + 1] == 46\r\n\t\t\t    && predungeon[xx + 1][yy + 1] == 46\r\n\t\t\t    && predungeon[xx - 1][yy - 1] == 32\r\n\t\t\t    && predungeon[xx + 1][yy - 1] == 32) {\r\n\t\t\t\tyf1 = xf1 = xf2 = TRUE;\r\n\t\t\t}\r\n\t\t} else if (predungeon[xx][yy + 1] == 32 && predungeon[xx][yy - 1] == 46) {\r\n\t\t\tif (predungeon[xx - 1][yy - 1] == 46\r\n\t\t\t    && predungeon[xx + 1][yy - 1] == 46\r\n\t\t\t    && predungeon[xx - 1][yy + 1] == 32\r\n\t\t\t    && predungeon[xx + 1][yy + 1] == 32) {\r\n\t\t\t\tyf2 = xf1 = xf2 = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (DL2_Cont(xf1, yf1, xf2, yf2)) {\r\n\t\t\tif (xf1) {\r\n\t\t\t\tx1 = xx - 1;\r\n\t\t\t} else {\r\n\t\t\t\tx1 = xx;\r\n\t\t\t}\r\n\t\t\tif (xf2) {\r\n\t\t\t\tx2 = xx + 1;\r\n\t\t\t} else {\r\n\t\t\t\tx2 = xx;\r\n\t\t\t}\r\n\t\t\tif (yf1) {\r\n\t\t\t\ty1 = yy - 1;\r\n\t\t\t} else {\r\n\t\t\t\ty1 = yy;\r\n\t\t\t}\r\n\t\t\tif (yf2) {\r\n\t\t\t\ty2 = yy + 1;\r\n\t\t\t} else {\r\n\t\t\t\ty2 = yy;\r\n\t\t\t}\r\n\t\t\tif (!xf1) {\r\n\t\t\t\twhile (yf1 || yf2) {\r\n\t\t\t\t\tif (y1 == 0) {\r\n\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y2 == DMAXY - 1) {\r\n\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y2 - y1 >= 14) {\r\n\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (yf1) {\r\n\t\t\t\t\t\ty1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (yf2) {\r\n\t\t\t\t\t\ty2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x2][y1] != 32) {\r\n\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x2][y2] != 32) {\r\n\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\ty1 += 2;\r\n\t\t\t\ty2 -= 2;\r\n\t\t\t\tif (y2 - y1 > 5) {\r\n\t\t\t\t\twhile (xf2) {\r\n\t\t\t\t\t\tif (x2 == 39) {\r\n\t\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (x2 - x1 >= 12) {\r\n\t\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfor (jj = y1; jj <= y2; jj++) {\r\n\t\t\t\t\t\t\tif (predungeon[x2][jj] != 32) {\r\n\t\t\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (xf2) {\r\n\t\t\t\t\t\t\tx2++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tx2 -= 2;\r\n\t\t\t\t\tif (x2 - x1 > 5) {\r\n\t\t\t\t\t\tDL2_DrawRoom(x1, y1, x2, y2);\r\n\t\t\t\t\t\tDL2_KnockWalls(x1, y1, x2, y2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (!xf2) {\r\n\t\t\t\twhile (yf1 || yf2) {\r\n\t\t\t\t\tif (y1 == 0) {\r\n\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y2 == DMAXY - 1) {\r\n\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y2 - y1 >= 14) {\r\n\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (yf1) {\r\n\t\t\t\t\t\ty1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (yf2) {\r\n\t\t\t\t\t\ty2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x1][y1] != 32) {\r\n\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x1][y2] != 32) {\r\n\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\ty1 += 2;\r\n\t\t\t\ty2 -= 2;\r\n\t\t\t\tif (y2 - y1 > 5) {\r\n\t\t\t\t\twhile (xf1) {\r\n\t\t\t\t\t\tif (x1 == 0) {\r\n\t\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (x2 - x1 >= 12) {\r\n\t\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfor (jj = y1; jj <= y2; jj++) {\r\n\t\t\t\t\t\t\tif (predungeon[x1][jj] != 32) {\r\n\t\t\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (xf1) {\r\n\t\t\t\t\t\t\tx1--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tx1 += 2;\r\n\t\t\t\t\tif (x2 - x1 > 5) {\r\n\t\t\t\t\t\tDL2_DrawRoom(x1, y1, x2, y2);\r\n\t\t\t\t\t\tDL2_KnockWalls(x1, y1, x2, y2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (!yf1) {\r\n\t\t\t\twhile (xf1 || xf2) {\r\n\t\t\t\t\tif (x1 == 0) {\r\n\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x2 == DMAXX - 1) {\r\n\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x2 - x1 >= 14) {\r\n\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (xf1) {\r\n\t\t\t\t\t\tx1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (xf2) {\r\n\t\t\t\t\t\tx2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x1][y2] != 32) {\r\n\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x2][y2] != 32) {\r\n\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tx1 += 2;\r\n\t\t\t\tx2 -= 2;\r\n\t\t\t\tif (x2 - x1 > 5) {\r\n\t\t\t\t\twhile (yf2) {\r\n\t\t\t\t\t\tif (y2 == DMAXY - 1) {\r\n\t\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (y2 - y1 >= 12) {\r\n\t\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfor (ii = x1; ii <= x2; ii++) {\r\n\t\t\t\t\t\t\tif (predungeon[ii][y2] != 32) {\r\n\t\t\t\t\t\t\t\tyf2 = FALSE;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (yf2) {\r\n\t\t\t\t\t\t\ty2++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ty2 -= 2;\r\n\t\t\t\t\tif (y2 - y1 > 5) {\r\n\t\t\t\t\t\tDL2_DrawRoom(x1, y1, x2, y2);\r\n\t\t\t\t\t\tDL2_KnockWalls(x1, y1, x2, y2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (!yf2) {\r\n\t\t\t\twhile (xf1 || xf2) {\r\n\t\t\t\t\tif (x1 == 0) {\r\n\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x2 == DMAXX - 1) {\r\n\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x2 - x1 >= 14) {\r\n\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (xf1) {\r\n\t\t\t\t\t\tx1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (xf2) {\r\n\t\t\t\t\t\tx2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x1][y1] != 32) {\r\n\t\t\t\t\t\txf1 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (predungeon[x2][y1] != 32) {\r\n\t\t\t\t\t\txf2 = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tx1 += 2;\r\n\t\t\t\tx2 -= 2;\r\n\t\t\t\tif (x2 - x1 > 5) {\r\n\t\t\t\t\twhile (yf1) {\r\n\t\t\t\t\t\tif (y1 == 0) {\r\n\t\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (y2 - y1 >= 12) {\r\n\t\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfor (ii = x1; ii <= x2; ii++) {\r\n\t\t\t\t\t\t\tif (predungeon[ii][y1] != 32) {\r\n\t\t\t\t\t\t\t\tyf1 = FALSE;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (yf1) {\r\n\t\t\t\t\t\t\ty1--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ty1 += 2;\r\n\t\t\t\t\tif (y2 - y1 > 5) {\r\n\t\t\t\t\t\tDL2_DrawRoom(x1, y1, x2, y2);\r\n\t\t\t\t\t\tDL2_KnockWalls(x1, y1, x2, y2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tto++;\r\n\t}\r\n\r\n\treturn DL2_NumNoChar() <= 700;\r\n}\r\n\r\nstatic BOOL CreateDungeon()\r\n{\r\n\tint i, j, nHx1, nHy1, nHx2, nHy2, nHd, ForceH, ForceW;\r\n\tBOOL ForceHW;\r\n\r\n\tForceW = 0;\r\n\tForceH = 0;\r\n\tForceHW = FALSE;\r\n\r\n\tswitch (currlevel) {\r\n\tcase 5:\r\n\t\tif (quests[Q_BLOOD]._qactive != QUEST_NOTAVAIL) {\r\n\t\t\tForceHW = TRUE;\r\n\t\t\tForceH = 20;\r\n\t\t\tForceW = 14;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 6:\r\n\t\tif (quests[Q_SCHAMB]._qactive != QUEST_NOTAVAIL) {\r\n\t\t\tForceHW = TRUE;\r\n\t\t\tForceW = 10;\r\n\t\t\tForceH = 10;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 7:\r\n\t\tif (quests[Q_BLIND]._qactive != QUEST_NOTAVAIL) {\r\n\t\t\tForceHW = TRUE;\r\n\t\t\tForceW = 15;\r\n\t\t\tForceH = 15;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 8:\r\n\t\tbreak;\r\n\t}\r\n\r\n\tCreateRoom(2, 2, DMAXX - 1, DMAXY - 1, 0, 0, ForceHW, ForceH, ForceW);\r\n\r\n\twhile (pHallList != NULL) {\r\n\t\tGetHall(&nHx1, &nHy1, &nHx2, &nHy2, &nHd);\r\n\t\tConnectHall(nHx1, nHy1, nHx2, nHy2, nHd);\r\n\t}\r\n\r\n\tfor (j = 0; j <= DMAXY; j++) {     /// BUGFIX: change '<=' to '<'\r\n\t\tfor (i = 0; i <= DMAXX; i++) { /// BUGFIX: change '<=' to '<'\r\n\t\t\tif (predungeon[i][j] == 67) {\r\n\t\t\t\tpredungeon[i][j] = 35;\r\n\t\t\t}\r\n\t\t\tif (predungeon[i][j] == 66) {\r\n\t\t\t\tpredungeon[i][j] = 35;\r\n\t\t\t}\r\n\t\t\tif (predungeon[i][j] == 69) {\r\n\t\t\t\tpredungeon[i][j] = 35;\r\n\t\t\t}\r\n\t\t\tif (predungeon[i][j] == 65) {\r\n\t\t\t\tpredungeon[i][j] = 35;\r\n\t\t\t}\r\n\t\t\tif (predungeon[i][j] == 44) {\r\n\t\t\t\tpredungeon[i][j] = 46;\r\n\t\t\t\tif (predungeon[i - 1][j - 1] == 32) {\r\n\t\t\t\t\tpredungeon[i - 1][j - 1] = 35;\r\n\t\t\t\t}\r\n\t\t\t\tif (predungeon[i - 1][j] == 32) {\r\n\t\t\t\t\tpredungeon[i - 1][j] = 35;\r\n\t\t\t\t}\r\n\t\t\t\tif (predungeon[i - 1][1 + j] == 32) {\r\n\t\t\t\t\tpredungeon[i - 1][1 + j] = 35;\r\n\t\t\t\t}\r\n\t\t\t\tif (predungeon[i + 1][j - 1] == 32) {\r\n\t\t\t\t\tpredungeon[i + 1][j - 1] = 35;\r\n\t\t\t\t}\r\n\t\t\t\tif (predungeon[i + 1][j] == 32) {\r\n\t\t\t\t\tpredungeon[i + 1][j] = 35;\r\n\t\t\t\t}\r\n\t\t\t\tif (predungeon[i + 1][1 + j] == 32) {\r\n\t\t\t\t\tpredungeon[i + 1][1 + j] = 35;\r\n\t\t\t\t}\r\n\t\t\t\tif (predungeon[i][j - 1] == 32) {\r\n\t\t\t\t\tpredungeon[i][j - 1] = 35;\r\n\t\t\t\t}\r\n\t\t\t\tif (predungeon[i][j + 1] == 32) {\r\n\t\t\t\t\tpredungeon[i][j + 1] = 35;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!DL2_FillVoids()) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tDoPatternCheck(i, j);\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void DRLG_L2Pass3()\r\n{\r\n\tint i, j, xx, yy;\r\n\tlong v1, v2, v3, v4, lv;\r\n\r\n\tlv = 12 - 1;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pMegaTiles\r\n\t\tmov\t\teax, lv\r\n\t\tshl\t\teax, 3\r\n\t\tadd\t\tesi, eax\r\n\t\txor\t\teax, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv1, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv2, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv3, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv4, eax\r\n\t}\r\n#else\r\n\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n#endif\r\n\r\n\tfor (j = 0; j < MAXDUNY; j += 2)\r\n\t{\r\n\t\tfor (i = 0; i < MAXDUNX; i += 2) {\r\n\t\t\tdPiece[i][j] = v1;\r\n\t\t\tdPiece[i + 1][j] = v2;\r\n\t\t\tdPiece[i][j + 1] = v3;\r\n\t\t\tdPiece[i + 1][j + 1] = v4;\r\n\t\t}\r\n\t}\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tlv = dungeon[i][j] - 1;\r\n#ifdef USE_ASM\r\n\t\t\t__asm {\r\n\t\t\t\tmov\t\tesi, pMegaTiles\r\n\t\t\t\tmov\t\teax, lv\r\n\t\t\t\tshl\t\teax, 3\r\n\t\t\t\tadd\t\tesi, eax\r\n\t\t\t\txor\t\teax, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv1, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv2, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv3, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv4, eax\r\n\t\t\t}\r\n#else\r\n\t\t\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\t\t\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\t\t\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\t\t\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n#endif\r\n\t\t\tdPiece[xx][yy] = v1;\r\n\t\t\tdPiece[xx + 1][yy] = v2;\r\n\t\t\tdPiece[xx][yy + 1] = v3;\r\n\t\t\tdPiece[xx + 1][yy + 1] = v4;\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L2FTVR(int i, int j, int x, int y, int d)\r\n{\r\n\tif (dTransVal[x][y] != 0 || dungeon[i][j] != 3) {\r\n\t\tif (d == 1) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 2) {\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 3) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t}\r\n\t\tif (d == 4) {\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 5) {\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 6) {\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 7) {\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t}\r\n\t\tif (d == 8) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t}\r\n\t} else {\r\n\t\tdTransVal[x][y] = TransVal;\r\n\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\tDRLG_L2FTVR(i + 1, j, x + 2, y, 1);\r\n\t\tDRLG_L2FTVR(i - 1, j, x - 2, y, 2);\r\n\t\tDRLG_L2FTVR(i, j + 1, x, y + 2, 3);\r\n\t\tDRLG_L2FTVR(i, j - 1, x, y - 2, 4);\r\n\t\tDRLG_L2FTVR(i - 1, j - 1, x - 2, y - 2, 5);\r\n\t\tDRLG_L2FTVR(i + 1, j - 1, x + 2, y - 2, 6);\r\n\t\tDRLG_L2FTVR(i - 1, j + 1, x - 2, y + 2, 7);\r\n\t\tDRLG_L2FTVR(i + 1, j + 1, x + 2, y + 2, 8);\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L2FloodTVal()\r\n{\r\n\tint i, j, xx, yy;\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 3 && dTransVal[xx][yy] == 0) {\r\n\t\t\t\tDRLG_L2FTVR(i, j, xx, yy, 0);\r\n\t\t\t\tTransVal++;\r\n\t\t\t}\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L2TransFix()\r\n{\r\n\tint i, j, xx, yy;\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i][j - 1] == 10) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 11) {\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 10) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 11) {\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 16) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nstatic void L2DirtFix()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i + 1][j] != 11) {\r\n\t\t\t\tdungeon[i][j] = 146;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i + 1][j] != 11) {\r\n\t\t\t\tdungeon[i][j] = 144;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] != 11) {\r\n\t\t\t\tdungeon[i][j] = 148;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 10 && dungeon[i][j + 1] != 10) {\r\n\t\t\t\tdungeon[i][j] = 143;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] != 10) {\r\n\t\t\t\tdungeon[i][j] = 146;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i][j + 1] != 15) {\r\n\t\t\t\tdungeon[i][j] = 147;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid L2LockoutFix()\r\n{\r\n\tint i, j;\r\n\tBOOL doorok;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 4 && dungeon[i - 1][j] != 3) {\r\n\t\t\t\tdungeon[i][j] = 1;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 5 && dungeon[i][j - 1] != 3) {\r\n\t\t\t\tdungeon[i][j] = 2;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (j = 1; j < DMAXY - 1; j++) {\r\n\t\tfor (i = 1; i < DMAXX - 1; i++) {\r\n\t\t\tif (dflags[i][j] & DLRG_PROTECTED) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif ((dungeon[i][j] == 2 || dungeon[i][j] == 5) && dungeon[i][j - 1] == 3 && dungeon[i][j + 1] == 3) {\r\n\t\t\t\tdoorok = FALSE;\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\tif (dungeon[i][j] != 2 && dungeon[i][j] != 5) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dungeon[i][j - 1] != 3 || dungeon[i][j + 1] != 3) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dungeon[i][j] == 5) {\r\n\t\t\t\t\t\tdoorok = TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t\tif (!doorok && !(dflags[i - 1][j] & DLRG_PROTECTED)) {\r\n\t\t\t\t\tdungeon[i - 1][j] = 5;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (j = 1; j < DMAXX - 1; j++) { /* check: might be flipped */\r\n\t\tfor (i = 1; i < DMAXY - 1; i++) {\r\n\t\t\tif (dflags[j][i] & DLRG_PROTECTED) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif ((dungeon[j][i] == 1 || dungeon[j][i] == 4) && dungeon[j - 1][i] == 3 && dungeon[j + 1][i] == 3) {\r\n\t\t\t\tdoorok = FALSE;\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\tif (dungeon[j][i] != 1 && dungeon[j][i] != 4) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dungeon[j - 1][i] != 3 || dungeon[j + 1][i] != 3) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dungeon[j][i] == 4) {\r\n\t\t\t\t\t\tdoorok = TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\t\t\t\tif (!doorok && !(dflags[j][i - 1] & DLRG_PROTECTED)) {\r\n\t\t\t\t\tdungeon[j][i - 1] = 4;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid L2DoorFix()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 1; j < DMAXY; j++) {\r\n\t\tfor (i = 1; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 4 && dungeon[i][j - 1] == 3) {\r\n\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 5 && dungeon[i - 1][j] == 3) {\r\n\t\t\t\tdungeon[i][j] = 9;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L2(int entry)\r\n{\r\n\tint i, j;\r\n\tBOOL doneflag;\r\n\r\n\tdoneflag = FALSE;\r\n\twhile (!doneflag) {\r\n\t\tnRoomCnt = 0;\r\n\t\tInitDungeon();\r\n\t\tDRLG_InitTrans();\r\n\t\tif (!CreateDungeon()) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tL2TileFix();\r\n\t\tif (setloadflag) {\r\n\t\t\tDRLG_L2SetRoom(nSx1, nSy1);\r\n\t\t}\r\n\t\tDRLG_L2FloodTVal();\r\n\t\tDRLG_L2TransFix();\r\n\t\tif (entry == ENTRY_MAIN) {\r\n\t\t\tdoneflag = DRLG_L2PlaceMiniSet(USTAIRS, 1, 1, -1, -1, TRUE, 0);\r\n\t\t\tif (doneflag) {\r\n\t\t\t\tdoneflag = DRLG_L2PlaceMiniSet(DSTAIRS, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\tif (doneflag && currlevel == 5) {\r\n\t\t\t\t\tdoneflag = DRLG_L2PlaceMiniSet(WARPSTAIRS, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tViewY -= 2;\r\n\t\t} else if (entry == ENTRY_PREV) {\r\n\t\t\tdoneflag = DRLG_L2PlaceMiniSet(USTAIRS, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\tif (doneflag) {\r\n\t\t\t\tdoneflag = DRLG_L2PlaceMiniSet(DSTAIRS, 1, 1, -1, -1, TRUE, 1);\r\n\t\t\t\tif (doneflag && currlevel == 5) {\r\n\t\t\t\t\tdoneflag = DRLG_L2PlaceMiniSet(WARPSTAIRS, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tViewX--;\r\n\t\t} else {\r\n\t\t\tdoneflag = DRLG_L2PlaceMiniSet(USTAIRS, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\tif (doneflag) {\r\n\t\t\t\tdoneflag = DRLG_L2PlaceMiniSet(DSTAIRS, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\tif (doneflag && currlevel == 5) {\r\n\t\t\t\t\tdoneflag = DRLG_L2PlaceMiniSet(WARPSTAIRS, 1, 1, -1, -1, TRUE, 6);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tViewY -= 2;\r\n\t\t}\r\n\t}\r\n\r\n\tL2LockoutFix();\r\n\tL2DoorFix();\r\n\tL2DirtFix();\r\n\r\n\tDRLG_PlaceThemeRooms(6, 10, 3, 0, 0);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR1, 100);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR2, 100);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR3, 100);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR4, 100);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR5, 100);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR6, 100);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR7, 100);\r\n\tDRLG_L2PlaceRndSet(CTRDOOR8, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH33, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH34, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH35, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH36, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH37, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH38, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH39, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH40, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH1, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH2, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH3, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH4, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH5, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH6, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH7, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH8, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH9, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH10, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH11, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH12, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH13, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH14, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH15, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH16, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH17, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH18, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH19, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH20, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH21, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH22, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH23, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH24, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH25, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH26, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH27, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH28, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH29, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH30, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH31, 100);\r\n\tDRLG_L2PlaceRndSet(VARCH32, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH1, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH2, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH3, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH4, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH5, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH6, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH7, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH8, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH9, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH10, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH11, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH12, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH13, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH14, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH15, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH16, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH17, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH18, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH19, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH20, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH21, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH22, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH23, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH24, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH25, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH26, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH27, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH28, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH29, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH30, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH31, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH32, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH33, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH34, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH35, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH36, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH37, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH38, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH39, 100);\r\n\tDRLG_L2PlaceRndSet(HARCH40, 100);\r\n\tDRLG_L2PlaceRndSet(CRUSHCOL, 99);\r\n\tDRLG_L2PlaceRndSet(RUINS1, 10);\r\n\tDRLG_L2PlaceRndSet(RUINS2, 10);\r\n\tDRLG_L2PlaceRndSet(RUINS3, 10);\r\n\tDRLG_L2PlaceRndSet(RUINS4, 10);\r\n\tDRLG_L2PlaceRndSet(RUINS5, 10);\r\n\tDRLG_L2PlaceRndSet(RUINS6, 10);\r\n\tDRLG_L2PlaceRndSet(RUINS7, 50);\r\n\tDRLG_L2PlaceRndSet(PANCREAS1, 1);\r\n\tDRLG_L2PlaceRndSet(PANCREAS2, 1);\r\n\tDRLG_L2PlaceRndSet(BIG1, 3);\r\n\tDRLG_L2PlaceRndSet(BIG2, 3);\r\n\tDRLG_L2PlaceRndSet(BIG3, 3);\r\n\tDRLG_L2PlaceRndSet(BIG4, 3);\r\n\tDRLG_L2PlaceRndSet(BIG5, 3);\r\n\tDRLG_L2PlaceRndSet(BIG6, 20);\r\n\tDRLG_L2PlaceRndSet(BIG7, 20);\r\n\tDRLG_L2PlaceRndSet(BIG8, 3);\r\n\tDRLG_L2PlaceRndSet(BIG9, 20);\r\n\tDRLG_L2PlaceRndSet(BIG10, 20);\r\n\tDRLG_L2Subs();\r\n\tDRLG_L2Shadows();\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tpdungeon[i][j] = dungeon[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_Init_Globals();\r\n\tDRLG_CheckQuests(nSx1, nSy1);\r\n}\r\n\r\nstatic void DRLG_InitL2Vals()\r\n{\r\n\tint i, j, pc;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 541) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t} else if (dPiece[i][j] == 178) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t} else if (dPiece[i][j] == 551) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t} else if (dPiece[i][j] == 542) {\r\n\t\t\t\tpc = 6;\r\n\t\t\t} else if (dPiece[i][j] == 553) {\r\n\t\t\t\tpc = 6;\r\n\t\t\t} else if (dPiece[i][j] == 13) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t} else if (dPiece[i][j] == 17) {\r\n\t\t\t\tpc = 6;\r\n\t\t\t} else {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tdSpecial[i][j] = pc;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 132) {\r\n\t\t\t\tdSpecial[i][j + 1] = 2;\r\n\t\t\t\tdSpecial[i][j + 2] = 1;\r\n\t\t\t} else if (dPiece[i][j] == 135 || dPiece[i][j] == 139) {\r\n\t\t\t\tdSpecial[i + 1][j] = 3;\r\n\t\t\t\tdSpecial[i + 2][j] = 4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid LoadL2Dungeon(const char *sFileName, int vx, int vy)\r\n{\r\n\tint i, j, rw, rh, pc;\r\n\tBYTE *pLevelMap, *lm;\r\n\r\n\tInitDungeon();\r\n\tDRLG_InitTrans();\r\n\tpLevelMap = LoadFileInMem(sFileName, NULL);\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 12;\r\n\t\t\tdflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tlm = pLevelMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tlm += 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm != 0) {\r\n\t\t\t\tdungeon[i][j] = *lm;\r\n\t\t\t\tdflags[i][j] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i][j] = 3;\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 0) {\r\n\t\t\t\tdungeon[i][j] = 12;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_L2Pass3();\r\n\tDRLG_Init_Globals();\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tpc = 0;\r\n\t\t\tif (dPiece[i][j] == 541) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 178) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 551) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 542) {\r\n\t\t\t\tpc = 6;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 553) {\r\n\t\t\t\tpc = 6;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 13) {\r\n\t\t\t\tpc = 5;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 17) {\r\n\t\t\t\tpc = 6;\r\n\t\t\t}\r\n\t\t\tdSpecial[i][j] = pc;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 132) {\r\n\t\t\t\tdSpecial[i][j + 1] = 2;\r\n\t\t\t\tdSpecial[i][j + 2] = 1;\r\n\t\t\t} else if (dPiece[i][j] == 135 || dPiece[i][j] == 139) {\r\n\t\t\t\tdSpecial[i + 1][j] = 3;\r\n\t\t\t\tdSpecial[i + 2][j] = 4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tViewX = vx;\r\n\tViewY = vy;\r\n\tSetMapMonsters(pLevelMap, 0, 0);\r\n\tSetMapObjects(pLevelMap, 0, 0);\r\n\tmem_free_dbg(pLevelMap);\r\n}\r\n\r\nvoid LoadPreL2Dungeon(const char *sFileName, int vx, int vy)\r\n{\r\n\tint i, j, rw, rh;\r\n\tBYTE *pLevelMap, *lm;\r\n\r\n\tInitDungeon();\r\n\tDRLG_InitTrans();\r\n\tpLevelMap = LoadFileInMem(sFileName, NULL);\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 12;\r\n\t\t\tdflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tlm = pLevelMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tlm += 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm != 0) {\r\n\t\t\t\tdungeon[i][j] = *lm;\r\n\t\t\t\tdflags[i][j] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i][j] = 3;\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 0) {\r\n\t\t\t\tdungeon[i][j] = 12;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tpdungeon[i][j] = dungeon[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\tmem_free_dbg(pLevelMap);\r\n}\r\n\r\nvoid CreateL2Dungeon(DWORD rseed, int entry)\r\n{\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (currlevel == 7 && quests[Q_BLIND]._qactive == QUEST_NOTAVAIL) {\r\n\t\t\tcurrlevel = 6;\r\n\t\t\tCreateL2Dungeon(glSeedTbl[6], 4);\r\n\t\t\tcurrlevel = 7;\r\n\t\t}\r\n\t\tif (currlevel == 8) {\r\n\t\t\tif (quests[Q_BLIND]._qactive == QUEST_NOTAVAIL) {\r\n\t\t\t\tcurrlevel = 6;\r\n\t\t\t\tCreateL2Dungeon(glSeedTbl[6], 4);\r\n\t\t\t\tcurrlevel = 8;\r\n\t\t\t} else {\r\n\t\t\t\tcurrlevel = 7;\r\n\t\t\t\tCreateL2Dungeon(glSeedTbl[7], 4);\r\n\t\t\t\tcurrlevel = 8;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tSetRndSeed(rseed);\r\n\r\n\tdminx = 16;\r\n\tdminy = 16;\r\n\tdmaxx = 96;\r\n\tdmaxy = 96;\r\n\r\n\tDRLG_InitTrans();\r\n\tDRLG_InitSetPC();\r\n\tDRLG_LoadL2SP();\r\n\tDRLG_L2(entry);\r\n\tDRLG_L2Pass3();\r\n\tDRLG_FreeL2SP();\r\n\tDRLG_InitL2Vals();\r\n\tDRLG_SetPC();\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/drlg_l2.h",
    "content": "/**\r\n * @file drlg_l2.h\r\n *\r\n * Interface of the catacombs level generation algorithms.\r\n */\r\n#ifndef __DRLG_L2_H__\r\n#define __DRLG_L2_H__\r\n\r\nvoid LoadL2Dungeon(const char *sFileName, int vx, int vy);\r\nvoid LoadPreL2Dungeon(const char *sFileName, int vx, int vy);\r\nvoid CreateL2Dungeon(DWORD rseed, int entry);\r\n\r\n#endif /* __DRLG_L2_H__ */\r\n"
  },
  {
    "path": "Source/drlg_l3.cpp",
    "content": "/**\r\n * @file drlg_l3.cpp\r\n *\r\n * Implementation of the caves level generation algorithms.\r\n */\r\n#ifndef SPAWN\r\n#include \"all.h\"\r\n\r\n/** This will be true if a lava pool has been generated for the level */\r\n\r\nBOOLEAN lavapool;\r\n/** unused */\r\nint abyssx;\r\nint lockoutcnt;\r\nBOOLEAN lockout[DMAXX][DMAXY];\r\n\r\n/**\r\n * A lookup table for the 16 possible patterns of a 2x2 area,\r\n * where each cell either contains a SW wall or it doesn't.\r\n */\r\nconst BYTE L3ConvTbl[16] = { 8, 11, 3, 10, 1, 9, 12, 12, 6, 13, 4, 13, 2, 14, 5, 7 };\r\n/** Miniset: Stairs up. */\r\nconst BYTE L3UP[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t 8,  8, 0, // search\r\n\t10, 10, 0,\r\n\t 7,  7, 0,\r\n\r\n\t51, 50, 0, // replace\r\n\t48, 49, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\n#ifdef HELLFIRE\r\nconst BYTE L6UP[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t 8,  8, 0, // search\r\n\t10, 10, 0,\r\n\t 7,  7, 0,\r\n\r\n\t20, 19, 0, // replace\r\n\t17, 18, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\n#endif\r\n/** Miniset: Stairs down. */\r\nconst BYTE L3DOWN[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t8, 9, 7, // search\r\n\t8, 9, 7,\r\n\t0, 0, 0,\r\n\r\n\t0, 47, 0, // replace\r\n\t0, 46, 0,\r\n\t0,  0, 0,\r\n\t// clang-format on\r\n};\r\n#ifdef HELLFIRE\r\nconst BYTE L6DOWN[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t8, 9, 7, // search\r\n\t8, 9, 7,\r\n\t0, 0, 0,\r\n\r\n\t0, 16, 0, // replace\r\n\t0, 15, 0,\r\n\t0,  0, 0,\r\n\t// clang-format on\r\n};\r\n#endif\r\n/** Miniset: Stairs up to town. */\r\nconst BYTE L3HOLDWARP[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t 8,  8, 0, // search\r\n\t10, 10, 0,\r\n\t 7,  7, 0,\r\n\r\n\t125, 125, 0, // replace\r\n\t125, 125, 0,\r\n\t  0,   0, 0,\r\n\t// clang-format on\r\n};\r\n#ifdef HELLFIRE\r\nconst BYTE L6HOLDWARP[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t 8,  8, 0, // search\r\n\t10, 10, 0,\r\n\t 7,  7, 0,\r\n\r\n\t24, 23, 0, // replace\r\n\t21, 22, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\n#endif\r\n/** Miniset: Stalagmite white stalactite 1. */\r\nconst BYTE L3TITE1[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t0,  0,  0, 0, // replace\r\n\t0, 57, 58, 0,\r\n\t0, 56, 55, 0,\r\n\t0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite white stalactite 2. */\r\nconst BYTE L3TITE2[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t0,  0,  0, 0, // replace\r\n\t0, 61, 62, 0,\r\n\t0, 60, 59, 0,\r\n\t0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite white stalactite 3. */\r\nconst BYTE L3TITE3[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t0,  0,  0, 0, // replace\r\n\t0, 65, 66, 0,\r\n\t0, 64, 63, 0,\r\n\t0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite white stalactite horizontal. */\r\nconst BYTE L3TITE6[] = {\r\n\t// clang-format off\r\n\t5, 4, // width, height\r\n\r\n\t7, 7, 7, 7, 7, // search\r\n\t7, 7, 7, 0, 7,\r\n\t7, 7, 7, 0, 7,\r\n\t7, 7, 7, 7, 7,\r\n\r\n\t0,  0,  0,  0, 0, // replace\r\n\t0, 77, 78,  0, 0,\r\n\t0, 76, 74, 75, 0,\r\n\t0,  0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite white stalactite vertical. */\r\nconst BYTE L3TITE7[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 0, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t0,  0,  0, 0, // replace\r\n\t0, 83,  0, 0,\r\n\t0, 82, 80, 0,\r\n\t0, 81, 79, 0,\r\n\t0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite 1. */\r\nconst BYTE L3TITE8[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t0,  0, 0, // replace\r\n\t0, 52, 0,\r\n\t0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite 2. */\r\nconst BYTE L3TITE9[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t0,  0, 0, // replace\r\n\t0, 53, 0,\r\n\t0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite 3. */\r\nconst BYTE L3TITE10[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t0,  0, 0, // replace\r\n\t0, 54, 0,\r\n\t0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite 4. */\r\nconst BYTE L3TITE11[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t0,  0, 0, // replace\r\n\t0, 67, 0,\r\n\t0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite on vertical wall. */\r\nconst BYTE L3TITE12[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t9, 7, // search\r\n\r\n\t68, 0, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stalagmite on horizontal wall. */\r\nconst BYTE L3TITE13[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t10, // search\r\n\t 7,\r\n\r\n\t69, // replace\r\n\t 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked vertical wall 1. */\r\nconst BYTE L3CREV1[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t8, 7, // search\r\n\r\n\t84, 85, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked vertical wall - north corner. */\r\nconst BYTE L3CREV2[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t8, 11, // search\r\n\r\n\t86, 87, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked horizontal wall 1. */\r\nconst BYTE L3CREV3[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t 8, // search\r\n\t10,\r\n\r\n\t89, // replace\r\n\t88,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked vertical wall 2. */\r\nconst BYTE L3CREV4[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t8, 7, // search\r\n\r\n\t90, 91, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked horizontal wall - north corner. */\r\nconst BYTE L3CREV5[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t 8, // search\r\n\t11,\r\n\r\n\t92, // replace\r\n\t93,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked horizontal wall 2. */\r\nconst BYTE L3CREV6[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t 8, // search\r\n\t10,\r\n\r\n\t95, // replace\r\n\t94,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked vertical wall - west corner. */\r\nconst BYTE L3CREV7[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t8, 7, // search\r\n\r\n\t96, 101, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked horizontal wall - north. */\r\nconst BYTE L3CREV8[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t2, // search\r\n\t8,\r\n\r\n\t102, // replace\r\n\t 97,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked vertical wall - east corner. */\r\nconst BYTE L3CREV9[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t3, 8, // search\r\n\r\n\t103, 98, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked vertical wall - west. */\r\nconst BYTE L3CREV10[] = {\r\n\t// clang-format off\r\n\t2, 1, // width, height\r\n\r\n\t4, 8, // search\r\n\r\n\t104, 99, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Cracked horizontal wall - south corner. */\r\nconst BYTE L3CREV11[] = {\r\n\t// clang-format off\r\n\t1, 2, // width, height\r\n\r\n\t6, // search\r\n\t8,\r\n\r\n\t105, // replace\r\n\t100,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Replace broken wall with floor 1. */\r\nconst BYTE L3ISLE1[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t5, 14, // search\r\n\t4,  9,\r\n\t13, 12,\r\n\r\n\t7, 7, // replace\r\n\t7, 7,\r\n\t7, 7,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Replace small wall with floor 2. */\r\nconst BYTE L3ISLE2[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t 5,  2, 14, // search\r\n\t13, 10, 12,\r\n\r\n\t7, 7, 7, // replace\r\n\t7, 7, 7,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Replace small wall with lava 1. */\r\nconst BYTE L3ISLE3[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t 5, 14, // search\r\n\t 4,  9,\r\n\t13, 12,\r\n\r\n\t29, 30, // replace\r\n\t25, 28,\r\n\t31, 32,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Replace small wall with lava 2. */\r\nconst BYTE L3ISLE4[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t 5,  2, 14, // search\r\n\t13, 10, 12,\r\n\r\n\t29, 26, 30, // replace\r\n\t31, 27, 32,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Replace small wall with floor 3. */\r\nconst BYTE L3ISLE5[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t 5, 14, // search\r\n\t13, 12,\r\n\r\n\t7, 7, // replace\r\n\t7, 7,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Use random floor tile 1. */\r\nconst BYTE L3XTRA1[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t7, // search\r\n\r\n\t106, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Use random floor tile 2. */\r\nconst BYTE L3XTRA2[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t7, // search\r\n\r\n\t107, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Use random floor tile 3. */\r\nconst BYTE L3XTRA3[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t7, // search\r\n\r\n\t108, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Use random horizontal wall tile. */\r\nconst BYTE L3XTRA4[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t9, // search\r\n\r\n\t109, // replace\r\n\t// clang-format on\r\n};\r\n/** Miniset: Use random vertical wall tile. */\r\nconst BYTE L3XTRA5[] = {\r\n\t// clang-format off\r\n\t1, 1, // width, height\r\n\r\n\t10, // search\r\n\r\n\t110, // replace\r\n\t// clang-format on\r\n};\r\n\r\n/** Miniset: Anvil of Fury island. */\r\nconst BYTE L3ANVIL[] = {\r\n\t// clang-format off\r\n\t11, 11, // width, height\r\n\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // search\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\t7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n\r\n\t0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, // replace\r\n\t0,  0, 29, 26, 26, 26, 26, 26, 30,  0, 0,\r\n\t0, 29, 34, 33, 33, 37, 36, 33, 35, 30, 0,\r\n\t0, 25, 33, 37, 27, 32, 31, 36, 33, 28, 0,\r\n\t0, 25, 37, 32,  7,  7,  7, 31, 27, 32, 0,\r\n\t0, 25, 28,  7,  7,  7,  7,  2,  2,  2, 0,\r\n\t0, 25, 35, 30,  7,  7,  7, 29, 26, 30, 0,\r\n\t0, 25, 33, 35, 26, 30, 29, 34, 33, 28, 0,\r\n\t0, 31, 36, 33, 33, 35, 34, 33, 37, 32, 0,\r\n\t0,  0, 31, 27, 27, 27, 27, 27, 32,  0, 0,\r\n\t0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n#ifdef HELLFIRE\r\nconst BYTE byte_48A76C[] = { 1, 1, 8, 25 };\r\nconst BYTE byte_48A770[] = { 1, 1, 8, 26 };\r\nconst BYTE byte_48A774[] = { 1, 1, 8, 27 };\r\nconst BYTE byte_48A778[] = { 1, 1, 8, 28 };\r\nconst BYTE byte_48A77C[] = { 1, 1, 7, 29 };\r\nconst BYTE byte_48A780[] = { 1, 1, 7, 30 };\r\nconst BYTE byte_48A784[] = { 1, 1, 7, 31 };\r\nconst BYTE byte_48A788[] = { 1, 1, 7, 32 };\r\nconst BYTE byte_48A790[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 126, 0,\r\n\t0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A7A8[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t0,   0, 0, // replace\r\n\t0, 124, 0,\r\n\t0,   0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A7BC[] = { 1, 1, 9, 33 };\r\nconst BYTE byte_48A7C0[] = { 1, 1, 9, 34 };\r\nconst BYTE byte_48A7C4[] = { 1, 1, 9, 35 };\r\nconst BYTE byte_48A7C8[] = { 1, 1, 9, 36 };\r\nconst BYTE byte_48A7CC[] = { 1, 1, 9, 37 };\r\nconst BYTE byte_48A7D0[] = { 1, 1, 11, 38 };\r\nconst BYTE byte_48A7D4[] = { 1, 1, 10, 39 };\r\nconst BYTE byte_48A7D8[] = { 1, 1, 10, 40 };\r\nconst BYTE byte_48A7DC[] = { 1, 1, 10, 41 };\r\nconst BYTE byte_48A7E0[] = { 1, 1, 10, 42 };\r\nconst BYTE byte_48A7E4[] = { 1, 1, 10, 43 };\r\nconst BYTE byte_48A7E8[] = { 1, 1, 11, 44 };\r\nconst BYTE byte_48A7EC[] = { 1, 1, 9, 45 };\r\nconst BYTE byte_48A7F0[] = { 1, 1, 9, 46 };\r\nconst BYTE byte_48A7F4[] = { 1, 1, 10, 47 };\r\nconst BYTE byte_48A7F8[] = { 1, 1, 10, 48 };\r\nconst BYTE byte_48A7FC[] = { 1, 1, 11, 49 };\r\nconst BYTE byte_48A800[] = { 1, 1, 11, 50 };\r\nconst BYTE byte_48A808[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t67,  0, 0, // replace\r\n\t66, 51, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A820[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t69,  0, 0, // replace\r\n\t68, 52, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A838[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t70,  0, 0, // replace\r\n\t71, 53, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A850[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t73,  0, 0, // replace\r\n\t72, 54, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A868[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t75,  0, 0, // replace\r\n\t74, 55, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A880[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t77,  0, 0, // replace\r\n\t76, 56, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A898[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t79,  0, 0, // replace\r\n\t78, 57, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A8B0[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t81,  0, 0, // replace\r\n\t80, 58, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A8C8[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t83,  0, 0, // replace\r\n\t82, 59, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A8E0[] = {\r\n\t// clang-format off\r\n\t3, 3, // width, height\r\n\r\n\t7, 7, 7, // search\r\n\t7, 7, 7,\r\n\t7, 7, 7,\r\n\r\n\t84,  0, 0, // replace\r\n\t85, 60, 0,\r\n\t 0,  0, 0,\r\n\t// clang-format on\r\n};\r\nconst BYTE L6ISLE1[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t 5, 14, // search\r\n\t 4,  9,\r\n\t13, 12,\r\n\r\n\t7, 7, // replace\r\n\t7, 7,\r\n\t7, 7,\r\n\t// clang-format on\r\n};\r\nconst BYTE L6ISLE2[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t 5,  2, 14, // search\r\n\t13, 10, 12,\r\n\r\n\t7, 7, 7, // replace\r\n\t7, 7, 7,\r\n\t// clang-format on\r\n};\r\nconst BYTE L6ISLE3[] = {\r\n\t// clang-format off\r\n\t2, 3, // width, height\r\n\r\n\t 5, 14, // search\r\n\t 4,  9,\r\n\t13, 12,\r\n\r\n\t107, 115, // replace\r\n\t119, 122,\r\n\t131, 123,\r\n\t// clang-format on\r\n};\r\nconst BYTE L6ISLE4[] = {\r\n\t// clang-format off\r\n\t3, 2, // width, height\r\n\r\n\t 5,  2, 14, // search\r\n\t13, 10, 12,\r\n\r\n\t107, 120, 115, // replace\r\n\t131, 121, 123,\r\n\t// clang-format on\r\n};\r\nconst BYTE L6ISLE5[] = {\r\n\t// clang-format off\r\n\t2, 2, // width, height\r\n\r\n\t 5, 14, // search\r\n\t13, 12,\r\n\r\n\t7, 7, // replace\r\n\t7, 7,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A948[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t7,   7,   7, 7, // replace\r\n\t7, 107, 115, 7,\r\n\t7, 131, 123, 7,\r\n\t7,   7,   7, 7,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A970[] = {\r\n\t// clang-format off\r\n\t4, 4, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t7,   7,   7, 7, // replace\r\n\t7,   7, 108, 7,\r\n\t7, 109, 112, 7,\r\n\t7,   7,   7, 7,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A998[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t7,   7,   7, 7, // replace\r\n\t7, 107, 115, 7,\r\n\t7, 119, 122, 7,\r\n\t7, 131, 123, 7,\r\n\t7,   7,   7, 7,\r\n\t// clang-format on\r\n};\r\nconst BYTE byte_48A9C8[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t7, 7, 7, 7, // search\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\t7, 7, 7, 7,\r\n\r\n\t7,   7,   7, 7, // replace\r\n\t7, 126, 108, 7,\r\n\t7,   7, 117, 7,\r\n\t7, 109, 112, 7,\r\n\t7,   7,   7, 7,\r\n\t// clang-format on\r\n};\r\n#endif\r\n\r\nstatic void InitL3Dungeon()\r\n{\r\n\tint i, j;\r\n\r\n\tmemset(dungeon, 0, sizeof(dungeon));\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 0;\r\n\t\t\tdflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL DRLG_L3FillRoom(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j, v;\r\n\r\n\tif (x1 <= 1 || x2 >= 34 || y1 <= 1 || y2 >= 38) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tv = 0;\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tv += dungeon[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\tif (v != 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tfor (j = y1 + 1; j < y2; j++) {\r\n\t\tfor (i = x1 + 1; i < x2; i++) {\r\n\t\t\tdungeon[i][j] = 1;\r\n\t\t}\r\n\t}\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tif (random_(0, 2) != 0) {\r\n\t\t\tdungeon[x1][j] = 1;\r\n\t\t}\r\n\t\tif (random_(0, 2) != 0) {\r\n\t\t\tdungeon[x2][j] = 1;\r\n\t\t}\r\n\t}\r\n\tfor (i = x1; i <= x2; i++) {\r\n\t\tif (random_(0, 2) != 0) {\r\n\t\t\tdungeon[i][y1] = 1;\r\n\t\t}\r\n\t\tif (random_(0, 2) != 0) {\r\n\t\t\tdungeon[i][y2] = 1;\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void DRLG_L3CreateBlock(int x, int y, int obs, int dir)\r\n{\r\n\tint blksizex, blksizey, x1, y1, x2, y2;\r\n\tint contflag;\r\n\r\n\tblksizex = random_(0, 2) + 3;\r\n\tblksizey = random_(0, 2) + 3;\r\n\r\n\tif (dir == 0) {\r\n\t\ty2 = y - 1;\r\n\t\ty1 = y2 - blksizey;\r\n\t\tif (blksizex < obs) {\r\n\t\t\tx1 = random_(0, blksizex) + x;\r\n\t\t}\r\n\t\tif (blksizex == obs) {\r\n\t\t\tx1 = x;\r\n\t\t}\r\n\t\tif (blksizex > obs) {\r\n\t\t\tx1 = x - random_(0, blksizex);\r\n\t\t}\r\n\t\tx2 = blksizex + x1;\r\n\t}\r\n\tif (dir == 3) {\r\n\t\tx2 = x - 1;\r\n\t\tx1 = x2 - blksizex;\r\n\t\tif (blksizey < obs) {\r\n\t\t\ty1 = random_(0, blksizey) + y;\r\n\t\t}\r\n\t\tif (blksizey == obs) {\r\n\t\t\ty1 = y;\r\n\t\t}\r\n\t\tif (blksizey > obs) {\r\n\t\t\ty1 = y - random_(0, blksizey);\r\n\t\t}\r\n\t\ty2 = y1 + blksizey;\r\n\t}\r\n\tif (dir == 2) {\r\n\t\ty1 = y + 1;\r\n\t\ty2 = y1 + blksizey;\r\n\t\tif (blksizex < obs) {\r\n\t\t\tx1 = random_(0, blksizex) + x;\r\n\t\t}\r\n\t\tif (blksizex == obs) {\r\n\t\t\tx1 = x;\r\n\t\t}\r\n\t\tif (blksizex > obs) {\r\n\t\t\tx1 = x - random_(0, blksizex);\r\n\t\t}\r\n\t\tx2 = blksizex + x1;\r\n\t}\r\n\tif (dir == 1) {\r\n\t\tx1 = x + 1;\r\n\t\tx2 = x1 + blksizex;\r\n\t\tif (blksizey < obs) {\r\n\t\t\ty1 = random_(0, blksizey) + y;\r\n\t\t}\r\n\t\tif (blksizey == obs) {\r\n\t\t\ty1 = y;\r\n\t\t}\r\n\t\tif (blksizey > obs) {\r\n\t\t\ty1 = y - random_(0, blksizey);\r\n\t\t}\r\n\t\ty2 = y1 + blksizey;\r\n\t}\r\n\r\n\tif (DRLG_L3FillRoom(x1, y1, x2, y2) == TRUE) {\r\n\t\tcontflag = random_(0, 4);\r\n\t\tif (contflag != 0 && dir != 2) {\r\n\t\t\tDRLG_L3CreateBlock(x1, y1, blksizey, 0);\r\n\t\t}\r\n\t\tif (contflag != 0 && dir != 3) {\r\n\t\t\tDRLG_L3CreateBlock(x2, y1, blksizex, 1);\r\n\t\t}\r\n\t\tif (contflag != 0 && dir != 0) {\r\n\t\t\tDRLG_L3CreateBlock(x1, y2, blksizey, 2);\r\n\t\t}\r\n\t\tif (contflag != 0 && dir != 1) {\r\n\t\t\tDRLG_L3CreateBlock(x1, y1, blksizex, 3);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3FloorArea(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tdungeon[i][j] = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3FillDiags()\r\n{\r\n\tint i, j, v;\r\n\r\n\tfor (j = 0; j < DMAXY - 1; j++) {\r\n\t\tfor (i = 0; i < DMAXX - 1; i++) {\r\n\t\t\tv = dungeon[i + 1][j + 1] + 2 * dungeon[i][j + 1] + 4 * dungeon[i + 1][j] + 8 * dungeon[i][j];\r\n\t\t\tif (v == 6) {\r\n\t\t\t\tif (random_(0, 2) == 0) {\r\n\t\t\t\t\tdungeon[i][j] = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdungeon[i + 1][j + 1] = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (v == 9) {\r\n\t\t\t\tif (random_(0, 2) == 0) {\r\n\t\t\t\t\tdungeon[i + 1][j] = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdungeon[i][j + 1] = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3FillSingles()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 1; j < DMAXY - 1; j++) {\r\n\t\tfor (i = 1; i < DMAXX - 1; i++) {\r\n\t\t\tif (dungeon[i][j] == 0\r\n\t\t\t    && dungeon[i][j - 1] + dungeon[i - 1][j - 1] + dungeon[i + 1][j - 1] == 3\r\n\t\t\t    && dungeon[i + 1][j] + dungeon[i - 1][j] == 2\r\n\t\t\t    && dungeon[i][j + 1] + dungeon[i - 1][j + 1] + dungeon[i + 1][j + 1] == 3) {\r\n\t\t\t\tdungeon[i][j] = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3FillStraights()\r\n{\r\n\tint i, j, xc, xs, yc, ys, k, rv;\r\n\r\n\tfor (j = 0; j < DMAXY - 1; j++) {\r\n\t\txs = 0;\r\n\t\tfor (i = 0; i < 37; i++) {\r\n\t\t\tif (dungeon[i][j] == 0 && dungeon[i][j + 1] == 1) {\r\n\t\t\t\tif (xs == 0) {\r\n\t\t\t\t\txc = i;\r\n\t\t\t\t}\r\n\t\t\t\txs++;\r\n\t\t\t} else {\r\n\t\t\t\tif (xs > 3 && random_(0, 2) != 0) {\r\n\t\t\t\t\tfor (k = xc; k < i; k++) {\r\n\t\t\t\t\t\trv = random_(0, 2);\r\n\t\t\t\t\t\tdungeon[k][j] = rv;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\txs = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY - 1; j++) {\r\n\t\txs = 0;\r\n\t\tfor (i = 0; i < 37; i++) {\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 0) {\r\n\t\t\t\tif (xs == 0) {\r\n\t\t\t\t\txc = i;\r\n\t\t\t\t}\r\n\t\t\t\txs++;\r\n\t\t\t} else {\r\n\t\t\t\tif (xs > 3 && random_(0, 2) != 0) {\r\n\t\t\t\t\tfor (k = xc; k < i; k++) {\r\n\t\t\t\t\t\trv = random_(0, 2);\r\n\t\t\t\t\t\tdungeon[k][j + 1] = rv;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\txs = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < DMAXX - 1; i++) {\r\n\t\tys = 0;\r\n\t\tfor (j = 0; j < 37; j++) {\r\n\t\t\tif (dungeon[i][j] == 0 && dungeon[i + 1][j] == 1) {\r\n\t\t\t\tif (ys == 0) {\r\n\t\t\t\t\tyc = j;\r\n\t\t\t\t}\r\n\t\t\t\tys++;\r\n\t\t\t} else {\r\n\t\t\t\tif (ys > 3 && random_(0, 2) != 0) {\r\n\t\t\t\t\tfor (k = yc; k < j; k++) {\r\n\t\t\t\t\t\trv = random_(0, 2);\r\n\t\t\t\t\t\tdungeon[i][k] = rv;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tys = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < DMAXX - 1; i++) {\r\n\t\tys = 0;\r\n\t\tfor (j = 0; j < 37; j++) {\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i + 1][j] == 0) {\r\n\t\t\t\tif (ys == 0) {\r\n\t\t\t\t\tyc = j;\r\n\t\t\t\t}\r\n\t\t\t\tys++;\r\n\t\t\t} else {\r\n\t\t\t\tif (ys > 3 && random_(0, 2) != 0) {\r\n\t\t\t\t\tfor (k = yc; k < j; k++) {\r\n\t\t\t\t\t\trv = random_(0, 2);\r\n\t\t\t\t\t\tdungeon[i + 1][k] = rv;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tys = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3Edges()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tdungeon[DMAXX - 1][j] = 0;\r\n\t}\r\n\tfor (i = 0; i < DMAXX; i++) {\r\n\t\tdungeon[i][DMAXY - 1] = 0;\r\n\t}\r\n}\r\n\r\nstatic int DRLG_L3GetFloorArea()\r\n{\r\n\tint i, j, gfa;\r\n\r\n\tgfa = 0;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tgfa += dungeon[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\treturn gfa;\r\n}\r\n\r\nstatic void DRLG_L3MakeMegas()\r\n{\r\n\tint i, j, v, rv;\r\n\r\n\tfor (j = 0; j < DMAXY - 1; j++) {\r\n\t\tfor (i = 0; i < DMAXX - 1; i++) {\r\n\t\t\tv = dungeon[i + 1][j + 1] + 2 * dungeon[i][j + 1] + 4 * dungeon[i + 1][j] + 8 * dungeon[i][j];\r\n\t\t\tif (v == 6) {\r\n\t\t\t\trv = random_(0, 2);\r\n\t\t\t\tif (rv == 0) {\r\n\t\t\t\t\tv = 12;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tv = 5;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (v == 9) {\r\n\t\t\t\trv = random_(0, 2);\r\n\t\t\t\tif (rv == 0) {\r\n\t\t\t\t\tv = 13;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tv = 14;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdungeon[i][j] = L3ConvTbl[v];\r\n\t\t}\r\n\t\tdungeon[DMAXX - 1][j] = 8;\r\n\t}\r\n\tfor (i = 0; i < DMAXX; i++) {\r\n\t\tdungeon[i][DMAXY - 1] = 8;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3River()\r\n{\r\n\tint rx, ry, px, py, dir, pdir, nodir, nodir2, dircheck;\r\n\tint river[3][100];\r\n\tint rivercnt, riveramt;\r\n\tint i, trys, found, bridge, lpcnt;\r\n\tBOOL bail;\r\n\r\n\trivercnt = 0;\r\n\tbail = FALSE;\r\n\ttrys = 0;\r\n\t/// BUGFIX: pdir is uninitialized, add code `pdir = -1;`\r\n\r\n\twhile (trys < 200 && rivercnt < 4) {\r\n\t\tbail = FALSE;\r\n\t\twhile (!bail && trys < 200) {\r\n\t\t\ttrys++;\r\n\t\t\trx = 0;\r\n\t\t\try = 0;\r\n\t\t\ti = 0;\r\n\t\t\t// BUGFIX: Replace with `(ry >= DMAXY || dungeon[rx][ry] < 25 || dungeon[rx][ry] > 28) && i < 100`\r\n\t\t\twhile ((dungeon[rx][ry] < 25 || dungeon[rx][ry] > 28) && i < 100) {\r\n\t\t\t\trx = random_(0, DMAXX);\r\n\t\t\t\try = random_(0, DMAXY);\r\n\t\t\t\ti++;\r\n\t\t\t\t// BUGFIX: Move `ry < DMAXY` check before dungeon checks\r\n\t\t\t\twhile ((dungeon[rx][ry] < 25 || dungeon[rx][ry] > 28) && ry < DMAXY) {\r\n\t\t\t\t\trx++;\r\n\t\t\t\t\tif (rx >= DMAXX) {\r\n\t\t\t\t\t\trx = 0;\r\n\t\t\t\t\t\try++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// BUGFIX: Continue if `ry >= DMAXY`\r\n\t\t\tif (i >= 100) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tswitch (dungeon[rx][ry]) {\r\n\t\t\tcase 25:\r\n\t\t\t\tdir = 3;\r\n\t\t\t\tnodir = 2;\r\n\t\t\t\triver[2][0] = 40;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 26:\r\n\t\t\t\tdir = 0;\r\n\t\t\t\tnodir = 1;\r\n\t\t\t\triver[2][0] = 38;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 27:\r\n\t\t\t\tdir = 1;\r\n\t\t\t\tnodir = 0;\r\n\t\t\t\triver[2][0] = 41;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 28:\r\n\t\t\t\tdir = 2;\r\n\t\t\t\tnodir = 3;\r\n\t\t\t\triver[2][0] = 39;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\triver[0][0] = rx;\r\n\t\t\triver[1][0] = ry;\r\n\t\t\triveramt = 1;\r\n\t\t\tnodir2 = 4;\r\n\t\t\tdircheck = 0;\r\n\t\t\twhile (dircheck < 4 && riveramt < 100) {\r\n\t\t\t\tpx = rx;\r\n\t\t\t\tpy = ry;\r\n\t\t\t\tif (dircheck == 0) {\r\n\t\t\t\t\tdir = random_(0, 4);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdir = (dir + 1) & 3;\r\n\t\t\t\t}\r\n\t\t\t\tdircheck++;\r\n\t\t\t\twhile (dir == nodir || dir == nodir2) {\r\n\t\t\t\t\tdir = (dir + 1) & 3;\r\n\t\t\t\t\tdircheck++;\r\n\t\t\t\t}\r\n\t\t\t\tif (dir == 0 && ry > 0) {\r\n\t\t\t\t\try--;\r\n\t\t\t\t}\r\n\t\t\t\tif (dir == 1 && ry < DMAXY) {\r\n\t\t\t\t\try++;\r\n\t\t\t\t}\r\n\t\t\t\tif (dir == 2 && rx < DMAXX) {\r\n\t\t\t\t\trx++;\r\n\t\t\t\t}\r\n\t\t\t\tif (dir == 3 && rx > 0) {\r\n\t\t\t\t\trx--;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[rx][ry] == 7) {\r\n\t\t\t\t\tdircheck = 0;\r\n\t\t\t\t\tif (dir < 2) {\r\n\t\t\t\t\t\triver[2][riveramt] = (BYTE)random_(0, 2) + 17;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dir > 1) {\r\n\t\t\t\t\t\triver[2][riveramt] = (BYTE)random_(0, 2) + 15;\r\n\t\t\t\t\t}\r\n\t\t\t\t\triver[0][riveramt] = rx;\r\n\t\t\t\t\triver[1][riveramt] = ry;\r\n\t\t\t\t\triveramt++;\r\n\t\t\t\t\tif (dir == 0 && pdir == 2 || dir == 3 && pdir == 1) {\r\n\t\t\t\t\t\tif (riveramt > 2) {\r\n\t\t\t\t\t\t\triver[2][riveramt - 2] = 22;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (dir == 0) {\r\n\t\t\t\t\t\t\tnodir2 = 1;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnodir2 = 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dir == 0 && pdir == 3 || dir == 2 && pdir == 1) {\r\n\t\t\t\t\t\tif (riveramt > 2) {\r\n\t\t\t\t\t\t\triver[2][riveramt - 2] = 21;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (dir == 0) {\r\n\t\t\t\t\t\t\tnodir2 = 1;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnodir2 = 3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dir == 1 && pdir == 2 || dir == 3 && pdir == 0) {\r\n\t\t\t\t\t\tif (riveramt > 2) {\r\n\t\t\t\t\t\t\triver[2][riveramt - 2] = 20;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (dir == 1) {\r\n\t\t\t\t\t\t\tnodir2 = 0;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnodir2 = 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dir == 1 && pdir == 3 || dir == 2 && pdir == 0) {\r\n\t\t\t\t\t\tif (riveramt > 2) {\r\n\t\t\t\t\t\t\triver[2][riveramt - 2] = 19;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (dir == 1) {\r\n\t\t\t\t\t\t\tnodir2 = 0;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tnodir2 = 3;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpdir = dir;\r\n\t\t\t\t} else {\r\n\t\t\t\t\trx = px;\r\n\t\t\t\t\try = py;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// BUGFIX: Check `ry >= 2`\r\n\t\t\tif (dir == 0 && dungeon[rx][ry - 1] == 10 && dungeon[rx][ry - 2] == 8) {\r\n\t\t\t\triver[0][riveramt] = rx;\r\n\t\t\t\triver[1][riveramt] = ry - 1;\r\n\t\t\t\triver[2][riveramt] = 24;\r\n\t\t\t\tif (pdir == 2) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 22;\r\n\t\t\t\t}\r\n\t\t\t\tif (pdir == 3) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 21;\r\n\t\t\t\t}\r\n\t\t\t\tbail = TRUE;\r\n\t\t\t}\r\n\t\t\t// BUGFIX: Check `ry + 2 < DMAXY`\r\n\t\t\tif (dir == 1 && dungeon[rx][ry + 1] == 2 && dungeon[rx][ry + 2] == 8) {\r\n\t\t\t\triver[0][riveramt] = rx;\r\n\t\t\t\triver[1][riveramt] = ry + 1;\r\n\t\t\t\triver[2][riveramt] = 42;\r\n\t\t\t\tif (pdir == 2) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 20;\r\n\t\t\t\t}\r\n\t\t\t\tif (pdir == 3) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 19;\r\n\t\t\t\t}\r\n\t\t\t\tbail = TRUE;\r\n\t\t\t}\r\n\t\t\t// BUGFIX: Check `rx + 2 < DMAXX`\r\n\t\t\tif (dir == 2 && dungeon[rx + 1][ry] == 4 && dungeon[rx + 2][ry] == 8) {\r\n\t\t\t\triver[0][riveramt] = rx + 1;\r\n\t\t\t\triver[1][riveramt] = ry;\r\n\t\t\t\triver[2][riveramt] = 43;\r\n\t\t\t\tif (pdir == 0) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 19;\r\n\t\t\t\t}\r\n\t\t\t\tif (pdir == 1) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 21;\r\n\t\t\t\t}\r\n\t\t\t\tbail = TRUE;\r\n\t\t\t}\r\n\t\t\t// BUGFIX: Check `rx >= 2`\r\n\t\t\tif (dir == 3 && dungeon[rx - 1][ry] == 9 && dungeon[rx - 2][ry] == 8) {\r\n\t\t\t\triver[0][riveramt] = rx - 1;\r\n\t\t\t\triver[1][riveramt] = ry;\r\n\t\t\t\triver[2][riveramt] = 23;\r\n\t\t\t\tif (pdir == 0) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 20;\r\n\t\t\t\t}\r\n\t\t\t\tif (pdir == 1) {\r\n\t\t\t\t\triver[2][riveramt - 1] = 22;\r\n\t\t\t\t}\r\n\t\t\t\tbail = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (bail == TRUE && riveramt < 7) {\r\n\t\t\tbail = FALSE;\r\n\t\t}\r\n\t\tif (bail == TRUE) {\r\n\t\t\tfound = 0;\r\n\t\t\tlpcnt = 0;\r\n\t\t\twhile (found == 0 && lpcnt < 30) {\r\n\t\t\t\tlpcnt++;\r\n\t\t\t\tbridge = random_(0, riveramt);\r\n\t\t\t\tif ((river[2][bridge] == 15 || river[2][bridge] == 16)\r\n\t\t\t\t    && dungeon[river[0][bridge]][river[1][bridge] - 1] == 7\r\n\t\t\t\t    && dungeon[river[0][bridge]][river[1][bridge] + 1] == 7) {\r\n\t\t\t\t\tfound = 1;\r\n\t\t\t\t}\r\n\t\t\t\tif ((river[2][bridge] == 17 || river[2][bridge] == 18)\r\n\t\t\t\t    && dungeon[river[0][bridge] - 1][river[1][bridge]] == 7\r\n\t\t\t\t    && dungeon[river[0][bridge] + 1][river[1][bridge]] == 7) {\r\n\t\t\t\t\tfound = 2;\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 0; i < riveramt && found != 0; i++) {\r\n\t\t\t\t\tif (found == 1\r\n\t\t\t\t\t    && (river[1][bridge] - 1 == river[1][i] || river[1][bridge] + 1 == river[1][i])\r\n\t\t\t\t\t    && river[0][bridge] == river[0][i]) {\r\n\t\t\t\t\t\tfound = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (found == 2\r\n\t\t\t\t\t    && (river[0][bridge] - 1 == river[0][i] || river[0][bridge] + 1 == river[0][i])\r\n\t\t\t\t\t    && river[1][bridge] == river[1][i]) {\r\n\t\t\t\t\t\tfound = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (found != 0) {\r\n\t\t\t\tif (found == 1) {\r\n\t\t\t\t\triver[2][bridge] = 44;\r\n\t\t\t\t} else {\r\n\t\t\t\t\triver[2][bridge] = 45;\r\n\t\t\t\t}\r\n\t\t\t\trivercnt++;\r\n\t\t\t\tfor (bridge = 0; bridge <= riveramt; bridge++) {\r\n\t\t\t\t\tdungeon[river[0][bridge]][river[1][bridge]] = river[2][bridge];\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tbail = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL DRLG_L3Spawn(int x, int y, int *totarea);\r\n\r\nstatic BOOL DRLG_L3SpawnEdge(int x, int y, int *totarea)\r\n{\r\n\tBYTE i;\r\n\tstatic BYTE spawntable[15] = { 0x00, 0x0A, 0x43, 0x05, 0x2c, 0x06, 0x09, 0x00, 0x00, 0x1c, 0x83, 0x06, 0x09, 0x0A, 0x05 };\r\n\r\n\tif (*totarea > 40) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (x < 0 || y < 0 || x >= DMAXX || y >= DMAXY) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (dungeon[x][y] & 0x80) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (dungeon[x][y] > 15) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\ti = dungeon[x][y];\r\n\tdungeon[x][y] |= 0x80;\r\n\t*totarea += 1;\r\n\r\n\tif (spawntable[i] & 8 && DRLG_L3SpawnEdge(x, y - 1, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (spawntable[i] & 4 && DRLG_L3SpawnEdge(x, y + 1, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (spawntable[i] & 2 && DRLG_L3SpawnEdge(x + 1, y, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (spawntable[i] & 1 && DRLG_L3SpawnEdge(x - 1, y, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (spawntable[i] & 0x80 && DRLG_L3Spawn(x, y - 1, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (spawntable[i] & 0x40 && DRLG_L3Spawn(x, y + 1, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (spawntable[i] & 0x20 && DRLG_L3Spawn(x + 1, y, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (spawntable[i] & 0x10 && DRLG_L3Spawn(x - 1, y, totarea) == TRUE) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic BOOL DRLG_L3Spawn(int x, int y, int *totarea)\r\n{\r\n\tBYTE i;\r\n\tstatic BYTE spawntable[15] = { 0x00, 0x0A, 0x03, 0x05, 0x0C, 0x06, 0x09, 0x00, 0x00, 0x0C, 0x03, 0x06, 0x09, 0x0A, 0x05 };\r\n\r\n\tif (*totarea > 40) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (x < 0 || y < 0 || x >= DMAXX || y >= DMAXY) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (dungeon[x][y] & 0x80) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (dungeon[x][y] > 15) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\ti = dungeon[x][y];\r\n\tdungeon[x][y] |= 0x80;\r\n\t*totarea += 1;\r\n\r\n\tif (i != 8) {\r\n\t\tif (spawntable[i] & 8 && DRLG_L3SpawnEdge(x, y - 1, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (spawntable[i] & 4 && DRLG_L3SpawnEdge(x, y + 1, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (spawntable[i] & 2 && DRLG_L3SpawnEdge(x + 1, y, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (spawntable[i] & 1 && DRLG_L3SpawnEdge(x - 1, y, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t} else {\r\n\t\tif (DRLG_L3Spawn(x + 1, y, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (DRLG_L3Spawn(x - 1, y, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (DRLG_L3Spawn(x, y + 1, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (DRLG_L3Spawn(x, y - 1, totarea) == TRUE) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\n/**\r\n * Flood fills dirt and wall tiles looking for\r\n * an area of at most 40 tiles and disconnected from the map edge.\r\n * If it finds one, converts it to lava tiles and sets lavapool to TRUE.\r\n */\r\nstatic void DRLG_L3Pool()\r\n{\r\n\tint i, j, dunx, duny, totarea, poolchance;\r\n\tBOOL found;\r\n\tBYTE k;\r\n\tstatic BYTE poolsub[15] = { 0, 35, 26, 36, 25, 29, 34, 7, 33, 28, 27, 37, 32, 31, 30 };\r\n\r\n\tfor (duny = 0; duny < DMAXY; duny++) {\r\n\t\tfor (dunx = 0; dunx < DMAXY; dunx++) {\r\n\t\t\tif (dungeon[dunx][duny] != 8) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tdungeon[dunx][duny] |= 0x80;\r\n\t\t\ttotarea = 1;\r\n\t\t\tif (dunx + 1 < DMAXX) {\r\n\t\t\t\tfound = DRLG_L3Spawn(dunx + 1, duny, &totarea);\r\n\t\t\t} else {\r\n\t\t\t\tfound = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dunx - 1 > 0 && !found) {\r\n\t\t\t\tfound = DRLG_L3Spawn(dunx - 1, duny, &totarea);\r\n\t\t\t} else {\r\n\t\t\t\tfound = TRUE;\r\n\t\t\t}\r\n\t\t\tif (duny + 1 < DMAXY && !found) {\r\n\t\t\t\tfound = DRLG_L3Spawn(dunx, duny + 1, &totarea);\r\n\t\t\t} else {\r\n\t\t\t\tfound = TRUE;\r\n\t\t\t}\r\n\t\t\tif (duny - 1 > 0 && !found) {\r\n\t\t\t\tfound = DRLG_L3Spawn(dunx, duny - 1, &totarea);\r\n\t\t\t} else {\r\n\t\t\t\tfound = TRUE;\r\n\t\t\t}\r\n\t\t\tpoolchance = random_(0, 100);\r\n\t\t\tfor (j = duny - totarea; j < duny + totarea; j++) {\r\n\t\t\t\tfor (i = dunx - totarea; i < dunx + totarea; i++) {\r\n\t\t\t\t\t// BUGFIX: In the following swap the order to first do the\r\n\t\t\t\t\t// index checks and only then access dungeon[i][j]\r\n\t\t\t\t\tif (dungeon[i][j] & 0x80 && j >= 0 && j < DMAXY && i >= 0 && i < DMAXX) {\r\n\t\t\t\t\t\tdungeon[i][j] &= ~0x80;\r\n\t\t\t\t\t\tif (totarea > 4 && poolchance < 25 && !found) {\r\n\t\t\t\t\t\t\tk = poolsub[dungeon[i][j]];\r\n\t\t\t\t\t\t\tif (k != 0 && k <= 37) {\r\n\t\t\t\t\t\t\t\tdungeon[i][j] = k;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlavapool = TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3PoolFix()\r\n{\r\n\tint dunx, duny;\r\n\r\n\tfor (duny = 0; duny < DMAXY; duny++) {     // BUGFIX: Change '0' to '1' and 'DMAXY' to 'DMAXY - 1'\r\n\t\tfor (dunx = 0; dunx < DMAXX; dunx++) { // BUGFIX: Change '0' to '1' and 'DMAXX' to 'DMAXX - 1'\r\n\t\t\tif (dungeon[dunx][duny] == 8) {\r\n\t\t\t\tif (dungeon[dunx - 1][duny - 1] >= 25 && dungeon[dunx - 1][duny - 1] <= 41\r\n\t\t\t\t    && dungeon[dunx - 1][duny] >= 25 && dungeon[dunx - 1][duny] <= 41\r\n\t\t\t\t    && dungeon[dunx - 1][duny + 1] >= 25 && dungeon[dunx - 1][duny + 1] <= 41\r\n\t\t\t\t    && dungeon[dunx][duny - 1] >= 25 && dungeon[dunx][duny - 1] <= 41\r\n\t\t\t\t    && dungeon[dunx][duny + 1] >= 25 && dungeon[dunx][duny + 1] <= 41\r\n\t\t\t\t    && dungeon[dunx + 1][duny - 1] >= 25 && dungeon[dunx + 1][duny - 1] <= 41\r\n\t\t\t\t    && dungeon[dunx + 1][duny] >= 25 && dungeon[dunx + 1][duny] <= 41\r\n\t\t\t\t    && dungeon[dunx + 1][duny + 1] >= 25 && dungeon[dunx + 1][duny + 1] <= 41) {\r\n\t\t\t\t\tdungeon[dunx][duny] = 33;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL DRLG_L3PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, i, ii, numt, trys;\r\n\tBOOL found;\r\n\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tif (tmax - tmin == 0) {\r\n\t\tnumt = 1;\r\n\t} else {\r\n\t\tnumt = random_(0, tmax - tmin) + tmin;\r\n\t}\r\n\r\n\tfor (i = 0; i < numt; i++) {\r\n\t\tsx = random_(0, DMAXX - sw);\r\n\t\tsy = random_(0, DMAXY - sh);\r\n\t\tfound = FALSE;\r\n\t\ttrys = 0;\r\n\t\twhile (!found && trys < 200) {\r\n\t\t\ttrys++;\r\n\t\t\tfound = TRUE;\r\n\t\t\tif (cx != -1 && sx >= cx - sw && sx <= cx + 12) {\r\n\t\t\t\tsx = random_(0, DMAXX - sw);\r\n\t\t\t\tsy = random_(0, DMAXY - sh);\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tif (cy != -1 && sy >= cy - sh && sy <= cy + 12) {\r\n\t\t\t\tsx = random_(0, DMAXX - sw);\r\n\t\t\t\tsy = random_(0, DMAXY - sh);\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tii = 2;\r\n\t\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!found) {\r\n\t\t\t\tsx++;\r\n\t\t\t\tif (sx == DMAXX - sw) {\r\n\t\t\t\t\tsx = 0;\r\n\t\t\t\t\tsy++;\r\n\t\t\t\t\tif (sy == DMAXY - sh) {\r\n\t\t\t\t\t\tsy = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (trys >= 200) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tii = sw * sh + 2;\r\n\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\tif (miniset[ii] != 0) {\r\n\t\t\t\t\tdungeon[xx + sx][yy + sy] = miniset[ii];\r\n\t\t\t\t}\r\n\t\t\t\tii++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (setview == TRUE) {\r\n\t\tViewX = 2 * sx + 17;\r\n\t\tViewY = 2 * sy + 19;\r\n\t}\r\n\tif (ldir == 0) {\r\n\t\tLvlViewX = 2 * sx + 17;\r\n\t\tLvlViewY = 2 * sy + 19;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic void DRLG_L3PlaceRndSet(const BYTE *miniset, int rndper)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, ii, kk;\r\n\tBOOL found;\r\n\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tfor (sy = 0; sy < DMAXX - sh; sy++) {\r\n\t\tfor (sx = 0; sx < DMAXY - sw; sx++) {\r\n\t\t\tfound = TRUE;\r\n\t\t\tii = 2;\r\n\t\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tkk = sw * sh + 2;\r\n\t\t\t// BUGFIX: This should not be applied to Nest levels\r\n\t\t\tif (miniset[kk] >= 84 && miniset[kk] <= 100 && found == TRUE) {\r\n\t\t\t\t// BUGFIX: accesses to dungeon can go out of bounds\r\n\t\t\t\t// BUGFIX: Comparisons vs 100 should use same tile as comparisons vs 84.\r\n\t\t\t\tif (dungeon[sx - 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx + 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx][sy + 1] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx][sy - 1] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (found == TRUE && random_(0, 100) < rndper) {\r\n\t\t\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\t\t\tif (miniset[kk] != 0) {\r\n\t\t\t\t\t\t\tdungeon[xx + sx][yy + sy] = miniset[kk];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tkk++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nBOOLEAN drlg_l3_hive_rnd_piece(const BYTE *miniset, int rndper)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, ii, kk;\r\n\tBOOL found;\r\n\tBOOLEAN placed;\r\n\r\n\tplaced = FALSE;\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tfor (sy = 0; sy < DMAXX - sh; sy++) {\r\n\t\tfor (sx = 0; sx < DMAXY - sw; sx++) {\r\n\t\t\tfound = TRUE;\r\n\t\t\tii = 2;\r\n\t\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tkk = sw * sh + 2;\r\n\t\t\tif (miniset[kk] >= 84 && miniset[kk] <= 100 && found == TRUE) {\r\n\t\t\t\t// BUGFIX: accesses to dungeon can go out of bounds\r\n\t\t\t\t// BUGFIX: Comparisons vs 100 should use same tile as comparisons vs 84.\r\n\t\t\t\tif (dungeon[sx - 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx + 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx][sy + 1] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[sx][sy - 1] >= 84 && dungeon[sx - 1][sy] <= 100) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (found == TRUE && random_(0, 100) < rndper) {\r\n\t\t\t\tplaced = TRUE;\r\n\t\t\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\t\t\tif (miniset[kk] != 0) {\r\n\t\t\t\t\t\t\tdungeon[xx + sx][yy + sy] = miniset[kk];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tkk++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn placed;\r\n}\r\n#endif\r\n\r\nstatic BOOL WoodVertU(int i, int y)\r\n{\r\n\tif ((dungeon[i + 1][y] > 152 || dungeon[i + 1][y] < 130)\r\n\t    && (dungeon[i - 1][y] > 152 || dungeon[i - 1][y] < 130)) {\r\n\t\tif (dungeon[i][y] == 7) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 10) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 126) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 129) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 134) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 136) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic BOOL WoodVertD(int i, int y)\r\n{\r\n\tif ((dungeon[i + 1][y] > 152 || dungeon[i + 1][y] < 130)\r\n\t    && (dungeon[i - 1][y] > 152 || dungeon[i - 1][y] < 130)) {\r\n\t\tif (dungeon[i][y] == 7) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 2) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 134) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[i][y] == 136) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic BOOL WoodHorizL(int x, int j)\r\n{\r\n\tif ((dungeon[x][j + 1] > 152 || dungeon[x][j + 1] < 130)\r\n\t    && (dungeon[x][j - 1] > 152 || dungeon[x][j - 1] < 130)) {\r\n\t\tif (dungeon[x][j] == 7) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 9) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 121) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 124) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 135) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 137) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic BOOL WoodHorizR(int x, int j)\r\n{\r\n\tif ((dungeon[x][j + 1] > 152 || dungeon[x][j + 1] < 130)\r\n\t    && (dungeon[x][j - 1] > 152 || dungeon[x][j - 1] < 130)) {\r\n\t\tif (dungeon[x][j] == 7) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 4) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 135) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (dungeon[x][j] == 137) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid AddFenceDoors()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 7) {\r\n\t\t\t\tif (dungeon[i - 1][j] <= 152 && dungeon[i - 1][j] >= 130\r\n\t\t\t\t    && dungeon[i + 1][j] <= 152 && dungeon[i + 1][j] >= 130) {\r\n\t\t\t\t\tdungeon[i][j] = 146;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 7) {\r\n\t\t\t\tif (dungeon[i][j - 1] <= 152 && dungeon[i][j - 1] >= 130\r\n\t\t\t\t    && dungeon[i][j + 1] <= 152 && dungeon[i][j + 1] >= 130) {\r\n\t\t\t\t\tdungeon[i][j] = 147;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid FenceDoorFix()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 146) {\r\n\t\t\t\tif (dungeon[i + 1][j] > 152 || dungeon[i + 1][j] < 130\r\n\t\t\t\t    || dungeon[i - 1][j] > 152 || dungeon[i - 1][j] < 130) {\r\n\t\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 146) {\r\n\t\t\t\tif (dungeon[i + 1][j] != 130 && dungeon[i - 1][j] != 130\r\n\t\t\t\t    && dungeon[i + 1][j] != 132 && dungeon[i - 1][j] != 132\r\n\t\t\t\t    && dungeon[i + 1][j] != 133 && dungeon[i - 1][j] != 133\r\n\t\t\t\t    && dungeon[i + 1][j] != 134 && dungeon[i - 1][j] != 134\r\n\t\t\t\t    && dungeon[i + 1][j] != 136 && dungeon[i - 1][j] != 136\r\n\t\t\t\t    && dungeon[i + 1][j] != 138 && dungeon[i - 1][j] != 138\r\n\t\t\t\t    && dungeon[i + 1][j] != 140 && dungeon[i - 1][j] != 140) {\r\n\t\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 147) {\r\n\t\t\t\tif (dungeon[i][j + 1] > 152 || dungeon[i][j + 1] < 130\r\n\t\t\t\t    || dungeon[i][j - 1] > 152 || dungeon[i][j - 1] < 130) {\r\n\t\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 147) {\r\n\t\t\t\tif (dungeon[i][j + 1] != 131 && dungeon[i][j - 1] != 131\r\n\t\t\t\t    && dungeon[i][j + 1] != 132 && dungeon[i][j - 1] != 132\r\n\t\t\t\t    && dungeon[i][j + 1] != 133 && dungeon[i][j - 1] != 133\r\n\t\t\t\t    && dungeon[i][j + 1] != 135 && dungeon[i][j - 1] != 135\r\n\t\t\t\t    && dungeon[i][j + 1] != 137 && dungeon[i][j - 1] != 137\r\n\t\t\t\t    && dungeon[i][j + 1] != 138 && dungeon[i][j - 1] != 138\r\n\t\t\t\t    && dungeon[i][j + 1] != 139 && dungeon[i][j - 1] != 139) {\r\n\t\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L3Wood()\r\n{\r\n\tint i, j, x, y, xx, yy, rt, rp, x1, y1, x2, y2;\r\n\tBOOL skip;\r\n\r\n\tfor (j = 0; j < DMAXY - 1; j++) {     // BUGFIX: Change '0' to '1'\r\n\t\tfor (i = 0; i < DMAXX - 1; i++) { // BUGFIX: Change '0' to '1'\r\n\t\t\tif (dungeon[i][j] == 10 && random_(0, 2) != 0) {\r\n\t\t\t\tx = i;\r\n\t\t\t\twhile (dungeon[x][j] == 10) {\r\n\t\t\t\t\tx++;\r\n\t\t\t\t}\r\n\t\t\t\tx--;\r\n\t\t\t\tif (x - i > 0) {\r\n\t\t\t\t\tdungeon[i][j] = 127;\r\n\t\t\t\t\tfor (xx = i + 1; xx < x; xx++) {\r\n\t\t\t\t\t\tif (random_(0, 2) != 0) {\r\n\t\t\t\t\t\t\tdungeon[xx][j] = 126;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdungeon[xx][j] = 129;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdungeon[x][j] = 128;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 9 && random_(0, 2) != 0) {\r\n\t\t\t\ty = j;\r\n\t\t\t\twhile (dungeon[i][y] == 9) {\r\n\t\t\t\t\ty++;\r\n\t\t\t\t}\r\n\t\t\t\ty--;\r\n\t\t\t\tif (y - j > 0) {\r\n\t\t\t\t\tdungeon[i][j] = 123;\r\n\t\t\t\t\tfor (yy = j + 1; yy < y; yy++) {\r\n\t\t\t\t\t\tif (random_(0, 2) != 0) {\r\n\t\t\t\t\t\t\tdungeon[i][yy] = 121;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdungeon[i][yy] = 124;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdungeon[i][y] = 122;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i + 1][j] == 10 && dungeon[i][j + 1] == 9 && random_(0, 2) != 0) {\r\n\t\t\t\tdungeon[i][j] = 125;\r\n\t\t\t\tx = i + 1;\r\n\t\t\t\twhile (dungeon[x][j] == 10) {\r\n\t\t\t\t\tx++;\r\n\t\t\t\t}\r\n\t\t\t\tx--;\r\n\t\t\t\tfor (xx = i + 1; xx < x; xx++) {\r\n\t\t\t\t\tif (random_(0, 2) != 0) {\r\n\t\t\t\t\t\tdungeon[xx][j] = 126;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdungeon[xx][j] = 129;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdungeon[x][j] = 128;\r\n\t\t\t\ty = j + 1;\r\n\t\t\t\twhile (dungeon[i][y] == 9) {\r\n\t\t\t\t\ty++;\r\n\t\t\t\t}\r\n\t\t\t\ty--;\r\n\t\t\t\tfor (yy = j + 1; yy < y; yy++) {\r\n\t\t\t\t\tif (random_(0, 2) != 0) {\r\n\t\t\t\t\t\tdungeon[i][yy] = 121;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdungeon[i][yy] = 124;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdungeon[i][y] = 122;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {     // BUGFIX: Change '0' to '1'\r\n\t\tfor (i = 0; i < DMAXX; i++) { // BUGFIX: Change '0' to '1'\r\n\t\t\tif (dungeon[i][j] == 7 && random_(0, 1) == 0 && SkipThemeRoom(i, j)) {\r\n\t\t\t\trt = random_(0, 2);\r\n\t\t\t\tif (rt == 0) {\r\n\t\t\t\t\ty1 = j;\r\n\t\t\t\t\t// BUGFIX: Check `y1 >= 0` first\r\n\t\t\t\t\twhile (WoodVertU(i, y1)) {\r\n\t\t\t\t\t\ty1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ty1++;\r\n\t\t\t\t\ty2 = j;\r\n\t\t\t\t\t// BUGFIX: Check `y2 < DMAXY` first\r\n\t\t\t\t\twhile (WoodVertD(i, y2)) {\r\n\t\t\t\t\t\ty2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ty2--;\r\n\t\t\t\t\tskip = TRUE;\r\n\t\t\t\t\tif (dungeon[i][y1] == 7) {\r\n\t\t\t\t\t\tskip = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dungeon[i][y2] == 7) {\r\n\t\t\t\t\t\tskip = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (y2 - y1 > 1 && skip) {\r\n\t\t\t\t\t\trp = random_(0, y2 - y1 - 1) + y1 + 1;\r\n\t\t\t\t\t\tfor (y = y1; y <= y2; y++) {\r\n\t\t\t\t\t\t\tif (y == rp) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[i][y] == 7) {\r\n\t\t\t\t\t\t\t\tif (random_(0, 2) != 0) {\r\n\t\t\t\t\t\t\t\t\tdungeon[i][y] = 135;\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tdungeon[i][y] = 137;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[i][y] == 10) {\r\n\t\t\t\t\t\t\t\tdungeon[i][y] = 131;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[i][y] == 126) {\r\n\t\t\t\t\t\t\t\tdungeon[i][y] = 133;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[i][y] == 129) {\r\n\t\t\t\t\t\t\t\tdungeon[i][y] = 133;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[i][y] == 2) {\r\n\t\t\t\t\t\t\t\tdungeon[i][y] = 139;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[i][y] == 134) {\r\n\t\t\t\t\t\t\t\tdungeon[i][y] = 138;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[i][y] == 136) {\r\n\t\t\t\t\t\t\t\tdungeon[i][y] = 138;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (rt == 1) {\r\n\t\t\t\t\tx1 = i;\r\n\t\t\t\t\t// BUGFIX: Check `x1 >= 0` first (fixed)\r\n\t\t\t\t\twhile (WoodHorizL(x1, j)) {\r\n\t\t\t\t\t\tx1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tx1++;\r\n\t\t\t\t\tx2 = i;\r\n\t\t\t\t\t// BUGFIX: Check `x2 < DMAXX` first (fixed)\r\n\t\t\t\t\twhile (WoodHorizR(x2, j)) {\r\n\t\t\t\t\t\tx2++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tx2--;\r\n\t\t\t\t\tskip = TRUE;\r\n\t\t\t\t\tif (dungeon[x1][j] == 7) {\r\n\t\t\t\t\t\tskip = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dungeon[x2][j] == 7) {\r\n\t\t\t\t\t\tskip = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x2 - x1 > 1 && skip) {\r\n\t\t\t\t\t\trp = random_(0, x2 - x1 - 1) + x1 + 1;\r\n\t\t\t\t\t\tfor (x = x1; x <= x2; x++) {\r\n\t\t\t\t\t\t\tif (x == rp) {\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[x][j] == 7) {\r\n\t\t\t\t\t\t\t\tif (random_(0, 2) != 0) {\r\n\t\t\t\t\t\t\t\t\tdungeon[x][j] = 134;\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tdungeon[x][j] = 136;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[x][j] == 9) {\r\n\t\t\t\t\t\t\t\tdungeon[x][j] = 130;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[x][j] == 121) {\r\n\t\t\t\t\t\t\t\tdungeon[x][j] = 132;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[x][j] == 124) {\r\n\t\t\t\t\t\t\t\tdungeon[x][j] = 132;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[x][j] == 4) {\r\n\t\t\t\t\t\t\t\tdungeon[x][j] = 140;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[x][j] == 135) {\r\n\t\t\t\t\t\t\t\tdungeon[x][j] = 138;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (dungeon[x][j] == 137) {\r\n\t\t\t\t\t\t\t\tdungeon[x][j] = 138;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tAddFenceDoors();\r\n\tFenceDoorFix();\r\n}\r\n\r\nBOOL DRLG_L3Anvil()\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, ii, trys;\r\n\tBOOL found;\r\n\r\n\tsw = L3ANVIL[0];\r\n\tsh = L3ANVIL[1];\r\n\tsx = random_(0, DMAXX - sw);\r\n\tsy = random_(0, DMAXY - sh);\r\n\r\n\tfound = FALSE;\r\n\ttrys = 0;\r\n\twhile (!found && trys < 200) {\r\n\t\ttrys++;\r\n\t\tfound = TRUE;\r\n\t\tii = 2;\r\n\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\tif (L3ANVIL[ii] != 0 && dungeon[xx + sx][yy + sy] != L3ANVIL[ii]) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tii++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!found) {\r\n\t\t\tsx++;\r\n\t\t\tif (sx == DMAXX - sw) {\r\n\t\t\t\tsx = 0;\r\n\t\t\t\tsy++;\r\n\t\t\t\tif (sy == DMAXY - sh) {\r\n\t\t\t\t\tsy = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (trys >= 200) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tii = sw * sh + 2;\r\n\tfor (yy = 0; yy < sh; yy++) {\r\n\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\tif (L3ANVIL[ii] != 0) {\r\n\t\t\t\tdungeon[xx + sx][yy + sy] = L3ANVIL[ii];\r\n\t\t\t}\r\n\t\t\tdflags[xx + sx][yy + sy] |= DLRG_PROTECTED;\r\n\t\t\tii++;\r\n\t\t}\r\n\t}\r\n\r\n\tsetpc_x = sx;\r\n\tsetpc_y = sy;\r\n\tsetpc_w = sw;\r\n\tsetpc_h = sh;\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid FixL3Warp()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 125 && dungeon[i + 1][j] == 125 && dungeon[i][j + 1] == 125 && dungeon[i + 1][j + 1] == 125) {\r\n\t\t\t\tdungeon[i][j] = 156;\r\n\t\t\t\tdungeon[i + 1][j] = 155;\r\n\t\t\t\tdungeon[i][j + 1] = 153;\r\n\t\t\t\tdungeon[i + 1][j + 1] = 154;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 7) {\r\n\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid FixL3HallofHeroes()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 7) {\r\n\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 12 && dungeon[i + 1][j] == 7) {\r\n\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t\tdungeon[i][j + 1] = 7;\r\n\t\t\t\tdungeon[i + 1][j + 1] = 7;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 5 && dungeon[i + 1][j + 1] == 12 && dungeon[i][j + 1] == 7) {\r\n\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t\tdungeon[i + 1][j] = 7;\r\n\t\t\t\tdungeon[i + 1][j + 1] = 7;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DRLG_L3LockRec(int x, int y)\r\n{\r\n\tif (!lockout[x][y]) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlockout[x][y] = FALSE;\r\n\tlockoutcnt++;\r\n\tDRLG_L3LockRec(x, y - 1);\r\n\tDRLG_L3LockRec(x, y + 1);\r\n\tDRLG_L3LockRec(x - 1, y);\r\n\tDRLG_L3LockRec(x + 1, y);\r\n}\r\n\r\nBOOL DRLG_L3Lockout()\r\n{\r\n\tint i, j, t, fx, fy;\r\n\r\n\tt = 0;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] != 0) {\r\n\t\t\t\tlockout[i][j] = TRUE;\r\n\t\t\t\tfx = i;\r\n\t\t\t\tfy = j;\r\n\t\t\t\tt++;\r\n\t\t\t} else {\r\n\t\t\t\tlockout[i][j] = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlockoutcnt = 0;\r\n\tDRLG_L3LockRec(fx, fy);\r\n\r\n\treturn t == lockoutcnt;\r\n}\r\n\r\nstatic void DRLG_L3(int entry)\r\n{\r\n\tint x1, y1, x2, y2, i, j;\r\n\tBOOL found, genok;\r\n\r\n\tlavapool = FALSE;\r\n\r\n\tdo {\r\n\t\tdo {\r\n\t\t\tdo {\r\n\t\t\t\tInitL3Dungeon();\r\n\t\t\t\tx1 = random_(0, 20) + 10;\r\n\t\t\t\ty1 = random_(0, 20) + 10;\r\n\t\t\t\tx2 = x1 + 2;\r\n\t\t\t\ty2 = y1 + 2;\r\n\t\t\t\tDRLG_L3FillRoom(x1, y1, x2, y2);\r\n\t\t\t\tDRLG_L3CreateBlock(x1, y1, 2, 0);\r\n\t\t\t\tDRLG_L3CreateBlock(x2, y1, 2, 1);\r\n\t\t\t\tDRLG_L3CreateBlock(x1, y2, 2, 2);\r\n\t\t\t\tDRLG_L3CreateBlock(x1, y1, 2, 3);\r\n\t\t\t\tif (QuestStatus(Q_ANVIL)) {\r\n\t\t\t\t\tx1 = random_(0, 10) + 10;\r\n\t\t\t\t\ty1 = random_(0, 10) + 10;\r\n\t\t\t\t\tx2 = x1 + 12;\r\n\t\t\t\t\ty2 = y1 + 12;\r\n\t\t\t\t\tDRLG_L3FloorArea(x1, y1, x2, y2);\r\n\t\t\t\t}\r\n\t\t\t\tDRLG_L3FillDiags();\r\n\t\t\t\tDRLG_L3FillSingles();\r\n\t\t\t\tDRLG_L3FillStraights();\r\n\t\t\t\tDRLG_L3FillDiags();\r\n\t\t\t\tDRLG_L3Edges();\r\n\t\t\t\tif (DRLG_L3GetFloorArea() >= 600) {\r\n\t\t\t\t\tfound = DRLG_L3Lockout();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t} while (!found);\r\n\t\t\tDRLG_L3MakeMegas();\r\n\t\t\tif (entry == ENTRY_MAIN) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3UP, 1, 1, -1, -1, TRUE, 0);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (currlevel != 17)\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6UP, 1, 1, -1, -1, TRUE, 0);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6HOLDWARP, 1, 1, -1, -1, TRUE, 6);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tif (!genok) {\r\n#ifdef HELLFIRE\r\n\t\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3DOWN, 1, 1, -1, -1, FALSE, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (currlevel != 20)\r\n\t\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6DOWN, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\t\t}\r\n#endif\r\n\t\t\t\t\tif (!genok && currlevel == 9) {\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3HOLDWARP, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (entry == ENTRY_PREV) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3UP, 1, 1, -1, -1, FALSE, 0);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (currlevel != 17)\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6UP, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6HOLDWARP, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tif (!genok) {\r\n#ifdef HELLFIRE\r\n\t\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3DOWN, 1, 1, -1, -1, TRUE, 1);\r\n\t\t\t\t\t\tViewX += 2;\r\n\t\t\t\t\t\tViewY -= 2;\r\n#ifdef HELLFIRE\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (currlevel != 20) {\r\n\t\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6DOWN, 1, 1, -1, -1, TRUE, 1);\r\n\t\t\t\t\t\t\tViewX += 2;\r\n\t\t\t\t\t\t\tViewY -= 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n#endif\r\n\t\t\t\t\tif (!genok && currlevel == 9) {\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3HOLDWARP, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3UP, 1, 1, -1, -1, FALSE, 0);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (currlevel != 17)\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6UP, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6HOLDWARP, 1, 1, -1, -1, TRUE, 6);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tif (!genok) {\r\n#ifdef HELLFIRE\r\n\t\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3DOWN, 1, 1, -1, -1, FALSE, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (currlevel != 20)\r\n\t\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L6DOWN, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\t\t}\r\n#endif\r\n\t\t\t\t\tif (!genok && currlevel == 9) {\r\n\t\t\t\t\t\tgenok = DRLG_L3PlaceMiniSet(L3HOLDWARP, 1, 1, -1, -1, TRUE, 6);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!genok && QuestStatus(Q_ANVIL)) {\r\n\t\t\t\tgenok = DRLG_L3Anvil();\r\n\t\t\t}\r\n\t\t} while (genok == TRUE);\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\tDRLG_L3Pool();\r\n#ifdef HELLFIRE\r\n\t\t} else {\r\n\t\t\tlavapool += drlg_l3_hive_rnd_piece(byte_48A998, 30);\r\n\t\t\tlavapool += drlg_l3_hive_rnd_piece(byte_48A9C8, 40);\r\n\t\t\tlavapool += drlg_l3_hive_rnd_piece(byte_48A948, 50);\r\n\t\t\tlavapool += drlg_l3_hive_rnd_piece(byte_48A970, 60);\r\n\t\t\tif (lavapool < 3)\r\n\t\t\t\tlavapool = FALSE;\r\n\t\t}\r\n#endif\r\n\t} while (!lavapool);\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17)\r\n#endif\r\n\t\tDRLG_L3PoolFix();\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17)\r\n#endif\r\n\t\tFixL3Warp();\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tDRLG_L3PlaceRndSet(L3ISLE1, 70);\r\n\t\tDRLG_L3PlaceRndSet(L3ISLE2, 70);\r\n\t\tDRLG_L3PlaceRndSet(L3ISLE3, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3ISLE4, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3ISLE1, 100);\r\n\t\tDRLG_L3PlaceRndSet(L3ISLE2, 100);\r\n\t\tDRLG_L3PlaceRndSet(L3ISLE5, 90);\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tDRLG_L3PlaceRndSet(L6ISLE1, 70);\r\n\t\tDRLG_L3PlaceRndSet(L6ISLE2, 70);\r\n\t\tDRLG_L3PlaceRndSet(L6ISLE3, 30);\r\n\t\tDRLG_L3PlaceRndSet(L6ISLE4, 30);\r\n\t\tDRLG_L3PlaceRndSet(L6ISLE1, 100);\r\n\t\tDRLG_L3PlaceRndSet(L6ISLE2, 100);\r\n\t\tDRLG_L3PlaceRndSet(L6ISLE5, 90);\r\n\t}\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17)\r\n#endif\r\n\t\tFixL3HallofHeroes();\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17)\r\n#endif\r\n\t\tDRLG_L3River();\r\n\r\n\tif (QuestStatus(Q_ANVIL)) {\r\n\t\tdungeon[setpc_x + 7][setpc_y + 5] = 7;\r\n\t\tdungeon[setpc_x + 8][setpc_y + 5] = 7;\r\n\t\tdungeon[setpc_x + 9][setpc_y + 5] = 7;\r\n\t\tif (dungeon[setpc_x + 10][setpc_y + 5] == 17 || dungeon[setpc_x + 10][setpc_y + 5] == 18) {\r\n\t\t\tdungeon[setpc_x + 10][setpc_y + 5] = 45;\r\n\t\t}\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17)\r\n#endif\r\n\t\tDRLG_PlaceThemeRooms(5, 10, 7, 0, 0);\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tDRLG_L3Wood();\r\n\t\tDRLG_L3PlaceRndSet(L3TITE1, 10);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE2, 10);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE3, 10);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE6, 20);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE7, 20);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE8, 20);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE9, 20);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE10, 20);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE11, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE12, 20);\r\n\t\tDRLG_L3PlaceRndSet(L3TITE13, 20);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV1, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV2, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV3, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV4, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV5, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV6, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV7, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV8, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV9, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV10, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3CREV11, 30);\r\n\t\tDRLG_L3PlaceRndSet(L3XTRA1, 25);\r\n\t\tDRLG_L3PlaceRndSet(L3XTRA2, 25);\r\n\t\tDRLG_L3PlaceRndSet(L3XTRA3, 25);\r\n\t\tDRLG_L3PlaceRndSet(L3XTRA4, 25);\r\n\t\tDRLG_L3PlaceRndSet(L3XTRA5, 25);\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tDRLG_L3PlaceRndSet(byte_48A76C, 20);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A770, 20);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A774, 20);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A778, 20);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A808, 10);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A820, 15);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A838, 20);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A850, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A868, 30);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A880, 35);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A898, 40);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A8B0, 45);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A8C8, 50);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A8E0, 55);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A8E0, 10);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A8C8, 15);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A8B0, 20);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A898, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A880, 30);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A868, 35);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A850, 40);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A838, 45);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A820, 50);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A808, 55);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A790, 40);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7A8, 45);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A77C, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A780, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A784, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A788, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7BC, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7C0, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7C4, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7C8, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7CC, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7D4, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7D8, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7DC, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7E0, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7E4, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7EC, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7F0, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7F4, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7F8, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7D0, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7E8, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A7FC, 25);\r\n\t\tDRLG_L3PlaceRndSet(byte_48A800, 25);\r\n\t}\r\n#endif\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tpdungeon[i][j] = dungeon[i][j];\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_Init_Globals();\r\n}\r\n\r\nstatic void DRLG_L3Pass3()\r\n{\r\n\tint i, j, xx, yy;\r\n\tlong v1, v2, v3, v4, lv;\r\n\r\n\tlv = 8 - 1;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pMegaTiles\r\n\t\tmov\t\teax, lv\r\n\t\tshl\t\teax, 3\r\n\t\tadd\t\tesi, eax\r\n\t\txor\t\teax, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv1, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv2, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv3, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv4, eax\r\n\t}\r\n#else\r\n\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n#endif\r\n\r\n\tfor (j = 0; j < MAXDUNY; j += 2)\r\n\t{\r\n\t\tfor (i = 0; i < MAXDUNX; i += 2) {\r\n\t\t\tdPiece[i][j] = v1;\r\n\t\t\tdPiece[i + 1][j] = v2;\r\n\t\t\tdPiece[i][j + 1] = v3;\r\n\t\t\tdPiece[i + 1][j + 1] = v4;\r\n\t\t}\r\n\t}\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tlv = dungeon[i][j] - 1;\r\n#ifdef USE_ASM\r\n\t\t\tif (lv >= 0) {\r\n\t\t\t\t__asm {\r\n\t\t\t\t\tmov\t\tesi, pMegaTiles\r\n\t\t\t\t\tmov\t\teax, lv\r\n\t\t\t\t\tshl\t\teax, 3\r\n\t\t\t\t\tadd\t\tesi, eax\r\n\t\t\t\t\txor\t\teax, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv1, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv2, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv3, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv4, eax\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tv1 = 0;\r\n\t\t\t\tv2 = 0;\r\n\t\t\t\tv3 = 0;\r\n\t\t\t\tv4 = 0;\r\n\t\t\t}\r\n#else\r\n\t\t\tif (lv >= 0) {\r\n\t\t\t\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\t\t\t\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\t\t\t\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\t\t\t\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n\t\t\t} else {\r\n\t\t\t\tv1 = 0;\r\n\t\t\t\tv2 = 0;\r\n\t\t\t\tv3 = 0;\r\n\t\t\t\tv4 = 0;\r\n\t\t\t}\r\n#endif\r\n\t\t\tdPiece[xx][yy] = v1;\r\n\t\t\tdPiece[xx + 1][yy] = v2;\r\n\t\t\tdPiece[xx][yy + 1] = v3;\r\n\t\t\tdPiece[xx + 1][yy + 1] = v4;\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nvoid CreateL3Dungeon(DWORD rseed, int entry)\r\n{\r\n\tint i, j;\r\n\r\n\tSetRndSeed(rseed);\r\n\tdminx = 16;\r\n\tdminy = 16;\r\n\tdmaxx = 96;\r\n\tdmaxy = 96;\r\n\tDRLG_InitTrans();\r\n\tDRLG_InitSetPC();\r\n\tDRLG_L3(entry);\r\n\tDRLG_L3Pass3();\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tif (dPiece[i][j] >= 56 && dPiece[i][j] <= 147) {\r\n\t\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t\t} else if (dPiece[i][j] >= 154 && dPiece[i][j] <= 161) {\r\n\t\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t\t} else if (dPiece[i][j] == 150) {\r\n\t\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t\t} else if (dPiece[i][j] == 152) {\r\n\t\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tif (dPiece[i][j] >= 382 && dPiece[i][j] <= 457) {\r\n\t\t\t\t\tDoLighting(i, j, 9, -1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tDRLG_SetPC();\r\n}\r\n\r\nvoid LoadL3Dungeon(const char *sFileName, int vx, int vy)\r\n{\r\n\tint i, j, rw, rh;\r\n\tBYTE *pLevelMap, *lm;\r\n\r\n\tInitL3Dungeon();\r\n\tdminx = 16;\r\n\tdminy = 16;\r\n\tdmaxx = 96;\r\n\tdmaxy = 96;\r\n\tDRLG_InitTrans();\r\n\tpLevelMap = LoadFileInMem(sFileName, NULL);\r\n\r\n\tlm = pLevelMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tlm += 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm != 0) {\r\n\t\t\t\tdungeon[i][j] = *lm;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 0) {\r\n\t\t\t\tdungeon[i][j] = 8;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tabyssx = MAXDUNX; // Unused\r\n\tDRLG_L3Pass3();\r\n\tDRLG_Init_Globals();\r\n\tViewX = 31;\r\n\tViewY = 83;\r\n\tSetMapMonsters(pLevelMap, 0, 0);\r\n\tSetMapObjects(pLevelMap, 0, 0);\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] >= 56 && dPiece[i][j] <= 147) {\r\n\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t} else if (dPiece[i][j] >= 154 && dPiece[i][j] <= 161) {\r\n\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t} else if (dPiece[i][j] == 150) {\r\n\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t} else if (dPiece[i][j] == 152) {\r\n\t\t\t\tDoLighting(i, j, 7, -1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tmem_free_dbg(pLevelMap);\r\n}\r\n\r\nvoid LoadPreL3Dungeon(const char *sFileName, int vx, int vy)\r\n{\r\n\tint i, j, rw, rh;\r\n\tBYTE *pLevelMap, *lm;\r\n\r\n\tInitL3Dungeon();\r\n\tDRLG_InitTrans();\r\n\tpLevelMap = LoadFileInMem(sFileName, NULL);\r\n\r\n\tlm = pLevelMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tlm += 2;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm != 0) {\r\n\t\t\t\tdungeon[i][j] = *lm;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i][j] = 7;\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 0) {\r\n\t\t\t\tdungeon[i][j] = 8;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tmemcpy(pdungeon, dungeon, sizeof(pdungeon));\r\n\tmem_free_dbg(pLevelMap);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/drlg_l3.h",
    "content": "/**\r\n * @file drlg_l3.h\r\n *\r\n * Interface of the caves level generation algorithms.\r\n */\r\n#ifndef __DRLG_L3_H__\r\n#define __DRLG_L3_H__\r\n\r\nvoid CreateL3Dungeon(DWORD rseed, int entry);\r\nvoid LoadL3Dungeon(const char *sFileName, int vx, int vy);\r\nvoid LoadPreL3Dungeon(const char *sFileName, int vx, int vy);\r\n\r\n#endif /* __DRLG_L3_H__ */\r\n"
  },
  {
    "path": "Source/drlg_l4.cpp",
    "content": "/**\r\n * @file drlg_l4.cpp\r\n *\r\n * Implementation of the hell level generation algorithms.\r\n */\r\n#include \"all.h\"\r\n\r\nint diabquad1x;\r\nint diabquad1y;\r\nint diabquad2x;\r\nint diabquad2y;\r\nint diabquad3x;\r\nint diabquad3y;\r\nint diabquad4x;\r\nint diabquad4y;\r\n#ifndef SPAWN\r\nBOOL hallok[20];\r\nint l4holdx;\r\nint l4holdy;\r\nint SP4x1;\r\nint SP4y1;\r\nint SP4x2;\r\nint SP4y2;\r\nBYTE L4dungeon[80][80];\r\nBYTE dung[20][20];\r\n//int dword_52A4DC;\r\n\r\n/**\r\n * A lookup table for the 16 possible patterns of a 2x2 area,\r\n * where each cell either contains a SW wall or it doesn't.\r\n */\r\nconst BYTE L4ConvTbl[16] = { 30, 6, 1, 6, 2, 6, 6, 6, 9, 6, 1, 6, 2, 6, 3, 6 };\r\n\r\n/** Miniset: Stairs up. */\r\nconst BYTE L4USTAIRS[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t 6, 6, 6, 6, // search\r\n\t 6, 6, 6, 6,\r\n\t 6, 6, 6, 6,\r\n\t 6, 6, 6, 6,\r\n\t 6, 6, 6, 6,\r\n\r\n\t 0,  0,  0,  0, // replace\r\n\t36, 38, 35,  0,\r\n\t37, 34, 33, 32,\r\n\t 0,  0, 31,  0,\r\n\t 0,  0,  0,  0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stairs up to town. */\r\nconst BYTE L4TWARP[] = {\r\n\t// clang-format off\r\n\t4, 5, // width, height\r\n\r\n\t6, 6, 6, 6, // search\r\n\t6, 6, 6, 6,\r\n\t6, 6, 6, 6,\r\n\t6, 6, 6, 6,\r\n\t6, 6, 6, 6,\r\n\r\n\t  0,   0,   0,   0, // replace\r\n\t134, 136, 133,   0,\r\n\t135, 132, 131, 130,\r\n\t  0,   0, 129,   0,\r\n\t  0,   0,   0,   0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Stairs down. */\r\nconst BYTE L4DSTAIRS[] = {\r\n\t// clang-format off\r\n\t5, 5, // width, height\r\n\r\n\t6, 6, 6, 6, 6, // search\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\r\n\t0,  0,  0,  0, 0, // replace\r\n\t0,  0, 45, 41, 0,\r\n\t0, 44, 43, 40, 0,\r\n\t0, 46, 42, 39, 0,\r\n\t0,  0,  0,  0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Pentagram. */\r\nconst BYTE L4PENTA[] = {\r\n\t// clang-format off\r\n\t5, 5, // width, height\r\n\r\n\t6, 6, 6, 6, 6, // search\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\r\n\t0,   0,   0,   0, 0, // replace\r\n\t0,  98, 100, 103, 0,\r\n\t0,  99, 102, 105, 0,\r\n\t0, 101, 104, 106, 0,\r\n\t0,   0,   0,   0, 0,\r\n\t// clang-format on\r\n};\r\n/** Miniset: Pentagram portal. */\r\nconst BYTE L4PENTA2[] = {\r\n\t// clang-format off\r\n\t5, 5, // width, height\r\n\r\n\t6, 6, 6, 6, 6, // search\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\t6, 6, 6, 6, 6,\r\n\r\n\t0,   0,   0,   0, 0, // replace\r\n\t0, 107, 109, 112, 0,\r\n\t0, 108, 111, 114, 0,\r\n\t0, 110, 113, 115, 0,\r\n\t0,   0,   0,   0, 0,\r\n\t// clang-format on\r\n};\r\n\r\n/** Maps tile IDs to their corresponding undecorated tile ID. */\r\nconst BYTE L4BTYPES[140] = {\r\n\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\r\n\t10, 11, 12, 13, 14, 15, 16, 17, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 6,\r\n\t6, 6, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 1, 2, 1, 2, 1, 2, 1, 1, 2,\r\n\t2, 0, 0, 0, 0, 0, 0, 15, 16, 9,\r\n\t12, 4, 5, 7, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0\r\n};\r\n\r\nstatic void DRLG_L4Shadows()\r\n{\r\n\tint x, y;\r\n\tBOOL okflag;\r\n\r\n\tfor (y = 1; y < DMAXY; y++) {\r\n\t\tfor (x = 1; x < DMAXY; x++) {\r\n\t\t\tokflag = FALSE;\r\n\t\t\tif (dungeon[x][y] == 3) {\r\n\t\t\t\tokflag = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dungeon[x][y] == 4) {\r\n\t\t\t\tokflag = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dungeon[x][y] == 8) {\r\n\t\t\t\tokflag = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dungeon[x][y] == 15) {\r\n\t\t\t\tokflag = TRUE;\r\n\t\t\t}\r\n\t\t\tif (!okflag) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (dungeon[x - 1][y] == 6) {\r\n\t\t\t\tdungeon[x - 1][y] = 47;\r\n\t\t\t}\r\n\t\t\tif (dungeon[x - 1][y - 1] == 6) {\r\n\t\t\t\tdungeon[x - 1][y - 1] = 48;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void InitL4Dungeon()\r\n{\r\n\tint i, j;\r\n\r\n\tmemset(dung, 0, sizeof(dung));\r\n\tmemset(L4dungeon, 0, sizeof(L4dungeon));\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tdungeon[i][j] = 30;\r\n\t\t\tdflags[i][j] = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DRLG_LoadL4SP()\r\n{\r\n\tsetloadflag = FALSE;\r\n\tif (QuestStatus(Q_WARLORD)) {\r\n\t\tpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\Warlord.DUN\", NULL);\r\n\t\tsetloadflag = TRUE;\r\n\t}\r\n\tif (currlevel == 15 && gbMaxPlayers != 1) {\r\n\t\tpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\Vile1.DUN\", NULL);\r\n\t\tsetloadflag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid DRLG_FreeL4SP()\r\n{\r\n\tMemFreeDbg(pSetPiece);\r\n}\r\n\r\nvoid DRLG_L4SetSPRoom(int rx1, int ry1)\r\n{\r\n\tint rw, rh, i, j;\r\n\tBYTE *sp;\r\n\r\n\trw = pSetPiece[0];\r\n\trh = pSetPiece[2];\r\n\r\n\tsetpc_x = rx1;\r\n\tsetpc_y = ry1;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\r\n\tsp = &pSetPiece[4];\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tdungeon[i + rx1][j + ry1] = *sp;\r\n\t\t\t\tdflags[i + rx1][j + ry1] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i + rx1][j + ry1] = 6;\r\n\t\t\t}\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L4makeDmt()\r\n{\r\n\tint i, j, idx, val, dmtx, dmty;\r\n\r\n\tfor (j = 0, dmty = 1; dmty <= 77; j++, dmty += 2) {\r\n\t\tfor (i = 0, dmtx = 1; dmtx <= 77; i++, dmtx += 2) {\r\n\t\t\tval = 8 * L4dungeon[dmtx + 1][dmty + 1]\r\n\t\t\t    + 4 * L4dungeon[dmtx][dmty + 1]\r\n\t\t\t    + 2 * L4dungeon[dmtx + 1][dmty]\r\n\t\t\t    + L4dungeon[dmtx][dmty];\r\n\t\t\tidx = L4ConvTbl[val];\r\n\t\t\tdungeon[i][j] = idx;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic int L4HWallOk(int i, int j)\r\n{\r\n\tint x;\r\n\tBOOL wallok;\r\n\r\n\tfor (x = 1; dungeon[i + x][j] == 6; x++) {\r\n\t\tif (dflags[i + x][j] != 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (dungeon[i + x][j - 1] != 6) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (dungeon[i + x][j + 1] != 6) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\twallok = FALSE;\r\n\r\n\tif (dungeon[i + x][j] == 10) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i + x][j] == 12) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i + x][j] == 13) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i + x][j] == 15) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i + x][j] == 16) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i + x][j] == 21) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i + x][j] == 22) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (x <= 3) {\r\n\t\twallok = FALSE;\r\n\t}\r\n\r\n\tif (wallok) {\r\n\t\treturn x;\r\n\t} else {\r\n\t\treturn -1;\r\n\t}\r\n}\r\n\r\nstatic int L4VWallOk(int i, int j)\r\n{\r\n\tint y;\r\n\tBOOL wallok;\r\n\r\n\tfor (y = 1; dungeon[i][j + y] == 6; y++) {\r\n\t\tif (dflags[i][j + y] != 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (dungeon[i - 1][j + y] != 6) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (dungeon[i + 1][j + y] != 6) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\twallok = FALSE;\r\n\r\n\tif (dungeon[i][j + y] == 8) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i][j + y] == 9) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i][j + y] == 11) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i][j + y] == 14) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i][j + y] == 15) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i][j + y] == 16) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i][j + y] == 21) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (dungeon[i][j + y] == 23) {\r\n\t\twallok = TRUE;\r\n\t}\r\n\tif (y <= 3) {\r\n\t\twallok = FALSE;\r\n\t}\r\n\r\n\tif (wallok) {\r\n\t\treturn y;\r\n\t} else {\r\n\t\treturn -1;\r\n\t}\r\n}\r\n\r\nstatic void L4HorizWall(int i, int j, int dx)\r\n{\r\n\tint xx;\r\n\r\n\tif (dungeon[i][j] == 13) {\r\n\t\tdungeon[i][j] = 17;\r\n\t}\r\n\tif (dungeon[i][j] == 16) {\r\n\t\tdungeon[i][j] = 11;\r\n\t}\r\n\tif (dungeon[i][j] == 12) {\r\n\t\tdungeon[i][j] = 14;\r\n\t}\r\n\r\n\tfor (xx = 1; xx < dx; xx++) {\r\n\t\tdungeon[i + xx][j] = 2;\r\n\t}\r\n\r\n\tif (dungeon[i + dx][j] == 15) {\r\n\t\tdungeon[i + dx][j] = 14;\r\n\t}\r\n\tif (dungeon[i + dx][j] == 10) {\r\n\t\tdungeon[i + dx][j] = 17;\r\n\t}\r\n\tif (dungeon[i + dx][j] == 21) {\r\n\t\tdungeon[i + dx][j] = 23;\r\n\t}\r\n\tif (dungeon[i + dx][j] == 22) {\r\n\t\tdungeon[i + dx][j] = 29;\r\n\t}\r\n\r\n\txx = random_(0, dx - 3) + 1;\r\n\tdungeon[i + xx][j] = 57;\r\n\tdungeon[i + xx + 2][j] = 56;\r\n\tdungeon[i + xx + 1][j] = 60;\r\n\r\n\tif (dungeon[i + xx][j - 1] == 6) {\r\n\t\tdungeon[i + xx][j - 1] = 58;\r\n\t}\r\n\tif (dungeon[i + xx + 1][j - 1] == 6) {\r\n\t\tdungeon[i + xx + 1][j - 1] = 59;\r\n\t}\r\n}\r\n\r\nstatic void L4VertWall(int i, int j, int dy)\r\n{\r\n\tint yy;\r\n\r\n\tif (dungeon[i][j] == 14) {\r\n\t\tdungeon[i][j] = 17;\r\n\t}\r\n\tif (dungeon[i][j] == 8) {\r\n\t\tdungeon[i][j] = 9;\r\n\t}\r\n\tif (dungeon[i][j] == 15) {\r\n\t\tdungeon[i][j] = 10;\r\n\t}\r\n\r\n\tfor (yy = 1; yy < dy; yy++) {\r\n\t\tdungeon[i][j + yy] = 1;\r\n\t}\r\n\r\n\tif (dungeon[i][j + dy] == 11) {\r\n\t\tdungeon[i][j + dy] = 17;\r\n\t}\r\n\tif (dungeon[i][j + dy] == 9) {\r\n\t\tdungeon[i][j + dy] = 10;\r\n\t}\r\n\tif (dungeon[i][j + dy] == 16) {\r\n\t\tdungeon[i][j + dy] = 13;\r\n\t}\r\n\tif (dungeon[i][j + dy] == 21) {\r\n\t\tdungeon[i][j + dy] = 22;\r\n\t}\r\n\tif (dungeon[i][j + dy] == 23) {\r\n\t\tdungeon[i][j + dy] = 29;\r\n\t}\r\n\r\n\tyy = random_(0, dy - 3) + 1;\r\n\tdungeon[i][j + yy] = 53;\r\n\tdungeon[i][j + yy + 2] = 52;\r\n\tdungeon[i][j + yy + 1] = 6;\r\n\r\n\tif (dungeon[i - 1][j + yy] == 6) {\r\n\t\tdungeon[i - 1][j + yy] = 54;\r\n\t}\r\n\tif (dungeon[i - 1][j + yy - 1] == 6) {\r\n\t\tdungeon[i - 1][j + yy - 1] = 55;\r\n\t}\r\n}\r\n\r\nstatic void L4AddWall()\r\n{\r\n\tint i, j, x, y;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dflags[i][j] != 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 10 && random_(0, 100) < 100) {\r\n\t\t\t\tx = L4HWallOk(i, j);\r\n\t\t\t\tif (x != -1) {\r\n\t\t\t\t\tL4HorizWall(i, j, x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 12 && random_(0, 100) < 100) {\r\n\t\t\t\tx = L4HWallOk(i, j);\r\n\t\t\t\tif (x != -1) {\r\n\t\t\t\t\tL4HorizWall(i, j, x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 13 && random_(0, 100) < 100) {\r\n\t\t\t\tx = L4HWallOk(i, j);\r\n\t\t\t\tif (x != -1) {\r\n\t\t\t\t\tL4HorizWall(i, j, x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 15 && random_(0, 100) < 100) {\r\n\t\t\t\tx = L4HWallOk(i, j);\r\n\t\t\t\tif (x != -1) {\r\n\t\t\t\t\tL4HorizWall(i, j, x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 16 && random_(0, 100) < 100) {\r\n\t\t\t\tx = L4HWallOk(i, j);\r\n\t\t\t\tif (x != -1) {\r\n\t\t\t\t\tL4HorizWall(i, j, x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 21 && random_(0, 100) < 100) {\r\n\t\t\t\tx = L4HWallOk(i, j);\r\n\t\t\t\tif (x != -1) {\r\n\t\t\t\t\tL4HorizWall(i, j, x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 22 && random_(0, 100) < 100) {\r\n\t\t\t\tx = L4HWallOk(i, j);\r\n\t\t\t\tif (x != -1) {\r\n\t\t\t\t\tL4HorizWall(i, j, x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 8 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 9 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 11 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 14 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 15 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 16 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 21 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 23 && random_(0, 100) < 100) {\r\n\t\t\t\ty = L4VWallOk(i, j);\r\n\t\t\t\tif (y != -1) {\r\n\t\t\t\t\tL4VertWall(i, j, y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L4tileFix()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 5;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 13;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 14;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 2;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 9)\r\n\t\t\t\tdungeon[i + 1][j] = 11;\r\n\t\t\tif (dungeon[i][j] == 9 && dungeon[i + 1][j] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 13;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i + 1][j] == 14)\r\n\t\t\t\tdungeon[i + 1][j] = 15;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j + 1] == 13)\r\n\t\t\t\tdungeon[i][j + 1] = 16;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 10;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j - 1] == 1)\r\n\t\t\t\tdungeon[i][j - 1] = 1;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 27;\r\n\t\t\tif (dungeon[i][j] == 27 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 27;\r\n\t\t\tif (dungeon[i][j] == 27 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 27)\r\n\t\t\t\tdungeon[i + 1][j] = 26;\r\n\t\t\tif (dungeon[i][j] == 27 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 15)\r\n\t\t\t\tdungeon[i + 1][j] = 14;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 15)\r\n\t\t\t\tdungeon[i + 1][j] = 14;\r\n\t\t\tif (dungeon[i][j] == 22 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 27 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] != 0) /* check */\r\n\t\t\t\tdungeon[i + 1][j] = 22;\r\n\t\t\tif (dungeon[i][j] == 22 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 1 && dungeon[i + 1][j - 1] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 13;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 30 && dungeon[i][j + 1] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 28;\r\n\t\t\tif (dungeon[i][j] == 16 && dungeon[i + 1][j] == 6 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 27;\r\n\t\t\tif (dungeon[i][j] == 16 && dungeon[i][j + 1] == 30 && dungeon[i + 1][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 27;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i + 1][j] == 30 && dungeon[i + 1][j - 1] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 21;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 9)\r\n\t\t\t\tdungeon[i + 1][j] = 29;\r\n\t\t\tif (dungeon[i][j] == 9 && dungeon[i + 1][j] == 15)\r\n\t\t\t\tdungeon[i + 1][j] = 14;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 2)\r\n\t\t\t\tdungeon[i + 1][j] = 29;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 18)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 9 && dungeon[i + 1][j] == 15)\r\n\t\t\t\tdungeon[i + 1][j] = 14;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 19 && dungeon[i + 1][j - 1] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 24 && dungeon[i][j - 1] == 30 && dungeon[i][j - 2] == 6)\r\n\t\t\t\tdungeon[i][j - 1] = 21;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 28;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 28;\r\n\t\t\tif (dungeon[i][j] == 28 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 28 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 18 && dungeon[i + 1][j + 1] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 22 && dungeon[i + 1][j + 1] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 18 && dungeon[i + 1][j + 1] == 13)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 2][j] == 2 && dungeon[i + 1][j - 1] == 18 && dungeon[i + 1][j + 1] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j + 1] == 1 && dungeon[i + 1][j - 1] == 22 && dungeon[i + 2][j] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 30 && dungeon[i + 1][j - 1] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 29;\r\n\t\t\tif (dungeon[i][j] == 28 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j - 1] == 21)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 29;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 18)\r\n\t\t\t\tdungeon[i + 1][j] = 25;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 9 && dungeon[i + 2][j] == 2)\r\n\t\t\t\tdungeon[i + 1][j] = 11;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 10)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i][j + 1] == 3)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 22 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 24 && dungeon[i - 1][j] == 30)\r\n\t\t\t\tdungeon[i - 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 10;\r\n\t\t\tif (dungeon[i][j] == 22 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 16 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 22 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 18 && dungeon[i + 2][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 9 && dungeon[i + 1][j + 1] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 27 && dungeon[i + 1][j + 1] == 2)\r\n\t\t\t\tdungeon[i + 1][j] = 29;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 25 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 22 && dungeon[i + 1][j] == 9)\r\n\t\t\t\tdungeon[i + 1][j] = 11;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i + 1][j] == 9)\r\n\t\t\t\tdungeon[i + 1][j] = 11;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i + 1][j] == 15)\r\n\t\t\t\tdungeon[i + 1][j] = 14;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 27)\r\n\t\t\t\tdungeon[i + 1][j] = 26;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 18)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 26 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 29 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 29 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j - 1] == 15)\r\n\t\t\t\tdungeon[i][j - 1] = 10;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 10;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 30 && dungeon[i + 1][j + 1] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 28 && dungeon[i + 1][j - 1] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i + 1][j] == 18 && dungeon[i][j - 1] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 24;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 23 && dungeon[i + 2][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 28;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 30 && dungeon[i + 1][j - 1] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 23 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 29 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 29 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 26 && dungeon[i + 1][j] == 30)\r\n\t\t\t\tdungeon[i + 1][j] = 19;\r\n\t\t\tif (dungeon[i][j] == 16 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 10;\r\n\t\t\tif (dungeon[i][j] == 25 && dungeon[i][j + 1] == 30)\r\n\t\t\t\tdungeon[i][j + 1] = 18;\r\n\t\t\tif (dungeon[i][j] == 18 && dungeon[i][j + 1] == 2)\r\n\t\t\t\tdungeon[i][j + 1] = 15;\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i + 1][j] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 5;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 9)\r\n\t\t\t\tdungeon[i + 1][j] = 11;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 13;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 13 && dungeon[i + 1][j - 1] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i][j + 1] == 24 && dungeon[i][j + 2] == 1)\r\n\t\t\t\tdungeon[i][j + 1] = 17;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j + 1] == 9 && dungeon[i + 1][j - 1] == 1 && dungeon[i + 2][j] == 16)\r\n\t\t\t\tdungeon[i + 1][j] = 29;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i - 1][j] == 6)\r\n\t\t\t\tdungeon[i - 1][j] = 8;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j - 1] == 6)\r\n\t\t\t\tdungeon[i][j - 1] = 7;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i + 1][j] == 15 && dungeon[i + 1][j + 1] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 10;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 3)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 6)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 9 && dungeon[i][j + 1] == 3)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 10 && dungeon[i][j + 1] == 3)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 3)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 5)\r\n\t\t\t\tdungeon[i][j + 1] = 12;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 16)\r\n\t\t\t\tdungeon[i][j + 1] = 13;\r\n\t\t\tif (dungeon[i][j] == 6 && dungeon[i][j + 1] == 13)\r\n\t\t\t\tdungeon[i][j + 1] = 16;\r\n\t\t\tif (dungeon[i][j] == 25 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 10;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 5)\r\n\t\t\t\tdungeon[i][j + 1] = 12;\r\n\t\t\tif (dungeon[i][j] == 28 && dungeon[i][j - 1] == 6 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 10)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 9)\r\n\t\t\t\tdungeon[i + 1][j] = 11;\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i + 1][j] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 5;\r\n\t\t\tif (dungeon[i][j] == 10 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 27 && dungeon[i + 1][j] == 9)\r\n\t\t\t\tdungeon[i + 1][j] = 11;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 1)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 5;\r\n\t\t\tif (dungeon[i][j] == 9 && dungeon[i + 1][j] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 5;\r\n\t\t\tif (dungeon[i][j] == 14 && dungeon[i + 1][j] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 5;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 5;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 5 && dungeon[i + 1][j - 1] == 16)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 9 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j - 1] == 8)\r\n\t\t\t\tdungeon[i][j - 1] = 9;\r\n\t\t\tif (dungeon[i][j] == 28 && dungeon[i + 1][j] == 23 && dungeon[i + 1][j + 1] == 3)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 10)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 17 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 10 && dungeon[i + 1][j] == 4)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 17 && dungeon[i][j + 1] == 5)\r\n\t\t\t\tdungeon[i][j + 1] = 12;\r\n\t\t\tif (dungeon[i][j] == 29 && dungeon[i][j + 1] == 9)\r\n\t\t\t\tdungeon[i][j + 1] = 10;\r\n\t\t\tif (dungeon[i][j] == 13 && dungeon[i][j + 1] == 5)\r\n\t\t\t\tdungeon[i][j + 1] = 12;\r\n\t\t\tif (dungeon[i][j] == 9 && dungeon[i][j + 1] == 16)\r\n\t\t\t\tdungeon[i][j + 1] = 13;\r\n\t\t\tif (dungeon[i][j] == 10 && dungeon[i][j + 1] == 16)\r\n\t\t\t\tdungeon[i][j + 1] = 13;\r\n\t\t\tif (dungeon[i][j] == 16 && dungeon[i][j + 1] == 3)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 11 && dungeon[i][j + 1] == 5)\r\n\t\t\t\tdungeon[i][j + 1] = 12;\r\n\t\t\tif (dungeon[i][j] == 10 && dungeon[i + 1][j] == 3 && dungeon[i + 1][j - 1] == 16)\r\n\t\t\t\tdungeon[i + 1][j] = 12;\r\n\t\t\tif (dungeon[i][j] == 16 && dungeon[i][j + 1] == 5)\r\n\t\t\t\tdungeon[i][j + 1] = 12;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i][j + 1] == 6)\r\n\t\t\t\tdungeon[i][j + 1] = 4;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j] == 13 && dungeon[i][j + 1] == 10)\r\n\t\t\t\tdungeon[i + 1][j + 1] = 12;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 10)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 22 && dungeon[i][j + 1] == 11)\r\n\t\t\t\tdungeon[i][j + 1] = 17;\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 16)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 28 && dungeon[i + 1][j] == 23 && dungeon[i + 1][j + 1] == 1 && dungeon[i + 2][j] == 6)\r\n\t\t\t\tdungeon[i + 1][j] = 16;\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 15 && dungeon[i + 1][j] == 28 && dungeon[i + 2][j] == 16)\r\n\t\t\t\tdungeon[i + 1][j] = 23;\r\n\t\t\tif (dungeon[i][j] == 21 && dungeon[i + 1][j - 1] == 21 && dungeon[i + 1][j + 1] == 13 && dungeon[i + 2][j] == 2)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t\tif (dungeon[i][j] == 19 && dungeon[i + 1][j] == 15 && dungeon[i + 1][j + 1] == 12)\r\n\t\t\t\tdungeon[i + 1][j] = 17;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L4Subs()\r\n{\r\n\tint x, y, i, rv;\r\n\tBYTE c;\r\n\r\n\tfor (y = 0; y < DMAXY; y++) {\r\n\t\tfor (x = 0; x < DMAXX; x++) {\r\n\t\t\trv = random_(0, 3);\r\n\t\t\tif (rv == 0) {\r\n\t\t\t\tc = dungeon[x][y];\r\n\t\t\t\tc = L4BTYPES[c];\r\n\t\t\t\tif (c != 0 && dflags[x][y] == 0) {\r\n\t\t\t\t\trv = random_(0, 16);\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t\twhile (rv >= 0) {\r\n\t\t\t\t\t\ti++;\r\n\t\t\t\t\t\tif (i == sizeof(L4BTYPES)) {\r\n\t\t\t\t\t\t\ti = 0;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (c == L4BTYPES[i]) {\r\n\t\t\t\t\t\t\trv--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdungeon[x][y] = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (y = 0; y < DMAXY; y++) {\r\n\t\tfor (x = 0; x < DMAXX; x++) {\r\n\t\t\trv = random_(0, 10);\r\n\t\t\tif (rv == 0) {\r\n\t\t\t\tc = dungeon[x][y];\r\n\t\t\t\tif (L4BTYPES[c] == 6 && dflags[x][y] == 0) {\r\n\t\t\t\t\tdungeon[x][y] = random_(0, 3) + 95;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void L4makeDungeon()\r\n{\r\n\tint i, j, k, l;\r\n\r\n\tfor (j = 0; j < 20; j++) {\r\n\t\tfor (i = 0; i < 20; i++) {\r\n\t\t\tk = i << 1;\r\n\t\t\tl = j << 1;\r\n\t\t\tL4dungeon[k][l] = dung[i][j];\r\n\t\t\tL4dungeon[k][l + 1] = dung[i][j];\r\n\t\t\tL4dungeon[k + 1][l] = dung[i][j];\r\n\t\t\tL4dungeon[k + 1][l + 1] = dung[i][j];\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < 20; j++) {\r\n\t\tfor (i = 0; i < 20; i++) {\r\n\t\t\tk = i << 1;\r\n\t\t\tl = j << 1;\r\n\t\t\tL4dungeon[k][l + 40] = dung[i][19 - j];\r\n\t\t\tL4dungeon[k][l + 41] = dung[i][19 - j];\r\n\t\t\tL4dungeon[k + 1][l + 40] = dung[i][19 - j];\r\n\t\t\tL4dungeon[k + 1][l + 41] = dung[i][19 - j];\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < 20; j++) {\r\n\t\tfor (i = 0; i < 20; i++) {\r\n\t\t\tk = i << 1;\r\n\t\t\tl = j << 1;\r\n\t\t\tL4dungeon[k + 40][l] = dung[19 - i][j];\r\n\t\t\tL4dungeon[k + 40][l + 1] = dung[19 - i][j];\r\n\t\t\tL4dungeon[k + 41][l] = dung[19 - i][j];\r\n\t\t\tL4dungeon[k + 41][l + 1] = dung[19 - i][j];\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < 20; j++) {\r\n\t\tfor (i = 0; i < 20; i++) {\r\n\t\t\tk = i << 1;\r\n\t\t\tl = j << 1;\r\n\t\t\tL4dungeon[k + 40][l + 40] = dung[19 - i][19 - j];\r\n\t\t\tL4dungeon[k + 40][l + 41] = dung[19 - i][19 - j];\r\n\t\t\tL4dungeon[k + 41][l + 40] = dung[19 - i][19 - j];\r\n\t\t\tL4dungeon[k + 41][l + 41] = dung[19 - i][19 - j];\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void uShape()\r\n{\r\n\tint j, i, rv;\r\n\r\n\tfor (j = 19; j >= 0; j--) {\r\n\t\tfor (i = 19; i >= 0; i--) {\r\n\t\t\tif (dung[i][j] != 1) {\r\n\t\t\t\thallok[j] = FALSE;\r\n\t\t\t}\r\n\t\t\tif (dung[i][j] == 1) {\r\n\t\t\t\t// BUGFIX: check that i + 1 < 20 and j + 1 < 20\r\n\t\t\t\tif (dung[i][j + 1] == 1 && dung[i + 1][j + 1] == 0) {\r\n\t\t\t\t\thallok[j] = TRUE;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thallok[j] = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\ti = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\trv = random_(0, 19) + 1;\r\n\tdo {\r\n\t\tif (hallok[rv]) {\r\n\t\t\tfor (i = 19; i >= 0; i--) {\r\n\t\t\t\tif (dung[i][rv] == 1) {\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t\trv = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdung[i][rv] = 1;\r\n\t\t\t\t\tdung[i][rv + 1] = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\trv++;\r\n\t\t\tif (rv == 20) {\r\n\t\t\t\trv = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t} while (rv != 0);\r\n\r\n\tfor (i = 19; i >= 0; i--) {\r\n\t\tfor (j = 19; j >= 0; j--) {\r\n\t\t\tif (dung[i][j] != 1) {\r\n\t\t\t\thallok[i] = FALSE;\r\n\t\t\t}\r\n\t\t\tif (dung[i][j] == 1) {\r\n\t\t\t\t// BUGFIX: check that i + 1 < 20 and j + 1 < 20\r\n\t\t\t\tif (dung[i + 1][j] == 1 && dung[i + 1][j + 1] == 0) {\r\n\t\t\t\t\thallok[i] = TRUE;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thallok[i] = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tj = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\trv = random_(0, 19) + 1;\r\n\tdo {\r\n\t\tif (hallok[rv]) {\r\n\t\t\tfor (j = 19; j >= 0; j--) {\r\n\t\t\t\tif (dung[rv][j] == 1) {\r\n\t\t\t\t\tj = -1;\r\n\t\t\t\t\trv = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdung[rv][j] = 1;\r\n\t\t\t\t\tdung[rv + 1][j] = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\trv++;\r\n\t\t\tif (rv == 20) {\r\n\t\t\t\trv = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t} while (rv != 0);\r\n}\r\n\r\nstatic long GetArea()\r\n{\r\n\tint i, j;\r\n\tlong rv;\r\n\r\n\trv = 0;\r\n\r\n\tfor (j = 0; j < 20; j++) {\r\n\t\tfor (i = 0; i < 20; i++) {\r\n\t\t\tif (dung[i][j] == 1) {\r\n\t\t\t\trv++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nstatic void L4drawRoom(int x, int y, int width, int height)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < height; j++) {\r\n\t\tfor (i = 0; i < width; i++) {\r\n\t\t\tdung[i + x][j + y] = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL L4checkRoom(int x, int y, int width, int height)\r\n{\r\n\tint i, j;\r\n\r\n\tif (x <= 0 || y <= 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tfor (j = 0; j < height; j++) {\r\n\t\tfor (i = 0; i < width; i++) {\r\n\t\t\tif (i + x < 0 || i + x >= 20 || j + y < 0 || j + y >= 20) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t\tif (dung[i + x][j + y] != 0) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void L4roomGen(int x, int y, int w, int h, int dir)\r\n{\r\n\tint num;\r\n\tBOOL ran, ran2;\r\n\tint width, height, rx, ry, ry2;\r\n\tint cw, ch, cx1, cy1, cx2;\r\n\r\n\tint dirProb = random_(0, 4);\r\n\r\n\tswitch (dir == 1 ? dirProb != 0 : dirProb == 0) {\r\n\tcase FALSE:\r\n\t\tnum = 0;\r\n\t\tdo {\r\n\t\t\tcw = (random_(0, 5) + 2) & ~1;\r\n\t\t\tch = (random_(0, 5) + 2) & ~1;\r\n\t\t\tcy1 = h / 2 + y - ch / 2;\r\n\t\t\tcx1 = x - cw;\r\n\t\t\tran = L4checkRoom(cx1 - 1, cy1 - 1, ch + 2, cw + 1); /// BUGFIX: swap args 3 and 4 (\"ch+2\" and \"cw+1\")\r\n\t\t\tnum++;\r\n\t\t} while (ran == FALSE && num < 20);\r\n\r\n\t\tif (ran == TRUE)\r\n\t\t\tL4drawRoom(cx1, cy1, cw, ch);\r\n\t\tcx2 = x + w;\r\n\t\tran2 = L4checkRoom(cx2, cy1 - 1, cw + 1, ch + 2);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL4drawRoom(cx2, cy1, cw, ch);\r\n\t\tif (ran == TRUE)\r\n\t\t\tL4roomGen(cx1, cy1, cw, ch, 1);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL4roomGen(cx2, cy1, cw, ch, 1);\r\n\t\tbreak;\r\n\tcase TRUE:\r\n\t\tnum = 0;\r\n\t\tdo {\r\n\t\t\twidth = (random_(0, 5) + 2) & ~1;\r\n\t\t\theight = (random_(0, 5) + 2) & ~1;\r\n\t\t\trx = w / 2 + x - width / 2;\r\n\t\t\try = y - height;\r\n\t\t\tran = L4checkRoom(rx - 1, ry - 1, width + 2, height + 1);\r\n\t\t\tnum++;\r\n\t\t} while (ran == FALSE && num < 20);\r\n\r\n\t\tif (ran == TRUE)\r\n\t\t\tL4drawRoom(rx, ry, width, height);\r\n\t\try2 = y + h;\r\n\t\tran2 = L4checkRoom(rx - 1, ry2, width + 2, height + 1);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL4drawRoom(rx, ry2, width, height);\r\n\t\tif (ran == TRUE)\r\n\t\t\tL4roomGen(rx, ry, width, height, 0);\r\n\t\tif (ran2 == TRUE)\r\n\t\t\tL4roomGen(rx, ry2, width, height, 0);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic void L4firstRoom()\r\n{\r\n\tint x, y, w, h, rndx, rndy, xmin, xmax, ymin, ymax, tx, ty;\r\n\r\n\tif (currlevel != 16) {\r\n\t\tif (currlevel == quests[Q_WARLORD]._qlevel && quests[Q_WARLORD]._qactive != QUEST_NOTAVAIL) {\r\n\t\t\t/// ASSERT: assert(gbMaxPlayers == 1);\r\n\t\t\tw = 11;\r\n\t\t\th = 11;\r\n\t\t} else if (currlevel == quests[Q_BETRAYER]._qlevel && gbMaxPlayers != 1) {\r\n\t\t\tw = 11;\r\n\t\t\th = 11;\r\n\t\t} else {\r\n\t\t\tw = random_(0, 5) + 2;\r\n\t\t\th = random_(0, 5) + 2;\r\n\t\t}\r\n\t} else {\r\n\t\tw = 14;\r\n\t\th = 14;\r\n\t}\r\n\r\n\txmin = (20 - w) >> 1;\r\n\txmax = 19 - w;\r\n\trndx = random_(0, xmax - xmin + 1) + xmin;\r\n\tif (rndx + w > 19) {\r\n\t\ttx = w + rndx - 19;\r\n\t\tx = rndx - tx + 1;\r\n\t} else {\r\n\t\tx = rndx;\r\n\t}\r\n\tymin = (20 - h) >> 1;\r\n\tymax = 19 - h;\r\n\trndy = random_(0, ymax - ymin + 1) + ymin;\r\n\tif (rndy + h > 19) {\r\n\t\tty = h + rndy - 19;\r\n\t\ty = rndy - ty + 1;\r\n\t} else {\r\n\t\ty = rndy;\r\n\t}\r\n\r\n\tif (currlevel == 16) {\r\n\t\tl4holdx = x;\r\n\t\tl4holdy = y;\r\n\t}\r\n\tif (QuestStatus(Q_WARLORD) || currlevel == quests[Q_BETRAYER]._qlevel && gbMaxPlayers != 1) {\r\n\t\tSP4x1 = x + 1;\r\n\t\tSP4y1 = y + 1;\r\n\t\tSP4x2 = SP4x1 + w;\r\n\t\tSP4y2 = SP4y1 + h;\r\n\t} else {\r\n\t\tSP4x1 = 0;\r\n\t\tSP4y1 = 0;\r\n\t\tSP4x2 = 0;\r\n\t\tSP4y2 = 0;\r\n\t}\r\n\r\n\tL4drawRoom(x, y, w, h);\r\n\tL4roomGen(x, y, w, h, random_(0, 2));\r\n}\r\n\r\nvoid L4SaveQuads()\r\n{\r\n\tint i, j, x, y;\r\n\r\n\tx = l4holdx;\r\n\ty = l4holdy;\r\n\r\n\tfor (j = 0; j < 14; j++) {\r\n\t\tfor (i = 0; i < 14; i++) {\r\n\t\t\tdflags[i + x][j + y] = 1;\r\n\t\t\tdflags[DMAXX - 1 - i - x][j + y] = 1;\r\n\t\t\tdflags[i + x][DMAXY - 1 - j - y] = 1;\r\n\t\t\tdflags[DMAXX - 1 - i - x][DMAXY - 1 - j - y] = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DRLG_L4SetRoom(BYTE *pSetPiece, int rx1, int ry1)\r\n{\r\n\tint rw, rh, i, j;\r\n\tBYTE *sp;\r\n\r\n\trw = pSetPiece[0];\r\n\trh = pSetPiece[2];\r\n\tsp = &pSetPiece[4];\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tdungeon[i + rx1][j + ry1] = *sp;\r\n\t\t\t\tdflags[i + rx1][j + ry1] |= DLRG_PROTECTED;\r\n\t\t\t} else {\r\n\t\t\t\tdungeon[i + rx1][j + ry1] = 6;\r\n\t\t\t}\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DRLG_LoadDiabQuads(BOOL preflag)\r\n{\r\n\tBYTE *lpSetPiece;\r\n\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab1.DUN\", NULL);\r\n\tdiabquad1x = 4 + l4holdx;\r\n\tdiabquad1y = 4 + l4holdy;\r\n\tDRLG_L4SetRoom(lpSetPiece, diabquad1x, diabquad1y);\r\n\tmem_free_dbg(lpSetPiece);\r\n\r\n\tif (preflag) {\r\n\t\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab2b.DUN\", NULL);\r\n\t} else {\r\n\t\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab2a.DUN\", NULL);\r\n\t}\r\n\tdiabquad2x = 27 - l4holdx;\r\n\tdiabquad2y = 1 + l4holdy;\r\n\tDRLG_L4SetRoom(lpSetPiece, diabquad2x, diabquad2y);\r\n\tmem_free_dbg(lpSetPiece);\r\n\r\n\tif (preflag) {\r\n\t\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab3b.DUN\", NULL);\r\n\t} else {\r\n\t\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab3a.DUN\", NULL);\r\n\t}\r\n\tdiabquad3x = 1 + l4holdx;\r\n\tdiabquad3y = 27 - l4holdy;\r\n\tDRLG_L4SetRoom(lpSetPiece, diabquad3x, diabquad3y);\r\n\tmem_free_dbg(lpSetPiece);\r\n\r\n\tif (preflag) {\r\n\t\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab4b.DUN\", NULL);\r\n\t} else {\r\n\t\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab4a.DUN\", NULL);\r\n\t}\r\n\tdiabquad4x = 28 - l4holdx;\r\n\tdiabquad4y = 28 - l4holdy;\r\n\tDRLG_L4SetRoom(lpSetPiece, diabquad4x, diabquad4y);\r\n\tmem_free_dbg(lpSetPiece);\r\n}\r\n\r\nstatic BOOL DRLG_L4PlaceMiniSet(const BYTE *miniset, int tmin, int tmax, int cx, int cy, BOOL setview, int ldir)\r\n{\r\n\tint sx, sy, sw, sh, xx, yy, i, ii, numt, bailcnt;\r\n\tBOOL found;\r\n\r\n\tsw = miniset[0];\r\n\tsh = miniset[1];\r\n\r\n\tif (tmax - tmin == 0) {\r\n\t\tnumt = 1;\r\n\t} else {\r\n\t\tnumt = random_(0, tmax - tmin) + tmin;\r\n\t}\r\n\r\n\tfor (i = 0; i < numt; i++) {\r\n\t\tsx = random_(0, DMAXX - sw);\r\n\t\tsy = random_(0, DMAXY - sh);\r\n\t\tfound = FALSE;\r\n\t\tfor (bailcnt = 0; !found && bailcnt < 200; bailcnt++) {\r\n\t\t\tfound = TRUE;\r\n\t\t\tif (sx >= SP4x1 && sx <= SP4x2 && sy >= SP4y1 && sy <= SP4y2) {\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tif (cx != -1 && sx >= cx - sw && sx <= cx + 12) {\r\n\t\t\t\tsx = random_(0, DMAXX - sw);\r\n\t\t\t\tsy = random_(0, DMAXY - sh);\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tif (cy != -1 && sy >= cy - sh && sy <= cy + 12) {\r\n\t\t\t\tsx = random_(0, DMAXX - sw);\r\n\t\t\t\tsy = random_(0, DMAXY - sh);\r\n\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t\tii = 2;\r\n\t\t\tfor (yy = 0; yy < sh && found == TRUE; yy++) {\r\n\t\t\t\tfor (xx = 0; xx < sw && found == TRUE; xx++) {\r\n\t\t\t\t\tif (miniset[ii] != 0 && dungeon[xx + sx][yy + sy] != miniset[ii]) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (dflags[xx + sx][yy + sy] != 0) {\r\n\t\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tii++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!found) {\r\n\t\t\t\tsx++;\r\n\t\t\t\tif (sx == DMAXX - sw) {\r\n\t\t\t\t\tsx = 0;\r\n\t\t\t\t\tsy++;\r\n\t\t\t\t\tif (sy == DMAXY - sh) {\r\n\t\t\t\t\t\tsy = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (bailcnt >= 200) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t\tii = sw * sh + 2;\r\n\t\tfor (yy = 0; yy < sh; yy++) {\r\n\t\t\tfor (xx = 0; xx < sw; xx++) {\r\n\t\t\t\tif (miniset[ii] != 0) {\r\n\t\t\t\t\tdungeon[xx + sx][yy + sy] = miniset[ii];\r\n\t\t\t\t\tdflags[xx + sx][yy + sy] |= 8;\r\n\t\t\t\t}\r\n\t\t\t\tii++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (currlevel == 15) {\r\n\t\tquests[Q_BETRAYER]._qtx = sx + 1;\r\n\t\tquests[Q_BETRAYER]._qty = sy + 1;\r\n\t}\r\n\tif (setview == TRUE) {\r\n\t\tViewX = 2 * sx + 21;\r\n\t\tViewY = 2 * sy + 22;\r\n\t}\r\n\tif (ldir == 0) {\r\n\t\tLvlViewX = 2 * sx + 21;\r\n\t\tLvlViewY = 2 * sy + 22;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void DRLG_L4FTVR(int i, int j, int x, int y, int d)\r\n{\r\n\tif (dTransVal[x][y] != 0 || dungeon[i][j] != 6) {\r\n\t\tif (d == 1) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 2) {\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 3) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t}\r\n\t\tif (d == 4) {\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 5) {\r\n\t\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 6) {\r\n\t\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\t}\r\n\t\tif (d == 7) {\r\n\t\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\t}\r\n\t\tif (d == 8) {\r\n\t\t\tdTransVal[x][y] = TransVal;\r\n\t\t}\r\n\t} else {\r\n\t\tdTransVal[x][y] = TransVal;\r\n\t\tdTransVal[x + 1][y] = TransVal;\r\n\t\tdTransVal[x][y + 1] = TransVal;\r\n\t\tdTransVal[x + 1][y + 1] = TransVal;\r\n\t\tDRLG_L4FTVR(i + 1, j, x + 2, y, 1);\r\n\t\tDRLG_L4FTVR(i - 1, j, x - 2, y, 2);\r\n\t\tDRLG_L4FTVR(i, j + 1, x, y + 2, 3);\r\n\t\tDRLG_L4FTVR(i, j - 1, x, y - 2, 4);\r\n\t\tDRLG_L4FTVR(i - 1, j - 1, x - 2, y - 2, 5);\r\n\t\tDRLG_L4FTVR(i + 1, j - 1, x + 2, y - 2, 6);\r\n\t\tDRLG_L4FTVR(i - 1, j + 1, x - 2, y + 2, 7);\r\n\t\tDRLG_L4FTVR(i + 1, j + 1, x + 2, y + 2, 8);\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L4FloodTVal()\r\n{\r\n\tint i, j, xx, yy;\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == 6 && dTransVal[xx][yy] == 0) {\r\n\t\t\t\tDRLG_L4FTVR(i, j, xx, yy, 0);\r\n\t\t\t\tTransVal++;\r\n\t\t\t}\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nBOOL IsDURWall(char d)\r\n{\r\n\tif (d == 25) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (d == 28) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (d == 23) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL IsDLLWall(char dd)\r\n{\r\n\tif (dd == 27) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (dd == 26) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (dd == 22) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic void DRLG_L4TransFix()\r\n{\r\n\tint i, j, xx, yy;\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (IsDURWall(dungeon[i][j]) && dungeon[i][j - 1] == 18) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (IsDLLWall(dungeon[i][j]) && dungeon[i + 1][j] == 19) {\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 18) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 19) {\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 24) {\r\n\t\t\t\tdTransVal[xx + 1][yy] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t\tdTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 57) {\r\n\t\t\t\tdTransVal[xx - 1][yy] = dTransVal[xx][yy + 1];\r\n\t\t\t\tdTransVal[xx][yy] = dTransVal[xx][yy + 1];\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 53) {\r\n\t\t\t\tdTransVal[xx][yy - 1] = dTransVal[xx + 1][yy];\r\n\t\t\t\tdTransVal[xx][yy] = dTransVal[xx + 1][yy];\r\n\t\t\t}\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L4Corners()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 1; j < DMAXY - 1; j++) {\r\n\t\tfor (i = 1; i < DMAXX - 1; i++) {\r\n\t\t\tif (dungeon[i][j] >= 18 && dungeon[i][j] <= 30) {\r\n\t\t\t\tif (dungeon[i + 1][j] < 18) {\r\n\t\t\t\t\tdungeon[i][j] += 98;\r\n\t\t\t\t} else if (dungeon[i][j + 1] < 18) {\r\n\t\t\t\t\tdungeon[i][j] += 98;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid L4FixRim()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (i = 0; i < 20; i++) {\r\n\t\tdung[i][0] = 0;\r\n\t}\r\n\tfor (j = 0; j < 20; j++) {\r\n\t\tdung[0][j] = 0;\r\n\t}\r\n}\r\n\r\nvoid DRLG_L4GeneralFix()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < DMAXY - 1; j++) {\r\n\t\tfor (i = 0; i < DMAXX - 1; i++) {\r\n\t\t\tif ((dungeon[i][j] == 24 || dungeon[i][j] == 122) && dungeon[i + 1][j] == 2 && dungeon[i][j + 1] == 5) {\r\n\t\t\t\tdungeon[i][j] = 17;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L4(int entry)\r\n{\r\n\tint i, j, spi, spj, ar;\r\n\tBOOL doneflag;\r\n\r\n\tdo {\r\n\t\tDRLG_InitTrans();\r\n\t\tdo {\r\n\t\t\tInitL4Dungeon();\r\n\t\t\tL4firstRoom();\r\n\t\t\tL4FixRim();\r\n\t\t\tar = GetArea();\r\n\t\t\tif (ar >= 173) {\r\n\t\t\t\tuShape();\r\n\t\t\t}\r\n\t\t} while (ar < 173);\r\n\t\tL4makeDungeon();\r\n\t\tL4makeDmt();\r\n\t\tL4tileFix();\r\n\t\tif (currlevel == 16) {\r\n\t\t\tL4SaveQuads();\r\n\t\t}\r\n\t\tif (QuestStatus(Q_WARLORD) || currlevel == quests[Q_BETRAYER]._qlevel && gbMaxPlayers != 1) {\r\n\t\t\tfor (spi = SP4x1; spi < SP4x2; spi++) {\r\n\t\t\t\tfor (spj = SP4y1; spj < SP4y2; spj++) {\r\n\t\t\t\t\tdflags[spi][spj] = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tL4AddWall();\r\n\t\tDRLG_L4FloodTVal();\r\n\t\tDRLG_L4TransFix();\r\n\t\tif (setloadflag) {\r\n\t\t\tDRLG_L4SetSPRoom(SP4x1, SP4y1);\r\n\t\t}\r\n\t\tif (currlevel == 16) {\r\n\t\t\tDRLG_LoadDiabQuads(TRUE);\r\n\t\t}\r\n\t\tif (QuestStatus(Q_WARLORD)) {\r\n\t\t\tif (entry == ENTRY_MAIN) {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, TRUE, 0);\r\n\t\t\t\tif (doneflag && currlevel == 13) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t}\r\n\t\t\t\tViewX++;\r\n\t\t\t} else if (entry == ENTRY_PREV) {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\t\tif (doneflag && currlevel == 13) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t}\r\n\t\t\t\tViewX = 2 * setpc_x + 22;\r\n\t\t\t\tViewY = 2 * setpc_y + 22;\r\n\t\t\t} else {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\t\tif (doneflag && currlevel == 13) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, TRUE, 6);\r\n\t\t\t\t}\r\n\t\t\t\tViewX++;\r\n\t\t\t}\r\n\t\t} else if (currlevel != 15) {\r\n\t\t\tif (entry == ENTRY_MAIN) {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, TRUE, 0);\r\n\t\t\t\tif (doneflag && currlevel != 16) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\t}\r\n\t\t\t\tif (doneflag && currlevel == 13) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t}\r\n\t\t\t\tViewX++;\r\n\t\t\t} else if (entry == ENTRY_PREV) {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\t\tif (doneflag && currlevel != 16) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, TRUE, 1);\r\n\t\t\t\t}\r\n\t\t\t\tif (doneflag && currlevel == 13) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, FALSE, 6);\r\n\t\t\t\t}\r\n\t\t\t\tViewY++;\r\n\t\t\t} else {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\t\tif (doneflag && currlevel != 16) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4DSTAIRS, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\t}\r\n\t\t\t\tif (doneflag && currlevel == 13) {\r\n\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4TWARP, 1, 1, -1, -1, TRUE, 6);\r\n\t\t\t\t}\r\n\t\t\t\tViewX++;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (entry == ENTRY_MAIN) {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, TRUE, 0);\r\n\t\t\t\tif (doneflag) {\r\n\t\t\t\t\tif (gbMaxPlayers == 1 && quests[Q_DIABLO]._qactive != QUEST_ACTIVE) {\r\n\t\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, FALSE, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tViewX++;\r\n\t\t\t} else {\r\n\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4USTAIRS, 1, 1, -1, -1, FALSE, 0);\r\n\t\t\t\tif (doneflag) {\r\n\t\t\t\t\tif (gbMaxPlayers == 1 && quests[Q_DIABLO]._qactive != QUEST_ACTIVE) {\r\n\t\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4PENTA, 1, 1, -1, -1, TRUE, 1);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdoneflag = DRLG_L4PlaceMiniSet(L4PENTA2, 1, 1, -1, -1, TRUE, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tViewY++;\r\n\t\t\t}\r\n\t\t}\r\n\t} while (!doneflag);\r\n\r\n\tDRLG_L4GeneralFix();\r\n\r\n\tif (currlevel != 16) {\r\n\t\tDRLG_PlaceThemeRooms(7, 10, 6, 8, 1);\r\n\t}\r\n\r\n\tDRLG_L4Shadows();\r\n\tDRLG_L4Corners();\r\n\tDRLG_L4Subs();\r\n\tDRLG_Init_Globals();\r\n\r\n\tif (QuestStatus(Q_WARLORD)) {\r\n\t\tfor (j = 0; j < DMAXY; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\t\tpdungeon[i][j] = dungeon[i][j];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tDRLG_CheckQuests(SP4x1, SP4y1);\r\n\r\n\tif (currlevel == 15) {\r\n\t\tfor (j = 0; j < DMAXY; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\t\tif (dungeon[i][j] == 98) {\r\n\t\t\t\t\tMake_SetPC(i - 1, j - 1, 5, 5);\r\n\t\t\t\t}\r\n\t\t\t\tif (dungeon[i][j] == 107) {\r\n\t\t\t\t\tMake_SetPC(i - 1, j - 1, 5, 5);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (currlevel == 16) {\r\n\t\tfor (j = 0; j < DMAXY; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\t\tpdungeon[i][j] = dungeon[i][j];\r\n\t\t\t}\r\n\t\t}\r\n\t\tDRLG_LoadDiabQuads(FALSE);\r\n\t}\r\n}\r\n\r\nstatic void DRLG_L4Pass3()\r\n{\r\n\tint i, j, xx, yy;\r\n\tlong v1, v2, v3, v4, lv;\r\n\r\n\tlv = 30 - 1;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pMegaTiles\r\n\t\tmov\t\teax, lv\r\n\t\tshl\t\teax, 3\r\n\t\tadd\t\tesi, eax\r\n\t\txor\t\teax, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv1, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv2, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv3, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv4, eax\r\n\t}\r\n#else\r\n\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n#endif\r\n\r\n\tfor (j = 0; j < MAXDUNY; j += 2)\r\n\t{\r\n\t\tfor (i = 0; i < MAXDUNX; i += 2) {\r\n\t\t\tdPiece[i][j] = v1;\r\n\t\t\tdPiece[i + 1][j] = v2;\r\n\t\t\tdPiece[i][j + 1] = v3;\r\n\t\t\tdPiece[i + 1][j + 1] = v4;\r\n\t\t}\r\n\t}\r\n\r\n\tyy = 16;\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\txx = 16;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tlv = dungeon[i][j] - 1;\r\n#ifdef USE_ASM\r\n\t\t\tif (lv >= 0) {\r\n\t\t\t\t__asm {\r\n\t\t\t\t\tmov\t\tesi, pMegaTiles\r\n\t\t\t\t\tmov\t\teax, lv\r\n\t\t\t\t\tshl\t\teax, 3\r\n\t\t\t\t\tadd\t\tesi, eax\r\n\t\t\t\t\txor\t\teax, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv1, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv2, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv3, eax\r\n\t\t\t\t\tlodsw\r\n\t\t\t\t\tinc\t\teax\r\n\t\t\t\t\tmov\t\tv4, eax\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tv1 = 0;\r\n\t\t\t\tv2 = 0;\r\n\t\t\t\tv3 = 0;\r\n\t\t\t\tv4 = 0;\r\n\t\t\t}\r\n#else\r\n\t\t\tif (lv >= 0) {\r\n\t\t\t\tv1 = *((WORD *)&pMegaTiles[lv * 8] + 0) + 1;\r\n\t\t\t\tv2 = *((WORD *)&pMegaTiles[lv * 8] + 1) + 1;\r\n\t\t\t\tv3 = *((WORD *)&pMegaTiles[lv * 8] + 2) + 1;\r\n\t\t\t\tv4 = *((WORD *)&pMegaTiles[lv * 8] + 3) + 1;\r\n\t\t\t} else {\r\n\t\t\t\tv1 = 0;\r\n\t\t\t\tv2 = 0;\r\n\t\t\t\tv3 = 0;\r\n\t\t\t\tv4 = 0;\r\n\t\t\t}\r\n#endif\r\n\t\t\tdPiece[xx][yy] = v1;\r\n\t\t\tdPiece[xx + 1][yy] = v2;\r\n\t\t\tdPiece[xx][yy + 1] = v3;\r\n\t\t\tdPiece[xx + 1][yy + 1] = v4;\r\n\t\t\txx += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\nvoid CreateL4Dungeon(DWORD rseed, int entry)\r\n{\r\n\tSetRndSeed(rseed);\r\n\r\n\tdminx = 16;\r\n\tdminy = 16;\r\n\tdmaxx = 96;\r\n\tdmaxy = 96;\r\n\r\n\tViewX = 40;\r\n\tViewY = 40;\r\n\r\n\tDRLG_InitSetPC();\r\n\tDRLG_LoadL4SP();\r\n\tDRLG_L4(entry);\r\n\tDRLG_L4Pass3();\r\n\tDRLG_FreeL4SP();\r\n\tDRLG_SetPC();\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/drlg_l4.h",
    "content": "/**\r\n * @file drlg_l4.h\r\n *\r\n * Interface of the hell level generation algorithms.\r\n */\r\n#ifndef __DRLG_L4_H__\r\n#define __DRLG_L4_H__\r\n\r\nextern int diabquad1x;\r\nextern int diabquad1y;\r\nextern int diabquad2x;\r\nextern int diabquad2y;\r\nextern int diabquad3x;\r\nextern int diabquad3y;\r\nextern int diabquad4x;\r\nextern int diabquad4y;\r\nvoid CreateL4Dungeon(DWORD rseed, int entry);\r\n\r\n#endif /* __DRLG_L4_H__ */\r\n"
  },
  {
    "path": "Source/dthread.cpp",
    "content": "/**\r\n * @file dthread.cpp\r\n *\r\n * Implementation of functions for updating game state from network commands.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nstatic CCritSect sgMemCrit;\r\nunsigned int glpDThreadId;\r\nTMegaPkt *sgpInfoHead; /* may not be right struct */\r\nBOOLEAN dthread_running;\r\nHANDLE sghWorkToDoEvent;\r\n\r\n/* rdata */\r\nstatic HANDLE sghThread = INVALID_HANDLE_VALUE;\r\n\r\nstatic unsigned int __stdcall dthread_handler(void *data)\r\n{\r\n\tconst char *error_buf;\r\n\tTMegaPkt *pkt;\r\n\tDWORD dwMilliseconds;\r\n\r\n\twhile (dthread_running) {\r\n\t\tif (!sgpInfoHead && WaitForSingleObject(sghWorkToDoEvent, INFINITE) == WAIT_FAILED) {\r\n\t\t\terror_buf = TraceLastError();\r\n\t\t\tapp_fatal(\"dthread4:\\n%s\", error_buf);\r\n\t\t}\r\n\r\n\t\tsgMemCrit.Enter();\r\n\t\tpkt = sgpInfoHead;\r\n\t\tif (sgpInfoHead)\r\n\t\t\tsgpInfoHead = sgpInfoHead->pNext;\r\n\t\telse\r\n\t\t\tResetEvent(sghWorkToDoEvent);\r\n\t\tsgMemCrit.Leave();\r\n\r\n\t\tif (pkt) {\r\n\t\t\tif (pkt->dwSpaceLeft != MAX_PLRS)\r\n\t\t\t\tmulti_send_zero_packet(pkt->dwSpaceLeft, pkt->data[0], &pkt->data[8], *(DWORD *)&pkt->data[4]);\r\n\r\n\t\t\tdwMilliseconds = 1000 * *(DWORD *)&pkt->data[4] / gdwDeltaBytesSec;\r\n\t\t\tif (dwMilliseconds >= 1)\r\n\t\t\t\tdwMilliseconds = 1;\r\n\r\n\t\t\tmem_free_dbg(pkt);\r\n\r\n\t\t\tif (dwMilliseconds)\r\n\t\t\t\tSleep(dwMilliseconds);\r\n\t\t}\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\nvoid dthread_remove_player(int pnum)\r\n{\r\n\tTMegaPkt *pkt;\r\n\r\n\tsgMemCrit.Enter();\r\n\tfor (pkt = sgpInfoHead; pkt; pkt = pkt->pNext) {\r\n\t\tif (pkt->dwSpaceLeft == pnum)\r\n\t\t\tpkt->dwSpaceLeft = MAX_PLRS;\r\n\t}\r\n\tsgMemCrit.Leave();\r\n}\r\n\r\nvoid dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen)\r\n{\r\n\tTMegaPkt *pkt;\r\n\tTMegaPkt *p;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tpkt = (TMegaPkt *)DiabloAllocPtr(dwLen + 20);\r\n\tpkt->pNext = NULL;\r\n\tpkt->dwSpaceLeft = pnum;\r\n\tpkt->data[0] = cmd;\r\n\t*(DWORD *)&pkt->data[4] = dwLen;\r\n\tmemcpy(&pkt->data[8], pbSrc, dwLen);\r\n\tsgMemCrit.Enter();\r\n\tp = (TMegaPkt *)&sgpInfoHead;\r\n\twhile (p->pNext) {\r\n\t\tp = p->pNext;\r\n\t}\r\n\tp->pNext = pkt;\r\n\r\n\tSetEvent(sghWorkToDoEvent);\r\n\tsgMemCrit.Leave();\r\n}\r\n\r\nvoid dthread_start()\r\n{\r\n\tconst char *error_buf;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tsghWorkToDoEvent = CreateEvent(NULL, TRUE, FALSE, NULL);\r\n\tif (sghWorkToDoEvent == NULL) {\r\n\t\terror_buf = TraceLastError();\r\n\t\tapp_fatal(\"dthread:1\\n%s\", error_buf);\r\n\t}\r\n\r\n\tdthread_running = TRUE;\r\n\r\n\tsghThread = (HANDLE)_beginthreadex(NULL, 0, dthread_handler, NULL, 0, &glpDThreadId);\r\n\tif (sghThread == INVALID_HANDLE_VALUE) {\r\n\t\terror_buf = TraceLastError();\r\n\t\tapp_fatal(\"dthread2:\\n%s\", error_buf);\r\n\t}\r\n}\r\n\r\nvoid dthread_cleanup()\r\n{\r\n\tconst char *error_buf;\r\n\tTMegaPkt *tmp;\r\n\r\n\tif (sghWorkToDoEvent == NULL) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tdthread_running = FALSE;\r\n\tSetEvent(sghWorkToDoEvent);\r\n\tif (sghThread != INVALID_HANDLE_VALUE && glpDThreadId != GetCurrentThreadId()) {\r\n\t\tif (WaitForSingleObject(sghThread, INFINITE) == WAIT_FAILED) {\r\n\t\t\terror_buf = TraceLastError();\r\n\t\t\tapp_fatal(\"dthread3:\\n(%s)\", error_buf);\r\n\t\t}\r\n\t\tCloseHandle(sghThread);\r\n\t\tsghThread = INVALID_HANDLE_VALUE;\r\n\t}\r\n\tCloseHandle(sghWorkToDoEvent);\r\n\tsghWorkToDoEvent = NULL;\r\n\r\n\twhile (sgpInfoHead) {\r\n\t\ttmp = sgpInfoHead->pNext;\r\n\t\tMemFreeDbg(sgpInfoHead);\r\n\t\tsgpInfoHead = tmp;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/dthread.h",
    "content": "/**\r\n * @file dthread.h\r\n *\r\n * Interface of functions for updating game state from network commands.\r\n */\r\n#ifndef __DTHREAD_H__\r\n#define __DTHREAD_H__\r\n\r\nvoid dthread_remove_player(int pnum);\r\nvoid dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen);\r\nvoid dthread_start();\r\nvoid dthread_cleanup();\r\n\r\n/* data */\r\n\r\n#endif /* __DTHREAD_H__ */\r\n"
  },
  {
    "path": "Source/dx.cpp",
    "content": "/**\r\n * @file dx.cpp\r\n *\r\n * Implementation of functions setting up the graphics pipeline.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nBYTE *sgpBackBuf;\r\nLPDIRECTDRAW lpDDInterface;\r\nIDirectDrawPalette *lpDDPalette;\r\nint sgdwLockCount;\r\nBYTE *gpBuffer;\r\nIDirectDrawSurface *lpDDSBackBuf;\r\nIDirectDrawSurface *lpDDSPrimary;\r\n#ifdef _DEBUG\r\nint locktbl[256];\r\n#endif\r\nstatic CCritSect sgMemCrit;\r\nchar gbBackBuf;\r\nchar gbEmulate;\r\nHMODULE ghDiabMod;\r\n\r\nstatic void dx_create_back_buffer()\r\n{\r\n\tDDSCAPS caps;\r\n\tHRESULT error_code;\r\n\tDDSURFACEDESC ddsd;\r\n\r\n\terror_code = lpDDSPrimary->GetCaps(&caps);\r\n\tif (error_code != DD_OK)\r\n\t\tDDErrMsg(error_code, 59, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\");\r\n\r\n\tif (!gbBackBuf) {\r\n\t\tddsd.dwSize = sizeof(ddsd);\r\n\t\terror_code = lpDDSPrimary->Lock(NULL, &ddsd, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL);\r\n\t\tif (error_code == DD_OK) {\r\n\t\t\tlpDDSPrimary->Unlock(NULL);\r\n\t\t\tsgpBackBuf = (BYTE *)DiabloAllocPtr(BUFFER_HEIGHT * BUFFER_WIDTH);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (error_code != DDERR_CANTLOCKSURFACE)\r\n\t\t\tErrDlg(IDD_DIALOG1, error_code, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 81);\r\n\t}\r\n\r\n\tmemset(&ddsd, 0, sizeof(ddsd));\r\n\tddsd.dwSize = sizeof(ddsd);\r\n\tddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;\r\n\tddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN;\r\n\tddsd.dwHeight = BUFFER_HEIGHT;\r\n\tddsd.dwWidth = BUFFER_WIDTH;\r\n\tddsd.lPitch = BUFFER_WIDTH;\r\n\tddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat);\r\n\terror_code = lpDDSPrimary->GetPixelFormat(&ddsd.ddpfPixelFormat);\r\n\tif (error_code != DD_OK)\r\n\t\tErrDlg(IDD_DIALOG1, error_code, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 94);\r\n\terror_code = lpDDInterface->CreateSurface(&ddsd, &lpDDSBackBuf, NULL);\r\n\tif (error_code != DD_OK)\r\n\t\tErrDlg(IDD_DIALOG1, error_code, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 96);\r\n}\r\n\r\nstatic void dx_create_primary_surface()\r\n{\r\n\tDDSURFACEDESC ddsd;\r\n\tHRESULT error_code;\r\n\r\n\tmemset(&ddsd, 0, sizeof(ddsd));\r\n\tddsd.dwSize = sizeof(ddsd);\r\n\tddsd.dwFlags = DDSD_CAPS;\r\n\tddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;\r\n\terror_code = lpDDInterface->CreateSurface(&ddsd, &lpDDSPrimary, NULL);\r\n\tif (error_code != DD_OK)\r\n\t\tErrDlg(IDD_DIALOG1, error_code, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 109);\r\n}\r\n\r\nstatic HRESULT dx_DirectDrawCreate(LPGUID guid, LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter)\r\n{\r\n\tHRESULT(WINAPI * DirectDrawCreate)\r\n\t(LPGUID lpGuid, LPDIRECTDRAW * lplpDD, LPUNKNOWN pUnkOuter);\r\n\r\n\tif (ghDiabMod == NULL) {\r\n\t\tghDiabMod = LoadLibrary(\"ddraw.dll\");\r\n\t}\r\n\tif (ghDiabMod == NULL) {\r\n\t\tErrDlg(IDD_DIALOG4, GetLastError(), \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 122);\r\n\t}\r\n\r\n\tDirectDrawCreate = (HRESULT(WINAPI *)(LPGUID, LPDIRECTDRAW *, LPUNKNOWN))GetProcAddress(ghDiabMod, \"DirectDrawCreate\");\r\n\tif (DirectDrawCreate == NULL) {\r\n\t\tErrDlg(IDD_DIALOG4, GetLastError(), \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 127);\r\n\t}\r\n\treturn DirectDrawCreate(guid, lplpDD, pUnkOuter);\r\n}\r\n\r\nvoid dx_init(HWND hWnd)\r\n{\r\n\tHRESULT hDDVal;\r\n\tint winw, winh;\r\n\tBOOL bSuccess;\r\n\tGUID *lpGUID;\r\n\r\n\tassert(!gpBuffer);\r\n\tassert(!sgdwLockCount);\r\n\tassert(!sgpBackBuf);\r\n\r\n\tSetFocus(hWnd);\r\n\tShowWindow(hWnd, SW_SHOWNORMAL);\r\n\r\n\tlpGUID = NULL;\r\n\tif (gbEmulate) {\r\n\t\tlpGUID = (GUID *)DDCREATE_EMULATIONONLY;\r\n\t}\r\n\thDDVal = dx_DirectDrawCreate(lpGUID, &lpDDInterface, NULL);\r\n\tif (hDDVal != DD_OK) {\r\n\t\tErrDlg(IDD_DIALOG1, hDDVal, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 149);\r\n\t}\r\n\r\n#ifdef COLORFIX\r\n#ifdef __DDRAWI_INCLUDED__\r\n\t((LPDDRAWI_DIRECTDRAW_INT)lpDDInterface)->lpLcl->dwAppHackFlags |= 0x800;\r\n#else\r\n\t((DWORD **)lpDDInterface)[1][18] |= 0x800;\r\n#endif\r\n#endif\r\n\r\n#ifndef _DEBUG\r\n\tfullscreen = TRUE;\r\n#endif\r\n\tif (!fullscreen) {\r\n\t\thDDVal = lpDDInterface->SetCooperativeLevel(hWnd, DDSCL_NORMAL | DDSCL_ALLOWREBOOT);\r\n\t\tif (hDDVal == DDERR_EXCLUSIVEMODEALREADYSET) {\r\n\t\t\tTriggerBreak();\r\n\t\t} else if (hDDVal != DD_OK) {\r\n\t\t\tErrDlg(IDD_DIALOG1, hDDVal, \"C:\\\\Diablo\\\\Direct\\\\dx.cpp\", 155);\r\n\t\t}\r\n\t\tSetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);\r\n\t} else {\r\n\t\thDDVal = lpDDInterface->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT | DDSCL_FULLSCREEN);\r\n\t\tif (hDDVal == DDERR_EXCLUSIVEMODEALREADYSET) {\r\n\t\t\tTriggerBreak();\r\n\t\t} else if (hDDVal != DD_OK) {\r\n\t\t\tErrDlg(IDD_DIALOG1, hDDVal, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 170);\r\n\t\t}\r\n\t\thDDVal = lpDDInterface->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP);\r\n\t\tif (hDDVal != DD_OK) {\r\n\t\t\twinw = GetSystemMetrics(SM_CXSCREEN);\r\n\t\t\twinh = GetSystemMetrics(SM_CYSCREEN);\r\n\t\t\thDDVal = lpDDInterface->SetDisplayMode(winw, winh, SCREEN_BPP);\r\n\t\t}\r\n\t\tif (hDDVal != DD_OK) {\r\n\t\t\tErrDlg(IDD_DIALOG1, hDDVal, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\", 183);\r\n\t\t}\r\n\t}\r\n\r\n\tdx_create_primary_surface();\r\n\tpalette_init();\r\n\tGdiSetBatchLimit(1);\r\n\tdx_create_back_buffer();\r\n\tbSuccess = SDrawManualInitialize(hWnd, lpDDInterface, lpDDSPrimary, NULL, NULL, lpDDSBackBuf, lpDDPalette, NULL);\r\n\tassert(bSuccess);\r\n}\r\n\r\nstatic void lock_buf_priv()\r\n{\r\n\tDDSURFACEDESC ddsd;\r\n\tHRESULT error_code;\r\n\r\n\tsgMemCrit.Enter();\r\n\tif (sgpBackBuf != NULL) {\r\n\t\tgpBuffer = sgpBackBuf;\r\n\t\tsgdwLockCount++;\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (lpDDSBackBuf == NULL) {\r\n\t\tSleep(20000);\r\n\t\tapp_fatal(\"lock_buf_priv\");\r\n\t\tsgdwLockCount++;\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (sgdwLockCount != 0) {\r\n\t\tsgdwLockCount++;\r\n\t\treturn;\r\n\t}\r\n\tddsd.dwSize = sizeof(ddsd);\r\n\terror_code = lpDDSBackBuf->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);\r\n\tif (error_code != DD_OK)\r\n\t\tDDErrMsg(error_code, 235, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\");\r\n\r\n\tgpBuffer = (BYTE *)ddsd.lpSurface;\r\n\tgpBufEnd += (size_t)ddsd.lpSurface;\r\n\tsgdwLockCount++;\r\n}\r\n\r\nvoid lock_buf(BYTE idx)\r\n{\r\n#ifdef _DEBUG\r\n\t++locktbl[idx];\r\n#endif\r\n\tlock_buf_priv();\r\n}\r\n\r\nstatic void unlock_buf_priv()\r\n{\r\n\tHRESULT error_code;\r\n\r\n\tif (sgdwLockCount == 0)\r\n\t\tapp_fatal(\"draw main unlock error\");\r\n\tif (gpBuffer == NULL)\r\n\t\tapp_fatal(\"draw consistency error\");\r\n\r\n\tsgdwLockCount--;\r\n\tif (sgdwLockCount == 0) {\r\n\t\tgpBufEnd -= (size_t)gpBuffer;\r\n\t\tgpBuffer = NULL;\r\n\t\tif (sgpBackBuf == NULL) {\r\n\t\t\terror_code = lpDDSBackBuf->Unlock(NULL);\r\n\t\t\tif (error_code != DD_OK)\r\n\t\t\t\tDDErrMsg(error_code, 273, \"C:\\\\Src\\\\Diablo\\\\Source\\\\dx.cpp\");\r\n\t\t}\r\n\t}\r\n\tsgMemCrit.Leave();\r\n}\r\n\r\nvoid unlock_buf(BYTE idx)\r\n{\r\n#ifdef _DEBUG\r\n\tif (!locktbl[idx])\r\n\t\tapp_fatal(\"Draw lock underflow: 0x%x\", idx);\r\n\t--locktbl[idx];\r\n#endif\r\n\tunlock_buf_priv();\r\n}\r\n\r\nvoid dx_cleanup()\r\n{\r\n\tif (ghMainWnd)\r\n\t\tShowWindow(ghMainWnd, SW_HIDE);\r\n\tSDrawDestroy();\r\n\tsgMemCrit.Enter();\r\n\tif (sgpBackBuf != NULL) {\r\n\t\tMemFreeDbg(sgpBackBuf);\r\n\t} else if (lpDDSBackBuf != NULL) {\r\n\t\tlpDDSBackBuf->Release();\r\n\t\tlpDDSBackBuf = NULL;\r\n\t}\r\n\tsgdwLockCount = 0;\r\n\tgpBuffer = NULL;\r\n\tsgMemCrit.Leave();\r\n\tif (lpDDSPrimary) {\r\n\t\tlpDDSPrimary->Release();\r\n\t\tlpDDSPrimary = NULL;\r\n\t}\r\n\tif (lpDDPalette) {\r\n\t\tlpDDPalette->Release();\r\n\t\tlpDDPalette = NULL;\r\n\t}\r\n\tif (lpDDInterface) {\r\n\t\tlpDDInterface->Release();\r\n\t\tlpDDInterface = NULL;\r\n\t}\r\n}\r\n\r\nvoid dx_reinit()\r\n{\r\n\tint lockCount;\r\n\r\n\tsgMemCrit.Enter();\r\n\tClearCursor();\r\n\tlockCount = sgdwLockCount;\r\n\r\n\twhile (sgdwLockCount != 0)\r\n\t\tunlock_buf_priv();\r\n\r\n\tdx_cleanup();\r\n\r\n\tforce_redraw = 255;\r\n\r\n\tdx_init(ghMainWnd);\r\n\r\n\twhile (lockCount-- != 0) {\r\n\t\tlock_buf_priv();\r\n\t}\r\n\r\n\tsgMemCrit.Leave();\r\n}\r\n\r\n/* check extern remove stub */\r\nvoid j_dx_reinit()\r\n{\r\n\tdx_reinit();\r\n}\r\n"
  },
  {
    "path": "Source/dx.h",
    "content": "/**\r\n * @file dx.h\r\n *\r\n * Interface of functions setting up the graphics pipeline.\r\n */\r\n#ifndef __DX_H__\r\n#define __DX_H__\r\n\r\nextern IDirectDraw *lpDDInterface;\r\nextern IDirectDrawPalette *lpDDPalette;\r\nextern BYTE *gpBuffer;\r\nextern IDirectDrawSurface *lpDDSBackBuf;\r\nextern IDirectDrawSurface *lpDDSPrimary;\r\nextern char gbBackBuf;\r\nextern char gbEmulate;\r\n\r\nvoid dx_init(HWND hWnd);\r\nvoid lock_buf(BYTE idx);\r\nvoid unlock_buf(BYTE idx);\r\nvoid dx_cleanup();\r\nvoid dx_reinit();\r\nvoid j_dx_reinit();\r\n\r\n#endif /* __DX_H__ */\r\n"
  },
  {
    "path": "Source/effects.cpp",
    "content": "/**\r\n * @file effects.cpp\r\n *\r\n * Implementation of functions for loading and playing sounds.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nint sfxdelay;\r\nint sfxdnum;\r\n/** A handle to the current sound effect playing. */\r\nHANDLE sghStream;\r\n/** Specifies the sound file and the playback state of the current sound effect. */\r\nTSFX *sgpStreamSFX;\r\n\r\n/**\r\n * Monster sound type prefix\r\n * a: Attack\r\n * h: Hit\r\n * d: Death\r\n * s: Special\r\n */\r\nconst char MonstSndChar[] = { 'a', 'h', 'd', 's' };\r\n\r\n/* data */\r\n/** List of all sounds, except monsters and music */\r\nTSFX sgSFX[] = {\r\n\t// clang-format off\r\n\t// bFlags,                   pszName,                       pSnd\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Walk1.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Walk2.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Walk3.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Walk4.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\BFire.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Fmag.wav\",         NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Tmag.wav\",         NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Lghit.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Lghit1.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Swing.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Swing2.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Dead.wav\",         NULL },\r\n#ifdef HELLFIRE\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Sting1.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\FBallBow.wav\",     NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Misc\\\\Questdon.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Armrfkd.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Barlfire.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Barrel.wav\",      NULL },\r\n#ifdef HELLFIRE\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\PodPop8.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\PodPop5.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\UrnPop3.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\UrnPop2.wav\",     NULL },\r\n#endif\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Bhit.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Bhit1.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Chest.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Doorclos.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Dooropen.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipanvl.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipaxe.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipblst.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipbody.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipbook.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipbow.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipcap.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipharm.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Fliplarm.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipmag.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipmag1.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipmush.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flippot.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipring.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Fliprock.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipscrl.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipshld.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipsign.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipstaf.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Flipswor.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Gold.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Hlmtfkd.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invanvl.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invaxe.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invblst.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invbody.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invbook.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invbow.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invcap.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invgrab.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invharm.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invlarm.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invmush.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invpot.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invring.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invrock.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invscrol.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invshiel.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invsign.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invstaf.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Invsword.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Lever.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Magic.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Magic1.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Readbook.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Sarc.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Shielfkd.wav\",    NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Swrdfkd.wav\",     NULL },\r\n\t{ sfx_UI,                    \"Sfx\\\\Items\\\\Titlemov.wav\",    NULL },\r\n\t{ sfx_UI,                    \"Sfx\\\\Items\\\\Titlslct.wav\",    NULL },\r\n\t{ sfx_UI,                    \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Trap.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast1.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast10.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast12.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast2.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast3.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast4.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast5.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast6.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast7.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast8.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cast9.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Healing.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Repair.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Acids1.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Acids2.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Apoc.wav\",         NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Arrowall.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Bldboil.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Blodstar.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Blsimpt.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Bonesp.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Bsimpct.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Caldron.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Cbolt.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Chltning.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\DSerp.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Elecimp1.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Elementl.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Ethereal.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Fball.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Fbolt1.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Fbolt2.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Firimp1.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Firimp2.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Flamwave.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Flash.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Fountain.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Golum.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Golumded.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Gshrine.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Guard.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Grdlanch.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Holybolt.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Hyper.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Infravis.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Invisibl.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Invpot.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Lning1.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Ltning.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Mshield.wav\",      NULL },\r\n#ifdef HELLFIRE\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\NestXpld.wav\",     NULL },\r\n#endif\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Nova.wav\",         NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Portal.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Puddle.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Resur.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Scurse.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Scurimp.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Sentinel.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Shatter.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Soulfire.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Spoutlop.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Spoutstr.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Storm.wav\",        NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Trapdis.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Teleport.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Vtheft.wav\",       NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Wallloop.wav\",     NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\Wallstrt.wav\",     NULL },\r\n#ifdef HELLFIRE\r\n\t{ sfx_MISC,                  \"Sfx\\\\Misc\\\\LMag.wav\",         NULL },\r\n#endif\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid01.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid02.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid03.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid04.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid05.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid06.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid07.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid08.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid09.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid10.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid11.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid12.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid13.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid14.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid15.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid16.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid17.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid18.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid19.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid20.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid21.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid22.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid23.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid24.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid25.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid26.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid27.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid28.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid29.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid30.wav\",   NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid31.wav\",   NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid32.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid33.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid34.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid35.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid36.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid37.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid38.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid39.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bmaid40.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith02.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith03.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith04.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith05.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith06.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith07.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith08.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith09.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith10.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith11.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith12.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith13.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith14.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith15.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith16.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith17.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith18.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith19.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith20.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith21.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith22.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith23.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith24.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith25.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith26.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith27.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith28.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith29.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith30.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith31.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith32.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith33.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith34.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith35.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith36.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith37.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith38.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith39.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith40.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith41.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith42.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith43.wav\",  NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith44.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith45.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith46.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith47.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith48.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith49.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith50.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith51.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith52.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith53.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith54.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith55.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Bsmith56.wav\",  NULL },\r\n#endif\r\n\t{ 0,                         \"Sfx\\\\Towners\\\\Cow1.wav\",      NULL },\r\n\t{ 0,                         \"Sfx\\\\Towners\\\\Cow2.wav\",      NULL },\r\n#ifdef HELLFIRE\r\n\t{ 0,                         \"Sfx\\\\Towners\\\\Cow7.wav\",      NULL },\r\n\t{ 0,                         \"Sfx\\\\Towners\\\\Cow8.wav\",      NULL },\r\n#endif\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Deadguy2.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk01.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk02.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk03.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk04.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk05.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk06.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk07.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk08.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk09.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk10.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk11.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk12.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk13.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk14.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk15.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk16.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk17.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk18.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk19.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk20.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk21.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk22.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk23.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk24.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk25.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk26.wav\",   NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk27.wav\",   NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk28.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk29.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk30.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk31.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk32.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk33.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk34.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Drunk35.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer02.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer03.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer04.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer05.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer06.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer07.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer08.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer09.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer10.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer11.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer12.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer13.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer14.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer15.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer16.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer17.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer18.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer19.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer20.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer21.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer22.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer23.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer24.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer25.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer26.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer27.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer28.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer29.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer30.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer31.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer32.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer33.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer34.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer35.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer36.wav\",  NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer37.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer38.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer39.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer40.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer41.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer42.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer43.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer44.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer45.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer46.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Healer47.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy02.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy03.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy04.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy05.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy06.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy07.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy08.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy09.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy10.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy11.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy12.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy13.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy14.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy15.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy16.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy17.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy18.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy19.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy20.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy21.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy22.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy23.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy24.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy25.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy26.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy27.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy28.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy29.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy30.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy31.wav\",  NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy32.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy33.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy34.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy35.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy36.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy37.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy38.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy39.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy40.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy41.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy42.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Pegboy43.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest00.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest02.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest03.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest04.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest05.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest06.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Priest07.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt00.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt02.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt03.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt04.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt05.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt06.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt07.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt08.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt09.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt10.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt11.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt12.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt13.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt14.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt15.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt16.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt17.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt18.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt19.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt20.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt21.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt22.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt23.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt24.wav\",  NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt25.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt26.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt27.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt28.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt29.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt30.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt31.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt32.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt33.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt34.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt35.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt36.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt37.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Storyt38.wav\",  NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown00.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown02.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown03.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown04.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown05.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown06.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown07.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown08.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown09.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown10.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown11.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown12.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown13.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown14.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown15.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown16.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown17.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown18.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown19.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown20.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown21.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown22.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown23.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown24.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown25.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown26.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown27.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown28.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown29.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown30.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown31.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown32.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown33.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown34.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown35.wav\",  NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown36.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown37.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown38.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown39.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown40.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown41.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown42.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown43.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown44.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Tavown45.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch01.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch02.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch03.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch04.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch05.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch06.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch07.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch08.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch09.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch10.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch11.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch12.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch13.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch14.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch15.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch16.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch17.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch18.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch19.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch20.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch21.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch22.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch23.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch24.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch25.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch26.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch27.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch28.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch29.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch30.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch31.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch32.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch33.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch34.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch35.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch36.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch37.wav\",   NULL },\r\n#endif\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch38.wav\",   NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch39.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch40.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch41.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch42.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch43.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch44.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch45.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch46.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch47.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch48.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch49.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Witch50.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Towners\\\\Wound01.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage01.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage02.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage03.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage04.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage05.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage06.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage07.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage08.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage09.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage10.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage11.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage12.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage13.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage14.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage15.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage16.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage17.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage18.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage19.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage20.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage21.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage22.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage23.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage24.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage25.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage26.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage27.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage28.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage29.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage30.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage31.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage32.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage33.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage34.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage35.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage36.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage37.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage38.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage39.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage40.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage41.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage42.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage43.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage44.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage45.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage46.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage47.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage48.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage49.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage50.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage51.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage52.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage53.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage54.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage55.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage56.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage57.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage58.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage59.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage60.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage61.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage62.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage63.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage64.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage65.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage66.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage67.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage68.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage69.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage69b.wav\",  NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage70.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage71.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage72.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage73.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage74.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage75.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage76.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage77.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage78.wav\",   NULL },\r\n\t{ sfx_SORCEROR,              \"Sfx\\\\Sorceror\\\\Mage79.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage80.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage81.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage82.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage83.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage84.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage85.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage86.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage87.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage88.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage89.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage90.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage91.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage92.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage93.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage94.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage95.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage96.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage97.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage98.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage99.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage100.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage101.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_SORCEROR, \"Sfx\\\\Sorceror\\\\Mage102.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue01.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue02.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue03.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue04.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue05.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue06.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue07.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue08.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue09.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue10.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue11.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue12.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue13.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue14.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue15.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue16.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue17.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue18.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue19.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue20.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue21.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue22.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue23.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue24.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue25.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue26.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue27.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue28.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue29.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue30.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue31.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue32.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue33.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue34.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue35.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue36.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue37.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue38.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue39.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue40.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue41.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue42.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue43.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue44.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue45.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue46.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue47.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue48.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue49.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue50.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue51.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue52.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue53.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue54.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue55.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue56.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue57.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue58.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue59.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue60.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue61.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue62.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue63.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue64.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue65.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue66.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue67.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue68.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue69.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue69b.wav\",    NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue70.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue71.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue72.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue73.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue74.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue75.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue76.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue77.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue78.wav\",     NULL },\r\n\t{ sfx_ROGUE,                 \"Sfx\\\\Rogue\\\\Rogue79.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue80.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue81.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue82.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue83.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue84.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue85.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue86.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue87.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue88.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue89.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue90.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue91.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue92.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue93.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue94.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue95.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue96.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue97.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue98.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue99.wav\",     NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue100.wav\",    NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue101.wav\",    NULL },\r\n\t{ sfx_STREAM | sfx_ROGUE,    \"Sfx\\\\Rogue\\\\Rogue102.wav\",    NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior01.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior02.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior03.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior04.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior05.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior06.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior07.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior08.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior09.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior10.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior11.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior12.wav\",  NULL },\r\n#endif\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior13.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior14.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Wario14b.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Wario14c.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior15.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Wario15b.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Wario15c.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior16.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Wario16b.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Wario16c.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior17.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior18.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior19.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior20.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior21.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior22.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior23.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior24.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior25.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior26.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior27.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior28.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior29.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior30.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior31.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior32.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior33.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior34.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior35.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior36.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior37.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior38.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior39.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior40.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior41.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior42.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior43.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior44.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior45.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior46.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior47.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior48.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior49.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior50.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior51.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior52.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior53.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior54.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior55.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior56.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior57.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior58.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior59.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior60.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior61.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior62.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior63.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior64.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior65.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior66.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior67.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior68.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior69.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Wario69b.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior70.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior71.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior72.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior73.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior74.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior75.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior76.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior77.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior78.wav\",  NULL },\r\n\t{ sfx_WARRIOR,               \"Sfx\\\\Warrior\\\\Warior79.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior80.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior81.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior82.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior83.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior84.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior85.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior86.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior87.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior88.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior89.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior90.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior91.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior92.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior93.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior94.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior95.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario95b.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario95c.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario95d.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario95e.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario95f.wav\",  NULL },\r\n#endif\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario96b.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario97.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario98.wav\",   NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Warior99.wav\",  NULL },\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario100.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario101.wav\",  NULL },\r\n\t{ sfx_STREAM | sfx_WARRIOR,  \"Sfx\\\\Warrior\\\\Wario102.wav\",  NULL },\r\n#endif\r\n#ifdef HELLFIRE\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk01.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk08.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk09.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk10.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk11.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk12.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk13.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk14.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk15.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk16.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk24.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk27.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk29.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk34.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk35.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk43.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk46.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk49.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk50.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk52.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk54.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk55.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk56.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk61.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk62.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk68.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk69.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk69b.wav\",      NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk70.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk71.wav\",       NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_MONK,                  \"Sfx\\\\Monk\\\\Monk79.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk80.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk82.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk83.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk87.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk88.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk89.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk91.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk92.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk94.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk95.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk96.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk97.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk98.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Monk\\\\Monk99.wav\",       NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n\t{ sfx_STREAM | sfx_MONK,     \"Sfx\\\\Misc\\\\blank.wav\",        NULL },\r\n#endif\r\n#ifndef SPAWN\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar01.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar02.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar03.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar04.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar05.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar06.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar07.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar08.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Narrator\\\\Nar09.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Misc\\\\Lvl16int.wav\",     NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Butcher.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Garbud01.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Garbud02.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Garbud03.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Garbud04.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Izual01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Lach01.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Lach02.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Lach03.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Laz01.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Laz02.wav\",    NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Sking01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Snot01.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Snot02.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Snot03.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Warlrd01.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Wlock01.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Zhar01.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\Zhar02.wav\",   NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Monsters\\\\DiabloD.wav\",  NULL },\r\n#endif\r\n#ifdef HELLFIRE\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer1.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer2.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer2A.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer3.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer4.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer5.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer6.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer7.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer8.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Farmer9.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\TEDDYBR1.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\TEDDYBR2.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\TEDDYBR3.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\TEDDYBR4.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\DEFILER1.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\DEFILER2.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\DEFILER3.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\DEFILER4.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\DEFILER8.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\DEFILER6.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\DEFILER7.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\NAKRUL1.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\NAKRUL2.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\NAKRUL3.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\NAKRUL4.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\NAKRUL5.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\NAKRUL6.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\NARATR3.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT1.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT2.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT3.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT4.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT4A.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT5.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT6.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT7.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT8.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT9.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT10.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT11.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\COWSUT12.wav\", NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Skljrn1.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Naratr6.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Naratr7.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Naratr8.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Naratr5.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Naratr9.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\Naratr4.wav\",  NULL },\r\n\t{ sfx_STREAM,                \"Sfx\\\\Hellfire\\\\TRADER1.wav\",  NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Cropen.wav\",      NULL },\r\n\t{ sfx_MISC,                  \"Sfx\\\\Items\\\\Crclos.wav\",      NULL },\r\n#endif\r\n\t// clang-format on\r\n};\r\n\r\n#ifdef HELLFIRE\r\n#define PLRSFXS (sfx_WARRIOR | sfx_ROGUE | sfx_SORCEROR | sfx_MONK)\r\n#else\r\n#define PLRSFXS (sfx_WARRIOR | sfx_ROGUE | sfx_SORCEROR)\r\n#endif\r\n\r\nBOOL effect_is_playing(int nSFX)\r\n{\r\n\tTSFX *sfx = &sgSFX[nSFX];\r\n\tif (sfx->pSnd)\r\n\t\treturn snd_playing(sfx->pSnd);\r\n\r\n\tif (sfx->bFlags & sfx_STREAM)\r\n\t\treturn sfx == sgpStreamSFX;\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid stream_stop()\r\n{\r\n\tif (sghStream) {\r\n\t\tSFileDdaEnd(sghStream);\r\n\t\tSFileCloseFile(sghStream);\r\n\t\tsghStream = NULL;\r\n\t\tsgpStreamSFX = NULL;\r\n\t}\r\n}\r\n\r\nstatic void stream_play(TSFX *pSFX, int lVolume, int lPan)\r\n{\r\n\tBOOL success;\r\n\r\n\tassert(pSFX);\r\n\tassert(pSFX->bFlags & sfx_STREAM);\r\n\tstream_stop();\r\n\tlVolume += sound_get_or_set_sound_volume(1);\r\n\tif (lVolume >= VOLUME_MIN) {\r\n\t\tif (lVolume > VOLUME_MAX)\r\n\t\t\tlVolume = VOLUME_MAX;\r\n#ifdef _DEBUG\r\n\t\tSFileEnableDirectAccess(FALSE);\r\n#endif\r\n\t\tsuccess = SFileOpenFile(pSFX->pszName, &sghStream);\r\n#ifdef _DEBUG\r\n\t\tSFileEnableDirectAccess(TRUE);\r\n#endif\r\n\t\tif (!success) {\r\n\t\t\tsghStream = NULL;\r\n\t\t} else {\r\n\t\t\tif (!SFileDdaBeginEx(sghStream, 0x40000, 0, 0, lVolume, lPan, 0))\r\n\t\t\t\tstream_stop();\r\n\t\t\telse\r\n\t\t\t\tsgpStreamSFX = pSFX;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void stream_update()\r\n{\r\n\tDWORD current, end;\r\n\r\n\tif (sghStream != NULL && SFileDdaGetPos(sghStream, &current, &end) && current >= end) {\r\n\t\tstream_stop();\r\n\t}\r\n}\r\n\r\nstatic void sfx_stop()\r\n{\r\n\tint i;\r\n\tTSFX *snd;\r\n\r\n\tsnd = &sgSFX[0];\r\n\tfor (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {\r\n\t\tif (snd->pSnd)\r\n\t\t\tsnd_stop_snd(snd->pSnd);\r\n\t\tsnd++;\r\n\t}\r\n}\r\n\r\nvoid InitMonsterSND(int monst)\r\n{\r\n\tTSnd *pSnd;\r\n\tchar name[MAX_PATH];\r\n\tchar *path;\r\n\tint mtype, i, j;\r\n\r\n\tif (!gbSndInited) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmtype = Monsters[monst].mtype;\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tif (MonstSndChar[i] != 's' || monsterdata[mtype].snd_special) {\r\n\t\t\tfor (j = 0; j < 2; j++) {\r\n\t\t\t\tsprintf(name, monsterdata[mtype].sndfile, MonstSndChar[i], j + 1);\r\n\t\t\t\tpath = (char *)DiabloAllocPtr(strlen(name) + 1);\r\n\t\t\t\tstrcpy(path, name);\r\n\t\t\t\tpSnd = sound_file_load(path);\r\n\t\t\t\tMonsters[monst].Snds[i][j] = pSnd;\r\n\t\t\t\tif (!pSnd)\r\n\t\t\t\t\tmem_free_dbg(path);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid FreeMonsterSnd()\r\n{\r\n\tint mtype, i, j, k;\r\n\tconst char *file;\r\n\tTSnd *pSnd;\r\n\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tmtype = Monsters[i].mtype;\r\n\t\tfor (j = 0; j < 4; ++j) {\r\n\t\t\tfor (k = 0; k < 2; ++k) {\r\n\t\t\t\tpSnd = Monsters[i].Snds[j][k];\r\n\t\t\t\tif (pSnd) {\r\n\t\t\t\t\tMonsters[i].Snds[j][k] = NULL;\r\n\t\t\t\t\tfile = pSnd->sound_path;\r\n\t\t\t\t\tpSnd->sound_path = NULL;\r\n\t\t\t\t\tsound_file_cleanup(pSnd);\r\n\r\n\t\t\t\t\t// pSnd->sound_path is malloc'd (but only for monsters).\r\n\t\t\t\t\tmem_free_dbg(const_cast<char *>(file));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan)\r\n{\r\n\tint pan, volume;\r\n\r\n\tx -= plr[myplr]._px;\r\n\ty -= plr[myplr]._py;\r\n\r\n\tpan = (x - y) * 256;\r\n\t*plPan = pan;\r\n\r\n\tif (abs(pan) > 6400)\r\n\t\treturn FALSE;\r\n\r\n\tvolume = abs(x) > abs(y) ? abs(x) : abs(y);\r\n\tvolume *= 64;\r\n\t*plVolume = volume;\r\n\r\n\tif (volume >= 6400)\r\n\t\treturn FALSE;\r\n\r\n\t*plVolume = -volume;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y)\r\n{\r\n\tint lPan, lVolume;\r\n\r\n\tif (plr[myplr].pLvlLoad && gbMaxPlayers != 1) {\r\n\t\treturn;\r\n\t}\r\n\tif (!gbSndInited || !gbSoundOn || gbBufferMsgs) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!(pSFX->bFlags & (sfx_STREAM | sfx_MISC)) && pSFX->pSnd != 0 && snd_playing(pSFX->pSnd)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlPan = 0;\r\n\tlVolume = 0;\r\n\tif (loc && !calc_snd_position(x, y, &lVolume, &lPan)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (pSFX->bFlags & sfx_STREAM) {\r\n\t\tstream_play(pSFX, lVolume, lPan);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!pSFX->pSnd)\r\n\t\tpSFX->pSnd = sound_file_load(pSFX->pszName);\r\n\r\n\tif (pSFX->pSnd)\r\n\t\tsnd_play_snd(pSFX->pSnd, lVolume, lPan);\r\n}\r\n\r\nvoid PlayEffect(int i, int mode)\r\n{\r\n\tint sndIdx, mi, lVolume, lPan;\r\n\tTSnd *snd;\r\n\r\n\tif (plr[myplr].pLvlLoad) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tsndIdx = random_(164, 2);\r\n\tif (!gbSndInited || !gbSoundOn || gbBufferMsgs) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmi = monster[i]._mMTidx;\r\n\tsnd = Monsters[mi].Snds[mode][sndIdx];\r\n\tif (!snd || snd_playing(snd)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!calc_snd_position(monster[i]._mx, monster[i]._my, &lVolume, &lPan))\r\n\t\treturn;\r\n\r\n\tsnd_play_snd(snd, lVolume, lPan);\r\n}\r\n\r\nstatic int RndSFX(int psfx)\r\n{\r\n\tint nRand;\r\n\r\n\tif (psfx == PS_WARR69)\r\n\t\tnRand = 2;\r\n\telse if (psfx == PS_WARR14)\r\n\t\tnRand = 3;\r\n\telse if (psfx == PS_WARR15)\r\n\t\tnRand = 3;\r\n\telse if (psfx == PS_WARR16)\r\n\t\tnRand = 3;\r\n#ifndef SPAWN\r\n\telse if (psfx == PS_MAGE69)\r\n\t\tnRand = 2;\r\n\telse if (psfx == PS_ROGUE69)\r\n\t\tnRand = 2;\r\n#endif\r\n#ifdef HELLFIRE\r\n\telse if (psfx == PS_MONK69)\r\n\t\tnRand = 2;\r\n#endif\r\n\telse if (psfx == PS_SWING)\r\n\t\tnRand = 2;\r\n\telse if (psfx == LS_ACID)\r\n\t\tnRand = 2;\r\n\telse if (psfx == IS_FMAG)\r\n\t\tnRand = 2;\r\n\telse if (psfx == IS_MAGIC)\r\n\t\tnRand = 2;\r\n\telse if (psfx == IS_BHIT)\r\n\t\tnRand = 2;\r\n#ifndef SPAWN\r\n\telse if (psfx == PS_WARR2)\r\n\t\tnRand = 3;\r\n#endif\r\n\telse\r\n\t\treturn psfx;\r\n\treturn psfx + random_(165, nRand);\r\n}\r\n\r\nvoid PlaySFX(int psfx)\r\n{\r\n\tpsfx = RndSFX(psfx);\r\n\tPlaySFX_priv(&sgSFX[psfx], FALSE, 0, 0);\r\n}\r\n\r\nvoid PlaySfxLoc(int psfx, int x, int y)\r\n{\r\n\tTSnd *pSnd;\r\n\r\n\tpsfx = RndSFX(psfx);\r\n\r\n\tif (psfx >= 0 && psfx <= 3) {\r\n\t\tpSnd = sgSFX[psfx].pSnd;\r\n\t\tif (pSnd)\r\n\t\t\tpSnd->start_tc = 0;\r\n\t}\r\n\r\n\tPlaySFX_priv(&sgSFX[psfx], TRUE, x, y);\r\n}\r\n\r\nvoid sound_stop()\r\n{\r\n\tint i, j, k;\r\n\r\n\tsnd_update(TRUE);\r\n\tstream_stop();\r\n\tsfx_stop();\r\n\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tfor (j = 0; j < 4; j++) {\r\n\t\t\tfor (k = 0; k < 2; k++) {\r\n\t\t\t\tsnd_stop_snd(Monsters[i].Snds[j][k]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid sound_update()\r\n{\r\n\tif (!gbSndInited) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tsnd_update(FALSE);\r\n\tstream_update();\r\n}\r\n\r\nvoid effects_cleanup_sfx()\r\n{\r\n\tDWORD i;\r\n\r\n\tsound_stop();\r\n\r\n\tfor (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {\r\n\t\tif (sgSFX[i].pSnd) {\r\n\t\t\tsound_file_cleanup(sgSFX[i].pSnd);\r\n\t\t\tsgSFX[i].pSnd = NULL;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void priv_sound_init(BYTE bLoadMask)\r\n{\r\n\tBYTE pc;\r\n\tDWORD i;\r\n\r\n\tif (!gbSndInited) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tpc = bLoadMask & PLRSFXS;\r\n\tbLoadMask ^= pc;\r\n\r\n\tfor (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {\r\n\t\tif (sgSFX[i].pSnd) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (sgSFX[i].bFlags & sfx_STREAM) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (bLoadMask && !(sgSFX[i].bFlags & bLoadMask)) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (sgSFX[i].bFlags & PLRSFXS && !(sgSFX[i].bFlags & pc)) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tsgSFX[i].pSnd = sound_file_load(sgSFX[i].pszName);\r\n\t}\r\n}\r\n\r\nvoid sound_init()\r\n{\r\n\tBYTE mask = 0;\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tmask = PLRSFXS;\r\n\t} else if (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\tmask = sfx_WARRIOR;\r\n\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\tmask = sfx_ROGUE;\r\n\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\tmask = sfx_SORCEROR;\r\n#ifdef HELLFIRE\r\n\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\tmask = sfx_MONK;\r\n\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\tmask = sfx_ROGUE;\r\n\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\tmask = sfx_WARRIOR;\r\n#endif\r\n\t} else {\r\n\t\tapp_fatal(\"effects:1\");\r\n\t}\r\n\r\n\tpriv_sound_init(mask);\r\n}\r\n\r\nvoid ui_sound_init()\r\n{\r\n\tpriv_sound_init(sfx_UI);\r\n}\r\n\r\nvoid __stdcall effects_play_sound(const char *snd_file)\r\n{\r\n\tDWORD i;\r\n\r\n\tif (!gbSndInited || !gbSoundOn) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {\r\n\t\tif (!_strcmpi(sgSFX[i].pszName, snd_file) && sgSFX[i].pSnd) {\r\n\t\t\tif (!snd_playing(sgSFX[i].pSnd))\r\n\t\t\t\tsnd_play_snd(sgSFX[i].pSnd, 0, 0);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/effects.h",
    "content": "/**\r\n * @file effects.h\r\n *\r\n * Interface of functions for loading and playing sounds.\r\n */\r\n#ifndef __EFFECTS_H__\r\n#define __EFFECTS_H__\r\n\r\nextern int sfxdelay;\r\nextern int sfxdnum;\r\n\r\nBOOL effect_is_playing(int nSFX);\r\nvoid stream_stop();\r\nvoid InitMonsterSND(int monst);\r\nvoid FreeMonsterSnd();\r\nvoid PlayEffect(int i, int mode);\r\nvoid PlaySFX(int psfx);\r\nvoid PlaySfxLoc(int psfx, int x, int y);\r\nvoid sound_stop();\r\nvoid sound_update();\r\nvoid effects_cleanup_sfx();\r\nvoid sound_init();\r\nvoid ui_sound_init();\r\nvoid __stdcall effects_play_sound(const char *snd_file);\r\n\r\n#endif /* __EFFECTS_H__ */\r\n"
  },
  {
    "path": "Source/encrypt.cpp",
    "content": "/**\r\n * @file encrypt.cpp\r\n *\r\n * Implementation of functions for compression and decompressing MPQ data.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/PKWare/pkware.h\"\r\n\r\nDWORD hashtable[5][256];\r\n\r\nvoid Decrypt(DWORD *castBlock, DWORD size, DWORD key)\r\n{\r\n\tDWORD seed, i;\r\n\r\n\tseed = 0xEEEEEEEE;\r\n\ti = size >> 2;\r\n\twhile (i--) {\r\n\t\tseed += hashtable[4][(key & 0xFF)];\r\n\t\t*castBlock ^= seed + key;\r\n\t\tseed += *castBlock + (seed << 5) + 3;\r\n\t\tcastBlock++;\r\n\t\tkey = (((key << 0x15) ^ 0xFFE00000) + 0x11111111) | (key >> 0x0B);\r\n\t}\r\n}\r\n\r\nvoid Encrypt(DWORD *castBlock, DWORD size, DWORD key)\r\n{\r\n\tDWORD seed, i, ch;\r\n\r\n\tseed = 0xEEEEEEEE;\r\n\ti = size >> 2;\r\n\twhile (i--) {\r\n\t\tch = *castBlock;\r\n\t\tseed += hashtable[4][(key & 0xFF)];\r\n\t\t*castBlock ^= seed + key;\r\n\t\tcastBlock++;\r\n\t\tseed += ch + (seed << 5) + 3;\r\n\t\tkey = ((key << 0x15) ^ 0xFFE00000) + 0x11111111 | (key >> 0x0B);\r\n\t}\r\n}\r\n\r\nDWORD Hash(const char *s, int type)\r\n{\r\n\tchar ch;\r\n\tDWORD seed1, seed2;\r\n\r\n\tseed1 = 0x7FED7FED;\r\n\tseed2 = 0xEEEEEEEE;\r\n\twhile (s != NULL && *s) {\r\n\t\tch = *s++;\r\n\t\tch = toupper(ch);\r\n\t\tseed1 = hashtable[type][ch] ^ (seed1 + seed2);\r\n\t\tseed2 += ch + seed1 + (seed2 << 5) + 3;\r\n\t}\r\n\treturn seed1;\r\n}\r\n\r\nvoid InitHash()\r\n{\r\n\tDWORD seed, ch;\r\n\tint i, j;\r\n\r\n\tseed = 0x00100001;\r\n\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\tfor (j = 0; j < 5; j++) {\r\n\t\t\tseed = (125 * seed + 3) % 0x2AAAAB;\r\n\t\t\tch = (seed & 0xFFFF);\r\n\t\t\tseed = (125 * seed + 3) % 0x2AAAAB;\r\n\t\t\thashtable[j][i] = ch << 16 | (seed & 0xFFFF);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic unsigned int __cdecl PkwareBufferRead(char *buf, unsigned int *size, void *param)\r\n{\r\n\tTDataInfo *pInfo;\r\n\tDWORD sSize;\r\n\r\n\tpInfo = (TDataInfo *)param;\r\n\r\n\tif (*size >= pInfo->size - pInfo->srcOffset) {\r\n\t\tsSize = pInfo->size - pInfo->srcOffset;\r\n\t} else {\r\n\t\tsSize = *size;\r\n\t}\r\n\r\n\tmemcpy(buf, pInfo->srcData + pInfo->srcOffset, sSize);\r\n\tpInfo->srcOffset += sSize;\r\n\r\n\treturn sSize;\r\n}\r\n\r\nstatic void __cdecl PkwareBufferWrite(char *buf, unsigned int *size, void *param)\r\n{\r\n\tTDataInfo *pInfo;\r\n\r\n\tpInfo = (TDataInfo *)param;\r\n\r\n\tmemcpy(pInfo->destData + pInfo->destOffset, buf, *size);\r\n\tpInfo->destOffset += *size;\r\n}\r\n\r\nint PkwareCompress(BYTE *srcData, int size)\r\n{\r\n\tBYTE *destData;\r\n\tchar *ptr;\r\n\tunsigned int destSize, type, dsize;\r\n\tTDataInfo param;\r\n\r\n\tptr = (char *)DiabloAllocPtr(CMP_BUFFER_SIZE);\r\n\r\n\tdestSize = 2 * size;\r\n\tif (destSize < 2 * 4096)\r\n\t\tdestSize = 2 * 4096;\r\n\r\n\tdestData = (BYTE *)DiabloAllocPtr(destSize);\r\n\r\n\tparam.srcData = srcData;\r\n\tparam.srcOffset = 0;\r\n\tparam.destData = destData;\r\n\tparam.destOffset = 0;\r\n\tparam.size = size;\r\n\r\n\ttype = 0;\r\n\tdsize = 4096;\r\n\timplode(PkwareBufferRead, PkwareBufferWrite, ptr, &param, &type, &dsize);\r\n\r\n\tif (param.destOffset < size) {\r\n\t\tmemcpy(srcData, destData, param.destOffset);\r\n\t\tsize = param.destOffset;\r\n\t}\r\n\r\n\tmem_free_dbg(ptr);\r\n\tmem_free_dbg(destData);\r\n\r\n\treturn size;\r\n}\r\n\r\nvoid PkwareDecompress(BYTE *pbInBuff, int recv_size, int dwMaxBytes)\r\n{\r\n\tchar *ptr;\r\n\tBYTE *pbOutBuff;\r\n\tTDataInfo info;\r\n\r\n\tptr = (char *)DiabloAllocPtr(CMP_BUFFER_SIZE);\r\n\tpbOutBuff = DiabloAllocPtr(dwMaxBytes);\r\n\r\n\tinfo.srcData = pbInBuff;\r\n\tinfo.srcOffset = 0;\r\n\tinfo.destData = pbOutBuff;\r\n\tinfo.destOffset = 0;\r\n\tinfo.size = recv_size;\r\n\r\n\texplode(PkwareBufferRead, PkwareBufferWrite, ptr, &info);\r\n\tmemcpy(pbInBuff, pbOutBuff, info.destOffset);\r\n\tmem_free_dbg(ptr);\r\n\tmem_free_dbg(pbOutBuff);\r\n}\r\n"
  },
  {
    "path": "Source/encrypt.h",
    "content": "/**\r\n * @file encrypt.h\r\n *\r\n * Interface of functions for compression and decompressing MPQ data.\r\n */\r\n#ifndef __ENCRYPT_H__\r\n#define __ENCRYPT_H__\r\n\r\nvoid Decrypt(DWORD *castBlock, DWORD size, DWORD key);\r\nvoid Encrypt(DWORD *castBlock, DWORD size, DWORD key);\r\nDWORD Hash(const char *s, int type);\r\nvoid InitHash();\r\nint PkwareCompress(BYTE *srcData, int size);\r\nvoid PkwareDecompress(BYTE *pbInBuff, int recv_size, int dwMaxBytes);\r\n\r\n#endif /* __ENCRYPT_H__ */\r\n"
  },
  {
    "path": "Source/engine.cpp",
    "content": "/**\r\n * @file engine.cpp\r\n *\r\n * Implementation of basic engine helper functions:\r\n * - Sprite blitting\r\n * - Drawing\r\n * - Angle calculation\r\n * - RNG\r\n * - Memory allocation\r\n * - File loading\r\n * - Video playback\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n#ifdef USE_ASM\r\n#pragma warning(disable : 4731) // frame pointer register 'ebp' modified by inline assembly code\r\n#endif\r\n\r\n/** automap pixel color 8-bit (palette entry) */\r\nchar gbPixelCol;\r\n/** flip - if y < x */\r\nBOOL gbRotateMap;\r\n/** Seed value before the most recent call to SetRndSeed() */\r\nint orgseed;\r\n/** Width of sprite being blitted */\r\nint sgnWidth;\r\n/** Current game seed */\r\nint sglGameSeed;\r\nstatic CCritSect sgMemCrit;\r\n/** Number of times the current seed has been fetched */\r\nint SeedCount;\r\n/** valid - if x/y are in bounds */\r\nBOOL gbNotInView;\r\n\r\n/**\r\n * Specifies the increment used in the Borland C/C++ pseudo-random.\r\n */\r\nconst int RndInc = 1;\r\n\r\n/**\r\n * Specifies the multiplier used in the Borland C/C++ pseudo-random number generator algorithm.\r\n */\r\nconst int RndMult = 0x015A4E35;\r\n\r\n/**\r\n * @brief Find the start of a CEL frame\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nDataSize Will be set to frame size\r\n */\r\n__FINLINE BYTE *CelGetFrame(BYTE *pCelBuff, int nCel, int *nDataSize)\r\n{\r\n\tDWORD *pFrameTable;\r\n\tDWORD nCellStart;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tnCellStart = SwapLE32(pFrameTable[nCel]);\r\n\t*nDataSize = SwapLE32(pFrameTable[nCel + 1]) - nCellStart;\r\n\r\n\treturn pCelBuff + nCellStart;\r\n}\r\n\r\n/**\r\n * @brief Calculate the size of a CEL frame\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @return Size of CEL in bytes\r\n */\r\n__FINLINE int CelGetFrameSize(BYTE *pCelBuff, int nCel)\r\n{\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\treturn SwapLE32(pFrameTable[nCel + 1]) - SwapLE32(pFrameTable[nCel]);\r\n}\r\n\r\n/**\r\n * @brief Blit CEL sprite to the given buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CEL pixel stream (run-length encoded)\r\n * @param nDataSize Size of CEL in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelBlit(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n\tint w;\r\n\r\n\tassert(pDecodeTo != NULL);\r\n\tif (pDecodeTo == NULL)\r\n\t\treturn;\r\n\tassert(pRLEBytes != NULL);\r\n\tif (pRLEBytes == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, pDecodeTo\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel6\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel3\r\n\t\tmovsb\r\n\t\tjecxz\tlabel5\r\n\tlabel3:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tmovsw\r\n\t\tjecxz\tlabel5\r\n\tlabel4:\r\n\t\trep movsd\r\n\tlabel5:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel7\r\n\t\tjmp\t\tlabel2\r\n\tlabel6:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel7:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\r\n\tfor (; src != &pRLEBytes[nDataSize]; dst -= BUFFER_WIDTH + w) {\r\n\t\tfor (i = w; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tsrc++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit CEL sprite to the back buffer at the given coordinates\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelDraw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)\r\n{\r\n\tint nDataSize;\r\n\tBYTE *pRLEBytes;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpRLEBytes = CelGetFrame(pCelBuff, nCel, &nDataSize);\r\n\tCelBlit(&gpBuffer[sx + PitchTbl[sy]], pRLEBytes, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Blit a given CEL frame to the given buffer\r\n * @param pBuff Target buffer\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelBlitFrame(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth)\r\n{\r\n\tint nDataSize;\r\n\tBYTE *pRLEBytes;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(pBuff != NULL);\r\n\tif (pBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpRLEBytes = CelGetFrame(pCelBuff, nCel, &nDataSize);\r\n\tCelBlit(pBuff, pRLEBytes, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelDraw but with the option to skip parts of the top and bottom of the sprite\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelClippedDraw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\telse\r\n\t\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tCelBlit(\r\n\t    &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]],\r\n\t    pRLEBytes + nDataStart,\r\n\t    nDataSize,\r\n\t    nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelBlit but with the option to skip parts of the top and bottom of the sprite\r\n * @param pBuff Target buffer\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelClippedBlit(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(pBuff != NULL);\r\n\tif (pBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\telse\r\n\t\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tCelBlit(pBuff, pRLEBytes + nDataStart, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Blit CEL sprite, and apply lighting, to the given buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CEL pixel stream (run-length encoded)\r\n * @param nDataSize Size of CEL in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelBlitLight(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n\tint w;\r\n\tBYTE *tbl;\r\n\r\n\tassert(pDecodeTo != NULL);\r\n\tif (pDecodeTo == NULL)\r\n\t\treturn;\r\n\tassert(pRLEBytes != NULL);\r\n\tif (pRLEBytes == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\teax, light_table_index\r\n\t\tshl\t\teax, 8\r\n\t\tadd\t\teax, pLightTbl\r\n\t\tmov\t\ttbl, eax\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, pDecodeTo\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel3\r\n\t\tpush\tebx\r\n\t\tmov\t\tebx, tbl\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\t\tpush\tedx\r\n\t\tcall\tCelBlitLightEntry\r\n\t\tpop\t\tedx\r\n\t\tpop\t\tebx\r\n\t\tor\t\tedx, edx\r\n\t\tjnz\t\tlabel2\r\n\t\tjmp\t\tlabel4\r\n\tlabel3:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel4:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t\tjmp\t\tlabexit\r\n\t}\r\n\r\n\t/* Assembly Macro */\r\n\t// clang-format off\r\n\t__asm {\r\n\tCelBlitLightEntry:\r\n\t\tshr\t\tcl, 1\r\n\t\tjnb\t\tlabel5\r\n\t\tmov\t\tdl, [esi]\r\n\t\tmov\t\tdl, [ebx+edx]\r\n\t\tmov\t\t[edi], dl\r\n\t\tadd\t\tesi, 1\r\n\t\tadd\t\tedi, 1\r\n\tlabel5:\r\n\t\tshr\t\tcl, 1\r\n\t\tjnb\t\tlabel6\r\n\t\tmov\t\tdl, [esi]\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\t[edi], ch\r\n\t\tmov\t\tdl, [esi+1]\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\t[edi+1], ch\r\n\t\tadd\t\tesi, 2\r\n\t\tadd\t\tedi, 2\r\n\tlabel6:\r\n\t\ttest\tcl, cl\r\n\t\tjz\t\tlabret\r\n\tlabel7:\r\n\t\tmov\t\teax, [esi]\r\n\t\tadd\t\tesi, 4\r\n\t\tmov\t\tdl, al\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\tdl, ah\r\n\t\tror\t\teax, 10h\r\n\t\tmov\t\t[edi], ch\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\tdl, al\r\n\t\tmov\t\t[edi+1], ch\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\tdl, ah\r\n\t\tmov\t\t[edi+2], ch\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\t[edi+3], ch\r\n\t\tadd\t\tedi, 4\r\n\t\tdec\t\tcl\r\n\t\tjnz\t\tlabel7\r\n\tlabret:\r\n\t\tretn\r\n\t}\r\n\t// clang-format on\r\n\r\n\t__asm {\r\n\tlabexit:\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\ttbl = &pLightTbl[light_table_index * 256];\r\n\tw = nWidth;\r\n\r\n\tfor (; src != &pRLEBytes[nDataSize]; dst -= BUFFER_WIDTH + w) {\r\n\t\tfor (i = w; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\tsrc++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\tdst[2] = tbl[src[2]];\r\n\t\t\t\t\tdst[3] = tbl[src[3]];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit CEL sprite, and apply lighting, to the given buffer, with transparancy applied\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CEL pixel stream (run-length encoded)\r\n * @param nDataSize Size of CEL in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelBlitLightTrans(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n\tint w;\r\n\tBOOL shift;\r\n\tBYTE *tbl;\r\n\r\n\tassert(pDecodeTo != NULL);\r\n\tif (pDecodeTo == NULL)\r\n\t\treturn;\r\n\tassert(pRLEBytes != NULL);\r\n\tif (pRLEBytes == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\teax, light_table_index\r\n\t\tshl\t\teax, 8\r\n\t\tadd\t\teax, pLightTbl\r\n\t\tmov\t\ttbl, eax\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, pDecodeTo\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\t\tmov\t\teax, edi\r\n\t\tand\t\teax, 1\r\n\t\tmov\t\tshift, eax\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel9\r\n\t\tpush\tebx\r\n\t\tmov\t\tebx, tbl\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\t\tmov\t\teax, edi\r\n\t\tand\t\teax, 1\r\n\t\tcmp\t\teax, shift\r\n\t\tjnz\t\tlabel5\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel3\r\n\t\tinc\t\tesi\r\n\t\tinc\t\tedi\r\n\t\tjecxz\tlabel8\r\n\t\tjmp\t\tlabel6\r\n\tlabel3:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tinc\t\tesi\r\n\t\tinc\t\tedi\r\n\t\tlodsb\r\n\t\txlat\r\n\t\tstosb\r\n\t\tjecxz\tlabel8\r\n\tlabel4:\r\n\t\tlodsd\r\n\t\tinc\t\tedi\r\n\t\tror\t\teax, 8\r\n\t\txlat\r\n\t\tstosb\r\n\t\tror\t\teax, 10h\r\n\t\tinc\t\tedi\r\n\t\txlat\r\n\t\tstosb\r\n\t\tloop\tlabel4\r\n\t\tjmp\t\tlabel8\r\n\tlabel5:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel6\r\n\t\tlodsb\r\n\t\txlat\r\n\t\tstosb\r\n\t\tjecxz\tlabel8\r\n\t\tjmp\t\tlabel3\r\n\tlabel6:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel7\r\n\t\tlodsb\r\n\t\txlat\r\n\t\tstosb\r\n\t\tinc\t\tesi\r\n\t\tinc\t\tedi\r\n\t\tjecxz\tlabel8\r\n\tlabel7:\r\n\t\tlodsd\r\n\t\txlat\r\n\t\tstosb\r\n\t\tinc\t\tedi\r\n\t\tror\t\teax, 10h\r\n\t\txlat\r\n\t\tstosb\r\n\t\tinc\t\tedi\r\n\t\tloop\tlabel7\r\n\tlabel8:\r\n\t\tpop\t\tebx\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel10\r\n\t\tjmp\t\tlabel2\r\n\tlabel9:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel10:\r\n\t\tsub\t\tedi, w\r\n\t\tmov\t\teax, shift\r\n\t\tinc\t\teax\r\n\t\tand\t\teax, 1\r\n\t\tmov\t\tshift, eax\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\ttbl = &pLightTbl[light_table_index * 256];\r\n\tw = nWidth;\r\n\tshift = (BYTE)dst & 1;\r\n\r\n\tfor (; src != &pRLEBytes[nDataSize]; dst -= BUFFER_WIDTH + w, shift = (shift + 1) & 1) {\r\n\t\tfor (i = w; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (((BYTE)dst & 1) == shift) {\r\n\t\t\t\t\tif (!(width & 1)) {\r\n\t\t\t\t\t\tgoto L_ODD;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\tL_EVEN:\r\n\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\t\tdst[2] = tbl[src[2]];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (!(width & 1)) {\r\n\t\t\t\t\t\tgoto L_EVEN;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\tL_ODD:\r\n\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\t\t\tdst[3] = tbl[src[3]];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit CEL sprite, and apply lighting, to the back buffer at the given coordinates\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelDrawLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)\r\n{\r\n\tint nDataSize;\r\n\tBYTE *pDecodeTo, *pRLEBytes;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpRLEBytes = CelGetFrame(pCelBuff, nCel, &nDataSize);\r\n\tpDecodeTo = &gpBuffer[sx + PitchTbl[sy]];\r\n\r\n\tif (light_table_index)\r\n\t\tCelBlitLight(pDecodeTo, pRLEBytes, nDataSize, nWidth);\r\n\telse\r\n\t\tCelBlit(pDecodeTo, pRLEBytes, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelDrawLight but with the option to skip parts of the top and bottom of the sprite\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelClippedDrawLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\tBYTE *pRLEBytes, *pDecodeTo;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\telse\r\n\t\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\tpDecodeTo = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tif (light_table_index)\r\n\t\tCelBlitLight(pDecodeTo, pRLEBytes, nDataSize, nWidth);\r\n\telse\r\n\t\tCelBlit(pDecodeTo, pRLEBytes, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelBlitLightTrans but with the option to skip parts of the top and bottom of the sprite\r\n * @param pBuff Target buffer\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelClippedBlitLightTrans(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(pBuff != NULL);\r\n\tif (pBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\telse\r\n\t\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\r\n\tif (cel_transparency_active)\r\n\t\tCelBlitLightTrans(pBuff, pRLEBytes, nDataSize, nWidth);\r\n\telse if (light_table_index)\r\n\t\tCelBlitLight(pBuff, pRLEBytes, nDataSize, nWidth);\r\n\telse\r\n\t\tCelBlit(pBuff, pRLEBytes, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Blit CEL sprite, and apply lighting, to the back buffer at the given coordinates, translated to a red hue\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n * @param light Light shade to use\r\n */\r\nvoid CelDrawLightRed(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap, w, idx;\r\n\tBYTE *pRLEBytes, *dst, *tbl;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\telse\r\n\t\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\tdst = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tidx = light4flag ? 1024 : 4096;\r\n\tif (light == 2)\r\n\t\tidx += 256; // gray colors\r\n\tif (light >= 4)\r\n\t\tidx += (light - 1) << 8;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\teax, pLightTbl\r\n\t\tadd\t\teax, idx\r\n\t\tmov\t\ttbl, eax\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, dst\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax /* use C for w? w = BUFFER_WIDTH + nWidth */\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\ttest\tal, al\r\n\t\tjs\t\tlabel4\r\n\t\tpush\tebx\r\n\t\tmov\t\tebx, tbl\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\tlabel3:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tal, [ebx+eax]\r\n\t\tmov\t\t[edi], al\r\n\t\tdec\t\tecx\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel3\r\n\t\tpop\t\tebx\r\n\t\ttest\tedx, edx\r\n\t\tjz\t\tlabel5\r\n\t\tjmp\t\tlabel2\r\n\tlabel4:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel5:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tBYTE width;\r\n\tBYTE *end;\r\n\r\n\ttbl = &pLightTbl[idx];\r\n\tend = &pRLEBytes[nDataSize];\r\n\r\n\tfor (; pRLEBytes != end; dst -= BUFFER_WIDTH + nWidth) {\r\n\t\tfor (w = nWidth; w;) {\r\n\t\t\twidth = *pRLEBytes++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\tw -= width;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\t*dst = tbl[*pRLEBytes];\r\n\t\t\t\t\tpRLEBytes++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as CelBlit but checks for drawing outside the buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CEL pixel stream (run-length encoded)\r\n * @param nDataSize Size of CEL in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelBlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n\tint w;\r\n\r\n\tassert(pDecodeTo != NULL);\r\n\tif (pDecodeTo == NULL)\r\n\t\treturn;\r\n\tassert(pRLEBytes != NULL);\r\n\tif (pRLEBytes == NULL)\r\n\t\treturn;\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, pDecodeTo\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel7\r\n\t\tsub\t\tedx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel3\r\n\t\tadd\t\tesi, eax\r\n\t\tadd\t\tedi, eax\r\n\t\tjmp\t\tlabel6\r\n\tlabel3:\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tmovsb\r\n\t\tjecxz\tlabel6\r\n\tlabel4:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel5\r\n\t\tmovsw\r\n\t\tjecxz\tlabel6\r\n\tlabel5:\r\n\t\trep movsd\r\n\tlabel6:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel8\r\n\t\tjmp\t\tlabel2\r\n\tlabel7:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel8:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\r\n\tfor (; src != &pRLEBytes[nDataSize]; dst -= BUFFER_WIDTH + w) {\r\n\t\tfor (i = w; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as CelClippedDraw but checks for drawing outside the buffer\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelClippedDrawSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\telse\r\n\t\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tCelBlitSafe(\r\n\t    &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]],\r\n\t    pRLEBytes + nDataStart,\r\n\t    nDataSize,\r\n\t    nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelClippedBlit but checks for drawing outside the buffer\r\n * @param pBuff Target buffer\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelClippedBlitSafe(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(pBuff != NULL);\r\n\tif (pBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tCelBlitSafe(pBuff, pRLEBytes + nDataStart, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelBlitLight but checks for drawing outside the buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CEL pixel stream (run-length encoded)\r\n * @param nDataSize Size of CEL in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelBlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n\tint w;\r\n\tBYTE *tbl;\r\n\r\n\tassert(pDecodeTo != NULL);\r\n\tif (pDecodeTo == NULL)\r\n\t\treturn;\r\n\tassert(pRLEBytes != NULL);\r\n\tif (pRLEBytes == NULL)\r\n\t\treturn;\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\teax, light_table_index\r\n\t\tshl\t\teax, 8\r\n\t\tadd\t\teax, pLightTbl\r\n\t\tmov\t\ttbl, eax\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, pDecodeTo\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel5\r\n\t\tpush\tebx\r\n\t\tmov\t\tebx, tbl\r\n\t\tsub\t\tedx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel3\r\n\t\tadd\t\tesi, eax\r\n\t\tadd\t\tedi, eax\r\n\t\tjmp\t\tlabel4\r\n\tlabel3:\r\n\t\tmov\t\tecx, eax\r\n\t\tpush\tedx\r\n\t\tcall\tCel2DecDatLightEntry\r\n\t\tpop\t\tedx\r\n\tlabel4:\r\n\t\tpop\t\tebx\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel6\r\n\t\tjmp\t\tlabel2\r\n\tlabel5:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel6:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t\tjmp\t\tlabexit\r\n\t}\r\n\r\n\t/* Assembly Macro */\r\n\t// clang-format off\r\n\t__asm {\r\n\tCel2DecDatLightEntry:\r\n\t\tshr\t\tcl, 1\r\n\t\tjnb\t\tlabel7\r\n\t\tmov\t\tdl, [esi]\r\n\t\tmov\t\tdl, [ebx+edx]\r\n\t\tmov\t\t[edi], dl\r\n\t\tadd\t\tesi, 1\r\n\t\tadd\t\tedi, 1\r\n\tlabel7:\r\n\t\tshr\t\tcl, 1\r\n\t\tjnb\t\tlabel8\r\n\t\tmov\t\tdl, [esi]\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\t[edi], ch\r\n\t\tmov\t\tdl, [esi+1]\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\t[edi+1], ch\r\n\t\tadd\t\tesi, 2\r\n\t\tadd\t\tedi, 2\r\n\tlabel8:\r\n\t\ttest\tcl, cl\r\n\t\tjz\t\tlabret\r\n\tlabel9:\r\n\t\tmov\t\teax, [esi]\r\n\t\tadd\t\tesi, 4\r\n\t\tmov\t\tdl, al\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\tdl, ah\r\n\t\tror\t\teax, 10h\r\n\t\tmov\t\t[edi], ch\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\tdl, al\r\n\t\tmov\t\t[edi+1], ch\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\tdl, ah\r\n\t\tmov\t\t[edi+2], ch\r\n\t\tmov\t\tch, [ebx+edx]\r\n\t\tmov\t\t[edi+3], ch\r\n\t\tadd\t\tedi, 4\r\n\t\tdec\t\tcl\r\n\t\tjnz\t\tlabel9\r\n\tlabret:\r\n\t\tretn\r\n\t}\r\n\t// clang-format on\r\n\r\n\t__asm {\r\n\tlabexit:\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\ttbl = &pLightTbl[light_table_index * 256];\r\n\tw = nWidth;\r\n\r\n\tfor (; src != &pRLEBytes[nDataSize]; dst -= BUFFER_WIDTH + w) {\r\n\t\tfor (i = w; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\t\tdst[2] = tbl[src[2]];\r\n\t\t\t\t\t\tdst[3] = tbl[src[3]];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as CelBlitLightTrans but checks for drawing outside the buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CEL pixel stream (run-length encoded)\r\n * @param nDataSize Size of CEL in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nvoid CelBlitLightTransSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n\tint w;\r\n\tBOOL shift;\r\n\tBYTE *tbl;\r\n\r\n\tassert(pDecodeTo != NULL);\r\n\tif (pDecodeTo == NULL)\r\n\t\treturn;\r\n\tassert(pRLEBytes != NULL);\r\n\tif (pRLEBytes == NULL)\r\n\t\treturn;\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\teax, light_table_index\r\n\t\tshl\t\teax, 8\r\n\t\tadd\t\teax, pLightTbl\r\n\t\tmov\t\ttbl, eax\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, pDecodeTo\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\t\tmov\t\teax, edi\r\n\t\tand\t\teax, 1\r\n\t\tmov\t\tshift, eax\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel10\r\n\t\tpush\tebx\r\n\t\tmov\t\tebx, tbl\r\n\t\tsub\t\tedx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel3\r\n\t\tadd\t\tesi, eax\r\n\t\tadd\t\tedi, eax\r\n\t\tjmp\t\tlabel9\r\n\tlabel3:\r\n\t\tmov\t\tecx, eax\r\n\t\tmov\t\teax, edi\r\n\t\tand\t\teax, 1\r\n\t\tcmp\t\teax, shift\r\n\t\tjnz\t\tlabel6\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tinc\t\tesi\r\n\t\tinc\t\tedi\r\n\t\tjecxz\tlabel9\r\n\t\tjmp\t\tlabel7\r\n\tlabel4:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel5\r\n\t\tinc\t\tesi\r\n\t\tinc\t\tedi\r\n\t\tlodsb\r\n\t\txlat\r\n\t\tstosb\r\n\t\tjecxz\tlabel9\r\n\tlabel5:\r\n\t\tlodsd\r\n\t\tinc\t\tedi\r\n\t\tror\t\teax, 8\r\n\t\txlat\r\n\t\tstosb\r\n\t\tror\t\teax, 10h\r\n\t\tinc\t\tedi\r\n\t\txlat\r\n\t\tstosb\r\n\t\tloop\tlabel5\r\n\t\tjmp\t\tlabel9\r\n\tlabel6:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel7\r\n\t\tlodsb\r\n\t\txlat\r\n\t\tstosb\r\n\t\tjecxz\tlabel9\r\n\t\tjmp\t\tlabel4\r\n\tlabel7:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel8\r\n\t\tlodsb\r\n\t\txlat\r\n\t\tstosb\r\n\t\tinc\t\tesi\r\n\t\tinc\t\tedi\r\n\t\tjecxz\tlabel9\r\n\tlabel8:\r\n\t\tlodsd\r\n\t\txlat\r\n\t\tstosb\r\n\t\tinc\t\tedi\r\n\t\tror\t\teax, 10h\r\n\t\txlat\r\n\t\tstosb\r\n\t\tinc\t\tedi\r\n\t\tloop\tlabel8\r\n\tlabel9:\r\n\t\tpop\t\tebx\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel11\r\n\t\tjmp\t\tlabel2\r\n\tlabel10:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel11:\r\n\t\tsub\t\tedi, w\r\n\t\tmov\t\teax, shift\r\n\t\tinc\t\teax\r\n\t\tand\t\teax, 1\r\n\t\tmov\t\tshift, eax\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\ttbl = &pLightTbl[light_table_index * 256];\r\n\tw = nWidth;\r\n\tshift = (BYTE)dst & 1;\r\n\r\n\tfor (; src != &pRLEBytes[nDataSize]; dst -= BUFFER_WIDTH + w, shift = (shift + 1) & 1) {\r\n\t\tfor (i = w; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tif (((BYTE)dst & 1) == shift) {\r\n\t\t\t\t\t\tif (!(width & 1)) {\r\n\t\t\t\t\t\t\tgoto L_ODD;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\tL_EVEN:\r\n\t\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\t\t\tdst[2] = tbl[src[2]];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (!(width & 1)) {\r\n\t\t\t\t\t\t\tgoto L_EVEN;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdst[0] = tbl[src[0]];\r\n\t\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\tL_ODD:\r\n\t\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\t\t\t\tdst[1] = tbl[src[1]];\r\n\t\t\t\t\t\t\t\tdst[3] = tbl[src[3]];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as CelDrawLight but checks for drawing outside the buffer\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of cel\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelDrawLightSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\tBYTE *pRLEBytes, *pDecodeTo;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\tpDecodeTo = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tif (light_table_index)\r\n\t\tCelBlitLightSafe(pDecodeTo, pRLEBytes, nDataSize, nWidth);\r\n\telse\r\n\t\tCelBlitSafe(pDecodeTo, pRLEBytes, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelClippedBlitLightTrans but checks for drawing outside the buffer\r\n * @param pBuff Target buffer\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of cel\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelClippedBlitLightTransSafe(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap;\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\r\n\tif (cel_transparency_active)\r\n\t\tCelBlitLightTransSafe(pBuff, pRLEBytes, nDataSize, nWidth);\r\n\telse if (light_table_index)\r\n\t\tCelBlitLightSafe(pBuff, pRLEBytes, nDataSize, nWidth);\r\n\telse\r\n\t\tCelBlitSafe(pBuff, pRLEBytes, nDataSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as CelDrawLightRed but checks for drawing outside the buffer\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of cel\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n * @param light Light shade to use\r\n */\r\nvoid CelDrawLightRedSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap, w, idx;\r\n\tBYTE *pRLEBytes, *dst, *tbl;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\telse\r\n\t\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\tdst = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tidx = light4flag ? 1024 : 4096;\r\n\tif (light == 2)\r\n\t\tidx += 256; // gray colors\r\n\tif (light >= 4)\r\n\t\tidx += (light - 1) << 8;\r\n\r\n\ttbl = &pLightTbl[idx];\r\n\r\n#ifdef USE_ASM\r\n\tw = BUFFER_WIDTH + nWidth;\r\n\r\n\t__asm {\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, dst\r\n\t\tmov\t\tecx, nDataSize\r\n\t\tadd\t\tecx, esi\r\n\tlabel1:\r\n\t\tpush\tecx\r\n\t\tmov\t\tedx, nWidth\r\n\t\txor\t\tecx, ecx\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\ttest\tal, al\r\n\t\tjs\t\tlabel5\r\n\t\tmov\t\tebx, tbl\r\n\t\tsub\t\tedx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel3\r\n\t\tadd\t\tesi, eax\r\n\t\tadd\t\tedi, eax\r\n\t\tjmp\t\tlabel4\r\n\tlabel3:\r\n\t\tmov\t\tcl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tcl, [ebx+ecx]\r\n\t\tmov\t\t[edi], cl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel3\r\n\tlabel4:\r\n\t\ttest\tedx, edx\r\n\t\tjz\t\tlabel6\r\n\t\tjmp\t\tlabel2\r\n\tlabel5:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel6:\r\n\t\tpop\t\tecx\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tecx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tBYTE width;\r\n\tBYTE *end;\r\n\r\n\tend = &pRLEBytes[nDataSize];\r\n\r\n\tfor (; pRLEBytes != end; dst -= BUFFER_WIDTH + nWidth) {\r\n\t\tfor (w = nWidth; w;) {\r\n\t\t\twidth = *pRLEBytes++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\tw -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t*dst = tbl[*pRLEBytes];\r\n\t\t\t\t\t\tpRLEBytes++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpRLEBytes += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit to a buffer at given coordinates\r\n * @param pBuff Target buffer\r\n * @param x Cordinate in pBuff buffer\r\n * @param y Cordinate in pBuff buffer\r\n * @param wdt Width of pBuff\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of cel\r\n */\r\nvoid CelBlitWidth(BYTE *pBuff, int x, int y, int wdt, BYTE *pCelBuff, int nCel, int nWidth)\r\n{\r\n\tBYTE *pRLEBytes, *dst, *end;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(pBuff != NULL);\r\n\tif (pBuff == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pCelBuff\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\teax, [ebx+4]\r\n\t\tsub\t\teax, [ebx]\r\n\t\tmov\t\tend, eax\r\n\t\tmov\t\teax, pCelBuff\r\n\t\tadd\t\teax, [ebx]\r\n\t\tmov\t\tpRLEBytes, eax\r\n\t}\r\n\r\n\tdst = &pBuff[y * wdt + x];\r\n\r\n\t__asm {\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, dst\r\n\t\tmov\t\teax, wdt\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\twdt, eax\r\n\t\tmov\t\tebx, end\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel6\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel3\r\n\t\tmovsb\r\n\t\tjecxz\tlabel5\r\n\tlabel3:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tmovsw\r\n\t\tjecxz\tlabel5\r\n\tlabel4:\r\n\t\trep movsd\r\n\tlabel5:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel7\r\n\t\tjmp\t\tlabel2\r\n\tlabel6:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel7:\r\n\t\tsub\t\tedi, wdt\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint i, nDataSize;\r\n\tBYTE width;\r\n\r\n\tpRLEBytes = CelGetFrame(pCelBuff, nCel, &nDataSize);\r\n\tend = &pRLEBytes[nDataSize];\r\n\tdst = &pBuff[y * wdt + x];\r\n\r\n\tfor (; pRLEBytes != end; dst -= wdt + nWidth) {\r\n\t\tfor (i = nWidth; i;) {\r\n\t\t\twidth = *pRLEBytes++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = pRLEBytes[0];\r\n\t\t\t\t\tpRLEBytes++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\tdst[0] = pRLEBytes[0];\r\n\t\t\t\t\tdst[1] = pRLEBytes[1];\r\n\t\t\t\t\tpRLEBytes += 2;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\tdst[0] = pRLEBytes[0];\r\n\t\t\t\t\tdst[1] = pRLEBytes[1];\r\n\t\t\t\t\tdst[2] = pRLEBytes[2];\r\n\t\t\t\t\tdst[3] = pRLEBytes[3];\r\n\t\t\t\t\tpRLEBytes += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the back buffer at the given coordianates\r\n * @param col Color index from current palette\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CEL buffer\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelBlitOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap, w;\r\n\tBYTE *pRLEBytes, *dst;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pCelBuff\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\teax, [ebx+4]\r\n\t\tsub\t\teax, [ebx]\r\n\t\tmov\t\tnDataSize, eax\r\n\t\tmov\t\tedx, pCelBuff\r\n\t\tadd\t\tedx, [ebx]\r\n\t\tmov\t\tpRLEBytes, edx\r\n\t\tadd\t\tedx, CelSkip\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tax, [edx]\r\n\t\tmov\t\tnDataStart, eax\r\n\t\tmov\t\tedx, pRLEBytes\r\n\t\tadd\t\tedx, CelCap\r\n\t\tmov\t\tax, [edx]\r\n\t\tmov\t\tnDataCap, eax\r\n\t}\r\n\r\n\tif (nDataStart == 0) return;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\tif (nDataCap != 0)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\tdst = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\t__asm {\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, dst\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel5\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, eax\r\n\t\tmov\t\tah, col\r\n\tlabel3:\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjz\t\tlabel4\r\n\t\tmov\t\t[edi-BUFFER_WIDTH], ah\r\n\t\tmov\t\t[edi-1], ah\r\n\t\tmov\t\t[edi+1], ah\r\n\t\tmov\t\t[edi+BUFFER_WIDTH], ah\r\n\tlabel4:\r\n\t\tinc\t\tedi\r\n\t\tloop\tlabel3\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel6\r\n\t\tjmp\t\tlabel2\r\n\tlabel5:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel6:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tBYTE width;\r\n\tBYTE *end, *src;\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)&pCelBuff[4 * nCel];\r\n\tpRLEBytes = &pCelBuff[pFrameTable[0]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize = pFrameTable[1] - pFrameTable[0] - nDataStart;\r\n\r\n\tsrc = pRLEBytes + nDataStart;\r\n\tend = &src[nDataSize];\r\n\tdst = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tfor (; src != end; dst -= BUFFER_WIDTH + nWidth) {\r\n\t\tfor (w = nWidth; w;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\tw -= width;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\tif (*src++) {\r\n\t\t\t\t\t\tdst[-BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\tdst[-1] = col;\r\n\t\t\t\t\t\tdst[1] = col;\r\n\t\t\t\t\t\tdst[BUFFER_WIDTH] = col;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as CelBlitOutline but checks for drawing outside the buffer\r\n * @param col Color index from current palette\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CEL buffer\r\n * @param nCel CEL frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid CelBlitOutlineSafe(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nDataCap, w;\r\n\tBYTE *pRLEBytes, *dst;\r\n\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(gpBuffer);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pCelBuff\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\teax, [ebx+4]\r\n\t\tsub\t\teax, [ebx]\r\n\t\tmov\t\tnDataSize, eax\r\n\t\tmov\t\tedx, pCelBuff\r\n\t\tadd\t\tedx, [ebx]\r\n\t\tmov\t\tpRLEBytes, edx\r\n\t\tadd\t\tedx, CelSkip\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tax, [edx]\r\n\t\tmov\t\tnDataStart, eax\r\n\t\tmov\t\tedx, pRLEBytes\r\n\t\tadd\t\tedx, CelCap\r\n\t\tmov\t\tax, [edx]\r\n\t\tmov\t\tnDataCap, eax\r\n\t}\r\n\r\n\tif (nDataStart == 0) return;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\tif (nDataCap != 0)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize -= nDataStart;\r\n\r\n\tpRLEBytes += nDataStart;\r\n\tdst = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\t__asm {\r\n\t\tmov\t\tesi, pRLEBytes\r\n\t\tmov\t\tedi, dst\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, nWidth\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, nDataSize\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, nWidth\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel10\r\n\t\tsub\t\tedx, eax\r\n\t\tmov\t\tecx, gpBufEnd\r\n\t\tcmp\t\tedi, ecx\r\n\t\tjb\t\tlabel3\r\n\t\tadd\t\tesi, eax\r\n\t\tadd\t\tedi, eax\r\n\t\tjmp\t\tlabel9\r\n\tlabel3:\r\n\t\tsub\t\tecx, BUFFER_WIDTH\r\n\t\tcmp\t\tedi, ecx\r\n\t\tjnb\t\tlabel6\r\n\t\tmov\t\tecx, eax\r\n\t\tmov\t\tah, col\r\n\tlabel4:\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjz\t\tlabel5\r\n\t\tmov\t\t[edi-BUFFER_WIDTH], ah\r\n\t\tmov\t\t[edi-1], ah\r\n\t\tmov\t\t[edi+1], ah\r\n\t\tmov\t\t[edi+BUFFER_WIDTH], ah\r\n\tlabel5:\r\n\t\tinc\t\tedi\r\n\t\tloop\tlabel4\r\n\t\tjmp\t\tlabel9\r\n\tlabel6:\r\n\t\tmov\t\tecx, eax\r\n\t\tmov\t\tah, col\r\n\tlabel7:\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjz\t\tlabel8\r\n\t\tmov\t\t[edi-BUFFER_WIDTH], ah\r\n\t\tmov\t\t[edi-1], ah\r\n\t\tmov\t\t[edi+1], ah\r\n\tlabel8:\r\n\t\tinc\t\tedi\r\n\t\tloop\tlabel7\r\n\tlabel9:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel11\r\n\t\tjmp\t\tlabel2\r\n\tlabel10:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel11:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tBYTE width;\r\n\tBYTE *end, *src;\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)&pCelBuff[4 * nCel];\r\n\tpRLEBytes = &pCelBuff[pFrameTable[0]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tnDataCap = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (CelCap == 8)\r\n\t\tnDataCap = 0;\r\n\r\n\tif (nDataCap)\r\n\t\tnDataSize = nDataCap - nDataStart;\r\n\telse\r\n\t\tnDataSize = pFrameTable[1] - pFrameTable[0] - nDataStart;\r\n\r\n\tsrc = pRLEBytes + nDataStart;\r\n\tend = &src[nDataSize];\r\n\tdst = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tfor (; src != end; dst -= BUFFER_WIDTH + nWidth) {\r\n\t\tfor (w = nWidth; w;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\tw -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tif (dst >= gpBufEnd - BUFFER_WIDTH) {\r\n\t\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t\tif (*src++) {\r\n\t\t\t\t\t\t\t\tdst[-BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\t\t\tdst[-1] = col;\r\n\t\t\t\t\t\t\t\tdst[1] = col;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t\tif (*src++) {\r\n\t\t\t\t\t\t\t\tdst[-BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\t\t\tdst[-1] = col;\r\n\t\t\t\t\t\t\t\tdst[1] = col;\r\n\t\t\t\t\t\t\t\tdst[BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Set the value of a single pixel in the back buffer, checks bounds\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param col Color index from current palette\r\n */\r\nvoid ENG_set_pixel(int sx, int sy, BYTE col)\r\n{\r\n\tBYTE *dst;\r\n\r\n\tassert(gpBuffer);\r\n\r\n\tif (sy < 0 || sy >= SCREEN_HEIGHT + SCREEN_Y || sx < SCREEN_X || sx >= SCREEN_WIDTH + SCREEN_X)\r\n\t\treturn;\r\n\r\n\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tedi, dst\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjnb\t\tlabel1\r\n\t\tmov\t\tal, col\r\n\t\tmov\t\t[edi], al\r\n\tlabel1:\r\n\t}\r\n#else\r\n\tif (dst < gpBufEnd)\r\n\t\t*dst = col;\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Set the value of a single pixel in the back buffer to that of gbPixelCol, checks bounds\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n */\r\nvoid engine_draw_pixel(int sx, int sy)\r\n{\r\n\tBYTE *dst;\r\n\r\n\tassert(gpBuffer);\r\n\r\n\tif (gbRotateMap) {\r\n\t\tif (gbNotInView && (sx < 0 || sx >= SCREEN_HEIGHT + SCREEN_Y || sy < SCREEN_X || sy >= SCREEN_WIDTH + SCREEN_X))\r\n\t\t\treturn;\r\n\t\tdst = &gpBuffer[sy + PitchTbl[sx]];\r\n\t} else {\r\n\t\tif (gbNotInView && (sy < 0 || sy >= SCREEN_HEIGHT + SCREEN_Y || sx < SCREEN_X || sx >= SCREEN_WIDTH + SCREEN_X))\r\n\t\t\treturn;\r\n\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t}\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tedi, dst\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjnb\t\tlabel1\r\n\t\tmov\t\tal, gbPixelCol\r\n\t\tmov\t\t[edi], al\r\n\tlabel1:\r\n\t}\r\n#else\r\n\tif (dst < gpBufEnd)\r\n\t\t*dst = gbPixelCol;\r\n#endif\r\n}\r\n\r\n/** Macro used in DrawLine() */\r\n#define GG_SWAP(A, B) \\\r\n\t{                 \\\r\n\t\t(A) ^= (B);   \\\r\n\t\t(B) ^= (A);   \\\r\n\t\t(A) ^= (B);   \\\r\n\t}\r\n/** Macro used in DrawLine() */\r\n#define GG_ABSOLUTE(I, J, K) (((I) - (J)) * ((K) = (((I) - (J)) < 0 ? -1 : 1)))\r\n\r\n/**\r\n * Symmetric Double Step Line Algorithm\r\n * by Brian Wyvill\r\n * from \"Graphics Gems\", Academic Press, 1990\r\n *\r\n * Exact copy from https://github.com/erich666/GraphicsGems/blob/dad26f941e12c8bf1f96ea21c1c04cd2206ae7c9/gems/DoubleLine.c\r\n * Except:\r\n * - not in view checks\r\n * - global variable instead of reverse flag\r\n * - condition for pixels_left < 0 removed\r\n *\r\n * @brief Draw a line on the back buffer\r\n * @param x0 Back buffer coordinate\r\n * @param y0 Back buffer coordinate\r\n * @param x1 Back buffer coordinate\r\n * @param y1 Back buffer coordinate\r\n * @param col Color index from current palette\r\n */\r\nvoid DrawLine(int x0, int y0, int x1, int y1, BYTE col)\r\n{\r\n\tint dx, dy, incr1, incr2, D, x, y, xend, c, pixels_left;\r\n\tint sign_x, sign_y, step, i;\r\n\tint x1_, y1_;\r\n\r\n\tgbPixelCol = col;\r\n\r\n\tgbNotInView = FALSE;\r\n\tif (x0 < 0 + SCREEN_X || x0 >= SCREEN_WIDTH + SCREEN_X) {\r\n\t\tgbNotInView = TRUE;\r\n\t}\r\n\tif (x1 < 0 + SCREEN_X || x1 >= SCREEN_WIDTH + SCREEN_X) {\r\n\t\tgbNotInView = TRUE;\r\n\t}\r\n\tif (y0 < 0 + SCREEN_Y || y0 >= PANEL_Y) {\r\n\t\tgbNotInView = TRUE;\r\n\t}\r\n\tif (y1 < 0 + SCREEN_Y || y1 >= PANEL_Y) {\r\n\t\tgbNotInView = TRUE;\r\n\t}\r\n\r\n\tdx = GG_ABSOLUTE(x1, x0, sign_x);\r\n\tdy = GG_ABSOLUTE(y1, y0, sign_y);\r\n\t/* decide increment sign by the slope sign */\r\n\tif (sign_x == sign_y)\r\n\t\tstep = 1;\r\n\telse\r\n\t\tstep = -1;\r\n\r\n\tif (dy > dx) { /* chooses axis of greatest movement (make\r\n\t\t\t\t\t\t* dx) */\r\n\t\tGG_SWAP(x0, y0);\r\n\t\tGG_SWAP(x1, y1);\r\n\t\tGG_SWAP(dx, dy);\r\n\t\tgbRotateMap = TRUE;\r\n\t} else\r\n\t\tgbRotateMap = FALSE;\r\n\t/* note error check for dx==0 should be included here */\r\n\tif (x0 > x1) { /* start from the smaller coordinate */\r\n\t\tx = x1;\r\n\t\ty = y1;\r\n\t\tx1_ = x0;\r\n\t\ty1_ = y0;\r\n\t} else {\r\n\t\tx = x0;\r\n\t\ty = y0;\r\n\t\tx1_ = x1;\r\n\t\ty1_ = y1;\r\n\t}\r\n\r\n\t/* Note dx=n implies 0 - n or (dx+1) pixels to be set */\r\n\t/* Go round loop dx/4 times then plot last 0,1,2 or 3 pixels */\r\n\t/* In fact (dx-1)/4 as 2 pixels are already plotted */\r\n\txend = (dx - 1) / 4;\r\n\tpixels_left = (dx - 1) % 4; /* number of pixels left over at the end */\r\n\tengine_draw_pixel(x, y);\r\n\tengine_draw_pixel(x1_, y1_); /* plot first two points */\r\n\tincr2 = 4 * dy - 2 * dx;\r\n\tif (incr2 < 0) { /* slope less than 1/2 */\r\n\t\tc = 2 * dy;\r\n\t\tincr1 = 2 * c;\r\n\t\tD = incr1 - dx;\r\n\r\n\t\tfor (i = 0; i < xend; i++) { /* plotting loop */\r\n\t\t\t++x;\r\n\t\t\t--x1_;\r\n\t\t\tif (D < 0) {\r\n\t\t\t\t/* pattern 1 forwards */\r\n\t\t\t\tengine_draw_pixel(x, y);\r\n\t\t\t\tengine_draw_pixel(++x, y);\r\n\t\t\t\t/* pattern 1 backwards */\r\n\t\t\t\tengine_draw_pixel(x1_, y1_);\r\n\t\t\t\tengine_draw_pixel(--x1_, y1_);\r\n\t\t\t\tD += incr1;\r\n\t\t\t} else {\r\n\t\t\t\tif (D < c) {\r\n\t\t\t\t\t/* pattern 2 forwards */\r\n\t\t\t\t\tengine_draw_pixel(x, y);\r\n\t\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\t\t\t\t\t/* pattern 2 backwards */\r\n\t\t\t\t\tengine_draw_pixel(x1_, y1_);\r\n\t\t\t\t\tengine_draw_pixel(--x1_, y1_ -= step);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t/* pattern 3 forwards */\r\n\t\t\t\t\tengine_draw_pixel(x, y += step);\r\n\t\t\t\t\tengine_draw_pixel(++x, y);\r\n\t\t\t\t\t/* pattern 3 backwards */\r\n\t\t\t\t\tengine_draw_pixel(x1_, y1_ -= step);\r\n\t\t\t\t\tengine_draw_pixel(--x1_, y1_);\r\n\t\t\t\t}\r\n\t\t\t\tD += incr2;\r\n\t\t\t}\r\n\t\t} /* end for */\r\n\r\n\t\t/* plot last pattern */\r\n\t\tif (pixels_left) {\r\n\t\t\tif (D < 0) {\r\n\t\t\t\tengine_draw_pixel(++x, y); /* pattern 1 */\r\n\t\t\t\tif (pixels_left > 1)\r\n\t\t\t\t\tengine_draw_pixel(++x, y);\r\n\t\t\t\tif (pixels_left > 2)\r\n\t\t\t\t\tengine_draw_pixel(--x1_, y1_);\r\n\t\t\t} else {\r\n\t\t\t\tif (D < c) {\r\n\t\t\t\t\tengine_draw_pixel(++x, y); /* pattern 2  */\r\n\t\t\t\t\tif (pixels_left > 1)\r\n\t\t\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\t\t\t\t\tif (pixels_left > 2)\r\n\t\t\t\t\t\tengine_draw_pixel(--x1_, y1_);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t/* pattern 3 */\r\n\t\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\t\t\t\t\tif (pixels_left > 1)\r\n\t\t\t\t\t\tengine_draw_pixel(++x, y);\r\n\t\t\t\t\tif (pixels_left > 2)\r\n\t\t\t\t\t\tengine_draw_pixel(--x1_, y1_ -= step);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} /* end if pixels_left */\r\n\t}\r\n\t/* end slope < 1/2 */\r\n\telse { /* slope greater than 1/2 */\r\n\t\tc = 2 * (dy - dx);\r\n\t\tincr1 = 2 * c;\r\n\t\tD = incr1 + dx;\r\n\t\tfor (i = 0; i < xend; i++) {\r\n\t\t\t++x;\r\n\t\t\t--x1_;\r\n\t\t\tif (D > 0) {\r\n\t\t\t\t/* pattern 4 forwards */\r\n\t\t\t\tengine_draw_pixel(x, y += step);\r\n\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\t\t\t\t/* pattern 4 backwards */\r\n\t\t\t\tengine_draw_pixel(x1_, y1_ -= step);\r\n\t\t\t\tengine_draw_pixel(--x1_, y1_ -= step);\r\n\t\t\t\tD += incr1;\r\n\t\t\t} else {\r\n\t\t\t\tif (D < c) {\r\n\t\t\t\t\t/* pattern 2 forwards */\r\n\t\t\t\t\tengine_draw_pixel(x, y);\r\n\t\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\r\n\t\t\t\t\t/* pattern 2 backwards */\r\n\t\t\t\t\tengine_draw_pixel(x1_, y1_);\r\n\t\t\t\t\tengine_draw_pixel(--x1_, y1_ -= step);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t/* pattern 3 forwards */\r\n\t\t\t\t\tengine_draw_pixel(x, y += step);\r\n\t\t\t\t\tengine_draw_pixel(++x, y);\r\n\t\t\t\t\t/* pattern 3 backwards */\r\n\t\t\t\t\tengine_draw_pixel(x1_, y1_ -= step);\r\n\t\t\t\t\tengine_draw_pixel(--x1_, y1_);\r\n\t\t\t\t}\r\n\t\t\t\tD += incr2;\r\n\t\t\t}\r\n\t\t} /* end for */\r\n\t\t/* plot last pattern */\r\n\t\tif (pixels_left) {\r\n\t\t\tif (D > 0) {\r\n\t\t\t\tengine_draw_pixel(++x, y += step); /* pattern 4 */\r\n\t\t\t\tif (pixels_left > 1)\r\n\t\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\t\t\t\tif (pixels_left > 2)\r\n\t\t\t\t\tengine_draw_pixel(--x1_, y1_ -= step);\r\n\t\t\t} else {\r\n\t\t\t\tif (D < c) {\r\n\t\t\t\t\tengine_draw_pixel(++x, y); /* pattern 2  */\r\n\t\t\t\t\tif (pixels_left > 1)\r\n\t\t\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\t\t\t\t\tif (pixels_left > 2)\r\n\t\t\t\t\t\tengine_draw_pixel(--x1_, y1_);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t/* pattern 3 */\r\n\t\t\t\t\tengine_draw_pixel(++x, y += step);\r\n\t\t\t\t\tif (pixels_left > 1)\r\n\t\t\t\t\t\tengine_draw_pixel(++x, y);\r\n\t\t\t\t\tif (pixels_left > 2) {\r\n\t\t\t\t\t\tif (D > c) /* step 3 */\r\n\t\t\t\t\t\t\tengine_draw_pixel(--x1_, y1_ -= step);\r\n\t\t\t\t\t\telse /* step 2 */\r\n\t\t\t\t\t\t\tengine_draw_pixel(--x1_, y1_);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Calculate the best fit direction between two points\r\n * @param x1 Tile coordinate\r\n * @param y1 Tile coordinate\r\n * @param x2 Tile coordinate\r\n * @param y2 Tile coordinate\r\n * @return A value from the direction enum\r\n */\r\nint GetDirection(int x1, int y1, int x2, int y2)\r\n{\r\n\tint mx, my;\r\n\tint md, ny;\r\n\r\n\tmx = x2 - x1;\r\n\tmy = y2 - y1;\r\n\r\n\tif (mx >= 0) {\r\n\t\tif (my >= 0) {\r\n\t\t\tmd = DIR_S;\r\n\t\t\tif (2 * mx < my)\r\n\t\t\t\tmd = DIR_SW;\r\n\t\t} else {\r\n\t\t\tmy = -my;\r\n\t\t\tmd = DIR_E;\r\n\t\t\tif (2 * mx < my)\r\n\t\t\t\tmd = DIR_NE;\r\n\t\t}\r\n\t\tif (2 * my < mx)\r\n\t\t\treturn DIR_SE;\r\n\t} else {\r\n\t\tif (my >= 0) {\r\n\t\t\tny = -mx;\r\n\t\t\tmd = DIR_W;\r\n\t\t\tif (2 * ny < my)\r\n\t\t\t\tmd = DIR_SW;\r\n\t\t} else {\r\n\t\t\tny = -mx;\r\n\t\t\tmy = -my;\r\n\t\t\tmd = DIR_N;\r\n\t\t\tif (2 * ny < my)\r\n\t\t\t\tmd = DIR_NE;\r\n\t\t}\r\n\t\tif (2 * my < ny)\r\n\t\t\treturn DIR_NW;\r\n\t}\r\n\r\n\treturn md;\r\n}\r\n\r\n/**\r\n * @brief Set the RNG seed\r\n * @param s RNG seed\r\n */\r\nvoid SetRndSeed(int s)\r\n{\r\n\tSeedCount = 0;\r\n\tsglGameSeed = s;\r\n\torgseed = s;\r\n}\r\n\r\n/**\r\n * @brief Get the current RNG seed\r\n * @return RNG seed\r\n */\r\nint GetRndSeed()\r\n{\r\n\tSeedCount++;\r\n\tsglGameSeed = RndMult * sglGameSeed + RndInc;\r\n\treturn abs(sglGameSeed);\r\n}\r\n\r\n/**\r\n * @brief Main RNG function\r\n * @param idx Unused\r\n * @param v The upper limit for the return value\r\n * @return A random number from 0 to (v-1)\r\n */\r\nint random_(BYTE idx, int v)\r\n{\r\n\tif (v <= 0)\r\n\t\treturn 0;\r\n\tif (v < 0xFFFF)\r\n\t\treturn (GetRndSeed() >> 16) % v;\r\n\treturn GetRndSeed() % v;\r\n}\r\n\r\n/**\r\n * @brief Unallocate all remaining pointers\r\n * @param show_cursor unused\r\n */\r\nvoid engine_debug_trap(BOOL show_cursor)\r\n{\r\n\t/*\r\n\tTMemBlock *pCurr;\r\n\r\n\tsgMemCrit.Enter();\r\n\twhile(sgpMemBlock != NULL) {\r\n\t\tpCurr = sgpMemBlock->pNext;\r\n\t\tSMemFree(sgpMemBlock, \"C:\\\\Diablo\\\\Direct\\\\ENGINE.CPP\", 1970);\r\n\t\tsgpMemBlock = pCurr;\r\n\t}\r\n\tsgMemCrit.Leave();\r\n*/\r\n}\r\n\r\n/**\r\n * @brief Multithreaded safe malloc\r\n * @param dwBytes Byte size to allocate\r\n */\r\nBYTE *DiabloAllocPtr(DWORD dwBytes)\r\n{\r\n\tBYTE *buf;\r\n\r\n\tsgMemCrit.Enter();\r\n\tbuf = (BYTE *)SMemAlloc(dwBytes, \"C:\\\\Src\\\\Diablo\\\\Source\\\\ENGINE.CPP\", 2236, 0);\r\n\tsgMemCrit.Leave();\r\n\r\n\tif (buf == NULL) {\r\n\t\tErrDlg(IDD_DIALOG2, GetLastError(), \"C:\\\\Src\\\\Diablo\\\\Source\\\\ENGINE.CPP\", 2269);\r\n\t}\r\n\r\n\treturn buf;\r\n}\r\n\r\n/**\r\n * @brief Multithreaded safe memfree\r\n * @param p Memory pointer to free\r\n */\r\nvoid mem_free_dbg(void *p)\r\n{\r\n\tif (p) {\r\n\t\tsgMemCrit.Enter();\r\n\t\tSMemFree(p, \"C:\\\\Src\\\\Diablo\\\\Source\\\\ENGINE.CPP\", 2317, 0);\r\n\t\tsgMemCrit.Leave();\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Load a file into a buffer\r\n * @param pszName Path of file\r\n * @param pdwFileLen Will be set to file size if non-NULL\r\n * @return Buffer with content of file\r\n */\r\nBYTE *LoadFileInMem(const char *pszName, DWORD *pdwFileLen)\r\n{\r\n\tHANDLE file;\r\n\tBYTE *buf;\r\n\tint fileLen;\r\n\r\n\tWOpenFile(pszName, &file, FALSE);\r\n\tfileLen = WGetFileSize(file, NULL);\r\n\r\n\tif (pdwFileLen)\r\n\t\t*pdwFileLen = fileLen;\r\n\r\n\tif (!fileLen)\r\n\t\tapp_fatal(\"Zero length SFILE:\\n%s\", pszName);\r\n\r\n\tbuf = (BYTE *)DiabloAllocPtr(fileLen);\r\n\r\n\tWReadFile(file, buf, fileLen);\r\n\tWCloseFile(file);\r\n\r\n\treturn buf;\r\n}\r\n\r\n/**\r\n * @brief Load a file into the given buffer\r\n * @param pszName Path of file\r\n * @param p Target buffer\r\n * @return Size of file\r\n */\r\nDWORD LoadFileWithMem(const char *pszName, BYTE *p)\r\n{\r\n\tDWORD dwFileLen;\r\n\tHANDLE hsFile;\r\n\r\n\tassert(pszName);\r\n\tif (p == NULL) {\r\n\t\tapp_fatal(\"LoadFileWithMem(NULL):\\n%s\", pszName);\r\n\t}\r\n\r\n\tWOpenFile(pszName, &hsFile, FALSE);\r\n\r\n\tdwFileLen = WGetFileSize(hsFile, NULL);\r\n\tif (dwFileLen == 0) {\r\n\t\tapp_fatal(\"Zero length SFILE:\\n%s\", pszName);\r\n\t}\r\n\r\n\tWReadFile(hsFile, p, dwFileLen);\r\n\tWCloseFile(hsFile);\r\n\r\n\treturn dwFileLen;\r\n}\r\n\r\n/**\r\n * @brief Apply the color swaps to a CL2 sprite\r\n * @param p CL2 buffer\r\n * @param ttbl Palette translation table\r\n * @param nCel Frame number in CL2 file\r\n */\r\nvoid Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel)\r\n{\r\n\tint i, nDataSize;\r\n\tchar width;\r\n\tBYTE *dst;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(p != NULL);\r\n\tassert(ttbl != NULL);\r\n\r\n\tfor (i = 1; i <= nCel; i++) {\r\n\t\tpFrameTable = (DWORD *)p;\r\n\t\tdst = &p[SwapLE32(pFrameTable[i]) + 10];\r\n\t\tnDataSize = SwapLE32(pFrameTable[i + 1]) - SwapLE32(pFrameTable[i]) - 10;\r\n\t\twhile (nDataSize) {\r\n\t\t\twidth = *dst++;\r\n\t\t\tnDataSize--;\r\n\t\t\tassert(nDataSize >= 0);\r\n\t\t\tif (width < 0) {\r\n\t\t\t\twidth = -width;\r\n\t\t\t\tif (width > 65) {\r\n\t\t\t\t\tnDataSize--;\r\n\t\t\t\t\tassert(nDataSize >= 0);\r\n\t\t\t\t\t*dst = ttbl[*dst];\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnDataSize -= width;\r\n\t\t\t\t\tassert(nDataSize >= 0);\r\n\t\t\t\t\twhile (width--) {\r\n\t\t\t\t\t\t*dst = ttbl[*dst];\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Blit CL2 sprite to the given buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CL2 pixel stream (run-length encoded)\r\n * @param nDataSize Size of CL2 in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nstatic void Cl2Blit(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tpush\tebx\r\n\t\tpush\tesi\r\n\t\tpush\tedi\r\n\t\tmov\t\tesi, edx /// UNSAFE: use 'mov esi, pRLEBytes'\r\n\t\tmov\t\tedi, ecx /// UNSAFE: use 'mov edi, pDecodeTo'\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tebx, nWidth\r\n\t\tmov\t\tecx, nDataSize\r\n\tlabel1:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tdec\t\tecx\r\n\t\ttest\tal, al\r\n\t\tjns\t\tlabel6\r\n\t\tneg\t\tal\r\n\t\tcmp\t\tal, 41h\r\n\t\tjle\t\tlabel3\r\n\t\tsub\t\tal, 41h\r\n\t\tdec\t\tecx\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tsub\t\tebx, eax\r\n\tlabel2:\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel2\r\n\t\tjmp\t\tlabel5\r\n\tlabel3:\r\n\t\tsub\t\tecx, eax\r\n\t\tsub\t\tebx, eax\r\n\tlabel4:\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel4\r\n\tlabel5:\r\n\t\ttest\tebx, ebx\r\n\t\tjnz\t\tlabel10\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tjmp\t\tlabel10\r\n\tlabel6:\r\n\t\tcmp\t\teax, ebx\r\n\t\tjle\t\tlabel7\r\n\t\tmov\t\tedx, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tsub\t\teax, ebx\r\n\t\tjmp\t\tlabel8\r\n\tlabel7:\r\n\t\tmov\t\tedx, eax\r\n\t\tadd\t\tedi, eax\r\n\t\txor\t\teax, eax\r\n\tlabel8:\r\n\t\tsub\t\tebx, edx\r\n\t\tjnz\t\tlabel9\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\tlabel9:\r\n\t\ttest\teax, eax\r\n\t\tjnz\t\tlabel6\r\n\tlabel10:\r\n\t\ttest\tecx, ecx\r\n\t\tjnz\t\tlabel1\r\n\t\tpop\t\tedi\r\n\t\tpop\t\tesi\r\n\t\tpop\t\tebx\r\n\t}\r\n#else\r\n\tint w;\r\n\tchar width;\r\n\tBYTE fill;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\r\n\twhile (nDataSize) {\r\n\t\twidth = *src++;\r\n\t\tnDataSize--;\r\n\t\tif (width < 0) {\r\n\t\t\twidth = -width;\r\n\t\t\tif (width > 65) {\r\n\t\t\t\twidth -= 65;\r\n\t\t\t\tnDataSize--;\r\n\t\t\t\tfill = *src++;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\t*dst = fill;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t\tif (!w) {\r\n\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t} else {\r\n\t\t\t\tnDataSize -= width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\t*dst = *src;\r\n\t\t\t\t\tsrc++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t\tif (!w) {\r\n\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (width) {\r\n\t\t\tif (width > w) {\r\n\t\t\t\tdst += w;\r\n\t\t\t\twidth -= w;\r\n\t\t\t\tw = 0;\r\n\t\t\t} else {\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twidth = 0;\r\n\t\t\t}\r\n\t\t\tif (!w) {\r\n\t\t\t\tw = nWidth;\r\n\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the given buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CL2 pixel stream (run-length encoded)\r\n * @param nDataSize Size of CL2 in bytes\r\n * @param nWidth Width of sprite\r\n * @param col Color index from current palette\r\n */\r\nstatic void Cl2BlitOutline(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col)\r\n{\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tpush\tebx\r\n\t\tpush\tesi\r\n\t\tpush\tedi\r\n\t\tmov\t\tesi, edx /// UNSAFE: use 'mov esi, pRLEBytes'\r\n\t\tmov\t\tedi, ecx /// UNSAFE: use 'mov edi, pDecodeTo'\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tebx, nWidth\r\n\t\txor\t\tedx, edx\r\n\t\tmov\t\tecx, nDataSize\r\n\t\tmov\t\tdl, col\r\n\tlabel1:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tdec\t\tecx\r\n\t\ttest\tal, al\r\n\t\tjns\t\tlabel7\r\n\t\tneg\t\tal\r\n\t\tcmp\t\tal, 41h\r\n\t\tjle\t\tlabel3\r\n\t\tsub\t\tal, 41h\r\n\t\tdec\t\tecx\r\n\t\tmov\t\tdh, [esi]\r\n\t\tinc\t\tesi\r\n\t\ttest\tdh, dh\r\n\t\tjz\t\tlabel7\r\n\t\tmov\t\t[edi-1], dl\r\n\t\tsub\t\tebx, eax\r\n\t\tmov\t\t[edi+eax], dl\r\n\tlabel2:\r\n\t\tmov\t\t[edi-BUFFER_WIDTH], dl\r\n\t\tmov\t\t[edi+BUFFER_WIDTH], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel2\r\n\t\tjmp\t\tlabel6\r\n\tlabel3:\r\n\t\tsub\t\tecx, eax\r\n\t\tsub\t\tebx, eax\r\n\tlabel4:\r\n\t\tmov\t\tdh, [esi]\r\n\t\tinc\t\tesi\r\n\t\ttest\tdh, dh\r\n\t\tjz\t\tlabel5\r\n\t\tmov\t\t[edi-1], dl\r\n\t\tmov\t\t[edi+1], dl\r\n\t\tmov\t\t[edi-BUFFER_WIDTH], dl\r\n\t\tmov\t\t[edi+BUFFER_WIDTH], dl\r\n\tlabel5:\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel4\r\n\tlabel6:\r\n\t\ttest\tebx, ebx\r\n\t\tjnz\t\tlabel11\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tjmp\t\tlabel11\r\n\tlabel7:\r\n\t\tcmp\t\teax, ebx\r\n\t\tjle\t\tlabel8\r\n\t\tmov\t\tedx, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tsub\t\teax, ebx\r\n\t\tjmp\t\tlabel9\r\n\tlabel8:\r\n\t\tmov\t\tedx, eax\r\n\t\tadd\t\tedi, eax\r\n\t\txor\t\teax, eax\r\n\tlabel9:\r\n\t\tsub\t\tebx, edx\r\n\t\tjnz\t\tlabel10\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\tlabel10:\r\n\t\ttest\teax, eax\r\n\t\tjnz\t\tlabel7\r\n\t\tmov\t\tdl, col\r\n\tlabel11:\r\n\t\ttest\tecx, ecx\r\n\t\tjnz\t\tlabel1\r\n\t\tpop\t\tedi\r\n\t\tpop\t\tesi\r\n\t\tpop\t\tebx\r\n\t}\r\n#else\r\n\tint w;\r\n\tchar width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\r\n\twhile (nDataSize) {\r\n\t\twidth = *src++;\r\n\t\tnDataSize--;\r\n\t\tif (width < 0) {\r\n\t\t\twidth = -width;\r\n\t\t\tif (width > 65) {\r\n\t\t\t\twidth -= 65;\r\n\t\t\t\tnDataSize--;\r\n\t\t\t\tif (*src++) {\r\n\t\t\t\t\tw -= width;\r\n\t\t\t\t\tdst[-1] = col;\r\n\t\t\t\t\tdst[width] = col;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\tdst[-BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\tdst[BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!w) {\r\n\t\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnDataSize -= width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\tif (*src++) {\r\n\t\t\t\t\t\tdst[-1] = col;\r\n\t\t\t\t\t\tdst[1] = col;\r\n\t\t\t\t\t\tdst[-BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\tdst[BUFFER_WIDTH] = col;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t\tif (!w) {\r\n\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (width) {\r\n\t\t\tif (width > w) {\r\n\t\t\t\tdst += w;\r\n\t\t\t\twidth -= w;\r\n\t\t\t\tw = 0;\r\n\t\t\t} else {\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twidth = 0;\r\n\t\t\t}\r\n\t\t\tif (!w) {\r\n\t\t\t\tw = nWidth;\r\n\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit CL2 sprite, and apply lighting, to the given buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CL2 pixel stream (run-length encoded)\r\n * @param nDataSize Size of CL2 in bytes\r\n * @param nWidth Width of sprite\r\n * @param pTable Light color table\r\n */\r\nstatic void Cl2BlitLight(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable)\r\n{\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tpush\tebx\r\n\t\tpush\tesi\r\n\t\tpush\tedi\r\n\t\tmov\t\tesi, edx /// UNSAFE: use 'mov esi, pRLEBytes'\r\n\t\tmov\t\tedi, ecx /// UNSAFE: use 'mov edi, pDecodeTo'\r\n\t\tmov\t\tebx, nWidth\r\n\t\tmov\t\tecx, nDataSize\r\n\t\tmov\t\tedx, pTable\r\n\t\tpush\tebp\r\n\t\tmov\t\tsgnWidth, ebx\r\n\t\tmov\t\tebp, edx\r\n\t\txor\t\teax, eax\r\n\t\txor\t\tedx, edx\r\n\tlabel1:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tdec\t\tecx\r\n\t\ttest\tal, al\r\n\t\tjns\t\tlabel6\r\n\t\tneg\t\tal\r\n\t\tcmp\t\tal, 41h\r\n\t\tjle\t\tlabel3\r\n\t\tsub\t\tal, 41h\r\n\t\tdec\t\tecx\r\n\t\tsub\t\tebx, eax\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tdl, [ebp+edx]\r\n\tlabel2:\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel2\r\n\t\tjmp\t\tlabel5\r\n\tlabel3:\r\n\t\tsub\t\tecx, eax\r\n\t\tsub\t\tebx, eax\r\n\tlabel4:\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tdl, [ebp+edx]\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel4\r\n\tlabel5:\r\n\t\ttest\tebx, ebx\r\n\t\tjnz\t\tlabel10\r\n\t\tmov\t\tebx, sgnWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tjmp\t\tlabel10\r\n\tlabel6:\r\n\t\tcmp\t\teax, ebx\r\n\t\tjle\t\tlabel7\r\n\t\tmov\t\tedx, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tsub\t\teax, ebx\r\n\t\tjmp\t\tlabel8\r\n\tlabel7:\r\n\t\tmov\t\tedx, eax\r\n\t\tadd\t\tedi, eax\r\n\t\txor\t\teax, eax\r\n\tlabel8:\r\n\t\tsub\t\tebx, edx\r\n\t\tjnz\t\tlabel9\r\n\t\tmov\t\tebx, sgnWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\tlabel9:\r\n\t\ttest\teax, eax\r\n\t\tjnz\t\tlabel6\r\n\tlabel10:\r\n\t\ttest\tecx, ecx\r\n\t\tjnz\t\tlabel1\r\n\t\tpop\t\tebp\r\n\t\tpop\t\tedi\r\n\t\tpop\t\tesi\r\n\t\tpop\t\tebx\r\n\t}\r\n#else\r\n\tint w;\r\n\tchar width;\r\n\tBYTE fill;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\tsgnWidth = nWidth;\r\n\r\n\twhile (nDataSize) {\r\n\t\twidth = *src++;\r\n\t\tnDataSize--;\r\n\t\tif (width < 0) {\r\n\t\t\twidth = -width;\r\n\t\t\tif (width > 65) {\r\n\t\t\t\twidth -= 65;\r\n\t\t\t\tnDataSize--;\r\n\t\t\t\tfill = pTable[*src++];\r\n\t\t\t\tw -= width;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\t*dst = fill;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t\tif (!w) {\r\n\t\t\t\t\tw = sgnWidth;\r\n\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t} else {\r\n\t\t\t\tnDataSize -= width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twhile (width) {\r\n\t\t\t\t\t*dst = pTable[*src];\r\n\t\t\t\t\tsrc++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t\twidth--;\r\n\t\t\t\t}\r\n\t\t\t\tif (!w) {\r\n\t\t\t\t\tw = sgnWidth;\r\n\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (width) {\r\n\t\t\tif (width > w) {\r\n\t\t\t\tdst += w;\r\n\t\t\t\twidth -= w;\r\n\t\t\t\tw = 0;\r\n\t\t\t} else {\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twidth = 0;\r\n\t\t\t}\r\n\t\t\tif (!w) {\r\n\t\t\t\tw = sgnWidth;\r\n\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as Cl2Blit but checks for drawing outside the buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CL2 pixel stream (run-length encoded)\r\n * @param nDataSize Size of CL2 in bytes\r\n * @param nWidth Width of sprite\r\n */\r\nstatic void Cl2BlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)\r\n{\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tpush\tebx\r\n\t\tpush\tesi\r\n\t\tpush\tedi\r\n\t\tmov\t\tesi, edx /// UNSAFE: use 'mov esi, pRLEBytes'\r\n\t\tmov\t\tedi, ecx /// UNSAFE: use 'mov edi, pDecodeTo'\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tebx, nWidth\r\n\t\tmov\t\tecx, nDataSize\r\n\tlabel1:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tdec\t\tecx\r\n\t\ttest\tal, al\r\n\t\tjns\t\tlabel7\r\n\t\tneg\t\tal\r\n\t\tcmp\t\tal, 41h\r\n\t\tjle\t\tlabel3\r\n\t\tsub\t\tal, 41h\r\n\t\tdec\t\tecx\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjge\t\tlabel7\r\n\t\tsub\t\tebx, eax\r\n\tlabel2:\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel2\r\n\t\tjmp\t\tlabel6\r\n\tlabel3:\r\n\t\tsub\t\tecx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjl\t\tlabel4\r\n\t\tadd\t\tesi, eax\r\n\t\tjmp\t\tlabel7\r\n\tlabel4:\r\n\t\tsub\t\tebx, eax\r\n\tlabel5:\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel5\r\n\tlabel6:\r\n\t\ttest\tebx, ebx\r\n\t\tjnz\t\tlabel11\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tjmp\t\tlabel11\r\n\tlabel7:\r\n\t\tcmp\t\teax, ebx\r\n\t\tjle\t\tlabel8\r\n\t\tmov\t\tedx, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tsub\t\teax, ebx\r\n\t\tjmp\t\tlabel9\r\n\tlabel8:\r\n\t\tmov\t\tedx, eax\r\n\t\tadd\t\tedi, eax\r\n\t\txor\t\teax, eax\r\n\tlabel9:\r\n\t\tsub\t\tebx, edx\r\n\t\tjnz\t\tlabel10\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\tlabel10:\r\n\t\ttest\teax, eax\r\n\t\tjnz\t\tlabel7\r\n\tlabel11:\r\n\t\ttest\tecx, ecx\r\n\t\tjnz\t\tlabel1\r\n\t\tpop\t\tedi\r\n\t\tpop\t\tesi\r\n\t\tpop\t\tebx\r\n\t}\r\n#else\r\n\tint w;\r\n\tchar width;\r\n\tBYTE fill;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\r\n\twhile (nDataSize) {\r\n\t\twidth = *src++;\r\n\t\tnDataSize--;\r\n\t\tif (width < 0) {\r\n\t\t\twidth = -width;\r\n\t\t\tif (width > 65) {\r\n\t\t\t\twidth -= 65;\r\n\t\t\t\tnDataSize--;\r\n\t\t\t\tfill = *src++;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tw -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t*dst = fill;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!w) {\r\n\t\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnDataSize -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tw -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t*dst = *src;\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!w) {\r\n\t\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (width) {\r\n\t\t\tif (width > w) {\r\n\t\t\t\tdst += w;\r\n\t\t\t\twidth -= w;\r\n\t\t\t\tw = 0;\r\n\t\t\t} else {\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twidth = 0;\r\n\t\t\t}\r\n\t\t\tif (!w) {\r\n\t\t\t\tw = nWidth;\r\n\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as Cl2BlitOutline but checks for drawing outside the buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CL2 pixel stream (run-length encoded)\r\n * @param nDataSize Size of CL2 in bytes\r\n * @param nWidth Width of sprite\r\n * @param col Color index from current palette\r\n */\r\nstatic void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col)\r\n{\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tpush\tebx\r\n\t\tpush\tesi\r\n\t\tpush\tedi\r\n\t\tmov\t\tesi, edx /// UNSAFE: use 'mov esi, pRLEBytes'\r\n\t\tmov\t\tedi, ecx /// UNSAFE: use 'mov edi, pDecodeTo'\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tebx, nWidth\r\n\t\txor\t\tedx, edx\r\n\t\tmov\t\tecx, nDataSize\r\n\t\tmov\t\tdl, col\r\n\tlabel1:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tdec\t\tecx\r\n\t\ttest\tal, al\r\n\t\tjns\t\tlabel9\r\n\t\tneg\t\tal\r\n\t\tcmp\t\tal, 41h\r\n\t\tjle\t\tlabel3\r\n\t\tsub\t\tal, 41h\r\n\t\tdec\t\tecx\r\n\t\tmov\t\tdh, [esi]\r\n\t\tinc\t\tesi\r\n\t\ttest\tdh, dh\r\n\t\tjz\t\tlabel9\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjge\t\tlabel9\r\n\t\tmov\t\t[edi-1], dl\r\n\t\tsub\t\tebx, eax\r\n\t\tmov\t\t[edi+eax], dl\r\n\tlabel2:\r\n\t\tmov\t\t[edi-BUFFER_WIDTH], dl\r\n\t\tmov\t\t[edi+BUFFER_WIDTH], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel2\r\n\t\tjmp\t\tlabel7\r\n\tlabel3:\r\n\t\tsub\t\tecx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjl\t\tlabel4\r\n\t\tadd\t\tesi, eax\r\n\t\tjmp\t\tlabel9\r\n\tlabel4:\r\n\t\tsub\t\tebx, eax\r\n\tlabel5:\r\n\t\tmov\t\tdh, [esi]\r\n\t\tinc\t\tesi\r\n\t\ttest\tdh, dh\r\n\t\tjz\t\tlabel6\r\n\t\tmov\t\t[edi-1], dl\r\n\t\tmov\t\t[edi+1], dl\r\n\t\tmov\t\t[edi-BUFFER_WIDTH], dl\r\n\t\tmov\t\t[edi+BUFFER_WIDTH], dl\r\n\tlabel6:\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel5\r\n\tlabel7:\r\n\t\ttest\tebx, ebx\r\n\t\tjnz\t\tlabel13\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tjmp\t\tlabel13\r\n\tlabel9:\r\n\t\tcmp\t\teax, ebx\r\n\t\tjle\t\tlabel10\r\n\t\tmov\t\tedx, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tsub\t\teax, ebx\r\n\t\tjmp\t\tlabel11\r\n\tlabel10:\r\n\t\tmov\t\tedx, eax\r\n\t\tadd\t\tedi, eax\r\n\t\txor\t\teax, eax\r\n\tlabel11:\r\n\t\tsub\t\tebx, edx\r\n\t\tjnz\t\tlabel12\r\n\t\tmov\t\tebx, nWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\tlabel12:\r\n\t\ttest\teax, eax\r\n\t\tjnz\t\tlabel9\r\n\t\tmov\t\tdl, col\r\n\tlabel13:\r\n\t\ttest\tecx, ecx\r\n\t\tjnz\t\tlabel1\r\n\t\tpop\t\tedi\r\n\t\tpop\t\tesi\r\n\t\tpop\t\tebx\r\n\t}\r\n#else\r\n\tint w;\r\n\tchar width;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\r\n\twhile (nDataSize) {\r\n\t\twidth = *src++;\r\n\t\tnDataSize--;\r\n\t\tif (width < 0) {\r\n\t\t\twidth = -width;\r\n\t\t\tif (width > 65) {\r\n\t\t\t\twidth -= 65;\r\n\t\t\t\tnDataSize--;\r\n\t\t\t\tif (*src++ && dst < gpBufEnd) {\r\n\t\t\t\t\tw -= width;\r\n\t\t\t\t\tdst[-1] = col;\r\n\t\t\t\t\tdst[width] = col;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\tdst[-BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\tdst[BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!w) {\r\n\t\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnDataSize -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tw -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\tif (*src++) {\r\n\t\t\t\t\t\t\tdst[-1] = col;\r\n\t\t\t\t\t\t\tdst[1] = col;\r\n\t\t\t\t\t\t\tdst[-BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\t\t// BUGFIX: only set `if (dst+BUFFER_WIDTH < gpBufEnd)`\r\n\t\t\t\t\t\t\tdst[BUFFER_WIDTH] = col;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!w) {\r\n\t\t\t\t\t\tw = nWidth;\r\n\t\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (width) {\r\n\t\t\tif (width > w) {\r\n\t\t\t\tdst += w;\r\n\t\t\t\twidth -= w;\r\n\t\t\t\tw = 0;\r\n\t\t\t} else {\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twidth = 0;\r\n\t\t\t}\r\n\t\t\tif (!w) {\r\n\t\t\t\tw = nWidth;\r\n\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Same as Cl2BlitLight but checks for drawing outside the buffer\r\n * @param pDecodeTo The output buffer\r\n * @param pRLEBytes CL2 pixel stream (run-length encoded)\r\n * @param nDataSize Size of CL2 in bytes\r\n * @param nWidth With of CL2 sprite\r\n * @param pTable Light color table\r\n */\r\nstatic void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable)\r\n{\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tpush\tebx\r\n\t\tpush\tesi\r\n\t\tpush\tedi\r\n\t\tmov\t\tesi, edx /// UNSAFE: use 'mov esi, pRLEBytes'\r\n\t\tmov\t\tedi, ecx /// UNSAFE: use 'mov edi, pDecodeTo'\r\n\t\tmov\t\tebx, nWidth\r\n\t\tmov\t\tecx, nDataSize\r\n\t\tmov\t\tedx, pTable\r\n\t\tpush\tebp\r\n\t\tmov\t\tsgnWidth, ebx\r\n\t\tmov\t\tebp, edx\r\n\t\txor\t\teax, eax\r\n\t\txor\t\tedx, edx\r\n\tlabel1:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tdec\t\tecx\r\n\t\ttest\tal, al\r\n\t\tjns\t\tlabel7\r\n\t\tneg\t\tal\r\n\t\tcmp\t\tal, 41h\r\n\t\tjle\t\tlabel3\r\n\t\tsub\t\tal, 41h\r\n\t\tdec\t\tecx\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tdl, [ebp+edx]\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjge\t\tlabel7\r\n\t\tsub\t\tebx, eax\r\n\tlabel2:\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel2\r\n\t\tjmp\t\tlabel6\r\n\tlabel3:\r\n\t\tsub\t\tecx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjl\t\tlabel4\r\n\t\tadd\t\tesi, eax\r\n\t\tjmp\t\tlabel7\r\n\tlabel4:\r\n\t\tsub\t\tebx, eax\r\n\tlabel5:\r\n\t\tmov\t\tdl, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tdl, [ebp+edx]\r\n\t\tmov\t\t[edi], dl\r\n\t\tdec\t\teax\r\n\t\tlea\t\tedi, [edi+1]\r\n\t\tjnz\t\tlabel5\r\n\tlabel6:\r\n\t\ttest\tebx, ebx\r\n\t\tjnz\t\tlabel11\r\n\t\tmov\t\tebx, sgnWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tjmp\t\tlabel11\r\n\tlabel7:\r\n\t\tcmp\t\teax, ebx\r\n\t\tjle\t\tlabel8\r\n\t\tmov\t\tedx, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tsub\t\teax, ebx\r\n\t\tjmp\t\tlabel9\r\n\tlabel8:\r\n\t\tmov\t\tedx, eax\r\n\t\tadd\t\tedi, eax\r\n\t\txor\t\teax, eax\r\n\tlabel9:\r\n\t\tsub\t\tebx, edx\r\n\t\tjnz\t\tlabel10\r\n\t\tmov\t\tebx, sgnWidth\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\tlabel10:\r\n\t\ttest\teax, eax\r\n\t\tjnz\t\tlabel7\r\n\tlabel11:\r\n\t\ttest\tecx, ecx\r\n\t\tjnz\t\tlabel1\r\n\t\tpop\t\tebp\r\n\t\tpop\t\tedi\r\n\t\tpop\t\tesi\r\n\t\tpop\t\tebx\r\n\t}\r\n#else\r\n\tint w;\r\n\tchar width;\r\n\tBYTE fill;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = pRLEBytes;\r\n\tdst = pDecodeTo;\r\n\tw = nWidth;\r\n\tsgnWidth = nWidth;\r\n\r\n\twhile (nDataSize) {\r\n\t\twidth = *src++;\r\n\t\tnDataSize--;\r\n\t\tif (width < 0) {\r\n\t\t\twidth = -width;\r\n\t\t\tif (width > 65) {\r\n\t\t\t\twidth -= 65;\r\n\t\t\t\tnDataSize--;\r\n\t\t\t\tfill = pTable[*src++];\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tw -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t*dst = fill;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!w) {\r\n\t\t\t\t\t\tw = sgnWidth;\r\n\t\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tnDataSize -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tw -= width;\r\n\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t*dst = pTable[*src];\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!w) {\r\n\t\t\t\t\t\tw = sgnWidth;\r\n\t\t\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (width) {\r\n\t\t\tif (width > w) {\r\n\t\t\t\tdst += w;\r\n\t\t\t\twidth -= w;\r\n\t\t\t\tw = 0;\r\n\t\t\t} else {\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t\twidth = 0;\r\n\t\t\t}\r\n\t\t\tif (!w) {\r\n\t\t\t\tw = sgnWidth;\r\n\t\t\t\tdst -= BUFFER_WIDTH + w;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Blit CL2 sprite, to the back buffer at the given coordianates\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\tint nDataStart, nDataSize;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tCl2Blit(\r\n\t    &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]],\r\n\t    pRLEBytes + nDataStart,\r\n\t    nDataSize - nDataStart,\r\n\t    nWidth);\r\n}\r\n\r\n/**\r\n * @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the back buffer at the given coordianates\r\n * @param col Color index from current palette\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize;\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tCl2BlitOutline(\r\n\t    &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]],\r\n\t    pRLEBytes + nDataStart,\r\n\t    nDataSize - nDataStart,\r\n\t    nWidth,\r\n\t    col);\r\n}\r\n\r\n/**\r\n * @brief Blit CL2 sprite, and apply a given lighting, to the back buffer at the given coordianates\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n * @param light Light shade to use\r\n */\r\nvoid Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light)\r\n{\r\n\tint nDataStart, nDataSize, idx, nSize;\r\n\tBYTE *pRLEBytes, *pDecodeTo;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tnSize = nDataSize - nDataStart;\r\n\tpRLEBytes += nDataStart;\r\n\tpDecodeTo = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tidx = light4flag ? 1024 : 4096;\r\n\tif (light == 2)\r\n\t\tidx += 256; // gray colors\r\n\tif (light >= 4)\r\n\t\tidx += (light - 1) << 8;\r\n\r\n\tCl2BlitLight(\r\n\t    pDecodeTo,\r\n\t    pRLEBytes,\r\n\t    nSize,\r\n\t    nWidth,\r\n\t    &pLightTbl[idx]);\r\n}\r\n\r\n/**\r\n * @brief Blit CL2 sprite, and apply lighting, to the back buffer at the given coordinates\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid Cl2DrawLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nSize;\r\n\tBYTE *pRLEBytes, *pDecodeTo;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tnSize = nDataSize - nDataStart;\r\n\tpRLEBytes += nDataStart;\r\n\tpDecodeTo = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tif (light_table_index)\r\n\t\tCl2BlitLight(pDecodeTo, pRLEBytes, nSize, nWidth, &pLightTbl[light_table_index * 256]);\r\n\telse\r\n\t\tCl2Blit(pDecodeTo, pRLEBytes, nSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as Cl2Draw but checks for drawing outside the buffer\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid Cl2DrawSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\tint nDataStart, nDataSize;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tCl2BlitSafe(\r\n\t    &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]],\r\n\t    pRLEBytes + nDataStart,\r\n\t    nDataSize - nDataStart,\r\n\t    nWidth);\r\n}\r\n\r\n/**\r\n * @brief Same as Cl2DrawOutline but checks for drawing outside the buffer\r\n * @param col Color index from current palette\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid Cl2DrawOutlineSafe(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize;\r\n\tBYTE *pRLEBytes;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tgpBufEnd -= BUFFER_WIDTH;\r\n\tCl2BlitOutlineSafe(\r\n\t    &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]],\r\n\t    pRLEBytes + nDataStart,\r\n\t    nDataSize - nDataStart,\r\n\t    nWidth,\r\n\t    col);\r\n\tgpBufEnd += BUFFER_WIDTH;\r\n}\r\n\r\n/**\r\n * @brief Same as Cl2DrawLightTbl but checks for drawing outside the buffer\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n * @param light light shade to use\r\n */\r\nvoid Cl2DrawLightTblSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light)\r\n{\r\n\tint nDataStart, nDataSize, idx, nSize;\r\n\tBYTE *pRLEBytes, *pDecodeTo;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tnSize = nDataSize - nDataStart;\r\n\tpRLEBytes += nDataStart;\r\n\tpDecodeTo = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tidx = light4flag ? 1024 : 4096;\r\n\tif (light == 2)\r\n\t\tidx += 256; // gray colors\r\n\tif (light >= 4)\r\n\t\tidx += (light - 1) << 8;\r\n\r\n\tCl2BlitLightSafe(\r\n\t    pDecodeTo,\r\n\t    pRLEBytes,\r\n\t    nSize,\r\n\t    nWidth,\r\n\t    &pLightTbl[idx]);\r\n}\r\n\r\n/**\r\n * @brief Same as Cl2DrawLight but checks for drawing outside the buffer\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff CL2 buffer\r\n * @param nCel CL2 frame number\r\n * @param nWidth Width of sprite\r\n * @param CelSkip Skip lower parts of sprite, must be multiple of 2, max 8\r\n * @param CelCap Amount of sprite to render from lower to upper, must be multiple of 2, max 8\r\n */\r\nvoid Cl2DrawLightSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint nDataStart, nDataSize, nSize;\r\n\tBYTE *pRLEBytes, *pDecodeTo;\r\n\tDWORD *pFrameTable;\r\n\r\n\tassert(gpBuffer != NULL);\r\n\tif (gpBuffer == NULL)\r\n\t\treturn;\r\n\tassert(pCelBuff != NULL);\r\n\tif (pCelBuff == NULL)\r\n\t\treturn;\r\n\tassert(nCel > 0);\r\n\tif (nCel <= 0)\r\n\t\treturn;\r\n\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tassert(nCel <= (int)pFrameTable[0]);\r\n\tpRLEBytes = &pCelBuff[pFrameTable[nCel]];\r\n\tnDataStart = *(WORD *)&pRLEBytes[CelSkip];\r\n\tif (!nDataStart)\r\n\t\treturn;\r\n\r\n\tif (CelCap == 8)\r\n\t\tnDataSize = 0;\r\n\telse\r\n\t\tnDataSize = *(WORD *)&pRLEBytes[CelCap];\r\n\tif (!nDataSize)\r\n\t\tnDataSize = pFrameTable[nCel + 1] - pFrameTable[nCel];\r\n\r\n\tnSize = nDataSize - nDataStart;\r\n\tpRLEBytes += nDataStart;\r\n\tpDecodeTo = &gpBuffer[sx + PitchTbl[sy - 16 * CelSkip]];\r\n\r\n\tif (light_table_index)\r\n\t\tCl2BlitLightSafe(pDecodeTo, pRLEBytes, nSize, nWidth, &pLightTbl[light_table_index * 256]);\r\n\telse\r\n\t\tCl2BlitSafe(pDecodeTo, pRLEBytes, nSize, nWidth);\r\n}\r\n\r\n/**\r\n * @brief Fade to black and play a video\r\n * @param pszMovie file path of movie\r\n */\r\nvoid PlayInGameMovie(const char *pszMovie)\r\n{\r\n\tPaletteFadeOut(8);\r\n\tplay_movie(pszMovie, FALSE);\r\n\tClearScreenBuffer();\r\n\tforce_redraw = 255;\r\n\tscrollrt_draw_game_screen(TRUE);\r\n\tPaletteFadeIn(8);\r\n\tforce_redraw = 255;\r\n}\r\n"
  },
  {
    "path": "Source/engine.h",
    "content": "/**\r\n * @file engine.h\r\n *\r\n *  of basic engine helper functions:\r\n * - Sprite blitting\r\n * - Drawing\r\n * - Angle calculation\r\n * - RNG\r\n * - Memory allocation\r\n * - File loading\r\n * - Video playback\r\n */\r\n#ifndef __ENGINE_H__\r\n#define __ENGINE_H__\r\n\r\n__FINLINE BYTE *CelGetFrame(BYTE *pCelBuff, int nCel, int *nDataSize);\r\n\r\nvoid CelBlit(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth);\r\nvoid CelDraw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth);\r\nvoid CelBlitFrame(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth);\r\nvoid CelClippedDraw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelClippedBlit(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelBlitLight(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth);\r\nvoid CelBlitLightTrans(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth);\r\nvoid CelDrawLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth);\r\nvoid CelClippedDrawLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelClippedBlitLightTrans(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelDrawLightRed(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light);\r\nvoid CelBlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth);\r\nvoid CelClippedDrawSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelClippedBlitSafe(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelBlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth);\r\nvoid CelBlitLightTransSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth);\r\nvoid CelDrawLightSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelClippedBlitLightTransSafe(BYTE *pBuff, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelDrawLightRedSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light);\r\nvoid CelBlitWidth(BYTE *pBuff, int x, int y, int wdt, BYTE *pCelBuff, int nCel, int nWidth);\r\nvoid CelBlitOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid CelBlitOutlineSafe(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid ENG_set_pixel(int sx, int sy, BYTE col);\r\nvoid engine_draw_pixel(int sx, int sy);\r\nvoid DrawLine(int x0, int y0, int x1, int y1, BYTE col);\r\nint GetDirection(int x1, int y1, int x2, int y2);\r\nvoid SetRndSeed(int s);\r\nint GetRndSeed();\r\nint random_(BYTE idx, int v);\r\nvoid engine_debug_trap(BOOL show_cursor);\r\nBYTE *DiabloAllocPtr(DWORD dwBytes);\r\nvoid mem_free_dbg(void *p);\r\nBYTE *LoadFileInMem(const char *pszName, DWORD *pdwFileLen);\r\nDWORD LoadFileWithMem(const char *pszName, BYTE *p);\r\nvoid Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel);\r\nvoid Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light);\r\nvoid Cl2DrawLight(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid Cl2DrawSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid Cl2DrawOutlineSafe(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid Cl2DrawLightTblSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap, char light);\r\nvoid Cl2DrawLightSafe(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap);\r\nvoid PlayInGameMovie(const char *pszMovie);\r\n\r\n#endif /* __ENGINE_H__ */\r\n"
  },
  {
    "path": "Source/error.cpp",
    "content": "/**\r\n * @file error.cpp\r\n *\r\n * Implementation of in-game message functions.\r\n */\r\n#include \"all.h\"\r\n\r\nchar msgtable[MAX_SEND_STR_LEN];\r\nchar msgdelay;\r\nchar msgflag;\r\nchar msgcnt;\r\n\r\n/** Maps from error_id to error message. */\r\nconst char *const MsgStrings[] = {\r\n\t\"\",\r\n\t\"No automap available in town\",\r\n\t\"No multiplayer functions in demo\",\r\n\t\"Direct Sound Creation Failed\",\r\n\t\"Not available in shareware version\",\r\n\t\"Not enough space to save\",\r\n\t\"No Pause in town\",\r\n\t\"Copying to a hard disk is recommended\",\r\n\t\"Multiplayer sync problem\",\r\n\t\"No pause in multiplayer\",\r\n\t\"Loading...\",\r\n\t\"Saving...\",\r\n\t\"Some are weakened as one grows strong\",\r\n\t\"New strength is forged through destruction\",\r\n\t\"Those who defend seldom attack\",\r\n\t\"The sword of justice is swift and sharp\",\r\n\t\"While the spirit is vigilant the body thrives\",\r\n\t\"The powers of mana refocused renews\",\r\n\t\"Time cannot diminish the power of steel\",\r\n\t\"Magic is not always what it seems to be\",\r\n\t\"What once was opened now is closed\",\r\n\t\"Intensity comes at the cost of wisdom\",\r\n\t\"Arcane power brings destruction\",\r\n\t\"That which cannot be held cannot be harmed\",\r\n\t\"Crimson and Azure become as the sun\",\r\n\t\"Knowledge and wisdom at the cost of self\",\r\n\t\"Drink and be refreshed\",\r\n\t\"Wherever you go, there you are\",\r\n\t\"Energy comes at the cost of wisdom\",\r\n\t\"Riches abound when least expected\",\r\n\t\"Where avarice fails, patience gains reward\",\r\n\t\"Blessed by a benevolent companion!\",\r\n\t\"The hands of men may be guided by fate\",\r\n\t\"Strength is bolstered by heavenly faith\",\r\n\t\"The essence of life flows from within\",\r\n\t\"The way is made clear when viewed from above\",\r\n\t\"Salvation comes at the cost of wisdom\",\r\n\t\"Mysteries are revealed in the light of reason\",\r\n\t\"Those who are last may yet be first\",\r\n\t\"Generosity brings its own rewards\",\r\n\t\"You must be at least level 8 to use this.\",\r\n\t\"You must be at least level 13 to use this.\",\r\n\t\"You must be at least level 17 to use this.\",\r\n\t\"Arcane knowledge gained!\",\r\n#ifdef HELLFIRE\r\n\t\"That which does not kill you...\",\r\n\t\"Knowledge is power.\",\r\n\t\"Give and you shall receive.\",\r\n\t\"Some experience is gained by touch.\",\r\n\t\"There's no place like home.\",\r\n\t\"Spirtual energy is restored.\",\r\n\t\"You feel more agile.\",\r\n\t\"You feel stronger.\",\r\n\t\"You feel wiser.\",\r\n\t\"You feel refreshed.\",\r\n\t\"That which can break will.\",\r\n#endif\r\n};\r\n\r\nvoid InitDiabloMsg(char e)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < msgcnt; i++) {\r\n\t\tif (msgtable[i] == e)\r\n\t\t\treturn;\r\n\t}\r\n\r\n\tmsgtable[msgcnt] = e; // BUGFIX: missing out-of-bounds check\r\n\tif (msgcnt < (BYTE)sizeof(msgtable))\r\n\t\tmsgcnt++;\r\n\r\n\tmsgflag = msgtable[0];\r\n\tmsgdelay = 70;\r\n}\r\n\r\nvoid ClrDiabloMsg()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < sizeof(msgtable); i++)\r\n\t\tmsgtable[i] = 0;\r\n\r\n\tmsgflag = 0;\r\n\tmsgcnt = 0;\r\n}\r\n\r\nvoid DrawDiabloMsg()\r\n{\r\n\tint i, len, off, width, sx, sy;\r\n\tBYTE c;\r\n\r\n\tCelDraw(PANEL_X + 101, DIALOG_Y, pSTextSlidCels, 1, 12);\r\n\tCelDraw(PANEL_X + 527, DIALOG_Y, pSTextSlidCels, 4, 12);\r\n\tCelDraw(PANEL_X + 101, DIALOG_Y + 48, pSTextSlidCels, 2, 12);\r\n\tCelDraw(PANEL_X + 527, DIALOG_Y + 48, pSTextSlidCels, 3, 12);\r\n\r\n\tsx = PANEL_X + 109;\r\n\tfor (i = 0; i < 35; i++) {\r\n\t\tCelDraw(sx, DIALOG_Y, pSTextSlidCels, 5, 12);\r\n\t\tCelDraw(sx, DIALOG_Y + 48, pSTextSlidCels, 7, 12);\r\n\t\tsx += 12;\r\n\t}\r\n\tsy = DIALOG_Y + 12;\r\n\tfor (i = 0; i < 3; i++) {\r\n\t\tCelDraw(PANEL_X + 101, sy, pSTextSlidCels, 6, 12);\r\n\t\tCelDraw(PANEL_X + 527, sy, pSTextSlidCels, 8, 12);\r\n\t\tsy += 12;\r\n\t}\r\n\r\n\tassert(gpBuffer);\r\n\r\n#define TRANS_RECT_X (PANEL_LEFT + 104)\r\n#define TRANS_RECT_Y (DIALOG_TOP - 8)\r\n#define TRANS_RECT_WIDTH 432\r\n#define TRANS_RECT_HEIGHT 54\r\n#include \"asm_trans_rect.inc\"\r\n\r\n\tstrcpy(tempstr, MsgStrings[msgflag]);\r\n\toff = PANEL_X + 101 + PitchTbl[DIALOG_Y + 24];\r\n\tlen = strlen(tempstr);\r\n\twidth = 0;\r\n\r\n\tfor (i = 0; i < len; i++) {\r\n\t\twidth += fontkern[fontframe[gbFontTransTbl[(BYTE)tempstr[i]]]] + 1;\r\n\t}\r\n\r\n\tif (width < 442) {\r\n\t\toff += (442 - width) >> 1;\r\n\t}\r\n\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tc = fontframe[gbFontTransTbl[(BYTE)tempstr[i]]];\r\n\t\tif (c != '\\0') {\r\n\t\t\tPrintChar(off, c, COL_GOLD);\r\n\t\t}\r\n\t\toff += fontkern[c] + 1;\r\n\t}\r\n\r\n\tif (msgdelay > 0) {\r\n\t\tmsgdelay--;\r\n\t}\r\n\tif (msgdelay == 0) {\r\n\t\tmsgcnt--;\r\n\t\tmsgdelay = 70;\r\n\t\tif (msgcnt == 0) {\r\n\t\t\tmsgflag = 0;\r\n\t\t} else {\r\n\t\t\tmsgflag = msgtable[msgcnt];\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/error.h",
    "content": "/**\r\n * @file error.h\r\n *\r\n * Interface of in-game message functions.\r\n */\r\n#ifndef __ERROR_H__\r\n#define __ERROR_H__\r\n\r\nextern char msgdelay;\r\nextern char msgflag;\r\n\r\nvoid InitDiabloMsg(char e);\r\nvoid ClrDiabloMsg();\r\nvoid DrawDiabloMsg();\r\n\r\n#endif /* __ERROR_H__ */\r\n"
  },
  {
    "path": "Source/fault.cpp",
    "content": "/**\r\n * @file fault.cpp\r\n *\r\n * Implementation of exception logging functionality.\r\n */\r\n#include \"all.h\"\r\n\r\ntypedef struct STACK_FRAME {\r\n\tstruct STACK_FRAME *pNext;\r\n\tvoid *pCallRet;\r\n} STACK_FRAME;\r\n\r\nLPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter;\r\n\r\nint fault_unused;\r\n\r\nstatic void *fault_set_filter(void *unused)\r\n{\r\n\tlpTopLevelExceptionFilter = SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)TopLevelExceptionFilter);\r\n\treturn unused;\r\n}\r\n\r\nstatic LPTOP_LEVEL_EXCEPTION_FILTER fault_reset_filter(void *unused)\r\n{\r\n\treturn SetUnhandledExceptionFilter(lpTopLevelExceptionFilter);\r\n}\r\n\r\nstatic LPTOP_LEVEL_EXCEPTION_FILTER __cdecl fault_cleanup_filter()\r\n{\r\n\treturn fault_reset_filter(&fault_unused);\r\n}\r\n\r\nstatic void fault_init_filter()\r\n{\r\n\tfault_set_filter(&fault_unused);\r\n}\r\n\r\nstatic void fault_cleanup_filter_atexit()\r\n{\r\n\tatexit((void(__cdecl *)(void))fault_cleanup_filter);\r\n}\r\n\r\n#ifndef _MSC_VER\r\n__attribute__((constructor))\r\n#endif\r\nstatic void\r\nfault_c_init(void)\r\n{\r\n\tfault_init_filter();\r\n\tfault_cleanup_filter_atexit();\r\n}\r\n\r\nSEG_ALLOCATE(SEGMENT_C_INIT)\r\n_PVFV exception_c_init_funcs[] = { &fault_c_init };\r\n\r\nstatic void fault_hex_format(BYTE *ptr, DWORD numBytes)\r\n{\r\n\tDWORD i, bytesRead;\r\n\tconst char *fmt;\r\n\tBYTE c;\r\n\r\n\twhile (numBytes > 0) {\r\n\t\tif (numBytes < 16)\r\n\t\t\tbytesRead = numBytes;\r\n\t\telse\r\n\t\t\tbytesRead = 16;\r\n\r\n\t\tif (IsBadReadPtr(ptr, bytesRead))\r\n\t\t\tbreak;\r\n\r\n\t\tlog_printf(\"0x%08x: \", ptr);\r\n\r\n\t\tfor (i = 0; i < 16; ++i) {\r\n\t\t\tfmt = \"%02x \";\r\n\t\t\tif (i >= bytesRead)\r\n\t\t\t\tfmt = \"   \";\r\n\t\t\tlog_printf(fmt, ptr[i]);\r\n\t\t\tif (i % 4 == 3)\r\n\t\t\t\tlog_printf(\" \");\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < bytesRead; i++) {\r\n\t\t\tif (isprint(ptr[i]))\r\n\t\t\t\tc = ptr[i];\r\n\t\t\telse\r\n\t\t\t\tc = '.';\r\n\t\t\tlog_printf(\"%c\", c);\r\n\t\t}\r\n\r\n\t\tlog_printf(\"\\r\\n\");\r\n\t\tptr += bytesRead;\r\n\t\tnumBytes -= bytesRead;\r\n\t}\r\n\tlog_printf(\"\\r\\n\");\r\n}\r\n\r\nstatic void fault_unknown_module(LPCVOID lpAddress, LPSTR lpModuleName, int iMaxLength, int *sectionNum, int *sectionOffset)\r\n{\r\n\tMEMORY_BASIC_INFORMATION memInfo;\r\n\tPIMAGE_DOS_HEADER dosHeader;\r\n\tLONG ntOffset;\r\n\tPIMAGE_NT_HEADERS ntHeader;\r\n\tPIMAGE_SECTION_HEADER section;\r\n\tDWORD numSections, moduleOffset, sectionSize, sectionAddress;\r\n\tint i;\r\n\r\n\tlstrcpyn(lpModuleName, \"*unknown*\", iMaxLength);\r\n\t*sectionNum = 0;\r\n\t*sectionOffset = 0;\r\n\r\n\tif (!VirtualQuery(lpAddress, &memInfo, sizeof(memInfo)))\r\n\t\treturn;\r\n\r\n\tdosHeader = (PIMAGE_DOS_HEADER)memInfo.AllocationBase;\r\n\tif (!memInfo.AllocationBase)\r\n\t\tdosHeader = (PIMAGE_DOS_HEADER)GetModuleHandle(0);\r\n\r\n\tif (!GetModuleFileName((HMODULE)dosHeader, lpModuleName, iMaxLength)) {\r\n\t\tlstrcpyn(lpModuleName, \"*unknown*\", iMaxLength);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (dosHeader && dosHeader->e_magic == IMAGE_DOS_SIGNATURE) {\r\n\t\tntOffset = dosHeader->e_lfanew;\r\n\t\tif (ntOffset) {\r\n\t\t\tntHeader = (PIMAGE_NT_HEADERS)((DWORD)dosHeader + ntOffset);\r\n\t\t\tif (ntHeader->Signature == IMAGE_NT_SIGNATURE) {\r\n\t\t\t\tsection = IMAGE_FIRST_SECTION(ntHeader);\r\n\t\t\t\tnumSections = ntHeader->FileHeader.NumberOfSections;\r\n\t\t\t\tmoduleOffset = (BYTE *)lpAddress - (BYTE *)dosHeader;\r\n\t\t\t\tfor (i = 0; i < numSections; i++, section++) {\r\n\t\t\t\t\tsectionSize = section->SizeOfRawData;\r\n\t\t\t\t\tsectionAddress = section->VirtualAddress;\r\n\t\t\t\t\tif (section->SizeOfRawData <= section->Misc.VirtualSize)\r\n\t\t\t\t\t\tsectionSize = section->Misc.VirtualSize;\r\n\r\n\t\t\t\t\tif (moduleOffset >= sectionAddress && moduleOffset <= sectionAddress + sectionSize) {\r\n\t\t\t\t\t\t*sectionNum = i + 1;\r\n\t\t\t\t\t\t*sectionOffset = moduleOffset - sectionAddress;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void fault_call_stack(void *instr, STACK_FRAME *stackFrame)\r\n{\r\n\tSTACK_FRAME *oldStackFrame;\r\n\tchar szModuleName[MAX_PATH];\r\n\tint sectionNumber, sectionOffset;\r\n\r\n\tlog_printf(\"Call stack:\\r\\nAddress  Frame    Logical addr  Module\\r\\n\");\r\n\tdo {\r\n\t\tfault_unknown_module(instr, szModuleName, MAX_PATH, &sectionNumber, &sectionOffset);\r\n\t\tlog_printf(\"%08X %08X %04X:%08X %s\\r\\n\", instr, stackFrame, sectionNumber, sectionOffset, szModuleName);\r\n\r\n\t\tif (IsBadWritePtr(stackFrame, 8))\r\n\t\t\tbreak;\r\n\r\n\t\tinstr = stackFrame->pCallRet;\r\n\t\toldStackFrame = stackFrame;\r\n\t\tstackFrame = stackFrame->pNext;\r\n\r\n\t\tif ((DWORD)stackFrame % 4 != 0)\r\n\t\t\tbreak;\r\n\t} while (stackFrame > oldStackFrame && !IsBadWritePtr(stackFrame, 8));\r\n\r\n\tlog_printf(\"\\r\\n\");\r\n}\r\n\r\nstatic char *fault_get_error_type(DWORD dwMessageId, LPSTR lpString1, DWORD nSize)\r\n{\r\n\tconst char *s;\r\n\r\n\tswitch (dwMessageId) {\r\n\tcase EXCEPTION_STACK_OVERFLOW:\r\n\t\ts = \"STACK_OVERFLOW\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_FLT_DIVIDE_BY_ZERO:\r\n\t\ts = \"FLT_DIVIDE_BY_ZERO\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_FLT_INEXACT_RESULT:\r\n\t\ts = \"FLT_INEXACT_RESULT\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_FLT_INVALID_OPERATION:\r\n\t\ts = \"FLT_INVALID_OPERATION\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_FLT_OVERFLOW:\r\n\t\ts = \"FLT_OVERFLOW\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_FLT_STACK_CHECK:\r\n\t\ts = \"FLT_STACK_CHECK\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_FLT_UNDERFLOW:\r\n\t\ts = \"FLT_UNDERFLOW\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_INT_DIVIDE_BY_ZERO:\r\n\t\ts = \"INT_DIVIDE_BY_ZERO\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_INT_OVERFLOW:\r\n\t\ts = \"INT_OVERFLOW\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_PRIV_INSTRUCTION:\r\n\t\ts = \"PRIV_INSTRUCTION\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_FLT_DENORMAL_OPERAND:\r\n\t\ts = \"FLT_DENORMAL_OPERAND\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_INVALID_HANDLE:\r\n\t\ts = \"INVALID_HANDLE\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_ILLEGAL_INSTRUCTION:\r\n\t\ts = \"ILLEGAL_INSTRUCTION\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_NONCONTINUABLE_EXCEPTION:\r\n\t\ts = \"NONCONTINUABLE_EXCEPTION\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_INVALID_DISPOSITION:\r\n\t\ts = \"INVALID_DISPOSITION\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_ARRAY_BOUNDS_EXCEEDED:\r\n\t\ts = \"ARRAY_BOUNDS_EXCEEDED\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_IN_PAGE_ERROR:\r\n\t\ts = \"IN_PAGE_ERROR\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_GUARD_PAGE:\r\n\t\ts = \"GUARD_PAGE\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_DATATYPE_MISALIGNMENT:\r\n\t\ts = \"DATATYPE_MISALIGNMENT\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_BREAKPOINT:\r\n\t\ts = \"BREAKPOINT\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_SINGLE_STEP:\r\n\t\ts = \"SINGLE_STEP\";\r\n\t\tbreak;\r\n\tcase EXCEPTION_ACCESS_VIOLATION:\r\n\t\ts = \"ACCESS_VIOLATION\";\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tif (FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS, (LPCVOID)GetModuleHandle(\"NTDLL.DLL\"), dwMessageId, 0, lpString1, nSize, NULL)) {\r\n\t\t\treturn lpString1;\r\n\t\t}\r\n\t\ts = \"*unknown*\";\r\n\t\tbreak;\r\n\t}\r\n\tlstrcpyn(lpString1, s, nSize);\r\n\treturn lpString1;\r\n}\r\n\r\nLONG __stdcall TopLevelExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo)\r\n{\r\n\tPEXCEPTION_RECORD xcpt;\r\n\tchar szExceptionNameBuf[MAX_PATH];\r\n\tchar szModuleName[MAX_PATH];\r\n\tchar *pszExceptionName;\r\n\tint sectionNumber, sectionOffset;\r\n\tPCONTEXT ctx;\r\n\r\n\tlog_dump_computer_info();\r\n\txcpt = ExceptionInfo->ExceptionRecord;\r\n\tpszExceptionName = fault_get_error_type(ExceptionInfo->ExceptionRecord->ExceptionCode, szExceptionNameBuf, sizeof(szExceptionNameBuf));\r\n\tlog_printf(\"Exception code: %08X %s\\r\\n\", xcpt->ExceptionCode, pszExceptionName);\r\n\r\n\tfault_unknown_module(xcpt->ExceptionAddress, szModuleName, MAX_PATH, &sectionNumber, &sectionOffset);\r\n\tlog_printf(\"Fault address:\\t%08X %02X:%08X %s\\r\\n\", xcpt->ExceptionAddress, sectionNumber, sectionOffset, szModuleName);\r\n\r\n\tctx = ExceptionInfo->ContextRecord;\r\n\r\n\tlog_printf(\"\\r\\nRegisters:\\r\\n\");\r\n\tlog_printf(\r\n\t    \"EAX:%08X\\r\\nEBX:%08X\\r\\nECX:%08X\\r\\nEDX:%08X\\r\\nESI:%08X\\r\\nEDI:%08X\\r\\n\",\r\n\t    ctx->Eax,\r\n\t    ctx->Ebx,\r\n\t    ctx->Ecx,\r\n\t    ctx->Edx,\r\n\t    ctx->Esi,\r\n\t    ctx->Edi);\r\n\tlog_printf(\"CS:EIP:%04X:%08X\\r\\n\", ctx->SegCs, ctx->Eip);\r\n\tlog_printf(\"SS:ESP:%04X:%08X EBP:%08X\\r\\n\", ctx->SegSs, ctx->Esp, ctx->Ebp);\r\n\tlog_printf(\"DS:%04X ES:%04X FS:%04X GS:%04X\\r\\n\", ctx->SegDs, ctx->SegEs, ctx->SegFs, ctx->SegGs);\r\n\r\n\tlog_printf(\"Flags:%08X\\r\\n\", ctx->EFlags);\r\n\tfault_call_stack((void *)ctx->Eip, (STACK_FRAME *)ctx->Ebp);\r\n\r\n\tlog_printf(\"Stack bytes:\\r\\n\");\r\n\tfault_hex_format((BYTE *)ctx->Esp, 768);\r\n\r\n\tlog_printf(\"Code bytes:\\r\\n\");\r\n\tfault_hex_format((BYTE *)ctx->Eip, 16);\r\n\r\n\tlog_printf(\"\\r\\n\");\r\n\tlog_flush(TRUE);\r\n\r\n\tif (lpTopLevelExceptionFilter)\r\n\t\treturn lpTopLevelExceptionFilter(ExceptionInfo);\r\n\treturn EXCEPTION_CONTINUE_SEARCH;\r\n}\r\n\r\nLPTOP_LEVEL_EXCEPTION_FILTER fault_get_filter()\r\n{\r\n\treturn lpTopLevelExceptionFilter;\r\n}\r\n"
  },
  {
    "path": "Source/fault.h",
    "content": "/**\r\n * @file fault.h\r\n *\r\n * Interface of exception logging functionality.\r\n */\r\n#ifndef __FAULT_H__\r\n#define __FAULT_H__\r\n\r\nextern LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter;\r\n\r\nLONG __stdcall TopLevelExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo);\r\nLPTOP_LEVEL_EXCEPTION_FILTER fault_get_filter();\r\n\r\n#endif /* __FAULT_H__ */\r\n"
  },
  {
    "path": "Source/gamemenu.cpp",
    "content": "\r\n/**\r\n * @file gamemenu.cpp\r\n *\r\n * Implementation of the in-game menu functions.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n#ifdef HELLFIRE\r\nBOOL jogging_opt = TRUE;\r\n#endif\r\n\r\n/** Contains the game menu items of the single player menu. */\r\nTMenuItem sgSingleMenu[] = {\r\n\t// clang-format off\r\n//\t  dwFlags,       pszStr,         fnMenu\r\n\t{ GMENU_ENABLED, \"Save Game\",     &gamemenu_save_game  },\r\n\t{ GMENU_ENABLED, \"Options\",       &gamemenu_options    },\r\n\t{ GMENU_ENABLED, \"New Game\",      &gamemenu_new_game   },\r\n\t{ GMENU_ENABLED, \"Load Game\",     &gamemenu_load_game  },\r\n#ifndef HELLFIRE\r\n\t{ GMENU_ENABLED, \"Quit Diablo\",   &gamemenu_quit_game  },\r\n#else\r\n\t{ GMENU_ENABLED, \"Quit Hellfire\", &gamemenu_quit_game  },\r\n#endif\r\n\t{ GMENU_ENABLED, NULL,            NULL }\r\n\t// clang-format on\r\n};\r\n/** Contains the game menu items of the multi player menu. */\r\nTMenuItem sgMultiMenu[] = {\r\n\t// clang-format off\r\n//\t  dwFlags,       pszStr,            fnMenu\r\n\t{ GMENU_ENABLED, \"Options\",         &gamemenu_options      },\r\n\t{ GMENU_ENABLED, \"New Game\",        &gamemenu_new_game     },\r\n\t{ GMENU_ENABLED, \"Restart In Town\", &gamemenu_restart_town },\r\n#ifndef HELLFIRE\r\n\t{ GMENU_ENABLED, \"Quit Diablo\",     &gamemenu_quit_game    },\r\n#else\r\n\t{ GMENU_ENABLED, \"Quit Hellfire\",   &gamemenu_quit_game    },\r\n#endif\r\n\t{ GMENU_ENABLED, NULL,              NULL                   },\r\n\t// clang-format on\r\n};\r\nTMenuItem sgOptionsMenu[] = {\r\n\t// clang-format off\r\n//\t  dwFlags,                      pszStr,          fnMenu\r\n\t{ GMENU_ENABLED | GMENU_SLIDER, NULL,            &gamemenu_music_volume  },\r\n\t{ GMENU_ENABLED | GMENU_SLIDER, NULL,            &gamemenu_sound_volume  },\r\n\t{ GMENU_ENABLED | GMENU_SLIDER, \"Gamma\",         &gamemenu_gamma         },\r\n#ifndef HELLFIRE\r\n\t{ GMENU_ENABLED               , NULL,            &gamemenu_color_cycling },\r\n#else\r\n\t{ GMENU_ENABLED | GMENU_SLIDER, NULL,            &gamemenu_loadjog       },\r\n#endif\r\n\t{ GMENU_ENABLED               , \"Previous Menu\", &gamemenu_previous      },\r\n\t{ GMENU_ENABLED               , NULL,            NULL                    },\r\n\t// clang-format on\r\n};\r\n/** Specifies the menu names for music enabled and disabled. */\r\nconst char *const music_toggle_names[] = {\r\n\t\"Music\",\r\n\t\"Music Disabled\",\r\n};\r\n/** Specifies the menu names for sound enabled and disabled. */\r\nconst char *const sound_toggle_names[] = {\r\n\t\"Sound\",\r\n\t\"Sound Disabled\",\r\n};\r\n#ifdef HELLFIRE\r\nchar *jogging_toggle_names[] = {\r\n\t\"Jog\",\r\n\t\"Walk\",\r\n};\r\nchar *jogging_title = \"Fast Walk\";\r\n#endif\r\n#ifndef HELLFIRE\r\n/** Specifies the menu names for colour cycling disabled and enabled. */\r\nconst char *const color_cycling_toggle_names[] = { \"Color Cycling Off\", \"Color Cycling On\" };\r\n#endif\r\n\r\nstatic void gamemenu_update_single(TMenuItem *pMenuItems)\r\n{\r\n\tBOOL enable;\r\n\r\n\tgmenu_enable(&sgSingleMenu[3], gbValidSaveFile);\r\n\r\n\tenable = FALSE;\r\n\tif (plr[myplr]._pmode != PM_DEATH && !deathflag)\r\n\t\tenable = TRUE;\r\n\r\n\tgmenu_enable(&sgSingleMenu[0], enable);\r\n}\r\n\r\nstatic void gamemenu_update_multi(TMenuItem *pMenuItems)\r\n{\r\n\tgmenu_enable(&sgMultiMenu[2], deathflag);\r\n}\r\n\r\nvoid gamemenu_on()\r\n{\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tgmenu_set_items(sgSingleMenu, gamemenu_update_single);\r\n\t} else {\r\n\t\tgmenu_set_items(sgMultiMenu, gamemenu_update_multi);\r\n\t}\r\n\tPressEscKey();\r\n}\r\n\r\nvoid gamemenu_off()\r\n{\r\n\tgmenu_set_items(NULL, NULL);\r\n}\r\n\r\nvoid gamemenu_handle_previous()\r\n{\r\n\tif (gmenu_is_active())\r\n\t\tgamemenu_off();\r\n\telse\r\n\t\tgamemenu_on();\r\n}\r\n\r\nvoid gamemenu_previous(BOOL bActivate)\r\n{\r\n\tgamemenu_on();\r\n}\r\n\r\nvoid gamemenu_new_game(BOOL bActivate)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tplr[i]._pmode = PM_QUIT;\r\n\t\tplr[i]._pInvincible = TRUE;\r\n\t}\r\n\r\n\tdeathflag = FALSE;\r\n\tforce_redraw = 255;\r\n\tscrollrt_draw_game_screen(TRUE);\r\n#ifdef HELLFIRE\r\n\tCornerStone.activated = FALSE;\r\n#endif\r\n\tgbRunGame = FALSE;\r\n\tgamemenu_off();\r\n}\r\n\r\nvoid gamemenu_quit_game(BOOL bActivate)\r\n{\r\n\tgamemenu_new_game(bActivate);\r\n\tgbRunGameResult = FALSE;\r\n}\r\n\r\nvoid gamemenu_load_game(BOOL bActivate)\r\n{\r\n\tWNDPROC saveProc = SetWindowProc(DisableInputWndProc);\r\n\tgamemenu_off();\r\n\tSetCursor_(CURSOR_NONE);\r\n\tInitDiabloMsg(EMSG_LOADING);\r\n\tforce_redraw = 255;\r\n\tDrawAndBlit();\r\n\tLoadGame(FALSE);\r\n\tClrDiabloMsg();\r\n#ifdef HELLFIRE\r\n\tCornerStone.activated = FALSE;\r\n#endif\r\n\tPaletteFadeOut(8);\r\n\tdeathflag = FALSE;\r\n\tforce_redraw = 255;\r\n\tDrawAndBlit();\r\n\tPaletteFadeIn(8);\r\n\tSetCursor_(CURSOR_HAND);\r\n\tinterface_msg_pump();\r\n\tSetWindowProc(saveProc);\r\n}\r\n\r\nvoid gamemenu_save_game(BOOL bActivate)\r\n{\r\n\tif (pcurs != CURSOR_HAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (plr[myplr]._pmode == PM_DEATH || deathflag) {\r\n\t\tgamemenu_off();\r\n\t\treturn;\r\n\t}\r\n\r\n\tWNDPROC saveProc = SetWindowProc(DisableInputWndProc);\r\n\tSetCursor_(CURSOR_NONE);\r\n\tgamemenu_off();\r\n\tInitDiabloMsg(EMSG_SAVING);\r\n\tforce_redraw = 255;\r\n\tDrawAndBlit();\r\n\tSaveGame();\r\n\tClrDiabloMsg();\r\n\tforce_redraw = 255;\r\n\tSetCursor_(CURSOR_HAND);\r\n#ifdef HELLFIRE\r\n\tif (CornerStone.activated) {\r\n\t\tCornerstoneSave();\r\n\t}\r\n#endif\r\n\tinterface_msg_pump();\r\n\tSetWindowProc(saveProc);\r\n}\r\n\r\nvoid gamemenu_restart_town(BOOL bActivate)\r\n{\r\n\tNetSendCmd(TRUE, CMD_RETOWN);\r\n}\r\n\r\nstatic void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, int volume)\r\n{\r\n\tif (gbSndInited) {\r\n\t\tmenu_item->dwFlags |= GMENU_ENABLED | GMENU_SLIDER;\r\n\t\tmenu_item->pszStr = *names;\r\n\t\tgmenu_slider_steps(menu_item, 17);\r\n\t\tgmenu_slider_set(menu_item, VOLUME_MIN, VOLUME_MAX, volume);\r\n\t\treturn;\r\n\t}\r\n\r\n\tmenu_item->dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER);\r\n\tmenu_item->pszStr = names[1];\r\n}\r\n\r\nstatic int gamemenu_slider_music_sound(TMenuItem *menu_item)\r\n{\r\n\treturn gmenu_slider_get(menu_item, VOLUME_MIN, VOLUME_MAX);\r\n}\r\n\r\nstatic void gamemenu_get_music()\r\n{\r\n\tgamemenu_sound_music_toggle(music_toggle_names, sgOptionsMenu, sound_get_or_set_music_volume(1));\r\n}\r\n\r\nstatic void gamemenu_get_sound()\r\n{\r\n\tgamemenu_sound_music_toggle(sound_toggle_names, &sgOptionsMenu[1], sound_get_or_set_sound_volume(1));\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic void gamemenu_jogging()\r\n{\r\n\tgmenu_slider_steps(&sgOptionsMenu[3], 2);\r\n\tgmenu_slider_set(&sgOptionsMenu[3], 0, 1, jogging_opt);\r\n\tsgOptionsMenu[3].pszStr = jogging_toggle_names[!jogging_opt ? 1 : 0];\r\n}\r\n#endif\r\n\r\nstatic void gamemenu_get_gamma()\r\n{\r\n\tgmenu_slider_steps(&sgOptionsMenu[2], 15);\r\n\tgmenu_slider_set(&sgOptionsMenu[2], 30, 100, UpdateGamma(0));\r\n}\r\n\r\n#ifndef HELLFIRE\r\nstatic void gamemenu_get_color_cycling()\r\n{\r\n\tsgOptionsMenu[3].pszStr = color_cycling_toggle_names[palette_get_color_cycling() & 1];\r\n}\r\n#endif\r\n\r\nstatic int gamemenu_slider_gamma()\r\n{\r\n\treturn gmenu_slider_get(&sgOptionsMenu[2], 30, 100);\r\n}\r\n\r\nvoid gamemenu_options(BOOL bActivate)\r\n{\r\n\tgamemenu_get_music();\r\n\tgamemenu_get_sound();\r\n#ifdef HELLFIRE\r\n\tgamemenu_jogging();\r\n#endif\r\n\tgamemenu_get_gamma();\r\n#ifndef HELLFIRE\r\n\tgamemenu_get_color_cycling();\r\n#endif\r\n\tgmenu_set_items(sgOptionsMenu, NULL);\r\n}\r\n\r\nvoid gamemenu_music_volume(BOOL bActivate)\r\n{\r\n\tint volume;\r\n\r\n\tif (bActivate) {\r\n\t\tif (gbMusicOn) {\r\n\t\t\tgbMusicOn = FALSE;\r\n\t\t\tmusic_stop();\r\n\t\t\tsound_get_or_set_music_volume(VOLUME_MIN);\r\n\t\t} else {\r\n\t\t\tgbMusicOn = TRUE;\r\n\t\t\tsound_get_or_set_music_volume(VOLUME_MAX);\r\n#ifdef HELLFIRE\r\n\t\t\tint lt;\r\n\t\t\tif (currlevel >= 17) {\r\n\t\t\t\tif (currlevel > 20)\r\n\t\t\t\t\tlt = DTYPE_NEST;\r\n\t\t\t\telse\r\n\t\t\t\t\tlt = DTYPE_CRYPT;\r\n\t\t\t} else\r\n\t\t\t\tlt = leveltype;\r\n\t\t\tmusic_start(lt);\r\n#else\r\n\t\t\tmusic_start(leveltype);\r\n#endif\r\n\t\t}\r\n\t} else {\r\n\t\tvolume = gamemenu_slider_music_sound(&sgOptionsMenu[0]);\r\n\t\tsound_get_or_set_music_volume(volume);\r\n\t\tif (volume == VOLUME_MIN) {\r\n\t\t\tif (gbMusicOn) {\r\n\t\t\t\tgbMusicOn = FALSE;\r\n\t\t\t\tmusic_stop();\r\n\t\t\t}\r\n\t\t} else if (!gbMusicOn) {\r\n\t\t\tgbMusicOn = TRUE;\r\n#ifdef HELLFIRE\r\n\t\t\tint lt;\r\n\t\t\tif (currlevel >= 17) {\r\n\t\t\t\tif (currlevel > 20)\r\n\t\t\t\t\tlt = DTYPE_NEST;\r\n\t\t\t\telse\r\n\t\t\t\t\tlt = DTYPE_CRYPT;\r\n\t\t\t} else\r\n\t\t\t\tlt = leveltype;\r\n\t\t\tmusic_start(lt);\r\n#else\r\n\t\t\tmusic_start(leveltype);\r\n#endif\r\n\t\t}\r\n\t}\r\n\tgamemenu_get_music();\r\n}\r\n\r\nvoid gamemenu_sound_volume(BOOL bActivate)\r\n{\r\n\tint volume;\r\n\tif (bActivate) {\r\n\t\tif (gbSoundOn) {\r\n\t\t\tgbSoundOn = FALSE;\r\n\t\t\tsound_stop();\r\n\t\t\tsound_get_or_set_sound_volume(VOLUME_MIN);\r\n\t\t} else {\r\n\t\t\tgbSoundOn = TRUE;\r\n\t\t\tsound_get_or_set_sound_volume(VOLUME_MAX);\r\n\t\t}\r\n\t} else {\r\n\t\tvolume = gamemenu_slider_music_sound(&sgOptionsMenu[1]);\r\n\t\tsound_get_or_set_sound_volume(volume);\r\n\t\tif (volume == VOLUME_MIN) {\r\n\t\t\tif (gbSoundOn) {\r\n\t\t\t\tgbSoundOn = FALSE;\r\n\t\t\t\tsound_stop();\r\n\t\t\t}\r\n\t\t} else if (!gbSoundOn) {\r\n\t\t\tgbSoundOn = TRUE;\r\n\t\t}\r\n\t}\r\n\tPlaySFX(IS_TITLEMOV);\r\n\tgamemenu_get_sound();\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid gamemenu_loadjog(BOOL bActivate)\r\n{\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tjogging_opt = !jogging_opt;\r\n\t\tSRegSaveValue(APP_NAME, jogging_title, FALSE, jogging_opt);\r\n\t\tPlaySFX(IS_TITLEMOV);\r\n\t\tgamemenu_jogging();\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid gamemenu_gamma(BOOL bActivate)\r\n{\r\n\tint gamma;\r\n\tif (bActivate) {\r\n\t\tgamma = UpdateGamma(0);\r\n\t\tif (gamma == 30)\r\n\t\t\tgamma = 100;\r\n\t\telse\r\n\t\t\tgamma = 30;\r\n\t} else {\r\n\t\tgamma = gamemenu_slider_gamma();\r\n\t}\r\n\r\n\tUpdateGamma(gamma);\r\n\tgamemenu_get_gamma();\r\n}\r\n\r\n#ifndef HELLFIRE\r\nvoid gamemenu_color_cycling(BOOL bActivate)\r\n{\r\n\tBOOL color_cycling;\r\n\r\n\tcolor_cycling = palette_set_color_cycling(palette_get_color_cycling() == 0);\r\n\tsgOptionsMenu[3].pszStr = color_cycling_toggle_names[color_cycling & 1];\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/gamemenu.h",
    "content": "/**\r\n * @file gamemenu.h\r\n *\r\n * Interface of the in-game menu functions.\r\n */\r\n#ifndef __GAMEMENU_H__\r\n#define __GAMEMENU_H__\r\n\r\n#ifdef HELLFIRE\r\nextern char *jogging_title;\r\nextern BOOL jogging_opt;\r\n#endif\r\n\r\nvoid gamemenu_on();\r\nvoid gamemenu_off();\r\nvoid gamemenu_handle_previous();\r\nvoid gamemenu_previous(BOOL bActivate);\r\nvoid gamemenu_new_game(BOOL bActivate);\r\nvoid gamemenu_quit_game(BOOL bActivate);\r\nvoid gamemenu_load_game(BOOL bActivate);\r\nvoid gamemenu_save_game(BOOL bActivate);\r\nvoid gamemenu_restart_town(BOOL bActivate);\r\nvoid gamemenu_options(BOOL bActivate);\r\nvoid gamemenu_music_volume(BOOL bActivate);\r\nvoid gamemenu_sound_volume(BOOL bActivate);\r\n#ifdef HELLFIRE\r\nvoid gamemenu_loadjog(BOOL bActivate);\r\n#endif\r\nvoid gamemenu_gamma(BOOL bActivate);\r\n#ifndef HELLFIRE\r\nvoid gamemenu_color_cycling(BOOL bActivate);\r\n#endif\r\n\r\n#endif /* __GAMEMENU_H__ */\r\n"
  },
  {
    "path": "Source/gendung.cpp",
    "content": "/**\r\n * @file gendung.cpp\r\n *\r\n * Implementation of general dungeon generation code.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Contains the tile IDs of the map. */\r\nBYTE dungeon[DMAXX][DMAXY];\r\n/** Contains a backup of the tile IDs of the map. */\r\nBYTE pdungeon[DMAXX][DMAXY];\r\nchar dflags[DMAXX][DMAXY];\r\n/** Specifies the active set level X-coordinate of the map. */\r\nint setpc_x;\r\n/** Specifies the active set level Y-coordinate of the map. */\r\nint setpc_y;\r\n/** Specifies the width of the active set level of the map. */\r\nint setpc_w;\r\n/** Specifies the height of the active set level of the map. */\r\nint setpc_h;\r\n/** Contains the contents of the single player quest DUN file. */\r\nBYTE *pSetPiece;\r\n/** Specifies whether a single player quest DUN has been loaded. */\r\nBOOL setloadflag;\r\nBYTE *pSpecialCels;\r\n/** Specifies the tile definitions of the active dungeon type; (e.g. levels/l1data/l1.til). */\r\nBYTE *pMegaTiles;\r\nBYTE *pLevelPieces;\r\nBYTE *pDungeonCels;\r\nBYTE *pSpeedCels;\r\n/**\r\n * Returns the frame number of the speed CEL, an in memory decoding\r\n * of level CEL frames, based on original frame number and light index.\r\n * Note, given light index 0, the original frame number is returned.\r\n */\r\nint SpeedFrameTbl[128][16];\r\n/**\r\n * List of transparancy masks to use for dPieces\r\n */\r\nchar block_lvid[MAXTILES + 1];\r\n/** Specifies the CEL frame occurrence for each frame of the level CEL (e.g. \"levels/l1data/l1.cel\"). */\r\nint level_frame_count[MAXTILES];\r\nint tile_defs[MAXTILES];\r\n/**\r\n * Secifies the CEL frame decoder type for each frame of the\r\n * level CEL (e.g. \"levels/l1data/l1.cel\"), Indexed by frame numbers starting at 1.\r\n * The decoder type may be one of the following.\r\n *  0x0000 - cel.decodeType0\r\n *  0x1000 - cel.decodeType1\r\n *  0x2000 - cel.decodeType2\r\n *  0x3000 - cel.decodeType3\r\n *  0x4000 - cel.decodeType4\r\n *  0x5000 - cel.decodeType5\r\n *  0x6000 - cel.decodeType6\r\n */\r\nWORD level_frame_types[MAXTILES];\r\n/**\r\n * Specifies the size of each frame of the level cel (e.g.\r\n * \"levels/l1data/l1.cel\"). Indexed by frame numbers starting at 1.\r\n */\r\nint level_frame_sizes[MAXTILES];\r\n/** Specifies the number of frames in the level cel (e.g. \"levels/l1data/l1.cel\"). */\r\nint nlevel_frames;\r\n/**\r\n * List of light blocking dPieces\r\n */\r\nBOOLEAN nBlockTable[MAXTILES + 1];\r\n/**\r\n * List of path blocking dPieces\r\n */\r\nBOOLEAN nSolidTable[MAXTILES + 1];\r\n/**\r\n * List of transparent dPieces\r\n */\r\nBOOLEAN nTransTable[MAXTILES + 1];\r\n/**\r\n * List of missile blocking dPieces\r\n */\r\nBOOLEAN nMissileTable[MAXTILES + 1];\r\nBOOLEAN nTrapTable[MAXTILES + 1];\r\n/** Specifies the minimum X-coordinate of the map. */\r\nint dminx;\r\n/** Specifies the minimum Y-coordinate of the map. */\r\nint dminy;\r\n/** Specifies the maximum X-coordinate of the map. */\r\nint dmaxx;\r\n/** Specifies the maximum Y-coordinate of the map. */\r\nint dmaxy;\r\nint gnDifficulty;\r\n/** Specifies the active dungeon type of the current game. */\r\nBYTE leveltype;\r\n/** Specifies the active dungeon level of the current game. */\r\nBYTE currlevel;\r\nBOOLEAN setlevel;\r\n/** Specifies the active quest level of the current game. */\r\nBYTE setlvlnum;\r\nchar setlvltype;\r\n/** Specifies the player viewpoint X-coordinate of the map. */\r\nint ViewX;\r\n/** Specifies the player viewpoint Y-coordinate of the map. */\r\nint ViewY;\r\nint ViewBX;\r\nint ViewBY;\r\nint ViewDX;\r\nint ViewDY;\r\nScrollStruct ScrollInfo;\r\n/** Specifies the level viewpoint X-coordinate of the map. */\r\nint LvlViewX;\r\n/** Specifies the level viewpoint Y-coordinate of the map. */\r\nint LvlViewY;\r\nint MicroTileLen;\r\nchar TransVal;\r\n/** Specifies the active transparency indices. */\r\nBOOLEAN TransList[256];\r\n/** Contains the piece IDs of each tile on the map. */\r\nint dPiece[MAXDUNX][MAXDUNY];\r\n/** Specifies the dungeon piece information for a given coordinate and block number. */\r\nMICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY];\r\n/** Specifies the dungeon piece information for a given coordinate and block number, optimized for diagonal access. */\r\nMICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];\r\n/** Specifies the transparency at each coordinate of the map. */\r\nchar dTransVal[MAXDUNX][MAXDUNY];\r\nchar dLight[MAXDUNX][MAXDUNY];\r\nchar dPreLight[MAXDUNX][MAXDUNY];\r\nchar dFlags[MAXDUNX][MAXDUNY];\r\n/** Contains the player numbers (players array indices) of the map. */\r\nchar dPlayer[MAXDUNX][MAXDUNY];\r\n/**\r\n * Contains the NPC numbers of the map. The NPC number represents a\r\n * towner number (towners array index) in Tristram and a monster number\r\n * (monsters array index) in the dungeon.\r\n */\r\nint dMonster[MAXDUNX][MAXDUNY];\r\n/**\r\n * Contains the dead numbers (deads array indices) and dead direction of\r\n * the map, encoded as specified by the pseudo-code below.\r\n * dDead[x][y] & 0x1F - index of dead\r\n * dDead[x][y] >> 0x5 - direction\r\n */\r\nchar dDead[MAXDUNX][MAXDUNY];\r\n/** Contains the object numbers (objects array indices) of the map. */\r\nchar dObject[MAXDUNX][MAXDUNY];\r\n/** Contains the item numbers (items array indices) of the map. */\r\nchar dItem[MAXDUNX][MAXDUNY];\r\n/** Contains the missile numbers (missiles array indices) of the map. */\r\nchar dMissile[MAXDUNX][MAXDUNY];\r\n/**\r\n * Contains the arch frame numbers of the map from the special tileset\r\n * (e.g. \"levels/l1data/l1s.cel\"). Note, the special tileset of Tristram (i.e.\r\n * \"levels/towndata/towns.cel\") contains trees rather than arches.\r\n */\r\nchar dSpecial[MAXDUNX][MAXDUNY];\r\nint themeCount;\r\nTHEME_LOC themeLoc[MAXTHEMES];\r\n\r\nvoid FillSolidBlockTbls()\r\n{\r\n\tBYTE bv;\r\n\tDWORD dwTiles;\r\n\tBYTE *pSBFile, *pTmp;\r\n\tint i;\r\n\r\n\tmemset(nBlockTable, 0, sizeof(nBlockTable));\r\n\tmemset(nSolidTable, 0, sizeof(nSolidTable));\r\n\tmemset(nTransTable, 0, sizeof(nTransTable));\r\n\tmemset(nMissileTable, 0, sizeof(nMissileTable));\r\n\tmemset(nTrapTable, 0, sizeof(nTrapTable));\r\n\r\n\tswitch (leveltype) {\r\n\tcase DTYPE_TOWN:\r\n#ifdef HELLFIRE\r\n\t\tpSBFile = LoadFileInMem(\"NLevels\\\\TownData\\\\Town.SOL\", &dwTiles);\r\n#else\r\n\t\tpSBFile = LoadFileInMem(\"Levels\\\\TownData\\\\Town.SOL\", &dwTiles);\r\n#endif\r\n\t\tbreak;\r\n\tcase DTYPE_CATHEDRAL:\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17)\r\n\t\t\tpSBFile = LoadFileInMem(\"Levels\\\\L1Data\\\\L1.SOL\", &dwTiles);\r\n\t\telse\r\n\t\t\tpSBFile = LoadFileInMem(\"NLevels\\\\L5Data\\\\L5.SOL\", &dwTiles);\r\n#else\r\n\t\tpSBFile = LoadFileInMem(\"Levels\\\\L1Data\\\\L1.SOL\", &dwTiles);\r\n#endif\r\n\t\tbreak;\r\n\tcase DTYPE_CATACOMBS:\r\n\t\tpSBFile = LoadFileInMem(\"Levels\\\\L2Data\\\\L2.SOL\", &dwTiles);\r\n\t\tbreak;\r\n\tcase DTYPE_CAVES:\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17)\r\n\t\t\tpSBFile = LoadFileInMem(\"Levels\\\\L3Data\\\\L3.SOL\", &dwTiles);\r\n\t\telse\r\n\t\t\tpSBFile = LoadFileInMem(\"NLevels\\\\L6Data\\\\L6.SOL\", &dwTiles);\r\n#else\r\n\t\tpSBFile = LoadFileInMem(\"Levels\\\\L3Data\\\\L3.SOL\", &dwTiles);\r\n#endif\r\n\t\tbreak;\r\n\tcase DTYPE_HELL:\r\n\t\tpSBFile = LoadFileInMem(\"Levels\\\\L4Data\\\\L4.SOL\", &dwTiles);\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tapp_fatal(\"FillSolidBlockTbls\");\r\n\t}\r\n\r\n\tpTmp = pSBFile;\r\n\r\n\tfor (i = 1; i <= dwTiles; i++) {\r\n\t\tbv = *pTmp++;\r\n\t\tif (bv & 1)\r\n\t\t\tnSolidTable[i] = TRUE;\r\n\t\tif (bv & 2)\r\n\t\t\tnBlockTable[i] = TRUE;\r\n\t\tif (bv & 4)\r\n\t\t\tnMissileTable[i] = TRUE;\r\n\t\tif (bv & 8)\r\n\t\t\tnTransTable[i] = TRUE;\r\n\t\tif (bv & 0x80)\r\n\t\t\tnTrapTable[i] = TRUE;\r\n\t\tblock_lvid[i] = (bv & 0x70) >> 4; /* beta: (bv >> 4) & 7 */\r\n\t}\r\n\r\n\tmem_free_dbg(pSBFile);\r\n}\r\n\r\nstatic void SwapTile(int f1, int f2)\r\n{\r\n\tint swap;\r\n\r\n\tswap = level_frame_count[f1];\r\n\tlevel_frame_count[f1] = level_frame_count[f2];\r\n\tlevel_frame_count[f2] = swap;\r\n\tswap = tile_defs[f1];\r\n\ttile_defs[f1] = tile_defs[f2];\r\n\ttile_defs[f2] = swap;\r\n\tswap = level_frame_types[f1];\r\n\tlevel_frame_types[f1] = level_frame_types[f2];\r\n\tlevel_frame_types[f2] = swap;\r\n\tswap = level_frame_sizes[f1];\r\n\tlevel_frame_sizes[f1] = level_frame_sizes[f2];\r\n\tlevel_frame_sizes[f2] = swap;\r\n}\r\n\r\nstatic void SortTiles(int frames)\r\n{\r\n\tint i;\r\n\tBOOL doneflag;\r\n\r\n\tdoneflag = FALSE;\r\n\twhile (frames > 0 && !doneflag) {\r\n\t\tdoneflag = TRUE;\r\n\t\tfor (i = 0; i < frames; i++) {\r\n\t\t\tif (level_frame_count[i] < level_frame_count[i + 1]) {\r\n\t\t\t\tSwapTile(i, i + 1);\r\n\t\t\t\tdoneflag = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tframes--;\r\n\t}\r\n}\r\n\r\nvoid MakeSpeedCels()\r\n{\r\n\tint i, j, x, y, mt, t, z;\r\n\tint total_frames, blocks, total_size, frameidx, blk_cnt, nDataSize;\r\n\tWORD m;\r\n\tBOOL blood_flag;\r\n\tDWORD *pFrameTable;\r\n\tMICROS *pMap;\r\n#ifndef USE_ASM\r\n\tint l, k;\r\n\tBYTE width, pix;\r\n\tBYTE *src, *dst, *tbl;\r\n#endif\r\n\r\n\tfor (i = 0; i < MAXTILES; i++) {\r\n\t\ttile_defs[i] = i;\r\n\t\tlevel_frame_count[i] = 0;\r\n\t\tlevel_frame_types[i] = 0;\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_HELL)\r\n\t\tblocks = 10;\r\n\telse\r\n\t\tblocks = 12;\r\n\r\n\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\tfor (x = 0; x < MAXDUNX; x++) {\r\n\t\t\tpMap = &dpiece_defs_map_2[x][y];\r\n\t\t\tfor (j = 0; j < blocks; j++) {\r\n\t\t\t\tmt = pMap->mt[j];\r\n\t\t\t\tif (mt) {\r\n\t\t\t\t\tlevel_frame_count[pMap->mt[j] & 0xFFF]++;\r\n\t\t\t\t\tlevel_frame_types[pMap->mt[j] & 0xFFF] = mt & 0x7000;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n#if defined HELLFIRE && defined USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pDungeonCels\r\n\t\tmov\t\teax, [ebx]\r\n\t\tmov\t\tnDataSize, eax\r\n\t}\r\n#else\r\n\tpFrameTable = (DWORD *)pDungeonCels;\r\n\tnDataSize = pFrameTable[0];\r\n#endif\r\n\tnlevel_frames = nDataSize & 0xFFFF;\r\n\r\n#ifdef HELLFIRE\r\n\tfor (i = 0; i < nlevel_frames; i++) {\r\n#else\r\n\tfor (i = 1; i < nlevel_frames; i++) {\r\n#endif\r\n\t\tz = i;\r\n#ifdef USE_ASM\r\n\t\t__asm {\r\n\t\t\tmov\t\tebx, pDungeonCels\r\n\t\t\tmov\t\teax, z\r\n\t\t\tshl\t\teax, 2\r\n\t\t\tadd\t\tebx, eax\r\n\t\t\tmov\t\teax, [ebx+4]\r\n\t\t\tsub\t\teax, [ebx]\r\n\t\t\tmov\t\tnDataSize, eax\r\n\t\t}\r\n#else\r\n\t\tnDataSize = pFrameTable[i + 1] - pFrameTable[i];\r\n#endif\r\n\t\tlevel_frame_sizes[i] = nDataSize & 0xFFFF;\r\n\t}\r\n\r\n\tlevel_frame_sizes[0] = 0;\r\n\r\n\tif (leveltype == DTYPE_HELL) {\r\n\t\tfor (i = 0; i < nlevel_frames; i++) {\r\n#ifndef HELLFIRE\r\n\t\t\tif (i == 0)\r\n\t\t\t\tlevel_frame_count[0] = 0;\r\n#endif\r\n\t\t\tz = i;\r\n\t\t\tblood_flag = TRUE;\r\n\t\t\tif (level_frame_count[i] != 0) {\r\n\t\t\t\tif (level_frame_types[i] != 0x1000) {\r\n#ifdef USE_ASM\r\n\t\t\t\t\tt = level_frame_sizes[i];\r\n\t\t\t\t\t__asm {\r\n\t\t\t\t\t\tmov\t\tebx, pDungeonCels\r\n\t\t\t\t\t\tmov\t\teax, z\r\n\t\t\t\t\t\tshl\t\teax, 2\r\n\t\t\t\t\t\tadd\t\tebx, eax\r\n\t\t\t\t\t\tmov\t\tesi, pDungeonCels\r\n\t\t\t\t\t\tadd\t\tesi, [ebx]\r\n\t\t\t\t\t\txor\t\tebx, ebx\r\n\t\t\t\t\t\tmov\t\tecx, t\r\n\t\t\t\t\t\tjecxz\tl1_label3\r\n\t\t\t\t\tl1_label1:\r\n\t\t\t\t\t\tlodsb\r\n\t\t\t\t\t\tcmp\t\tal, 0\r\n\t\t\t\t\t\tjz\t\tl1_label2\r\n\t\t\t\t\t\tcmp\t\tal, 32\r\n\t\t\t\t\t\tjnb\t\tl1_label2\r\n\t\t\t\t\t\tmov\t\tblood_flag, ebx\r\n\t\t\t\t\tl1_label2:\r\n\t\t\t\t\t\tloop\tl1_label1\r\n\t\t\t\t\tl1_label3:\r\n\t\t\t\t\t\tnop\r\n\t\t\t\t\t}\r\n#else\r\n\t\t\t\t\tsrc = &pDungeonCels[pFrameTable[i]];\r\n\t\t\t\t\tfor (j = level_frame_sizes[i]; j; j--) {\r\n\t\t\t\t\t\tpix = *src++;\r\n\t\t\t\t\t\tif (pix && pix < 32)\r\n\t\t\t\t\t\t\tblood_flag = FALSE;\r\n\t\t\t\t\t}\r\n#endif\r\n\t\t\t\t} else {\r\n#ifdef USE_ASM\r\n\t\t\t\t\t__asm {\r\n\t\t\t\t\t\tmov\t\tebx, pDungeonCels\r\n\t\t\t\t\t\tmov\t\teax, z\r\n\t\t\t\t\t\tshl\t\teax, 2\r\n\t\t\t\t\t\tadd\t\tebx, eax\r\n\t\t\t\t\t\tmov\t\tesi, pDungeonCels\r\n\t\t\t\t\t\tadd\t\tesi, [ebx]\r\n\t\t\t\t\t\txor\t\tebx, ebx\r\n\t\t\t\t\t\tmov\t\tecx, 32\r\n\t\t\t\t\tl2_label1:\r\n\t\t\t\t\t\tpush\tecx\r\n\t\t\t\t\t\tmov\t\tedx, 32\r\n\t\t\t\t\tl2_label2:\r\n\t\t\t\t\t\txor\t\teax, eax\r\n\t\t\t\t\t\tlodsb\r\n\t\t\t\t\t\tor\t\tal, al\r\n\t\t\t\t\t\tjs\t\tl2_label5\r\n\t\t\t\t\t\tsub\t\tedx, eax\r\n\t\t\t\t\t\tmov\t\tecx, eax\r\n\t\t\t\t\tl2_label3:\r\n\t\t\t\t\t\tlodsb\r\n\t\t\t\t\t\tcmp\t\tal, 0\r\n\t\t\t\t\t\tjz\t\tl2_label4\r\n\t\t\t\t\t\tcmp\t\tal, 32\r\n\t\t\t\t\t\tjnb\t\tl2_label4\r\n\t\t\t\t\t\tmov\t\tblood_flag, ebx\r\n\t\t\t\t\tl2_label4:\r\n\t\t\t\t\t\tloop\tl2_label3\r\n\t\t\t\t\t\tor\t\tedx, edx\r\n\t\t\t\t\t\tjz\t\tl2_label6\r\n\t\t\t\t\t\tjmp\t\tl2_label2\r\n\t\t\t\t\tl2_label5:\r\n\t\t\t\t\t\tneg\t\tal\r\n\t\t\t\t\t\tsub\t\tedx, eax\r\n\t\t\t\t\t\tjnz\t\tl2_label2\r\n\t\t\t\t\tl2_label6:\r\n\t\t\t\t\t\tpop\t\tecx\r\n\t\t\t\t\t\tloop\tl2_label1\r\n\t\t\t\t\t}\r\n#else\r\n\t\t\t\t\tsrc = &pDungeonCels[pFrameTable[i]];\r\n\t\t\t\t\tfor (k = 32; k; k--) {\r\n\t\t\t\t\t\tfor (l = 32; l;) {\r\n\t\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\t\t\t\t\tl -= width;\r\n\t\t\t\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t\t\t\tpix = *src++;\r\n\t\t\t\t\t\t\t\t\tif (pix && pix < 32)\r\n\t\t\t\t\t\t\t\t\t\tblood_flag = FALSE;\r\n\t\t\t\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\t\t\tl -= width;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t\tif (!blood_flag)\r\n\t\t\t\t\tlevel_frame_count[i] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tSortTiles(MAXTILES - 1);\r\n\ttotal_size = 0;\r\n\ttotal_frames = 0;\r\n\r\n\tif (light4flag) {\r\n\t\twhile (total_size < 0x100000) {\r\n\t\t\ttotal_size += level_frame_sizes[total_frames] << 1;\r\n\t\t\ttotal_frames++;\r\n\t\t}\r\n\t} else {\r\n\t\twhile (total_size < 0x100000) {\r\n\t\t\ttotal_size += (level_frame_sizes[total_frames] << 4) - (level_frame_sizes[total_frames] << 1);\r\n\t\t\ttotal_frames++;\r\n\t\t}\r\n\t}\r\n\r\n\ttotal_frames--;\r\n\tif (total_frames > 128)\r\n\t\ttotal_frames = 128;\r\n\r\n\tframeidx = 0;\r\n\r\n\tif (light4flag)\r\n\t\tblk_cnt = 3;\r\n\telse\r\n\t\tblk_cnt = 15;\r\n\r\n\tfor (i = 0; i < total_frames; i++) {\r\n\t\tz = tile_defs[i];\r\n\t\tSpeedFrameTbl[i][0] = z;\r\n\t\tif (level_frame_types[i] != 0x1000) {\r\n\t\t\tt = level_frame_sizes[i];\r\n\t\t\tfor (j = 1; j < blk_cnt; j++) {\r\n\t\t\t\tSpeedFrameTbl[i][j] = frameidx;\r\n#ifdef USE_ASM\r\n\t\t\t\t__asm {\r\n\t\t\t\t\tmov\t\tebx, pDungeonCels\r\n\t\t\t\t\tmov\t\teax, z\r\n\t\t\t\t\tshl\t\teax, 2\r\n\t\t\t\t\tadd\t\tebx, eax\r\n\t\t\t\t\tmov\t\tesi, pDungeonCels\r\n\t\t\t\t\tadd\t\tesi, [ebx]\r\n\t\t\t\t\tmov\t\tedi, pSpeedCels\r\n\t\t\t\t\tadd\t\tedi, frameidx\r\n\t\t\t\t\tmov\t\tebx, j\r\n\t\t\t\t\tshl\t\tebx, 8\r\n\t\t\t\t\tadd\t\tebx, pLightTbl\r\n\t\t\t\t\tmov\t\tecx, t\r\n\t\t\t\t\tjecxz\tl3_label2\r\n\t\t\t\tl3_label1:\r\n\t\t\t\t\tlodsb\r\n\t\t\t\t\txlat\r\n\t\t\t\t\tstosb\r\n\t\t\t\t\tloop\tl3_label1\r\n\t\t\t\tl3_label2:\r\n\t\t\t\t\tnop\r\n\t\t\t\t}\r\n#else\r\n\t\t\t\tsrc = &pDungeonCels[pFrameTable[z]];\r\n\t\t\t\tdst = &pSpeedCels[frameidx];\r\n\t\t\t\ttbl = &pLightTbl[256 * j];\r\n\t\t\t\tfor (k = t; k; k--) {\r\n\t\t\t\t\t*dst++ = tbl[*src++];\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tframeidx += t;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (j = 1; j < blk_cnt; j++) {\r\n\t\t\t\tSpeedFrameTbl[i][j] = frameidx;\r\n#ifdef USE_ASM\r\n\t\t\t\t__asm {\r\n\t\t\t\t\tmov\t\tebx, pDungeonCels\r\n\t\t\t\t\tmov\t\teax, z\r\n\t\t\t\t\tshl\t\teax, 2\r\n\t\t\t\t\tadd\t\tebx, eax\r\n\t\t\t\t\tmov\t\tesi, pDungeonCels\r\n\t\t\t\t\tadd\t\tesi, [ebx]\r\n\t\t\t\t\tmov\t\tedi, pSpeedCels\r\n\t\t\t\t\tadd\t\tedi, frameidx\r\n\t\t\t\t\tmov\t\tebx, j\r\n\t\t\t\t\tshl\t\tebx, 8\r\n\t\t\t\t\tadd\t\tebx, pLightTbl\r\n\t\t\t\t\tmov\t\tecx, 32\r\n\t\t\t\tl4_label1:\r\n\t\t\t\t\tpush\tecx\r\n\t\t\t\t\tmov\t\tedx, 32\r\n\t\t\t\tl4_label2:\r\n\t\t\t\t\txor\t\teax, eax\r\n\t\t\t\t\tlodsb\r\n\t\t\t\t\tstosb\r\n\t\t\t\t\tor\t\tal, al\r\n\t\t\t\t\tjs\t\tl4_label4\r\n\t\t\t\t\tsub\t\tedx, eax\r\n\t\t\t\t\tmov\t\tecx, eax\r\n\t\t\t\tl4_label3:\r\n\t\t\t\t\tlodsb\r\n\t\t\t\t\txlat\r\n\t\t\t\t\tstosb\r\n\t\t\t\t\tloop\tl4_label3\r\n\t\t\t\t\tor\t\tedx, edx\r\n\t\t\t\t\tjz\t\tl4_label5\r\n\t\t\t\t\tjmp\t\tl4_label2\r\n\t\t\t\tl4_label4:\r\n\t\t\t\t\tneg\t\tal\r\n\t\t\t\t\tsub\t\tedx, eax\r\n\t\t\t\t\tjnz\t\tl4_label2\r\n\t\t\t\tl4_label5:\r\n\t\t\t\t\tpop\t\tecx\r\n\t\t\t\t\tloop\tl4_label1\r\n\t\t\t\t}\r\n#else\r\n\t\t\t\tsrc = &pDungeonCels[pFrameTable[z]];\r\n\t\t\t\tdst = &pSpeedCels[frameidx];\r\n\t\t\t\ttbl = &pLightTbl[256 * j];\r\n\t\t\t\tfor (k = 32; k; k--) {\r\n\t\t\t\t\tfor (l = 32; l;) {\r\n\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t*dst++ = width;\r\n\t\t\t\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\t\t\t\tl -= width;\r\n\t\t\t\t\t\t\twhile (width) {\r\n\t\t\t\t\t\t\t\t*dst++ = tbl[*src++];\r\n\t\t\t\t\t\t\t\twidth--;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\t\tl -= width;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tframeidx += level_frame_sizes[i];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\tfor (x = 0; x < MAXDUNX; x++) {\r\n\t\t\tif (dPiece[x][y] != 0) {\r\n\t\t\t\tpMap = &dpiece_defs_map_2[x][y];\r\n\t\t\t\tfor (i = 0; i < blocks; i++) {\r\n\t\t\t\t\tif (pMap->mt[i]) {\r\n\t\t\t\t\t\tfor (m = 0; m < total_frames; m++) {\r\n\t\t\t\t\t\t\tif ((pMap->mt[i] & 0xFFF) == tile_defs[m]) {\r\n\t\t\t\t\t\t\t\tpMap->mt[i] = m + level_frame_types[m] + 0x8000;\r\n\t\t\t\t\t\t\t\tm = total_frames;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nint IsometricCoord(int x, int y)\r\n{\r\n\tif (x < MAXDUNY - y)\r\n\t\treturn (y + y * y + x * (x + 2 * y + 3)) / 2;\r\n\r\n\tx = MAXDUNX - x - 1;\r\n\ty = MAXDUNY - y - 1;\r\n\treturn MAXDUNX * MAXDUNY - ((y + y * y + x * (x + 2 * y + 3)) / 2) - 1;\r\n}\r\n\r\nvoid SetSpeedCels()\r\n{\r\n\tint x, y;\r\n\r\n\tfor (x = 0; x < MAXDUNX; x++) {\r\n\t\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\t\tdpiece_defs_map_1[IsometricCoord(x, y)] = dpiece_defs_map_2[x][y];\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetDungeonMicros()\r\n{\r\n\tint i, x, y, lv, blocks;\r\n\tWORD *pPiece;\r\n\tMICROS *pMap;\r\n\r\n\tif (leveltype != DTYPE_HELL) {\r\n\t\tMicroTileLen = 10;\r\n\t\tblocks = 10;\r\n\t} else {\r\n\t\tMicroTileLen = 12;\r\n\t\tblocks = 16;\r\n\t}\r\n\r\n\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\tfor (x = 0; x < MAXDUNX; x++) {\r\n\t\t\tlv = dPiece[x][y];\r\n\t\t\tpMap = &dpiece_defs_map_2[x][y];\r\n\t\t\tif (lv != 0) {\r\n\t\t\t\tlv--;\r\n\t\t\t\tif (leveltype != DTYPE_HELL)\r\n\t\t\t\t\tpPiece = (WORD *)&pLevelPieces[20 * lv];\r\n\t\t\t\telse\r\n\t\t\t\t\tpPiece = (WORD *)&pLevelPieces[32 * lv];\r\n\t\t\t\tfor (i = 0; i < blocks; i++)\r\n\t\t\t\t\tpMap->mt[i] = pPiece[(i & 1) + blocks - 2 - (i & 0xE)];\r\n\t\t\t} else {\r\n\t\t\t\tfor (i = 0; i < blocks; i++)\r\n\t\t\t\t\tpMap->mt[i] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tMakeSpeedCels();\r\n\tSetSpeedCels();\r\n\r\n\tif (zoomflag) {\r\n\t\tViewDX = SCREEN_WIDTH;\r\n\t\tViewDY = VIEWPORT_HEIGHT;\r\n\t\tViewBX = SCREEN_WIDTH / TILE_WIDTH;\r\n\t\tViewBY = VIEWPORT_HEIGHT / TILE_HEIGHT;\r\n\t} else {\r\n\t\tViewDX = ZOOM_WIDTH;\r\n\t\tViewDY = ZOOM_HEIGHT;\r\n\t\tViewBX = ZOOM_WIDTH / TILE_WIDTH;\r\n\t\tViewBY = ZOOM_HEIGHT / TILE_HEIGHT;\r\n\t}\r\n}\r\n\r\nvoid DRLG_InitTrans()\r\n{\r\n\tmemset(dTransVal, 0, sizeof(dTransVal));\r\n\tmemset(TransList, 0, sizeof(TransList));\r\n\tTransVal = 1;\r\n}\r\n\r\nvoid DRLG_MRectTrans(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j;\r\n\r\n\tx1 = 2 * x1 + 17;\r\n\ty1 = 2 * y1 + 17;\r\n\tx2 = 2 * x2 + 16;\r\n\ty2 = 2 * y2 + 16;\r\n\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tdTransVal[i][j] = TransVal;\r\n\t\t}\r\n\t}\r\n\r\n\tTransVal++;\r\n}\r\n\r\nvoid DRLG_RectTrans(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tdTransVal[i][j] = TransVal;\r\n\t\t}\r\n\t}\r\n\tTransVal++;\r\n}\r\n\r\nvoid DRLG_CopyTrans(int sx, int sy, int dx, int dy)\r\n{\r\n\tdTransVal[dx][dy] = dTransVal[sx][sy];\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid DRLG_ListTrans(int num, BYTE *List)\r\n{\r\n\tint i;\r\n\tBYTE x1, y1, x2, y2;\r\n\r\n\tfor (i = 0; i < num; i++) {\r\n\t\tx1 = *List++;\r\n\t\ty1 = *List++;\r\n\t\tx2 = *List++;\r\n\t\ty2 = *List++;\r\n\t\tDRLG_RectTrans(x1, y1, x2, y2);\r\n\t}\r\n}\r\n\r\nvoid DRLG_AreaTrans(int num, BYTE *List)\r\n{\r\n\tint i;\r\n\tBYTE x1, y1, x2, y2;\r\n\r\n\tfor (i = 0; i < num; i++) {\r\n\t\tx1 = *List++;\r\n\t\ty1 = *List++;\r\n\t\tx2 = *List++;\r\n\t\ty2 = *List++;\r\n\t\tDRLG_RectTrans(x1, y1, x2, y2);\r\n\t\tTransVal--;\r\n\t}\r\n\tTransVal++;\r\n}\r\n#endif\r\n\r\nvoid DRLG_InitSetPC()\r\n{\r\n\tsetpc_x = 0;\r\n\tsetpc_y = 0;\r\n\tsetpc_w = 0;\r\n\tsetpc_h = 0;\r\n}\r\n\r\nvoid DRLG_SetPC()\r\n{\r\n\tint i, j, x, y, w, h;\r\n\r\n\tw = 2 * setpc_w;\r\n\th = 2 * setpc_h;\r\n\tx = 2 * setpc_x + 16;\r\n\ty = 2 * setpc_y + 16;\r\n\r\n\tfor (j = 0; j < h; j++) {\r\n\t\tfor (i = 0; i < w; i++) {\r\n\t\t\tdFlags[i + x][j + y] |= BFLAG_POPULATED;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid Make_SetPC(int x, int y, int w, int h)\r\n{\r\n\tint i, j, dx, dy, dh, dw;\r\n\r\n\tdw = 2 * w;\r\n\tdh = 2 * h;\r\n\tdx = 2 * x + 16;\r\n\tdy = 2 * y + 16;\r\n\r\n\tfor (j = 0; j < dh; j++) {\r\n\t\tfor (i = 0; i < dw; i++) {\r\n\t\t\tdFlags[i + dx][j + dy] |= BFLAG_POPULATED;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL DRLG_WillThemeRoomFit(int floor, int x, int y, int minSize, int maxSize, int *width, int *height)\r\n{\r\n\tint ii, xx, yy;\r\n\tint xSmallest, ySmallest;\r\n\tint xArray[20], yArray[20];\r\n\tint xCount, yCount;\r\n\tBOOL yFlag, xFlag;\r\n\r\n\tyFlag = TRUE;\r\n\txFlag = TRUE;\r\n\txCount = 0;\r\n\tyCount = 0;\r\n\r\n\t// BUGFIX: incorrect out-of-bounds check, should check that `dungeon[xx][y + ii]` is not out-of-bounds in loop.\r\n\tif (x > DMAXX - maxSize && y > DMAXY - maxSize) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (!SkipThemeRoom(x, y)) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tmemset(xArray, 0, sizeof(xArray));\r\n\tmemset(yArray, 0, sizeof(yArray));\r\n\r\n\tfor (ii = 0; ii < maxSize; ii++) {\r\n\t\tif (xFlag) {\r\n\t\t\tfor (xx = x; xx < x + maxSize; xx++) {\r\n\t\t\t\tif (dungeon[xx][y + ii] != floor) {\r\n\t\t\t\t\tif (xx >= minSize) { // BUGFIX: This is comparing absolute to relative, should be `xx - x >= minSize`\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\txFlag = FALSE;\r\n\t\t\t\t} else {\r\n\t\t\t\t\txCount++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (xFlag) {\r\n\t\t\t\txArray[ii] = xCount;\r\n\t\t\t\txCount = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (yFlag) {\r\n\t\t\tfor (yy = y; yy < y + maxSize; yy++) {\r\n\t\t\t\tif (dungeon[x + ii][yy] != floor) {\r\n\t\t\t\t\tif (yy >= minSize) { // BUGFIX: This is comparing absolute to relative, should be `yy - y >= minSize`\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tyFlag = FALSE;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tyCount++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (yFlag) {\r\n\t\t\t\tyArray[ii] = yCount;\r\n\t\t\t\tyCount = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor (ii = 0; ii < minSize; ii++) {\r\n\t\tif (xArray[ii] < minSize || yArray[ii] < minSize) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\txSmallest = xArray[0];\r\n\tySmallest = yArray[0];\r\n\r\n\tfor (ii = 0; ii < maxSize; ii++) {\r\n\t\tif (xArray[ii] < minSize || yArray[ii] < minSize) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (xArray[ii] < xSmallest) {\r\n\t\t\txSmallest = xArray[ii];\r\n\t\t}\r\n\t\tif (yArray[ii] < ySmallest) {\r\n\t\t\tySmallest = yArray[ii];\r\n\t\t}\r\n\t}\r\n\r\n\t*width = xSmallest - 2;\r\n\t*height = ySmallest - 2;\r\n\treturn TRUE;\r\n}\r\n\r\nvoid DRLG_CreateThemeRoom(int themeIndex)\r\n{\r\n\tint xx, yy;\r\n\r\n\tfor (yy = themeLoc[themeIndex].y; yy < themeLoc[themeIndex].y + themeLoc[themeIndex].height; yy++) {\r\n\t\tfor (xx = themeLoc[themeIndex].x; xx < themeLoc[themeIndex].x + themeLoc[themeIndex].width; xx++) {\r\n\t\t\tif (leveltype == DTYPE_CATACOMBS) {\r\n\t\t\t\tif (yy == themeLoc[themeIndex].y\r\n\t\t\t\t        && xx >= themeLoc[themeIndex].x\r\n\t\t\t\t        && xx <= themeLoc[themeIndex].x + themeLoc[themeIndex].width\r\n\t\t\t\t    || yy == themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1\r\n\t\t\t\t        && xx >= themeLoc[themeIndex].x\r\n\t\t\t\t        && xx <= themeLoc[themeIndex].x + themeLoc[themeIndex].width) {\r\n\t\t\t\t\tdungeon[xx][yy] = 2;\r\n\t\t\t\t} else if (xx == themeLoc[themeIndex].x\r\n\t\t\t\t        && yy >= themeLoc[themeIndex].y\r\n\t\t\t\t        && yy <= themeLoc[themeIndex].y + themeLoc[themeIndex].height\r\n\t\t\t\t    || xx == themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1\r\n\t\t\t\t        && yy >= themeLoc[themeIndex].y\r\n\t\t\t\t        && yy <= themeLoc[themeIndex].y + themeLoc[themeIndex].height) {\r\n\t\t\t\t\tdungeon[xx][yy] = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdungeon[xx][yy] = 3;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (leveltype == DTYPE_CAVES) {\r\n\t\t\t\tif (yy == themeLoc[themeIndex].y\r\n\t\t\t\t        && xx >= themeLoc[themeIndex].x\r\n\t\t\t\t        && xx <= themeLoc[themeIndex].x + themeLoc[themeIndex].width\r\n\t\t\t\t    || yy == themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1\r\n\t\t\t\t        && xx >= themeLoc[themeIndex].x\r\n\t\t\t\t        && xx <= themeLoc[themeIndex].x + themeLoc[themeIndex].width) {\r\n\t\t\t\t\tdungeon[xx][yy] = 134;\r\n\t\t\t\t} else if (xx == themeLoc[themeIndex].x\r\n\t\t\t\t        && yy >= themeLoc[themeIndex].y\r\n\t\t\t\t        && yy <= themeLoc[themeIndex].y + themeLoc[themeIndex].height\r\n\t\t\t\t    || xx == themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1\r\n\t\t\t\t        && yy >= themeLoc[themeIndex].y\r\n\t\t\t\t        && yy <= themeLoc[themeIndex].y + themeLoc[themeIndex].height) {\r\n\t\t\t\t\tdungeon[xx][yy] = 137;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdungeon[xx][yy] = 7;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (leveltype == DTYPE_HELL) {\r\n\t\t\t\tif (yy == themeLoc[themeIndex].y\r\n\t\t\t\t        && xx >= themeLoc[themeIndex].x\r\n\t\t\t\t        && xx <= themeLoc[themeIndex].x + themeLoc[themeIndex].width\r\n\t\t\t\t    || yy == themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1\r\n\t\t\t\t        && xx >= themeLoc[themeIndex].x\r\n\t\t\t\t        && xx <= themeLoc[themeIndex].x + themeLoc[themeIndex].width) {\r\n\t\t\t\t\tdungeon[xx][yy] = 2;\r\n\t\t\t\t} else if (xx == themeLoc[themeIndex].x\r\n\t\t\t\t        && yy >= themeLoc[themeIndex].y\r\n\t\t\t\t        && yy <= themeLoc[themeIndex].y + themeLoc[themeIndex].height\r\n\t\t\t\t    || xx == themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1\r\n\t\t\t\t        && yy >= themeLoc[themeIndex].y\r\n\t\t\t\t        && yy <= themeLoc[themeIndex].y + themeLoc[themeIndex].height) {\r\n\t\t\t\t\tdungeon[xx][yy] = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdungeon[xx][yy] = 6;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (leveltype == DTYPE_CATACOMBS) {\r\n\t\tdungeon[themeLoc[themeIndex].x][themeLoc[themeIndex].y] = 8;\r\n\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y] = 7;\r\n\t\tdungeon[themeLoc[themeIndex].x][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 9;\r\n\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 6;\r\n\t}\r\n\tif (leveltype == DTYPE_CAVES) {\r\n\t\tdungeon[themeLoc[themeIndex].x][themeLoc[themeIndex].y] = 150;\r\n\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y] = 151;\r\n\t\tdungeon[themeLoc[themeIndex].x][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 152;\r\n\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 138;\r\n\t}\r\n\tif (leveltype == DTYPE_HELL) {\r\n\t\tdungeon[themeLoc[themeIndex].x][themeLoc[themeIndex].y] = 9;\r\n\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y] = 16;\r\n\t\tdungeon[themeLoc[themeIndex].x][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 15;\r\n\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 12;\r\n\t}\r\n\r\n\tif (leveltype == DTYPE_CATACOMBS) {\r\n\t\tswitch (random_(0, 2)) {\r\n\t\tcase 0:\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height / 2] = 4;\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width / 2][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 5;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tif (leveltype == DTYPE_CAVES) {\r\n\t\tswitch (random_(0, 2)) {\r\n\t\tcase 0:\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height / 2] = 147;\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width / 2][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 146;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tif (leveltype == DTYPE_HELL) {\r\n\t\tswitch (random_(0, 2)) {\r\n\t\tcase 0:\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height / 2 - 1] = 53;\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height / 2] = 6;\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height / 2 + 1] = 52;\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width - 2][themeLoc[themeIndex].y + themeLoc[themeIndex].height / 2 - 1] = 54;\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width / 2 - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 57;\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width / 2][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 6;\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width / 2 + 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 1] = 56;\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width / 2][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 2] = 59;\r\n\t\t\tdungeon[themeLoc[themeIndex].x + themeLoc[themeIndex].width / 2 - 1][themeLoc[themeIndex].y + themeLoc[themeIndex].height - 2] = 58;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DRLG_PlaceThemeRooms(int minSize, int maxSize, int floor, int freq, int rndSize)\r\n{\r\n\tint i, j;\r\n\tint themeW, themeH;\r\n\tint rv2, min, max;\r\n\r\n\tthemeCount = 0;\r\n\tmemset(themeLoc, 0, sizeof(*themeLoc));\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tif (dungeon[i][j] == floor && !random_(0, freq) && DRLG_WillThemeRoomFit(floor, i, j, minSize, maxSize, &themeW, &themeH)) {\r\n\t\t\t\tif (rndSize) {\r\n\t\t\t\t\tmin = minSize - 2;\r\n\t\t\t\t\tmax = maxSize - 2;\r\n\t\t\t\t\trv2 = min + random_(0, random_(0, themeW - min + 1));\r\n\t\t\t\t\tif (rv2 >= min && rv2 <= max)\r\n\t\t\t\t\t\tthemeW = rv2;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tthemeW = min;\r\n\t\t\t\t\trv2 = min + random_(0, random_(0, themeH - min + 1));\r\n\t\t\t\t\tif (rv2 >= min && rv2 <= max)\r\n\t\t\t\t\t\tthemeH = rv2;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tthemeH = min;\r\n\t\t\t\t}\r\n\t\t\t\tthemeLoc[themeCount].x = i + 1;\r\n\t\t\t\tthemeLoc[themeCount].y = j + 1;\r\n\t\t\t\tthemeLoc[themeCount].width = themeW;\r\n\t\t\t\tthemeLoc[themeCount].height = themeH;\r\n\t\t\t\tif (leveltype == DTYPE_CAVES)\r\n\t\t\t\t\tDRLG_RectTrans(2 * i + 20, 2 * j + 20, 2 * (i + themeW) + 15, 2 * (j + themeH) + 15);\r\n\t\t\t\telse\r\n\t\t\t\t\tDRLG_MRectTrans(i + 1, j + 1, i + themeW, j + themeH);\r\n\t\t\t\tthemeLoc[themeCount].ttval = TransVal - 1;\r\n\t\t\t\tDRLG_CreateThemeRoom(themeCount);\r\n\t\t\t\tthemeCount++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid DRLG_HoldThemeRooms()\r\n{\r\n\tint i, x, y, xx, yy;\r\n\r\n\tfor (i = 0; i < themeCount; i++) {\r\n\t\tfor (y = themeLoc[i].y; y < themeLoc[i].y + themeLoc[i].height - 1; y++) {\r\n\t\t\tfor (x = themeLoc[i].x; x < themeLoc[i].x + themeLoc[i].width - 1; x++) {\r\n\t\t\t\txx = 2 * x + 16;\r\n\t\t\t\tyy = 2 * y + 16;\r\n\t\t\t\tdFlags[xx][yy] |= BFLAG_POPULATED;\r\n\t\t\t\tdFlags[xx + 1][yy] |= BFLAG_POPULATED;\r\n\t\t\t\tdFlags[xx][yy + 1] |= BFLAG_POPULATED;\r\n\t\t\t\tdFlags[xx + 1][yy + 1] |= BFLAG_POPULATED;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL SkipThemeRoom(int x, int y)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < themeCount; i++) {\r\n\t\tif (x >= themeLoc[i].x - 2 && x <= themeLoc[i].x + themeLoc[i].width + 2\r\n\t\t    && y >= themeLoc[i].y - 2 && y <= themeLoc[i].y + themeLoc[i].height + 2)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid InitLevels()\r\n{\r\n\tif (!leveldebug) {\r\n\t\tcurrlevel = 0;\r\n\t\tleveltype = DTYPE_TOWN;\r\n\t\tsetlevel = FALSE;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/gendung.h",
    "content": "/**\r\n * @file gendung.h\r\n *\r\n * Interface of general dungeon generation code.\r\n */\r\n#ifndef __GENDUNG_H__\r\n#define __GENDUNG_H__\r\n\r\nextern BYTE dungeon[DMAXX][DMAXY];\r\nextern BYTE pdungeon[DMAXX][DMAXY];\r\nextern char dflags[DMAXX][DMAXY];\r\nextern int setpc_x;\r\nextern int setpc_y;\r\nextern int setpc_w;\r\nextern int setpc_h;\r\nextern BYTE *pSetPiece;\r\nextern BOOL setloadflag;\r\nextern BYTE *pSpecialCels;\r\nextern BYTE *pMegaTiles;\r\nextern BYTE *pLevelPieces;\r\nextern BYTE *pDungeonCels;\r\nextern BYTE *pSpeedCels;\r\nextern int SpeedFrameTbl[128][16];\r\nextern char block_lvid[MAXTILES + 1];\r\nextern BOOLEAN nBlockTable[MAXTILES + 1];\r\nextern BOOLEAN nSolidTable[MAXTILES + 1];\r\nextern BOOLEAN nTransTable[MAXTILES + 1];\r\nextern BOOLEAN nMissileTable[MAXTILES + 1];\r\nextern BOOLEAN nTrapTable[MAXTILES + 1];\r\nextern int dminx;\r\nextern int dminy;\r\nextern int dmaxx;\r\nextern int dmaxy;\r\nextern int gnDifficulty;\r\nextern BYTE leveltype;\r\nextern BYTE currlevel;\r\nextern BOOLEAN setlevel;\r\nextern BYTE setlvlnum;\r\nextern char setlvltype;\r\nextern int ViewX;\r\nextern int ViewY;\r\nextern int ViewBX;\r\nextern int ViewBY;\r\nextern int ViewDX;\r\nextern int ViewDY;\r\nextern ScrollStruct ScrollInfo;\r\nextern int LvlViewX;\r\nextern int LvlViewY;\r\nextern int MicroTileLen;\r\nextern char TransVal;\r\nextern BOOLEAN TransList[256];\r\nextern int dPiece[MAXDUNX][MAXDUNY];\r\nextern MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY];\r\nextern MICROS dpiece_defs_map_1[MAXDUNX * MAXDUNY];\r\nextern char dTransVal[MAXDUNX][MAXDUNY];\r\nextern char dLight[MAXDUNX][MAXDUNY];\r\nextern char dPreLight[MAXDUNX][MAXDUNY];\r\nextern char dFlags[MAXDUNX][MAXDUNY];\r\nextern char dPlayer[MAXDUNX][MAXDUNY];\r\nextern int dMonster[MAXDUNX][MAXDUNY];\r\nextern char dDead[MAXDUNX][MAXDUNY];\r\nextern char dObject[MAXDUNX][MAXDUNY];\r\nextern char dItem[MAXDUNX][MAXDUNY];\r\nextern char dMissile[MAXDUNX][MAXDUNY];\r\nextern char dSpecial[MAXDUNX][MAXDUNY];\r\nextern int themeCount;\r\nextern THEME_LOC themeLoc[MAXTHEMES];\r\n\r\nvoid FillSolidBlockTbls();\r\nint IsometricCoord(int x, int y);\r\nvoid SetDungeonMicros();\r\nvoid DRLG_InitTrans();\r\nvoid DRLG_MRectTrans(int x1, int y1, int x2, int y2);\r\nvoid DRLG_RectTrans(int x1, int y1, int x2, int y2);\r\nvoid DRLG_CopyTrans(int sx, int sy, int dx, int dy);\r\nvoid DRLG_ListTrans(int num, BYTE *List);\r\nvoid DRLG_AreaTrans(int num, BYTE *List);\r\nvoid DRLG_InitSetPC();\r\nvoid DRLG_SetPC();\r\nvoid Make_SetPC(int x, int y, int w, int h);\r\nvoid DRLG_PlaceThemeRooms(int minSize, int maxSize, int floor, int freq, int rndSize);\r\nvoid DRLG_HoldThemeRooms();\r\nBOOL SkipThemeRoom(int x, int y);\r\nvoid InitLevels();\r\n\r\n#endif /* __GENDUNG_H__ */\r\n"
  },
  {
    "path": "Source/gmenu.cpp",
    "content": "/**\r\n * @file gmenu.cpp\r\n *\r\n * Implementation of the in-game navigation and interaction.\r\n */\r\n#include \"all.h\"\r\n\r\nBYTE *optbar_cel;\r\nBOOLEAN mouseNavigation;\r\nBYTE *PentSpin_cel;\r\nTMenuItem *sgpCurrItem;\r\nBYTE *BigTGold_cel;\r\n#ifdef HELLFIRE\r\nint LogoAnim_tick;\r\nBYTE LogoAnim_frame;\r\n#endif\r\nint PentSpin_tick;\r\nBYTE PentSpin_frame;\r\nvoid (*gmenu_current_option)(TMenuItem *);\r\nTMenuItem *sgpCurrentMenu;\r\nBYTE *option_cel;\r\nBYTE *sgpLogo;\r\nint sgCurrentMenuIdx;\r\n\r\n/** Maps from font index to bigtgold.cel frame number. */\r\nconst BYTE lfontframe[] = {\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 37, 49, 38, 0, 39, 40, 47,\r\n\t42, 43, 41, 45, 52, 44, 53, 55, 36, 27,\r\n\t28, 29, 30, 31, 32, 33, 34, 35, 51, 50,\r\n\t0, 46, 0, 54, 0, 1, 2, 3, 4, 5,\r\n\t6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\r\n\t16, 17, 18, 19, 20, 21, 22, 23, 24, 25,\r\n\t26, 42, 0, 43, 0, 0, 0, 1, 2, 3,\r\n\t4, 5, 6, 7, 8, 9, 10, 11, 12, 13,\r\n\t14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\r\n\t24, 25, 26, 20, 0, 21, 0, 0\r\n};\r\n\r\n/** Maps from bigtgold.cel frame number to character width. */\r\nconst BYTE lfontkern[] = {\r\n\t18, 33, 21, 26, 28, 19, 19, 26, 25, 11,\r\n\t12, 25, 19, 34, 28, 32, 20, 32, 28, 20,\r\n\t28, 36, 35, 46, 33, 33, 24, 11, 23, 22,\r\n\t22, 21, 22, 21, 21, 21, 32, 10, 20, 36,\r\n\t31, 17, 13, 12, 13, 18, 16, 11, 20, 21,\r\n\t11, 10, 12, 11, 21, 23\r\n};\r\n\r\nstatic void gmenu_print_text(int x, int y, const char *pszStr)\r\n{\r\n\tBYTE c;\r\n\r\n\twhile (*pszStr) {\r\n\t\tc = gbFontTransTbl[(BYTE)*pszStr++];\r\n\t\tc = lfontframe[c];\r\n\t\tif (c != 0)\r\n\t\t\tCelDrawLight(x, y, BigTGold_cel, c, 46);\r\n\t\tx += lfontkern[c] + 2;\r\n\t}\r\n}\r\n\r\nvoid gmenu_draw_pause()\r\n{\r\n\tif (currlevel != 0)\r\n\t\tRedBack();\r\n\tif (!sgpCurrentMenu) {\r\n\t\tlight_table_index = 0;\r\n\t\tgmenu_print_text(316 + PANEL_LEFT, 336, \"Pause\");\r\n\t}\r\n}\r\n\r\nvoid FreeGMenu()\r\n{\r\n\tMemFreeDbg(sgpLogo);\r\n\tMemFreeDbg(BigTGold_cel);\r\n\tMemFreeDbg(PentSpin_cel);\r\n\tMemFreeDbg(option_cel);\r\n\tMemFreeDbg(optbar_cel);\r\n}\r\n\r\nvoid gmenu_init_menu()\r\n{\r\n\tPentSpin_frame = 1;\r\n#ifdef HELLFIRE\r\n\tLogoAnim_frame = 1;\r\n#endif\r\n\tsgpCurrentMenu = NULL;\r\n\tsgpCurrItem = NULL;\r\n\tgmenu_current_option = NULL;\r\n\tsgCurrentMenuIdx = 0;\r\n\tmouseNavigation = FALSE;\r\n#ifdef HELLFIRE\r\n\tsgpLogo = LoadFileInMem(\"Data\\\\hf_logo3.CEL\", NULL);\r\n#else\r\n\tsgpLogo = LoadFileInMem(\"Data\\\\Diabsmal.CEL\", NULL);\r\n#endif\r\n\tBigTGold_cel = LoadFileInMem(\"Data\\\\BigTGold.CEL\", NULL);\r\n\tPentSpin_cel = LoadFileInMem(\"Data\\\\PentSpin.CEL\", NULL);\r\n\toption_cel = LoadFileInMem(\"Data\\\\option.CEL\", NULL);\r\n\toptbar_cel = LoadFileInMem(\"Data\\\\optbar.CEL\", NULL);\r\n}\r\n\r\nBOOL gmenu_is_active()\r\n{\r\n\treturn sgpCurrentMenu != NULL;\r\n}\r\n\r\nstatic void gmenu_up_down(BOOL isDown)\r\n{\r\n\tint i;\r\n\r\n\tif (!sgpCurrItem) {\r\n\t\treturn;\r\n\t}\r\n\tmouseNavigation = FALSE;\r\n\ti = sgCurrentMenuIdx;\r\n\tif (sgCurrentMenuIdx) {\r\n\t\twhile (i) {\r\n\t\t\ti--;\r\n\t\t\tif (isDown) {\r\n\t\t\t\tsgpCurrItem++;\r\n\t\t\t\tif (!sgpCurrItem->fnMenu)\r\n\t\t\t\t\tsgpCurrItem = &sgpCurrentMenu[0];\r\n\t\t\t} else {\r\n\t\t\t\tif (sgpCurrItem == sgpCurrentMenu)\r\n\t\t\t\t\tsgpCurrItem = &sgpCurrentMenu[sgCurrentMenuIdx];\r\n\t\t\t\tsgpCurrItem--;\r\n\t\t\t}\r\n\t\t\tif ((sgpCurrItem->dwFlags & GMENU_ENABLED) != 0) {\r\n\t\t\t\tif (i)\r\n\t\t\t\t\tPlaySFX(IS_TITLEMOV);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *))\r\n{\r\n\tint i;\r\n\r\n\tPauseMode = 0;\r\n\tmouseNavigation = FALSE;\r\n\tsgpCurrentMenu = pItem;\r\n\tgmenu_current_option = gmFunc;\r\n\tif (gmFunc) {\r\n\t\tgmenu_current_option(sgpCurrentMenu);\r\n\t\tpItem = sgpCurrentMenu;\r\n\t}\r\n\tsgCurrentMenuIdx = 0;\r\n\tif (sgpCurrentMenu) {\r\n\t\tfor (i = 0; sgpCurrentMenu[i].fnMenu; i++) {\r\n\t\t\tsgCurrentMenuIdx++;\r\n\t\t}\r\n\t}\r\n\t// BUGFIX: OOB access when sgCurrentMenuIdx is 0; should be set to NULL instead.\r\n\tsgpCurrItem = &sgpCurrentMenu[sgCurrentMenuIdx - 1];\r\n\tgmenu_up_down(TRUE);\r\n}\r\n\r\nstatic void gmenu_clear_buffer(int x, int y, int width, int height)\r\n{\r\n\tBYTE *i;\r\n\r\n\ti = gpBuffer + PitchTbl[y] + x;\r\n\twhile (height--) {\r\n\t\tmemset(i, 205, width);\r\n\t\ti -= BUFFER_WIDTH;\r\n\t}\r\n}\r\n\r\nstatic int gmenu_get_lfont(TMenuItem *pItem)\r\n{\r\n\tconst char *text;\r\n\tint i;\r\n\tBYTE c;\r\n\r\n\tif (pItem->dwFlags & GMENU_SLIDER)\r\n\t\treturn 490;\r\n\ttext = pItem->pszStr;\r\n\ti = 0;\r\n\twhile (*text) {\r\n\t\tc = gbFontTransTbl[(BYTE)*text++];\r\n\t\ti += lfontkern[lfontframe[c]] + 2;\r\n\t}\r\n\treturn i - 2;\r\n}\r\n\r\nstatic void gmenu_draw_menu_item(TMenuItem *pItem, int y)\r\n{\r\n\tDWORD w, x, nSteps, step, pos, t;\r\n#ifndef HELLFIRE\r\n\tt = y - 2;\r\n#endif\r\n\tw = gmenu_get_lfont(pItem);\r\n\tif (pItem->dwFlags & GMENU_SLIDER) {\r\n\t\tx = 16 + w / 2 + SCREEN_X;\r\n#ifdef HELLFIRE\r\n\t\tCelDraw(x + PANEL_LEFT, y - 10, optbar_cel, 1, 287);\r\n#else\r\n\t\tCelDraw(x + PANEL_LEFT, t - 8, optbar_cel, 1, 287);\r\n#endif\r\n\t\tstep = pItem->dwFlags & 0xFFF;\r\n\t\tnSteps = (pItem->dwFlags & 0xFFF000) >> 12;\r\n\t\tif (nSteps < 2)\r\n\t\t\tnSteps = 2;\r\n\t\tpos = step * 256 / nSteps;\r\n#ifdef HELLFIRE\r\n\t\tgmenu_clear_buffer(x + 2 + PANEL_LEFT, y - 12, pos + 13, 28);\r\n#else\r\n\t\tgmenu_clear_buffer(x + 2 + PANEL_LEFT, t - 10, pos + 13, 28);\r\n#endif\r\n\t\tCelDraw(x + 2 + pos + PANEL_LEFT, y - 12, option_cel, 1, 27);\r\n\t}\r\n\tx = SCREEN_WIDTH / 2 - w / 2 + SCREEN_X;\r\n\tlight_table_index = (pItem->dwFlags & GMENU_ENABLED) ? 0 : 15;\r\n\tgmenu_print_text(x, y, pItem->pszStr);\r\n\tif (pItem == sgpCurrItem) {\r\n\t\tCelDraw(x - 54, y + 1, PentSpin_cel, PentSpin_frame, 48);\r\n\t\tCelDraw(x + 4 + w, y + 1, PentSpin_cel, PentSpin_frame, 48);\r\n\t}\r\n}\r\n\r\nvoid gmenu_draw()\r\n{\r\n\tint y;\r\n\tTMenuItem *i;\r\n\tDWORD ticks;\r\n\r\n\tif (sgpCurrentMenu) {\r\n\t\tif (gmenu_current_option)\r\n\t\t\tgmenu_current_option(sgpCurrentMenu);\r\n#ifdef HELLFIRE\r\n\t\tticks = GetTickCount();\r\n\t\tif ((int)(ticks - LogoAnim_tick) > 25) {\r\n\t\t\tLogoAnim_frame++;\r\n\t\t\tif (LogoAnim_frame > 16)\r\n\t\t\t\tLogoAnim_frame = 1;\r\n\t\t\tLogoAnim_tick = ticks;\r\n\t\t}\r\n\t\tCelDraw((SCREEN_WIDTH - 430) / 2 + SCREEN_X, 102 + SCREEN_Y, sgpLogo, LogoAnim_frame, 430);\r\n#else\r\n\t\tCelDraw((SCREEN_WIDTH - 296) / 2 + SCREEN_X, 102 + SCREEN_Y, sgpLogo, 1, 296);\r\n#endif\r\n\t\ty = 160 + SCREEN_Y;\r\n\t\ti = sgpCurrentMenu;\r\n\t\tif (sgpCurrentMenu->fnMenu) {\r\n\t\t\twhile (i->fnMenu) {\r\n\t\t\t\tgmenu_draw_menu_item(i, y);\r\n\t\t\t\ti++;\r\n\t\t\t\ty += 45;\r\n\t\t\t}\r\n\t\t}\r\n\r\n#ifndef HELLFIRE\r\n\t\tticks = GetTickCount();\r\n#endif\r\n\t\tif ((int)(ticks - PentSpin_tick) > 25) { // BUGFIX: thould be 50ms\r\n\t\t\tPentSpin_frame++;\r\n\t\t\tif (PentSpin_frame == 9)\r\n\t\t\t\tPentSpin_frame = 1;\r\n\t\t\tPentSpin_tick = ticks;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void gmenu_left_right(BOOL isRight)\r\n{\r\n\tint step, steps;\r\n\r\n\tif (!(sgpCurrItem->dwFlags & GMENU_SLIDER))\r\n\t\treturn;\r\n\r\n\tstep = sgpCurrItem->dwFlags & 0xFFF;\r\n\tsteps = (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12;\r\n\tif (isRight) {\r\n\t\tif (step == steps)\r\n\t\t\treturn;\r\n\t\tstep++;\r\n\t} else {\r\n\t\tif (step == 0)\r\n\t\t\treturn;\r\n\t\tstep--;\r\n\t}\r\n\tsgpCurrItem->dwFlags &= 0xFFFFF000;\r\n\tsgpCurrItem->dwFlags |= step;\r\n\tsgpCurrItem->fnMenu(FALSE);\r\n}\r\n\r\nBOOL gmenu_presskeys(int vkey)\r\n{\r\n\tif (!sgpCurrentMenu)\r\n\t\treturn FALSE;\r\n\tswitch (vkey) {\r\n\tcase VK_RETURN:\r\n\t\tif ((sgpCurrItem->dwFlags & GMENU_ENABLED) != 0) {\r\n\t\t\tPlaySFX(IS_TITLEMOV);\r\n\t\t\tsgpCurrItem->fnMenu(TRUE);\r\n\t\t}\r\n\t\tbreak;\r\n\tcase VK_ESCAPE:\r\n\t\tPlaySFX(IS_TITLEMOV);\r\n\t\tgmenu_set_items(NULL, NULL);\r\n\t\tbreak;\r\n\tcase VK_SPACE:\r\n\t\treturn FALSE;\r\n\tcase VK_LEFT:\r\n\t\tgmenu_left_right(FALSE);\r\n\t\tbreak;\r\n\tcase VK_RIGHT:\r\n\t\tgmenu_left_right(TRUE);\r\n\t\tbreak;\r\n\tcase VK_UP:\r\n\t\tgmenu_up_down(FALSE);\r\n\t\tbreak;\r\n\tcase VK_DOWN:\r\n\t\tgmenu_up_down(TRUE);\r\n\t\tbreak;\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nstatic BOOLEAN gmenu_get_mouse_slider(int *plOffset)\r\n{\r\n\t*plOffset = 282;\r\n\tif (MouseX < 282 + PANEL_LEFT) {\r\n\t\t*plOffset = 0;\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (MouseX > 538 + PANEL_LEFT) {\r\n\t\t*plOffset = 256;\r\n\t\treturn FALSE;\r\n\t}\r\n\t*plOffset = MouseX - 282 - PANEL_LEFT;\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL gmenu_on_mouse_move()\r\n{\r\n\tint step, nSteps;\r\n\r\n\tif (!mouseNavigation)\r\n\t\treturn FALSE;\r\n\tgmenu_get_mouse_slider(&step);\r\n\tnSteps = (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12;\r\n\tstep *= nSteps;\r\n\tstep /= 256;\r\n\r\n\tsgpCurrItem->dwFlags &= 0xFFFFF000;\r\n\tsgpCurrItem->dwFlags |= step;\r\n\tsgpCurrItem->fnMenu(FALSE);\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL gmenu_left_mouse(BOOL isDown)\r\n{\r\n\tTMenuItem *pItem;\r\n\tDWORD i, w;\r\n\tint dummy;\r\n\r\n\tif (!isDown) {\r\n\t\tif (mouseNavigation) {\r\n\t\t\tmouseNavigation = FALSE;\r\n\t\t\treturn TRUE;\r\n\t\t} else {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!sgpCurrentMenu) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (MouseY >= PANEL_TOP) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (MouseY - 117 < 0) {\r\n\t\treturn TRUE;\r\n\t}\r\n\ti = (MouseY - 117) / 45;\r\n\tif (i >= sgCurrentMenuIdx) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tpItem = &sgpCurrentMenu[i];\r\n\tif (!(sgpCurrentMenu[i].dwFlags & GMENU_ENABLED)) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tw = gmenu_get_lfont(pItem);\r\n\tif (MouseX < SCREEN_WIDTH / 2 - w / 2) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (MouseX > SCREEN_WIDTH / 2 + w / 2) {\r\n\t\treturn TRUE;\r\n\t}\r\n\tsgpCurrItem = pItem;\r\n\tPlaySFX(IS_TITLEMOV);\r\n\tif (pItem->dwFlags & GMENU_SLIDER) {\r\n\t\tmouseNavigation = gmenu_get_mouse_slider(&dummy);\r\n\t\tgmenu_on_mouse_move();\r\n\t} else {\r\n\t\tsgpCurrItem->fnMenu(TRUE);\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nvoid gmenu_enable(TMenuItem *pMenuItem, BOOL enable)\r\n{\r\n\tif (enable)\r\n\t\tpMenuItem->dwFlags |= GMENU_ENABLED;\r\n\telse\r\n\t\tpMenuItem->dwFlags &= ~GMENU_ENABLED;\r\n}\r\n\r\n/**\r\n * @brief Set the TMenuItem slider position based on the given value\r\n */\r\nvoid gmenu_slider_set(TMenuItem *pItem, int min, int max, int value)\r\n{\r\n\tint nSteps;\r\n\r\n\tassert(pItem);\r\n\tnSteps = (int)(pItem->dwFlags & 0xFFF000) >> 12;\r\n\tif (nSteps < 2)\r\n\t\tnSteps = 2;\r\n\tpItem->dwFlags &= 0xFFFFF000;\r\n\tpItem->dwFlags |= ((max - min - 1) / 2 + (value - min) * nSteps) / (max - min);\r\n}\r\n\r\n/**\r\n * @brief Get the current value for the slider\r\n */\r\nint gmenu_slider_get(TMenuItem *pItem, int min, int max)\r\n{\r\n\tint nSteps, step;\r\n\r\n\tstep = pItem->dwFlags & 0xFFF;\r\n\tnSteps = (int)(pItem->dwFlags & 0xFFF000) >> 12;\r\n\tif (nSteps < 2)\r\n\t\tnSteps = 2;\r\n\treturn min + (step * (max - min) + (nSteps - 1) / 2) / nSteps;\r\n}\r\n\r\n/**\r\n * @brief Set the number of steps for the slider\r\n */\r\nvoid gmenu_slider_steps(TMenuItem *pItem, int steps)\r\n{\r\n\tpItem->dwFlags &= 0xFF000FFF;\r\n\tpItem->dwFlags |= (steps << 12) & 0xFFF000;\r\n}\r\n"
  },
  {
    "path": "Source/gmenu.h",
    "content": "/**\r\n * @file gmenu.h\r\n *\r\n * Interface of the in-game navigation and interaction.\r\n */\r\n#ifndef __GMENU_H__\r\n#define __GMENU_H__\r\n\r\nvoid gmenu_draw_pause();\r\nvoid FreeGMenu();\r\nvoid gmenu_init_menu();\r\nBOOL gmenu_is_active();\r\nvoid gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *));\r\nvoid gmenu_draw();\r\nBOOL gmenu_presskeys(int vkey);\r\nBOOL gmenu_on_mouse_move();\r\nBOOL gmenu_left_mouse(BOOL isDown);\r\nvoid gmenu_enable(TMenuItem *pMenuItem, BOOL enable);\r\nvoid gmenu_slider_set(TMenuItem *pItem, int min, int max, int gamma);\r\nint gmenu_slider_get(TMenuItem *pItem, int min, int max);\r\nvoid gmenu_slider_steps(TMenuItem *pItem, int dwTicks);\r\n\r\n#endif /* __GMENU_H__ */\r\n"
  },
  {
    "path": "Source/help.cpp",
    "content": "/**\r\n * @file help.cpp\r\n *\r\n * Implementation of the in-game help text.\r\n */\r\n#include \"all.h\"\r\n\r\nint help_select_line;\r\nint unused_help;\r\nBOOL helpflag;\r\nint displayinghelp[22]; /* check, does nothing? */\r\nint HelpTop;\r\n\r\nconst char gszHelpText[] = {\r\n#ifdef SPAWN\r\n\t\"Shareware Diablo Help|\"\r\n\t\"|\"\r\n\t\"$Keyboard Shortcuts:|\"\r\n\t\"Diablo can be played exclusively by using the mouse controls.  \"\r\n\t\"There are times, however, when you may want to use shortcuts to some \"\r\n\t\"commands by using the keyboard.  These shortcuts are listed below:|\"\r\n\t\"|\"\r\n\t\"F1:    Open the Help Screen|\"\r\n\t\"Esc:    Displays the main menu|\"\r\n\t\"Tab:    Displays the Auto-map|\"\r\n\t\"Space:  Removes any pop-up menus or maps from the play area|\"\r\n\t\"S:  Open Speedbook|\"\r\n\t\"B:  Open Spellbook|\"\r\n\t\"I:  Opens the Inventory screen|\"\r\n\t\"C:  Opens the Character screen|\"\r\n\t\"Z:  Zooms the game screen in and out|\"\r\n\t\"F:  Reduces the brightness of the screen|\"\r\n\t\"G:  Increases the brightness of the screen|\"\r\n\t\"Q:  Opens the Quest log (non-functional in the Shareware version)|\"\r\n\t\"1 - 8:  Use that item from your Belt|\"\r\n\t\"F5, F6, F7, F8:  Sets a hot key for a selected skill or spell|\"\r\n\t\"Shift + Left Click: Use any weapon without moving|\"\r\n\t\"|\"\r\n\t\"|\"\r\n\t\"$Movement:|\"\r\n\t\"Movement is controlled by the mouse.  The gauntlet on the screen is \"\r\n\t\"your cursor.  Use this to indicate the destination of your character \"\r\n\t\"and then left-click to move to that area. \"\r\n\t\"If you hold the mouse button down while moving, the character \"\r\n\t\"will continue to move in that direction.|\"\r\n\t\"|\"\r\n\t\"$Selecting Items:|\"\r\n\t\"What you can interact with within the game is easily identifiable. \"\r\n\t\"Move the cursor over any object or creature. If the object can be \"\r\n\t\"picked up, attacked, activated or used in any way, it will be \"\r\n\t\"immediately outlined. A description of the highlighted object appears \"\r\n\t\"in the text area on the control panel.|\"\r\n\t\"|\"\r\n\t\"Example: If you select a door and then left-click the character will \"\r\n\t\"walk to the door and open it. If you left-click on a highlighted \"\r\n\t\"weapon, the character will walk over to it and put it in his \"\r\n\t\"inventory. If you left-click on a highlighted creature...|\"\r\n\t\"|\"\r\n\t\"$Combat:|\"\r\n\t\"Combat is initiated by left-clicking on a creature that has been \"\r\n\t\"highlighted. If your character is equipped with a melee weapon \"\r\n\t\"(Sword, Mace, Ax, etc.) your character will move to range and attack. \"\r\n\t\"If your character is equipped with a bow, left-clicking will fire an \"\r\n\t\"arrow at the highlighted creature. \"\r\n\t\"Holding down the shift key and then left-clicking allows the \"\r\n\t\"character to attack without moving.|\"\r\n\t\"|\"\r\n\t\"$Picking up Objects:|\"\r\n\t\"If you left-click on an item - such as a weapon, shield, armor or \"\r\n\t\"book - your character will move to that item and add it to his \"\r\n\t\"inventory automatically.|\"\r\n\t\"|\"\r\n\t\"Useable items that are small in size - such as a potion or \"\r\n\t\"scroll - are automatically placed in your 'belt', located at the \"\r\n\t\"top of the Interface bar . When an item is placed in the belt, \"\r\n\t\"a small number appears in that box. Items may be used by either \"\r\n\t\"right-clicking on the item or pressing the corresponding number on \"\r\n\t\"the keyboard.|\"\r\n\t\"|\"\r\n\t\"If you do not have enough room in your inventory or belt for an item \"\r\n\t\"that you try to pick up, it will fall from your grasp. Open your \"\r\n\t\"inventory screen and try re-arranging or removing items to carry \"\r\n\t\"what you really want or need.|\"\r\n\t\"|\"\r\n\t\"$Inventory:|\"\r\n\t\"You can toggle the Inventory screen on and off by clicking the \"\r\n\t\"INV> button on the control panel.  Items may be moved around in \"\r\n\t\"your inventory by selecting them and then left-clicking to pick \"\r\n\t\"them up.  When you pick up an item while in the inventory screen, \"\r\n\t\"your cursor changes into the item. You can then place this item into \"\r\n\t\"empty spaces in your inventory, swap them with other items in your \"\r\n\t\"inventory or equip them.|\"\r\n\t\"|\"\r\n\t\"If you have an item that you no longer wish to carry, simply \"\r\n\t\"grab the item from your inventory and then left-click in the \"\r\n\t\"play area to drop it.|\"\r\n\t\"|\"\r\n\t\"$Equipping Items:|\"\r\n\t\"To equip an item, open the inventory screen and pick up the desired \"\r\n\t\"item, either from play or from your inventory, placing it in the \"\r\n\t\"appropriate box on the figure in the inventory screen. Weapons and \"\r\n\t\"shields go into the large spaces to the  right or left of the figure. \"\r\n\t\"Two-handed weapons such as bows and axes preclude the use of a \"\r\n\t\"shield and will take up both of these large spaces.|\"\r\n\t\"|\"\r\n\t\"Cloaks, robes, capes and all other armor must go in the central \"\r\n\t\"torso slot of the figure. |\"\r\n\t\"|\"\r\n\t\"Helmets and caps go in the box over the head of the character.|\"\r\n\t\"|\"\r\n\t\"Rings go into the small boxes at the hands of the figure.|\"\r\n\t\"|\"\r\n\t\"Amulets go into the small box at the next to the neck of the figure.|\"\r\n\t\"|\"\r\n\t\"To change items that your character has equipped, pick up a new \"\r\n\t\"item and place it on top of the item you wish to remove.  Your \"\r\n\t\"character will automatically swap the items and the cursor will \"\r\n\t\"now change into the item that was in that box.|\"\r\n\t\"|\"\r\n\t\"$Usable Items:|\"\r\n\t\"Potions, elixirs and books are classified as usable items.  These \"\r\n\t\"items can be used by right-clicking on them in the inventory screen.  \"\r\n\t\"Books are too large to be placed in the belt, but any potions or \"\r\n\t\"scrolls that are put there can also be used by pressing the \"\r\n\t\"corresponding number on the keyboard.|\"\r\n\t\"|\"\r\n\t\"$Gold:|\"\r\n\t\"You can select a specific amount of gold to drop by right \"\r\n\t\"clicking on a pile of gold in your inventory. \"\r\n\t\"A dialog will appear that allows you to select a specific amount of \"\r\n\t\"gold to take. When you have entered that number, your cursor will \"\r\n\t\"change into that amount of gold.|\"\r\n\t\"|\"\r\n\t\"$Item Information:|\"\r\n\t\"Many items in Diablo share certain common attributes.  These are \"\r\n\t\"damage, durability, charges and minimum requirements..|\"\r\n\t\"|\"\r\n\t\"Damage: This is represented by a range that indicates the minimum \"\r\n\t\"and maximum damage that item can inflict. A short sword has a (2-6) \"\r\n\t\"after its name, meaning it inflicts a minimum of two damage and a \"\r\n\t\"maximum of six when it hits. Damage can be modified by the quality \"\r\n\t\"of the weapon, the character's strength and magical effects.|\"\r\n\t\"|\"\r\n\t\"Durability: This is the amount of damage that an item can take \"\r\n\t\"before it is rendered useless. Durability is represented by a \"\r\n\t\"ratio of current durability to maximum durability. A shield that \"\r\n\t\"has a durability of 15/20 would still have 15 points of damage it \"\r\n\t\"could take from use before it was rendered useless. Maximum \"\r\n\t\"durability can be affected by the quality of the item, enchantments \"\r\n\t\"or repairs made upon the item. The minimum durability can be raised \"\r\n\t\"by repairing an item.|\"\r\n\t\"|\"\r\n\t\"Charges: Some items have charges associated with them. Charges \"\r\n\t\"indicate how many times that item can be used to cast the spell or \"\r\n\t\"affect indicated in its description.  Charges are represented by \"\r\n\t\"a ratio of charges left to maximum charges. A staff that has charges \"\r\n\t\"listed as 2/5 could be used to cast 2 more spells before it was \"\r\n\t\"rendered powerless. It could still be used to attack with as a \"\r\n\t\"physical weapon, however. Maximum charges can be affected by the \"\r\n\t\"magic or recharges cast upon the item. Minimum charges can be \"\r\n\t\"raised by recharging the item.|\"\r\n\t\"|\"\r\n\t\"Minimum Requirements: These are the minimum requirements that a \"\r\n\t\"character must meet to wield the item. The more powerful an item is, \"\r\n\t\"the higher the minimum requirements will be.  If a character \"\r\n\t\"does not meet these requirements, he will be unable to equip the \"\r\n\t\"item and its name and information will be displayed in red.  \"\r\n\t\"The item artwork will also have a red tint in the Inventory screen.|\"\r\n\t\"|\"\r\n\t\"$Items Classes:|\"\r\n\t\"There are three classes of items in Diablo - Mundane, \"\r\n\t\"Magic and Unique:|\"\r\n\t\"|\"\r\n\t\"Mundane items have no special attributes. Their information is \"\r\n\t\"displayed in white text.|\"\r\n\t\"|\"\r\n\t\"Magic Items are represented by blue names and text descriptions. \"\r\n\t\"Use the Identify spell or speak to Cain in town to determine their \"\r\n\t\"exact properties and attributes.|\"\r\n\t\"|\"\r\n\t\"Unique items are represented by gold names and text descriptions. \"\r\n\t\"Use the Identify spell or speak to Cain in town to determine their \"\r\n\t\"exact properties and attributes.|\"\r\n\t\"|\"\r\n\t\"$Skills & Spells:|\"\r\n\t\"You can access your list of skills and spells by left-clicking on \"\r\n\t\"the SPELLS button in the interface bar. This 'Spellbook' contains all \"\r\n\t\"of the skills and spells that your character knows. Spells \"\r\n\t\"available through staffs are also listed here. Left-clicking on \"\r\n\t\"the Icon of the spell you wish to ready will place it in the \"\r\n\t\"'select current spell' icon/area and set it as the current \"\r\n\t\"readied spell. A readied spell \"\r\n\t\"may be cast by simply right-clicking in the play area.|\"\r\n\t\"|\"\r\n\t\"Left-clicking on the 'select current spell' button will also \"\r\n\t\"open a 'Speedbook' menu that also allows you to ready a skill \"\r\n\t\"or spell for use.  To use a readied skill or spell, simply \"\r\n\t\"right-click in the main play area.|\"\r\n\t\"|\"\r\n\t\"Skills are the innate abilities of your character. These skills \"\r\n\t\"are different depending on what class you choose and require no \"\r\n\t\"mana to use.|\"\r\n\t\"|\"\r\n\t\"Warrior:|\"\r\n\t\"The Warrior has the skill of Repair Items. This allows him to fix \"\r\n\t\"an item that has been worn by use or is damaged in combat. \"\r\n\t\"To accomplish this, select the Repair Skill through the \"\r\n\t\"Spellbook or Speedbook and right-click the mouse as if you were \"\r\n\t\"casting a spell. Your cursor will change into a Hammer Icon \"\r\n\t\"that you will use to select the item to be repaired.  \"\r\n\t\"Although Repairing an item in this way will decrease the \"\r\n\t\"maximum durability of that item, it can be done without leaving \"\r\n\t\"the labyrinth.|\"\r\n\t\"|\"\r\n\t\"The Blacksmith can also repair items for a price. When the \"\r\n\t\"Blacksmith performs this service, it does decrease the maximum \"\r\n\t\"durability of the item.|\"\r\n\t\"|\"\r\n\t\"Rogue:|\"\r\n\t\"The Rogue has the skill of Disarm Traps. This allows her to not only \"\r\n\t\"remove traps, but also acts as a 'sixth sense' that warns her of \"\r\n\t\"where these trapped items are located. To accomplish this, select \"\r\n\t\"the Disarm Trap skill through the Spellbook or Speedbook and \"\r\n\t\"right-click the mouse as if you were casting a spell.  \"\r\n\t\"Your cursor will change into a Targeting Cursor that you will \"\r\n\t\"use to select the item to be disarmed.  The success of this \"\r\n\t\"attempt is based on the level of the Rogue and the expertise of \"\r\n\t\"whomever set the trap.|\"\r\n\t\"|\"\r\n\t\"Sorcerer:|\"\r\n\t\"The Sorcerer has the skill of Recharge Staffs. This allows him to \"\r\n\t\"focus his mana into an staff that has been drained of its magical \"\r\n\t\"energies.  To accomplish this, select the Recharge Staffs skill \"\r\n\t\"through the Spellbook or Speedbook and right-click the mouse as \"\r\n\t\"if you were casting a spell.  Your cursor will change into a \"\r\n\t\"Staff Icon that you will use to select the item to be recharged.  \"\r\n\t\"Although Recharging a staff in this way will decrease its maximum \"\r\n\t\"charges, it can be done without leaving the labyrinth.|\"\r\n\t\"|\"\r\n\t\"The Witch can also recharge staffs for a price. When the Witch \"\r\n\t\"performs this service, it does decrease the maximum charges of the \"\r\n\t\"item.|\"\r\n\t\"|\"\r\n\t\"Spells are magical effects that can be cast from a scroll, \"\r\n\t\"a staff or memorized from a book. Spells may or may not require \"\r\n\t\"mana to use and are available to all classes.|\"\r\n\t\"|\"\r\n\t\"Spells cast from a scroll cost no mana to use, but are limited \"\r\n\t\"to only one charge. Casting a spell from a scroll is accomplished \"\r\n\t\"by either right clicking on the scroll or, if it is located in \"\r\n\t\"our belt, pressing the corresponding number on the keyboard. \"\r\n\t\"Scrolls can also be readied in the Speedbook and are represented \"\r\n\t\"by a red icon/button in the 'select current spell' area.|\"\r\n\t\"|\"\r\n\t\"Spells cast from staffs cost no mana to use, but are limited by \"\r\n\t\"the number of charges available. To cast spells from a staff, \"\r\n\t\"it must first be equipped. The 'select current spell' icon/button \"\r\n\t\"will change to indicate that the spell on the staff is currently \"\r\n\t\"ready to cast. Scrolls can also be readied in the Spellbook or \"\r\n\t\"Speedbook and are represented by an orange icon/button in the \"\r\n\t\"'select current spell' area.|\"\r\n\t\"|\"\r\n\t\"Spells that are memorized cost mana to cast, but they can be used \"\r\n\t\"as long as the character has mana to power them. The Warrior \"\r\n\t\"and Rogue start the game with no memorized spells while \"\r\n\t\"the sorcerer begins with Firebolt.  If the character finds a book \"\r\n\t\"in the labyrinth, he can memorize the spell written in that book \"\r\n\t\"by opening the Inventory screen and right-clicking on the book.  \"\r\n\t\"This will make that spell always available to the character for \"\r\n\t\"casting. Memorized spells can be readied through either the \"\r\n\t\"Spellbook or Speedbook and are represented by a blue icon/button \"\r\n\t\"in the 'select current spell' area.|\"\r\n\t\"|\"\r\n\t\"$Important note on books:|\"\r\n\t\"Reading more than one book increases your knowledge of that spell \"\r\n\t\"and gives you the spell at a higher level. The higher the level \"\r\n\t\"of a spell the more effective it is.|\"\r\n\t\"|\"\r\n\t\"While some spells affect the caster, other spells require a target. \"\r\n\t\"These targeted spells are cast in the direction that you indicate \"\r\n\t\"with your cursor on the play area.  If you highlight a creature, \"\r\n\t\"you will cast that spell at that creature.  Not all items within \"\r\n\t\"the labyrinth can be targeted.|\"\r\n\t\"|\"\r\n\t\"Example: A fireball spell will travel at the creature or to the \"\r\n\t\"location you right-click on.  A Healing spell will simply add \"\r\n\t\"health to your character while diminishing his available mana \"\r\n\t\"and requires no targeting.|\"\r\n\t\"|\"\r\n\t\"You can also set a spell or scroll as a Hot Key position for \"\r\n\t\"instant selection.  Start by opening the pop-up menu as described \"\r\n\t\"in the skill section above.  Assign Hot Keys by hitting the \"\r\n\t\"F5, F6, F7 or F8 keys on your keyboard after scrolling through \"\r\n\t\"the available spells and highlighting the one you wish to assign. |\"\r\n\t\"|\"\r\n\t\"$Health and Mana:|\"\r\n\t\"The two orbs in the Information Bar display your life and mana. \"\r\n\t\"The red sphere of fluid on the left side of the control panel \"\r\n\t\"represents the overall health of your character. When the fluid \"\r\n\t\"is gone - your character is dead.|\"\r\n\t\"|\"\r\n\t\"The blue fluid on the right side of the control panel represents \"\r\n\t\"your character's available mana. Mana is the magical force used by \"\r\n\t\"your character to cast spells.  When the liquid in the sphere is \"\r\n\t\"low or depleted, you may be unable to cast some (or all) of your \"\r\n\t\"spells.|\"\r\n\t\"|\"\r\n\t\"$Information Bar:|\"\r\n\t\"The Information Bar is where you receive detailed information in \"\r\n\t\"Diablo and interact with much of your surroundings.  Here is a \"\r\n\t\"quick run-down of the control panel areas and their use:|\"\r\n\t\"|\"\r\n\t\"CHAR: This button is used to access your Character Statistics screen|\"\r\n\t\"INV:  This button is used to access your Inventory screen|\"\r\n\t\"Quest: This button displays your Quest Log (inactive in \"\r\n\t\"Shareware version)|\"\r\n\t\"Automap: This button activates the mapping overlay|\"\r\n\t\"Menu: This button activates the game menu screen|\"\r\n\t\"Spells: This button is used to access your Spellbook|\"\r\n\t\"Current Spell: This is the spell that has been readied for \"\r\n\t\"immediate casting|\"\r\n\t\"Life Orb: This is the amount of health your character currently has|\"\r\n\t\"Mana Orb: This is the amount of mana your character currently has|\"\r\n\t\"Multiplayer Message: This activates the Message Area|\"\r\n\t\"Description Area: This is where any important information about \"\r\n\t\"creatures or items you can interact with is displayed. \"\r\n\t\"This is also where you will enter the text you wish to send when \"\r\n\t\"sending multiplayer messages.|\"\r\n\t\"|\"\r\n\t\"$Character Info:|\"\r\n\t\"Toggle the Character Statistics Screen on and off by clicking the \"\r\n\t\"<CHAR button on the Information Bar.  This screen shows the \"\r\n\t\"'nuts and bolts' of your character.  There are four major attributes \"\r\n\t\"that dictate how your character progresses in the game.|\"\r\n\t\"|\"\r\n\t\"STRENGTH: This is how physically powerful your character is. This \"\r\n\t\"statistic plays a large part in  determining how much damage you \"\r\n\t\"can do when attacking creatures.|\"\r\n\t\"|\"\r\n\t\"MAGIC: This is how attuned your character is with the arcane powers \"\r\n\t\"of the world. This statistic plays a large part in  determining how \"\r\n\t\"much mana you have available for casting spells.|\"\r\n\t\"|\"\r\n\t\"DEXTERITY: This is how quick of foot and hand your character is. \"\r\n\t\"This statistic plays a large part in  determining the chance you \"\r\n\t\"have to hit creatures in combat.|\"\r\n\t\"|\"\r\n\t\"VITALITY: This is how physically fit your character is. This \"\r\n\t\"statistic plays a large part in  determining how much health your \"\r\n\t\"character has when he is undamaged.|\"\r\n\t\"|\"\r\n\t\"$In Game Menu:|\"\r\n\t\"To activate the Game Menu, click the MENU button on the Information \"\r\n\t\"Bar.  You have three options in this menu:|\"\r\n\t\"|\"\r\n\t\"New Game: This exits you from your current game and returns you to \"\r\n\t\"the Main Menu.|\"\r\n\t\"|\"\r\n\t\"Options: This opens the options menu that allows you to \"\r\n\t\"adjust your music and sound effects settings as well as \"\r\n\t\"the gamma level of the screen.|\"\r\n\t\"|\"\r\n\t\"Quit Diablo: This exits the program. Please note that this \"\r\n\t\"automatically saves your character.|\"\r\n\t\"|\"\r\n\t\"$Auto-map:|\"\r\n\t\"Your character automatically maps where he has been in the \"\r\n\t\"labyrinth.  To access the auto-map, click the MAP button on the \"\r\n\t\"Information Bar.  You can also press TAB on your keyboard to activate \"\r\n\t\"the auto-map. Zooming in and out of the map is done with the + and - \"\r\n\t\"keys while scrolling the map uses the arrow keys.|\"\r\n\t\"&\"\r\n#else\r\n\t\"$Keyboard Shortcuts:|\"\r\n\t\"F1:    Open Help Screen|\"\r\n\t\"Esc:   Display Main Menu|\"\r\n\t\"Tab:   Display Auto-map|\"\r\n\t\"Space: Hide all info screens|\"\r\n\t\"S: Open Speedbook|\"\r\n\t\"B: Open Spellbook|\"\r\n\t\"I: Open Inventory screen|\"\r\n\t\"C: Open Character screen|\"\r\n\t\"Q: Open Quest log|\"\r\n\t\"F: Reduce screen brightness|\"\r\n\t\"G: Increase screen brightness|\"\r\n\t\"Z: Zoom Game Screen|\"\r\n\t\"+ / -: Zoom Automap|\"\r\n\t\"1 - 8: Use Belt item|\"\r\n\t\"F5, F6, F7, F8:     Set hot key for skill or spell|\"\r\n\t\"Shift + Left Click: Attack without moving|\"\r\n\t\"|\"\r\n\t\"$Movement:|\"\r\n\t\"If you hold the mouse button down while moving, the character \"\r\n\t\"will continue to move in that direction.|\"\r\n\t\"|\"\r\n\t\"$Combat:|\"\r\n\t\"Holding down the shift key and then left-clicking allows the \"\r\n\t\"character to attack without moving.|\"\r\n\t\"|\"\r\n\t\"$Auto-map:|\"\r\n\t\"To access the auto-map, click the 'MAP' button on the \"\r\n\t\"Information Bar or press 'TAB' on the keyboard. Zooming in and \"\r\n\t\"out of the map is done with the + and - keys. Scrolling the map \"\r\n\t\"uses the arrow keys.|\"\r\n\t\"|\"\r\n\t\"$Picking up Objects:|\"\r\n\t\"Useable items that are small in size, such as potions or scrolls, \"\r\n\t\"are automatically placed in your 'belt' located at the top of \"\r\n\t\"the Interface bar . When an item is placed in the belt, a small \"\r\n\t\"number appears in that box. Items may be used by either pressing \"\r\n\t\"the corresponding number or right-clicking on the item.|\"\r\n\t\"|\"\r\n\t\"$Gold|\"\r\n\t\"You can select a specific amount of gold to drop by right \"\r\n\t\"clicking on a pile of gold in your inventory.|\"\r\n\t\"|\"\r\n\t\"$Skills & Spells:|\"\r\n\t\"You can access your list of skills and spells by left-clicking on \"\r\n\t\"the 'SPELLS' button in the interface bar. Memorized spells and \"\r\n\t\"those available through staffs are listed here. Left-clicking on \"\r\n\t\"the spell you wish to cast will ready the spell. A readied spell \"\r\n\t\"may be cast by simply right-clicking in the play area.|\"\r\n\t\"|\"\r\n\t\"$Using the Speedbook for Spells|\"\r\n\t\"Left-clicking on the 'readied spell' button will open the 'Speedbook' \"\r\n\t\"which allows you to select a skill or spell for immediate use.  \"\r\n\t\"To use a readied skill or spell, simply right-click in the main play \"\r\n\t\"area.|\"\r\n\t\"|\"\r\n\t\"$Setting Spell Hotkeys|\"\r\n\t\"You can assign up to four Hot Keys for skills, spells or scrolls.  \"\r\n\t\"Start by opening the 'speedbook' as described in the section above. \"\r\n\t\"Press the F5, F6, F7 or F8 keys after highlighting the spell you \"\r\n\t\"wish to assign.|\"\r\n\t\"|\"\r\n\t\"$Spell Books|\"\r\n\t\"Reading more than one book increases your knowledge of that \"\r\n\t\"spell, allowing you to cast the spell more effectively.|\"\r\n\t\"&\"\r\n#endif\r\n};\r\n\r\nvoid InitHelp()\r\n{\r\n\thelpflag = FALSE;\r\n\tunused_help = 0;\r\n\tdisplayinghelp[0] = 0;\r\n}\r\n\r\nstatic void DrawHelpLine(int x, int y, char *text, char color)\r\n{\r\n\tint off, width;\r\n\tBYTE c;\r\n\r\n\twidth = 0;\r\n\toff = PitchTbl[SStringY[y] + 44 + SCREEN_Y] + x + 32 + PANEL_X;\r\n\twhile (*text) {\r\n\t\tc = gbFontTransTbl[(BYTE)*text];\r\n\t\ttext++;\r\n\t\tc = fontframe[c];\r\n\t\twidth += fontkern[c] + 1;\r\n\t\tif (c) {\r\n\t\t\tif (width <= 577)\r\n\t\t\t\tPrintChar(off, c, color);\r\n\t\t}\r\n\t\toff += fontkern[c] + 1;\r\n\t}\r\n}\r\n\r\nvoid DrawHelp()\r\n{\r\n\tint i, c, w;\r\n\tchar col;\r\n\tconst char *s;\r\n\r\n\tDrawSTextHelp();\r\n\tDrawQTextBack();\r\n#ifdef HELLFIRE\r\n\tPrintSString(0, 2, TRUE, \"Hellfire Help\", COL_GOLD, 0);\r\n#else\r\n\tPrintSString(0, 2, TRUE, \"Diablo Help\", COL_GOLD, 0);\r\n#endif\r\n\tDrawSLine(5);\r\n\r\n\ts = &gszHelpText[0];\r\n\r\n\tfor (i = 0; i < help_select_line; i++) {\r\n\t\tc = 0;\r\n\t\tw = 0;\r\n\t\twhile (*s == '\\0') {\r\n\t\t\ts++;\r\n\t\t}\r\n\t\tif (*s == '$') {\r\n\t\t\ts++;\r\n\t\t}\r\n\t\tif (*s == '&') {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\twhile (*s != '|' && w < 577) {\r\n\t\t\twhile (*s == '\\0') {\r\n\t\t\t\ts++;\r\n\t\t\t}\r\n\t\t\ttempstr[c] = *s;\r\n\t\t\tw += fontkern[fontframe[gbFontTransTbl[(BYTE)tempstr[c]]]] + 1;\r\n\t\t\tc++;\r\n\t\t\ts++;\r\n\t\t}\r\n\t\tif (w >= 577) {\r\n\t\t\tc--;\r\n\t\t\twhile (tempstr[c] != ' ') {\r\n\t\t\t\ts--;\r\n\t\t\t\tc--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (*s == '|') {\r\n\t\t\ts++;\r\n\t\t}\r\n\t}\r\n\tfor (i = 7; i < 22; i++) {\r\n\t\tc = 0;\r\n\t\tw = 0;\r\n\t\twhile (*s == '\\0') {\r\n\t\t\ts++;\r\n\t\t}\r\n\t\tif (*s == '$') {\r\n\t\t\ts++;\r\n\t\t\tcol = COL_RED;\r\n\t\t} else {\r\n\t\t\tcol = COL_WHITE;\r\n\t\t}\r\n\t\tif (*s == '&') {\r\n\t\t\tHelpTop = help_select_line;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\twhile (*s != '|' && w < 577) {\r\n\t\t\twhile (*s == '\\0') {\r\n\t\t\t\ts++;\r\n\t\t\t}\r\n\t\t\ttempstr[c] = *s;\r\n\t\t\tBYTE tc = gbFontTransTbl[(BYTE)tempstr[c]];\r\n\t\t\tw += fontkern[fontframe[tc]] + 1;\r\n\t\t\tc++;\r\n\t\t\ts++;\r\n\t\t}\r\n\t\tif (w >= 577) {\r\n\t\t\tc--;\r\n\t\t\twhile (tempstr[c] != ' ') {\r\n\t\t\t\ts--;\r\n\t\t\t\tc--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (c != 0) {\r\n\t\t\ttempstr[c] = '\\0';\r\n\t\t\tDrawHelpLine(0, i, tempstr, col);\r\n\t\t}\r\n\t\tif (*s == '|') {\r\n\t\t\ts++;\r\n\t\t}\r\n\t}\r\n\r\n\tPrintSString(0, 23, TRUE, \"Press ESC to end or the arrow keys to scroll.\", COL_GOLD, 0);\r\n}\r\n\r\nvoid DisplayHelp()\r\n{\r\n\thelp_select_line = 0;\r\n\thelpflag = TRUE;\r\n\tHelpTop = 5000;\r\n}\r\n\r\nvoid HelpScrollUp()\r\n{\r\n\tif (help_select_line > 0)\r\n\t\thelp_select_line--;\r\n}\r\n\r\nvoid HelpScrollDown()\r\n{\r\n\tif (help_select_line < HelpTop)\r\n\t\thelp_select_line++;\r\n}\r\n"
  },
  {
    "path": "Source/help.h",
    "content": "/**\r\n * @file help.h\r\n *\r\n * Interface of the in-game help text.\r\n */\r\n#ifndef __HELP_H__\r\n#define __HELP_H__\r\n\r\nextern BOOL helpflag;\r\n\r\nvoid InitHelp();\r\nvoid DrawHelp();\r\nvoid DisplayHelp();\r\nvoid HelpScrollUp();\r\nvoid HelpScrollDown();\r\n\r\n#endif /* __HELP_H__ */\r\n"
  },
  {
    "path": "Source/init.cpp",
    "content": "/**\r\n * @file init.cpp\r\n *\r\n * Implementation of routines for initializing the environment, disable screen saver, load MPQ.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n#include \"../DiabloUI/diabloui.h\"\r\n\r\n_SNETVERSIONDATA fileinfo;\r\n/** True if the game is the current active window */\r\nint gbActive;\r\n/** Specifies the path to diablo.exe. */\r\nchar diablo_exe_path[MAX_PATH];\r\n/** A handle to an unused MPQ archive. */\r\nHANDLE hellfire_mpq;\r\n/** Specifies the path to patch_rt.mpq. */\r\nchar patch_rt_mpq_path[MAX_PATH];\r\n/** The current input handler function */\r\nWNDPROC CurrentProc;\r\n/** A handle to the diabdat.mpq archive. */\r\nHANDLE diabdat_mpq;\r\n/** Specifies the path to diabdat.mpq. */\r\nchar diabdat_mpq_path[MAX_PATH];\r\n/** A handle to the patch_rt.mpq archive. */\r\nHANDLE patch_rt_mpq;\r\n/** Specifies whether the MS Office Shortcut Bar was killed. */\r\nBOOL killed_mom_parent;\r\n/** Stores the previous state of the screensaver. */\r\nBOOLEAN screensaver_enabled_prev;\r\n#ifdef HELLFIRE\r\nchar hellfire_mpq_path[MAX_PATH];\r\nchar hfmonk_mpq_path[MAX_PATH];\r\nchar hfbard_mpq_path[MAX_PATH];\r\nchar hfbarb_mpq_path[MAX_PATH];\r\nchar hfmusic_mpq_path[MAX_PATH];\r\nchar hfvoice_mpq_path[MAX_PATH];\r\nchar hfopt1_mpq_path[MAX_PATH];\r\nchar hfopt2_mpq_path[MAX_PATH];\r\nHANDLE hfmonk_mpq;\r\nHANDLE hfbard_mpq;\r\nHANDLE hfbarb_mpq;\r\nHANDLE hfmusic_mpq;\r\nHANDLE hfvoice_mpq;\r\nHANDLE hfopt1_mpq;\r\nHANDLE hfopt2_mpq;\r\n#endif\r\n\r\n/* data */\r\n\r\nchar gszVersionNumber[MAX_PATH] = \"internal version unknown\";\r\nchar gszProductName[MAX_PATH] = \"Diablo v1.09\";\r\n\r\nstatic void init_run_office(char *dir)\r\n{\r\n\tHANDLE hSearch;\r\n\tWIN32_FIND_DATA find;\r\n\tchar szFirst[MAX_PATH];\r\n\r\n\tstrcpy(szFirst, dir);\r\n\tif (szFirst[0] != '\\0' && szFirst[strlen(szFirst) - 1] == '\\\\') {\r\n\t\tstrcat(szFirst, \"*\");\r\n\t} else {\r\n\t\tstrcat(szFirst, \"\\\\*\");\r\n\t}\r\n\thSearch = FindFirstFile(szFirst, &find);\r\n\tif (hSearch == INVALID_HANDLE_VALUE) {\r\n\t\treturn;\r\n\t}\r\n\r\n\twhile (1) {\r\n\t\tif (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {\r\n\t\t\tif (strcmp(find.cFileName, \".\") != 0 && strcmp(find.cFileName, \"..\") != 0) {\r\n\t\t\t\tchar szNext[MAX_PATH] = \"\";\r\n\t\t\t\tif (dir[0] != '\\0' && dir[strlen(dir) - 1] == '\\\\') {\r\n\t\t\t\t\tsprintf(szNext, \"%s%s\\\\\", dir, find.cFileName);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsprintf(szNext, \"%s\\\\%s\\\\\", dir, find.cFileName);\r\n\t\t\t\t}\r\n\t\t\t\tinit_run_office(szNext);\r\n\t\t\t}\r\n\t\t} else if (_strcmpi(find.cFileName, \"Microsoft Office Shortcut Bar.lnk\") == 0) {\r\n\t\t\tShellExecute(GetDesktopWindow(), \"open\", find.cFileName, \"\", dir, SW_SHOWNORMAL);\r\n\t\t}\r\n\t\tif (!FindNextFile(hSearch, &find)) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tFindClose(hSearch);\r\n}\r\n\r\nstatic HWND init_find_mom_parent()\r\n{\r\n\tHWND i, handle;\r\n\tchar ClassName[256];\r\n\r\n\tfor (i = GetForegroundWindow();; i = GetWindow(handle, GW_HWNDNEXT)) {\r\n\t\thandle = i;\r\n\t\tif (!i)\r\n\t\t\tbreak;\r\n\t\tGetClassName(i, ClassName, 255);\r\n\t\tif (!_strcmpi(ClassName, \"MOM Parent\"))\r\n\t\t\tbreak;\r\n\t}\r\n\treturn handle;\r\n}\r\n\r\nstatic void init_kill_mom_parent()\r\n{\r\n\tHWND handle;\r\n\r\n\thandle = init_find_mom_parent();\r\n\tif (handle != NULL) {\r\n\t\tPostMessage(handle, WM_CLOSE, 0, 0);\r\n\t\tkilled_mom_parent = TRUE;\r\n\t}\r\n}\r\n\r\nstatic void init_await_mom_parent_exit()\r\n{\r\n\tDWORD tick;\r\n\r\n\ttick = GetTickCount();\r\n\tif (!init_find_mom_parent()) {\r\n\t\treturn;\r\n\t}\r\n\tdo {\r\n\t\tSleep(250);\r\n\t} while (GetTickCount() - tick <= 4000 && init_find_mom_parent() != NULL);\r\n}\r\n\r\nstatic void init_run_office_from_start_menu()\r\n{\r\n\tLPITEMIDLIST idl;\r\n\r\n\tif (!killed_mom_parent) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tkilled_mom_parent = FALSE;\r\n\tchar szPath[256] = \"\"; /// BUGFIX: size should be at least 'MAX_PATH'\r\n\tidl = NULL;\r\n\r\n\tif (SHGetSpecialFolderLocation(GetDesktopWindow(), CSIDL_STARTMENU, &idl) == NOERROR) {\r\n\t\tSHGetPathFromIDList(idl, szPath);\r\n\t\tinit_run_office(szPath);\r\n\t}\r\n}\r\n\r\nstatic void init_disable_screensaver(BOOLEAN disable)\r\n{\r\n\tBOOLEAN enabled;\r\n\tchar Data[16];\r\n\tDWORD Type, cbData;\r\n\tHKEY phkResult;\r\n\tLRESULT success;\r\n\r\n\t// BUGFIX: this is probably the worst possible way to do this. Alternatives: ExtEscape() with SETPOWERMANAGEMENT,\r\n\t// SystemParametersInfo() with SPI_SETSCREENSAVEACTIVE/SPI_SETPOWEROFFACTIVE/SPI_SETLOWPOWERACTIVE\r\n\r\n\tsuccess = RegOpenKeyEx(HKEY_CURRENT_USER, \"Control Panel\\\\Desktop\", 0, KEY_READ | KEY_WRITE, (PHKEY)&phkResult);\r\n\tif (success != ERROR_SUCCESS) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (disable) {\r\n\t\tcbData = 16;\r\n\t\tsuccess = RegQueryValueEx(phkResult, \"ScreenSaveActive\", NULL, &Type, (LPBYTE)Data, &cbData);\r\n\t\tif (success == ERROR_SUCCESS)\r\n\t\t\tscreensaver_enabled_prev = Data[0] != '0';\r\n\t\tenabled = FALSE;\r\n\t} else {\r\n\t\tenabled = screensaver_enabled_prev;\r\n\t}\r\n\r\n\tData[0] = enabled ? '1' : '0';\r\n\tData[1] = 0;\r\n\tRegSetValueEx(phkResult, \"ScreenSaveActive\", NULL, REG_SZ, (const BYTE *)Data, 2);\r\n\tRegCloseKey(phkResult);\r\n}\r\n\r\nvoid init_cleanup(BOOL show_cursor)\r\n{\r\n\tpfile_flush_W();\r\n\tinit_disable_screensaver(FALSE);\r\n\tinit_run_office_from_start_menu();\r\n\r\n\tif (diabdat_mpq) {\r\n\t\tSFileCloseArchive(diabdat_mpq);\r\n\t\tdiabdat_mpq = NULL;\r\n\t}\r\n\tif (patch_rt_mpq) {\r\n\t\tSFileCloseArchive(patch_rt_mpq);\r\n\t\tpatch_rt_mpq = NULL;\r\n\t}\r\n\tif (hellfire_mpq) {\r\n\t\tSFileCloseArchive(hellfire_mpq);\r\n\t\thellfire_mpq = NULL;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (hfmonk_mpq) {\r\n\t\tSFileCloseArchive(hfmonk_mpq);\r\n\t\thfmonk_mpq = NULL;\r\n\t}\r\n\tif (hfbard_mpq) {\r\n\t\tSFileCloseArchive(hfbard_mpq);\r\n\t\thfbard_mpq = NULL;\r\n\t}\r\n\tif (hfbarb_mpq) {\r\n\t\tSFileCloseArchive(hfbarb_mpq);\r\n\t\thfbarb_mpq = NULL;\r\n\t}\r\n\tif (hfmusic_mpq) {\r\n\t\tSFileCloseArchive(hfmusic_mpq);\r\n\t\thfmusic_mpq = NULL;\r\n\t}\r\n\tif (hfvoice_mpq) {\r\n\t\tSFileCloseArchive(hfvoice_mpq);\r\n\t\thfvoice_mpq = NULL;\r\n\t}\r\n\tif (hfopt1_mpq) {\r\n\t\tSFileCloseArchive(hfopt1_mpq);\r\n\t\thfopt1_mpq = NULL;\r\n\t}\r\n\tif (hfopt2_mpq) {\r\n\t\tSFileCloseArchive(hfopt2_mpq);\r\n\t\thfopt2_mpq = NULL;\r\n\t}\r\n#endif\r\n\tUiDestroy();\r\n\teffects_cleanup_sfx();\r\n\tsound_cleanup();\r\n\tNetClose();\r\n\tdx_cleanup();\r\n\tengine_debug_trap(show_cursor);\r\n\tStormDestroy();\r\n\r\n\tif (show_cursor)\r\n\t\tShowCursor(TRUE);\r\n}\r\n\r\nstatic void init_strip_trailing_slash(char *path)\r\n{\r\n\tchar *result;\r\n\r\n\tresult = strrchr(path, '\\\\');\r\n\tif (result) {\r\n\t\tif (!result[1])\r\n\t\t\t*result = 0;\r\n\t}\r\n}\r\n\r\nstatic BOOL init_read_test_file(char *pszPath, const char *pszArchive, int dwPriority, HANDLE *phArchive)\r\n{\r\n\tDWORD dwSize;\r\n\tchar *pszDrive, *pszRoot;\r\n\tchar szDrive[MAX_PATH];\r\n\r\n\tdwSize = GetLogicalDriveStrings(sizeof(szDrive), szDrive);\r\n\tif (dwSize == 0 || dwSize > sizeof(szDrive)) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\twhile (*pszArchive == '\\\\') {\r\n\t\tpszArchive++;\r\n\t}\r\n\r\n\tpszDrive = szDrive;\r\n\tif (*pszDrive == '\\0') {\r\n\t\treturn FALSE;\r\n\t}\r\n\twhile (1) {\r\n\t\tpszRoot = pszDrive;\r\n\t\twhile (*pszDrive++ != '\\0')\r\n\t\t\t;\r\n\t\tif (GetDriveType(pszRoot) == DRIVE_CDROM) {\r\n\t\t\tstrcpy(pszPath, pszRoot);\r\n\t\t\tstrcat(pszPath, pszArchive);\r\n\t\t\tif (SFileOpenArchive(pszPath, dwPriority, FS_CD, phArchive)) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (*pszDrive == '\\0') {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic HANDLE init_test_access(char *mpq_path, const char *mpq_name, const char *reg_loc, int dwPriority, int fs)\r\n{\r\n\tchar *last_slash_pos;\r\n\tchar Filename[MAX_PATH];\r\n\tchar Buffer[MAX_PATH];\r\n\tchar archive_path[MAX_PATH];\r\n\tHANDLE archive;\r\n\r\n\tif (!GetCurrentDirectory(sizeof(Buffer), Buffer))\r\n\t\tapp_fatal(\"Can't get program path\");\r\n\tinit_strip_trailing_slash(Buffer);\r\n\tif (!SFileSetBasePath(Buffer))\r\n\t\tapp_fatal(\"SFileSetBasePath\");\r\n\tif (!GetModuleFileName(ghInst, Filename, sizeof(Filename)))\r\n\t\tapp_fatal(\"Can't get program name\");\r\n\tlast_slash_pos = strrchr(Filename, '\\\\');\r\n\tif (last_slash_pos)\r\n\t\t*last_slash_pos = '\\0';\r\n\tinit_strip_trailing_slash(Filename);\r\n\tstrcpy(mpq_path, Buffer);\r\n\tstrcat(mpq_path, mpq_name);\r\n\tif (SFileOpenArchive(mpq_path, dwPriority, fs, &archive))\r\n\t\treturn archive;\r\n\tif (strcmp(Filename, Buffer)) {\r\n\t\tstrcpy(mpq_path, Filename);\r\n\t\tstrcat(mpq_path, mpq_name);\r\n\t\tif (SFileOpenArchive(mpq_path, dwPriority, fs, &archive))\r\n\t\t\treturn archive;\r\n\t}\r\n\tarchive_path[0] = '\\0';\r\n\tif (reg_loc) {\r\n\t\tif (SRegLoadString(\"Archives\", reg_loc, 0, archive_path, sizeof(archive_path))) {\r\n\t\t\tinit_strip_trailing_slash(archive_path);\r\n\t\t\tstrcpy(mpq_path, archive_path);\r\n\t\t\tstrcat(mpq_path, mpq_name);\r\n\t\t\tif (SFileOpenArchive(mpq_path, dwPriority, fs, &archive))\r\n\t\t\t\treturn archive;\r\n\t\t}\r\n\t}\r\n\tif (fs != FS_PC && init_read_test_file(archive_path, mpq_name, dwPriority, &archive)) {\r\n\t\tstrcpy(mpq_path, archive_path);\r\n\t\treturn archive;\r\n\t}\r\n\treturn NULL;\r\n}\r\n\r\nstatic void init_get_file_info()\r\n{\r\n\tDWORD dwLen;\r\n\tvoid *pBlock;\r\n\tunsigned int uBytes;\r\n\tDWORD dwHandle;\r\n\tVS_FIXEDFILEINFO *lpBuffer;\r\n\r\n\tif (GetModuleFileName(ghInst, diablo_exe_path, sizeof(diablo_exe_path))) {\r\n\t\tdwLen = GetFileVersionInfoSize(diablo_exe_path, &dwHandle);\r\n\t\tif (dwLen) {\r\n\t\t\tpBlock = DiabloAllocPtr(dwLen);\r\n\t\t\tif (GetFileVersionInfo(diablo_exe_path, 0, dwLen, pBlock)) {\r\n\t\t\t\tif (VerQueryValue(pBlock, \"\\\\\", (LPVOID *)&lpBuffer, &uBytes))\r\n\t\t\t\t\tsprintf(\r\n\t\t\t\t\t    gszVersionNumber,\r\n\t\t\t\t\t    \"version %d.%d.%d.%d\",\r\n\t\t\t\t\t    lpBuffer->dwProductVersionMS >> 16,\r\n\t\t\t\t\t    lpBuffer->dwProductVersionMS & 0xFFFF,\r\n\t\t\t\t\t    lpBuffer->dwProductVersionLS >> 16,\r\n\t\t\t\t\t    lpBuffer->dwProductVersionLS & 0xFFFF);\r\n\t\t\t}\r\n\t\t\tmem_free_dbg(pBlock);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void init_archives()\r\n{\r\n\tHANDLE fh;\r\n#ifdef COPYPROT\r\n\tint result;\r\n#endif\r\n\tmemset(&fileinfo, 0, sizeof(fileinfo));\r\n\tfileinfo.size = sizeof(fileinfo);\r\n\tfileinfo.versionstring = gszVersionNumber;\r\n\tfileinfo.executablefile = diablo_exe_path;\r\n\tfileinfo.originalarchivefile = diabdat_mpq_path;\r\n\tfileinfo.patcharchivefile = patch_rt_mpq_path;\r\n\tinit_get_file_info();\r\n#ifdef COPYPROT\r\n\twhile (1) {\r\n#endif\r\n#ifdef SPAWN\r\n\t\tdiabdat_mpq = init_test_access(diabdat_mpq_path, \"\\\\spawn.mpq\", \"DiabloSpawn\", 1000, FS_PC);\r\n#else\r\n#ifdef COPYPROT\r\n\tdiabdat_mpq = init_test_access(diabdat_mpq_path, \"\\\\diabdat.mpq\", \"DiabloCD\", 1000, FS_CD);\r\n#else\r\n\tdiabdat_mpq = init_test_access(diabdat_mpq_path, \"\\\\diabdat.mpq\", \"DiabloCD\", 1000, FS_PC);\r\n#endif\r\n#endif\r\n#ifdef COPYPROT\r\n\t\tif (diabdat_mpq != NULL)\r\n\t\t\tbreak;\r\n\t\tUiCopyProtError(&result);\r\n\t\tif (result == COPYPROT_CANCEL)\r\n\t\t\tFileErrDlg(\"diabdat.mpq\");\r\n\t}\r\n#endif\r\n\tif (!WOpenFile(\"ui_art\\\\title.pcx\", &fh, TRUE))\r\n#ifdef SPAWN\r\n\t\tFileErrDlg(\"Main program archive: spawn.mpq\");\r\n#else\r\n\t\tFileErrDlg(\"Main program archive: diabdat.mpq\");\r\n#endif\r\n\tWCloseFile(fh);\r\n#ifdef SPAWN\r\n\tpatch_rt_mpq = init_test_access(patch_rt_mpq_path, \"\\\\patch_sh.mpq\", \"DiabloSpawn\", 2000, FS_PC);\r\n#else\r\n\tpatch_rt_mpq = init_test_access(patch_rt_mpq_path, \"\\\\patch_rt.mpq\", \"DiabloInstall\", 2000, FS_PC);\r\n#endif\r\n#ifdef HELLFIRE\r\n\thellfire_mpq = init_test_access(hellfire_mpq_path, \"\\\\hellfire.mpq\", \"DiabloInstall\", 8000, FS_PC);\r\n\thfmonk_mpq = init_test_access(hfmonk_mpq_path, \"\\\\hfmonk.mpq\", \"DiabloInstall\", 8100, FS_PC);\r\n\thfbard_mpq = init_test_access(hfbard_mpq_path, \"\\\\hfbard.mpq\", \"DiabloInstall\", 8110, FS_PC);\r\n\thfbarb_mpq = init_test_access(hfbarb_mpq_path, \"\\\\hfbarb.mpq\", \"DiabloInstall\", 8120, FS_PC);\r\n\thfmusic_mpq = init_test_access(hfmusic_mpq_path, \"\\\\hfmusic.mpq\", \"DiabloInstall\", 8200, FS_PC);\r\n\thfvoice_mpq = init_test_access(hfvoice_mpq_path, \"\\\\hfvoice.mpq\", \"DiabloInstall\", 8500, FS_PC);\r\n\thfopt1_mpq = init_test_access(hfopt1_mpq_path, \"\\\\hfopt1.mpq\", \"DiabloInstall\", 8600, FS_PC);\r\n\thfopt2_mpq = init_test_access(hfopt2_mpq_path, \"\\\\hfopt2.mpq\", \"DiabloInstall\", 8610, FS_PC);\r\n#endif\r\n}\r\n\r\nvoid init_create_window(int nCmdShow)\r\n{\r\n\tint nWidth, nHeight;\r\n\tHWND hWnd;\r\n\tWNDCLASSEXA wcex;\r\n\r\n\tinit_kill_mom_parent();\r\n\tpfile_init_save_directory();\r\n\tmemset(&wcex, 0, sizeof(wcex));\r\n\twcex.cbSize = sizeof(wcex);\r\n\twcex.style = CS_HREDRAW | CS_VREDRAW;\r\n\twcex.lpfnWndProc = WindowProc;\r\n\twcex.hInstance = ghInst;\r\n\twcex.hIcon = LoadIcon(ghInst, MAKEINTRESOURCE(IDI_ICON1));\r\n\twcex.hCursor = LoadCursor(NULL, IDC_ARROW);\r\n\twcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);\r\n\twcex.lpszMenuName = GAME_NAME;\r\n\twcex.lpszClassName = \"DIABLO\";\r\n\twcex.hIconSm = (HICON)LoadImage(ghInst, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);\r\n\tif (!RegisterClassEx(&wcex))\r\n\t\tapp_fatal(\"Unable to register window class\");\r\n\tif (GetSystemMetrics(SM_CXSCREEN) < SCREEN_WIDTH)\r\n\t\tnWidth = SCREEN_WIDTH;\r\n\telse\r\n\t\tnWidth = GetSystemMetrics(SM_CXSCREEN);\r\n\tif (GetSystemMetrics(SM_CYSCREEN) < SCREEN_HEIGHT)\r\n\t\tnHeight = SCREEN_HEIGHT;\r\n\telse\r\n\t\tnHeight = GetSystemMetrics(SM_CYSCREEN);\r\n\thWnd = CreateWindowEx(0, \"DIABLO\", GAME_NAME, WS_POPUP, 0, 0, nWidth, nHeight, NULL, NULL, ghInst, NULL);\r\n\tif (!hWnd)\r\n\t\tapp_fatal(\"Unable to create main window\");\r\n\tShowWindow(hWnd, SW_SHOWNORMAL); // nCmdShow used only in beta: ShowWindow(hWnd, nCmdShow)\r\n\tUpdateWindow(hWnd);\r\n\tinit_await_mom_parent_exit();\r\n\tdx_init(hWnd);\r\n\tBlackPalette();\r\n\tsnd_init(hWnd);\r\n\tinit_archives();\r\n\tinit_disable_screensaver(TRUE);\r\n}\r\n\r\nstatic void init_activate_window(HWND hWnd, BOOL bActive)\r\n{\r\n\tLONG dwNewLong;\r\n\r\n\tgbActive = bActive;\r\n\tUiAppActivate(bActive);\r\n\tdwNewLong = GetWindowLong(hWnd, GWL_STYLE);\r\n\r\n\tif (gbActive && fullscreen)\r\n\t\tdwNewLong &= ~WS_SYSMENU;\r\n\telse\r\n\t\tdwNewLong |= WS_SYSMENU;\r\n\r\n\tSetWindowLong(hWnd, GWL_STYLE, dwNewLong);\r\n\r\n\tif (gbActive) {\r\n\t\tforce_redraw = 255;\r\n\t\tResetPal();\r\n\t}\r\n}\r\n\r\nLRESULT __stdcall MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tswitch (Msg) {\r\n\tcase WM_ERASEBKGND:\r\n\t\treturn 0;\r\n\tcase WM_CREATE:\r\n\t\tghMainWnd = hWnd;\r\n\t\tbreak;\r\n\tcase WM_DESTROY:\r\n\t\tinit_cleanup(TRUE);\r\n\t\tghMainWnd = NULL;\r\n\t\tPostQuitMessage(0);\r\n\t\tbreak;\r\n\tcase WM_PAINT:\r\n\t\tforce_redraw = 255;\r\n\t\tbreak;\r\n\tcase WM_CLOSE:\r\n\t\treturn 0;\r\n\tcase WM_ACTIVATEAPP:\r\n\t\tinit_activate_window(hWnd, wParam);\r\n\t\tbreak;\r\n#ifdef _DEBUG\r\n\tcase WM_SYSKEYUP:\r\n\t\tif (wParam == VK_RETURN) {\r\n\t\t\tfullscreen = !fullscreen;\r\n\t\t\tdx_reinit();\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tbreak;\r\n#endif\r\n\tcase WM_QUERYNEWPALETTE:\r\n\t\tSDrawRealizePalette();\r\n\t\treturn 1;\r\n\tcase WM_PALETTECHANGED:\r\n\t\tif ((HWND)wParam != hWnd)\r\n\t\t\tSDrawRealizePalette();\r\n\t\tbreak;\r\n\t}\r\n\r\n\treturn DefWindowProc(hWnd, Msg, wParam, lParam);\r\n}\r\n\r\nLRESULT __stdcall WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tif (CurrentProc)\r\n\t\treturn CurrentProc(hWnd, Msg, wParam, lParam);\r\n\r\n\treturn MainWndProc(hWnd, Msg, wParam, lParam);\r\n}\r\n\r\nWNDPROC SetWindowProc(WNDPROC NewProc)\r\n{\r\n\tWNDPROC OldProc;\r\n\r\n\tOldProc = CurrentProc;\r\n\tCurrentProc = NewProc;\r\n\treturn OldProc;\r\n}\r\n"
  },
  {
    "path": "Source/init.h",
    "content": "/**\r\n * @file init.h\r\n *\r\n * Interface of routines for initializing the environment, disable screen saver, load MPQ.\r\n */\r\n#ifndef __INIT_H__\r\n#define __INIT_H__\r\n\r\nextern _SNETVERSIONDATA fileinfo;\r\nextern int gbActive;\r\nextern WNDPROC CurrentProc;\r\nextern HANDLE diabdat_mpq;\r\n#ifdef HELLFIRE\r\nextern HANDLE hfbard_mpq;\r\nextern HANDLE hfbarb_mpq;\r\n#endif\r\n\r\nvoid init_cleanup(BOOL show_cursor);\r\nvoid init_create_window(int nCmdShow);\r\nLRESULT __stdcall MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nLRESULT __stdcall WindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\nWNDPROC SetWindowProc(WNDPROC NewProc);\r\n\r\n/* data */\r\n\r\nextern char gszVersionNumber[MAX_PATH];\r\nextern char gszProductName[MAX_PATH];\r\n\r\n#endif /* __INIT_H__ */\r\n"
  },
  {
    "path": "Source/interfac.cpp",
    "content": "/**\r\n * @file interfac.cpp\r\n *\r\n * Implementation of load screens.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nBYTE *sgpBackCel;\r\nint sgdwProgress;\r\nint progress_id;\r\n\r\n/** The colour used for the progress bar as an index into the palette. */\r\nconst BYTE BarColor[3] = { 138, 43, 254 };\r\n/** The screen position of the top left corner of the progress bar. */\r\nconst int BarPos[3][2] = { { 53, 37 }, { 53, 421 }, { 53, 37 } };\r\n\r\nstatic void FreeInterface()\r\n{\r\n\tMemFreeDbg(sgpBackCel);\r\n}\r\n\r\nstatic void InitCutscene(unsigned int uMsg)\r\n{\r\n\tassert(!sgpBackCel);\r\n\r\n\tswitch (uMsg) {\r\n\tcase WM_DIABNEXTLVL:\r\n\t\tswitch (gnLevelTypeTbl[currlevel]) {\r\n\t\tcase DTYPE_TOWN:\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cuttt.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cuttt.pal\");\r\n\t\t\tprogress_id = 1;\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_CATHEDRAL:\r\n#ifdef HELLFIRE\r\n\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutl1d.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cutl1d.pal\");\r\n\t\t\t\tprogress_id = 0;\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Nlevels\\\\cutl5.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Nlevels\\\\cutl5.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t}\r\n#endif\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_CATACOMBS:\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut2.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cut2.pal\");\r\n\t\t\tprogress_id = 2;\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_CAVES:\r\n#ifdef HELLFIRE\r\n\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut3.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cut3.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Nlevels\\\\cutl6.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Nlevels\\\\cutl6.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t}\r\n#endif\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_HELL:\r\n\t\t\tif (currlevel < 15) {\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut4.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cut4.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t} else {\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutgate.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cutgate.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutl1d.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cutl1d.pal\");\r\n\t\t\tprogress_id = 0;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase WM_DIABPREVLVL:\r\n\t\tif (gnLevelTypeTbl[currlevel - 1] == 0) {\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cuttt.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cuttt.pal\");\r\n\t\t\tprogress_id = 1;\r\n\t\t} else {\r\n\t\t\tswitch (gnLevelTypeTbl[currlevel]) {\r\n\t\t\tcase DTYPE_TOWN:\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cuttt.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cuttt.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase DTYPE_CATHEDRAL:\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutl1d.CEL\", NULL);\r\n\t\t\t\t\tLoadPalette(\"Gendata\\\\Cutl1d.pal\");\r\n\t\t\t\t\tprogress_id = 0;\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsgpBackCel = LoadFileInMem(\"Nlevels\\\\cutl5.CEL\", NULL);\r\n\t\t\t\t\tLoadPalette(\"Nlevels\\\\cutl5.pal\");\r\n\t\t\t\t\tprogress_id = 1;\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tbreak;\r\n\t\t\tcase DTYPE_CATACOMBS:\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut2.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cut2.pal\");\r\n\t\t\t\tprogress_id = 2;\r\n\t\t\t\tbreak;\r\n\t\t\tcase DTYPE_CAVES:\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut3.CEL\", NULL);\r\n\t\t\t\t\tLoadPalette(\"Gendata\\\\Cut3.pal\");\r\n\t\t\t\t\tprogress_id = 1;\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsgpBackCel = LoadFileInMem(\"Nlevels\\\\cutl6.CEL\", NULL);\r\n\t\t\t\t\tLoadPalette(\"Nlevels\\\\cutl6.pal\");\r\n\t\t\t\t\tprogress_id = 1;\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tbreak;\r\n\t\t\tcase DTYPE_HELL:\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut4.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cut4.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutl1d.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cutl1d.pal\");\r\n\t\t\t\tprogress_id = 0;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\tcase WM_DIABSETLVL:\r\n\t\tif (setlvlnum == SL_BONECHAMB) {\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut2.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cut2.pal\");\r\n\t\t\tprogress_id = 2;\r\n\t\t} else if (setlvlnum == SL_VILEBETRAYER) {\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutportr.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cutportr.pal\");\r\n\t\t\tprogress_id = 1;\r\n\t\t} else {\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutl1d.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cutl1d.pal\");\r\n\t\t\tprogress_id = 0;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase WM_DIABRTNLVL:\r\n\t\tif (setlvlnum == SL_BONECHAMB) {\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut2.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cut2.pal\");\r\n\t\t\tprogress_id = 2;\r\n\t\t} else if (setlvlnum == SL_VILEBETRAYER) {\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutportr.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cutportr.pal\");\r\n\t\t\tprogress_id = 1;\r\n\t\t} else {\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutl1d.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cutl1d.pal\");\r\n\t\t\tprogress_id = 0;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase WM_DIABWARPLVL:\r\n\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutportl.CEL\", NULL);\r\n\t\tLoadPalette(\"Gendata\\\\Cutportl.pal\");\r\n\t\tprogress_id = 1;\r\n\t\tbreak;\r\n\tcase WM_DIABLOADGAME:\r\n\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutstart.CEL\", NULL);\r\n\t\tLoadPalette(\"Gendata\\\\Cutstart.pal\");\r\n\t\tprogress_id = 1;\r\n\t\tbreak;\r\n\tcase WM_DIABNEWGAME:\r\n\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutstart.CEL\", NULL);\r\n\t\tLoadPalette(\"Gendata\\\\Cutstart.pal\");\r\n\t\tprogress_id = 1;\r\n\t\tbreak;\r\n\tcase WM_DIABTOWNWARP:\r\n\tcase WM_DIABTWARPUP:\r\n\t\tswitch (gnLevelTypeTbl[plr[myplr].plrlevel]) {\r\n\t\tcase DTYPE_TOWN:\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cuttt.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cuttt.pal\");\r\n\t\t\tprogress_id = 1;\r\n\t\t\tbreak;\r\n#ifdef HELLFIRE\r\n\t\tcase DTYPE_CATHEDRAL:\r\n\t\t\tif (plr[myplr].plrlevel < 17) {\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cutl1d.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cutl1d.pal\");\r\n\t\t\t\tprogress_id = 0;\r\n\t\t\t} else {\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Nlevels\\\\Cutl5.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Nlevels\\\\Cutl5.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n#endif\r\n\t\tcase DTYPE_CATACOMBS:\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut2.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cut2.pal\");\r\n\t\t\tprogress_id = 2;\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_CAVES:\r\n#ifdef HELLFIRE\r\n\t\t\tif (plr[myplr].plrlevel < 17) {\r\n#endif\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut3.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Gendata\\\\Cut3.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tsgpBackCel = LoadFileInMem(\"Nlevels\\\\Cutl6.CEL\", NULL);\r\n\t\t\t\tLoadPalette(\"Nlevels\\\\Cutl6.pal\");\r\n\t\t\t\tprogress_id = 1;\r\n\t\t\t}\r\n#endif\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_HELL:\r\n\t\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cut4.CEL\", NULL);\r\n\t\t\tLoadPalette(\"Gendata\\\\Cut4.pal\");\r\n\t\t\tprogress_id = 1;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase WM_DIABRETOWN:\r\n\t\tsgpBackCel = LoadFileInMem(\"Gendata\\\\Cuttt.CEL\", NULL);\r\n\t\tLoadPalette(\"Gendata\\\\Cuttt.pal\");\r\n\t\tprogress_id = 1;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tapp_fatal(\"Unknown progress mode\");\r\n\t\tbreak;\r\n\t}\r\n\r\n\tsgdwProgress = 0;\r\n}\r\n\r\nstatic void DrawProgress(int screen_x, int screen_y, int progress_id)\r\n{\r\n\tBYTE *dst;\r\n\tint i;\r\n\r\n\tdst = &gpBuffer[screen_x + PitchTbl[screen_y]];\r\n\tfor (i = 0; i < 22; i++) {\r\n\t\t*dst = BarColor[progress_id];\r\n\t\tdst += BUFFER_WIDTH;\r\n\t}\r\n}\r\n\r\nstatic void DrawCutscene()\r\n{\r\n\tDWORD i;\r\n\r\n\tlock_buf(1);\r\n\tCelDraw(PANEL_X, 480 + SCREEN_Y - 1, sgpBackCel, 1, 640);\r\n\r\n\tfor (i = 0; i < sgdwProgress; i++) {\r\n\t\tDrawProgress(\r\n\t\t    BarPos[progress_id][0] + i + PANEL_X,\r\n\t\t    BarPos[progress_id][1] + SCREEN_Y,\r\n\t\t    progress_id);\r\n\t}\r\n\r\n\tunlock_buf(1);\r\n\tforce_redraw = 255;\r\n\tscrollrt_draw_game_screen(FALSE);\r\n}\r\n\r\nvoid interface_msg_pump()\r\n{\r\n\tMSG Msg;\r\n\r\n\twhile (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) {\r\n\t\tif (Msg.message != WM_QUIT) {\r\n\t\t\tTranslateMessage(&Msg);\r\n\t\t\tDispatchMessage(&Msg);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL IncProgress()\r\n{\r\n\tinterface_msg_pump();\r\n\tsgdwProgress += 15;\r\n\tif ((DWORD)sgdwProgress > 534)\r\n\t\tsgdwProgress = 534;\r\n\tif (sgpBackCel)\r\n\t\tDrawCutscene();\r\n\treturn (DWORD)sgdwProgress >= 534;\r\n}\r\n\r\nvoid ShowProgress(unsigned int uMsg)\r\n{\r\n\tWNDPROC saveProc;\r\n\r\n\tgbSomebodyWonGameKludge = FALSE;\r\n\tplrmsg_delay(TRUE);\r\n\r\n\tassert(ghMainWnd);\r\n\tsaveProc = SetWindowProc(DisableInputWndProc);\r\n\r\n\tinterface_msg_pump();\r\n\tClearScreenBuffer();\r\n\tscrollrt_draw_game_screen(TRUE);\r\n\tInitCutscene(uMsg);\r\n\tBlackPalette();\r\n\tDrawCutscene();\r\n\tPaletteFadeIn(8);\r\n\tIncProgress();\r\n\tsound_init();\r\n\tIncProgress();\r\n\r\n\tswitch (uMsg) {\r\n\tcase WM_DIABLOADGAME:\r\n\t\tIncProgress();\r\n\t\tLoadGame(TRUE);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABNEWGAME:\r\n\t\tIncProgress();\r\n\t\tFreeGameMem();\r\n\t\tIncProgress();\r\n\t\tpfile_remove_temp_files();\r\n\t\tLoadGameLevel(TRUE, ENTRY_MAIN);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABNEXTLVL:\r\n\t\tIncProgress();\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tFreeGameMem();\r\n\t\tcurrlevel++;\r\n\t\tleveltype = gnLevelTypeTbl[currlevel];\r\n\t\tassert(plr[myplr].plrlevel == currlevel);\r\n\t\tIncProgress();\r\n\t\tLoadGameLevel(FALSE, ENTRY_MAIN);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABPREVLVL:\r\n\t\tIncProgress();\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tIncProgress();\r\n\t\tFreeGameMem();\r\n\t\tcurrlevel--;\r\n\t\tleveltype = gnLevelTypeTbl[currlevel];\r\n\t\tassert(plr[myplr].plrlevel == currlevel);\r\n\t\tIncProgress();\r\n\t\tLoadGameLevel(FALSE, ENTRY_PREV);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABSETLVL:\r\n\t\tSetReturnLvlPos();\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tsetlevel = TRUE;\r\n\t\tleveltype = setlvltype;\r\n\t\tFreeGameMem();\r\n\t\tIncProgress();\r\n\t\tLoadGameLevel(FALSE, ENTRY_SETLVL);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABRTNLVL:\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tsetlevel = FALSE;\r\n\t\tFreeGameMem();\r\n\t\tIncProgress();\r\n\t\tGetReturnLvlPos();\r\n\t\tLoadGameLevel(FALSE, ENTRY_RTNLVL);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABWARPLVL:\r\n\t\tIncProgress();\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tFreeGameMem();\r\n\t\tGetPortalLevel();\r\n\t\tIncProgress();\r\n\t\tLoadGameLevel(FALSE, ENTRY_WARPLVL);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABTOWNWARP:\r\n\t\tIncProgress();\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tFreeGameMem();\r\n\t\tcurrlevel = plr[myplr].plrlevel;\r\n\t\tleveltype = gnLevelTypeTbl[currlevel];\r\n\t\tassert(plr[myplr].plrlevel == currlevel);\r\n\t\tIncProgress();\r\n\t\tLoadGameLevel(FALSE, ENTRY_TWARPDN);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABTWARPUP:\r\n\t\tIncProgress();\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tFreeGameMem();\r\n\t\tcurrlevel = plr[myplr].plrlevel;\r\n\t\tleveltype = gnLevelTypeTbl[currlevel];\r\n\t\tassert(plr[myplr].plrlevel == currlevel);\r\n\t\tIncProgress();\r\n\t\tLoadGameLevel(FALSE, ENTRY_TWARPUP);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\tcase WM_DIABRETOWN:\r\n\t\tIncProgress();\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tSaveLevel();\r\n\t\t} else {\r\n\t\t\tDeltaSaveLevel();\r\n\t\t}\r\n\t\tFreeGameMem();\r\n\t\tcurrlevel = plr[myplr].plrlevel;\r\n\t\tleveltype = gnLevelTypeTbl[currlevel];\r\n\t\tassert(plr[myplr].plrlevel == currlevel);\r\n\t\tIncProgress();\r\n\t\tLoadGameLevel(FALSE, ENTRY_MAIN);\r\n\t\tIncProgress();\r\n\t\tbreak;\r\n\t}\r\n\r\n\tassert(ghMainWnd);\r\n\r\n\tPaletteFadeOut(8);\r\n\tFreeInterface();\r\n\r\n\tsaveProc = SetWindowProc(saveProc);\r\n\tassert(saveProc == DisableInputWndProc);\r\n\r\n\tNetSendCmdLocParam1(TRUE, CMD_PLAYER_JOINLEVEL, plr[myplr]._px, plr[myplr]._py, plr[myplr].plrlevel);\r\n\tplrmsg_delay(FALSE);\r\n\tResetPal();\r\n\r\n\tif (gbSomebodyWonGameKludge && plr[myplr].plrlevel == 16) {\r\n\t\tPrepDoEnding();\r\n\t}\r\n\r\n\tgbSomebodyWonGameKludge = FALSE;\r\n}\r\n"
  },
  {
    "path": "Source/interfac.h",
    "content": "/**\r\n * @file interfac.h\r\n *\r\n * Interface of load screens.\r\n */\r\n#ifndef __INTERFAC_H__\r\n#define __INTERFAC_H__\r\n\r\nvoid interface_msg_pump();\r\nBOOL IncProgress();\r\nvoid ShowProgress(unsigned int uMsg);\r\n\r\n#endif /* __INTERFAC_H__ */\r\n"
  },
  {
    "path": "Source/inv.cpp",
    "content": "/**\r\n * @file inv.cpp\r\n *\r\n * Implementation of player inventory.\r\n */\r\n#include \"all.h\"\r\n\r\nBOOL invflag;\r\nBYTE *pInvCels;\r\nBOOL drawsbarflag;\r\nint sgdwLastTime; // check name\r\n\r\n/**\r\n * Maps from inventory slot to screen position. The inventory slots are\r\n * arranged as follows:\r\n *                          00 01\r\n *                          02 03   06\r\n *              07 08       19 20       13 14\r\n *              09 10       21 22       15 16\r\n *              11 12       23 24       17 18\r\n *                 04                   05\r\n *              25 26 27 28 29 30 31 32 33 34\r\n *              35 36 37 38 39 40 41 42 43 44\r\n *              45 46 47 48 49 50 51 52 53 54\r\n *              55 56 57 58 59 60 61 62 63 64\r\n * 65 66 67 68 69 70 71 72\r\n * @see graphics/inv/inventory.png\r\n */\r\nconst InvXY InvRect[] = {\r\n\t// clang-format off\r\n\t//  X,   Y\r\n\t{ RIGHT_PANEL + 132,  31 }, // helmet\r\n\t{ RIGHT_PANEL + 160,  31 }, // helmet\r\n\t{ RIGHT_PANEL + 132,  59 }, // helmet\r\n\t{ RIGHT_PANEL + 160,  59 }, // helmet\r\n\t{ RIGHT_PANEL + 45,  205 }, // left ring\r\n\t{ RIGHT_PANEL + 247, 205 }, // right ring\r\n\t{ RIGHT_PANEL + 204,  59 }, // amulet\r\n\t{ RIGHT_PANEL + 17,  104 }, // left hand\r\n\t{ RIGHT_PANEL + 46,  104 }, // left hand\r\n\t{ RIGHT_PANEL + 17,  132 }, // left hand\r\n\t{ RIGHT_PANEL + 46,  132 }, // left hand\r\n\t{ RIGHT_PANEL + 17,  160 }, // left hand\r\n\t{ RIGHT_PANEL + 46,  160 }, // left hand\r\n\t{ RIGHT_PANEL + 247, 104 }, // right hand\r\n\t{ RIGHT_PANEL + 276, 104 }, // right hand\r\n\t{ RIGHT_PANEL + 247, 132 }, // right hand\r\n\t{ RIGHT_PANEL + 276, 132 }, // right hand\r\n\t{ RIGHT_PANEL + 247, 160 }, // right hand\r\n\t{ RIGHT_PANEL + 276, 160 }, // right hand\r\n\t{ RIGHT_PANEL + 132, 104 }, // chest\r\n\t{ RIGHT_PANEL + 160, 104 }, // chest\r\n\t{ RIGHT_PANEL + 132, 132 }, // chest\r\n\t{ RIGHT_PANEL + 160, 132 }, // chest\r\n\t{ RIGHT_PANEL + 132, 160 }, // chest\r\n\t{ RIGHT_PANEL + 160, 160 }, // chest\r\n\t{ RIGHT_PANEL + 17,  250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 46,  250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 74,  250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 103, 250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 131, 250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 160, 250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 189, 250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 218, 250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 247, 250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 276, 250 }, // inv row 1\r\n\t{ RIGHT_PANEL + 17,  279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 46,  279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 74,  279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 103, 279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 131, 279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 160, 279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 189, 279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 218, 279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 247, 279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 276, 279 }, // inv row 2\r\n\t{ RIGHT_PANEL + 17,  308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 46,  308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 74,  308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 103, 308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 131, 308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 160, 308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 189, 308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 218, 308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 247, 308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 276, 308 }, // inv row 3\r\n\t{ RIGHT_PANEL + 17,  336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 46,  336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 74,  336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 103, 336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 131, 336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 160, 336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 189, 336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 218, 336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 247, 336 }, // inv row 4\r\n\t{ RIGHT_PANEL + 276, 336 }, // inv row 4\r\n\t{ PANEL_LEFT + 205, PANEL_TOP + 33 }, // belt\r\n\t{ PANEL_LEFT + 234, PANEL_TOP + 33 }, // belt\r\n\t{ PANEL_LEFT + 263, PANEL_TOP + 33 }, // belt\r\n\t{ PANEL_LEFT + 292, PANEL_TOP + 33 }, // belt\r\n\t{ PANEL_LEFT + 321, PANEL_TOP + 33 }, // belt\r\n\t{ PANEL_LEFT + 350, PANEL_TOP + 33 }, // belt\r\n\t{ PANEL_LEFT + 379, PANEL_TOP + 33 }, // belt\r\n\t{ PANEL_LEFT + 408, PANEL_TOP + 33 }  // belt\r\n\t// clang-format on\r\n};\r\n\r\n/* data */\r\n/** Specifies the starting inventory slots for placement of 2x2 items. */\r\nint AP2x2Tbl[10] = { 8, 28, 6, 26, 4, 24, 2, 22, 0, 20 };\r\n\r\nvoid FreeInvGFX()\r\n{\r\n\tMemFreeDbg(pInvCels);\r\n}\r\n\r\nvoid InitInv()\r\n{\r\n\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\tpInvCels = LoadFileInMem(\"Data\\\\Inv\\\\Inv.CEL\", NULL);\r\n#ifndef SPAWN\r\n\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\tpInvCels = LoadFileInMem(\"Data\\\\Inv\\\\Inv_rog.CEL\", NULL);\r\n\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\tpInvCels = LoadFileInMem(\"Data\\\\Inv\\\\Inv_Sor.CEL\", NULL);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n#ifndef SPAWN\r\n\t\tpInvCels = LoadFileInMem(\"Data\\\\Inv\\\\Inv_Sor.CEL\", NULL);\r\n#else\r\n\t\tpInvCels = LoadFileInMem(\"Data\\\\Inv\\\\Inv.CEL\", NULL);\r\n#endif\r\n\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\tpInvCels = LoadFileInMem(\"Data\\\\Inv\\\\Inv_rog.CEL\", NULL);\r\n\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\tpInvCels = LoadFileInMem(\"Data\\\\Inv\\\\Inv.CEL\", NULL);\r\n#endif\r\n\t}\r\n\r\n\tinvflag = FALSE;\r\n\tdrawsbarflag = FALSE;\r\n}\r\n\r\nvoid InvDrawSlotBack(int X, int Y, int W, int H)\r\n{\r\n\tBYTE *dst;\r\n\r\n\tassert(gpBuffer);\r\n\r\n\tdst = &gpBuffer[X + PitchTbl[Y]];\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tedi, dst\r\n\t\txor\t\tedx, edx\r\n\t\txor\t\tebx, ebx\r\n\t\tmov\t\tdx, word ptr H\r\n\t\tmov\t\tbx, word ptr W\r\n\tlabel1:\r\n\t\tmov\t\tecx, ebx\r\n\tlabel2:\r\n\t\tmov\t\tal, [edi]\r\n\t\tcmp\t\tal, PAL16_BLUE\r\n\t\tjb\t\tlabel5\r\n\t\tcmp\t\tal, PAL16_BLUE + 15\r\n\t\tja\t\tlabel3\r\n\t\tsub\t\tal, PAL16_BLUE - PAL16_BEIGE\r\n\t\tjmp\t\tlabel4\r\n\tlabel3:\r\n\t\tcmp\t\tal, PAL16_GRAY\r\n\t\tjb\t\tlabel5\r\n\t\tsub\t\tal, PAL16_GRAY - PAL16_BEIGE\r\n\tlabel4:\r\n\t\tmov\t\t[edi], al\r\n\tlabel5:\r\n\t\tinc\t\tedi\r\n\t\tloop\tlabel2\r\n\t\tsub\t\tedi, BUFFER_WIDTH\r\n\t\tsub\t\tedi, ebx\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint wdt, hgt;\r\n\tBYTE pix;\r\n\r\n\tfor (hgt = H; hgt; hgt--, dst -= BUFFER_WIDTH + W) {\r\n\t\tfor (wdt = W; wdt; wdt--) {\r\n\t\t\tpix = *dst;\r\n\t\t\tif (pix >= PAL16_BLUE) {\r\n\t\t\t\tif (pix <= PAL16_BLUE + 15)\r\n\t\t\t\t\tpix -= PAL16_BLUE - PAL16_BEIGE;\r\n\t\t\t\telse if (pix >= PAL16_GRAY)\r\n\t\t\t\t\tpix -= PAL16_GRAY - PAL16_BEIGE;\r\n\t\t\t}\r\n\t\t\t*dst++ = pix;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Render the inventory panel to the back buffer\r\n */\r\nvoid DrawInv()\r\n{\r\n\tBOOL invtest[NUM_INV_GRID_ELEM];\r\n\tint frame, frame_width, color, screen_x, screen_y, i, j, ii;\r\n\tBYTE *pBuff;\r\n\r\n\tCelDraw(RIGHT_PANEL_X, 351 + SCREEN_Y, pInvCels, 1, 320);\r\n\r\n\tif (plr[myplr].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) {\r\n\t\tInvDrawSlotBack(RIGHT_PANEL_X + 133, 59 + SCREEN_Y, 2 * INV_SLOT_SIZE_PX, 2 * INV_SLOT_SIZE_PX);\r\n\r\n\t\tframe = plr[myplr].InvBody[INVLOC_HEAD]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\r\n\t\tif (pcursinvitem == INVITEM_HEAD) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].InvBody[INVLOC_HEAD]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t}\r\n\t\t\tif (!plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) {\r\n\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_HEAD]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 133, 59 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[myplr].InvBody[INVLOC_RING_LEFT]._itype != ITYPE_NONE) {\r\n\t\tInvDrawSlotBack(RIGHT_PANEL_X + 48, 205 + SCREEN_Y, INV_SLOT_SIZE_PX, INV_SLOT_SIZE_PX);\r\n\r\n\t\tframe = plr[myplr].InvBody[INVLOC_RING_LEFT]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\r\n\t\tif (pcursinvitem == INVITEM_RING_LEFT) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].InvBody[INVLOC_RING_LEFT]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t}\r\n\t\t\tif (!plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) {\r\n\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_RING_LEFT]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 48, 205 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[myplr].InvBody[INVLOC_RING_RIGHT]._itype != ITYPE_NONE) {\r\n\t\tInvDrawSlotBack(RIGHT_PANEL_X + 249, 205 + SCREEN_Y, INV_SLOT_SIZE_PX, INV_SLOT_SIZE_PX);\r\n\r\n\t\tframe = plr[myplr].InvBody[INVLOC_RING_RIGHT]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\r\n\t\tif (pcursinvitem == INVITEM_RING_RIGHT) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].InvBody[INVLOC_RING_RIGHT]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t}\r\n\t\t\tif (!plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) {\r\n\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_RING_RIGHT]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 249, 205 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[myplr].InvBody[INVLOC_AMULET]._itype != ITYPE_NONE) {\r\n\t\tInvDrawSlotBack(RIGHT_PANEL_X + 205, 60 + SCREEN_Y, INV_SLOT_SIZE_PX, INV_SLOT_SIZE_PX);\r\n\r\n\t\tframe = plr[myplr].InvBody[INVLOC_AMULET]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\r\n\t\tif (pcursinvitem == INVITEM_AMULET) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].InvBody[INVLOC_AMULET]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t}\r\n\t\t\tif (!plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) {\r\n\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_AMULET]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 205, 60 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {\r\n\t\tInvDrawSlotBack(RIGHT_PANEL_X + 17, 160 + SCREEN_Y, 2 * INV_SLOT_SIZE_PX, 3 * INV_SLOT_SIZE_PX);\r\n\r\n\t\tframe = plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\t\t// calc item offsets for weapons smaller than 2x3 slots\r\n\t\tscreen_x = frame_width == INV_SLOT_SIZE_PX ? (RIGHT_PANEL_X + 31) : (RIGHT_PANEL_X + 17);\r\n\t\tscreen_y = InvItemHeight[frame] == (3 * INV_SLOT_SIZE_PX) ? (160 + SCREEN_Y) : (146 + SCREEN_Y);\r\n\r\n\t\tif (pcursinvitem == INVITEM_HAND_LEFT) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t}\r\n\t\t\tif (!plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {\r\n\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelBlitOutline(color, screen_x, screen_y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelClippedDraw(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelClippedDraw(screen_x, screen_y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelDrawLightRed(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRed(screen_x, screen_y, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (plr[myplr]._pClass != PC_BARBARIAN\r\n\t\t\t    || plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_SWORD\r\n\t\t\t        && plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_MACE) {\r\n#endif\r\n\t\t\t\tInvDrawSlotBack(RIGHT_PANEL_X + 247, 160 + SCREEN_Y, 2 * INV_SLOT_SIZE_PX, 3 * INV_SLOT_SIZE_PX);\r\n\t\t\t\tlight_table_index = 0;\r\n\t\t\t\tcel_transparency_active = TRUE;\r\n\r\n\t\t\t\tpBuff = frame_width == INV_SLOT_SIZE_PX\r\n\t\t\t\t    ? &gpBuffer[SCREENXY(RIGHT_PANEL_X + 197, SCREEN_Y)]\r\n\t\t\t\t    : &gpBuffer[SCREENXY(RIGHT_PANEL_X + 183, SCREEN_Y)];\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\t\tCelClippedBlitLightTrans(pBuff, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tCelClippedBlitLightTrans(pBuff, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t\t}\r\n#endif\r\n\r\n\t\t\t\tcel_transparency_active = FALSE;\r\n#ifdef HELLFIRE\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\tif (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {\r\n\t\tInvDrawSlotBack(RIGHT_PANEL_X + 247, 160 + SCREEN_Y, 2 * INV_SLOT_SIZE_PX, 3 * INV_SLOT_SIZE_PX);\r\n\r\n\t\tframe = plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\t\t// calc item offsets for weapons smaller than 2x3 slots\r\n\t\tscreen_x = frame_width == INV_SLOT_SIZE_PX ? (RIGHT_PANEL_X + 261) : (RIGHT_PANEL_X + 249);\r\n\t\tscreen_y = InvItemHeight[frame] == 3 * INV_SLOT_SIZE_PX ? (160 + SCREEN_Y) : (146 + SCREEN_Y);\r\n\r\n\t\tif (pcursinvitem == INVITEM_HAND_RIGHT) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t}\r\n\t\t\tif (!plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {\r\n\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelBlitOutline(color, screen_x, screen_y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelClippedDraw(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelClippedDraw(screen_x, screen_y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelDrawLightRed(screen_x, screen_y, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRed(screen_x, screen_y, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[myplr].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE) {\r\n\t\tInvDrawSlotBack(RIGHT_PANEL_X + 133, 160 + SCREEN_Y, 2 * INV_SLOT_SIZE_PX, 3 * INV_SLOT_SIZE_PX);\r\n\r\n\t\tframe = plr[myplr].InvBody[INVLOC_CHEST]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\r\n\t\tif (pcursinvitem == INVITEM_CHEST) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].InvBody[INVLOC_CHEST]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t}\r\n\t\t\tif (!plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) {\r\n\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelBlitOutline(color, RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].InvBody[INVLOC_CHEST]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelClippedDraw(RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t}\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRed(RIGHT_PANEL_X + 133, 160 + SCREEN_Y, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\tinvtest[i] = FALSE;\r\n\t\tif (plr[myplr].InvGrid[i] != 0) {\r\n\t\t\tInvDrawSlotBack(\r\n\t\t\t    InvRect[i + SLOTXY_INV_FIRST].X + SCREEN_X,\r\n\t\t\t    InvRect[i + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,\r\n\t\t\t    INV_SLOT_SIZE_PX,\r\n\t\t\t    INV_SLOT_SIZE_PX);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[myplr].InvGrid[j] > 0) // first slot of an item\r\n\t\t{\r\n\t\t\tii = plr[myplr].InvGrid[j] - 1;\r\n\r\n\t\t\tinvtest[j] = TRUE;\r\n\r\n\t\t\tframe = plr[myplr].InvList[ii]._iCurs + CURSOR_FIRSTITEM;\r\n\t\t\tframe_width = InvItemWidth[frame];\r\n\t\t\tif (pcursinvitem == ii + INVITEM_INV_FIRST) {\r\n\t\t\t\tcolor = ICOL_WHITE;\r\n\t\t\t\tif (plr[myplr].InvList[ii]._iMagical != ITEM_QUALITY_NORMAL) {\r\n\t\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\t\t}\r\n\t\t\t\tif (!plr[myplr].InvList[ii]._iStatFlag) {\r\n\t\t\t\t\tcolor = ICOL_RED;\r\n\t\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\t\tCelBlitOutline(\r\n\t\t\t\t\t    color,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].X + SCREEN_X,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,\r\n\t\t\t\t\t    pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tCelBlitOutline(\r\n\t\t\t\t\t    color,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].X + SCREEN_X,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,\r\n\t\t\t\t\t    pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t}\r\n\r\n\t\t\tif (plr[myplr].InvList[ii]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\t\tCelClippedDraw(\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].X + SCREEN_X,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,\r\n\t\t\t\t\t    pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tCelClippedDraw(\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].X + SCREEN_X,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,\r\n\t\t\t\t\t    pCursCels2, frame - 179, frame_width, 0, 8);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (frame <= 179) {\r\n#endif\r\n\t\t\t\t\tCelDrawLightRed(\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].X + SCREEN_X,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,\r\n\t\t\t\t\t    pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tCelDrawLightRed(\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].X + SCREEN_X,\r\n\t\t\t\t\t    InvRect[j + SLOTXY_INV_FIRST].Y + SCREEN_Y - 1,\r\n\t\t\t\t\t    pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DrawInvBelt()\r\n{\r\n\tint i, frame, frame_width, color;\r\n\tBYTE fi, ff;\r\n\r\n\tif (talkflag) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tDrawPanelBox(205, 21, 232, 28, PANEL_X + 205, PANEL_Y + 5);\r\n\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tif (plr[myplr].SpdList[i]._itype == ITYPE_NONE) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tInvDrawSlotBack(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, INV_SLOT_SIZE_PX, INV_SLOT_SIZE_PX);\r\n\t\tframe = plr[myplr].SpdList[i]._iCurs + CURSOR_FIRSTITEM;\r\n\t\tframe_width = InvItemWidth[frame];\r\n\r\n\t\tif (pcursinvitem == i + INVITEM_BELT_FIRST) {\r\n\t\t\tcolor = ICOL_WHITE;\r\n\t\t\tif (plr[myplr].SpdList[i]._iMagical)\r\n\t\t\t\tcolor = ICOL_BLUE;\r\n\t\t\tif (!plr[myplr].SpdList[i]._iStatFlag)\r\n\t\t\t\tcolor = ICOL_RED;\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179)\r\n#endif\r\n\t\t\t\tCelBlitOutline(color, InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\telse\r\n\t\t\t\tCelBlitOutline(color, InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels2, frame - 179, frame_width, 0, 8);\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (plr[myplr].SpdList[i]._iStatFlag) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179)\r\n#endif\r\n\t\t\t\tCelClippedDraw(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels, frame, frame_width, 0, 8);\r\n#ifdef HELLFIRE\r\n\t\t\telse\r\n\t\t\t\tCelClippedDraw(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels2, frame - 179, frame_width, 0, 8);\r\n#endif\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (frame <= 179)\r\n#endif\r\n\t\t\t\tCelDrawLightRed(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels, frame, frame_width, 0, 8, 1);\r\n#ifdef HELLFIRE\r\n\t\t\telse\r\n\t\t\t\tCelDrawLightRed(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X, InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1, pCursCels2, frame - 179, frame_width, 0, 8, 1);\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (AllItemsList[plr[myplr].SpdList[i].IDidx].iUsable\r\n\t\t    && plr[myplr].SpdList[i]._iStatFlag\r\n\t\t    && plr[myplr].SpdList[i]._itype != ITYPE_GOLD) {\r\n\t\t\tfi = i + 49;\r\n\t\t\tff = fontframe[gbFontTransTbl[fi]];\r\n\t\t\tPrintChar(InvRect[i + SLOTXY_BELT_FIRST].X + SCREEN_X + PitchTbl[InvRect[i + SLOTXY_BELT_FIRST].Y + SCREEN_Y - 1] - fontkern[ff] + INV_SLOT_SIZE_PX, ff, 0);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag)\r\n{\r\n\tint i, j, xx, yy;\r\n\tBOOL done;\r\n\r\n\tdone = TRUE;\r\n\tyy = 10 * (ii / 10);\r\n\tif (yy < 0) {\r\n\t\tyy = 0;\r\n\t}\r\n\tfor (j = 0; j < sy && done; j++) {\r\n\t\tif (yy >= NUM_INV_GRID_ELEM) {\r\n\t\t\tdone = FALSE;\r\n\t\t}\r\n\t\txx = ii % 10;\r\n\t\tif (xx < 0) {\r\n\t\t\txx = 0;\r\n\t\t}\r\n\t\tfor (i = 0; i < sx && done; i++) {\r\n\t\t\tif (xx >= 10) {\r\n\t\t\t\tdone = FALSE;\r\n\t\t\t} else {\r\n\t\t\t\tdone = plr[pnum].InvGrid[xx + yy] == 0;\r\n\t\t\t}\r\n\t\t\txx++;\r\n\t\t}\r\n\t\tyy += 10;\r\n\t}\r\n\tif (done && saveflag) {\r\n\t\tplr[pnum].InvList[plr[pnum]._pNumInv] = plr[pnum].HoldItem;\r\n\t\tplr[pnum]._pNumInv++;\r\n\t\tyy = 10 * (ii / 10);\r\n\t\tif (yy < 0) {\r\n\t\t\tyy = 0;\r\n\t\t}\r\n\t\tfor (j = 0; j < sy; j++) {\r\n\t\t\txx = ii % 10;\r\n\t\t\tif (xx < 0) {\r\n\t\t\t\txx = 0;\r\n\t\t\t}\r\n\t\t\tfor (i = 0; i < sx; i++) {\r\n\t\t\t\tif (i != 0 || j != sy - 1) {\r\n\t\t\t\t\tplr[pnum].InvGrid[xx + yy] = -plr[pnum]._pNumInv;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplr[pnum].InvGrid[xx + yy] = plr[pnum]._pNumInv;\r\n\t\t\t\t}\r\n\t\t\t\txx++;\r\n\t\t\t}\r\n\t\t\tyy += 10;\r\n\t\t}\r\n\t\tCalcPlrScrolls(pnum);\r\n\t}\r\n\treturn done;\r\n}\r\n\r\nBOOL SpecialAutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag)\r\n{\r\n\tint i, j, xx, yy;\r\n\tBOOL done;\r\n\r\n\tdone = TRUE;\r\n\tyy = 10 * (ii / 10);\r\n\tif (yy < 0) {\r\n\t\tyy = 0;\r\n\t}\r\n\tfor (j = 0; j < sy && done; j++) {\r\n\t\tif (yy >= NUM_INV_GRID_ELEM) {\r\n\t\t\tdone = FALSE;\r\n\t\t}\r\n\t\txx = ii % 10;\r\n\t\tif (xx < 0) {\r\n\t\t\txx = 0;\r\n\t\t}\r\n\t\tfor (i = 0; i < sx && done; i++) {\r\n\t\t\tif (xx >= 10) {\r\n\t\t\t\tdone = FALSE;\r\n\t\t\t} else {\r\n\t\t\t\tdone = plr[pnum].InvGrid[xx + yy] == 0;\r\n\t\t\t}\r\n\t\t\txx++;\r\n\t\t}\r\n\t\tyy += 10;\r\n\t}\r\n\tif (!done) {\r\n\t\tif (sx > 1 || sy > 1) {\r\n\t\t\tdone = FALSE;\r\n\t\t} else {\r\n\t\t\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\t\t\tif (plr[pnum].SpdList[i]._itype == ITYPE_NONE) {\r\n\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (done && saveflag) {\r\n\t\tplr[pnum].InvList[plr[pnum]._pNumInv] = plr[pnum].HoldItem;\r\n\t\tplr[pnum]._pNumInv++;\r\n\t\tyy = 10 * (ii / 10);\r\n\t\tif (yy < 0) {\r\n\t\t\tyy = 0;\r\n\t\t}\r\n\t\tfor (j = 0; j < sy; j++) {\r\n\t\t\txx = ii % 10;\r\n\t\t\tif (xx < 0) {\r\n\t\t\t\txx = 0;\r\n\t\t\t}\r\n\t\t\tfor (i = 0; i < sx; i++) {\r\n\t\t\t\tif (i != 0 || j != sy - 1) {\r\n\t\t\t\t\tplr[pnum].InvGrid[xx + yy] = -plr[pnum]._pNumInv;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplr[pnum].InvGrid[xx + yy] = plr[pnum]._pNumInv;\r\n\t\t\t\t}\r\n\t\t\t\txx++;\r\n\t\t\t}\r\n\t\t\tyy += 10;\r\n\t\t}\r\n\t\tCalcPlrScrolls(pnum);\r\n\t}\r\n\treturn done;\r\n}\r\n\r\nBOOL GoldAutoPlace(int pnum)\r\n{\r\n\tint ii;\r\n\tint xx, yy;\r\n\tBOOL done;\r\n\r\n\tdone = FALSE;\r\n\tfor (int i = 0; i < plr[pnum]._pNumInv && !done; i++) {\r\n\t\tif (plr[pnum].InvList[i]._itype == ITYPE_GOLD) {\r\n\t\t\tint gold = plr[pnum].InvList[i]._ivalue + plr[pnum].HoldItem._ivalue;\r\n#ifdef HELLFIRE\r\n\t\t\tif (gold <= MaxGold) {\r\n#else\r\n\t\t\tif (plr[pnum].HoldItem._ivalue + plr[pnum].InvList[i]._ivalue <= GOLD_MAX_LIMIT) {\r\n#endif\r\n\t\t\t\tplr[pnum].InvList[i]._ivalue = gold;\r\n\t\t\t\tif (gold >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\telse if (gold <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_SMALL;\r\n\t\t\t\telse\r\n\t\t\t\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_MEDIUM;\r\n\t\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t\t\tdone = TRUE;\r\n#ifdef HELLFIRE\r\n\t\t\t\tplr[pnum].HoldItem._ivalue = 0;\r\n\t\t\t} else {\r\n\t\t\t\tint max_gold = MaxGold;\r\n\t\t\t\tif (plr[pnum].InvList[i]._ivalue < max_gold) {\r\n\t\t\t\t\tint gold = max_gold - plr[pnum].InvList[i]._ivalue;\r\n\t\t\t\t\tplr[pnum].InvList[i]._ivalue = max_gold;\r\n\t\t\t\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue -= gold;\r\n\t\t\t\t\tif (plr[pnum].HoldItem._ivalue < 0) {\r\n\t\t\t\t\t\tplr[pnum].HoldItem._ivalue = 0;\r\n\t\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tGetPlrHandSeed(&plr[pnum].HoldItem);\r\n\t\t\t\t\tcontrol_set_gold_curs(pnum);\r\n\t\t\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n#ifndef HELLFIRE\r\n\tif (!done)\r\n\t\tfor (int i = 0; i < plr[pnum]._pNumInv && !done; i++) {\r\n\t\t\tif (plr[pnum].InvList[i]._itype == ITYPE_GOLD && plr[pnum].InvList[i]._ivalue < GOLD_MAX_LIMIT) {\r\n\t\t\t\tif (plr[pnum].HoldItem._ivalue + plr[pnum].InvList[i]._ivalue <= GOLD_MAX_LIMIT) {\r\n\t\t\t\t\tplr[pnum].InvList[i]._ivalue = plr[pnum].HoldItem._ivalue + plr[pnum].InvList[i]._ivalue;\r\n\t\t\t\t\tif (plr[pnum].InvList[i]._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\t\telse if (plr[pnum].InvList[i]._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_SMALL;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_MEDIUM;\r\n\t\t\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\r\n\tif (!done)\r\n\t\tfor (int i = 39; i >= 0 && !done; i--) {\r\n\t\t\tyy = 10 * (i / 10);\r\n\t\t\txx = i % 10;\r\n\t\t\tif (plr[pnum].InvGrid[xx + yy] == 0) {\r\n\t\t\t\tii = plr[pnum]._pNumInv;\r\n\t\t\t\tplr[pnum].InvList[ii] = plr[pnum].HoldItem;\r\n\t\t\t\tplr[pnum]._pNumInv = plr[pnum]._pNumInv + 1;\r\n\t\t\t\tplr[pnum].InvGrid[xx + yy] = plr[pnum]._pNumInv;\r\n\t\t\t\tif (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\tplr[pnum].InvList[ii]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\telse if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\tplr[pnum].InvList[ii]._iCurs = ICURS_GOLD_SMALL;\r\n\t\t\t\telse\r\n\t\t\t\t\tplr[pnum].InvList[ii]._iCurs = ICURS_GOLD_MEDIUM;\r\n#ifdef HELLFIRE\r\n\t\t\t\tint gold = plr[pnum].HoldItem._ivalue;\r\n\t\t\t\tif (gold > MaxGold) {\r\n\t\t\t\t\tgold -= MaxGold;\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = gold;\r\n\t\t\t\t\tGetPlrHandSeed(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].InvList[ii]._ivalue = MaxGold;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = 0;\r\n\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t\t\t}\r\n#else\r\n\t\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t\t\tdone = TRUE;\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n\r\n\treturn done;\r\n}\r\n\r\nBOOL WeaponAutoPlace(int pnum)\r\n{\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum]._pClass == PC_MONK)\r\n\t\treturn FALSE;\r\n#endif\r\n\tif (plr[pnum].HoldItem._iLoc != ILOC_TWOHAND\r\n#ifdef HELLFIRE\r\n\t    || (plr[pnum]._pClass == PC_BARBARIAN && (plr[pnum].HoldItem._itype == ITYPE_SWORD || plr[pnum].HoldItem._itype == ITYPE_MACE))\r\n#endif\r\n\t) {\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum]._pClass != PC_BARD)\r\n#endif\r\n\t\t{\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON)\r\n\t\t\t\treturn FALSE;\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON)\r\n\t\t\t\treturn FALSE;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) {\r\n\t\t\tNetSendCmdChItem(TRUE, INVLOC_HAND_LEFT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc != ILOC_TWOHAND) {\r\n\t\t\tNetSendCmdChItem(TRUE, INVLOC_HAND_RIGHT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT] = plr[pnum].HoldItem;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t} else if (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE) {\r\n\t\tNetSendCmdChItem(TRUE, INVLOC_HAND_LEFT);\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nint SwapItem(ItemStruct *a, ItemStruct *b)\r\n{\r\n\tItemStruct h;\r\n\r\n\th = *a;\r\n\t*a = *b;\r\n\t*b = h;\r\n\r\n\treturn h._iCurs + CURSOR_FIRSTITEM;\r\n}\r\n\r\nvoid CheckInvPaste(int pnum, int mx, int my)\r\n{\r\n\tint r, sx, sy;\r\n\tint i, j, xx, yy, ii;\r\n\tBOOL done, done2h;\r\n\tint il, cn, it, iv, ig, gt;\r\n\tItemStruct tempitem;\r\n\r\n\tSetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\ti = mx + (icursW >> 1);\r\n\tj = my + (icursH >> 1);\r\n\tsx = icursW28;\r\n\tsy = icursH28;\r\n\tdone = FALSE;\r\n\tfor (r = 0; (DWORD)r < NUM_XY_SLOTS && !done; r++) {\r\n\t\tif (i >= InvRect[r].X && i < InvRect[r].X + INV_SLOT_SIZE_PX) {\r\n\t\t\tif (j >= InvRect[r].Y - INV_SLOT_SIZE_PX - 1 && j < InvRect[r].Y) {\r\n\t\t\t\tdone = TRUE;\r\n\t\t\t\tr--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (r == SLOTXY_CHEST_LAST) {\r\n\t\t\tif ((sx & 1) == 0)\r\n\t\t\t\ti -= 14;\r\n\t\t\tif ((sy & 1) == 0)\r\n\t\t\t\tj -= 14;\r\n\t\t}\r\n\t\tif (r == SLOTXY_INV_LAST && (sy & 1) == 0)\r\n\t\t\tj += 14;\r\n\t}\r\n\tif (!done)\r\n\t\treturn;\r\n\til = ILOC_UNEQUIPABLE;\r\n\tif (r >= SLOTXY_HEAD_FIRST && r <= SLOTXY_HEAD_LAST)\r\n\t\til = ILOC_HELM;\r\n\tif (r >= SLOTXY_RING_LEFT && r <= SLOTXY_RING_RIGHT)\r\n\t\til = ILOC_RING;\r\n\tif (r == SLOTXY_AMULET)\r\n\t\til = ILOC_AMULET;\r\n\tif (r >= SLOTXY_HAND_LEFT_FIRST && r <= SLOTXY_HAND_RIGHT_LAST)\r\n\t\til = ILOC_ONEHAND;\r\n\tif (r >= SLOTXY_CHEST_FIRST && r <= SLOTXY_CHEST_LAST)\r\n\t\til = ILOC_ARMOR;\r\n\tif (r >= SLOTXY_BELT_FIRST && r <= SLOTXY_BELT_LAST)\r\n\t\til = ILOC_BELT;\r\n\tdone = FALSE;\r\n\tif (plr[pnum].HoldItem._iLoc == il)\r\n\t\tdone = TRUE;\r\n\tif (il == ILOC_ONEHAND && plr[pnum].HoldItem._iLoc == ILOC_TWOHAND) {\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum]._pClass == PC_BARBARIAN\r\n\t\t    && (plr[pnum].HoldItem._itype == ITYPE_SWORD || plr[pnum].HoldItem._itype == ITYPE_MACE))\r\n\t\t\til = ILOC_ONEHAND;\r\n\t\telse\r\n#endif\r\n\t\t\til = ILOC_TWOHAND;\r\n\t\tdone = TRUE;\r\n\t}\r\n\tif (plr[pnum].HoldItem._iLoc == ILOC_UNEQUIPABLE && il == ILOC_BELT) {\r\n\t\tif (sx == 1 && sy == 1) {\r\n\t\t\tdone = TRUE;\r\n\t\t\tif (!AllItemsList[plr[pnum].HoldItem.IDidx].iUsable)\r\n\t\t\t\tdone = FALSE;\r\n\t\t\tif (!plr[pnum].HoldItem._iStatFlag)\r\n\t\t\t\tdone = FALSE;\r\n\t\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD)\r\n\t\t\t\tdone = FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (il == ILOC_UNEQUIPABLE) {\r\n\t\tdone = TRUE;\r\n\t\tit = 0;\r\n\t\tii = r - SLOTXY_INV_FIRST;\r\n\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD) {\r\n\t\t\tyy = 10 * (ii / 10);\r\n\t\t\txx = ii % 10;\r\n\t\t\tif (plr[pnum].InvGrid[xx + yy] != 0) {\r\n\t\t\t\tiv = plr[pnum].InvGrid[xx + yy];\r\n\t\t\t\tif (iv > 0) {\r\n\t\t\t\t\tif (plr[pnum].InvList[iv - 1]._itype != ITYPE_GOLD) {\r\n\t\t\t\t\t\tit = iv;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tit = -iv;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tyy = 10 * ((ii / 10) - ((sy - 1) >> 1));\r\n\t\t\tif (yy < 0)\r\n\t\t\t\tyy = 0;\r\n\t\t\tfor (j = 0; j < sy && done; j++) {\r\n\t\t\t\tif (yy >= NUM_INV_GRID_ELEM)\r\n\t\t\t\t\tdone = FALSE;\r\n\t\t\t\txx = (ii % 10) - ((sx - 1) >> 1);\r\n\t\t\t\tif (xx < 0)\r\n\t\t\t\t\txx = 0;\r\n\t\t\t\tfor (i = 0; i < sx && done; i++) {\r\n\t\t\t\t\tif (xx >= 10) {\r\n\t\t\t\t\t\tdone = FALSE;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (plr[pnum].InvGrid[xx + yy] != 0) {\r\n\t\t\t\t\t\t\tiv = plr[pnum].InvGrid[xx + yy];\r\n\t\t\t\t\t\t\tif (iv < 0)\r\n\t\t\t\t\t\t\t\tiv = -iv;\r\n\t\t\t\t\t\t\tif (it != 0) {\r\n\t\t\t\t\t\t\t\tif (it != iv)\r\n\t\t\t\t\t\t\t\t\tdone = FALSE;\r\n\t\t\t\t\t\t\t} else\r\n\t\t\t\t\t\t\t\tit = iv;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\txx++;\r\n\t\t\t\t}\r\n\t\t\t\tyy += 10;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!done)\r\n\t\treturn;\r\n\r\n\tif (il != ILOC_UNEQUIPABLE && il != ILOC_BELT && !plr[pnum].HoldItem._iStatFlag) {\r\n\t\tdone = FALSE;\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR)\r\n\t\t\tPlaySFX(PS_WARR13);\r\n#ifndef SPAWN\r\n\t\telse if (plr[pnum]._pClass == PC_ROGUE)\r\n\t\t\tPlaySFX(PS_ROGUE13);\r\n\t\telse if (plr[pnum]._pClass == PC_SORCERER)\r\n\t\t\tPlaySFX(PS_MAGE13);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[pnum]._pClass == PC_MONK)\r\n\t\t\tPlaySFX(PS_MONK13);\r\n#ifndef SPAWN\r\n\t\telse if (plr[pnum]._pClass == PC_BARD)\r\n\t\t\tPlaySFX(PS_ROGUE13);\r\n#endif\r\n\t\telse if (plr[pnum]._pClass == PC_BARBARIAN)\r\n\t\t\tPlaySFX(PS_MAGE13);\r\n#endif\r\n\t}\r\n\r\n\tif (!done)\r\n\t\treturn;\r\n\r\n\tif (pnum == myplr)\r\n\t\tPlaySFX(ItemInvSnds[ItemCAnimTbl[plr[pnum].HoldItem._iCurs]]);\r\n\r\n\tcn = CURSOR_HAND;\r\n\tswitch (il) {\r\n\tcase ILOC_HELM:\r\n\t\tNetSendCmdChItem(FALSE, INVLOC_HEAD);\r\n\t\tif (plr[pnum].InvBody[INVLOC_HEAD]._itype == ITYPE_NONE)\r\n\t\t\tplr[pnum].InvBody[INVLOC_HEAD] = plr[pnum].HoldItem;\r\n\t\telse\r\n\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HEAD], &plr[pnum].HoldItem);\r\n\t\tbreak;\r\n\tcase ILOC_RING:\r\n\t\tif (r == SLOTXY_RING_LEFT) {\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_RING_LEFT);\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_RING_LEFT]._itype == ITYPE_NONE)\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_RING_LEFT] = plr[pnum].HoldItem;\r\n\t\t\telse\r\n\t\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_RING_LEFT], &plr[pnum].HoldItem);\r\n\t\t} else {\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_RING_RIGHT);\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_RING_RIGHT]._itype == ITYPE_NONE)\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_RING_RIGHT] = plr[pnum].HoldItem;\r\n\t\t\telse\r\n\t\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_RING_RIGHT], &plr[pnum].HoldItem);\r\n\t\t}\r\n\t\tbreak;\r\n\tcase ILOC_AMULET:\r\n\t\tNetSendCmdChItem(FALSE, INVLOC_AMULET);\r\n\t\tif (plr[pnum].InvBody[INVLOC_AMULET]._itype == ITYPE_NONE)\r\n\t\t\tplr[pnum].InvBody[INVLOC_AMULET] = plr[pnum].HoldItem;\r\n\t\telse\r\n\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_AMULET], &plr[pnum].HoldItem);\r\n\t\tbreak;\r\n\tcase ILOC_ONEHAND:\r\n\t\tif (r <= SLOTXY_HAND_LEFT_LAST) {\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE) {\r\n\t\t\t\tif ((plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass != plr[pnum].HoldItem._iClass)\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || (plr[pnum]._pClass == PC_BARD && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON && plr[pnum].HoldItem._iClass == ICLASS_WEAPON)\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT);\r\n\t\t\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif ((plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass != plr[pnum].HoldItem._iClass)\r\n#ifdef HELLFIRE\r\n\t\t\t    || (plr[pnum]._pClass == PC_BARD && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON && plr[pnum].HoldItem._iClass == ICLASS_WEAPON)\r\n#endif\r\n\t\t\t) {\r\n\t\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT);\r\n\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE) {\r\n\t\t\tif ((plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc != ILOC_TWOHAND)\r\n#ifdef HELLFIRE\r\n\t\t\t    || (plr[pnum]._pClass == PC_BARBARIAN && (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD || plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_MACE))\r\n#endif\r\n\t\t\t) {\r\n\t\t\t\tif ((plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass != plr[pnum].HoldItem._iClass)\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || (plr[pnum]._pClass == PC_BARD && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON && plr[pnum].HoldItem._iClass == ICLASS_WEAPON)\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT);\r\n\t\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT] = plr[pnum].HoldItem;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_LEFT);\r\n#else\r\n\t\t\tNetSendCmdDelItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT);\r\n#endif\r\n\t\t\tSwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].InvBody[INVLOC_HAND_LEFT]);\r\n\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif ((plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == plr[pnum].HoldItem._iClass)\r\n#ifdef HELLFIRE\r\n\t\t    && !(plr[pnum]._pClass == PC_BARD && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON && plr[pnum].HoldItem._iClass == ICLASS_WEAPON)\r\n#endif\r\n\t\t) {\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_RIGHT);\r\n\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_RIGHT], &plr[pnum].HoldItem);\r\n\t\tbreak;\r\n\tcase ILOC_TWOHAND:\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_HAND_RIGHT);\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {\r\n\t\t\ttempitem = plr[pnum].HoldItem;\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD)\r\n\t\t\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_RIGHT];\r\n\t\t\telse\r\n\t\t\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_LEFT];\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tSetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\telse\r\n\t\t\t\tSetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\tdone2h = FALSE;\r\n\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM && !done2h; i++)\r\n\t\t\t\tdone2h = AutoPlace(pnum, i, icursW28, icursH28, TRUE);\r\n\t\t\tplr[pnum].HoldItem = tempitem;\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tSetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\telse\r\n\t\t\t\tSetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\tif (!done2h)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD)\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE;\r\n\t\t\telse\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE)\r\n\t\t\t\tSwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].InvBody[INVLOC_HAND_RIGHT]);\r\n\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_HAND_LEFT], &plr[pnum].HoldItem);\r\n\t\t} else {\r\n\t\t\tNetSendCmdChItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT] = plr[pnum].HoldItem;\r\n\t\t}\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iSpell != SPL_NULL && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) {\r\n\t\t\tplr[pnum]._pRSpell = plr[pnum].InvBody[INVLOC_HAND_LEFT]._iSpell;\r\n\t\t\tplr[pnum]._pRSplType = RSPLTYPE_CHARGES;\r\n\t\t\tforce_redraw = 255;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase ILOC_ARMOR:\r\n\t\tNetSendCmdChItem(FALSE, INVLOC_CHEST);\r\n\t\tif (plr[pnum].InvBody[INVLOC_CHEST]._itype == ITYPE_NONE)\r\n\t\t\tplr[pnum].InvBody[INVLOC_CHEST] = plr[pnum].HoldItem;\r\n\t\telse\r\n\t\t\tcn = SwapItem(&plr[pnum].InvBody[INVLOC_CHEST], &plr[pnum].HoldItem);\r\n\t\tbreak;\r\n\tcase ILOC_UNEQUIPABLE:\r\n\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD && it == 0) {\r\n\t\t\tii = r - SLOTXY_INV_FIRST;\r\n\t\t\tyy = 10 * (ii / 10);\r\n\t\t\txx = ii % 10;\r\n\t\t\tif (plr[pnum].InvGrid[yy + xx] > 0) {\r\n\t\t\t\til = plr[pnum].InvGrid[yy + xx];\r\n\t\t\t\til--;\r\n\t\t\t\tgt = plr[pnum].InvList[il]._ivalue;\r\n\t\t\t\tig = plr[pnum].HoldItem._ivalue + gt;\r\n\t\t\t\tif (ig <= GOLD_MAX_LIMIT) {\r\n\t\t\t\t\tplr[pnum].InvList[il]._ivalue = ig;\r\n\t\t\t\t\tplr[pnum]._pGold += plr[pnum].HoldItem._ivalue;\r\n\t\t\t\t\tif (ig >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\t\tplr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\t\telse if (ig <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\t\tplr[pnum].InvList[il]._iCurs = ICURS_GOLD_SMALL;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tplr[pnum].InvList[il]._iCurs = ICURS_GOLD_MEDIUM;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tig = GOLD_MAX_LIMIT - gt;\r\n\t\t\t\t\tplr[pnum]._pGold += ig;\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue -= ig;\r\n\t\t\t\t\tplr[pnum].InvList[il]._ivalue = GOLD_MAX_LIMIT;\r\n\t\t\t\t\tplr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\t\t// BUGFIX: incorrect values here are leftover from beta\r\n\t\t\t\t\tif (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\t\tcn = ICURS_GOLD_LARGE + CURSOR_FIRSTITEM;\r\n\t\t\t\t\telse if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\t\tcn = ICURS_GOLD_SMALL + CURSOR_FIRSTITEM;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tcn = ICURS_GOLD_MEDIUM + CURSOR_FIRSTITEM;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\til = plr[pnum]._pNumInv;\r\n\t\t\t\tplr[pnum].InvList[il] = plr[pnum].HoldItem;\r\n\t\t\t\tplr[pnum]._pNumInv++;\r\n\t\t\t\tplr[pnum].InvGrid[yy + xx] = plr[pnum]._pNumInv;\r\n\t\t\t\tplr[pnum]._pGold += plr[pnum].HoldItem._ivalue;\r\n\t\t\t\tif (plr[pnum].HoldItem._ivalue <= GOLD_MAX_LIMIT) {\r\n\t\t\t\t\tif (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\t\tplr[pnum].InvList[il]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\t\telse if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\t\tplr[pnum].InvList[il]._iCurs = ICURS_GOLD_SMALL;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tplr[pnum].InvList[il]._iCurs = ICURS_GOLD_MEDIUM;\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplr[pnum].InvList[ii]._iCurs = ICURS_GOLD_LARGE;\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (it == 0) {\r\n\t\t\t\tplr[pnum].InvList[plr[pnum]._pNumInv] = plr[pnum].HoldItem;\r\n\t\t\t\tplr[pnum]._pNumInv++;\r\n\t\t\t\tit = plr[pnum]._pNumInv;\r\n\t\t\t} else {\r\n\t\t\t\til = it - 1;\r\n\t\t\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD)\r\n\t\t\t\t\tplr[pnum]._pGold += plr[pnum].HoldItem._ivalue;\r\n\t\t\t\tcn = SwapItem(&plr[pnum].InvList[il], &plr[pnum].HoldItem);\r\n\t\t\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD)\r\n\t\t\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\t\t\t\tif (plr[pnum].InvGrid[i] == it)\r\n\t\t\t\t\t\tplr[pnum].InvGrid[i] = 0;\r\n\t\t\t\t\tif (plr[pnum].InvGrid[i] == -it)\r\n\t\t\t\t\t\tplr[pnum].InvGrid[i] = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tii = r - SLOTXY_INV_FIRST;\r\n\t\t\tyy = 10 * (ii / 10 - ((sy - 1) >> 1));\r\n\t\t\tif (yy < 0)\r\n\t\t\t\tyy = 0;\r\n\t\t\tfor (j = 0; j < sy; j++) {\r\n\t\t\t\txx = (ii % 10 - ((sx - 1) >> 1));\r\n\t\t\t\tif (xx < 0)\r\n\t\t\t\t\txx = 0;\r\n\t\t\t\tfor (i = 0; i < sx; i++) {\r\n\t\t\t\t\tif (i != 0 || j != sy - 1)\r\n\t\t\t\t\t\tplr[pnum].InvGrid[xx + yy] = -it;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tplr[pnum].InvGrid[xx + yy] = it;\r\n\t\t\t\t\txx++;\r\n\t\t\t\t}\r\n\t\t\t\tyy += 10;\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\tcase ILOC_BELT:\r\n\t\tii = r - SLOTXY_BELT_FIRST;\r\n\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD) {\r\n\t\t\tif (plr[pnum].SpdList[ii]._itype != ITYPE_NONE) {\r\n\t\t\t\tif (plr[pnum].SpdList[ii]._itype == ITYPE_GOLD) {\r\n\t\t\t\t\ti = plr[pnum].HoldItem._ivalue + plr[pnum].SpdList[ii]._ivalue;\r\n\t\t\t\t\tif (i <= GOLD_MAX_LIMIT) {\r\n\t\t\t\t\t\tplr[pnum].SpdList[ii]._ivalue += plr[pnum].HoldItem._ivalue;\r\n\t\t\t\t\t\tplr[pnum]._pGold += plr[pnum].HoldItem._ivalue;\r\n\t\t\t\t\t\tif (i >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\t\t\tplr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_LARGE;\r\n\t\t\t\t\t\telse if (i <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\t\t\tplr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_SMALL;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tplr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_MEDIUM;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ti = GOLD_MAX_LIMIT - plr[pnum].SpdList[ii]._ivalue;\r\n\t\t\t\t\t\tplr[pnum]._pGold += i;\r\n\t\t\t\t\t\tplr[pnum].HoldItem._ivalue -= i;\r\n\t\t\t\t\t\tplr[pnum].SpdList[ii]._ivalue = GOLD_MAX_LIMIT;\r\n\t\t\t\t\t\tplr[pnum].SpdList[ii]._iCurs = ICURS_GOLD_LARGE;\r\n\r\n\t\t\t\t\t\t// BUGFIX: incorrect values here are leftover from beta\r\n\t\t\t\t\t\tif (plr[pnum].HoldItem._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\t\t\t\t\t\tcn = ICURS_GOLD_LARGE + CURSOR_FIRSTITEM;\r\n\t\t\t\t\t\telse if (plr[pnum].HoldItem._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\t\t\t\t\t\tcn = ICURS_GOLD_SMALL + CURSOR_FIRSTITEM;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tcn = ICURS_GOLD_MEDIUM + CURSOR_FIRSTITEM;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplr[pnum]._pGold += plr[pnum].HoldItem._ivalue;\r\n\t\t\t\t\tcn = SwapItem(&plr[pnum].SpdList[ii], &plr[pnum].HoldItem);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tplr[pnum].SpdList[ii] = plr[pnum].HoldItem;\r\n\t\t\t\tplr[pnum]._pGold += plr[pnum].HoldItem._ivalue;\r\n\t\t\t}\r\n\t\t} else if (plr[pnum].SpdList[ii]._itype == ITYPE_NONE) {\r\n\t\t\tplr[pnum].SpdList[ii] = plr[pnum].HoldItem;\r\n\t\t} else {\r\n\t\t\tcn = SwapItem(&plr[pnum].SpdList[ii], &plr[pnum].HoldItem);\r\n\t\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD)\r\n\t\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t}\r\n\t\tdrawsbarflag = TRUE;\r\n\t\tbreak;\r\n\t}\r\n\tCalcPlrInv(pnum, TRUE);\r\n\tif (pnum == myplr) {\r\n\t\tif (cn == CURSOR_HAND)\r\n\t\t\tSetCursorPos(MouseX + (cursW >> 1), MouseY + (cursH >> 1));\r\n\t\tSetCursor_(cn);\r\n\t}\r\n}\r\n\r\nvoid CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId)\r\n{\r\n\tPlayerStruct *p;\r\n\r\n\tRecreateItem(MAXITEMS, idx, wCI, seed, 0);\r\n\r\n\tp = &plr[pnum];\r\n\tp->HoldItem = item[MAXITEMS];\r\n\r\n\tif (bId) {\r\n\t\tp->HoldItem._iIdentified = TRUE;\r\n\t}\r\n\r\n\tif (bLoc < NUM_INVLOC) {\r\n\t\tp->InvBody[bLoc] = p->HoldItem;\r\n\r\n\t\tif (bLoc == INVLOC_HAND_LEFT && p->HoldItem._iLoc == ILOC_TWOHAND) {\r\n\t\t\tp->InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE;\r\n\t\t} else if (bLoc == INVLOC_HAND_RIGHT && p->HoldItem._iLoc == ILOC_TWOHAND) {\r\n\t\t\tp->InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE;\r\n\t\t}\r\n\t}\r\n\r\n\tCalcPlrInv(pnum, TRUE);\r\n}\r\n\r\nvoid CheckInvCut(int pnum, int mx, int my)\r\n{\r\n\tint r;\r\n\tBOOL done;\r\n\tchar ii;\r\n\tint iv, i, j, offs, ig;\r\n\r\n\tif (plr[pnum]._pmode > PM_WALK3) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (dropGoldFlag) {\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tdropGoldValue = 0;\r\n\t}\r\n\r\n\tdone = FALSE;\r\n\r\n\tfor (r = 0; (DWORD)r < NUM_XY_SLOTS && !done; r++) {\r\n\t\t// check which inventory rectangle the mouse is in, if any\r\n\t\tif (mx >= InvRect[r].X\r\n\t\t    && mx < InvRect[r].X + (INV_SLOT_SIZE_PX + 1)\r\n\t\t    && my >= InvRect[r].Y - (INV_SLOT_SIZE_PX + 1)\r\n\t\t    && my < InvRect[r].Y) {\r\n\t\t\tdone = TRUE;\r\n\t\t\tr--;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!done) {\r\n\t\t// not on an inventory slot rectangle\r\n\t\treturn;\r\n\t}\r\n\r\n\tplr[pnum].HoldItem._itype = ITYPE_NONE;\r\n\r\n\tif (\r\n\t    r >= SLOTXY_HEAD_FIRST\r\n\t    && r <= SLOTXY_HEAD_LAST\r\n\t    && plr[pnum].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) {\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_HEAD);\r\n\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HEAD];\r\n\t\tplr[pnum].InvBody[INVLOC_HEAD]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (\r\n\t    r == SLOTXY_RING_LEFT\r\n\t    && plr[pnum].InvBody[INVLOC_RING_LEFT]._itype != ITYPE_NONE) {\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_RING_LEFT);\r\n\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_RING_LEFT];\r\n\t\tplr[pnum].InvBody[INVLOC_RING_LEFT]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (\r\n\t    r == SLOTXY_RING_RIGHT\r\n\t    && plr[pnum].InvBody[INVLOC_RING_RIGHT]._itype != ITYPE_NONE) {\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_RING_RIGHT);\r\n\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_RING_RIGHT];\r\n\t\tplr[pnum].InvBody[INVLOC_RING_RIGHT]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (\r\n\t    r == SLOTXY_AMULET\r\n\t    && plr[pnum].InvBody[INVLOC_AMULET]._itype != ITYPE_NONE) {\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_AMULET);\r\n\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_AMULET];\r\n\t\tplr[pnum].InvBody[INVLOC_AMULET]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (\r\n\t    r >= SLOTXY_HAND_LEFT_FIRST\r\n\t    && r <= SLOTXY_HAND_LEFT_LAST\r\n\t    && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_HAND_LEFT);\r\n\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_LEFT];\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (\r\n\t    r >= SLOTXY_HAND_RIGHT_FIRST\r\n\t    && r <= SLOTXY_HAND_RIGHT_LAST\r\n\t    && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_HAND_RIGHT);\r\n\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_HAND_RIGHT];\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (\r\n\t    r >= SLOTXY_CHEST_FIRST\r\n\t    && r <= SLOTXY_CHEST_LAST\r\n\t    && plr[pnum].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE) {\r\n\t\tNetSendCmdDelItem(FALSE, INVLOC_CHEST);\r\n\t\tplr[pnum].HoldItem = plr[pnum].InvBody[INVLOC_CHEST];\r\n\t\tplr[pnum].InvBody[INVLOC_CHEST]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (r >= SLOTXY_INV_FIRST && r <= SLOTXY_INV_LAST) {\r\n\t\tig = r - SLOTXY_INV_FIRST;\r\n\t\tii = plr[pnum].InvGrid[ig];\r\n\t\tif (ii != 0) {\r\n\t\t\tiv = ii;\r\n\t\t\tif (ii <= 0) {\r\n\t\t\t\tiv = -ii;\r\n\t\t\t}\r\n\r\n\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\t\t\tif (plr[pnum].InvGrid[i] == iv || plr[pnum].InvGrid[i] == -iv) {\r\n\t\t\t\t\tplr[pnum].InvGrid[i] = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tiv--;\r\n\r\n\t\t\tplr[pnum].HoldItem = plr[pnum].InvList[iv];\r\n\t\t\tplr[pnum]._pNumInv--;\r\n\r\n\t\t\tif (plr[pnum]._pNumInv > 0 && plr[pnum]._pNumInv != iv) {\r\n\t\t\t\tplr[pnum].InvList[iv] = plr[pnum].InvList[plr[pnum]._pNumInv];\r\n\r\n\t\t\t\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\t\t\t\tif (plr[pnum].InvGrid[j] == plr[pnum]._pNumInv + 1) {\r\n\t\t\t\t\t\tplr[pnum].InvGrid[j] = iv + 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (plr[pnum].InvGrid[j] == -(plr[pnum]._pNumInv + 1)) {\r\n\t\t\t\t\t\tplr[pnum].InvGrid[j] = -iv - 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (r >= SLOTXY_BELT_FIRST) {\r\n\t\toffs = r - SLOTXY_BELT_FIRST;\r\n\t\tif (plr[pnum].SpdList[offs]._itype != ITYPE_NONE) {\r\n\t\t\tplr[pnum].HoldItem = plr[pnum].SpdList[offs];\r\n\t\t\tplr[pnum].SpdList[offs]._itype = ITYPE_NONE;\r\n\t\t\tdrawsbarflag = TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum].HoldItem._itype != ITYPE_NONE) {\r\n\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD) {\r\n\t\t\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\t\t}\r\n\r\n\t\tCalcPlrInv(pnum, TRUE);\r\n\t\tCheckItemStats(pnum);\r\n\r\n\t\tif (pnum == myplr) {\r\n\t\t\tPlaySFX(IS_IGRAB);\r\n\t\t\tSetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\t// BUGFIX: should be `my - (cursH >> 1)`, was `MouseY - (cursH >> 1)`.\r\n\t\t\tSetCursorPos(mx - (cursW >> 1), MouseY - (cursH >> 1));\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid inv_update_rem_item(int pnum, BYTE iv)\r\n{\r\n\tif (iv < NUM_INVLOC) {\r\n\t\tplr[pnum].InvBody[iv]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tif (plr[pnum]._pmode != PM_DEATH) {\r\n\t\tCalcPlrInv(pnum, TRUE);\r\n\t} else {\r\n\t\tCalcPlrInv(pnum, FALSE);\r\n\t}\r\n}\r\n\r\nvoid RemoveInvItem(int pnum, int iv)\r\n{\r\n\tint i, j;\r\n\r\n\tiv++;\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\tif (plr[pnum].InvGrid[i] == iv || plr[pnum].InvGrid[i] == -iv) {\r\n\t\t\tplr[pnum].InvGrid[i] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tiv--;\r\n\tplr[pnum]._pNumInv--;\r\n\r\n\tif (plr[pnum]._pNumInv > 0 && plr[pnum]._pNumInv != iv) {\r\n\t\tplr[pnum].InvList[iv] = plr[pnum].InvList[plr[pnum]._pNumInv];\r\n\r\n\t\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\t\tif (plr[pnum].InvGrid[j] == plr[pnum]._pNumInv + 1) {\r\n\t\t\t\tplr[pnum].InvGrid[j] = iv + 1;\r\n\t\t\t}\r\n\t\t\tif (plr[pnum].InvGrid[j] == -(plr[pnum]._pNumInv + 1)) {\r\n\t\t\t\tplr[pnum].InvGrid[j] = -(iv + 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tCalcPlrScrolls(pnum);\r\n\r\n\tif (plr[pnum]._pRSplType == RSPLTYPE_SCROLL) {\r\n\t\tif (plr[pnum]._pRSpell != SPL_INVALID) {\r\n\t\t\t// BUGFIX: Cast the literal `1` to `unsigned __int64` to make that bitshift 64bit\r\n\t\t\t// this causes the last 4 skills to not reset correctly after use\r\n\t\t\t// replace with SPELLBIT(plr[pnum]._pRSpell)\r\n\t\t\tif (!(\r\n\t\t\t        plr[pnum]._pScrlSpells\r\n\t\t\t        & (1 << (plr[pnum]._pRSpell - 1)))) {\r\n\t\t\t\tplr[pnum]._pRSpell = SPL_INVALID;\r\n\t\t\t}\r\n\r\n\t\t\tforce_redraw = 255;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\n/**\r\n * @brief This destroyes all items except gold\r\n */\r\nBOOL inv_diablo_to_hellfire(int pnum)\r\n{\r\n\tItemStruct tmp;\r\n\tItemStruct *item;\r\n\tint i, old_item_cnt, new_item_index;\r\n\r\n\tif (plr[pnum]._pgfxnum != 0) {\r\n\t\tplr[pnum]._pgfxnum = 0;\r\n\t\tplr[pnum]._pGFXLoad = 0;\r\n\t\tSetPlrAnims(pnum);\r\n\t}\r\n\tfor (i = 0, item = plr[pnum].InvBody; i < NUM_INVLOC; i++, item++) {\r\n\t\titem->_itype = ITYPE_NONE;\r\n\t}\r\n\told_item_cnt = plr[pnum]._pNumInv;\r\n\tmemset(plr[pnum].InvGrid, 0, sizeof(plr[pnum].InvGrid));\r\n\tplr[pnum]._pNumInv = 0;\r\n\tfor (i = 0; i < old_item_cnt; i++) {\r\n\t\titem = &plr[pnum].InvList[i];\r\n\t\tif (item->_itype == ITYPE_GOLD) {\r\n\t\t\tnew_item_index = plr[pnum]._pNumInv;\r\n\t\t\t// BUGFIX: new_item_index may be greater or equal to NUM_INV_GRID_ELEM\r\n\t\t\ttmp = *item;\r\n\t\t\titem->_itype = ITYPE_NONE;\r\n\t\t\tplr[pnum].InvList[new_item_index] = tmp;\r\n\t\t\tplr[pnum]._pNumInv++;\r\n\t\t\tplr[pnum].InvGrid[i] = plr[pnum]._pNumInv;\r\n\t\t} else {\r\n\t\t\titem->_itype = ITYPE_NONE;\r\n\t\t}\r\n\t};\r\n\tfor (i = 0, item = plr[pnum].SpdList; i < MAXBELTITEMS; i++, item++) {\r\n\t\titem->_itype = ITYPE_NONE;\r\n\t}\r\n\tCalcPlrItemVals(pnum, FALSE);\r\n\treturn FALSE;\r\n}\r\n#endif\r\n\r\nvoid RemoveSpdBarItem(int pnum, int iv)\r\n{\r\n\tplr[pnum].SpdList[iv]._itype = ITYPE_NONE;\r\n\r\n\tCalcPlrScrolls(pnum);\r\n\r\n\tif (plr[pnum]._pRSplType == RSPLTYPE_SCROLL) {\r\n\t\tif (plr[pnum]._pRSpell != SPL_INVALID) {\r\n\t\t\t// BUGFIX: Cast the literal `1` to `unsigned __int64` to make that bitshift 64bit\r\n\t\t\t// this causes the last 4 skills to not reset correctly after use\r\n\t\t\t// replace with SPELLBIT(plr[pnum]._pRSpell)\r\n\t\t\tif (!(\r\n\t\t\t        plr[pnum]._pScrlSpells\r\n\t\t\t        & (1 << (plr[pnum]._pRSpell - 1)))) {\r\n\t\t\t\tplr[pnum]._pRSpell = SPL_INVALID;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tforce_redraw = 255;\r\n}\r\n\r\nvoid CheckInvItem()\r\n{\r\n\tif (pcurs >= CURSOR_FIRSTITEM) {\r\n\t\tCheckInvPaste(myplr, MouseX, MouseY);\r\n\t} else {\r\n\t\tCheckInvCut(myplr, MouseX, MouseY);\r\n\t}\r\n}\r\n\r\n/**\r\n * Check for interactions with belt\r\n */\r\nvoid CheckInvScrn()\r\n{\r\n\tif (MouseX > 190 + PANEL_LEFT && MouseX < 437 + PANEL_LEFT\r\n\t    && MouseY > PANEL_TOP && MouseY < 33 + PANEL_TOP) {\r\n\t\tCheckInvItem();\r\n\t}\r\n}\r\n\r\nvoid CheckItemStats(int pnum)\r\n{\r\n\tPlayerStruct *p = &plr[pnum];\r\n\r\n\tp->HoldItem._iStatFlag = FALSE;\r\n\r\n\tif (p->_pStrength >= p->HoldItem._iMinStr\r\n\t    && p->_pMagic >= p->HoldItem._iMinMag\r\n\t    && p->_pDexterity >= p->HoldItem._iMinDex) {\r\n\t\tp->HoldItem._iStatFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid CheckBookLevel(int pnum)\r\n{\r\n\tint slvl;\r\n\r\n\tif (plr[pnum].HoldItem._iMiscId == IMISC_BOOK) {\r\n\t\tplr[pnum].HoldItem._iMinMag = spelldata[plr[pnum].HoldItem._iSpell].sMinInt;\r\n\t\tslvl = plr[pnum]._pSplLvl[plr[pnum].HoldItem._iSpell];\r\n\t\twhile (slvl != 0) {\r\n\t\t\tplr[pnum].HoldItem._iMinMag += 20 * plr[pnum].HoldItem._iMinMag / 100;\r\n\t\t\tslvl--;\r\n\t\t\tif (plr[pnum].HoldItem._iMinMag + 20 * plr[pnum].HoldItem._iMinMag / 100 > 255) {\r\n\t\t\t\tplr[pnum].HoldItem._iMinMag = -1;\r\n\t\t\t\tslvl = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CheckQuestItem(int pnum)\r\n{\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_OPTAMULET)\r\n\t\tquests[Q_BLIND]._qactive = QUEST_DONE;\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_MUSHROOM && quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && quests[Q_MUSHROOM]._qvar1 == QS_MUSHSPAWNED) {\r\n#ifndef SPAWN\r\n\t\tsfxdelay = 10;\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR) { // BUGFIX: Voice for this quest might be wrong in MP\r\n\t\t\tsfxdnum = PS_WARR95;\r\n\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE95;\r\n\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE95;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK95;\r\n\t\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE95;\r\n\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR95;\r\n\t\t}\r\n#endif\r\n#endif\r\n\t\tquests[Q_MUSHROOM]._qvar1 = QS_MUSHPICKED;\r\n\t}\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_ANVIL) {\r\n\t\tif (quests[Q_ANVIL]._qactive == QUEST_INIT) {\r\n\t\t\tquests[Q_ANVIL]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_ANVIL]._qvar1 = 1;\r\n\t\t}\r\n#ifndef SPAWN\r\n\t\tif (quests[Q_ANVIL]._qlog == TRUE) {\r\n\t\t\tsfxdelay = 10;\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tsfxdnum = PS_WARR89;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tsfxdnum = PS_ROGUE89;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tsfxdnum = PS_MAGE89;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tsfxdnum = PS_MONK89;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tsfxdnum = PS_ROGUE89;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tsfxdnum = PS_WARR89;\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n#endif\r\n\t}\r\n#ifndef SPAWN\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_GLDNELIX) {\r\n\t\tsfxdelay = 30;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR88;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE88;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE88;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK88;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE88;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR88;\r\n\t\t}\r\n#endif\r\n\t}\r\n#endif\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_ROCK) {\r\n\t\tif (quests[Q_ROCK]._qactive == QUEST_INIT) {\r\n\t\t\tquests[Q_ROCK]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_ROCK]._qvar1 = 1;\r\n\t\t}\r\n#ifndef SPAWN\r\n\t\tif (quests[Q_ROCK]._qlog == TRUE) {\r\n\t\t\tsfxdelay = 10;\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tsfxdnum = PS_WARR87;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tsfxdnum = PS_ROGUE87;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tsfxdnum = PS_MAGE87;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tsfxdnum = PS_MONK87;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tsfxdnum = PS_ROGUE87;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tsfxdnum = PS_WARR87;\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n#endif\r\n\t}\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_ARMOFVAL) {\r\n\t\tquests[Q_BLOOD]._qactive = QUEST_DONE;\r\n#ifndef SPAWN\r\n\t\tsfxdelay = 20;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR91;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE91;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE91;\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK91;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE91;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR91;\r\n#endif\r\n\t\t}\r\n#endif\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_MAPOFDOOM) {\r\n\t\tquests[Q_GRAVE]._qlog = FALSE;\r\n\t\tquests[Q_GRAVE]._qactive = QUEST_ACTIVE;\r\n\t\tquests[Q_GRAVE]._qvar1 = 1;\r\n\t\tsfxdelay = 10;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR79;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE79;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE79;\r\n#endif\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK79;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE79;\r\n#endif\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR79;\r\n\t\t}\r\n\t}\r\n\tif (plr[pnum].HoldItem.IDidx == IDI_NOTE1 || plr[pnum].HoldItem.IDidx == IDI_NOTE2 || plr[pnum].HoldItem.IDidx == IDI_NOTE3) {\r\n\t\tint mask, idx, item_num;\r\n\t\tint n1, n2, n3;\r\n\t\tItemStruct tmp;\r\n\t\tmask = 0;\r\n\t\tidx = plr[pnum].HoldItem.IDidx;\r\n\t\tif (PlrHasItem(pnum, IDI_NOTE1, n1) || idx == IDI_NOTE1)\r\n\t\t\tmask = 1;\r\n\t\tif (PlrHasItem(pnum, IDI_NOTE2, n2) || idx == IDI_NOTE2)\r\n\t\t\tmask |= 2;\r\n\t\tif (PlrHasItem(pnum, IDI_NOTE3, n3) || idx == IDI_NOTE3)\r\n\t\t\tmask |= 4;\r\n\t\tif (mask == 7) {\r\n\t\t\tsfxdelay = 10;\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tsfxdnum = PS_WARR46;\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tsfxdnum = PS_ROGUE46;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tsfxdnum = PS_MAGE46;\r\n#endif\r\n\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tsfxdnum = PS_MONK46;\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tsfxdnum = PS_ROGUE46;\r\n#endif\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tsfxdnum = PS_WARR46;\r\n\t\t\t}\r\n\t\t\tswitch (idx) {\r\n\t\t\tcase IDI_NOTE1:\r\n\t\t\t\tPlrHasItem(pnum, IDI_NOTE2, n2);\r\n\t\t\t\tRemoveInvItem(pnum, n2);\r\n\t\t\t\tPlrHasItem(pnum, IDI_NOTE3, n3);\r\n\t\t\t\tRemoveInvItem(pnum, n3);\r\n\t\t\t\tbreak;\r\n\t\t\tcase IDI_NOTE2:\r\n\t\t\t\tPlrHasItem(pnum, IDI_NOTE1, n1);\r\n\t\t\t\tRemoveInvItem(pnum, n1);\r\n\t\t\t\tPlrHasItem(pnum, IDI_NOTE3, n3);\r\n\t\t\t\tRemoveInvItem(pnum, n3);\r\n\t\t\t\tbreak;\r\n\t\t\tcase IDI_NOTE3:\r\n\t\t\t\tPlrHasItem(pnum, IDI_NOTE1, n1);\r\n\t\t\t\tRemoveInvItem(pnum, n1);\r\n\t\t\t\tPlrHasItem(pnum, IDI_NOTE2, n2);\r\n\t\t\t\tRemoveInvItem(pnum, n2);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\titem_num = itemactive[0];\r\n\t\t\ttmp = item[item_num];\r\n\t\t\tGetItemAttrs(item_num, IDI_FULLNOTE, 16);\r\n\t\t\tSetupItem(item_num);\r\n\t\t\tplr[pnum].HoldItem = item[item_num];\r\n\t\t\titem[item_num] = tmp;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid InvGetItem(int pnum, int ii)\r\n{\r\n\tint i;\r\n#ifdef HELLFIRE\r\n\tBOOL cursor_updated;\r\n#endif\r\n\r\n\tif (dropGoldFlag) {\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tdropGoldValue = 0;\r\n\t}\r\n\r\n\tif (dItem[item[ii]._ix][item[ii]._iy] != 0) {\r\n\t\tif (myplr == pnum && pcurs >= CURSOR_FIRSTITEM)\r\n\t\t\tNetSendCmdPItem(TRUE, CMD_SYNCPUTITEM, plr[myplr]._px, plr[myplr]._py);\r\n#ifdef HELLFIRE\r\n\t\tif (item[ii]._iUid != 0)\r\n#endif\r\n\t\t\titem[ii]._iCreateInfo &= ~CF_PREGEN;\r\n\t\tplr[pnum].HoldItem = item[ii];\r\n\t\tCheckQuestItem(pnum);\r\n\t\tCheckBookLevel(pnum);\r\n\t\tCheckItemStats(pnum);\r\n#ifdef HELLFIRE\r\n\t\tcursor_updated = FALSE;\r\n\t\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD && GoldAutoPlace(pnum))\r\n\t\t\tcursor_updated = TRUE;\r\n#endif\r\n\t\tdItem[item[ii]._ix][item[ii]._iy] = 0;\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel == 21 && item[ii]._ix == CornerStone.x && item[ii]._iy == CornerStone.y) {\r\n\t\t\tCornerStone.item.IDidx = -1;\r\n\t\t\tCornerStone.item._itype = ITYPE_MISC; // BUGFIX should be ITYPE_NONE\r\n\t\t\tCornerStone.item._iSelFlag = FALSE;\r\n\t\t\tCornerStone.item._ix = 0;\r\n\t\t\tCornerStone.item._iy = 0;\r\n\t\t\tCornerStone.item._iAnimFlag = FALSE;\r\n\t\t\tCornerStone.item._iIdentified = FALSE;\r\n\t\t\tCornerStone.item._iPostDraw = FALSE;\r\n\t\t}\r\n#endif\r\n\t\ti = 0;\r\n\t\twhile (i < numitems) {\r\n\t\t\tif (itemactive[i] == ii) {\r\n\t\t\t\tDeleteItem(itemactive[i], i);\r\n\t\t\t\ti = 0;\r\n\t\t\t} else {\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpcursitem = -1;\r\n#ifdef HELLFIRE\r\n\t\tif (!cursor_updated)\r\n#endif\r\n\t\t\tSetCursor_(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t}\r\n}\r\n\r\nvoid AutoGetItem(int pnum, int ii)\r\n{\r\n\tint i, idx;\r\n\tint w, h;\r\n\tBOOL done;\r\n\r\n\tif (dropGoldFlag) {\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tdropGoldValue = 0;\r\n\t}\r\n\r\n\tif (ii != MAXITEMS) {\r\n\t\tif (dItem[item[ii]._ix][item[ii]._iy] == 0)\r\n\t\t\treturn;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (item[ii]._iUid != 0)\r\n#endif\r\n\t\titem[ii]._iCreateInfo &= ~CF_PREGEN;\r\n\tplr[pnum].HoldItem = item[ii]; /// BUGFIX: overwrites cursor item, allowing for belt dupe bug\r\n\tCheckQuestItem(pnum);\r\n\tCheckBookLevel(pnum);\r\n\tCheckItemStats(pnum);\r\n\tSetICursor(plr[pnum].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\tif (plr[pnum].HoldItem._itype == ITYPE_GOLD) {\r\n\t\tdone = GoldAutoPlace(pnum);\r\n#ifdef HELLFIRE\r\n\t\tif (!done)\r\n\t\t\titem[ii]._ivalue = plr[pnum].HoldItem._ivalue;\r\n#endif\r\n\t} else {\r\n\t\tdone = FALSE;\r\n\t\tif (((plr[pnum]._pgfxnum & 0xF) == ANIM_ID_UNARMED || (plr[pnum]._pgfxnum & 0xF) == ANIM_ID_UNARMED_SHIELD\r\n#ifdef HELLFIRE\r\n\t\t        || plr[pnum]._pClass == PC_BARD && ((plr[pnum]._pgfxnum & 0xF) == ANIM_ID_MACE || (plr[pnum]._pgfxnum & 0xF) == ANIM_ID_SWORD)\r\n#endif\r\n\t\t            )\r\n\t\t    && plr[pnum]._pmode <= PM_WALK3) {\r\n\t\t\tif (plr[pnum].HoldItem._iStatFlag) {\r\n\t\t\t\tif (plr[pnum].HoldItem._iClass == ICLASS_WEAPON) {\r\n\t\t\t\t\tdone = WeaponAutoPlace(pnum);\r\n\t\t\t\t\tif (done)\r\n\t\t\t\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!done) {\r\n\t\t\tw = icursW28;\r\n\t\t\th = icursH28;\r\n\t\t\tif (w == 1 && h == 1) {\r\n\t\t\t\tidx = plr[pnum].HoldItem.IDidx;\r\n\t\t\t\tif (plr[pnum].HoldItem._iStatFlag && AllItemsList[idx].iUsable) {\r\n\t\t\t\t\tfor (i = 0; i < MAXBELTITEMS && !done; i++) {\r\n\t\t\t\t\t\tif (plr[pnum].SpdList[i]._itype == ITYPE_NONE) {\r\n\t\t\t\t\t\t\tplr[pnum].SpdList[i] = plr[pnum].HoldItem;\r\n\t\t\t\t\t\t\tCalcPlrScrolls(pnum);\r\n\t\t\t\t\t\t\tdrawsbarflag = TRUE;\r\n\t\t\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 30; i <= 39 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 20; i <= 29 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 10; i <= 19 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 0; i <= 9 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (w == 1 && h == 2) {\r\n\t\t\t\tfor (i = 29; i >= 20 && !done; i--) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 9; i >= 0 && !done; i--) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 19; i >= 10 && !done; i--) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (w == 1 && h == 3) {\r\n\t\t\t\tfor (i = 0; i < 20 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (w == 2 && h == 2) {\r\n\t\t\t\tfor (i = 0; i < 10 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, AP2x2Tbl[i], w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 21; i < 29 && !done; i += 2) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 1; i < 9 && !done; i += 2) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 10; i < 19 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (w == 2 && h == 3) {\r\n\t\t\t\tfor (i = 0; i < 9 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t\tfor (i = 10; i < 19 && !done; i++) {\r\n\t\t\t\t\tdone = AutoPlace(pnum, i, w, h, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (done) {\r\n\t\tdItem[item[ii]._ix][item[ii]._iy] = 0;\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel == 21 && item[ii]._ix == CornerStone.x && item[ii]._iy == CornerStone.y) {\r\n\t\t\tCornerStone.item.IDidx = -1;\r\n\t\t\tCornerStone.item._itype = ITYPE_MISC;\r\n\t\t\tCornerStone.item._iSelFlag = FALSE;\r\n\t\t\tCornerStone.item._ix = 0;\r\n\t\t\tCornerStone.item._iy = 0;\r\n\t\t\tCornerStone.item._iAnimFlag = FALSE;\r\n\t\t\tCornerStone.item._iIdentified = FALSE;\r\n\t\t\tCornerStone.item._iPostDraw = FALSE;\r\n\t\t}\r\n#endif\r\n\t\ti = 0;\r\n\t\twhile (i < numitems) {\r\n\t\t\tif (itemactive[i] == ii) {\r\n\t\t\t\tDeleteItem(itemactive[i], i);\r\n\t\t\t\ti = 0;\r\n\t\t\t} else {\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tif (pnum == myplr) {\r\n\t\t\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\t\tPlaySFX(random_(0, 3) + PS_WARR14);\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\t\tPlaySFX(random_(0, 3) + PS_ROGUE14);\r\n\t\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\t\tPlaySFX(random_(0, 3) + PS_MAGE14);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\t\tPlaySFX(random_(0, 3) + PS_MONK14);\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\t\t\tPlaySFX(random_(0, 3) + PS_ROGUE14);\r\n#endif\r\n\t\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tPlaySFX(random_(0, 3) + PS_WARR14);\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n\t\tplr[pnum].HoldItem = item[ii];\r\n\t\tRespawnItem(ii, TRUE);\r\n\t\tNetSendCmdPItem(TRUE, CMD_RESPAWNITEM, item[ii]._ix, item[ii]._iy);\r\n\t\tplr[pnum].HoldItem._itype = ITYPE_NONE;\r\n#ifdef HELLFIRE\r\n\t\tNewCursor(CURSOR_HAND);\r\n#endif\r\n\t}\r\n}\r\n\r\nint FindGetItem(int idx, WORD ci, int iseed)\r\n{\r\n\tint i, ii;\r\n\r\n\ti = 0;\r\n\tif (numitems <= 0)\r\n\t\treturn -1;\r\n\r\n\twhile (1) {\r\n\t\tii = itemactive[i];\r\n\t\tif (item[ii].IDidx == idx && item[ii]._iSeed == iseed && item[ii]._iCreateInfo == ci)\r\n\t\t\tbreak;\r\n\r\n\t\ti++;\r\n\r\n\t\tif (i >= numitems)\r\n\t\t\treturn -1;\r\n\t}\r\n\r\n\treturn ii;\r\n}\r\n\r\nvoid SyncGetItem(int x, int y, int idx, WORD ci, int iseed)\r\n{\r\n\tint i, ii;\r\n\r\n\tif (dItem[x][y]) {\r\n\t\tii = dItem[x][y] - 1;\r\n\t\tif (item[ii].IDidx == idx\r\n\t\t    && item[ii]._iSeed == iseed\r\n\t\t    && item[ii]._iCreateInfo == ci) {\r\n\t\t\tFindGetItem(idx, ci, iseed);\r\n\t\t} else {\r\n\t\t\tii = FindGetItem(idx, ci, iseed);\r\n\t\t}\r\n\t} else {\r\n\t\tii = FindGetItem(idx, ci, iseed);\r\n\t}\r\n\r\n\tif (ii != -1) {\r\n\t\tdItem[item[ii]._ix][item[ii]._iy] = 0;\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel == 21 && item[ii]._ix == CornerStone.x && item[ii]._iy == CornerStone.y) {\r\n\t\t\tCornerStone.item.IDidx = -1;\r\n\t\t\tCornerStone.item._itype = ITYPE_MISC;\r\n\t\t\tCornerStone.item._iSelFlag = FALSE;\r\n\t\t\tCornerStone.item._ix = 0;\r\n\t\t\tCornerStone.item._iy = 0;\r\n\t\t\tCornerStone.item._iAnimFlag = FALSE;\r\n\t\t\tCornerStone.item._iIdentified = FALSE;\r\n\t\t\tCornerStone.item._iPostDraw = FALSE;\r\n\t\t}\r\n#endif\r\n\t\ti = 0;\r\n\t\twhile (i < numitems) {\r\n\t\t\tif (itemactive[i] == ii) {\r\n\t\t\t\tDeleteItem(itemactive[i], i);\r\n\t\t\t\tFindGetItem(idx, ci, iseed);\r\n#ifndef HELLFIRE\r\n\t\t\t\t/// ASSERT: assert(FindGetItem(idx,ci,iseed) == -1);\r\n\t\t\t\tFindGetItem(idx, ci, iseed); /* todo: replace with above */\r\n#endif\r\n\t\t\t\ti = 0;\r\n\t\t\t} else {\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t}\r\n\t\t/// ASSERT: assert(FindGetItem(idx, ci, iseed) == -1);\r\n\t\tFindGetItem(idx, ci, iseed); /* todo: replace with above */\r\n\t}\r\n}\r\n\r\nBOOL CanPut(int x, int y)\r\n{\r\n\tchar oi, oi2;\r\n\r\n\tif (dItem[x][y])\r\n\t\treturn FALSE;\r\n\tif (nSolidTable[dPiece[x][y]])\r\n\t\treturn FALSE;\r\n\r\n\tif (dObject[x][y] != 0) {\r\n\t\tif (object[dObject[x][y] > 0 ? dObject[x][y] - 1 : -1 - dObject[x][y]]._oSolidFlag)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\toi = dObject[x + 1][y + 1];\r\n\tif (oi > 0 && object[oi - 1]._oSelFlag != 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (oi < 0 && object[-(oi + 1)]._oSelFlag != 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\toi = dObject[x + 1][y];\r\n\tif (oi > 0) {\r\n\t\toi2 = dObject[x][y + 1];\r\n\t\tif (oi2 > 0 && object[oi - 1]._oSelFlag != 0 && object[oi2 - 1]._oSelFlag != 0)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (currlevel == 0 && dMonster[x][y] != 0)\r\n\t\treturn FALSE;\r\n\tif (currlevel == 0 && dMonster[x + 1][y + 1] != 0)\r\n\t\treturn FALSE;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL TryInvPut()\r\n{\r\n\tint dir;\r\n\r\n\tif (numitems >= MAXITEMS)\r\n\t\treturn FALSE;\r\n\r\n\tdir = GetDirection(plr[myplr]._px, plr[myplr]._py, cursmx, cursmy);\r\n\tif (CanPut(plr[myplr]._px + offset_x[dir], plr[myplr]._py + offset_y[dir])) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tdir = (dir - 1) & 7;\r\n\tif (CanPut(plr[myplr]._px + offset_x[dir], plr[myplr]._py + offset_y[dir])) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tdir = (dir + 2) & 7;\r\n\tif (CanPut(plr[myplr]._px + offset_x[dir], plr[myplr]._py + offset_y[dir])) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn CanPut(plr[myplr]._px, plr[myplr]._py);\r\n}\r\n\r\nvoid DrawInvMsg(const char *msg)\r\n{\r\n\tDWORD dwTicks;\r\n\r\n\tdwTicks = GetTickCount();\r\n\tif (dwTicks - sgdwLastTime >= 5000) {\r\n\t\tsgdwLastTime = dwTicks;\r\n\t\tErrorPlrMsg(msg);\r\n\t}\r\n}\r\n\r\nint InvPutItem(int pnum, int x, int y)\r\n{\r\n\tBOOL done;\r\n\tint d, ii;\r\n\tint i, j, l;\r\n\tint xx, yy;\r\n\tint xp, yp;\r\n\r\n\tif (numitems >= MAXITEMS)\r\n\t\treturn -1;\r\n\r\n\tif (FindGetItem(plr[pnum].HoldItem.IDidx, plr[pnum].HoldItem._iCreateInfo, plr[pnum].HoldItem._iSeed) != -1) {\r\n\t\tDrawInvMsg(\"A duplicate item has been detected.  Destroying duplicate...\");\r\n\t\tSyncGetItem(x, y, plr[pnum].HoldItem.IDidx, plr[pnum].HoldItem._iCreateInfo, plr[pnum].HoldItem._iSeed);\r\n\t}\r\n\r\n\td = GetDirection(plr[pnum]._px, plr[pnum]._py, x, y);\r\n\txx = x - plr[pnum]._px;\r\n\tyy = y - plr[pnum]._py;\r\n\tif (abs(xx) > 1 || abs(yy) > 1) {\r\n\t\tx = plr[pnum]._px + offset_x[d];\r\n\t\ty = plr[pnum]._py + offset_y[d];\r\n\t}\r\n\tif (!CanPut(x, y)) {\r\n\t\td = (d - 1) & 7;\r\n\t\tx = plr[pnum]._px + offset_x[d];\r\n\t\ty = plr[pnum]._py + offset_y[d];\r\n\t\tif (!CanPut(x, y)) {\r\n\t\t\td = (d + 2) & 7;\r\n\t\t\tx = plr[pnum]._px + offset_x[d];\r\n\t\t\ty = plr[pnum]._py + offset_y[d];\r\n\t\t\tif (!CanPut(x, y)) {\r\n\t\t\t\tdone = FALSE;\r\n\t\t\t\tfor (l = 1; l < 50 && !done; l++) {\r\n\t\t\t\t\tfor (j = -l; j <= l && !done; j++) {\r\n\t\t\t\t\t\typ = j + plr[pnum]._py;\r\n\t\t\t\t\t\tfor (i = -l; i <= l && !done; i++) {\r\n\t\t\t\t\t\t\txp = i + plr[pnum]._px;\r\n\t\t\t\t\t\t\tif (CanPut(xp, yp)) {\r\n\t\t\t\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\t\t\t\tx = xp;\r\n\t\t\t\t\t\t\t\ty = yp;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!done)\r\n\t\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 0) {\r\n\t\typ = cursmy;\r\n\t\txp = cursmx;\r\n\t\tif (plr[pnum].HoldItem._iCurs == ICURS_RUNE_BOMB && xp >= 79 && xp <= 82 && yp >= 61 && yp <= 64) {\r\n\t\t\tNetSendCmdLocParam2(0, CMD_OPENHIVE, plr[pnum]._px, plr[pnum]._py, xx, yy);\r\n\t\t\tquests[Q_FARMER]._qactive = QUEST_DONE;\r\n\t\t\tif (gbMaxPlayers != 1) {\r\n\t\t\t\tNetSendCmdQuest(TRUE, Q_FARMER);\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tif (plr[pnum].HoldItem.IDidx == IDI_MAPOFDOOM && xp >= 35 && xp <= 38 && yp >= 20 && yp <= 24) {\r\n\t\t\tNetSendCmd(FALSE, CMD_OPENCRYPT);\r\n\t\t\tquests[Q_GRAVE]._qactive = QUEST_DONE;\r\n\t\t\tif (gbMaxPlayers != 1) {\r\n\t\t\t\tNetSendCmdQuest(TRUE, Q_GRAVE);\r\n\t\t\t}\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t}\r\n#endif\r\n\tCanPut(x, y); //if (!CanPut(x, y)) {\r\n\t//\tassertion_failed(1524, \"C:\\\\Diablo\\\\Direct\\\\inv.cpp\", \"CanPut(x,y)\");\r\n\t//}\r\n\r\n\tii = itemavail[0];\r\n\tdItem[x][y] = ii + 1;\r\n\titemavail[0] = itemavail[MAXITEMS - (numitems + 1)];\r\n\titemactive[numitems] = ii;\r\n\titem[ii] = plr[pnum].HoldItem;\r\n\titem[ii]._ix = x;\r\n\titem[ii]._iy = y;\r\n\tRespawnItem(ii, TRUE);\r\n\tnumitems++;\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 21 && x == CornerStone.x && y == CornerStone.y) {\r\n\t\tCornerStone.item = item[ii];\r\n\t\tInitQTextMsg(296);\r\n\t\tquests[Q_CORNSTN]._qlog = FALSE;\r\n\t\tquests[Q_CORNSTN]._qactive = QUEST_DONE;\r\n\t}\r\n#endif\r\n\tNewCursor(CURSOR_HAND);\r\n\treturn ii;\r\n}\r\n\r\nint SyncPutItem(int pnum, int x, int y, int idx, WORD icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, DWORD ibuff\r\n#ifdef HELLFIRE\r\n    ,\r\n    int to_hit, int max_dam, int min_str, int min_mag, int min_dex, int ac\r\n#endif\r\n)\r\n{\r\n\tBOOL done;\r\n\tint d, ii;\r\n\tint i, j, l;\r\n\tint xx, yy;\r\n\tint xp, yp;\r\n\r\n\tif (numitems >= MAXITEMS)\r\n\t\treturn -1;\r\n\r\n\tif (FindGetItem(idx, icreateinfo, iseed) != -1) {\r\n\t\tDrawInvMsg(\"A duplicate item has been detected from another player.\");\r\n\t\tSyncGetItem(x, y, idx, icreateinfo, iseed);\r\n\t}\r\n\r\n\td = GetDirection(plr[pnum]._px, plr[pnum]._py, x, y);\r\n\txx = x - plr[pnum]._px;\r\n\tyy = y - plr[pnum]._py;\r\n\tif (abs(xx) > 1 || abs(yy) > 1) {\r\n\t\tx = plr[pnum]._px + offset_x[d];\r\n\t\ty = plr[pnum]._py + offset_y[d];\r\n\t}\r\n\tif (!CanPut(x, y)) {\r\n\t\td = (d - 1) & 7;\r\n\t\tx = plr[pnum]._px + offset_x[d];\r\n\t\ty = plr[pnum]._py + offset_y[d];\r\n\t\tif (!CanPut(x, y)) {\r\n\t\t\td = (d + 2) & 7;\r\n\t\t\tx = plr[pnum]._px + offset_x[d];\r\n\t\t\ty = plr[pnum]._py + offset_y[d];\r\n\t\t\tif (!CanPut(x, y)) {\r\n\t\t\t\tdone = FALSE;\r\n\t\t\t\tfor (l = 1; l < 50 && !done; l++) {\r\n\t\t\t\t\tfor (j = -l; j <= l && !done; j++) {\r\n\t\t\t\t\t\typ = j + plr[pnum]._py;\r\n\t\t\t\t\t\tfor (i = -l; i <= l && !done; i++) {\r\n\t\t\t\t\t\t\txp = i + plr[pnum]._px;\r\n\t\t\t\t\t\t\tif (CanPut(xp, yp)) {\r\n\t\t\t\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\t\t\t\tx = xp;\r\n\t\t\t\t\t\t\t\ty = yp;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!done)\r\n\t\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tCanPut(x, y);\r\n\r\n\tii = itemavail[0];\r\n\tdItem[x][y] = ii + 1;\r\n\titemavail[0] = itemavail[MAXITEMS - (numitems + 1)];\r\n\titemactive[numitems] = ii;\r\n\r\n\tif (idx == IDI_EAR) {\r\n\t\tRecreateEar(ii, icreateinfo, iseed, Id, dur, mdur, ch, mch, ivalue, ibuff);\r\n\t} else {\r\n\t\tRecreateItem(ii, idx, icreateinfo, iseed, ivalue);\r\n\t\tif (Id)\r\n\t\t\titem[ii]._iIdentified = TRUE;\r\n\t\titem[ii]._iDurability = dur;\r\n\t\titem[ii]._iMaxDur = mdur;\r\n\t\titem[ii]._iCharges = ch;\r\n\t\titem[ii]._iMaxCharges = mch;\r\n#ifdef HELLFIRE\r\n\t\titem[ii]._iPLToHit = to_hit;\r\n\t\titem[ii]._iMaxDam = max_dam;\r\n\t\titem[ii]._iMinStr = min_str;\r\n\t\titem[ii]._iMinMag = min_mag;\r\n\t\titem[ii]._iMinDex = min_dex;\r\n\t\titem[ii]._iAC = ac;\r\n#endif\r\n\t}\r\n\r\n\titem[ii]._ix = x;\r\n\titem[ii]._iy = y;\r\n\tRespawnItem(ii, TRUE);\r\n\tnumitems++;\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 21 && x == CornerStone.x && y == CornerStone.y) {\r\n\t\tCornerStone.item = item[ii];\r\n\t\tInitQTextMsg(296);\r\n\t\tquests[Q_CORNSTN]._qlog = FALSE;\r\n\t\tquests[Q_CORNSTN]._qactive = QUEST_DONE;\r\n\t}\r\n#endif\r\n\treturn ii;\r\n}\r\n\r\nchar CheckInvHLight()\r\n{\r\n\tint r, ii, nGold;\r\n\tItemStruct *pi;\r\n\tPlayerStruct *p;\r\n\tchar rv;\r\n\r\n\tfor (r = 0; (DWORD)r < NUM_XY_SLOTS; r++) {\r\n\t\tif (MouseX >= InvRect[r].X\r\n\t\t    && MouseX < InvRect[r].X + (INV_SLOT_SIZE_PX + 1)\r\n\t\t    && MouseY >= InvRect[r].Y - (INV_SLOT_SIZE_PX + 1)\r\n\t\t    && MouseY < InvRect[r].Y) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif ((DWORD)r >= NUM_XY_SLOTS)\r\n\t\treturn -1;\r\n\r\n\trv = -1;\r\n\tinfoclr = COL_WHITE;\r\n\tpi = NULL;\r\n\tp = &plr[myplr];\r\n\tClearPanel();\r\n\tif (r >= SLOTXY_HEAD_FIRST && r <= SLOTXY_HEAD_LAST) {\r\n\t\trv = INVLOC_HEAD;\r\n\t\tpi = &p->InvBody[rv];\r\n\t} else if (r == SLOTXY_RING_LEFT) {\r\n\t\trv = INVLOC_RING_LEFT;\r\n\t\tpi = &p->InvBody[rv];\r\n\t} else if (r == SLOTXY_RING_RIGHT) {\r\n\t\trv = INVLOC_RING_RIGHT;\r\n\t\tpi = &p->InvBody[rv];\r\n\t} else if (r == SLOTXY_AMULET) {\r\n\t\trv = INVLOC_AMULET;\r\n\t\tpi = &p->InvBody[rv];\r\n\t} else if (r >= SLOTXY_HAND_LEFT_FIRST && r <= SLOTXY_HAND_LEFT_LAST) {\r\n\t\trv = INVLOC_HAND_LEFT;\r\n\t\tpi = &p->InvBody[rv];\r\n\t} else if (r >= SLOTXY_HAND_RIGHT_FIRST && r <= SLOTXY_HAND_RIGHT_LAST) {\r\n\t\tpi = &p->InvBody[INVLOC_HAND_LEFT];\r\n#ifdef HELLFIRE\r\n\t\tif (pi->_itype == ITYPE_NONE || pi->_iLoc != ILOC_TWOHAND\r\n\t\t    || (p->_pClass == PC_BARBARIAN && (p->InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD || p->InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_MACE))) {\r\n#else\r\n\t\tif (pi->_itype == ITYPE_NONE || pi->_iLoc != ILOC_TWOHAND) {\r\n#endif\r\n\t\t\trv = INVLOC_HAND_RIGHT;\r\n\t\t\tpi = &p->InvBody[rv];\r\n\t\t} else {\r\n\t\t\trv = INVLOC_HAND_LEFT;\r\n\t\t}\r\n\t} else if (r >= SLOTXY_CHEST_FIRST && r <= SLOTXY_CHEST_LAST) {\r\n\t\trv = INVLOC_CHEST;\r\n\t\tpi = &p->InvBody[rv];\r\n\t} else if (r >= SLOTXY_INV_FIRST && r <= SLOTXY_INV_LAST) {\r\n\t\tr = abs(p->InvGrid[r - SLOTXY_INV_FIRST]);\r\n\t\tif (r == 0)\r\n\t\t\treturn -1;\r\n\t\tii = r - 1;\r\n\t\trv = ii + INVITEM_INV_FIRST;\r\n\t\tpi = &p->InvList[ii];\r\n\t} else if (r >= SLOTXY_BELT_FIRST) {\r\n\t\tr -= SLOTXY_BELT_FIRST;\r\n\t\tdrawsbarflag = TRUE;\r\n\t\tpi = &p->SpdList[r];\r\n\t\tif (pi->_itype == ITYPE_NONE)\r\n\t\t\treturn -1;\r\n\t\trv = r + INVITEM_BELT_FIRST;\r\n\t}\r\n\r\n\tif (pi->_itype == ITYPE_NONE)\r\n\t\treturn -1;\r\n\r\n\tif (pi->_itype == ITYPE_GOLD) {\r\n\t\tnGold = pi->_ivalue;\r\n\t\tsprintf(infostr, \"%i gold %s\", nGold, get_pieces_str(nGold));\r\n\t} else {\r\n\t\tif (pi->_iMagical == ITEM_QUALITY_MAGIC) {\r\n\t\t\tinfoclr = COL_BLUE;\r\n\t\t} else if (pi->_iMagical == ITEM_QUALITY_UNIQUE) {\r\n\t\t\tinfoclr = COL_GOLD;\r\n\t\t}\r\n\t\tstrcpy(infostr, pi->_iName);\r\n\t\tif (pi->_iIdentified) {\r\n\t\t\tstrcpy(infostr, pi->_iIName);\r\n\t\t\tPrintItemDetails(pi);\r\n\t\t} else {\r\n\t\t\tPrintItemDur(pi);\r\n\t\t}\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nvoid RemoveScroll(int pnum)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < plr[pnum]._pNumInv; i++) {\r\n\t\tif (plr[pnum].InvList[i]._itype != ITYPE_NONE\r\n\t\t    && (plr[pnum].InvList[i]._iMiscId == IMISC_SCROLL || plr[pnum].InvList[i]._iMiscId == IMISC_SCROLLT)\r\n#ifndef HELLFIRE\r\n\t\t    && plr[pnum].InvList[i]._iSpell == plr[pnum]._pRSpell) {\r\n#else\r\n\t\t    && plr[pnum].InvList[i]._iSpell == plr[pnum]._pSpell) {\r\n#endif\r\n\t\t\tRemoveInvItem(pnum, i);\r\n\t\t\tCalcPlrScrolls(pnum);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tif (plr[pnum].SpdList[i]._itype != ITYPE_NONE\r\n\t\t    && (plr[pnum].SpdList[i]._iMiscId == IMISC_SCROLL || plr[pnum].SpdList[i]._iMiscId == IMISC_SCROLLT)\r\n#ifndef HELLFIRE\r\n\t\t    && plr[pnum].SpdList[i]._iSpell == plr[pnum]._pRSpell) {\r\n#else\r\n\t\t    && plr[pnum].SpdList[i]._iSpell == plr[pnum]._pSpell) {\r\n#endif\r\n\t\t\tRemoveSpdBarItem(pnum, i);\r\n\t\t\tCalcPlrScrolls(pnum);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL UseScroll()\r\n{\r\n\tint i;\r\n\r\n\tif (pcurs != CURSOR_HAND)\r\n\t\treturn FALSE;\r\n\tif (leveltype == DTYPE_TOWN && !spelldata[plr[myplr]._pRSpell].sTownSpell)\r\n\t\treturn FALSE;\r\n\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n\t\tif (plr[myplr].InvList[i]._itype != ITYPE_NONE\r\n\t\t    && (plr[myplr].InvList[i]._iMiscId == IMISC_SCROLL || plr[myplr].InvList[i]._iMiscId == IMISC_SCROLLT)\r\n\t\t    && plr[myplr].InvList[i]._iSpell == plr[myplr]._pRSpell) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tif (plr[myplr].SpdList[i]._itype != ITYPE_NONE\r\n\t\t    && (plr[myplr].SpdList[i]._iMiscId == IMISC_SCROLL || plr[myplr].SpdList[i]._iMiscId == IMISC_SCROLLT)\r\n\t\t    && plr[myplr].SpdList[i]._iSpell == plr[myplr]._pRSpell) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid UseStaffCharge(int pnum)\r\n{\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE\r\n\t    && (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_STAFF\r\n#ifdef HELLFIRE\r\n\t        || plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_UNIQUE // BUGFIX: myplr->pnum\r\n#endif\r\n\t        )\r\n\t    && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iSpell == plr[pnum]._pRSpell\r\n\t    && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) {\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iCharges--;\r\n\t\tCalcPlrStaff(pnum);\r\n\t}\r\n}\r\n\r\nBOOL UseStaff()\r\n{\r\n\tif (pcurs == CURSOR_HAND) {\r\n\t\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE\r\n#ifdef HELLFIRE\r\n\t\t    && (plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_STAFF || plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_UNIQUE)\r\n#else\r\n\t\t    && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_STAFF\r\n#endif\r\n\t\t    && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iSpell == plr[myplr]._pRSpell\r\n\t\t    && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid StartGoldDrop()\r\n{\r\n\tinitialDropGoldIndex = pcursinvitem;\r\n\tif (pcursinvitem <= INVITEM_INV_LAST)\r\n\t\tinitialDropGoldValue = plr[myplr].InvList[pcursinvitem - INVITEM_INV_FIRST]._ivalue;\r\n\telse\r\n\t\tinitialDropGoldValue = plr[myplr].SpdList[pcursinvitem - INVITEM_BELT_FIRST]._ivalue;\r\n\tdropGoldFlag = TRUE;\r\n\tdropGoldValue = 0;\r\n\tif (talkflag)\r\n\t\tcontrol_reset_talk();\r\n}\r\n\r\nBOOL UseInvItem(int pnum, int cii)\r\n{\r\n\tint c, idata;\r\n\tItemStruct *Item;\r\n\tBOOL speedlist;\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr)\r\n\t\treturn TRUE;\r\n\tif (pcurs != CURSOR_HAND)\r\n\t\treturn TRUE;\r\n\tif (stextflag != STORE_NONE)\r\n\t\treturn TRUE;\r\n\tif (cii <= INVITEM_HAND_RIGHT) // BUGFIX: should be `cii < INVITEM_INV_FIRST`, was `cii <= INVITEM_HAND_RIGHT`.\r\n\t\treturn FALSE;\r\n\r\n\tif (cii <= INVITEM_INV_LAST) {\r\n\t\tc = cii - INVITEM_INV_FIRST;\r\n\t\tItem = &plr[pnum].InvList[c];\r\n\t\tspeedlist = FALSE;\r\n\t} else {\r\n\t\tif (talkflag)\r\n\t\t\treturn TRUE;\r\n\t\tc = cii - INVITEM_BELT_FIRST;\r\n\t\tItem = &plr[pnum].SpdList[c];\r\n\t\tspeedlist = TRUE;\r\n\t}\r\n\r\n\tswitch (Item->IDidx) {\r\n\tcase IDI_MUSHROOM:\r\n\t\tsfxdelay = 10;\r\n#ifndef SPAWN\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR95;\r\n\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE95;\r\n\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE95;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK95;\r\n\t\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE95;\r\n\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR95;\r\n\t\t}\r\n#endif\r\n#endif\r\n\t\treturn TRUE;\r\n\tcase IDI_FUNGALTM:\r\n\t\tPlaySFX(IS_IBOOK);\r\n\t\tsfxdelay = 10;\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR29;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE29;\r\n\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE29;\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK29;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE29;\r\n#endif\r\n\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR29;\r\n#endif\r\n\t\t}\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (!AllItemsList[Item->IDidx].iUsable)\r\n\t\treturn FALSE;\r\n\r\n\tif (!Item->_iStatFlag) {\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\tPlaySFX(PS_WARR13);\r\n#ifndef SPAWN\r\n\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\tPlaySFX(PS_ROGUE13);\r\n\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\tPlaySFX(PS_MAGE13);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\tPlaySFX(PS_MONK13);\r\n#ifndef SPAWN\r\n\t\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\t\tPlaySFX(PS_ROGUE13);\r\n#endif\r\n\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\tPlaySFX(PS_WARR13);\r\n#endif\r\n\t\t}\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (Item->_iMiscId == IMISC_NONE && Item->_itype == ITYPE_GOLD) {\r\n\t\tStartGoldDrop();\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (dropGoldFlag) {\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tdropGoldValue = 0;\r\n\t}\r\n\r\n\tif (Item->_iMiscId == IMISC_SCROLL && currlevel == 0 && !spelldata[Item->_iSpell].sTownSpell) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (Item->_iMiscId == IMISC_SCROLLT && currlevel == 0 && !spelldata[Item->_iSpell].sTownSpell) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (Item->_iMiscId > IMISC_RUNEFIRST && Item->_iMiscId < IMISC_RUNELAST && currlevel == 0) {\r\n\t\treturn TRUE;\r\n\t}\r\n#endif\r\n\r\n\tidata = ItemCAnimTbl[Item->_iCurs];\r\n\tif (Item->_iMiscId == IMISC_BOOK)\r\n\t\tPlaySFX(IS_RBOOK);\r\n\telse if (pnum == myplr)\r\n\t\tPlaySFX(ItemInvSnds[idata]);\r\n\r\n\tUseItem(pnum, Item->_iMiscId, Item->_iSpell);\r\n\r\n\tif (speedlist) {\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum].SpdList[c]._iMiscId == IMISC_NOTE) {\r\n\t\t\tInitQTextMsg(322);\r\n\t\t\tinvflag = FALSE;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n#endif\r\n\t\tRemoveSpdBarItem(pnum, c);\r\n\t\treturn TRUE;\r\n\t} else {\r\n\t\tif (plr[pnum].InvList[c]._iMiscId == IMISC_MAPOFDOOM)\r\n\t\t\treturn TRUE;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum].InvList[c]._iMiscId == IMISC_NOTE) {\r\n\t\t\tInitQTextMsg(322);\r\n\t\t\tinvflag = FALSE;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n#endif\r\n\t\tRemoveInvItem(pnum, c);\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nvoid DoTelekinesis()\r\n{\r\n\tif (pcursobj != -1)\r\n\t\tNetSendCmdParam1(TRUE, CMD_OPOBJT, pcursobj);\r\n\tif (pcursitem != -1)\r\n\t\tNetSendCmdGItem(TRUE, CMD_REQUESTAGITEM, myplr, myplr, pcursitem);\r\n\tif (pcursmonst != -1 && !M_Talker(pcursmonst) && monster[pcursmonst].mtalkmsg == 0)\r\n\t\tNetSendCmdParam1(TRUE, CMD_KNOCKBACK, pcursmonst);\r\n\tNewCursor(CURSOR_HAND);\r\n}\r\n\r\nint CalculateGold(int pnum)\r\n{\r\n\tint i, gold;\r\n\r\n\tgold = 0;\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tif (plr[pnum].SpdList[i]._itype == ITYPE_GOLD) {\r\n\t\t\tgold += plr[pnum].SpdList[i]._ivalue;\r\n\t\t\tforce_redraw = 255;\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < plr[pnum]._pNumInv; i++) {\r\n\t\tif (plr[pnum].InvList[i]._itype == ITYPE_GOLD)\r\n\t\t\tgold += plr[pnum].InvList[i]._ivalue;\r\n\t}\r\n\r\n\treturn gold;\r\n}\r\n\r\nBOOL DropItemBeforeTrig()\r\n{\r\n\tif (TryInvPut()) {\r\n\t\tNetSendCmdPItem(TRUE, CMD_PUTITEM, cursmx, cursmy);\r\n\t\tNewCursor(CURSOR_HAND);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n"
  },
  {
    "path": "Source/inv.h",
    "content": "/**\r\n * @file inv.h\r\n *\r\n * Interface of player inventory.\r\n */\r\n#ifndef __INV_H__\r\n#define __INV_H__\r\n\r\nextern BOOL invflag;\r\nextern BOOL drawsbarflag;\r\n\r\nvoid FreeInvGFX();\r\nvoid InitInv();\r\nvoid DrawInv();\r\nvoid DrawInvBelt();\r\nBOOL AutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag);\r\nBOOL SpecialAutoPlace(int pnum, int ii, int sx, int sy, BOOL saveflag);\r\nBOOL GoldAutoPlace(int pnum);\r\nint SwapItem(ItemStruct *a, ItemStruct *b);\r\nvoid CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId);\r\nvoid inv_update_rem_item(int pnum, BYTE iv);\r\nvoid RemoveInvItem(int pnum, int iv);\r\n#ifdef HELLFIRE\r\nBOOL inv_diablo_to_hellfire(int pnum);\r\n#endif\r\nvoid RemoveSpdBarItem(int pnum, int iv);\r\nvoid CheckInvItem();\r\nvoid CheckInvScrn();\r\nvoid CheckItemStats(int pnum);\r\nvoid InvGetItem(int pnum, int ii);\r\nvoid AutoGetItem(int pnum, int ii);\r\nint FindGetItem(int idx, WORD ci, int iseed);\r\nvoid SyncGetItem(int x, int y, int idx, WORD ci, int iseed);\r\nBOOL CanPut(int x, int y);\r\nBOOL TryInvPut();\r\nvoid DrawInvMsg(const char *msg);\r\nint InvPutItem(int pnum, int x, int y);\r\nint SyncPutItem(int pnum, int x, int y, int idx, WORD icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, DWORD ibuff\r\n#ifdef HELLFIRE\r\n    ,\r\n    int to_hit, int max_dam, int min_str, int min_mag, int min_dex, int ac\r\n#endif\r\n);\r\nchar CheckInvHLight();\r\nvoid RemoveScroll(int pnum);\r\nBOOL UseScroll();\r\nvoid UseStaffCharge(int pnum);\r\nBOOL UseStaff();\r\nBOOL UseInvItem(int pnum, int cii);\r\nvoid DoTelekinesis();\r\nint CalculateGold(int pnum);\r\nBOOL DropItemBeforeTrig();\r\n\r\n/* data */\r\n\r\nextern int AP2x2Tbl[10];\r\n\r\n#endif /* __INV_H__ */\r\n"
  },
  {
    "path": "Source/itemdat.cpp",
    "content": "/**\r\n * @file itemdat.cpp\r\n *\r\n * Implementation of all item data.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Contains the data related to each item ID. */\r\nItemDataStruct AllItemsList[] = {\r\n\t// clang-format off\r\n//_item_indexes        iRnd,          iClass,        iLoc,             iCurs,                             itype,        iItemId,            iName,                         iSName, iMinMLvl, iDurability, iMinDam, iMaxDam, iMinAC, iMaxAC, iMinStr, iMinMag, iMinDex, iFlags,            iMiscId,         iSpell,          iUsable, iValue, iMaxValue\r\n/*IDI_GOLD       */ {  IDROP_REGULAR, ICLASS_GOLD,   ILOC_UNEQUIPABLE, ICURS_GOLD,                        ITYPE_GOLD,   UITYPE_NONE,        \"Gold\",                        NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        TRUE,         0,         0 },\r\n/*IDI_WARRIOR    */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_SHORT_SWORD,                 ITYPE_SWORD,  UITYPE_NONE,        \"Short Sword\",                 NULL,          2,          20,       2,       6,      0,      0,      18,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       50,        50 },\r\n/*IDI_WARRSHLD   */ {  IDROP_NEVER,   ICLASS_ARMOR,  ILOC_ONEHAND,     ICURS_BUCKLER,                     ITYPE_SHIELD, UITYPE_NONE,        \"Buckler\",                     NULL,          2,          10,       0,       0,      3,      3,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       50,        50 },\r\n/*IDI_WARRCLUB   */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_CLUB,                        ITYPE_MACE,   UITYPE_SPIKCLUB,    \"Club\",                        NULL,          1,          20,       1,       6,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       20,        20 },\r\n/*IDI_ROGUE      */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_BOW,                   ITYPE_BOW,    UITYPE_NONE,        \"Short Bow\",                   NULL,          1,          30,       1,       4,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      100,       100 },\r\n#ifndef HELLFIRE\r\n/*IDI_SORCEROR   */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_STAFF,                 ITYPE_STAFF,  UITYPE_NONE,        \"Short Staff of Charged Bolt\", NULL,          1,          25,       2,       4,      0,      0,       0,      20,       0, ISPL_NONE,         IMISC_STAFF,     SPL_CBOLT,       FALSE,      520,       520 },\r\n#else\r\n/*IDI_SORCEROR   */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_STAFF,                 ITYPE_STAFF,  UITYPE_NONE,        \"Short Staff of Mana\",         NULL,          1,          25,       2,       4,      0,      0,       0,      20,       0, ISPL_NONE,         IMISC_STAFF,     SPL_MANA,        FALSE,      520,       520 },\r\n#endif\r\n/*IDI_CLEAVER    */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_CLEAVER,                     ITYPE_AXE,    UITYPE_CLEAVER,     \"Cleaver\",                     NULL,         10,          10,       4,      24,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,     2000,      2000 },\r\n/*IDI_SKCROWN    */ {  IDROP_NEVER,   ICLASS_ARMOR,  ILOC_HELM,        ICURS_THE_UNDEAD_CROWN,            ITYPE_HELM,   UITYPE_SKCROWN,     \"The Undead Crown\",            NULL,          0,          50,       0,       0,     15,     15,       0,       0,       0, ISPL_RNDSTEALLIFE, IMISC_UNIQUE,    SPL_NULL,        FALSE,    10000,     10000 },\r\n/*IDI_INFRARING  */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_RING,        ICURS_EMPYREAN_BAND,               ITYPE_RING,   UITYPE_INFRARING,   \"Empyrean Band\",               NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,     8000,      8000 },\r\n/*IDI_ROCK       */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_MAGIC_ROCK,                  ITYPE_MISC,   UITYPE_NONE,        \"Magic Rock\",                  NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_OPTAMULET  */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_AMULET,      ICURS_OPTIC_AMULET,                ITYPE_AMULET, UITYPE_OPTAMULET,   \"Optic Amulet\",                NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,     5000,      5000 },\r\n/*IDI_TRING      */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_RING,        ICURS_RING_OF_TRUTH,               ITYPE_RING,   UITYPE_TRING,       \"Ring of Truth\",               NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,     1000,      1000 },\r\n/*IDI_BANNER     */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_TAVERN_SIGN,                 ITYPE_MISC,   UITYPE_NONE,        \"Tavern Sign\",                 NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_HARCREST   */ {  IDROP_NEVER,   ICLASS_ARMOR,  ILOC_HELM,        ICURS_HARLEQUIN_CREST,             ITYPE_HELM,   UITYPE_HARCREST,    \"Harlequin Crest\",             NULL,          0,          15,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,       15,        20 },\r\n/*IDI_STEELVEIL  */ {  IDROP_NEVER,   ICLASS_ARMOR,  ILOC_HELM,        ICURS_VIEL_OF_STEEL,               ITYPE_HELM,   UITYPE_STEELVEIL,   \"Veil of Steel\",               NULL,          0,          60,       0,       0,     18,     18,       0,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_GLDNELIX   */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_GOLDEN_ELIXIR,               ITYPE_MISC,   UITYPE_ELIXIR,      \"Golden Elixir\",               NULL,         15,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_ANVIL      */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_ANVIL_OF_FURY,               ITYPE_MISC,   UITYPE_NONE,        \"Anvil of Fury\",               NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_MUSHROOM   */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_BLACK_MUSHROOM,              ITYPE_MISC,   UITYPE_NONE,        \"Black Mushroom\",              NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_BRAIN      */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_BRAIN,                       ITYPE_MISC,   UITYPE_NONE,        \"Brain\",                       NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_FUNGALTM   */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_FUNGAL_TOME,                 ITYPE_MISC,   UITYPE_NONE,        \"Fungal Tome\",                 NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_SPECELIX   */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SPECTRAL_ELIXIR,             ITYPE_MISC,   UITYPE_ELIXIR,      \"Spectral Elixir\",             NULL,         15,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SPECELIX,  SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_BLDSTONE   */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_BLOOD_STONE,                 ITYPE_MISC,   UITYPE_NONE,        \"Blood Stone\",                 NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n#ifndef HELLFIRE\r\n/*IDI_MAPOFDOOM  */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_MAP_OF_THE_STARS,            ITYPE_MISC,   UITYPE_MAPOFDOOM,   \"Map of the Stars\",            NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_MAPOFDOOM, SPL_NULL,        TRUE,         0,         0 },\r\n#else\r\n/*IDI_MAPOFDOOM  */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_MAP_OF_THE_STARS,            ITYPE_MISC,   UITYPE_MAPOFDOOM,   \"Cathedral Map\",               NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_MAPOFDOOM, SPL_NULL,        TRUE,         0,         0 },\r\n#endif\r\n/*IDI_EAR        */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_EAR_SORCEROR,                ITYPE_MISC,   UITYPE_NONE,        \"Heart\",                       NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_EAR,       SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_HEAL       */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_HEALING,           ITYPE_MISC,   UITYPE_NONE,        \"Potion of Healing\",           NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_HEAL,      SPL_NULL,        TRUE,        50,        50 },\r\n/*IDI_MANA       */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_MANA,              ITYPE_MISC,   UITYPE_NONE,        \"Potion of Mana\",              NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_MANA,      SPL_NULL,        TRUE,        50,        50 },\r\n/*IDI_IDENTIFY   */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Identify\",          NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_IDENTIFY,    TRUE,       200,       200 },\r\n/*IDI_PORTAL     */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Town Portal\",       NULL,          4,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_TOWN,        TRUE,       200,       200 },\r\n/*IDI_ARMOFVAL   */ {  IDROP_NEVER,   ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_ARKAINES_VALOR,              ITYPE_MARMOR, UITYPE_ARMOFVAL,    \"Arkaine's Valor\",             NULL,          0,          40,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_FULLHEAL   */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_FULL_HEALING,      ITYPE_MISC,   UITYPE_NONE,        \"Potion of Full Healing\",      NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_FULLHEAL,  SPL_NULL,        TRUE,       150,       150 },\r\n/*IDI_FULLMANA   */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        \"Potion of Full Mana\",         NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_FULLMANA,  SPL_NULL,        TRUE,       150,       150 },\r\n/*IDI_GRISWOLD   */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_BROAD_SWORD,                 ITYPE_SWORD,  UITYPE_GRISWOLD,    \"Griswold's Edge\",             NULL,          8,          50,       4,      12,      0,      0,      40,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,      750,       750 },\r\n#ifndef HELLFIRE\r\n/*IDI_LGTFORGE   */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_MACE,                        ITYPE_MACE,   UITYPE_LGTFORGE,    \"Lightforge\",                  NULL,          2,          32,       1,       8,      0,      0,      16,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,      200,       200 },\r\n#else\r\n/*IDI_LGTFORGE   */ {  IDROP_NEVER,   ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_BOVINE,                      ITYPE_HARMOR, UITYPE_BOVINE,      \"Bovine Plate\",                NULL,          0,          40,       0,       0,      0,      0,      50,       0,       0, ISPL_NONE,         IMISC_UNIQUE,    SPL_NULL,        FALSE,        0,         0 },\r\n#endif\r\n/*IDI_LAZSTAFF   */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_STAFF_OF_LAZARUS,            ITYPE_MISC,   UITYPE_LAZSTAFF,    \"Staff of Lazarus\",            NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_RESURRECT  */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Resurrect\",         NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_RESURRECT,   TRUE,       250,       250 },\r\n#ifndef HELLFIRE\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_NONE,        ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n#else\r\n/*IDI_OIL        */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_OIL,                         ITYPE_MISC,   UITYPE_NONE,        \"Blacksmith Oil\",              NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_OILBSMTH,  SPL_NULL,        TRUE,       100,       100 },\r\n/*IDI_SHORTSTAFF */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_STAFF,                 ITYPE_STAFF,  UITYPE_NONE,        \"Short Staff\",                 NULL,          1,          25,       2,       4,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       20,        20 },\r\n/*IDI_BARDSWORD  */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_SHORT_SWORD,                 ITYPE_SWORD,  UITYPE_NONE,        \"Sword\",                       NULL,          2,           8,       1,       5,      0,      0,      15,       0,      20, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       20,        20 },\r\n/*IDI_BARDDAGGER */ {  IDROP_NEVER,   ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_DAGGER,                      ITYPE_SWORD,  UITYPE_NONE,        \"Dagger\",                      NULL,          1,          16,       1,       4,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       20,        20 },\r\n/*IDI_RUNEBOMB   */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_RUNE_BOMB,                   ITYPE_MISC,   UITYPE_NONE,        \"Rune Bomb\",                   NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_THEODORE   */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_THEODORE,                    ITYPE_MISC,   UITYPE_NONE,        \"Theodore\",                    NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_AURIC      */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_AMULET,      ICURS_AURIC_AMULET,                ITYPE_MISC,   UITYPE_NONE,        \"Auric Amulet\",                NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_AURIC,     SPL_NULL,        FALSE,      100,       100 },\r\n/*IDI_NOTE1      */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_TORN_NOTE_1,                 ITYPE_MISC,   UITYPE_NONE,        \"Torn Note 1\",                 NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_NOTE2      */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_TORN_NOTE_2,                 ITYPE_MISC,   UITYPE_NONE,        \"Torn Note 2\",                 NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_NOTE3      */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_TORN_NOTE_3,                 ITYPE_MISC,   UITYPE_NONE,        \"Torn Note 3\",                 NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_FULLNOTE   */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_RECONSTRUCTED_NOTE,          ITYPE_MISC,   UITYPE_NONE,        \"Reconstructed Note\",          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NOTE,      SPL_NULL,        TRUE,         0,         0 },\r\n/*IDI_BROWNSUIT  */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_BROWN_SUIT,                  ITYPE_MISC,   UITYPE_NONE,        \"Brown Suit\",                  NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*IDI_GREYSUIT   */ {  IDROP_NEVER,   ICLASS_QUEST,  ILOC_UNEQUIPABLE, ICURS_GREY_SUIT,                   ITYPE_MISC,   UITYPE_NONE,        \"Grey Suit\",                   NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n#endif\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_HELM,        ICURS_CAP,                         ITYPE_HELM,   UITYPE_NONE,        \"Cap\",                         \"Cap\",         1,          15,       0,       0,      1,      3,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       15,        20 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_HELM,        ICURS_SKULL_CAP,                   ITYPE_HELM,   UITYPE_SKULLCAP,    \"Skull Cap\",                   \"Cap\",         4,          20,       0,       0,      2,      4,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       25,        30 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_HELM,        ICURS_HELM,                        ITYPE_HELM,   UITYPE_HELM,        \"Helm\",                        \"Helm\",        8,          30,       0,       0,      4,      6,      25,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       40,        70 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_HELM,        ICURS_FULL_HELM,                   ITYPE_HELM,   UITYPE_NONE,        \"Full Helm\",                   \"Helm\",       12,          35,       0,       0,      6,      8,      35,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       90,       130 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_HELM,        ICURS_CROWN,                       ITYPE_HELM,   UITYPE_CROWN,       \"Crown\",                       \"Crown\",      16,          40,       0,       0,      8,     12,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      200,       300 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_HELM,        ICURS_GREAT_HELM,                  ITYPE_HELM,   UITYPE_GREATHELM,   \"Great Helm\",                  \"Helm\",       20,          60,       0,       0,     10,     15,      50,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      400,       500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_CAPE,                        ITYPE_LARMOR, UITYPE_CAPE,        \"Cape\",                        \"Cape\",        1,          12,       0,       0,      1,      5,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       10,        50 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_RAGS,                        ITYPE_LARMOR, UITYPE_RAGS,        \"Rags\",                        \"Rags\",        1,           6,       0,       0,      2,      6,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        5,        25 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_CLOAK,                       ITYPE_LARMOR, UITYPE_CLOAK,       \"Cloak\",                       \"Cloak\",       2,          18,       0,       0,      3,      7,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       40,        70 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_ROBE,                        ITYPE_LARMOR, UITYPE_ROBE,        \"Robe\",                        \"Robe\",        3,          24,       0,       0,      4,      7,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       75,       125 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_QUILTED_ARMOR,               ITYPE_LARMOR, UITYPE_NONE,        \"Quilted Armor\",               \"Armor\",       4,          30,       0,       0,      7,     10,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      200,       300 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_LEATHER_ARMOR,               ITYPE_LARMOR, UITYPE_LEATHARMOR,  \"Leather Armor\",               \"Armor\",       6,          35,       0,       0,     10,     13,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      300,       400 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_HARD_LEATHER_ARMOR,          ITYPE_LARMOR, UITYPE_NONE,        \"Hard Leather Armor\",          \"Armor\",       7,          40,       0,       0,     11,     14,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      450,       550 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_STUDDED_LEATHER_ARMOR,       ITYPE_LARMOR, UITYPE_STUDARMOR,   \"Studded Leather Armor\",       \"Armor\",       9,          45,       0,       0,     15,     17,      20,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      700,       800 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_RING_MAIL,                   ITYPE_MARMOR, UITYPE_NONE,        \"Ring Mail\",                   \"Mail\",       11,          50,       0,       0,     17,     20,      25,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      900,      1100 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_CHAIN_MAIL,                  ITYPE_MARMOR, UITYPE_CHAINMAIL,   \"Chain Mail\",                  \"Mail\",       13,          55,       0,       0,     18,     22,      30,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     1250,      1750 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_SCALE_MAIL,                  ITYPE_MARMOR, UITYPE_NONE,        \"Scale Mail\",                  \"Mail\",       15,          60,       0,       0,     23,     28,      35,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     2300,      2800 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_BREAST_PLATE,                ITYPE_HARMOR, UITYPE_BREASTPLATE, \"Breast Plate\",                \"Plate\",      16,          80,       0,       0,     20,     24,      40,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     2800,      3200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_SPLINT_MAIL,                 ITYPE_MARMOR, UITYPE_NONE,        \"Splint Mail\",                 \"Mail\",       17,          65,       0,       0,     30,     35,      40,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     3250,      3750 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_FIELD_PLATE,                 ITYPE_HARMOR, UITYPE_PLATEMAIL,   \"Plate Mail\",                  \"Plate\",      19,          75,       0,       0,     42,     50,      60,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     4600,      5400 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_FIELD_PLATE,                 ITYPE_HARMOR, UITYPE_NONE,        \"Field Plate\",                 \"Plate\",      21,          80,       0,       0,     40,     45,      65,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     5800,      6200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_GOTHIC_PLATE,                ITYPE_HARMOR, UITYPE_NONE,        \"Gothic Plate\",                \"Plate\",      23,         100,       0,       0,     50,     60,      80,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     8000,     10000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ARMOR,       ICURS_FULL_PLATE_MAIL,             ITYPE_HARMOR, UITYPE_FULLPLATE,   \"Full Plate Mail\",             \"Plate\",      25,          90,       0,       0,     60,     75,      90,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     6500,      8000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ONEHAND,     ICURS_BUCKLER,                     ITYPE_SHIELD, UITYPE_BUCKLER,     \"Buckler\",                     \"Shield\",      1,          16,       0,       0,      1,      5,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       30,        70 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ONEHAND,     ICURS_SMALL_SHIELD,                ITYPE_SHIELD, UITYPE_SMALLSHIELD, \"Small Shield\",                \"Shield\",      5,          24,       0,       0,      3,      8,      25,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       90,       130 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ONEHAND,     ICURS_LARGE_SHIELD,                ITYPE_SHIELD, UITYPE_LARGESHIELD, \"Large Shield\",                \"Shield\",      9,          32,       0,       0,      5,     10,      40,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      200,       300 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ONEHAND,     ICURS_KITE_SHIELD,                 ITYPE_SHIELD, UITYPE_KITESHIELD,  \"Kite Shield\",                 \"Shield\",     14,          40,       0,       0,      8,     15,      50,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      400,       700 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ONEHAND,     ICURS_TOWER_SHIELD,                ITYPE_SHIELD, UITYPE_GOTHSHIELD,  \"Tower Shield\",                \"Shield\",     20,          50,       0,       0,     12,     20,      60,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      850,      1200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_ARMOR,  ILOC_ONEHAND,     ICURS_GOTHIC_SHIELD,               ITYPE_SHIELD, UITYPE_GOTHSHIELD,  \"Gothic Shield\",               \"Shield\",     23,          60,       0,       0,     14,     18,      80,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     2300,      2700 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_HEALING,           ITYPE_MISC,   UITYPE_NONE,        \"Potion of Healing\",           NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_HEAL,      SPL_NULL,        TRUE,        50,        50 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_FULL_HEALING,      ITYPE_MISC,   UITYPE_NONE,        \"Potion of Full Healing\",      NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_FULLHEAL,  SPL_NULL,        TRUE,       150,       150 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_MANA,              ITYPE_MISC,   UITYPE_NONE,        \"Potion of Mana\",              NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_MANA,      SPL_NULL,        TRUE,        50,        50 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        \"Potion of Full Mana\",         NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_FULLMANA,  SPL_NULL,        TRUE,       150,       150 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_REJUVENATION,      ITYPE_MISC,   UITYPE_NONE,        \"Potion of Rejuvenation\",      NULL,          3,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_REJUV,     SPL_NULL,        TRUE,       120,       120 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_POTION_OF_FULL_REJUVENATION, ITYPE_MISC,   UITYPE_NONE,        \"Potion of Full Rejuvenation\", NULL,          7,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_FULLREJUV, SPL_NULL,        TRUE,       600,       600 },\r\n#ifdef HELLFIRE\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_OIL,                         ITYPE_MISC,   UITYPE_NONE,        \"Blacksmith Oil\",              NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_OILBSMTH,  SPL_NULL,        TRUE,       100,       100 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_OIL,                         ITYPE_MISC,   UITYPE_NONE,        \"Oil of Accuracy\",             NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_OILACC,    SPL_NULL,        TRUE,       500,       500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_OIL,                         ITYPE_MISC,   UITYPE_NONE,        \"Oil of Sharpness\",            NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_OILSHARP,  SPL_NULL,        TRUE,       500,       500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_OIL,                         ITYPE_MISC,   UITYPE_NONE,        \"Oil\",                         NULL,          10,          0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_OILOF,     SPL_NULL,        TRUE,         0,         0 },\r\n#endif\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_ELIXIR_OF_STRENGTH,          ITYPE_MISC,   UITYPE_NONE,        \"Elixir of Strength\",          NULL,         15,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_ELIXSTR,   SPL_NULL,        TRUE,      5000,      5000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_ELIXIR_OF_MAGIC,             ITYPE_MISC,   UITYPE_NONE,        \"Elixir of Magic\",             NULL,         15,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_ELIXMAG,   SPL_NULL,        TRUE,      5000,      5000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_ELIXIR_OF_DEXTERITY,         ITYPE_MISC,   UITYPE_NONE,        \"Elixir of Dexterity\",         NULL,         15,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_ELIXDEX,   SPL_NULL,        TRUE,      5000,      5000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_ELIXIR_OF_VITALITY,          ITYPE_MISC,   UITYPE_NONE,        \"Elixir of Vitality\",          NULL,         20,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_ELIXVIT,   SPL_NULL,        TRUE,      5000,      5000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Healing\",           NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_HEAL,        TRUE,        50,        50 },\r\n#ifdef HELLFIRE\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Search\",            NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_SEARCH,      TRUE,        50,        50 },\r\n#endif\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Lightning\",         NULL,          4,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_LIGHTNING,   TRUE,       150,       150 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Identify\",          NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_IDENTIFY,    TRUE,       100,       100 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Resurrect\",         NULL,          1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_RESURRECT,   TRUE,       250,       250 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Fire Wall\",         NULL,          4,           0,       0,       0,      0,      0,       0,      17,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_FIREWALL,    TRUE,       400,       400 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Inferno\",           NULL,          1,           0,       0,       0,      0,      0,       0,      19,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_FLAME,       TRUE,       100,       100 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Town Portal\",       NULL,          4,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_TOWN,        TRUE,       200,       200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Flash\",             NULL,          6,           0,       0,       0,      0,      0,       0,      21,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_FLASH,       TRUE,       500,       500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Infravision\",       NULL,          8,           0,       0,       0,      0,      0,       0,      23,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_INFRA,       TRUE,       600,       600 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Phasing\",           NULL,          6,           0,       0,       0,      0,      0,       0,      25,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_RNDTELEPORT, TRUE,       200,       200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Mana Shield\",       NULL,          8,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_MANASHIELD,  TRUE,      1200,      1200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Flame Wave\",        NULL,         10,           0,       0,       0,      0,      0,       0,      29,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_WAVE,        TRUE,       650,       650 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Fireball\",          NULL,          8,           0,       0,       0,      0,      0,       0,      31,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_FIREBALL,    TRUE,       300,       300 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Stone Curse\",       NULL,          6,           0,       0,       0,      0,      0,       0,      33,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_STONE,       TRUE,       800,       800 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Chain Lightning\",   NULL,         10,           0,       0,       0,      0,      0,       0,      35,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_CHAIN,       TRUE,       750,       750 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Guardian\",          NULL,         12,           0,       0,       0,      0,      0,       0,      47,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_GUARDIAN,    TRUE,       950,       950 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Non Item\",                    NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Nova\",              NULL,         14,           0,       0,       0,      0,      0,       0,      57,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_NOVA,        TRUE,      1300,      1300 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Golem\",             NULL,         10,           0,       0,       0,      0,      0,       0,      51,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_GOLEM,       TRUE,      1100,      1100 },\r\n/*               */ {  IDROP_NEVER,   ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of None\",              NULL,         99,           0,       0,       0,      0,      0,       0,      61,       0, ISPL_NONE,         IMISC_SCROLLT,   SPL_NULL,        TRUE,      1000,      1000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Teleport\",          NULL,         14,           0,       0,       0,      0,      0,       0,      81,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_TELEPORT,    TRUE,      3000,      3000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_SCROLL_OF,                   ITYPE_MISC,   UITYPE_NONE,        \"Scroll of Apocalypse\",        NULL,         22,           0,       0,       0,      0,      0,       0,     117,       0, ISPL_NONE,         IMISC_SCROLL,    SPL_APOCA,       TRUE,      2000,      2000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_BOOK_BLUE,                   ITYPE_MISC,   UITYPE_NONE,        \"Book of \",                    NULL,          2,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_BOOK,      SPL_NULL,        TRUE,         0,         0 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_BOOK_BLUE,                   ITYPE_MISC,   UITYPE_NONE,        \"Book of \",                    NULL,          8,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_BOOK,      SPL_NULL,        TRUE,         0,         0 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_BOOK_BLUE,                   ITYPE_MISC,   UITYPE_NONE,        \"Book of \",                    NULL,         14,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_BOOK,      SPL_NULL,        TRUE,         0,         0 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_BOOK_BLUE,                   ITYPE_MISC,   UITYPE_NONE,        \"Book of \",                    NULL,         20,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_BOOK,      SPL_NULL,        TRUE,         0,         0 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_DAGGER,                      ITYPE_SWORD,  UITYPE_DAGGER,      \"Dagger\",                      \"Dagger\",      1,          16,       1,       4,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       60,        60 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_SHORT_SWORD,                 ITYPE_SWORD,  UITYPE_NONE,        \"Short Sword\",                 \"Sword\",       1,          24,       2,       6,      0,      0,      18,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      120,       120 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_FALCHION,                    ITYPE_SWORD,  UITYPE_FALCHION,    \"Falchion\",                    \"Sword\",       2,          20,       4,       8,      0,      0,      30,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      250,       250 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_SCIMITAR,                    ITYPE_SWORD,  UITYPE_SCIMITAR,    \"Scimitar\",                    \"Sword\",       4,          28,       3,       7,      0,      0,      23,       0,      23, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      200,       200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_CLAYMORE,                    ITYPE_SWORD,  UITYPE_CLAYMORE,    \"Claymore\",                    \"Sword\",       5,          36,       1,      12,      0,      0,      35,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      450,       450 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_BLADE,                       ITYPE_SWORD,  UITYPE_NONE,        \"Blade\",                       \"Blade\",       4,          30,       3,       8,      0,      0,      25,       0,      30, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      280,       280 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_SABRE,                       ITYPE_SWORD,  UITYPE_SABRE,       \"Sabre\",                       \"Sabre\",       1,          45,       1,       8,      0,      0,      17,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      170,       170 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_LONG_SWORD,                  ITYPE_SWORD,  UITYPE_LONGSWR,     \"Long Sword\",                  \"Sword\",       6,          40,       2,      10,      0,      0,      30,       0,      30, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      350,       350 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_BROAD_SWORD,                 ITYPE_SWORD,  UITYPE_BROADSWR,    \"Broad Sword\",                 \"Sword\",       8,          50,       4,      12,      0,      0,      40,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      750,       750 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_BASTARD_SWORD,               ITYPE_SWORD,  UITYPE_BASTARDSWR,  \"Bastard Sword\",               \"Sword\",      10,          60,       6,      15,      0,      0,      50,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     1000,      1000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_TWO_HANDED_SWORD,            ITYPE_SWORD,  UITYPE_TWOHANDSWR,  \"Two-Handed Sword\",            \"Sword\",      14,          75,       8,      16,      0,      0,      65,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     1800,      1800 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_GREAT_SWORD,                 ITYPE_SWORD,  UITYPE_GREATSWR,    \"Great Sword\",                 \"Sword\",      17,         100,      10,      20,      0,      0,      75,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     3000,      3000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SMALL_AXE,                   ITYPE_AXE,    UITYPE_SMALLAXE,    \"Small Axe\",                   \"Axe\",         2,          24,       2,      10,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      150,       150 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_AXE,                         ITYPE_AXE,    UITYPE_NONE,        \"Axe\",                         \"Axe\",         4,          32,       4,      12,      0,      0,      22,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      450,       450 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_LARGE_AXE,                   ITYPE_AXE,    UITYPE_LARGEAXE,    \"Large Axe\",                   \"Axe\",         6,          40,       6,      16,      0,      0,      30,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      750,       750 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_BROAD_AXE,                   ITYPE_AXE,    UITYPE_BROADAXE,    \"Broad Axe\",                   \"Axe\",         8,          50,       8,      20,      0,      0,      50,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     1000,      1000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_BATTLE_AXE,                  ITYPE_AXE,    UITYPE_BATTLEAXE,   \"Battle Axe\",                  \"Axe\",        10,          60,      10,      25,      0,      0,      65,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     1500,      1500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_GREAT_AXE,                   ITYPE_AXE,    UITYPE_GREATAXE,    \"Great Axe\",                   \"Axe\",        12,          75,      12,      30,      0,      0,      80,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     2500,      2500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_MACE,                        ITYPE_MACE,   UITYPE_MACE,        \"Mace\",                        \"Mace\",        2,          32,       1,       8,      0,      0,      16,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      200,       200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_MORNING_STAR,                ITYPE_MACE,   UITYPE_MORNSTAR,    \"Morning Star\",                \"Mace\",        3,          40,       1,      10,      0,      0,      26,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      300,       300 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_WAR_HAMMER,                  ITYPE_MACE,   UITYPE_WARHAMMER,   \"War Hammer\",                  \"Hammer\",      5,          50,       5,       9,      0,      0,      40,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      600,       600 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_SPIKED_CLUB,                 ITYPE_MACE,   UITYPE_SPIKCLUB,    \"Spiked Club\",                 \"Club\",        4,          20,       3,       6,      0,      0,      18,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      225,       225 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_CLUB,                        ITYPE_MACE,   UITYPE_SPIKCLUB,    \"Club\",                        \"Club\",        1,          20,       1,       6,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,       20,        20 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_ONEHAND,     ICURS_FLAIL,                       ITYPE_MACE,   UITYPE_FLAIL,       \"Flail\",                       \"Flail\",       7,          36,       2,      12,      0,      0,      30,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      500,       500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_MAUL,                        ITYPE_MACE,   UITYPE_MAUL,        \"Maul\",                        \"Maul\",       10,          50,       6,      20,      0,      0,      55,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      900,       900 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_BOW,                   ITYPE_BOW,    UITYPE_SHORTBOW,    \"Short Bow\",                   \"Bow\",         1,          30,       1,       4,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      100,       100 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_HUNTERS_BOW,                 ITYPE_BOW,    UITYPE_HUNTBOW,     \"Hunter's Bow\",                \"Bow\",         3,          40,       2,       5,      0,      0,      20,       0,      35, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      350,       350 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_HUNTERS_BOW,                 ITYPE_BOW,    UITYPE_LONGBOW,     \"Long Bow\",                    \"Bow\",         5,          35,       1,       6,      0,      0,      25,       0,      30, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      250,       250 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_COMPOSITE_BOW,               ITYPE_BOW,    UITYPE_COMPBOW,     \"Composite Bow\",               \"Bow\",         7,          45,       3,       6,      0,      0,      25,       0,      40, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      600,       600 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_BATTLE_BOW,            ITYPE_BOW,    UITYPE_NONE,        \"Short Battle Bow\",            \"Bow\",         9,          45,       3,       7,      0,      0,      30,       0,      50, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,      750,       750 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_LONG_WAR_BOW,                ITYPE_BOW,    UITYPE_BATTLEBOW,   \"Long Battle Bow\",             \"Bow\",        11,          50,       1,      10,      0,      0,      30,       0,      60, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     1000,      1000 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_WAR_BOW,               ITYPE_BOW,    UITYPE_NONE,        \"Short War Bow\",               \"Bow\",        15,          55,       4,       8,      0,      0,      35,       0,      70, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     1500,      1500 },\r\n/*               */ {  IDROP_DOUBLE,  ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_LONG_WAR_BOW,                ITYPE_BOW,    UITYPE_WARBOW,      \"Long War Bow\",                \"Bow\",        19,          60,       1,      14,      0,      0,      45,       0,      80, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,     2000,      2000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_STAFF,                 ITYPE_STAFF,  UITYPE_SHORTSTAFF,  \"Short Staff\",                 \"Staff\",       1,          25,       2,       4,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_STAFF,     SPL_NULL,        FALSE,       30,        30 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_LONG_STAFF,                  ITYPE_STAFF,  UITYPE_LONGSTAFF,   \"Long Staff\",                  \"Staff\",       4,          35,       4,       8,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_STAFF,     SPL_NULL,        FALSE,      100,       100 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_COMPOSITE_STAFF,             ITYPE_STAFF,  UITYPE_COMPSTAFF,   \"Composite Staff\",             \"Staff\",       6,          45,       5,      10,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_STAFF,     SPL_NULL,        FALSE,      500,       500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_SHORT_STAFF,                 ITYPE_STAFF,  UITYPE_QUARSTAFF,   \"Quarter Staff\",               \"Staff\",       9,          55,       6,      12,      0,      0,      20,       0,       0, ISPL_NONE,         IMISC_STAFF,     SPL_NULL,        FALSE,     1000,      1000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_WEAPON, ILOC_TWOHAND,     ICURS_WAR_STAFF,                   ITYPE_STAFF,  UITYPE_WARSTAFF,    \"War Staff\",                   \"Staff\",      12,          75,       8,      16,      0,      0,      30,       0,       0, ISPL_NONE,         IMISC_STAFF,     SPL_NULL,        FALSE,     1500,      1500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_RING,        ICURS_RING,                        ITYPE_RING,   UITYPE_RING,        \"Ring\",                        \"Ring\",        5,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_RING,      SPL_NULL,        FALSE,     1000,      1000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_RING,        ICURS_RING,                        ITYPE_RING,   UITYPE_RING,        \"Ring\",                        \"Ring\",       10,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_RING,      SPL_NULL,        FALSE,     1000,      1000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_RING,        ICURS_RING,                        ITYPE_RING,   UITYPE_RING,        \"Ring\",                        \"Ring\",       15,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_RING,      SPL_NULL,        FALSE,     1000,      1000 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_AMULET,      ICURS_AMULET,                      ITYPE_AMULET, UITYPE_AMULET,      \"Amulet\",                      \"Amulet\",      8,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_AMULET,    SPL_NULL,        FALSE,     1200,      1200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_AMULET,      ICURS_AMULET,                      ITYPE_AMULET, UITYPE_AMULET,      \"Amulet\",                      \"Amulet\",     16,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_AMULET,    SPL_NULL,        FALSE,     1200,      1200 },\r\n#ifdef HELLFIRE\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_RUNE_OF_FIRE,                ITYPE_MISC,   UITYPE_NONE,        \"Rune of Fire\",                \"Rune\",        1,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_RUNEF,     SPL_NULL,         TRUE,      100,       100 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_RUNE_OF_LIGHTNING,           ITYPE_MISC,   UITYPE_NONE,        \"Rune of Lightning\",           \"Rune\",        3,           0,       0,       0,      0,      0,       0,      13,       0, ISPL_NONE,         IMISC_RUNEL,     SPL_NULL,         TRUE,      200,       200 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_GREATER_RUNE_OF_FIRE,        ITYPE_MISC,   UITYPE_NONE,        \"Greater Rune of Fire\",        \"Rune\",        7,           0,       0,       0,      0,      0,       0,      42,       0, ISPL_NONE,         IMISC_GR_RUNEF,  SPL_NULL,         TRUE,      400,       400 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_GREATER_RUNE_OF_LIGHTNING,   ITYPE_MISC,   UITYPE_NONE,        \"Greater Rune of Lightning\",   \"Rune\",        7,           0,       0,       0,      0,      0,       0,      42,       0, ISPL_NONE,         IMISC_GR_RUNEL,  SPL_NULL,         TRUE,      500,       500 },\r\n/*               */ {  IDROP_REGULAR, ICLASS_MISC,   ILOC_UNEQUIPABLE, ICURS_RUNE_OF_STONE,               ITYPE_MISC,   UITYPE_NONE,        \"Rune of Stone\",               \"Rune\",        7,           0,       0,       0,      0,      0,       0,      25,       0, ISPL_NONE,         IMISC_RUNES,     SPL_NULL,         TRUE,      300,       300 },\r\n#endif\r\n/*               */ {  IDROP_NEVER,   ICLASS_NONE,   ILOC_INVALID,     ICURS_POTION_OF_FULL_MANA,         ITYPE_MISC,   UITYPE_NONE,        NULL,                          NULL,          0,           0,       0,       0,      0,      0,       0,       0,       0, ISPL_NONE,         IMISC_NONE,      SPL_NULL,        FALSE,        0,         0 },\r\n\t// clang-format on\r\n};\r\n\r\n/** Contains the data related to each item prefix. */\r\nconst PLStruct PL_Prefix[] = {\r\n\t// clang-format off\r\n\t// PLName,          PLPower,         PLParam1, PLParam2, PLMinLvl, PLIType,                                                          PLGOE,    PLDouble, PLOk,  PLMinVal, PLMaxVal, PLMultVal\r\n\t{ \"Tin\",            IPL_TOHIT_CURSE,        6,       10,        3,                       PLT_WEAP |             PLT_BOW | PLT_MISC,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -3 },\r\n\t{ \"Brass\",          IPL_TOHIT_CURSE,        1,        5,        1,                       PLT_WEAP |             PLT_BOW | PLT_MISC,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -2 },\r\n\t{ \"Bronze\",         IPL_TOHIT,              1,        5,        1,                       PLT_WEAP |             PLT_BOW | PLT_MISC,  GOE_ANY,  TRUE,     TRUE,       100,      500,         2 },\r\n\t{ \"Iron\",           IPL_TOHIT,              6,       10,        4,                       PLT_WEAP |             PLT_BOW | PLT_MISC,  GOE_ANY,  TRUE,     TRUE,       600,     1000,         3 },\r\n\t{ \"Steel\",          IPL_TOHIT,             11,       15,        6,                       PLT_WEAP |             PLT_BOW | PLT_MISC,  GOE_ANY,  TRUE,     TRUE,      1100,     1500,         5 },\r\n\t{ \"Silver\",         IPL_TOHIT,             16,       20,        9,                       PLT_WEAP |             PLT_BOW | PLT_MISC,  GOE_GOOD, TRUE,     TRUE,      1600,     2000,         7 },\r\n\t{ \"Gold\",           IPL_TOHIT,             21,       30,       12,                       PLT_WEAP |             PLT_BOW | PLT_MISC,  GOE_GOOD, TRUE,     TRUE,      2100,     3000,         9 },\r\n\t{ \"Platinum\",       IPL_TOHIT,             31,       40,       16,                       PLT_WEAP |             PLT_BOW           ,  GOE_GOOD, TRUE,     TRUE,      3100,     4000,        11 },\r\n\t{ \"Mithril\",        IPL_TOHIT,             41,       60,       20,                       PLT_WEAP |             PLT_BOW           ,  GOE_GOOD, TRUE,     TRUE,      4100,     6000,        13 },\r\n\t{ \"Meteoric\",       IPL_TOHIT,             61,       80,       23,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      6100,    10000,        15 },\r\n\t{ \"Weird\",          IPL_TOHIT,             81,      100,       35,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,     10100,    14000,        17 },\r\n\t{ \"Strange\",        IPL_TOHIT,            101,      150,       60,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,     14100,    20000,        20 },\r\n#ifdef HELLFIRE\r\n\t{ \"Useless\",        IPL_DAMP_CURSE,       100,      100,        5,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -8 },\r\n\t{ \"Bent\",           IPL_DAMP_CURSE,        50,       75,        3,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -4 },\r\n\t{ \"Weak\",           IPL_DAMP_CURSE,        25,       45,        1,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -3 },\r\n\t{ \"Jagged\",         IPL_DAMP,              20,       35,        4,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,       250,      450,         3 },\r\n\t{ \"Deadly\",         IPL_DAMP,              36,       50,        6,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,       500,      700,         4 },\r\n\t{ \"Heavy\",          IPL_DAMP,              51,       65,        9,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,       750,      950,         5 },\r\n\t{ \"Vicious\",        IPL_DAMP,              66,       80,       12,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_EVIL, TRUE,     TRUE,      1000,     1450,         8 },\r\n\t{ \"Brutal\",         IPL_DAMP,              81,       95,       16,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      1500,     1950,        10 },\r\n\t{ \"Massive\",        IPL_DAMP,              96,      110,       20,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      2000,     2450,        13 },\r\n#else\r\n\t{ \"Useless\",        IPL_DAMP_CURSE,       100,      100,        5,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -8 },\r\n\t{ \"Bent\",           IPL_DAMP_CURSE,        50,       75,        3,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -4 },\r\n\t{ \"Weak\",           IPL_DAMP_CURSE,        25,       45,        1,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -3 },\r\n\t{ \"Jagged\",         IPL_DAMP,              20,       35,        4,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,       250,      450,         3 },\r\n\t{ \"Deadly\",         IPL_DAMP,              36,       50,        6,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,       500,      700,         4 },\r\n\t{ \"Heavy\",          IPL_DAMP,              51,       65,        9,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,       750,      950,         5 },\r\n\t{ \"Vicious\",        IPL_DAMP,              66,       80,       12,                       PLT_WEAP |             PLT_BOW           ,  GOE_EVIL, TRUE,     TRUE,      1000,     1450,         8 },\r\n\t{ \"Brutal\",         IPL_DAMP,              81,       95,       16,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      1500,     1950,        10 },\r\n\t{ \"Massive\",        IPL_DAMP,              96,      110,       20,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      2000,     2450,        13 },\r\n#endif\r\n\t{ \"Savage\",         IPL_DAMP,             111,      125,       23,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      2500,     3000,        15 },\r\n\t{ \"Ruthless\",       IPL_DAMP,             126,      150,       35,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,     10100,    15000,        17 },\r\n\t{ \"Merciless\",      IPL_DAMP,             151,      175,       60,                       PLT_WEAP |             PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,     15000,    20000,        20 },\r\n\t{ \"Clumsy\",         IPL_TOHIT_DAMP_CURSE,  50,       75,        5,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -7 },\r\n\t{ \"Dull\",           IPL_TOHIT_DAMP_CURSE,  25,       45,        1,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -5 },\r\n\t{ \"Sharp\",          IPL_TOHIT_DAMP,        20,       35,        1,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     FALSE,      350,      950,         5 },\r\n\t{ \"Fine\",           IPL_TOHIT_DAMP,        36,       50,        6,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      1100,     1700,         7 },\r\n\t{ \"Warrior's\",      IPL_TOHIT_DAMP,        51,       65,       10,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  TRUE,     TRUE,      1850,     2450,        13 },\r\n\t{ \"Soldier's\",      IPL_TOHIT_DAMP,        66,       80,       15,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  TRUE,     TRUE,      2600,     3950,        17 },\r\n\t{ \"Lord's\",         IPL_TOHIT_DAMP,        81,       95,       19,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  TRUE,     TRUE,      4100,     5950,        21 },\r\n\t{ \"Knight's\",       IPL_TOHIT_DAMP,        96,      110,       23,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  TRUE,     TRUE,      6100,     8450,        26 },\r\n\t{ \"Master's\",       IPL_TOHIT_DAMP,       111,      125,       28,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  TRUE,     TRUE,      8600,    13000,        30 },\r\n\t{ \"Champion's\",     IPL_TOHIT_DAMP,       126,      150,       40,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  TRUE,     TRUE,     15200,    24000,        33 },\r\n\t{ \"King's\",         IPL_TOHIT_DAMP,       151,      175,       28,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  TRUE,     TRUE,     24100,    35000,        38 },\r\n\t{ \"Vulnerable\",     IPL_ACP_CURSE,         51,      100,        3, PLT_ARMO | PLT_SHLD                                            ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -3 },\r\n\t{ \"Rusted\",         IPL_ACP_CURSE,         25,       50,        1, PLT_ARMO | PLT_SHLD                                            ,  GOE_ANY,  TRUE,     FALSE,        0,        0,        -2 },\r\n\t{ \"Fine\",           IPL_ACP,               20,       30,        1, PLT_ARMO | PLT_SHLD                                            ,  GOE_ANY,  TRUE,     TRUE,        20,      100,         2 },\r\n\t{ \"Strong\",         IPL_ACP,               31,       40,        3, PLT_ARMO | PLT_SHLD                                            ,  GOE_ANY,  TRUE,     TRUE,       120,      200,         3 },\r\n\t{ \"Grand\",          IPL_ACP,               41,       55,        6, PLT_ARMO | PLT_SHLD                                            ,  GOE_ANY,  TRUE,     TRUE,       220,      300,         5 },\r\n\t{ \"Valiant\",        IPL_ACP,               56,       70,       10, PLT_ARMO | PLT_SHLD                                            ,  GOE_ANY,  TRUE,     TRUE,       320,      400,         7 },\r\n\t{ \"Glorious\",       IPL_ACP,               71,       90,       14, PLT_ARMO | PLT_SHLD                                            ,  GOE_GOOD, TRUE,     TRUE,       420,      600,         9 },\r\n\t{ \"Blessed\",        IPL_ACP,               91,      110,       19, PLT_ARMO | PLT_SHLD                                            ,  GOE_GOOD, TRUE,     TRUE,       620,      800,        11 },\r\n\t{ \"Saintly\",        IPL_ACP,              111,      130,       24, PLT_ARMO | PLT_SHLD                                            ,  GOE_GOOD, TRUE,     TRUE,       820,     1200,        13 },\r\n\t{ \"Awesome\",        IPL_ACP,              131,      150,       28, PLT_ARMO | PLT_SHLD                                            ,  GOE_GOOD, TRUE,     TRUE,      1220,     2000,        15 },\r\n\t{ \"Holy\",           IPL_ACP,              151,      170,       35, PLT_ARMO | PLT_SHLD                                            ,  GOE_GOOD, TRUE,     TRUE,      5200,     6000,        17 },\r\n\t{ \"Godly\",          IPL_ACP,              171,      200,       60, PLT_ARMO | PLT_SHLD                                            ,  GOE_GOOD, TRUE,     TRUE,      6200,     7000,        20 },\r\n\t{ \"Red\",            IPL_FIRERES,           10,       20,        4, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,       500,     1500,         2 },\r\n\t{ \"Crimson\",        IPL_FIRERES,           21,       30,       10, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      2100,     3000,         2 },\r\n\t{ \"Crimson\",        IPL_FIRERES,           31,       40,       16, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      3100,     4000,         2 },\r\n\t{ \"Garnet\",         IPL_FIRERES,           41,       50,       20, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      8200,    12000,         3 },\r\n\t{ \"Ruby\",           IPL_FIRERES,           51,       60,       26, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,     17100,    20000,         5 },\r\n\t{ \"Blue\",           IPL_LIGHTRES,          10,       20,        4, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,       500,     1500,         2 },\r\n\t{ \"Azure\",          IPL_LIGHTRES,          21,       30,       10, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      2100,     3000,         2 },\r\n\t{ \"Lapis\",          IPL_LIGHTRES,          31,       40,       16, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      3100,     4000,         2 },\r\n\t{ \"Cobalt\",         IPL_LIGHTRES,          41,       50,       20, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      8200,    12000,         3 },\r\n\t{ \"Sapphire\",       IPL_LIGHTRES,          51,       60,       26, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,     17100,    20000,         5 },\r\n\t{ \"White\",          IPL_MAGICRES,          10,       20,        4, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,       500,     1500,         2 },\r\n\t{ \"Pearl\",          IPL_MAGICRES,          21,       30,       10, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      2100,     3000,         2 },\r\n\t{ \"Ivory\",          IPL_MAGICRES,          31,       40,       16, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      3100,     4000,         2 },\r\n\t{ \"Crystal\",        IPL_MAGICRES,          41,       50,       20, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      8200,    12000,         3 },\r\n\t{ \"Diamond\",        IPL_MAGICRES,          51,       60,       26, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,     17100,    20000,         5 },\r\n\t{ \"Topaz\",          IPL_ALLRES,            10,       15,        8, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      2000,     5000,         3 },\r\n\t{ \"Amber\",          IPL_ALLRES,            16,       20,       12, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      7400,    10000,         3 },\r\n\t{ \"Jade\",           IPL_ALLRES,            21,       30,       18, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,     11000,    15000,         3 },\r\n\t{ \"Obsidian\",       IPL_ALLRES,            31,       40,       24, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,  GOE_ANY,  FALSE,    TRUE,     24000,    40000,         4 },\r\n\t{ \"Emerald\",        IPL_ALLRES,            41,       50,       31,            PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW           ,  GOE_ANY,  FALSE,    TRUE,     61000,    75000,         7 },\r\n\t{ \"Hyena's\",        IPL_MANA_CURSE,        11,       25,        4,                                  PLT_STAFF |           PLT_MISC,  GOE_ANY,  FALSE,    FALSE,      100,     1000,        -2 },\r\n\t{ \"Frog's\",         IPL_MANA_CURSE,         1,       10,        1,                                  PLT_STAFF |           PLT_MISC,  GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{ \"Spider's\",       IPL_MANA,              10,       15,        1,                                  PLT_STAFF |           PLT_MISC,  GOE_EVIL, FALSE,    TRUE,       500,     1000,         2 },\r\n\t{ \"Raven's\",        IPL_MANA,              15,       20,        5,                                  PLT_STAFF |           PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      1100,     2000,         3 },\r\n\t{ \"Snake's\",        IPL_MANA,              21,       30,        9,                                  PLT_STAFF |           PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      2100,     4000,         5 },\r\n\t{ \"Serpent's\",      IPL_MANA,              30,       40,       15,                                  PLT_STAFF |           PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      4100,     6000,         7 },\r\n\t{ \"Drake's\",        IPL_MANA,              41,       50,       21,                                  PLT_STAFF |           PLT_MISC,  GOE_ANY,  FALSE,    TRUE,      6100,    10000,         9 },\r\n\t{ \"Dragon's\",       IPL_MANA,              51,       60,       27,                                  PLT_STAFF |           PLT_MISC,  GOE_ANY,  FALSE,    TRUE,     10100,    15000,        11 },\r\n\t{ \"Wyrm's\",         IPL_MANA,              61,       80,       35,                                  PLT_STAFF                     ,  GOE_ANY,  FALSE,    TRUE,     15100,    19000,        12 },\r\n\t{ \"Hydra's\",        IPL_MANA,              81,      100,       60,                                  PLT_STAFF                     ,  GOE_ANY,  FALSE,    TRUE,     19100,    30000,        13 },\r\n\t{ \"Angel's\",        IPL_SPLLVLADD,          1,        1,       15,                                  PLT_STAFF                     ,  GOE_GOOD, FALSE,    TRUE,     25000,    25000,         2 },\r\n\t{ \"Arch-Angel's\",   IPL_SPLLVLADD,          2,        2,       25,                                  PLT_STAFF                     ,  GOE_GOOD, FALSE,    TRUE,     50000,    50000,         3 },\r\n\t{ \"Plentiful\",      IPL_CHARGES,            2,        2,        4,                                  PLT_STAFF                     ,  GOE_ANY,  FALSE,    TRUE,      2000,     2000,         2 },\r\n\t{ \"Bountiful\",      IPL_CHARGES,            3,        3,        9,                                  PLT_STAFF                     ,  GOE_ANY,  FALSE,    TRUE,      3000,     3000,         3 },\r\n\t{ \"Flaming\",        IPL_FIREDAM,            1,       10,        7,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  FALSE,    TRUE,      5000,     5000,         2 },\r\n\t{ \"Lightning\",      IPL_LIGHTDAM,           2,       20,       18,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  FALSE,    TRUE,     10000,    10000,         2 },\r\n#ifdef HELLFIRE\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   \r\n\t{ \"Jester's\",       IPL_JESTERS,            1,        1,        7,                       PLT_WEAP                                 ,  GOE_ANY,  FALSE,    TRUE,      1200,     1200,         3 },\r\n\t{ \"Crystalline\",    IPL_CRYSTALLINE,       30,       70,        5,                       PLT_WEAP                                 ,  GOE_ANY,  FALSE,    TRUE,      1000,     3000,         3 },\r\n\t{ \"Doppelganger's\", IPL_DOPPELGANGER,      81,       95,       11,                       PLT_WEAP | PLT_STAFF                     ,  GOE_ANY,  FALSE,    TRUE,      2000,     2400,        10 },\r\n#endif\r\n\t{ \"\",               IPL_INVALID,            0,        0,        0, 0                                                              ,  GOE_ANY,  FALSE,    FALSE,        0,        0,         0 },\r\n\t// clang-format on\r\n};\r\n\r\n/** Contains the data related to each item suffix. */\r\nconst PLStruct PL_Suffix[] = {\r\n\t// clang-format off\r\n\t// PLName,          PLPower,       PLParam1, PLParam2, PLMinLvl, PLIType,                                                             PLGOE,    PLDouble, PLOk,  PLMinVal, PLMaxVal, PLMultVal\r\n#ifdef HELLFIRE\r\n\t{  \"quality\",       IPL_DAMMOD,           1,        2,        2,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,       100,      200,         2 },\r\n\t{  \"maiming\",       IPL_DAMMOD,           3,        5,        7,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      1300,     1500,         3 },\r\n#else\r\n\t{  \"quality\",       IPL_DAMMOD,           1,        2,        2,                       PLT_WEAP |             PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,       100,      200,         2 },\r\n\t{  \"maiming\",       IPL_DAMMOD,           3,        5,        7,                       PLT_WEAP |             PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      1300,     1500,         3 },\r\n#endif\r\n\t{  \"slaying\",       IPL_DAMMOD,           6,        8,       15,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,      2600,     3000,         5 },\r\n\t{  \"gore\",          IPL_DAMMOD,           9,       12,       25,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,      4100,     5000,         8 },\r\n\t{  \"carnage\",       IPL_DAMMOD,          13,       16,       35,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,      5100,    10000,        10 },\r\n\t{  \"slaughter\",     IPL_DAMMOD,          17,       20,       60,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,     10100,    15000,        13 },\r\n\t{  \"pain\",          IPL_GETHIT_CURSE,     2,        4,        4, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -4 },\r\n\t{  \"tears\",         IPL_GETHIT_CURSE,     1,        1,        2, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"health\",        IPL_GETHIT,           1,        1,        2, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_GOOD, FALSE,    TRUE,       200,      200,         2 },\r\n\t{  \"protection\",    IPL_GETHIT,           2,        2,        6, PLT_ARMO | PLT_SHLD                                            ,     GOE_GOOD, FALSE,    TRUE,       400,      800,         4 },\r\n\t{  \"absorption\",    IPL_GETHIT,           3,        3,       12, PLT_ARMO | PLT_SHLD                                            ,     GOE_GOOD, FALSE,    TRUE,      1001,     2500,        10 },\r\n\t{  \"deflection\",    IPL_GETHIT,           4,        4,       20, PLT_ARMO                                                       ,     GOE_GOOD, FALSE,    TRUE,      2500,     6500,        15 },\r\n\t{  \"osmosis\",       IPL_GETHIT,           5,        6,       50, PLT_ARMO                                                       ,     GOE_GOOD, FALSE,    TRUE,      7500,    10000,        20 },\r\n\t{  \"frailty\",       IPL_STR_CURSE,        6,       10,        3, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -3 },\r\n#ifdef HELLFIRE\r\n\t{  \"weakness\",      IPL_STR_CURSE,        1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"strength\",      IPL_STR,              1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       200,     1000,         2 },\r\n#else\r\n\t{  \"weakness\",      IPL_STR_CURSE,        1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"strength\",      IPL_STR,              1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       200,     1000,         2 },\r\n#endif\r\n\t{  \"might\",         IPL_STR,              6,       10,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      1200,     2000,         3 },\r\n\t{  \"power\",         IPL_STR,             11,       15,       11, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      2200,     3000,         4 },\r\n\t{  \"giants\",        IPL_STR,             16,       20,       17, PLT_ARMO |            PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      3200,     5000,         7 },\r\n\t{  \"titans\",        IPL_STR,             21,       30,       23,                       PLT_WEAP |                       PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      5200,    10000,        10 },\r\n\t{  \"paralysis\",     IPL_DEX_CURSE,        6,       10,        3, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -3 },\r\n#ifdef HELLFIRE\r\n\t{  \"atrophy\",       IPL_DEX_CURSE,        1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"dexterity\",     IPL_DEX,              1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       200,     1000,         2 },\r\n#else\r\n\t{  \"atrophy\",       IPL_DEX_CURSE,        1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"dexterity\",     IPL_DEX,              1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       200,     1000,         2 },\r\n#endif\r\n\t{  \"skill\",         IPL_DEX,              6,       10,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      1200,     2000,         3 },\r\n\t{  \"accuracy\",      IPL_DEX,             11,       15,       11, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      2200,     3000,         4 },\r\n\t{  \"precision\",     IPL_DEX,             16,       20,       17, PLT_ARMO |            PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      3200,     5000,         7 },\r\n\t{  \"perfection\",    IPL_DEX,             21,       30,       23,                                              PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      5200,    10000,        10 },\r\n\t{  \"the fool\",      IPL_MAG_CURSE,        6,       10,        3, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -3 },\r\n\t{  \"dyslexia\",      IPL_MAG_CURSE,        1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"magic\",         IPL_MAG,              1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       200,     1000,         2 },\r\n\t{  \"the mind\",      IPL_MAG,              6,       10,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      1200,     2000,         3 },\r\n\t{  \"brilliance\",    IPL_MAG,             11,       15,       11, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      2200,     3000,         4 },\r\n\t{  \"sorcery\",       IPL_MAG,             16,       20,       17, PLT_ARMO |            PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      3200,     5000,         7 },\r\n\t{  \"wizardry\",      IPL_MAG,             21,       30,       23,                                  PLT_STAFF |           PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      5200,    10000,        10 },\r\n#ifdef HELLFIRE\r\n\t{  \"illness\",       IPL_VIT_CURSE,        6,       10,        3, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -3 },\r\n\t{  \"disease\",       IPL_VIT_CURSE,        1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"vitality\",      IPL_VIT,              1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_GOOD, FALSE,    TRUE,       200,     1000,         2 },\r\n#else\r\n\t{  \"illness\",       IPL_VIT_CURSE,        6,       10,        3, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -3 },\r\n\t{  \"disease\",       IPL_VIT_CURSE,        1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"vitality\",      IPL_VIT,              1,        5,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_GOOD, FALSE,    TRUE,       200,     1000,         2 },\r\n#endif\r\n\t{  \"zest\",          IPL_VIT,              6,       10,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_GOOD, FALSE,    TRUE,      1200,     2000,         3 },\r\n\t{  \"vim\",           IPL_VIT,             11,       15,       11, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_GOOD, FALSE,    TRUE,      2200,     3000,         4 },\r\n\t{  \"vigor\",         IPL_VIT,             16,       20,       17, PLT_ARMO | PLT_WEAP |                        PLT_BOW | PLT_MISC,     GOE_GOOD, FALSE,    TRUE,      3200,     5000,         7 },\r\n\t{  \"life\",          IPL_VIT,             21,       30,       23,                                                        PLT_MISC,     GOE_GOOD, FALSE,    TRUE,      5200,    10000,        10 },\r\n#ifdef HELLFIRE\r\n\t{  \"trouble\",       IPL_ATTRIBS_CURSE,    6,       10,       12, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,       -10 },\r\n\t{  \"the pit\",       IPL_ATTRIBS_CURSE,    1,        5,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -5 },\r\n\t{  \"the sky\",       IPL_ATTRIBS,          1,        3,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       800,     4000,         5 },\r\n\t{  \"the moon\",      IPL_ATTRIBS,          4,        7,       11, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF | PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      4800,     8000,        10 },\r\n#else\r\n\t{  \"trouble\",       IPL_ATTRIBS_CURSE,    6,       10,       12, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,       -10 },\r\n\t{  \"the pit\",       IPL_ATTRIBS_CURSE,    1,        5,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -5 },\r\n\t{  \"the sky\",       IPL_ATTRIBS,          1,        3,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       800,     4000,         5 },\r\n\t{  \"the moon\",      IPL_ATTRIBS,          4,        7,       11, PLT_ARMO | PLT_SHLD | PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      4800,     8000,        10 },\r\n#endif\r\n\t{  \"the stars\",     IPL_ATTRIBS,          8,       11,       17, PLT_ARMO |            PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      8800,    12000,        15 },\r\n\t{  \"the heavens\",   IPL_ATTRIBS,         12,       15,       25,                       PLT_WEAP |             PLT_BOW | PLT_MISC,     GOE_ANY,  FALSE,    TRUE,     12800,    20000,        20 },\r\n\t{  \"the zodiac\",    IPL_ATTRIBS,         16,       20,       30,                                                        PLT_MISC,     GOE_ANY,  FALSE,    TRUE,     20800,    40000,        30 },\r\n\t{  \"the vulture\",   IPL_LIFE_CURSE,      11,       25,        4, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -4 },\r\n\t{  \"the jackal\",    IPL_LIFE_CURSE,       1,       10,        1, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"the fox\",       IPL_LIFE,            10,       15,        1, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_ANY,  FALSE,    TRUE,       100,     1000,         2 },\r\n\t{  \"the jaguar\",    IPL_LIFE,            16,       20,        5, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      1100,     2000,         3 },\r\n\t{  \"the eagle\",     IPL_LIFE,            21,       30,        9, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      2100,     4000,         5 },\r\n\t{  \"the wolf\",      IPL_LIFE,            30,       40,       15, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      4100,     6000,         7 },\r\n\t{  \"the tiger\",     IPL_LIFE,            41,       50,       21, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      6100,    10000,         9 },\r\n\t{  \"the lion\",      IPL_LIFE,            51,       60,       27, PLT_ARMO |                                             PLT_MISC,     GOE_ANY,  FALSE,    TRUE,     10100,    15000,        11 },\r\n\t{  \"the mammoth\",   IPL_LIFE,            61,       80,       35, PLT_ARMO                                                       ,     GOE_ANY,  FALSE,    TRUE,     15100,    19000,        12 },\r\n\t{  \"the whale\",     IPL_LIFE,            81,      100,       60, PLT_ARMO                                                       ,     GOE_ANY,  FALSE,    TRUE,     19100,    30000,        13 },\r\n\t{  \"fragility\",     IPL_DUR_CURSE,      100,      100,        3, PLT_ARMO | PLT_SHLD | PLT_WEAP                                 ,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -4 },\r\n\t{  \"brittleness\",   IPL_DUR_CURSE,       26,       75,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP                                 ,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n#ifdef HELLFIRE\r\n\t{  \"sturdiness\",    IPL_DUR,             26,       75,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF                     ,     GOE_ANY,  FALSE,    TRUE,       100,      100,         2 },\r\n\t{  \"craftsmanship\", IPL_DUR,             51,      100,        6, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF                     ,     GOE_ANY,  FALSE,    TRUE,       200,      200,         2 },\r\n\t{  \"structure\",     IPL_DUR,            101,      200,       12, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF                     ,     GOE_ANY,  FALSE,    TRUE,       300,      300,         2 },\r\n\t{  \"the ages\",      IPL_INDESTRUCTIBLE,   0,        0,       25, PLT_ARMO | PLT_SHLD | PLT_WEAP | PLT_STAFF                     ,     GOE_ANY,  FALSE,    TRUE,       600,      600,         5 },\r\n#else\r\n\t{  \"sturdiness\",    IPL_DUR,             26,       75,        1, PLT_ARMO | PLT_SHLD | PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,       100,      100,         2 },\r\n\t{  \"craftsmanship\", IPL_DUR,             51,      100,        6, PLT_ARMO | PLT_SHLD | PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,       200,      200,         2 },\r\n\t{  \"structure\",     IPL_DUR,            101,      200,       12, PLT_ARMO | PLT_SHLD | PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,       300,      300,         2 },\r\n\t{  \"the ages\",      IPL_INDESTRUCTIBLE,   0,        0,       25, PLT_ARMO | PLT_SHLD | PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,       600,      600,         5 },\r\n#endif\r\n\t{  \"the dark\",      IPL_LIGHT_CURSE,      4,        4,        6, PLT_ARMO |            PLT_WEAP |                       PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -3 },\r\n\t{  \"the night\",     IPL_LIGHT_CURSE,      2,        2,        3, PLT_ARMO |            PLT_WEAP |                       PLT_MISC,     GOE_EVIL, FALSE,    FALSE,        0,        0,        -2 },\r\n\t{  \"light\",         IPL_LIGHT,            2,        2,        4, PLT_ARMO |            PLT_WEAP |                       PLT_MISC,     GOE_GOOD, FALSE,    TRUE,       750,      750,         2 },\r\n\t{  \"radiance\",      IPL_LIGHT,            4,        4,        8, PLT_ARMO |            PLT_WEAP |                       PLT_MISC,     GOE_GOOD, FALSE,    TRUE,      1500,     1500,         3 },\r\n\t{  \"flame\",         IPL_FIRE_ARROWS,      1,        3,        1,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      2000,     2000,         2 },\r\n\t{  \"fire\",          IPL_FIRE_ARROWS,      1,        6,       11,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      4000,     4000,         4 },\r\n\t{  \"burning\",       IPL_FIRE_ARROWS,      1,       16,       35,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      6000,     6000,         6 },\r\n\t{  \"shock\",         IPL_LIGHT_ARROWS,     1,        6,       13,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      6000,     6000,         2 },\r\n\t{  \"lightning\",     IPL_LIGHT_ARROWS,     1,       10,       21,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      8000,     8000,         4 },\r\n\t{  \"thunder\",       IPL_LIGHT_ARROWS,     1,       20,       60,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,     12000,    12000,         6 },\r\n\t{  \"many\",          IPL_DUR,            100,      100,        3,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,       750,      750,         2 },\r\n\t{  \"plenty\",        IPL_DUR,            200,      200,        7,                                              PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      1500,     1500,         3 },\r\n\t{  \"thorns\",        IPL_THORNS,           1,        3,        1, PLT_ARMO | PLT_SHLD                                            ,     GOE_ANY,  FALSE,    TRUE,       500,      500,         2 },\r\n\t{  \"corruption\",    IPL_NOMANA,           0,        0,        5, PLT_ARMO | PLT_SHLD | PLT_WEAP                                 ,     GOE_EVIL, FALSE,    FALSE,    -1000,    -1000,         2 },\r\n\t{  \"thieves\",       IPL_ABSHALFTRAP,      0,        0,       11, PLT_ARMO | PLT_SHLD |                                  PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      1500,     1500,         2 },\r\n\t{  \"the bear\",      IPL_KNOCKBACK,        0,        0,        5,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_EVIL, FALSE,    TRUE,       750,      750,         2 },\r\n\t{  \"the bat\",       IPL_STEALMANA,        3,        3,        8,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,      7500,     7500,         3 },\r\n\t{  \"vampires\",      IPL_STEALMANA,        5,        5,       19,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,     15000,    15000,         3 },\r\n\t{  \"the leech\",     IPL_STEALLIFE,        3,        3,        8,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,      7500,     7500,         3 },\r\n\t{  \"blood\",         IPL_STEALLIFE,        5,        5,       19,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,     15000,    15000,         3 },\r\n#ifdef HELLFIRE\r\n\t{  \"piercing\",      IPL_TARGAC,           1,        1,        1,                       PLT_WEAP |             PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      1000,     1000,         3 },\r\n\t{  \"puncturing\",    IPL_TARGAC,           2,        2,        9,                       PLT_WEAP |             PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      2000,     2000,         6 },\r\n\t{  \"bashing\",       IPL_TARGAC,           3,        3,       17,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,      4000,     4000,        12 },\r\n#else\r\n\t{  \"piercing\",      IPL_TARGAC,           2,        6,        1,                       PLT_WEAP |             PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      1000,     1000,         3 },\r\n\t{  \"puncturing\",    IPL_TARGAC,           4,       12,        9,                       PLT_WEAP |             PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      2000,     2000,         6 },\r\n\t{  \"bashing\",       IPL_TARGAC,           8,       24,       17,                       PLT_WEAP                                 ,     GOE_ANY,  FALSE,    TRUE,      4000,     4000,        12 },\r\n#endif\r\n\t{  \"readiness\",     IPL_FASTATTACK,       1,        1,        1,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      2000,     2000,         2 },\r\n\t{  \"swiftness\",     IPL_FASTATTACK,       2,        2,       10,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      4000,     4000,         4 },\r\n\t{  \"speed\",         IPL_FASTATTACK,       3,        3,       19,                       PLT_WEAP | PLT_STAFF                     ,     GOE_ANY,  FALSE,    TRUE,      8000,     8000,         8 },\r\n\t{  \"haste\",         IPL_FASTATTACK,       4,        4,       27,                       PLT_WEAP | PLT_STAFF                     ,     GOE_ANY,  FALSE,    TRUE,     16000,    16000,        16 },\r\n\t{  \"balance\",       IPL_FASTRECOVER,      1,        1,        1, PLT_ARMO |                                             PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      2000,     2000,         2 },\r\n\t{  \"stability\",     IPL_FASTRECOVER,      2,        2,       10, PLT_ARMO |                                             PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      4000,     4000,         4 },\r\n\t{  \"harmony\",       IPL_FASTRECOVER,      3,        3,       20, PLT_ARMO |                                             PLT_MISC,     GOE_ANY,  FALSE,    TRUE,      8000,     8000,         8 },\r\n\t{  \"blocking\",      IPL_FASTBLOCK,        1,        1,        5,            PLT_SHLD                                            ,     GOE_ANY,  FALSE,    TRUE,      4000,     4000,         4 },\r\n#ifdef HELLFIRE\r\n\t{  \"devastation\",   IPL_DEVASTATION,      1,        1,        1,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,      1200,     1200,         3 },\r\n\t{  \"decay\",         IPL_DECAY,          150,      250,        1,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,       200,      200,         2 },\r\n\t{  \"peril\",         IPL_PERIL,            1,        1,        5,                       PLT_WEAP | PLT_STAFF | PLT_BOW           ,     GOE_ANY,  FALSE,    TRUE,       500,      500,         1 },\r\n#endif\r\n\t{  \"\",              IPL_INVALID,          0,        0,        0, 0                                                              ,     GOE_ANY,  FALSE,    FALSE,        0,        0,         0 },\r\n\t// clang-format on\r\n};\r\n\r\n/** Contains the data related to each unique item ID. */\r\nconst UItemStruct UniqueItemList[] = {\r\n\t// clang-format off\r\n\t// UIName,                    UIItemId,     UIMinLvl, UINumPL, UIValue, UIPower1,     UIParam1, UIParam2, UIPower2,      UIParam3, UIParam4, UIPower3,      UIParam5, UIParam6, UIPower4,      UIParam7, UIParam8, UIPower5,      UIParam9, UIParam10, UIPower6,      UIParam11, UIParam12\r\n\t{  \"The Butcher's Cleaver\",   UITYPE_CLEAVER,      1,       3,    3650, IPL_STR,            10,       10, IPL_SETDAM,           4,       24, IPL_SETDUR,          10,       10, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Undead Crown\",        UITYPE_SKCROWN,      1,       3,   16650, IPL_RNDSTEALLIFE,    0,        0, IPL_SETAC,            8,        8, IPL_INVCURS,         77,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Empyrean Band\",           UITYPE_INFRARING,    1,       4,    8000, IPL_ATTRIBS,         2,        2, IPL_LIGHT,            2,        2, IPL_FASTRECOVER,      1,        1, IPL_ABSHALFTRAP,      0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Optic Amulet\",            UITYPE_OPTAMULET,    1,       5,    9750, IPL_LIGHT,           2,        2, IPL_LIGHTRES,        20,       20, IPL_GETHIT,           1,        1, IPL_MAG,              5,        5, IPL_INVCURS,         44,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Ring of Truth\",           UITYPE_TRING,        1,       4,    9100, IPL_LIFE,           10,       10, IPL_GETHIT,           1,        1, IPL_ALLRES,          10,       10, IPL_INVCURS,         10,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Harlequin Crest\",         UITYPE_HARCREST,     1,       6,    4000, IPL_AC_CURSE,        3,        3, IPL_GETHIT,           1,        1, IPL_ATTRIBS,          2,        2, IPL_LIFE,             7,        7, IPL_MANA,             7,         7, IPL_INVCURS,          81,         0 },\r\n\t{  \"Veil of Steel\",           UITYPE_STEELVEIL,    1,       6,   63800, IPL_ALLRES,         50,       50, IPL_LIGHT_CURSE,      2,        2, IPL_ACP,             60,       60, IPL_MANA_CURSE,      30,       30, IPL_STR,             15,        15, IPL_VIT,              15,        15 },\r\n\t{  \"Arkaine's Valor\",         UITYPE_ARMOFVAL,     1,       4,   42000, IPL_SETAC,          25,       25, IPL_VIT,             10,       10, IPL_GETHIT,           3,        3, IPL_FASTRECOVER,      3,        3, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Griswold's Edge\",         UITYPE_GRISWOLD,     1,       6,   42000, IPL_FIREDAM,         1,       10, IPL_TOHIT,           25,       25, IPL_FASTATTACK,       2,        2, IPL_KNOCKBACK,        0,        0, IPL_MANA,            20,        20, IPL_LIFE_CURSE,       20,        20 },\r\n#ifdef HELLFIRE\r\n\t{  \"Bovine Plate\",            UITYPE_BOVINE,       1,       6,     400, IPL_SETAC,         150,      150, IPL_INDESTRUCTIBLE,   0,        0, IPL_LIGHT,            5,        5, IPL_ALLRES,          30,       30, IPL_MANA_CURSE,      50,        50, IPL_SPLLVLADD,        -2,        -2 },\r\n#else\r\n\t{  \"Lightforge\",              UITYPE_MACE,         1,       6,   26675, IPL_LIGHT,           4,        4, IPL_DAMP,           150,      150, IPL_TOHIT,           25,       25, IPL_FIREDAM,         10,       20, IPL_INDESTRUCTIBLE,   0,         0, IPL_ATTRIBS,           8,         8 },\r\n#endif\r\n\t{  \"The Rift Bow\",            UITYPE_SHORTBOW,     1,       3,    1800, IPL_RNDARROWVEL,     0,        0, IPL_DAMMOD,           2,        2, IPL_DEX_CURSE,        3,        3, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Needler\",             UITYPE_SHORTBOW,     2,       4,    8900, IPL_TOHIT,          50,       50, IPL_SETDAM,           1,        3, IPL_FASTATTACK,       2,        2, IPL_INVCURS,        158,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Celestial Bow\",       UITYPE_LONGBOW,      2,       4,    1200, IPL_NOMINSTR,        0,        0, IPL_DAMMOD,           2,        2, IPL_SETAC,            5,        5, IPL_INVCURS,        133,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Deadly Hunter\",           UITYPE_COMPBOW,      3,       4,    8750, IPL_3XDAMVDEM,      10,       10, IPL_TOHIT,           20,       20, IPL_MAG_CURSE,        5,        5, IPL_INVCURS,        108,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Bow of the Dead\",         UITYPE_COMPBOW,      5,       6,    2500, IPL_TOHIT,          10,       10, IPL_DEX,              4,        4, IPL_VIT_CURSE,        3,        3, IPL_LIGHT_CURSE,      2,        2, IPL_SETDUR,          30,        30, IPL_INVCURS,         108,         0 },\r\n\t{  \"The Blackoak Bow\",        UITYPE_LONGBOW,      5,       4,    2500, IPL_DEX,            10,       10, IPL_VIT_CURSE,       10,       10, IPL_DAMP,            50,       50, IPL_LIGHT_CURSE,      1,        1, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Flamedart\",               UITYPE_HUNTBOW,     10,       4,   14250, IPL_FIRE_ARROWS,     0,        0, IPL_FIREDAM,          1,        6, IPL_TOHIT,           20,       20, IPL_FIRERES,         40,       40, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Fleshstinger\",            UITYPE_LONGBOW,     13,       4,   16500, IPL_DEX,            15,       15, IPL_TOHIT,           40,       40, IPL_DAMP,            80,       80, IPL_DUR,              6,        6, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Windforce\",               UITYPE_WARBOW,      17,       4,   37750, IPL_STR,             5,        5, IPL_DAMP,           200,      200, IPL_KNOCKBACK,        0,        0, IPL_INVCURS,        164,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Eaglehorn\",               UITYPE_BATTLEBOW,   26,       5,   42500, IPL_DEX,            20,       20, IPL_TOHIT,           50,       50, IPL_DAMP,           100,      100, IPL_INDESTRUCTIBLE,   0,        0, IPL_INVCURS,        108,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Gonnagal's Dirk\",         UITYPE_DAGGER,       1,       5,    7040, IPL_DEX_CURSE,       5,        5, IPL_DAMMOD,           4,        4, IPL_FASTATTACK,       2,        2, IPL_FIRERES,         25,       25, IPL_INVCURS,         54,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Defender\",            UITYPE_SABRE,        1,       3,    2000, IPL_SETAC,           5,        5, IPL_VIT,              5,        5, IPL_TOHIT_CURSE,      5,        5, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Gryphons Claw\",           UITYPE_FALCHION,     1,       4,    1000, IPL_DAMP,          100,      100, IPL_MAG_CURSE,        2,        2, IPL_DEX_CURSE,        5,        5, IPL_INVCURS,         68,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Black Razor\",             UITYPE_DAGGER,       1,       4,    2000, IPL_DAMP,          150,      150, IPL_VIT,              2,        2, IPL_SETDUR,           5,        5, IPL_INVCURS,         53,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Gibbous Moon\",            UITYPE_BROADSWR,     2,       4,    6660, IPL_ATTRIBS,         2,        2, IPL_DAMP,            25,       25, IPL_MANA,            15,       15, IPL_LIGHT_CURSE,      3,        3, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Ice Shank\",               UITYPE_LONGSWR,      3,       3,    5250, IPL_FIRERES,        40,       40, IPL_SETDUR,          15,       15, IPL_STR,              5,       10, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Executioner's Blade\", UITYPE_FALCHION,     3,       5,    7080, IPL_DAMP,          150,      150, IPL_LIFE_CURSE,      10,       10, IPL_LIGHT_CURSE,      1,        1, IPL_DUR,            200,      200, IPL_INVCURS,         58,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Bonesaw\",             UITYPE_CLAYMORE,     6,       6,    4400, IPL_DAMMOD,         10,       10, IPL_STR,             10,       10, IPL_MAG_CURSE,        5,        5, IPL_DEX_CURSE,        5,        5, IPL_LIFE,            10,        10, IPL_MANA_CURSE,       10,        10 },\r\n\t{  \"Shadowhawk\",              UITYPE_BROADSWR,     8,       4,   13750, IPL_LIGHT_CURSE,     2,        2, IPL_STEALLIFE,        5,        5, IPL_TOHIT,           15,       15, IPL_ALLRES,           5,        5, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Wizardspike\",             UITYPE_DAGGER,      11,       5,   12920, IPL_MAG,            15,       15, IPL_MANA,            35,       35, IPL_TOHIT,           25,       25, IPL_ALLRES,          15,       15, IPL_INVCURS,         50,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Lightsabre\",              UITYPE_SABRE,       13,       4,   19150, IPL_LIGHT,           2,        2, IPL_LIGHTDAM,         1,       10, IPL_TOHIT,           20,       20, IPL_LIGHTRES,        50,       50, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Falcon's Talon\",      UITYPE_SCIMITAR,    15,       5,    7867, IPL_FASTATTACK,      4,        4, IPL_TOHIT,           20,       20, IPL_DAMP_CURSE,      33,       33, IPL_DEX,             10,       10, IPL_INVCURS,         68,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Inferno\",                 UITYPE_LONGSWR,     17,       4,   34600, IPL_FIREDAM,         2,       12, IPL_LIGHT,            3,        3, IPL_MANA,            20,       20, IPL_FIRERES,         80,       80, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Doombringer\",             UITYPE_BASTARDSWR,  19,       5,   18250, IPL_TOHIT,          25,       25, IPL_DAMP,           250,      250, IPL_ATTRIBS_CURSE,    5,        5, IPL_LIFE_CURSE,      25,       25, IPL_LIGHT_CURSE,      2,         2, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Grizzly\",             UITYPE_TWOHANDSWR,  23,       6,   50000, IPL_STR,            20,       20, IPL_VIT_CURSE,        5,        5, IPL_DAMP,           200,      200, IPL_KNOCKBACK,        0,        0, IPL_DUR,            100,       100, IPL_INVCURS,         160,         0 },\r\n\t{  \"The Grandfather\",         UITYPE_GREATSWR,    27,       6,  119800, IPL_ONEHAND,         0,        0, IPL_ATTRIBS,          5,        5, IPL_TOHIT,           20,       20, IPL_DAMP,            70,       70, IPL_LIFE,            20,        20, IPL_INVCURS,         161,         0 },\r\n\t{  \"The Mangler\",             UITYPE_LARGEAXE,     2,       5,    2850, IPL_DAMP,          200,      200, IPL_DEX_CURSE,        5,        5, IPL_MAG_CURSE,        5,        5, IPL_MANA_CURSE,      10,       10, IPL_INVCURS,        144,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Sharp Beak\",              UITYPE_LARGEAXE,     2,       4,    2850, IPL_LIFE,           20,       20, IPL_MAG_CURSE,       10,       10, IPL_MANA_CURSE,      10,       10, IPL_INVCURS,        143,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"BloodSlayer\",             UITYPE_BROADAXE,     3,       5,    2500, IPL_DAMP,          100,      100, IPL_3XDAMVDEM,       50,       50, IPL_ATTRIBS_CURSE,    5,        5, IPL_SPLLVLADD,       -1,       -1, IPL_INVCURS,        144,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Celestial Axe\",       UITYPE_BATTLEAXE,    4,       4,   14100, IPL_NOMINSTR,        0,        0, IPL_TOHIT,           15,       15, IPL_LIFE,            15,       15, IPL_STR_CURSE,       15,       15, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Wicked Axe\",              UITYPE_LARGEAXE,     5,       6,   31150, IPL_TOHIT,          30,       30, IPL_DEX,             10,       10, IPL_VIT_CURSE,       10,       10, IPL_GETHIT,           1,        6, IPL_INDESTRUCTIBLE,   0,         0, IPL_INVCURS,         143,         0 },\r\n\t{  \"Stonecleaver\",            UITYPE_BROADAXE,     7,       5,   23900, IPL_LIFE,           30,       30, IPL_TOHIT,           20,       20, IPL_DAMP,            50,       50, IPL_LIGHTRES,        40,       40, IPL_INVCURS,        104,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Aguinara's Hatchet\",      UITYPE_SMALLAXE,    12,       3,   24800, IPL_SPLLVLADD,       1,        1, IPL_MAG,             10,       10, IPL_MAGICRES,        80,       80, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Hellslayer\",              UITYPE_BATTLEAXE,   15,       5,   26200, IPL_STR,             8,        8, IPL_VIT,              8,        8, IPL_DAMP,           100,      100, IPL_LIFE,            25,       25, IPL_MANA_CURSE,      25,        25, IPL_TOHIT,             0,         0 },\r\n\t{  \"Messerschmidt's Reaver\",  UITYPE_GREATAXE,    25,       6,   58000, IPL_DAMP,          200,      200, IPL_DAMMOD,          15,       15, IPL_ATTRIBS,          5,        5, IPL_LIFE_CURSE,      50,       50, IPL_FIREDAM,          2,        12, IPL_INVCURS,         163,         0 },\r\n\t{  \"Crackrust\",               UITYPE_MACE,         1,       5,   11375, IPL_ATTRIBS,         2,        2, IPL_INDESTRUCTIBLE,   0,        0, IPL_ALLRES,          15,       15, IPL_DAMP,            50,       50, IPL_SPLLVLADD,       -1,        -1, IPL_TOHIT,             0,         0 },\r\n\t{  \"Hammer of Jholm\",         UITYPE_MAUL,         1,       4,    8700, IPL_DAMP,            4,       10, IPL_INDESTRUCTIBLE,   0,        0, IPL_STR,              3,        3, IPL_TOHIT,           15,       15, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Civerb's Cudgel\",         UITYPE_MACE,         1,       3,    2000, IPL_3XDAMVDEM,      35,       35, IPL_DEX_CURSE,        5,        5, IPL_MAG_CURSE,        2,        2, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Celestial Star\",      UITYPE_FLAIL,        2,       5,    7810, IPL_NOMINSTR,        0,        0, IPL_LIGHT,            2,        2, IPL_DAMMOD,          10,       10, IPL_AC_CURSE,         8,        8, IPL_INVCURS,        131,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Baranar's Star\",          UITYPE_MORNSTAR,     5,       6,    6850, IPL_TOHIT,          12,       12, IPL_DAMP,            80,       80, IPL_FASTATTACK,       1,        1, IPL_VIT,              4,        4, IPL_DEX_CURSE,        4,         4, IPL_SETDUR,           60,        60 },\r\n\t{  \"Gnarled Root\",            UITYPE_SPIKCLUB,     9,       6,    9820, IPL_TOHIT,          20,       20, IPL_DAMP,           300,      300, IPL_DEX,             10,       10, IPL_MAG,              5,        5, IPL_ALLRES,          10,        10, IPL_AC_CURSE,         10,        10 },\r\n\t{  \"The Cranium Basher\",      UITYPE_MAUL,        12,       6,   36500, IPL_DAMMOD,         20,       20, IPL_STR,             15,       15, IPL_INDESTRUCTIBLE,   0,        0, IPL_MANA_CURSE,     150,      150, IPL_ALLRES,           5,         5, IPL_INVCURS,         122,         0 },\r\n\t{  \"Schaefer's Hammer\",       UITYPE_WARHAMMER,   16,       6,   56125, IPL_DAMP_CURSE,    100,      100, IPL_LIGHTDAM,         1,       50, IPL_LIFE,            50,       50, IPL_TOHIT,           30,       30, IPL_LIGHTRES,        80,        80, IPL_LIGHT,             1,         1 },\r\n\t{  \"Dreamflange\",             UITYPE_MACE,        26,       5,   26450, IPL_MAG,            30,       30, IPL_MANA,            50,       50, IPL_MAGICRES,        50,       50, IPL_LIGHT,            2,        2, IPL_SPLLVLADD,        1,         1, IPL_TOHIT,             0,         0 },\r\n\t{  \"Staff of Shadows\",        UITYPE_LONGSTAFF,    2,       5,    1250, IPL_MAG_CURSE,      10,       10, IPL_TOHIT,           10,       10, IPL_DAMP,            60,       60, IPL_LIGHT_CURSE,      2,        2, IPL_FASTATTACK,       1,         1, IPL_TOHIT,             0,         0 },\r\n\t{  \"Immolator\",               UITYPE_LONGSTAFF,    4,       4,    3900, IPL_FIRERES,        20,       20, IPL_FIREDAM,          4,        4, IPL_MANA,            10,       10, IPL_VIT_CURSE,        5,        5, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Storm Spire\",             UITYPE_WARSTAFF,     8,       4,   22500, IPL_LIGHTRES,       50,       50, IPL_LIGHTDAM,         2,        8, IPL_STR,             10,       10, IPL_MAG_CURSE,       10,       10, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Gleamsong\",               UITYPE_SHORTSTAFF,   8,       4,    6520, IPL_MANA,           25,       25, IPL_STR_CURSE,        3,        3, IPL_VIT_CURSE,        3,        3, IPL_SPELL,           10,       76, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Thundercall\",             UITYPE_COMPSTAFF,   14,       5,   22250, IPL_TOHIT,          35,       35, IPL_LIGHTDAM,         1,       10, IPL_SPELL,            3,       76, IPL_LIGHTRES,        30,       30, IPL_LIGHT,            2,         2, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Protector\",           UITYPE_SHORTSTAFF,  16,       6,   17240, IPL_VIT,             5,        5, IPL_GETHIT,           5,        5, IPL_SETAC,           40,       40, IPL_SPELL,            2,       86, IPL_THORNS,           1,         3, IPL_INVCURS,         162,         0 },\r\n\t{  \"Naj's Puzzler\",           UITYPE_LONGSTAFF,   18,       5,   34000, IPL_MAG,            20,       20, IPL_DEX,             10,       10, IPL_ALLRES,          20,       20, IPL_SPELL,           23,       57, IPL_LIFE_CURSE,      25,        25, IPL_TOHIT,             0,         0 },\r\n\t{  \"Mindcry\",                 UITYPE_QUARSTAFF,   20,       4,   41500, IPL_MAG,            15,       15, IPL_SPELL,           13,       69, IPL_ALLRES,          15,       15, IPL_SPLLVLADD,        1,        1, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Rod of Onan\",             UITYPE_WARSTAFF,    22,       3,   44167, IPL_SPELL,          21,       50, IPL_DAMP,           100,      100, IPL_ATTRIBS,          5,        5, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Helm of Sprits\",          UITYPE_HELM,         1,       2,    7525, IPL_STEALLIFE,       5,        5, IPL_INVCURS,         77,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Thinking Cap\",            UITYPE_SKULLCAP,     6,       5,    2020, IPL_MANA,           30,       30, IPL_SPLLVLADD,        2,        2, IPL_ALLRES,          20,       20, IPL_SETDUR,           1,        1, IPL_INVCURS,         93,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"OverLord's Helm\",         UITYPE_HELM,         7,       6,   12500, IPL_STR,            20,       20, IPL_DEX,             15,       15, IPL_VIT,              5,        5, IPL_MAG_CURSE,       20,       20, IPL_SETDUR,          15,        15, IPL_INVCURS,          99,         0 },\r\n\t{  \"Fool's Crest\",            UITYPE_HELM,        12,       5,   10150, IPL_ATTRIBS_CURSE,   4,        4, IPL_LIFE,           100,      100, IPL_GETHIT_CURSE,     1,        6, IPL_THORNS,           1,        3, IPL_INVCURS,         80,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Gotterdamerung\",          UITYPE_GREATHELM,   21,       6,   54900, IPL_ATTRIBS,        20,       20, IPL_SETAC,           60,       60, IPL_GETHIT,           4,        4, IPL_ALLRESZERO,       0,        0, IPL_LIGHT_CURSE,      4,         4, IPL_INVCURS,          85,         0 },\r\n\t{  \"Royal Circlet\",           UITYPE_CROWN,       27,       5,   24875, IPL_ATTRIBS,        10,       10, IPL_MANA,            40,       40, IPL_SETAC,           40,       40, IPL_LIGHT,            1,        1, IPL_INVCURS,         79,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Torn Flesh of Souls\",     UITYPE_RAGS,         2,       5,    4825, IPL_SETAC,           8,        8, IPL_VIT,             10,       10, IPL_GETHIT,           1,        1, IPL_INDESTRUCTIBLE,   0,        0, IPL_INVCURS,         92,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Gladiator's Bane\",    UITYPE_STUDARMOR,    6,       4,    3450, IPL_SETAC,          25,       25, IPL_GETHIT,           2,        2, IPL_DUR,            200,      200, IPL_ATTRIBS_CURSE,    3,        3, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Rainbow Cloak\",       UITYPE_CLOAK,        2,       6,    4900, IPL_SETAC,          10,       10, IPL_ATTRIBS,          1,        1, IPL_ALLRES,          10,       10, IPL_LIFE,             5,        5, IPL_DUR,             50,        50, IPL_INVCURS,         138,         0 },\r\n\t{  \"Leather of Aut\",          UITYPE_LEATHARMOR,   4,       5,   10550, IPL_SETAC,          15,       15, IPL_STR,              5,        5, IPL_MAG_CURSE,        5,        5, IPL_DEX,              5,        5, IPL_INDESTRUCTIBLE,   0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Wisdom's Wrap\",           UITYPE_ROBE,         5,       6,    6200, IPL_MAG,             5,        5, IPL_MANA,            10,       10, IPL_LIGHTRES,        25,       25, IPL_SETAC,           15,       15, IPL_GETHIT,           1,         1, IPL_INVCURS,         138,         0 },\r\n\t{  \"Sparking Mail\",           UITYPE_CHAINMAIL,    9,       2,   15750, IPL_SETAC,          30,       30, IPL_LIGHTDAM,         1,       10, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Scavenger Carapace\",      UITYPE_BREASTPLATE, 13,       4,   14000, IPL_GETHIT,         15,       15, IPL_AC_CURSE,        30,       30, IPL_DEX,              5,        5, IPL_LIGHTRES,        40,       40, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Nightscape\",              UITYPE_CAPE,        16,       6,   11600, IPL_FASTRECOVER,     2,        2, IPL_LIGHT_CURSE,      4,        4, IPL_SETAC,           15,       15, IPL_DEX,              3,        3, IPL_ALLRES,          20,        20, IPL_INVCURS,         138,         0 },\r\n\t{  \"Naj's Light Plate\",       UITYPE_PLATEMAIL,   19,       6,   78700, IPL_NOMINSTR,        0,        0, IPL_MAG,              5,        5, IPL_MANA,            20,       20, IPL_ALLRES,          20,       20, IPL_SPLLVLADD,        1,         1, IPL_INVCURS,         159,         0 },\r\n\t{  \"Demonspike Coat\",         UITYPE_FULLPLATE,   25,       5,  251175, IPL_SETAC,         100,      100, IPL_GETHIT,           6,        6, IPL_STR,             10,       10, IPL_INDESTRUCTIBLE,   0,        0, IPL_FIRERES,         50,        50, IPL_TOHIT,             0,         0 },\r\n\t{  \"The Deflector\",           UITYPE_BUCKLER,      1,       5,    1500, IPL_SETAC,           7,        7, IPL_ALLRES,          10,       10, IPL_DAMP_CURSE,      20,       20, IPL_TOHIT_CURSE,      5,        5, IPL_INVCURS,         83,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Split Skull Shield\",      UITYPE_BUCKLER,      1,       6,    2025, IPL_SETAC,          10,       10, IPL_LIFE,            10,       10, IPL_STR,              2,        2, IPL_LIGHT_CURSE,      1,        1, IPL_SETDUR,          15,        15, IPL_INVCURS,         116,         0 },\r\n\t{  \"Dragon's Breach\",         UITYPE_KITESHIELD,   2,       6,   19200, IPL_FIRERES,        25,       25, IPL_STR,              5,        5, IPL_SETAC,           20,       20, IPL_MAG_CURSE,        5,        5, IPL_INDESTRUCTIBLE,   0,         0, IPL_INVCURS,         117,         0 },\r\n\t{  \"Blackoak Shield\",         UITYPE_SMALLSHIELD,  4,       6,    5725, IPL_DEX,            10,       10, IPL_VIT_CURSE,       10,       10, IPL_SETAC,           18,       18, IPL_LIGHT_CURSE,      1,        1, IPL_DUR,            150,       150, IPL_INVCURS,         146,         0 },\r\n\t{  \"Holy Defender\",           UITYPE_LARGESHIELD, 10,       6,   13800, IPL_SETAC,          15,       15, IPL_GETHIT,           2,        2, IPL_FIRERES,         20,       20, IPL_DUR,            200,      200, IPL_FASTBLOCK,        1,         1, IPL_INVCURS,         146,         0 },\r\n\t{  \"Stormshield\",             UITYPE_GOTHSHIELD,  24,       6,   49000, IPL_SETAC,          40,       40, IPL_GETHIT_CURSE,     4,        4, IPL_STR,             10,       10, IPL_INDESTRUCTIBLE,   0,        0, IPL_FASTBLOCK,        1,         1, IPL_INVCURS,         148,         0 },\r\n\t{  \"Bramble\",                 UITYPE_RING,         1,       4,    1000, IPL_ATTRIBS_CURSE,   2,        2, IPL_DAMMOD,           3,        3, IPL_MANA,            10,       10, IPL_INVCURS,          9,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Ring of Regha\",           UITYPE_RING,         1,       6,    4175, IPL_MAG,            10,       10, IPL_MAGICRES,        10,       10, IPL_LIGHT,            1,        1, IPL_STR_CURSE,        3,        3, IPL_DEX_CURSE,        3,         3, IPL_INVCURS,          11,         0 },\r\n\t{  \"The Bleeder\",             UITYPE_RING,         2,       4,    8500, IPL_MAGICRES,       20,       20, IPL_MANA,            30,       30, IPL_LIFE_CURSE,      10,       10, IPL_INVCURS,          8,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Constricting Ring\",       UITYPE_RING,         5,       3,   62000, IPL_ALLRES,         75,       75, IPL_DRAINLIFE,        0,        0, IPL_INVCURS,         14,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Ring of Engagement\",      UITYPE_RING,        11,       5,   12476, IPL_GETHIT,          1,        2, IPL_THORNS,           1,        3, IPL_SETAC,            5,        5, IPL_TARGAC,           4,       12, IPL_INVCURS,         13,         0, IPL_TOHIT,             0,         0 },\r\n#ifdef HELLFIRE\r\n\t{  \"Giant's Knuckle\",         UITYPE_RING,         8,       3,    8000, IPL_STR,            60,       60, IPL_DEX_CURSE,       30,       30, IPL_INVCURS,        179,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Mercurial Ring\",          UITYPE_RING,         8,       3,    8000, IPL_DEX,            60,       60, IPL_STR_CURSE,       30,       30, IPL_INVCURS,        176,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Xorine's Ring\",           UITYPE_RING,         8,       3,    8000, IPL_MAG,            60,       60, IPL_STR_CURSE,       30,       30, IPL_INVCURS,        168,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Karik's Ring\",            UITYPE_RING,         8,       3,    8000, IPL_VIT,            60,       60, IPL_MAG_CURSE,       30,       30, IPL_INVCURS,        173,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Ring of Magma\",           UITYPE_RING,         8,       4,    8000, IPL_FIRERES,        60,       60, IPL_LIGHTRES_CURSE,  30,       30, IPL_MAGICRES_CURSE,  30,       30, IPL_INVCURS,        184,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Ring of the Mystics\",     UITYPE_RING,         8,       4,    8000, IPL_MAGICRES,       60,       60, IPL_FIRERES_CURSE,   30,       30, IPL_LIGHTRES_CURSE,  30,       30, IPL_INVCURS,        181,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Ring of Thunder\",         UITYPE_RING,         8,       4,    8000, IPL_LIGHTRES,       60,       60, IPL_FIRERES_CURSE,   30,       30, IPL_MAGICRES_CURSE,  30,       30, IPL_INVCURS,        177,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Amulet of Warding\",       UITYPE_AMULET,      12,       3,   30000, IPL_ALLRES,         40,       40, IPL_LIFE_CURSE,     100,      100, IPL_INVCURS,        170,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Gnat Sting\",              UITYPE_HUNTBOW,     15,       5,   30000, IPL_MULT_ARROWS,     3,        3, IPL_SETDAM,           1,        2, IPL_FASTATTACK,       1,        1, IPL_INDESTRUCTIBLE,   0,        0, IPL_INVCURS,        210,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Flambeau\",                UITYPE_COMPBOW,     11,       4,   30000, IPL_FIREBALL,       15,       20, IPL_SETDAM,           0,        0, IPL_INDESTRUCTIBLE,   0,        0, IPL_INVCURS,        209,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Armor of Gloom\",          UITYPE_FULLPLATE,   25,       5,  200000, IPL_NOMINSTR,        0,        0, IPL_SETAC,          225,      225, IPL_ALLRESZERO,       0,        0, IPL_LIGHT_CURSE,      2,        2, IPL_INVCURS,        203,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Blitzen\",                 UITYPE_COMPBOW,     13,       4,   30000, IPL_ADDACLIFE,      10,       15, IPL_SETDAM,           0,        0, IPL_INDESTRUCTIBLE,   0,        0, IPL_INVCURS,        219,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Thunderclap\",             UITYPE_WARHAMMER,   13,       6,   30000, IPL_ADDMANAAC,       3,        6, IPL_STR,             20,       20, IPL_LIGHTRES,        30,       30, IPL_LIGHT,            2,        2, IPL_INDESTRUCTIBLE,   0,         0, IPL_INVCURS,         205,         0 },\r\n\t{  \"Shirotachi\",              UITYPE_GREATSWR,    21,       4,   36000, IPL_ONEHAND,         0,        0, IPL_FASTATTACK,       4,        4, IPL_TARGAC,           2,        2, IPL_LIGHTDAM,         6,        6, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Eater of Souls\",          UITYPE_TWOHANDSWR,  23,       6,   42000, IPL_INDESTRUCTIBLE,  0,        0, IPL_LIFE,            50,       50, IPL_STEALLIFE,        5,        5, IPL_STEALMANA,        5,        5, IPL_DRAINLIFE,        0,         0, IPL_INVCURS,         200,         0 },\r\n\t{  \"Diamondedge\",             UITYPE_LONGSWR,     17,       6,   42000, IPL_SETDUR,         10,       10, IPL_TOHIT,           50,       50, IPL_DAMP,           100,      100, IPL_LIGHTRES,        50,       50, IPL_SETAC,           10,        10, IPL_INVCURS,         206,         0 },\r\n\t{  \"Bone Chain Armor\",        UITYPE_CHAINMAIL,   13,       3,   36000, IPL_SETAC,          40,       40, IPL_ACUNDEAD,         0,        0, IPL_INVCURS,        204,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Demon Plate Armor\",       UITYPE_FULLPLATE,   25,       3,   80000, IPL_SETAC,          80,       80, IPL_ACDEMON,          0,        0, IPL_INVCURS,        225,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Acolyte's Amulet\",        UITYPE_AMULET,      10,       2,   10000, IPL_MANATOLIFE,     50,       50, IPL_INVCURS,        183,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t{  \"Gladiator's Ring\",        UITYPE_RING,        10,       2,   10000, IPL_LIFETOMANA,     40,       40, IPL_INVCURS,        186,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n#endif\r\n\t{  \"\",                        UITYPE_INVALID,      0,       0,       0, IPL_TOHIT,           0,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,        0, IPL_TOHIT,            0,         0, IPL_TOHIT,             0,         0 },\r\n\t// clang-format on\r\n};\r\n"
  },
  {
    "path": "Source/itemdat.h",
    "content": "/**\r\n * @file itemdat.h\r\n *\r\n * Interface of all item data.\r\n */\r\n#ifndef __ITEMDAT_H__\r\n#define __ITEMDAT_H__\r\n\r\nextern ItemDataStruct AllItemsList[];\r\nextern const PLStruct PL_Prefix[];\r\nextern const PLStruct PL_Suffix[];\r\nextern const UItemStruct UniqueItemList[];\r\n\r\n#endif /* __ITEMDAT_H__ */\r\n"
  },
  {
    "path": "Source/items.cpp",
    "content": "/**\r\n * @file items.cpp\r\n *\r\n * Implementation of item functionality.\r\n */\r\n#include \"all.h\"\r\n#ifdef HELLFIRE\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n#endif\r\n\r\nint itemactive[MAXITEMS];\r\nBOOL uitemflag;\r\nint itemavail[MAXITEMS];\r\nItemStruct curruitem;\r\nItemGetRecordStruct itemrecord[MAXITEMS];\r\n/** Contains the items on ground in the current game. */\r\nItemStruct item[MAXITEMS + 1];\r\nBOOL itemhold[3][3];\r\n#ifdef HELLFIRE\r\nCornerStoneStruct CornerStone;\r\n#endif\r\nBYTE *itemanims[ITEMTYPES];\r\nBOOL UniqueItemFlag[128];\r\n#ifdef HELLFIRE\r\nint auricGold = GOLD_MAX_LIMIT * 2;\r\n#endif\r\nint numitems;\r\nint gnNumGetRecords;\r\n\r\n/* data */\r\n\r\n#ifdef HELLFIRE\r\nint OilLevels[] = { 1, 10, 1, 10, 4, 1, 5, 17, 1, 10 };\r\nint OilValues[] = { 500, 2500, 500, 2500, 1500, 100, 2500, 15000, 500, 2500 };\r\nint OilMagic[] = {\r\n\tIMISC_OILACC,\r\n\tIMISC_OILMAST,\r\n\tIMISC_OILSHARP,\r\n\tIMISC_OILDEATH,\r\n\tIMISC_OILSKILL,\r\n\tIMISC_OILBSMTH,\r\n\tIMISC_OILFORT,\r\n\tIMISC_OILPERM,\r\n\tIMISC_OILHARD,\r\n\tIMISC_OILIMP,\r\n};\r\nchar OilNames[10][25] = {\r\n\t\"Oil of Accuracy\",\r\n\t\"Oil of Mastery\",\r\n\t\"Oil of Sharpness\",\r\n\t\"Oil of Death\",\r\n\t\"Oil of Skill\",\r\n\t\"Blacksmith Oil\",\r\n\t\"Oil of Fortitude\",\r\n\t\"Oil of Permanence\",\r\n\t\"Oil of Hardening\",\r\n\t\"Oil of Imperviousness\"\r\n};\r\nint MaxGold = GOLD_MAX_LIMIT;\r\n#endif\r\n\r\n/** Maps from item_cursor_graphic to in-memory item type. */\r\nBYTE ItemCAnimTbl[] = {\r\n#ifndef HELLFIRE\r\n\t20, 16, 16, 16, 4, 4, 4, 12, 12, 12,\r\n\t12, 12, 12, 12, 12, 21, 21, 25, 12, 28,\r\n\t28, 28, 0, 0, 0, 32, 0, 0, 0, 24,\r\n\t24, 26, 2, 25, 22, 23, 24, 25, 27, 27,\r\n\t29, 0, 0, 0, 12, 12, 12, 12, 12, 0,\r\n\t8, 8, 0, 8, 8, 8, 8, 8, 8, 6,\r\n\t8, 8, 8, 6, 8, 8, 6, 8, 8, 6,\r\n\t6, 6, 8, 8, 8, 5, 9, 13, 13, 13,\r\n\t5, 5, 5, 15, 5, 5, 18, 18, 18, 30,\r\n\t5, 5, 14, 5, 14, 13, 16, 18, 5, 5,\r\n\t7, 1, 3, 17, 1, 15, 10, 14, 3, 11,\r\n\t8, 0, 1, 7, 0, 7, 15, 7, 3, 3,\r\n\t3, 6, 6, 11, 11, 11, 31, 14, 14, 14,\r\n\t6, 6, 7, 3, 8, 14, 0, 14, 14, 0,\r\n\t33, 1, 1, 1, 1, 1, 7, 7, 7, 14,\r\n\t14, 17, 17, 17, 0, 34, 1, 0, 3, 17,\r\n\t8, 8, 6, 1, 3, 3, 11, 3, 4\r\n#else\r\n\t20, 16, 16, 16, 4, 4, 4, 12, 12, 12,\r\n\t12, 12, 12, 12, 12, 21, 21, 25, 12, 28,\r\n\t28, 28, 38, 38, 38, 32, 38, 38, 38, 24,\r\n\t24, 26, 2, 25, 22, 23, 24, 25, 27, 27,\r\n\t29, 0, 0, 0, 12, 12, 12, 12, 12, 0,\r\n\t8, 8, 0, 8, 8, 8, 8, 8, 8, 6,\r\n\t8, 8, 8, 6, 8, 8, 6, 8, 8, 6,\r\n\t6, 6, 8, 8, 8, 5, 9, 13, 13, 13,\r\n\t5, 5, 5, 15, 5, 5, 18, 18, 18, 30,\r\n\t5, 5, 14, 5, 14, 13, 16, 18, 5, 5,\r\n\t7, 1, 3, 17, 1, 15, 10, 14, 3, 11,\r\n\t8, 0, 1, 7, 0, 7, 15, 7, 3, 3,\r\n\t3, 6, 6, 11, 11, 11, 31, 14, 14, 14,\r\n\t6, 6, 7, 3, 8, 14, 0, 14, 14, 0,\r\n\t33, 1, 1, 1, 1, 1, 7, 7, 7, 14,\r\n\t14, 17, 17, 17, 0, 34, 1, 0, 3, 17,\r\n\t8, 8, 6, 1, 3, 3, 11, 3, 12, 12,\r\n\t12, 12, 12, 12, 12, 12, 12, 12, 12, 12,\r\n\t12, 12, 12, 12, 12, 12, 12, 35, 39, 36,\r\n\t36, 36, 37, 38, 38, 38, 38, 38, 41, 42,\r\n\t8, 8, 8, 17, 0, 6, 8, 11, 11, 3,\r\n\t3, 1, 6, 6, 6, 1, 8, 6, 11, 3,\r\n\t6, 8, 1, 6, 6, 17, 40, 0, 0\r\n#endif\r\n};\r\n/** Map of item type .cel file names. */\r\nconst char *const ItemDropNames[] = {\r\n\t\"Armor2\",\r\n\t\"Axe\",\r\n\t\"FBttle\",\r\n\t\"Bow\",\r\n\t\"GoldFlip\",\r\n\t\"Helmut\",\r\n\t\"Mace\",\r\n\t\"Shield\",\r\n\t\"SwrdFlip\",\r\n\t\"Rock\",\r\n\t\"Cleaver\",\r\n\t\"Staff\",\r\n\t\"Ring\",\r\n\t\"CrownF\",\r\n\t\"LArmor\",\r\n\t\"WShield\",\r\n\t\"Scroll\",\r\n\t\"FPlateAr\",\r\n\t\"FBook\",\r\n\t\"Food\",\r\n\t\"FBttleBB\",\r\n\t\"FBttleDY\",\r\n\t\"FBttleOR\",\r\n\t\"FBttleBR\",\r\n\t\"FBttleBL\",\r\n\t\"FBttleBY\",\r\n\t\"FBttleWH\",\r\n\t\"FBttleDB\",\r\n\t\"FEar\",\r\n\t\"FBrain\",\r\n\t\"FMush\",\r\n\t\"Innsign\",\r\n\t\"Bldstn\",\r\n\t\"Fanvil\",\r\n\t\"FLazStaf\",\r\n#ifdef HELLFIRE\r\n\t\"bombs1\",\r\n\t\"halfps1\",\r\n\t\"wholeps1\",\r\n\t\"runes1\",\r\n\t\"teddys1\",\r\n\t\"cows1\",\r\n\t\"donkys1\",\r\n\t\"mooses1\",\r\n#endif\r\n};\r\n/** Maps of item drop animation length. */\r\nBYTE ItemAnimLs[] = {\r\n\t15,\r\n\t13,\r\n\t16,\r\n\t13,\r\n\t10,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t10,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t1,\r\n\t16,\r\n\t16,\r\n\t16,\r\n\t16,\r\n\t16,\r\n\t16,\r\n\t16,\r\n\t16,\r\n\t13,\r\n\t12,\r\n\t12,\r\n\t13,\r\n\t13,\r\n\t13,\r\n\t8,\r\n#ifdef HELLFIRE\r\n\t10,\r\n\t16,\r\n\t16,\r\n\t10,\r\n\t10,\r\n\t15,\r\n\t15,\r\n\t15,\r\n#endif\r\n};\r\n/** Maps of drop sounds effect of dropping the item on ground. */\r\nint ItemDropSnds[] = {\r\n\tIS_FHARM,\r\n\tIS_FAXE,\r\n\tIS_FPOT,\r\n\tIS_FBOW,\r\n\tIS_GOLD,\r\n\tIS_FCAP,\r\n\tIS_FSWOR,\r\n\tIS_FSHLD,\r\n\tIS_FSWOR,\r\n\tIS_FROCK,\r\n\tIS_FAXE,\r\n\tIS_FSTAF,\r\n\tIS_FRING,\r\n\tIS_FCAP,\r\n\tIS_FLARM,\r\n\tIS_FSHLD,\r\n\tIS_FSCRL,\r\n\tIS_FHARM,\r\n\tIS_FBOOK,\r\n\tIS_FLARM,\r\n\tIS_FPOT,\r\n\tIS_FPOT,\r\n\tIS_FPOT,\r\n\tIS_FPOT,\r\n\tIS_FPOT,\r\n\tIS_FPOT,\r\n\tIS_FPOT,\r\n\tIS_FPOT,\r\n\tIS_FBODY,\r\n\tIS_FBODY,\r\n\tIS_FMUSH,\r\n\tIS_ISIGN,\r\n\tIS_FBLST,\r\n\tIS_FANVL,\r\n\tIS_FSTAF,\r\n#ifdef HELLFIRE\r\n\tIS_FROCK,\r\n\tIS_FSCRL,\r\n\tIS_FSCRL,\r\n\tIS_FROCK,\r\n\tIS_FMUSH,\r\n\tIS_FHARM,\r\n\tIS_FLARM,\r\n\tIS_FLARM,\r\n#endif\r\n};\r\n/** Maps of drop sounds effect of placing the item in the inventory. */\r\nint ItemInvSnds[] = {\r\n\tIS_IHARM,\r\n\tIS_IAXE,\r\n\tIS_IPOT,\r\n\tIS_IBOW,\r\n\tIS_GOLD,\r\n\tIS_ICAP,\r\n\tIS_ISWORD,\r\n\tIS_ISHIEL,\r\n\tIS_ISWORD,\r\n\tIS_IROCK,\r\n\tIS_IAXE,\r\n\tIS_ISTAF,\r\n\tIS_IRING,\r\n\tIS_ICAP,\r\n\tIS_ILARM,\r\n\tIS_ISHIEL,\r\n\tIS_ISCROL,\r\n\tIS_IHARM,\r\n\tIS_IBOOK,\r\n\tIS_IHARM,\r\n\tIS_IPOT,\r\n\tIS_IPOT,\r\n\tIS_IPOT,\r\n\tIS_IPOT,\r\n\tIS_IPOT,\r\n\tIS_IPOT,\r\n\tIS_IPOT,\r\n\tIS_IPOT,\r\n\tIS_IBODY,\r\n\tIS_IBODY,\r\n\tIS_IMUSH,\r\n\tIS_ISIGN,\r\n\tIS_IBLST,\r\n\tIS_IANVL,\r\n\tIS_ISTAF,\r\n#ifdef HELLFIRE\r\n\tIS_IROCK,\r\n\tIS_ISCROL,\r\n\tIS_ISCROL,\r\n\tIS_IROCK,\r\n\tIS_IMUSH,\r\n\tIS_IHARM,\r\n\tIS_ILARM,\r\n\tIS_ILARM,\r\n#endif\r\n};\r\n#ifdef HELLFIRE\r\nchar *CornerStoneRegKey = \"SItem\";\r\n#endif\r\n/** Specifies the current Y-coordinate used for validation of items on ground. */\r\nint idoppely = 16;\r\n/** Maps from Griswold premium item number to a quality level delta as added to the base quality level. */\r\nint premiumlvladd[SMITH_PREMIUM_ITEMS] = {\r\n\t// clang-format off\r\n\t-1,\r\n\t-1,\r\n#ifdef HELLFIRE\r\n\t-1,\r\n#endif\r\n\t 0,\r\n\t 0,\r\n#ifdef HELLFIRE\r\n\t 0,\r\n\t 0,\r\n\t 1,\r\n\t 1,\r\n\t 1,\r\n#endif\r\n\t 1,\r\n\t 2,\r\n#ifdef HELLFIRE\r\n\t 2,\r\n\t 3,\r\n\t 3,\r\n#endif\r\n\t// clang-format on\r\n};\r\n\r\n#ifdef HELLFIRE\r\nint get_ring_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_RING && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_RING && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_bow_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_BOW && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_BOW && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_staff_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_STAFF && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_STAFF && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_sword_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_SWORD && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_SWORD && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_helm_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_HELM && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_HELM && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_shield_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_SHIELD && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_SHIELD && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_armor_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE\r\n\t\t    && (plr[i].InvBody[j]._itype == ITYPE_LARMOR || plr[i].InvBody[j]._itype == ITYPE_MARMOR || plr[i].InvBody[j]._itype == ITYPE_HARMOR)\r\n\t\t    && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE\r\n\t\t    && (plr[i].InvList[j]._itype == ITYPE_LARMOR || plr[i].InvList[j]._itype == ITYPE_MARMOR || plr[i].InvList[j]._itype == ITYPE_HARMOR)\r\n\t\t    && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_mace_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_MACE && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_MACE && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_amulet_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_AMULET && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_AMULET && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint get_axe_max_value(int i)\r\n{\r\n\tint j, res;\r\n\r\n\tres = 0;\r\n\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\tif (plr[i].InvBody[j]._iClass != ITYPE_NONE && plr[i].InvBody[j]._itype == ITYPE_AXE && res < plr[i].InvBody[j]._iIvalue)\r\n\t\t\tres = plr[i].InvBody[j]._iIvalue;\r\n\t}\r\n\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\tif (plr[i].InvList[j]._iClass != ITYPE_NONE && plr[i].InvList[j]._itype == ITYPE_AXE && res < plr[i].InvList[j]._iIvalue)\r\n\t\t\tres = plr[i].InvList[j]._iIvalue;\r\n\t}\r\n\r\n\treturn res;\r\n}\r\n\r\nint items_get_currlevel()\r\n{\r\n\tint lvl;\r\n\r\n\tlvl = currlevel;\r\n\tif (currlevel >= 17 && currlevel <= 20)\r\n\t\tlvl = currlevel - 8;\r\n\tif (currlevel >= 21 && currlevel <= 24)\r\n\t\tlvl = currlevel - 7;\r\n\r\n\treturn lvl;\r\n}\r\n#endif\r\n\r\nvoid InitItemGFX()\r\n{\r\n#ifdef HELLFIRE\r\n\tDWORD i;\r\n#else\r\n\tint i;\r\n#endif\r\n\tchar arglist[64];\r\n\r\n\tfor (i = 0; i < ITEMTYPES; i++) {\r\n\t\tsprintf(arglist, \"Items\\\\%s.CEL\", ItemDropNames[i]);\r\n\t\titemanims[i] = LoadFileInMem(arglist, NULL);\r\n\t}\r\n\tmemset(UniqueItemFlag, 0, sizeof(UniqueItemFlag));\r\n}\r\n\r\nBOOL ItemPlace(int xp, int yp)\r\n{\r\n\tif (dMonster[xp][yp] != 0)\r\n\t\treturn FALSE;\r\n\tif (dPlayer[xp][yp] != 0)\r\n\t\treturn FALSE;\r\n\tif (dItem[xp][yp] != 0)\r\n\t\treturn FALSE;\r\n\tif (dObject[xp][yp] != 0)\r\n\t\treturn FALSE;\r\n\tif (dFlags[xp][yp] & BFLAG_POPULATED)\r\n\t\treturn FALSE;\r\n\tif (nSolidTable[dPiece[xp][yp]])\r\n\t\treturn FALSE;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid AddInitItems()\r\n{\r\n\tint x, y, i, j, rnd;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\trnd = random_(11, 3) + 3;\r\n\tfor (j = 0; j < rnd; j++) {\r\n\t\ti = itemavail[0];\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = i;\r\n\t\tx = random_(12, 80) + 16;\r\n\t\ty = random_(12, 80) + 16;\r\n\t\twhile (!ItemPlace(x, y)) {\r\n\t\t\tx = random_(12, 80) + 16;\r\n\t\t\ty = random_(12, 80) + 16;\r\n\t\t}\r\n\t\titem[i]._ix = x;\r\n\t\titem[i]._iy = y;\r\n\t\tdItem[x][y] = i + 1;\r\n\t\titem[i]._iSeed = GetRndSeed();\r\n\t\tSetRndSeed(item[i]._iSeed);\r\n#ifdef HELLFIRE\r\n\t\tif (random_(12, 2) != 0)\r\n\t\t\tGetItemAttrs(i, IDI_HEAL, curlv);\r\n\t\telse\r\n\t\t\tGetItemAttrs(i, IDI_MANA, curlv);\r\n\t\titem[i]._iCreateInfo = curlv + CF_PREGEN;\r\n#else\r\n\t\tif (random_(12, 2) != 0)\r\n\t\t\tGetItemAttrs(i, IDI_HEAL, currlevel);\r\n\t\telse\r\n\t\t\tGetItemAttrs(i, IDI_MANA, currlevel);\r\n\t\titem[i]._iCreateInfo = currlevel + CF_PREGEN;\r\n#endif\r\n\t\tSetupItem(i);\r\n\t\titem[i]._iAnimFrame = item[i]._iAnimLen;\r\n\t\titem[i]._iAnimFlag = FALSE;\r\n\t\titem[i]._iSelFlag = 1;\r\n\t\tDeltaAddItem(i);\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic void SpawnNote()\r\n{\r\n\tint x, y, id;\r\n\r\n\tx = random_(12, 80) + 16;\r\n\ty = random_(12, 80) + 16;\r\n\twhile (!ItemPlace(x, y)) {\r\n\t\tx = random_(12, 80) + 16;\r\n\t\ty = random_(12, 80) + 16;\r\n\t}\r\n\tswitch (currlevel) {\r\n\tcase 22:\r\n\t\tid = IDI_NOTE2;\r\n\t\tbreak;\r\n\tcase 23:\r\n\t\tid = IDI_NOTE3;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tid = IDI_NOTE1;\r\n\t\tbreak;\r\n\t}\r\n\tSpawnQuestItem(id, x, y, 0, 1);\r\n}\r\n#endif\r\n\r\nvoid InitItems()\r\n{\r\n\tint i;\r\n\tlong s;\r\n\r\n\tGetItemAttrs(0, IDI_GOLD, 1);\r\n\tgolditem = item[0];\r\n\tgolditem._iStatFlag = TRUE;\r\n\tnumitems = 0;\r\n\r\n\tfor (i = 0; i < MAXITEMS; i++) {\r\n\t\titem[i]._itype = ITYPE_MISC; // BUGFIX Should be ITYPE_NONE\r\n\t\titem[i]._ix = 0;\r\n\t\titem[i]._iy = 0;\r\n\t\titem[i]._iAnimFlag = FALSE;\r\n\t\titem[i]._iSelFlag = 0;\r\n\t\titem[i]._iIdentified = FALSE;\r\n\t\titem[i]._iPostDraw = FALSE;\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXITEMS; i++) {\r\n\t\titemavail[i] = i;\r\n\t\titemactive[i] = 0;\r\n\t}\r\n\r\n\tif (!setlevel) {\r\n\t\ts = GetRndSeed(); /* unused */\r\n\t\tif (QuestStatus(Q_ROCK))\r\n\t\t\tSpawnRock();\r\n\t\tif (QuestStatus(Q_ANVIL))\r\n\t\t\tSpawnQuestItem(IDI_ANVIL, 2 * setpc_x + 27, 2 * setpc_y + 27, 0, 1);\r\n#ifdef HELLFIRE\r\n\t\tif (UseCowFarmer && currlevel == 20)\r\n\t\t\tSpawnQuestItem(IDI_BROWNSUIT, 25, 25, 3, 1);\r\n\t\tif (UseCowFarmer && currlevel == 19)\r\n\t\t\tSpawnQuestItem(IDI_GREYSUIT, 25, 25, 3, 1);\r\n#endif\r\n\t\tif (currlevel > 0 && currlevel < 16)\r\n\t\t\tAddInitItems();\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel >= 21 && currlevel <= 23)\r\n\t\t\tSpawnNote();\r\n#endif\r\n\t}\r\n\r\n\tuitemflag = FALSE;\r\n\r\n\t// BUGFIX: item get records not reset when resetting items.\r\n}\r\n\r\nvoid CalcPlrItemVals(int p, BOOL Loadgfx)\r\n{\r\n\tint pvid, d;\r\n\r\n\tint mind = 0; // min damage\r\n\tint maxd = 0; // max damage\r\n\tint tac = 0;  // accuracy\r\n\r\n\tint g;\r\n\tint i;\r\n\tint mi;\r\n\r\n\tint bdam = 0;   // bonus damage\r\n\tint btohit = 0; // bonus chance to hit\r\n\tint bac = 0;    // bonus accuracy\r\n\r\n\tint iflgs = ISPL_NONE; // item_special_effect flags\r\n\r\n#ifdef HELLFIRE\r\n\tint pDamAcFlags = 0;\r\n#endif\r\n\r\n\tint sadd = 0; // added strength\r\n\tint madd = 0; // added magic\r\n\tint dadd = 0; // added dexterity\r\n\tint vadd = 0; // added vitality\r\n\r\n\tunsigned __int64 spl = 0; // bitarray for all enabled/active spells\r\n\r\n\tint fr = 0; // fire resistance\r\n\tint lr = 0; // lightning resistance\r\n\tint mr = 0; // magic resistance\r\n\r\n\tint dmod = 0; // bonus damage mod?\r\n\tint ghit = 0; // increased damage from enemies\r\n\r\n\tint lrad = 10; // light radius\r\n\r\n\tint ihp = 0;   // increased HP\r\n\tint imana = 0; // increased mana\r\n\r\n\tint spllvladd = 0; // increased spell level\r\n\tint enac = 0;      // enhanced accuracy\r\n\r\n\tint fmin = 0; // minimum fire damage\r\n\tint fmax = 0; // maximum fire damage\r\n\tint lmin = 0; // minimum lightning damage\r\n\tint lmax = 0; // maximum lightning damage\r\n\r\n\tfor (i = 0; i < NUM_INVLOC; i++) {\r\n\t\tItemStruct *itm = &plr[p].InvBody[i];\r\n\t\tif (itm->_itype != ITYPE_NONE && itm->_iStatFlag) {\r\n\r\n\t\t\tmind += itm->_iMinDam;\r\n\t\t\tmaxd += itm->_iMaxDam;\r\n\t\t\ttac += itm->_iAC;\r\n\r\n\t\t\tif (itm->_iSpell != SPL_NULL) {\r\n\t\t\t\tspl |= SPELLBIT(itm->_iSpell);\r\n\t\t\t}\r\n\r\n\t\t\tif (itm->_iMagical == ITEM_QUALITY_NORMAL || itm->_iIdentified) {\r\n\t\t\t\tbdam += itm->_iPLDam;\r\n\t\t\t\tbtohit += itm->_iPLToHit;\r\n\t\t\t\tif (itm->_iPLAC) {\r\n\t\t\t\t\tint tmpac = itm->_iAC;\r\n\t\t\t\t\ttmpac *= itm->_iPLAC;\r\n\t\t\t\t\ttmpac /= 100;\r\n\t\t\t\t\tif (tmpac == 0)\r\n\t\t\t\t\t\ttmpac = 1;\r\n\t\t\t\t\tbac += tmpac;\r\n\t\t\t\t}\r\n\t\t\t\tiflgs |= itm->_iFlags;\r\n#ifdef HELLFIRE\r\n\t\t\t\tpDamAcFlags |= itm->_iDamAcFlags;\r\n#endif\r\n\t\t\t\tsadd += itm->_iPLStr;\r\n\t\t\t\tmadd += itm->_iPLMag;\r\n\t\t\t\tdadd += itm->_iPLDex;\r\n\t\t\t\tvadd += itm->_iPLVit;\r\n\t\t\t\tfr += itm->_iPLFR;\r\n\t\t\t\tlr += itm->_iPLLR;\r\n\t\t\t\tmr += itm->_iPLMR;\r\n\t\t\t\tdmod += itm->_iPLDamMod;\r\n\t\t\t\tghit += itm->_iPLGetHit;\r\n\t\t\t\tlrad += itm->_iPLLight;\r\n\t\t\t\tihp += itm->_iPLHP;\r\n\t\t\t\timana += itm->_iPLMana;\r\n\t\t\t\tspllvladd += itm->_iSplLvlAdd;\r\n\t\t\t\tenac += itm->_iPLEnAc;\r\n\t\t\t\tfmin += itm->_iFMinDam;\r\n\t\t\t\tfmax += itm->_iFMaxDam;\r\n\t\t\t\tlmin += itm->_iLMinDam;\r\n\t\t\t\tlmax += itm->_iLMaxDam;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (mind == 0 && maxd == 0) {\r\n\t\tmind = 1;\r\n\t\tmaxd = 1;\r\n\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD && plr[p].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {\r\n\t\t\tmaxd = 3;\r\n\t\t}\r\n\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD && plr[p].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {\r\n\t\t\tmaxd = 3;\r\n\t\t}\r\n\r\n#ifdef HELLFIRE\r\n\t\tif (plr[p]._pClass == PC_MONK) {\r\n\t\t\tmind = max(mind, plr[p]._pLevel >> 1);\r\n\t\t\tmaxd = max(maxd, plr[p]._pLevel);\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif ((plr[p]._pSpellFlags & 2) == 2) {\r\n\t\tsadd += 2 * plr[p]._pLevel;\r\n\t\tdadd += plr[p]._pLevel + plr[p]._pLevel / 2;\r\n\t\tvadd += 2 * plr[p]._pLevel;\r\n\t}\r\n\tif ((plr[p]._pSpellFlags & 4) == 4) {\r\n\t\tsadd -= 2 * plr[p]._pLevel;\r\n\t\tdadd -= plr[p]._pLevel + plr[p]._pLevel / 2;\r\n\t\tvadd -= 2 * plr[p]._pLevel;\r\n\t}\r\n#endif\r\n\r\n\tplr[p]._pIMinDam = mind;\r\n\tplr[p]._pIMaxDam = maxd;\r\n\tplr[p]._pIAC = tac;\r\n\tplr[p]._pIBonusDam = bdam;\r\n\tplr[p]._pIBonusToHit = btohit;\r\n\tplr[p]._pIBonusAC = bac;\r\n\tplr[p]._pIFlags = iflgs;\r\n#ifdef HELLFIRE\r\n\tplr[p].pDamAcFlags = pDamAcFlags;\r\n#endif\r\n\tplr[p]._pIBonusDamMod = dmod;\r\n\tplr[p]._pIGetHit = ghit;\r\n\r\n\tif (lrad < 2) {\r\n\t\tlrad = 2;\r\n\t}\r\n\tif (lrad > 15) {\r\n\t\tlrad = 15;\r\n\t}\r\n\r\n\tif (plr[p]._pLightRad != lrad && p == myplr) {\r\n\t\tChangeLightRadius(plr[p]._plid, lrad);\r\n\r\n\t\tif (lrad < 10) {\r\n\t\t\tChangeVisionRadius(plr[p]._pvid, 10);\r\n\t\t} else {\r\n\t\t\tChangeVisionRadius(plr[p]._pvid, lrad);\r\n\t\t}\r\n\r\n\t\tplr[p]._pLightRad = lrad;\r\n\t}\r\n\r\n\tplr[p]._pStrength = sadd + plr[p]._pBaseStr;\r\n\tif (plr[myplr]._pStrength <= 0) {\r\n\t\tplr[myplr]._pStrength = 0;\r\n\t}\r\n\r\n\tplr[p]._pMagic = madd + plr[p]._pBaseMag;\r\n\tif (plr[myplr]._pMagic <= 0) {\r\n\t\tplr[myplr]._pMagic = 0;\r\n\t}\r\n\r\n\tplr[p]._pDexterity = dadd + plr[p]._pBaseDex;\r\n\tif (plr[myplr]._pDexterity <= 0) {\r\n\t\tplr[myplr]._pDexterity = 0;\r\n\t}\r\n\r\n\tplr[p]._pVitality = vadd + plr[p]._pBaseVit;\r\n\tif (plr[myplr]._pVitality <= 0) {\r\n\t\tplr[myplr]._pVitality = 0;\r\n\t}\r\n\r\n\tif (plr[p]._pClass == PC_ROGUE) {\r\n\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 200;\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse if (plr[p]._pClass == PC_MONK) {\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_STAFF) {\r\n\t\t\tif (plr[p].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_STAFF && (plr[p].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE || plr[p].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE)) {\r\n\t\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 300;\r\n\t\t\t} else {\r\n\t\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 150;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 150;\r\n\t\t}\r\n\t} else if (plr[p]._pClass == PC_BARD) {\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD || plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SWORD)\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 150;\r\n\t\telse if (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_BOW || plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_BOW) {\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 250;\r\n\t\t} else {\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * plr[p]._pStrength / 100;\r\n\t\t}\r\n\t} else if (plr[p]._pClass == PC_BARBARIAN) {\r\n\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_AXE || plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_AXE) {\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * plr[p]._pStrength / 75;\r\n\t\t} else if (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_MACE || plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_MACE) {\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * plr[p]._pStrength / 75;\r\n\t\t} else if (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_BOW || plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_BOW) {\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * plr[p]._pStrength / 300;\r\n\t\t} else {\r\n\t\t\tplr[p]._pDamageMod = plr[p]._pLevel * plr[p]._pStrength / 100;\r\n\t\t}\r\n\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD || plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {\r\n\t\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD)\r\n\t\t\t\tplr[p]._pIAC -= plr[p].InvBody[INVLOC_HAND_LEFT]._iAC / 2;\r\n\t\t\telse if (plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD)\r\n\t\t\t\tplr[p]._pIAC -= plr[p].InvBody[INVLOC_HAND_RIGHT]._iAC / 2;\r\n\t\t} else if (plr[p].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_STAFF && plr[p].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_STAFF && plr[p].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_BOW && plr[p].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_BOW) {\r\n\t\t\tplr[p]._pDamageMod += plr[p]._pLevel * plr[p]._pVitality / 100;\r\n\t\t}\r\n\t\tplr[p]._pIAC += plr[p]._pLevel / 4;\r\n\t}\r\n#endif\r\n\telse {\r\n\t\tplr[p]._pDamageMod = plr[p]._pLevel * plr[p]._pStrength / 100;\r\n\t}\r\n\r\n\tplr[p]._pISpells = spl;\r\n\r\n\t// check if the current RSplType is a valid/allowed spell\r\n\tif (plr[p]._pRSplType == RSPLTYPE_CHARGES\r\n\t    && !(plr[p]._pISpells & SPELLBIT(plr[p]._pRSpell))) {\r\n\t\tplr[p]._pRSpell = SPL_INVALID;\r\n\t\tplr[p]._pRSplType = RSPLTYPE_INVALID;\r\n\t\tforce_redraw = 255;\r\n\t}\r\n\r\n\tplr[p]._pISplLvlAdd = spllvladd;\r\n\tplr[p]._pIEnAc = enac;\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[p]._pClass == PC_BARBARIAN) {\r\n\t\tmr += plr[p]._pLevel;\r\n\t\tfr += plr[p]._pLevel;\r\n\t\tlr += plr[p]._pLevel;\r\n\t}\r\n\r\n\tif ((plr[p]._pSpellFlags & 4) == 4) {\r\n\t\tmr -= plr[p]._pLevel;\r\n\t\tfr -= plr[p]._pLevel;\r\n\t\tlr -= plr[p]._pLevel;\r\n\t}\r\n#endif\r\n\r\n\tif (iflgs & ISPL_ALLRESZERO) {\r\n\t\t// reset resistances to zero if the respective special effect is active\r\n\t\tmr = 0;\r\n\t\tfr = 0;\r\n\t\tlr = 0;\r\n\t}\r\n\r\n\tif (mr > MAXRESIST)\r\n\t\tmr = MAXRESIST;\r\n#ifdef HELLFIRE\r\n\telse if (mr < 0)\r\n\t\tmr = 0;\r\n#endif\r\n\tplr[p]._pMagResist = mr;\r\n\r\n\tif (fr > MAXRESIST)\r\n\t\tfr = MAXRESIST;\r\n#ifdef HELLFIRE\r\n\telse if (fr < 0)\r\n\t\tfr = 0;\r\n#endif\r\n\tplr[p]._pFireResist = fr;\r\n\r\n\tif (lr > MAXRESIST)\r\n\t\tlr = MAXRESIST;\r\n#ifdef HELLFIRE\r\n\telse if (lr < 0)\r\n\t\tlr = 0;\r\n#endif\r\n\tplr[p]._pLghtResist = lr;\r\n\r\n\tif (plr[p]._pClass == PC_WARRIOR) {\r\n\t\tvadd <<= 1;\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse if (plr[p]._pClass == PC_BARBARIAN) {\r\n\t\tvadd += vadd;\r\n\t\tvadd += (vadd >> 2);\r\n\t} else if (plr[p]._pClass == PC_ROGUE || plr[p]._pClass == PC_MONK || plr[p]._pClass == PC_BARD) {\r\n#else\r\n\tif (plr[p]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\tvadd += vadd >> 1;\r\n\t}\r\n\tihp += (vadd << 6);\r\n\r\n\tif (plr[p]._pClass == PC_SORCERER) {\r\n\t\tmadd <<= 1;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (plr[p]._pClass == PC_ROGUE || plr[p]._pClass == PC_MONK) {\r\n#else\r\n\tif (plr[p]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\tmadd += madd >> 1;\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse if (plr[p]._pClass == PC_BARD) {\r\n\t\tmadd += (madd >> 2) + (madd >> 1);\r\n\t}\r\n#endif\r\n\timana += (madd << 6);\r\n\r\n\tplr[p]._pHitPoints = ihp + plr[p]._pHPBase;\r\n\tplr[p]._pMaxHP = ihp + plr[p]._pMaxHPBase;\r\n#ifdef HELLFIRE\r\n\tif (plr[p]._pHitPoints > plr[p]._pMaxHP)\r\n\t\tplr[p]._pHitPoints = plr[p]._pMaxHP;\r\n#endif\r\n\r\n\tif (p == myplr && (plr[p]._pHitPoints >> 6) <= 0) {\r\n\t\tSetPlayerHitPoints(p, 0);\r\n\t}\r\n\r\n\tplr[p]._pMana = imana + plr[p]._pManaBase;\r\n\tplr[p]._pMaxMana = imana + plr[p]._pMaxManaBase;\r\n#ifdef HELLFIRE\r\n\tif (plr[p]._pMana > plr[p]._pMaxMana)\r\n\t\tplr[p]._pMana = plr[p]._pMaxMana;\r\n#endif\r\n\r\n\tplr[p]._pIFMinDam = fmin;\r\n\tplr[p]._pIFMaxDam = fmax;\r\n\tplr[p]._pILMinDam = lmin;\r\n\tplr[p]._pILMaxDam = lmax;\r\n\r\n\tif (iflgs & ISPL_INFRAVISION) {\r\n\t\tplr[p]._pInfraFlag = TRUE;\r\n\t} else {\r\n\t\tplr[p]._pInfraFlag = FALSE;\r\n\t}\r\n\r\n\tplr[p]._pBlockFlag = FALSE;\r\n#ifdef HELLFIRE\r\n\tif (plr[p]._pClass == PC_MONK) {\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF && plr[p].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {\r\n\t\t\tplr[p]._pBlockFlag = TRUE;\r\n\t\t\tplr[p]._pIFlags |= ISPL_FASTBLOCK;\r\n\t\t}\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_STAFF && plr[p].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {\r\n\t\t\tplr[p]._pBlockFlag = TRUE;\r\n\t\t\tplr[p]._pIFlags |= ISPL_FASTBLOCK;\r\n\t\t}\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE && plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE)\r\n\t\t\tplr[p]._pBlockFlag = TRUE;\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON && plr[p].InvBody[INVLOC_HAND_LEFT]._iLoc != ILOC_TWOHAND && plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE)\r\n\t\t\tplr[p]._pBlockFlag = TRUE;\r\n\t\tif (plr[p].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON && plr[p].InvBody[INVLOC_HAND_RIGHT]._iLoc != ILOC_TWOHAND && plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE)\r\n\t\t\tplr[p]._pBlockFlag = TRUE;\r\n\t}\r\n#endif\r\n\tplr[p]._pwtype = WT_MELEE;\r\n\r\n\tg = 0;\r\n\r\n\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE\r\n\t    && plr[p].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON\r\n\t    && plr[p].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {\r\n\t\tg = plr[p].InvBody[INVLOC_HAND_LEFT]._itype;\r\n\t}\r\n\r\n\tif (plr[p].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE\r\n\t    && plr[p].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON\r\n\t    && plr[p].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {\r\n\t\tg = plr[p].InvBody[INVLOC_HAND_RIGHT]._itype;\r\n\t}\r\n\r\n\tswitch (g) {\r\n\tcase ITYPE_SWORD:\r\n\t\tg = ANIM_ID_SWORD;\r\n\t\tbreak;\r\n\tcase ITYPE_AXE:\r\n\t\tg = ANIM_ID_AXE;\r\n\t\tbreak;\r\n\tcase ITYPE_BOW:\r\n\t\tplr[p]._pwtype = WT_RANGED;\r\n\t\tg = ANIM_ID_BOW;\r\n\t\tbreak;\r\n\tcase ITYPE_MACE:\r\n\t\tg = ANIM_ID_MACE;\r\n\t\tbreak;\r\n\tcase ITYPE_STAFF:\r\n\t\tg = ANIM_ID_STAFF;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD && plr[p].InvBody[INVLOC_HAND_LEFT]._iStatFlag) {\r\n\t\tplr[p]._pBlockFlag = TRUE;\r\n\t\tg++;\r\n\t}\r\n\tif (plr[p].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD && plr[p].InvBody[INVLOC_HAND_RIGHT]._iStatFlag) {\r\n\t\tplr[p]._pBlockFlag = TRUE;\r\n\t\tg++;\r\n\t}\r\n\r\n#ifndef SPAWN\r\n#ifdef HELLFIRE\r\n\tif (plr[p].InvBody[INVLOC_CHEST]._itype == ITYPE_HARMOR && plr[p].InvBody[INVLOC_CHEST]._iStatFlag) {\r\n\t\tif (plr[p]._pClass == PC_MONK && plr[p].InvBody[INVLOC_CHEST]._iMagical == ITEM_QUALITY_UNIQUE)\r\n\t\t\tplr[p]._pIAC += plr[p]._pLevel >> 1;\r\n\t\tg += ANIM_ID_HEAVY_ARMOR;\r\n\t} else if (plr[p].InvBody[INVLOC_CHEST]._itype == ITYPE_MARMOR && plr[p].InvBody[INVLOC_CHEST]._iStatFlag) {\r\n\t\tif (plr[p]._pClass == PC_MONK) {\r\n\t\t\tif (plr[p].InvBody[INVLOC_CHEST]._iMagical == ITEM_QUALITY_UNIQUE)\r\n\t\t\t\tplr[p]._pIAC += plr[p]._pLevel << 1;\r\n\t\t\telse\r\n\t\t\t\tplr[p]._pIAC += plr[p]._pLevel >> 1;\r\n\t\t}\r\n\t\tg += ANIM_ID_MEDIUM_ARMOR;\r\n\t} else if (plr[p]._pClass == PC_MONK) {\r\n\t\tplr[p]._pIAC += plr[p]._pLevel << 1;\r\n\t}\r\n#else\r\n\tif (plr[p].InvBody[INVLOC_CHEST]._itype == ITYPE_MARMOR && plr[p].InvBody[INVLOC_CHEST]._iStatFlag) {\r\n\t\tg += ANIM_ID_MEDIUM_ARMOR;\r\n\t}\r\n\tif (plr[p].InvBody[INVLOC_CHEST]._itype == ITYPE_HARMOR && plr[p].InvBody[INVLOC_CHEST]._iStatFlag) {\r\n\t\tg += ANIM_ID_HEAVY_ARMOR;\r\n\t}\r\n#endif\r\n#endif\r\n\r\n\tif (plr[p]._pgfxnum != g && Loadgfx) {\r\n\t\tplr[p]._pgfxnum = g;\r\n\t\tplr[p]._pGFXLoad = 0;\r\n\t\tLoadPlrGFX(p, PFILE_STAND);\r\n\t\tSetPlrAnims(p);\r\n\r\n\t\td = plr[p]._pdir;\r\n\r\n\t\tassert(plr[p]._pNAnim[d]);\r\n\t\tplr[p]._pAnimData = plr[p]._pNAnim[d];\r\n\r\n\t\tplr[p]._pAnimLen = plr[p]._pNFrames;\r\n\t\tplr[p]._pAnimFrame = 1;\r\n\t\tplr[p]._pAnimCnt = 0;\r\n\t\tplr[p]._pAnimDelay = 3;\r\n\t\tplr[p]._pAnimWidth = plr[p]._pNWidth;\r\n\t\tplr[p]._pAnimWidth2 = (plr[p]._pNWidth - 64) >> 1;\r\n\t} else {\r\n\t\tplr[p]._pgfxnum = g;\r\n\t}\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmi = missileactive[i];\r\n\t\tif (missile[mi]._mitype == MIS_MANASHIELD && missile[mi]._misource == p) {\r\n\t\t\tmissile[mi]._miVar1 = plr[p]._pHitPoints;\r\n\t\t\tmissile[mi]._miVar2 = plr[p]._pHPBase;\r\n#ifdef HELLFIRE\r\n\t\t\tbreak;\r\n#endif\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (plr[p].InvBody[INVLOC_AMULET]._itype == ITYPE_NONE || plr[p].InvBody[INVLOC_AMULET].IDidx != IDI_AURIC) {\r\n\t\tint half = MaxGold;\r\n\t\tMaxGold = auricGold / 2;\r\n\r\n\t\tif (half != MaxGold)\r\n\t\t\tStripTopGold(p);\r\n\t} else {\r\n\t\tMaxGold = auricGold;\r\n\t}\r\n#endif\r\n\r\n\tdrawmanaflag = TRUE;\r\n\tdrawhpflag = TRUE;\r\n}\r\n\r\nvoid CalcPlrScrolls(int p)\r\n{\r\n\tint i, j;\r\n\r\n\tplr[p]._pScrlSpells = 0;\r\n\tfor (i = 0; i < plr[p]._pNumInv; i++) {\r\n\t\tif (plr[p].InvList[i]._itype != ITYPE_NONE && (plr[p].InvList[i]._iMiscId == IMISC_SCROLL || plr[p].InvList[i]._iMiscId == IMISC_SCROLLT)) {\r\n\t\t\tif (plr[p].InvList[i]._iStatFlag)\r\n\t\t\t\tplr[p]._pScrlSpells |= SPELLBIT(plr[p].InvList[i]._iSpell);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (j = 0; j < MAXBELTITEMS; j++) {\r\n\t\tif (plr[p].SpdList[j]._itype != ITYPE_NONE && (plr[p].SpdList[j]._iMiscId == IMISC_SCROLL || plr[p].SpdList[j]._iMiscId == IMISC_SCROLLT)) {\r\n\t\t\tif (plr[p].SpdList[j]._iStatFlag)\r\n\t\t\t\tplr[p]._pScrlSpells |= SPELLBIT(plr[p].SpdList[j]._iSpell);\r\n\t\t}\r\n\t}\r\n\tif (plr[p]._pRSplType == RSPLTYPE_SCROLL) {\r\n\t\tif (!(plr[p]._pScrlSpells & 1 << (plr[p]._pRSpell - 1))) { // BUGFIX: apply SPELLBIT macro\r\n\t\t\tplr[p]._pRSpell = SPL_INVALID;\r\n\t\t\tplr[p]._pRSplType = RSPLTYPE_INVALID;\r\n\t\t\tforce_redraw = 255;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CalcPlrStaff(int p)\r\n{\r\n\tplr[p]._pISpells = 0;\r\n\tif (plr[p].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE\r\n\t    && plr[p].InvBody[INVLOC_HAND_LEFT]._iStatFlag\r\n\t    && plr[p].InvBody[INVLOC_HAND_LEFT]._iCharges > 0) {\r\n\t\tplr[p]._pISpells |= SPELLBIT(plr[p].InvBody[INVLOC_HAND_LEFT]._iSpell);\r\n\t}\r\n}\r\n\r\nvoid CalcSelfItems(int pnum)\r\n{\r\n\tint i;\r\n\tPlayerStruct *p;\r\n\tItemStruct *pi;\r\n\tBOOL sf, changeflag;\r\n\tint sa, ma, da;\r\n\r\n\tp = &plr[pnum];\r\n\r\n\tsa = 0;\r\n\tma = 0;\r\n\tda = 0;\r\n\tpi = p->InvBody;\r\n\tfor (i = 0; i < NUM_INVLOC; i++, pi++) {\r\n\t\tif (pi->_itype != ITYPE_NONE) {\r\n\t\t\tpi->_iStatFlag = TRUE;\r\n\t\t\tif (pi->_iIdentified) {\r\n\t\t\t\tsa += pi->_iPLStr;\r\n\t\t\t\tma += pi->_iPLMag;\r\n\t\t\t\tda += pi->_iPLDex;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tdo {\r\n\t\tchangeflag = FALSE;\r\n\t\tpi = p->InvBody;\r\n\t\tfor (i = 0; i < NUM_INVLOC; i++, pi++) {\r\n\t\t\tif (pi->_itype != ITYPE_NONE && pi->_iStatFlag) {\r\n\t\t\t\tsf = TRUE;\r\n\t\t\t\tif (sa + p->_pBaseStr < pi->_iMinStr)\r\n\t\t\t\t\tsf = FALSE;\r\n\t\t\t\tif (ma + p->_pBaseMag < pi->_iMinMag)\r\n\t\t\t\t\tsf = FALSE;\r\n\t\t\t\tif (da + p->_pBaseDex < pi->_iMinDex)\r\n\t\t\t\t\tsf = FALSE;\r\n\t\t\t\tif (!sf) {\r\n\t\t\t\t\tchangeflag = TRUE;\r\n\t\t\t\t\tpi->_iStatFlag = FALSE;\r\n\t\t\t\t\tif (pi->_iIdentified) {\r\n\t\t\t\t\t\tsa -= pi->_iPLStr;\r\n\t\t\t\t\t\tma -= pi->_iPLMag;\r\n\t\t\t\t\t\tda -= pi->_iPLDex;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} while (changeflag);\r\n}\r\n\r\nstatic BOOL ItemMinStats(PlayerStruct *p, ItemStruct *x)\r\n{\r\n\tif (p->_pMagic < x->_iMinMag)\r\n\t\treturn FALSE;\r\n\r\n\tif (p->_pStrength < x->_iMinStr)\r\n\t\treturn FALSE;\r\n\r\n\tif (p->_pDexterity < x->_iMinDex)\r\n\t\treturn FALSE;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid CalcPlrItemMin(int pnum)\r\n{\r\n\tPlayerStruct *p;\r\n\tItemStruct *pi;\r\n\tint i;\r\n\r\n\tp = &plr[pnum];\r\n\tpi = p->InvList;\r\n\ti = p->_pNumInv;\r\n\r\n\twhile (i--) {\r\n\t\tpi->_iStatFlag = ItemMinStats(p, pi);\r\n\t\tpi++;\r\n\t}\r\n\r\n\tpi = p->SpdList;\r\n\tfor (i = MAXBELTITEMS; i != 0; i--) {\r\n\t\tif (pi->_itype != ITYPE_NONE) {\r\n\t\t\tpi->_iStatFlag = ItemMinStats(p, pi);\r\n\t\t}\r\n\t\tpi++;\r\n\t}\r\n}\r\n\r\nvoid CalcPlrBookVals(int p)\r\n{\r\n\tint i, slvl;\r\n\r\n\tif (currlevel == 0) {\r\n\t\tfor (i = 1; witchitem[i]._itype != ITYPE_NONE; i++) {\r\n\t\t\tWitchBookLevel(i);\r\n#ifndef HELLFIRE\r\n\t\t\twitchitem[i]._iStatFlag = StoreStatOk(&witchitem[i]);\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; i < plr[p]._pNumInv; i++) {\r\n\t\tif (plr[p].InvList[i]._itype == ITYPE_MISC && plr[p].InvList[i]._iMiscId == IMISC_BOOK) {\r\n\t\t\tplr[p].InvList[i]._iMinMag = spelldata[plr[p].InvList[i]._iSpell].sMinInt;\r\n\t\t\tslvl = plr[p]._pSplLvl[plr[p].InvList[i]._iSpell];\r\n\r\n\t\t\twhile (slvl != 0) {\r\n\t\t\t\tplr[p].InvList[i]._iMinMag += 20 * plr[p].InvList[i]._iMinMag / 100;\r\n\t\t\t\tslvl--;\r\n\t\t\t\tif (plr[p].InvList[i]._iMinMag + 20 * plr[p].InvList[i]._iMinMag / 100 > 255) {\r\n\t\t\t\t\tplr[p].InvList[i]._iMinMag = 255;\r\n\t\t\t\t\tslvl = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tplr[p].InvList[i]._iStatFlag = ItemMinStats(&plr[p], &plr[p].InvList[i]);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CalcPlrInv(int p, BOOL Loadgfx)\r\n{\r\n\tCalcPlrItemMin(p);\r\n\tCalcSelfItems(p);\r\n\tCalcPlrItemVals(p, Loadgfx);\r\n\tCalcPlrItemMin(p);\r\n\tif (p == myplr) {\r\n\t\tCalcPlrBookVals(p);\r\n\t\tCalcPlrScrolls(p);\r\n\t\tCalcPlrStaff(p);\r\n\t\tif (p == myplr && currlevel == 0)\r\n\t\t\tRecalcStoreStats();\r\n\t}\r\n}\r\n\r\nvoid SetPlrHandItem(ItemStruct *h, int idata)\r\n{\r\n\tItemDataStruct *pAllItem;\r\n\r\n\tpAllItem = &AllItemsList[idata];\r\n\r\n\t// zero-initialize struct\r\n\tmemset(h, 0, sizeof(*h));\r\n\r\n\th->_itype = pAllItem->itype;\r\n\th->_iCurs = pAllItem->iCurs;\r\n\tstrcpy(h->_iName, pAllItem->iName);\r\n\tstrcpy(h->_iIName, pAllItem->iName);\r\n\th->_iLoc = pAllItem->iLoc;\r\n\th->_iClass = pAllItem->iClass;\r\n\th->_iMinDam = pAllItem->iMinDam;\r\n\th->_iMaxDam = pAllItem->iMaxDam;\r\n\th->_iAC = pAllItem->iMinAC;\r\n\th->_iMiscId = pAllItem->iMiscId;\r\n\th->_iSpell = pAllItem->iSpell;\r\n\r\n\tif (pAllItem->iMiscId == IMISC_STAFF) {\r\n#ifdef HELLFIRE\r\n\t\th->_iCharges = 18;\r\n#else\r\n\t\th->_iCharges = 40;\r\n#endif\r\n\t}\r\n\r\n\th->_iMaxCharges = h->_iCharges;\r\n\th->_iDurability = pAllItem->iDurability;\r\n\th->_iMaxDur = pAllItem->iDurability;\r\n\th->_iMinStr = pAllItem->iMinStr;\r\n\th->_iMinMag = pAllItem->iMinMag;\r\n\th->_iMinDex = pAllItem->iMinDex;\r\n\th->_ivalue = pAllItem->iValue;\r\n\th->_iIvalue = pAllItem->iValue;\r\n\th->_iPrePower = -1;\r\n\th->_iSufPower = -1;\r\n\th->_iMagical = ITEM_QUALITY_NORMAL;\r\n\th->IDidx = idata;\r\n}\r\n\r\nvoid GetPlrHandSeed(ItemStruct *h)\r\n{\r\n\th->_iSeed = GetRndSeed();\r\n}\r\n\r\nvoid GetGoldSeed(int pnum, ItemStruct *h)\r\n{\r\n\tint i, ii, s;\r\n\tBOOL doneflag;\r\n\r\n\tdo {\r\n\t\tdoneflag = TRUE;\r\n\t\ts = GetRndSeed();\r\n\t\tfor (i = 0; i < numitems; i++) {\r\n\t\t\tii = itemactive[i];\r\n\t\t\tif (item[ii]._iSeed == s)\r\n\t\t\t\tdoneflag = FALSE;\r\n\t\t}\r\n\t\tif (pnum == myplr) {\r\n\t\t\tfor (i = 0; i < plr[pnum]._pNumInv; i++) {\r\n\t\t\t\tif (plr[pnum].InvList[i]._iSeed == s)\r\n\t\t\t\t\tdoneflag = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t} while (!doneflag);\r\n\r\n\th->_iSeed = s;\r\n}\r\n\r\nvoid SetPlrHandSeed(ItemStruct *h, int iseed)\r\n{\r\n\th->_iSeed = iseed;\r\n}\r\n\r\nvoid SetPlrHandGoldCurs(ItemStruct *h)\r\n{\r\n\tif (h->_ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\th->_iCurs = ICURS_GOLD_LARGE;\r\n\telse if (h->_ivalue <= GOLD_SMALL_LIMIT)\r\n\t\th->_iCurs = ICURS_GOLD_SMALL;\r\n\telse\r\n\t\th->_iCurs = ICURS_GOLD_MEDIUM;\r\n}\r\n\r\nvoid CreatePlrItems(int p)\r\n{\r\n\tint i;\r\n\tItemStruct *pi = plr[p].InvBody;\r\n\r\n\tfor (i = NUM_INVLOC; i != 0; i--) {\r\n\t\tpi->_itype = ITYPE_NONE;\r\n\t\tpi++;\r\n\t}\r\n\r\n\t// converting this to a for loop creates a `rep stosd` instruction,\r\n\t// so this probably actually was a memset\r\n\tmemset(&plr[p].InvGrid, 0, sizeof(plr[p].InvGrid));\r\n\r\n\tpi = plr[p].InvList;\r\n\tfor (i = NUM_INV_GRID_ELEM; i != 0; i--) {\r\n\t\tpi->_itype = ITYPE_NONE;\r\n\t\tpi++;\r\n\t}\r\n\r\n\tplr[p]._pNumInv = 0;\r\n\r\n\tpi = &plr[p].SpdList[0];\r\n\tfor (i = MAXBELTITEMS; i != 0; i--) {\r\n\t\tpi->_itype = ITYPE_NONE;\r\n\t\tpi++;\r\n\t}\r\n\r\n\tswitch (plr[p]._pClass) {\r\n\tcase PC_WARRIOR:\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_LEFT], IDI_WARRIOR);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_LEFT]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_RIGHT], IDI_WARRSHLD);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_RIGHT]);\r\n\r\n#ifdef _DEBUG\r\n\t\tif (!debug_mode_key_w) {\r\n#endif\r\n\t\t\tSetPlrHandItem(&plr[p].HoldItem, IDI_WARRCLUB);\r\n\t\t\tGetPlrHandSeed(&plr[p].HoldItem);\r\n\t\t\tAutoPlace(p, 0, 1, 3, TRUE);\r\n#ifdef _DEBUG\r\n\t\t}\r\n#endif\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[0], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[0]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[1], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[1]);\r\n\t\tbreak;\r\n#ifndef SPAWN\r\n\tcase PC_ROGUE:\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_LEFT], IDI_ROGUE);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_LEFT]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[0], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[0]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[1], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[1]);\r\n\t\tbreak;\r\n\tcase PC_SORCERER:\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_LEFT], IDI_SORCEROR);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_LEFT]);\r\n\r\n#ifdef HELLFIRE\r\n\t\tSetPlrHandItem(&plr[p].SpdList[0], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[0]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[1], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[1]);\r\n#else\r\n\t\tSetPlrHandItem(&plr[p].SpdList[0], IDI_MANA);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[0]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[1], IDI_MANA);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[1]);\r\n#endif\r\n\t\tbreak;\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n\tcase PC_MONK:\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_LEFT], IDI_SHORTSTAFF);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_LEFT]);\r\n\t\tSetPlrHandItem(&plr[p].SpdList[0], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[0]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[1], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[1]);\r\n\t\tbreak;\r\n\tcase PC_BARD:\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_LEFT], IDI_BARDSWORD);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_LEFT]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_RIGHT], IDI_BARDDAGGER);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_RIGHT]);\r\n\t\tSetPlrHandItem(&plr[p].SpdList[0], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[0]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[1], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[1]);\r\n\t\tbreak;\r\n\tcase PC_BARBARIAN:\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_LEFT], 139); // TODO: add more enums to items\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_LEFT]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].InvBody[INVLOC_HAND_RIGHT], IDI_WARRSHLD);\r\n\t\tGetPlrHandSeed(&plr[p].InvBody[INVLOC_HAND_RIGHT]);\r\n\t\tSetPlrHandItem(&plr[p].SpdList[0], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[0]);\r\n\r\n\t\tSetPlrHandItem(&plr[p].SpdList[1], IDI_HEAL);\r\n\t\tGetPlrHandSeed(&plr[p].SpdList[1]);\r\n\t\tbreak;\r\n#endif\r\n\t}\r\n\r\n\tSetPlrHandItem(&plr[p].HoldItem, IDI_GOLD);\r\n\tGetPlrHandSeed(&plr[p].HoldItem);\r\n\r\n#ifdef _DEBUG\r\n\tif (!debug_mode_key_w) {\r\n#endif\r\n\t\tplr[p].HoldItem._ivalue = 100;\r\n\t\tplr[p].HoldItem._iCurs = ICURS_GOLD_SMALL;\r\n\t\tplr[p]._pGold = plr[p].HoldItem._ivalue;\r\n\t\tplr[p].InvList[plr[p]._pNumInv++] = plr[p].HoldItem;\r\n\t\tplr[p].InvGrid[30] = plr[p]._pNumInv;\r\n#ifdef _DEBUG\r\n\t} else {\r\n\t\tplr[p].HoldItem._ivalue = GOLD_MAX_LIMIT;\r\n\t\tplr[p].HoldItem._iCurs = ICURS_GOLD_LARGE;\r\n\t\tplr[p]._pGold = plr[p].HoldItem._ivalue * 40;\r\n\t\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\t\tGetPlrHandSeed(&plr[p].HoldItem);\r\n\t\t\tplr[p].InvList[plr[p]._pNumInv++] = plr[p].HoldItem;\r\n\t\t\tplr[p].InvGrid[i] = plr[p]._pNumInv;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tCalcPlrItemVals(p, FALSE);\r\n}\r\n\r\nBOOL ItemSpaceOk(int i, int j)\r\n{\r\n\tint oi;\r\n\r\n\tif (i < 0 || i >= MAXDUNX || j < 0 || j >= MAXDUNY)\r\n\t\treturn FALSE;\r\n\r\n\tif (dMonster[i][j] != 0)\r\n\t\treturn FALSE;\r\n\r\n\tif (dPlayer[i][j] != 0)\r\n\t\treturn FALSE;\r\n\r\n\tif (dItem[i][j] != 0)\r\n\t\treturn FALSE;\r\n\r\n\tif (dObject[i][j] != 0) {\r\n\t\toi = dObject[i][j] > 0 ? dObject[i][j] - 1 : -(dObject[i][j] + 1);\r\n\t\tif (object[oi]._oSolidFlag)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (dObject[i + 1][j + 1] > 0 && object[dObject[i + 1][j + 1] - 1]._oSelFlag != 0) /// BUGFIX: check for dObject OOB\r\n\t\treturn FALSE;\r\n\r\n\tif (dObject[i + 1][j + 1] < 0 && object[-(dObject[i + 1][j + 1] + 1)]._oSelFlag != 0) /// BUGFIX: check for dObject OOB\r\n\t\treturn FALSE;\r\n\r\n\tif (dObject[i + 1][j] > 0 /// BUGFIX: check for dObject OOB\r\n\t    && dObject[i][j + 1] > 0 /// BUGFIX: check for dObject OOB\r\n\t    && object[dObject[i + 1][j] - 1]._oSelFlag != 0\r\n\t    && object[dObject[i][j + 1] - 1]._oSelFlag != 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\treturn !nSolidTable[dPiece[i][j]];\r\n}\r\n\r\nBOOL GetItemSpace(int x, int y, char inum)\r\n{\r\n\tint i, j, rs;\r\n\tint xx, yy;\r\n\tBOOL savail;\r\n\r\n\tyy = 0;\r\n\tfor (j = y - 1; j <= y + 1; j++) {\r\n\t\txx = 0;\r\n\t\tfor (i = x - 1; i <= x + 1; i++) {\r\n\t\t\titemhold[xx][yy] = ItemSpaceOk(i, j);\r\n\t\t\txx++;\r\n\t\t}\r\n\t\tyy++;\r\n\t}\r\n\r\n\tsavail = FALSE;\r\n\tfor (j = 0; j < 3; j++) {\r\n\t\tfor (i = 0; i < 3; i++) {\r\n\t\t\tif (itemhold[i][j])\r\n\t\t\t\tsavail = TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\trs = random_(13, 15) + 1;\r\n\r\n\tif (!savail)\r\n\t\treturn FALSE;\r\n\r\n\txx = 0;\r\n\tyy = 0;\r\n\twhile (rs > 0) {\r\n\t\tif (itemhold[xx][yy])\r\n\t\t\trs--;\r\n\t\tif (rs > 0) {\r\n\t\t\txx++;\r\n\t\t\tif (xx == 3) {\r\n\t\t\t\txx = 0;\r\n\t\t\t\tyy++;\r\n\t\t\t\tif (yy == 3)\r\n\t\t\t\t\tyy = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\txx += x - 1;\r\n\tyy += y - 1;\r\n\titem[inum]._ix = xx;\r\n\titem[inum]._iy = yy;\r\n\tdItem[xx][yy] = inum + 1;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid GetSuperItemSpace(int x, int y, char inum)\r\n{\r\n\tint xx, yy;\r\n\tint i, j, k;\r\n\r\n\tif (!GetItemSpace(x, y, inum)) {\r\n\t\tfor (k = 2; k < 50; k++) {\r\n\t\t\tfor (j = -k; j <= k; j++) {\r\n\t\t\t\tyy = y + j;\r\n\t\t\t\tfor (i = -k; i <= k; i++) {\r\n\t\t\t\t\txx = i + x;\r\n\t\t\t\t\tif (ItemSpaceOk(xx, yy)) {\r\n\t\t\t\t\t\titem[inum]._ix = xx;\r\n\t\t\t\t\t\titem[inum]._iy = yy;\r\n\t\t\t\t\t\tdItem[xx][yy] = inum + 1;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid GetSuperItemLoc(int x, int y, int &xx, int &yy)\r\n{\r\n\tint i, j, k;\r\n\r\n\tfor (k = 1; k < 50; k++) {\r\n\t\tfor (j = -k; j <= k; j++) {\r\n\t\t\tyy = y + j;\r\n\t\t\tfor (i = -k; i <= k; i++) {\r\n\t\t\t\txx = i + x;\r\n\t\t\t\tif (ItemSpaceOk(xx, yy)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CalcItemValue(int i)\r\n{\r\n\tint v;\r\n\r\n\tv = item[i]._iVMult1 + item[i]._iVMult2;\r\n\tif (v > 0) {\r\n\t\tv *= item[i]._ivalue;\r\n\t}\r\n\tif (v < 0) {\r\n\t\tv = item[i]._ivalue / v;\r\n\t}\r\n\tv = item[i]._iVAdd1 + item[i]._iVAdd2 + v;\r\n\tif (v <= 0) {\r\n\t\tv = 1;\r\n\t}\r\n\titem[i]._iIvalue = v;\r\n}\r\n\r\nvoid GetBookSpell(int i, int lvl)\r\n{\r\n\tint rv, s, bs;\r\n\r\n\tif (lvl == 0)\r\n\t\tlvl = 1;\r\n\trv = random_(14, MAX_SPELLS) + 1;\r\n#ifdef SPAWN\r\n\tif (lvl > 5)\r\n\t\tlvl = 5;\r\n#endif\r\n\ts = SPL_FIREBOLT;\r\n#ifdef HELLFIRE\r\n\tbs = SPL_FIREBOLT;\r\n#endif\r\n\twhile (rv > 0) {\r\n\t\tif (spelldata[s].sBookLvl != -1 && lvl >= spelldata[s].sBookLvl) {\r\n\t\t\trv--;\r\n\t\t\tbs = s;\r\n\t\t}\r\n\t\ts++;\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tif (s == SPL_RESURRECT)\r\n\t\t\t\ts = SPL_TELEKINESIS;\r\n\t\t}\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tif (s == SPL_HEALOTHER)\r\n\t\t\t\ts = SPL_FLARE;\r\n\t\t}\r\n\t\tif (s == MAX_SPELLS)\r\n\t\t\ts = 1;\r\n\t}\r\n\tstrcat(item[i]._iName, spelldata[bs].sNameText);\r\n\tstrcat(item[i]._iIName, spelldata[bs].sNameText);\r\n\titem[i]._iSpell = bs;\r\n\titem[i]._iMinMag = spelldata[bs].sMinInt;\r\n\titem[i]._ivalue += spelldata[bs].sBookCost;\r\n\titem[i]._iIvalue += spelldata[bs].sBookCost;\r\n\tif (spelldata[bs].sType == STYPE_FIRE)\r\n\t\titem[i]._iCurs = ICURS_BOOK_RED;\r\n#ifdef HELLFIRE\r\n\telse\r\n#endif\r\n\t    if (spelldata[bs].sType == STYPE_LIGHTNING)\r\n\t\titem[i]._iCurs = ICURS_BOOK_BLUE;\r\n#ifdef HELLFIRE\r\n\telse\r\n#endif\r\n\t    if (spelldata[bs].sType == STYPE_MAGIC)\r\n\t\titem[i]._iCurs = ICURS_BOOK_GREY;\r\n}\r\n\r\nvoid GetStaffPower(int i, int lvl, int bs, BOOL onlygood)\r\n{\r\n\tint l[256];\r\n\tchar istr[128];\r\n\tint nl, j, preidx;\r\n\tBOOL addok;\r\n\tint tmp;\r\n\r\n\ttmp = random_(15, 10);\r\n\tpreidx = -1;\r\n\tif (tmp == 0 || onlygood) {\r\n\t\tnl = 0;\r\n\t\tfor (j = 0; PL_Prefix[j].PLPower != IPL_INVALID; j++) {\r\n\t\t\tif (PL_Prefix[j].PLIType & PLT_STAFF && PL_Prefix[j].PLMinLvl <= lvl) {\r\n\t\t\t\taddok = TRUE;\r\n\t\t\t\tif (onlygood && !PL_Prefix[j].PLOk)\r\n\t\t\t\t\taddok = FALSE;\r\n\t\t\t\tif (addok) {\r\n\t\t\t\t\tl[nl] = j;\r\n\t\t\t\t\tnl++;\r\n\t\t\t\t\tif (PL_Prefix[j].PLDouble) {\r\n\t\t\t\t\t\tl[nl] = j;\r\n\t\t\t\t\t\tnl++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nl != 0) {\r\n\t\t\tpreidx = l[random_(16, nl)];\r\n\t\t\tsprintf(istr, \"%s %s\", PL_Prefix[preidx].PLName, item[i]._iIName);\r\n\t\t\tstrcpy(item[i]._iIName, istr);\r\n\t\t\titem[i]._iMagical = ITEM_QUALITY_MAGIC;\r\n\t\t\tSaveItemPower(\r\n\t\t\t    i,\r\n\t\t\t    PL_Prefix[preidx].PLPower,\r\n\t\t\t    PL_Prefix[preidx].PLParam1,\r\n\t\t\t    PL_Prefix[preidx].PLParam2,\r\n\t\t\t    PL_Prefix[preidx].PLMinVal,\r\n\t\t\t    PL_Prefix[preidx].PLMaxVal,\r\n\t\t\t    PL_Prefix[preidx].PLMultVal);\r\n\t\t\titem[i]._iPrePower = PL_Prefix[preidx].PLPower;\r\n\t\t}\r\n\t}\r\n\tif (!control_WriteStringToBuffer((BYTE *)item[i]._iIName)) {\r\n\t\tstrcpy(item[i]._iIName, AllItemsList[item[i].IDidx].iSName);\r\n\t\tif (preidx != -1) {\r\n\t\t\tsprintf(istr, \"%s %s\", PL_Prefix[preidx].PLName, item[i]._iIName);\r\n\t\t\tstrcpy(item[i]._iIName, istr);\r\n\t\t}\r\n\t\tsprintf(istr, \"%s of %s\", item[i]._iIName, spelldata[bs].sNameText);\r\n\t\tstrcpy(item[i]._iIName, istr);\r\n\t\tif (item[i]._iMagical == ITEM_QUALITY_NORMAL)\r\n\t\t\tstrcpy(item[i]._iName, item[i]._iIName);\r\n\t}\r\n\tCalcItemValue(i);\r\n}\r\n\r\nvoid GetStaffSpell(int i, int lvl, BOOL onlygood)\r\n{\r\n\tint l, rv, s, minc, maxc, v, bs;\r\n\tchar istr[64];\r\n\r\n#ifndef HELLFIRE\r\n\tif (random_(17, 4) == 0) {\r\n\t\tGetItemPower(i, lvl >> 1, lvl, PLT_STAFF, onlygood);\r\n\t} else\r\n#endif\r\n\t{\r\n\t\tl = lvl >> 1;\r\n\t\tif (l == 0)\r\n\t\t\tl = 1;\r\n\t\trv = random_(18, MAX_SPELLS) + 1;\r\n#ifdef SPAWN\r\n\t\tif (lvl > 10)\r\n\t\t\tlvl = 10;\r\n#endif\r\n\t\ts = SPL_FIREBOLT;\r\n\t\twhile (rv > 0) {\r\n\t\t\tif (spelldata[s].sStaffLvl != -1 && l >= spelldata[s].sStaffLvl) {\r\n\t\t\t\trv--;\r\n\t\t\t\tbs = s;\r\n\t\t\t}\r\n\t\t\ts++;\r\n\t\t\tif (gbMaxPlayers == 1 && s == SPL_RESURRECT)\r\n\t\t\t\ts = SPL_TELEKINESIS;\r\n\t\t\tif (gbMaxPlayers == 1 && s == SPL_HEALOTHER)\r\n\t\t\t\ts = SPL_FLARE;\r\n\t\t\tif (s == MAX_SPELLS)\r\n\t\t\t\ts = SPL_FIREBOLT;\r\n\t\t}\r\n\t\tsprintf(istr, \"%s of %s\", item[i]._iName, spelldata[bs].sNameText);\r\n\t\tif (!control_WriteStringToBuffer((BYTE *)istr))\r\n\t\t\tsprintf(istr, \"Staff of %s\", spelldata[bs].sNameText);\r\n\t\tstrcpy(item[i]._iName, istr);\r\n\t\tstrcpy(item[i]._iIName, istr);\r\n\r\n\t\tminc = spelldata[bs].sStaffMin;\r\n\t\tmaxc = spelldata[bs].sStaffMax - minc + 1;\r\n\t\titem[i]._iSpell = bs;\r\n\t\titem[i]._iCharges = minc + random_(19, maxc);\r\n\t\titem[i]._iMaxCharges = item[i]._iCharges;\r\n\r\n\t\titem[i]._iMinMag = spelldata[bs].sMinInt;\r\n\t\tv = item[i]._iCharges * spelldata[bs].sStaffCost / 5;\r\n\t\titem[i]._ivalue += v;\r\n\t\titem[i]._iIvalue += v;\r\n\t\tGetStaffPower(i, lvl, bs, onlygood);\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid GetOilType(int i, int max_lvl)\r\n{\r\n\tint cnt, t, j, r;\r\n\tchar rnd[32];\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (max_lvl == 0)\r\n\t\t\tmax_lvl = 1;\r\n\t\tcnt = 0;\r\n\r\n\t\tfor (j = 0; j < (int)(sizeof(OilLevels) / sizeof(OilLevels[0])); j++) {\r\n\t\t\tif (OilLevels[j] <= max_lvl) {\r\n\t\t\t\trnd[cnt] = j;\r\n\t\t\t\tcnt++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tr = random_(165, cnt);\r\n\t\tt = rnd[r];\r\n\t} else {\r\n\t\tr = random_(165, 2);\r\n\t\tt = (r != 0 ? 6 : 5);\r\n\t}\r\n\tstrcpy(item[i]._iName, OilNames[t]);\r\n\tstrcpy(item[i]._iIName, OilNames[t]);\r\n\titem[i]._iMiscId = OilMagic[t];\r\n\titem[i]._ivalue = OilValues[t];\r\n\titem[i]._iIvalue = OilValues[t];\r\n}\r\n#endif\r\n\r\nvoid GetItemAttrs(int i, int idata, int lvl)\r\n{\r\n\tint rndv;\r\n#ifdef HELLFIRE\r\n\tint itemlevel;\r\n#endif\r\n\r\n\titem[i]._itype = AllItemsList[idata].itype;\r\n\titem[i]._iCurs = AllItemsList[idata].iCurs;\r\n\tstrcpy(item[i]._iName, AllItemsList[idata].iName);\r\n\tstrcpy(item[i]._iIName, AllItemsList[idata].iName);\r\n\titem[i]._iLoc = AllItemsList[idata].iLoc;\r\n\titem[i]._iClass = AllItemsList[idata].iClass;\r\n\titem[i]._iMinDam = AllItemsList[idata].iMinDam;\r\n\titem[i]._iMaxDam = AllItemsList[idata].iMaxDam;\r\n\titem[i]._iAC = AllItemsList[idata].iMinAC + random_(20, AllItemsList[idata].iMaxAC - AllItemsList[idata].iMinAC + 1);\r\n#ifndef HELLFIRE\r\n\titem[i]._iFlags = AllItemsList[idata].iFlags;\r\n#endif\r\n\titem[i]._iMiscId = AllItemsList[idata].iMiscId;\r\n\titem[i]._iSpell = AllItemsList[idata].iSpell;\r\n\titem[i]._iMagical = ITEM_QUALITY_NORMAL;\r\n\titem[i]._ivalue = AllItemsList[idata].iValue;\r\n\titem[i]._iIvalue = AllItemsList[idata].iValue;\r\n\titem[i]._iVAdd1 = 0;\r\n\titem[i]._iVMult1 = 0;\r\n\titem[i]._iVAdd2 = 0;\r\n\titem[i]._iVMult2 = 0;\r\n\titem[i]._iPLDam = 0;\r\n\titem[i]._iPLToHit = 0;\r\n\titem[i]._iPLAC = 0;\r\n\titem[i]._iPLStr = 0;\r\n\titem[i]._iPLMag = 0;\r\n\titem[i]._iPLDex = 0;\r\n\titem[i]._iPLVit = 0;\r\n\titem[i]._iCharges = 0;\r\n\titem[i]._iMaxCharges = 0;\r\n\titem[i]._iDurability = AllItemsList[idata].iDurability;\r\n\titem[i]._iMaxDur = AllItemsList[idata].iDurability;\r\n\titem[i]._iMinStr = AllItemsList[idata].iMinStr;\r\n\titem[i]._iMinMag = AllItemsList[idata].iMinMag;\r\n\titem[i]._iMinDex = AllItemsList[idata].iMinDex;\r\n\titem[i]._iPLFR = 0;\r\n\titem[i]._iPLLR = 0;\r\n\titem[i]._iPLMR = 0;\r\n\titem[i].IDidx = idata;\r\n\titem[i]._iPLDamMod = 0;\r\n\titem[i]._iPLGetHit = 0;\r\n\titem[i]._iPLLight = 0;\r\n\titem[i]._iSplLvlAdd = 0;\r\n\titem[i]._iRequest = FALSE;\r\n\titem[i]._iFMinDam = 0;\r\n\titem[i]._iFMaxDam = 0;\r\n\titem[i]._iLMinDam = 0;\r\n\titem[i]._iLMaxDam = 0;\r\n\titem[i]._iPLEnAc = 0;\r\n\titem[i]._iPLMana = 0;\r\n\titem[i]._iPLHP = 0;\r\n\titem[i]._iPrePower = -1;\r\n\titem[i]._iSufPower = -1;\r\n\r\n#ifndef HELLFIRE\r\n\tif (item[i]._iMiscId == IMISC_BOOK)\r\n\t\tGetBookSpell(i, lvl);\r\n\r\n\tif (item[i]._itype == ITYPE_GOLD) {\r\n\t\tif (gnDifficulty == DIFF_NORMAL)\r\n\t\t\trndv = 5 * currlevel + random_(21, 10 * currlevel);\r\n\t\tif (gnDifficulty == DIFF_NIGHTMARE)\r\n\t\t\trndv = 5 * (currlevel + 16) + random_(21, 10 * (currlevel + 16));\r\n\t\tif (gnDifficulty == DIFF_HELL)\r\n\t\t\trndv = 5 * (currlevel + 32) + random_(21, 10 * (currlevel + 32));\r\n#else\r\n\titem[i]._iFlags = 0;\r\n\titem[i]._iDamAcFlags = 0;\r\n\r\n\tif (item[i]._iMiscId == IMISC_BOOK)\r\n\t\tGetBookSpell(i, lvl);\r\n\r\n\tif (item[i]._iMiscId == IMISC_OILOF)\r\n\t\tGetOilType(i, lvl);\r\n\r\n\titemlevel = items_get_currlevel();\r\n\tif (item[i]._itype == ITYPE_GOLD) {\r\n\t\tif (gnDifficulty == DIFF_NORMAL)\r\n\t\t\trndv = 5 * itemlevel + random_(21, 10 * itemlevel);\r\n\t\telse if (gnDifficulty == DIFF_NIGHTMARE)\r\n\t\t\trndv = 5 * (itemlevel + 16) + random_(21, 10 * (itemlevel + 16));\r\n\t\telse if (gnDifficulty == DIFF_HELL)\r\n\t\t\trndv = 5 * (itemlevel + 32) + random_(21, 10 * (itemlevel + 32));\r\n#endif\r\n\t\tif (leveltype == DTYPE_HELL)\r\n\t\t\trndv += rndv >> 3;\r\n\t\tif (rndv > GOLD_MAX_LIMIT)\r\n\t\t\trndv = GOLD_MAX_LIMIT;\r\n\r\n\t\titem[i]._ivalue = rndv;\r\n\r\n\t\tif (rndv >= GOLD_MEDIUM_LIMIT)\r\n\t\t\titem[i]._iCurs = ICURS_GOLD_LARGE;\r\n\t\telse\r\n\t\t\titem[i]._iCurs = (rndv > GOLD_SMALL_LIMIT) + 4;\r\n\t}\r\n}\r\n\r\nint RndPL(int param1, int param2)\r\n{\r\n\treturn param1 + random_(22, param2 - param1 + 1);\r\n}\r\n\r\nint PLVal(int pv, int p1, int p2, int minv, int maxv)\r\n{\r\n\tif (p1 == p2)\r\n\t\treturn minv;\r\n\tif (minv == maxv)\r\n\t\treturn minv;\r\n\treturn minv + (maxv - minv) * (100 * (pv - p1) / (p2 - p1)) / 100;\r\n}\r\n\r\nvoid SaveItemPower(int i, int power, int param1, int param2, int minval, int maxval, int multval)\r\n{\r\n\tint r, r2;\r\n\r\n\tr = RndPL(param1, param2);\r\n\tswitch (power) {\r\n\tcase IPL_TOHIT:\r\n\t\titem[i]._iPLToHit += r;\r\n\t\tbreak;\r\n\tcase IPL_TOHIT_CURSE:\r\n\t\titem[i]._iPLToHit -= r;\r\n\t\tbreak;\r\n\tcase IPL_DAMP:\r\n\t\titem[i]._iPLDam += r;\r\n\t\tbreak;\r\n\tcase IPL_DAMP_CURSE:\r\n\t\titem[i]._iPLDam -= r;\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_DOPPELGANGER:\r\n\t\titem[i]._iDamAcFlags |= ISPLHF_DOPPELGANGER;\r\n\t\t// no break\r\n#endif\r\n\tcase IPL_TOHIT_DAMP:\r\n\t\tr = RndPL(param1, param2);\r\n\t\titem[i]._iPLDam += r;\r\n\t\tif (param1 == 20)\r\n\t\t\tr2 = RndPL(1, 5);\r\n\t\tif (param1 == 36)\r\n\t\t\tr2 = RndPL(6, 10);\r\n\t\tif (param1 == 51)\r\n\t\t\tr2 = RndPL(11, 15);\r\n\t\tif (param1 == 66)\r\n\t\t\tr2 = RndPL(16, 20);\r\n\t\tif (param1 == 81)\r\n\t\t\tr2 = RndPL(21, 30);\r\n\t\tif (param1 == 96)\r\n\t\t\tr2 = RndPL(31, 40);\r\n\t\tif (param1 == 111)\r\n\t\t\tr2 = RndPL(41, 50);\r\n\t\tif (param1 == 126)\r\n\t\t\tr2 = RndPL(51, 75);\r\n\t\tif (param1 == 151)\r\n\t\t\tr2 = RndPL(76, 100);\r\n\t\titem[i]._iPLToHit += r2;\r\n\t\tbreak;\r\n\tcase IPL_TOHIT_DAMP_CURSE:\r\n\t\titem[i]._iPLDam -= r;\r\n\t\tif (param1 == 25)\r\n\t\t\tr2 = RndPL(1, 5);\r\n\t\tif (param1 == 50)\r\n\t\t\tr2 = RndPL(6, 10);\r\n\t\titem[i]._iPLToHit -= r2;\r\n\t\tbreak;\r\n\tcase IPL_ACP:\r\n\t\titem[i]._iPLAC += r;\r\n\t\tbreak;\r\n\tcase IPL_ACP_CURSE:\r\n\t\titem[i]._iPLAC -= r;\r\n\t\tbreak;\r\n\tcase IPL_SETAC:\r\n\t\titem[i]._iAC = r;\r\n\t\tbreak;\r\n\tcase IPL_AC_CURSE:\r\n\t\titem[i]._iAC -= r;\r\n\t\tbreak;\r\n\tcase IPL_FIRERES:\r\n\t\titem[i]._iPLFR += r;\r\n\t\tbreak;\r\n\tcase IPL_LIGHTRES:\r\n\t\titem[i]._iPLLR += r;\r\n\t\tbreak;\r\n\tcase IPL_MAGICRES:\r\n\t\titem[i]._iPLMR += r;\r\n\t\tbreak;\r\n\tcase IPL_ALLRES:\r\n\t\titem[i]._iPLFR += r;\r\n\t\titem[i]._iPLLR += r;\r\n\t\titem[i]._iPLMR += r;\r\n\t\tif (item[i]._iPLFR < 0)\r\n\t\t\titem[i]._iPLFR = 0;\r\n\t\tif (item[i]._iPLLR < 0)\r\n\t\t\titem[i]._iPLLR = 0;\r\n\t\tif (item[i]._iPLMR < 0)\r\n\t\t\titem[i]._iPLMR = 0;\r\n\t\tbreak;\r\n\tcase IPL_SPLLVLADD:\r\n\t\titem[i]._iSplLvlAdd = r;\r\n\t\tbreak;\r\n\tcase IPL_CHARGES:\r\n\t\titem[i]._iCharges *= param1;\r\n\t\titem[i]._iMaxCharges = item[i]._iCharges;\r\n\t\tbreak;\r\n\tcase IPL_SPELL:\r\n\t\titem[i]._iSpell = param1;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iCharges = param2;\r\n#else\r\n\t\titem[i]._iCharges = param1; // BUGFIX: should be param2. This code was correct in v1.04, and the bug was introduced between 1.04 and 1.09b.\r\n#endif\r\n\t\titem[i]._iMaxCharges = param2;\r\n\t\tbreak;\r\n\tcase IPL_FIREDAM:\r\n\t\titem[i]._iFlags |= ISPL_FIREDAM;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFlags &= ~ISPL_LIGHTDAM;\r\n#endif\r\n\t\titem[i]._iFMinDam = param1;\r\n\t\titem[i]._iFMaxDam = param2;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iLMinDam = 0;\r\n\t\titem[i]._iLMaxDam = 0;\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_LIGHTDAM:\r\n\t\titem[i]._iFlags |= ISPL_LIGHTDAM;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFlags &= ~ISPL_FIREDAM;\r\n#endif\r\n\t\titem[i]._iLMinDam = param1;\r\n\t\titem[i]._iLMaxDam = param2;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFMinDam = 0;\r\n\t\titem[i]._iFMaxDam = 0;\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_STR:\r\n\t\titem[i]._iPLStr += r;\r\n\t\tbreak;\r\n\tcase IPL_STR_CURSE:\r\n\t\titem[i]._iPLStr -= r;\r\n\t\tbreak;\r\n\tcase IPL_MAG:\r\n\t\titem[i]._iPLMag += r;\r\n\t\tbreak;\r\n\tcase IPL_MAG_CURSE:\r\n\t\titem[i]._iPLMag -= r;\r\n\t\tbreak;\r\n\tcase IPL_DEX:\r\n\t\titem[i]._iPLDex += r;\r\n\t\tbreak;\r\n\tcase IPL_DEX_CURSE:\r\n\t\titem[i]._iPLDex -= r;\r\n\t\tbreak;\r\n\tcase IPL_VIT:\r\n\t\titem[i]._iPLVit += r;\r\n\t\tbreak;\r\n\tcase IPL_VIT_CURSE:\r\n\t\titem[i]._iPLVit -= r;\r\n\t\tbreak;\r\n\tcase IPL_ATTRIBS:\r\n\t\titem[i]._iPLStr += r;\r\n\t\titem[i]._iPLMag += r;\r\n\t\titem[i]._iPLDex += r;\r\n\t\titem[i]._iPLVit += r;\r\n\t\tbreak;\r\n\tcase IPL_ATTRIBS_CURSE:\r\n\t\titem[i]._iPLStr -= r;\r\n\t\titem[i]._iPLMag -= r;\r\n\t\titem[i]._iPLDex -= r;\r\n\t\titem[i]._iPLVit -= r;\r\n\t\tbreak;\r\n\tcase IPL_GETHIT_CURSE:\r\n\t\titem[i]._iPLGetHit += r;\r\n\t\tbreak;\r\n\tcase IPL_GETHIT:\r\n\t\titem[i]._iPLGetHit -= r;\r\n\t\tbreak;\r\n\tcase IPL_LIFE:\r\n\t\titem[i]._iPLHP += r << 6;\r\n\t\tbreak;\r\n\tcase IPL_LIFE_CURSE:\r\n\t\titem[i]._iPLHP -= r << 6;\r\n\t\tbreak;\r\n\tcase IPL_MANA:\r\n\t\titem[i]._iPLMana += r << 6;\r\n\t\tdrawmanaflag = TRUE;\r\n\t\tbreak;\r\n\tcase IPL_MANA_CURSE:\r\n\t\titem[i]._iPLMana -= r << 6;\r\n\t\tdrawmanaflag = TRUE;\r\n\t\tbreak;\r\n\tcase IPL_DUR:\r\n\t\tr2 = r * item[i]._iMaxDur / 100;\r\n\t\titem[i]._iMaxDur += r2;\r\n\t\titem[i]._iDurability += r2;\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_CRYSTALLINE:\r\n\t\titem[i]._iPLDam += 140 + r * 2;\r\n\t\t// no break\r\n#endif\r\n\tcase IPL_DUR_CURSE:\r\n\t\titem[i]._iMaxDur -= r * item[i]._iMaxDur / 100;\r\n\t\tif (item[i]._iMaxDur < 1)\r\n\t\t\titem[i]._iMaxDur = 1;\r\n\t\titem[i]._iDurability = item[i]._iMaxDur;\r\n\t\tbreak;\r\n\tcase IPL_INDESTRUCTIBLE:\r\n\t\titem[i]._iDurability = DUR_INDESTRUCTIBLE;\r\n\t\titem[i]._iMaxDur = DUR_INDESTRUCTIBLE;\r\n\t\tbreak;\r\n\tcase IPL_LIGHT:\r\n\t\titem[i]._iPLLight += param1;\r\n\t\tbreak;\r\n\tcase IPL_LIGHT_CURSE:\r\n\t\titem[i]._iPLLight -= param1;\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_MULT_ARROWS:\r\n\t\titem[i]._iFlags |= ISPL_MULT_ARROWS;\r\n\t\tbreak;\r\n#endif\r\n\tcase IPL_FIRE_ARROWS:\r\n\t\titem[i]._iFlags |= ISPL_FIRE_ARROWS;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFlags &= ~ISPL_LIGHT_ARROWS;\r\n#endif\r\n\t\titem[i]._iFMinDam = param1;\r\n\t\titem[i]._iFMaxDam = param2;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iLMinDam = 0;\r\n\t\titem[i]._iLMaxDam = 0;\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_LIGHT_ARROWS:\r\n\t\titem[i]._iFlags |= ISPL_LIGHT_ARROWS;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFlags &= ~ISPL_FIRE_ARROWS;\r\n#endif\r\n\t\titem[i]._iLMinDam = param1;\r\n\t\titem[i]._iLMaxDam = param2;\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFMinDam = 0;\r\n\t\titem[i]._iFMaxDam = 0;\r\n#endif\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_FIREBALL:\r\n\t\titem[i]._iFlags |= (ISPL_LIGHT_ARROWS | ISPL_FIRE_ARROWS);\r\n\t\titem[i]._iFMinDam = param1;\r\n\t\titem[i]._iFMaxDam = param2;\r\n\t\titem[i]._iLMinDam = 0;\r\n\t\titem[i]._iLMaxDam = 0;\r\n\t\tbreak;\r\n#endif\r\n\tcase IPL_THORNS:\r\n\t\titem[i]._iFlags |= ISPL_THORNS;\r\n\t\tbreak;\r\n\tcase IPL_NOMANA:\r\n\t\titem[i]._iFlags |= ISPL_NOMANA;\r\n\t\tdrawmanaflag = TRUE;\r\n\t\tbreak;\r\n\tcase IPL_NOHEALPLR:\r\n\t\titem[i]._iFlags |= ISPL_NOHEALPLR;\r\n\t\tbreak;\r\n\tcase IPL_ABSHALFTRAP:\r\n\t\titem[i]._iFlags |= ISPL_ABSHALFTRAP;\r\n\t\tbreak;\r\n\tcase IPL_KNOCKBACK:\r\n\t\titem[i]._iFlags |= ISPL_KNOCKBACK;\r\n\t\tbreak;\r\n\tcase IPL_3XDAMVDEM:\r\n\t\titem[i]._iFlags |= ISPL_3XDAMVDEM;\r\n\t\tbreak;\r\n\tcase IPL_ALLRESZERO:\r\n\t\titem[i]._iFlags |= ISPL_ALLRESZERO;\r\n\t\tbreak;\r\n\tcase IPL_NOHEALMON:\r\n\t\titem[i]._iFlags |= ISPL_NOHEALMON;\r\n\t\tbreak;\r\n\tcase IPL_STEALMANA:\r\n\t\tif (param1 == 3)\r\n\t\t\titem[i]._iFlags |= ISPL_STEALMANA_3;\r\n\t\tif (param1 == 5)\r\n\t\t\titem[i]._iFlags |= ISPL_STEALMANA_5;\r\n\t\tdrawmanaflag = TRUE;\r\n\t\tbreak;\r\n\tcase IPL_STEALLIFE:\r\n\t\tif (param1 == 3)\r\n\t\t\titem[i]._iFlags |= ISPL_STEALLIFE_3;\r\n\t\tif (param1 == 5)\r\n\t\t\titem[i]._iFlags |= ISPL_STEALLIFE_5;\r\n\t\tdrawhpflag = TRUE;\r\n\t\tbreak;\r\n\tcase IPL_TARGAC:\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iPLEnAc = param1;\r\n#else\r\n\t\titem[i]._iPLEnAc += r;\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_FASTATTACK:\r\n\t\tif (param1 == 1)\r\n\t\t\titem[i]._iFlags |= ISPL_QUICKATTACK;\r\n\t\tif (param1 == 2)\r\n\t\t\titem[i]._iFlags |= ISPL_FASTATTACK;\r\n\t\tif (param1 == 3)\r\n\t\t\titem[i]._iFlags |= ISPL_FASTERATTACK;\r\n\t\tif (param1 == 4)\r\n\t\t\titem[i]._iFlags |= ISPL_FASTESTATTACK;\r\n\t\tbreak;\r\n\tcase IPL_FASTRECOVER:\r\n\t\tif (param1 == 1)\r\n\t\t\titem[i]._iFlags |= ISPL_FASTRECOVER;\r\n\t\tif (param1 == 2)\r\n\t\t\titem[i]._iFlags |= ISPL_FASTERRECOVER;\r\n\t\tif (param1 == 3)\r\n\t\t\titem[i]._iFlags |= ISPL_FASTESTRECOVER;\r\n\t\tbreak;\r\n\tcase IPL_FASTBLOCK:\r\n\t\titem[i]._iFlags |= ISPL_FASTBLOCK;\r\n\t\tbreak;\r\n\tcase IPL_DAMMOD:\r\n\t\titem[i]._iPLDamMod += r;\r\n\t\tbreak;\r\n\tcase IPL_RNDARROWVEL:\r\n\t\titem[i]._iFlags |= ISPL_RNDARROWVEL;\r\n\t\tbreak;\r\n\tcase IPL_SETDAM:\r\n\t\titem[i]._iMinDam = param1;\r\n\t\titem[i]._iMaxDam = param2;\r\n\t\tbreak;\r\n\tcase IPL_SETDUR:\r\n\t\titem[i]._iDurability = param1;\r\n\t\titem[i]._iMaxDur = param1;\r\n\t\tbreak;\r\n\tcase IPL_FASTSWING:\r\n\t\titem[i]._iFlags |= ISPL_FASTERATTACK;\r\n\t\tbreak;\r\n\tcase IPL_ONEHAND:\r\n\t\titem[i]._iLoc = ILOC_ONEHAND;\r\n\t\tbreak;\r\n\tcase IPL_DRAINLIFE:\r\n\t\titem[i]._iFlags |= ISPL_DRAINLIFE;\r\n\t\tbreak;\r\n\tcase IPL_RNDSTEALLIFE:\r\n\t\titem[i]._iFlags |= ISPL_RNDSTEALLIFE;\r\n\t\tbreak;\r\n\tcase IPL_INFRAVISION:\r\n\t\titem[i]._iFlags |= ISPL_INFRAVISION;\r\n\t\tbreak;\r\n\tcase IPL_NOMINSTR:\r\n\t\titem[i]._iMinStr = 0;\r\n\t\tbreak;\r\n\tcase IPL_INVCURS:\r\n\t\titem[i]._iCurs = param1;\r\n\t\tbreak;\r\n\tcase IPL_ADDACLIFE:\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFlags |= (ISPL_LIGHT_ARROWS | ISPL_FIRE_ARROWS);\r\n\t\titem[i]._iFMinDam = param1;\r\n\t\titem[i]._iFMaxDam = param2;\r\n\t\titem[i]._iLMinDam = 1;\r\n\t\titem[i]._iLMaxDam = 0;\r\n#else\r\n\t\titem[i]._iPLHP = (plr[myplr]._pIBonusAC + plr[myplr]._pIAC + plr[myplr]._pDexterity / 5) << 6;\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_ADDMANAAC:\r\n#ifdef HELLFIRE\r\n\t\titem[i]._iFlags |= (ISPL_LIGHTDAM | ISPL_FIREDAM);\r\n\t\titem[i]._iFMinDam = param1;\r\n\t\titem[i]._iFMaxDam = param2;\r\n\t\titem[i]._iLMinDam = 2;\r\n\t\titem[i]._iLMaxDam = 0;\r\n#else\r\n\t\titem[i]._iAC += (plr[myplr]._pMaxManaBase >> 6) / 10;\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_FIRERESCLVL:\r\n\t\titem[i]._iPLFR = 30 - plr[myplr]._pLevel;\r\n\t\tif (item[i]._iPLFR < 0)\r\n\t\t\titem[i]._iPLFR = 0;\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_FIRERES_CURSE:\r\n\t\titem[i]._iPLFR -= r;\r\n\t\tbreak;\r\n\tcase IPL_LIGHTRES_CURSE:\r\n\t\titem[i]._iPLLR -= r;\r\n\t\tbreak;\r\n\tcase IPL_MAGICRES_CURSE:\r\n\t\titem[i]._iPLMR -= r;\r\n\t\tbreak;\r\n\tcase IPL_ALLRES_CURSE:\r\n\t\titem[i]._iPLFR -= r;\r\n\t\titem[i]._iPLLR -= r;\r\n\t\titem[i]._iPLMR -= r;\r\n\t\tbreak;\r\n\tcase IPL_DEVASTATION:\r\n\t\titem[i]._iDamAcFlags |= ISPLHF_DEVASTATION;\r\n\t\tbreak;\r\n\tcase IPL_DECAY:\r\n\t\titem[i]._iDamAcFlags |= ISPLHF_DECAY;\r\n\t\titem[i]._iPLDam += r;\r\n\t\tbreak;\r\n\tcase IPL_PERIL:\r\n\t\titem[i]._iDamAcFlags |= ISPLHF_PERIL;\r\n\t\tbreak;\r\n\tcase IPL_JESTERS:\r\n\t\titem[i]._iDamAcFlags |= ISPLHF_JESTERS;\r\n\t\tbreak;\r\n\tcase IPL_ACDEMON:\r\n\t\titem[i]._iDamAcFlags |= ISPLHF_ACDEMON;\r\n\t\tbreak;\r\n\tcase IPL_ACUNDEAD:\r\n\t\titem[i]._iDamAcFlags |= ISPLHF_ACUNDEAD;\r\n\t\tbreak;\r\n\tcase IPL_MANATOLIFE:\r\n\t\tr2 = ((plr[myplr]._pMaxManaBase >> 6) * 50 / 100);\r\n\t\titem[i]._iPLMana -= (r2 << 6);\r\n\t\titem[i]._iPLHP += (r2 << 6);\r\n\t\tbreak;\r\n\tcase IPL_LIFETOMANA:\r\n\t\tr2 = ((plr[myplr]._pMaxHPBase >> 6) * 40 / 100);\r\n\t\titem[i]._iPLHP -= (r2 << 6);\r\n\t\titem[i]._iPLMana += (r2 << 6);\r\n\t\tbreak;\r\n#endif\r\n\t}\r\n\tif (item[i]._iVAdd1 || item[i]._iVMult1) {\r\n\t\titem[i]._iVAdd2 = PLVal(r, param1, param2, minval, maxval);\r\n\t\titem[i]._iVMult2 = multval;\r\n\t} else {\r\n\t\titem[i]._iVAdd1 = PLVal(r, param1, param2, minval, maxval);\r\n\t\titem[i]._iVMult1 = multval;\r\n\t}\r\n}\r\n\r\nvoid GetItemPower(int i, int minlvl, int maxlvl, int flgs, BOOL onlygood)\r\n{\r\n\tint pre, post, nt, nl, j, preidx, sufidx;\r\n\tint l[256];\r\n\tchar istr[128];\r\n\tBYTE goe;\r\n\r\n\tpre = random_(23, 4);\r\n\tpost = random_(23, 3);\r\n\tif (pre != 0 && post == 0) {\r\n\t\tif (random_(23, 2) != 0)\r\n\t\t\tpost = 1;\r\n\t\telse\r\n\t\t\tpre = 0;\r\n\t}\r\n\tpreidx = -1;\r\n\tsufidx = -1;\r\n\tgoe = GOE_ANY;\r\n\tif (!onlygood && random_(0, 3) != 0)\r\n\t\tonlygood = TRUE;\r\n\tif (pre == 0) {\r\n\t\tnt = 0;\r\n\t\tfor (j = 0; PL_Prefix[j].PLPower != IPL_INVALID; j++) {\r\n\t\t\tif (flgs & PL_Prefix[j].PLIType) {\r\n\t\t\t\tif (PL_Prefix[j].PLMinLvl >= minlvl && PL_Prefix[j].PLMinLvl <= maxlvl && (!onlygood || PL_Prefix[j].PLOk) && (flgs != PLT_STAFF || PL_Prefix[j].PLPower != IPL_CHARGES)) {\r\n\t\t\t\t\tl[nt] = j;\r\n\t\t\t\t\tnt++;\r\n\t\t\t\t\tif (PL_Prefix[j].PLDouble) {\r\n\t\t\t\t\t\tl[nt] = j;\r\n\t\t\t\t\t\tnt++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nt != 0) {\r\n\t\t\tpreidx = l[random_(23, nt)];\r\n\t\t\tsprintf(istr, \"%s %s\", PL_Prefix[preidx].PLName, item[i]._iIName);\r\n\t\t\tstrcpy(item[i]._iIName, istr);\r\n\t\t\titem[i]._iMagical = ITEM_QUALITY_MAGIC;\r\n\t\t\tSaveItemPower(\r\n\t\t\t    i,\r\n\t\t\t    PL_Prefix[preidx].PLPower,\r\n\t\t\t    PL_Prefix[preidx].PLParam1,\r\n\t\t\t    PL_Prefix[preidx].PLParam2,\r\n\t\t\t    PL_Prefix[preidx].PLMinVal,\r\n\t\t\t    PL_Prefix[preidx].PLMaxVal,\r\n\t\t\t    PL_Prefix[preidx].PLMultVal);\r\n\t\t\titem[i]._iPrePower = PL_Prefix[preidx].PLPower;\r\n\t\t\tgoe = PL_Prefix[preidx].PLGOE;\r\n\t\t}\r\n\t}\r\n\tif (post != 0) {\r\n\t\tnl = 0;\r\n\t\tfor (j = 0; PL_Suffix[j].PLPower != IPL_INVALID; j++) {\r\n\t\t\tif (PL_Suffix[j].PLIType & flgs\r\n\t\t\t    && PL_Suffix[j].PLMinLvl >= minlvl && PL_Suffix[j].PLMinLvl <= maxlvl\r\n\t\t\t    && (goe | PL_Suffix[j].PLGOE) != (GOE_GOOD | GOE_EVIL)\r\n\t\t\t    && (!onlygood || PL_Suffix[j].PLOk)) {\r\n\t\t\t\tl[nl] = j;\r\n\t\t\t\tnl++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (nl != 0) {\r\n\t\t\tsufidx = l[random_(23, nl)];\r\n\t\t\tsprintf(istr, \"%s of %s\", item[i]._iIName, PL_Suffix[sufidx].PLName);\r\n\t\t\tstrcpy(item[i]._iIName, istr);\r\n\t\t\titem[i]._iMagical = ITEM_QUALITY_MAGIC;\r\n\t\t\tSaveItemPower(\r\n\t\t\t    i,\r\n\t\t\t    PL_Suffix[sufidx].PLPower,\r\n\t\t\t    PL_Suffix[sufidx].PLParam1,\r\n\t\t\t    PL_Suffix[sufidx].PLParam2,\r\n\t\t\t    PL_Suffix[sufidx].PLMinVal,\r\n\t\t\t    PL_Suffix[sufidx].PLMaxVal,\r\n\t\t\t    PL_Suffix[sufidx].PLMultVal);\r\n\t\t\titem[i]._iSufPower = PL_Suffix[sufidx].PLPower;\r\n\t\t}\r\n\t}\r\n\tif (!control_WriteStringToBuffer((BYTE *)item[i]._iIName)) {\r\n#ifdef HELLFIRE\r\n\t\tint aii = item[i].IDidx;\r\n\t\tif (AllItemsList[aii].iSName)\r\n\t\t\tstrcpy(item[i]._iIName, AllItemsList[aii].iSName);\r\n\t\telse\r\n\t\t\titem[i]._iName[0] = 0;\r\n#else\r\n\t\tstrcpy(item[i]._iIName, AllItemsList[item[i].IDidx].iSName);\r\n#endif\r\n\r\n\t\tif (preidx != -1) {\r\n\t\t\tsprintf(istr, \"%s %s\", PL_Prefix[preidx].PLName, item[i]._iIName);\r\n\t\t\tstrcpy(item[i]._iIName, istr);\r\n\t\t}\r\n\t\tif (sufidx != -1) {\r\n\t\t\tsprintf(istr, \"%s of %s\", item[i]._iIName, PL_Suffix[sufidx].PLName);\r\n\t\t\tstrcpy(item[i]._iIName, istr);\r\n\t\t}\r\n\t}\r\n\tif (preidx != -1 || sufidx != -1)\r\n\t\tCalcItemValue(i);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid GetItemBonus(int i, int idata, int minlvl, int maxlvl, BOOL onlygood, BOOLEAN allowspells)\r\n#else\r\nvoid GetItemBonus(int i, int idata, int minlvl, int maxlvl, BOOL onlygood)\r\n#endif\r\n{\r\n\tif (item[i]._iClass != ICLASS_GOLD) {\r\n\t\tif (minlvl > 25)\r\n\t\t\tminlvl = 25;\r\n\r\n\t\tswitch (item[i]._itype) {\r\n\t\tcase ITYPE_SWORD:\r\n\t\tcase ITYPE_AXE:\r\n\t\tcase ITYPE_MACE:\r\n\t\t\tGetItemPower(i, minlvl, maxlvl, PLT_WEAP, onlygood);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_BOW:\r\n\t\t\tGetItemPower(i, minlvl, maxlvl, PLT_BOW, onlygood);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_SHIELD:\r\n\t\t\tGetItemPower(i, minlvl, maxlvl, PLT_SHLD, onlygood);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_LARMOR:\r\n\t\tcase ITYPE_HELM:\r\n\t\tcase ITYPE_MARMOR:\r\n\t\tcase ITYPE_HARMOR:\r\n\t\t\tGetItemPower(i, minlvl, maxlvl, PLT_ARMO, onlygood);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_STAFF:\r\n#ifdef HELLFIRE\r\n\t\t\tif (allowspells)\r\n#endif\r\n\t\t\t\tGetStaffSpell(i, maxlvl, onlygood);\r\n#ifdef HELLFIRE\r\n\t\t\telse\r\n\t\t\t\tGetItemPower(i, minlvl, maxlvl, PLT_STAFF, onlygood);\r\n#endif\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_RING:\r\n\t\tcase ITYPE_AMULET:\r\n\t\t\tGetItemPower(i, minlvl, maxlvl, PLT_MISC, onlygood);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetupItem(int i)\r\n{\r\n\tint it;\r\n\r\n\tit = ItemCAnimTbl[item[i]._iCurs];\r\n\titem[i]._iAnimData = itemanims[it];\r\n\titem[i]._iAnimLen = ItemAnimLs[it];\r\n\titem[i]._iAnimWidth = 96;\r\n\titem[i]._iAnimWidth2 = 16;\r\n\titem[i]._iIdentified = FALSE;\r\n\titem[i]._iPostDraw = FALSE;\r\n\r\n\tif (!plr[myplr].pLvlLoad) {\r\n\t\titem[i]._iAnimFrame = 1;\r\n\t\titem[i]._iAnimFlag = TRUE;\r\n\t\titem[i]._iSelFlag = 0;\r\n\t} else {\r\n\t\titem[i]._iAnimFrame = item[i]._iAnimLen;\r\n\t\titem[i]._iAnimFlag = FALSE;\r\n\t\titem[i]._iSelFlag = 1;\r\n\t}\r\n}\r\n\r\nint RndItem(int m)\r\n{\r\n\tint i, ri, r;\r\n\tint ril[512];\r\n\r\n\tif ((monster[m].MData->mTreasure & 0x8000) != 0)\r\n\t\treturn -1 - (monster[m].MData->mTreasure & 0xFFF);\r\n\r\n\tif (monster[m].MData->mTreasure & 0x4000)\r\n\t\treturn 0;\r\n\r\n\tif (random_(24, 100) > 40)\r\n\t\treturn 0;\r\n\r\n\tif (random_(24, 100) > 25)\r\n\t\treturn IDI_GOLD + 1;\r\n\r\n\tri = 0;\r\n\tfor (i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tif (AllItemsList[i].iRnd == IDROP_DOUBLE && monster[m].mLevel >= AllItemsList[i].iMinMLvl\r\n#ifdef HELLFIRE\r\n\t\t    && ri < 512\r\n#endif\r\n\t\t) {\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER && monster[m].mLevel >= AllItemsList[i].iMinMLvl\r\n#ifdef HELLFIRE\r\n\t\t    && ri < 512\r\n#endif\r\n\t\t) {\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t\t// BUGFIX: ri decremented even for IDROP_NEVER, thus Scroll of Resurrect\r\n\t\t// (IDI_RESURRECT) decrements ri, unintentionally removing gold drop in\r\n\t\t// Single Player (gold drop is still valid in Multi Player).\r\n\t\tif (AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1)\r\n\t\t\tri--;\r\n\t\tif (AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1)\r\n\t\t\tri--;\r\n\t}\r\n\r\n\tr = random_(24, ri);\r\n\treturn ril[r] + 1;\r\n}\r\n\r\nint RndUItem(int m)\r\n{\r\n\tint i, ri;\r\n\tint ril[512];\r\n\tBOOL okflag;\r\n\r\n\tif (m != -1 && (monster[m].MData->mTreasure & 0x8000) != 0 && gbMaxPlayers == 1)\r\n\t\treturn -1 - (monster[m].MData->mTreasure & 0xFFF);\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tri = 0;\r\n\tfor (i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tokflag = TRUE;\r\n\t\tif (AllItemsList[i].iRnd == IDROP_NEVER)\r\n\t\t\tokflag = FALSE;\r\n\t\tif (m != -1) {\r\n\t\t\tif (monster[m].mLevel < AllItemsList[i].iMinMLvl)\r\n\t\t\t\tokflag = FALSE;\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tif (2 * curlv < AllItemsList[i].iMinMLvl)\r\n#else\r\n\t\t\tif (2 * currlevel < AllItemsList[i].iMinMLvl)\r\n#endif\r\n\t\t\t\tokflag = FALSE;\r\n\t\t}\r\n\t\tif (AllItemsList[i].itype == ITYPE_MISC)\r\n\t\t\tokflag = FALSE;\r\n\t\tif (AllItemsList[i].itype == ITYPE_GOLD)\r\n\t\t\tokflag = FALSE;\r\n\t\tif (AllItemsList[i].itype == ITYPE_FOOD)\r\n\t\t\tokflag = FALSE;\r\n\t\tif (AllItemsList[i].iMiscId == IMISC_BOOK)\r\n\t\t\tokflag = TRUE;\r\n\t\tif (AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1)\r\n\t\t\tokflag = FALSE;\r\n\t\tif (AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1)\r\n\t\t\tokflag = FALSE;\r\n#ifdef HELLFIRE\r\n\t\tif (okflag && ri < 512) {\r\n#else\r\n\t\tif (okflag) {\r\n#endif\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn ril[random_(25, ri)];\r\n}\r\n\r\nint RndAllItems()\r\n{\r\n\tint i, ri;\r\n\tint ril[512];\r\n\r\n\tif (random_(26, 100) > 25)\r\n\t\treturn 0;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tri = 0;\r\n\tfor (i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n#ifdef HELLFIRE\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER && 2 * curlv >= AllItemsList[i].iMinMLvl && ri < 512) {\r\n#else\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER && 2 * currlevel >= AllItemsList[i].iMinMLvl) {\r\n#endif\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t\tif (AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1)\r\n\t\t\tri--;\r\n\t\tif (AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1)\r\n\t\t\tri--;\r\n\t}\r\n\r\n\treturn ril[random_(26, ri)];\r\n}\r\n\r\n#ifdef HELLFIRE\r\nint RndTypeItems(int itype, int imid, int lvl)\r\n#else\r\nint RndTypeItems(int itype, int imid)\r\n#endif\r\n{\r\n\tint i, ri;\r\n\tBOOL okflag;\r\n\tint ril[512];\r\n\r\n\tri = 0;\r\n\tfor (i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tokflag = TRUE;\r\n\t\tif (AllItemsList[i].iRnd == IDROP_NEVER)\r\n\t\t\tokflag = FALSE;\r\n#ifdef HELLFIRE\r\n\t\tif (lvl << 1 < AllItemsList[i].iMinMLvl)\r\n#else\r\n\t\tif (currlevel << 1 < AllItemsList[i].iMinMLvl)\r\n#endif\r\n\t\t\tokflag = FALSE;\r\n\t\tif (AllItemsList[i].itype != itype)\r\n\t\t\tokflag = FALSE;\r\n\t\tif (imid != -1 && AllItemsList[i].iMiscId != imid)\r\n\t\t\tokflag = FALSE;\r\n#ifdef HELLFIRE\r\n\t\tif (okflag && ri < 512) {\r\n#else\r\n\t\tif (okflag) {\r\n#endif\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn ril[random_(27, ri)];\r\n}\r\n\r\nint CheckUnique(int i, int lvl, int uper, BOOL recreate)\r\n{\r\n\tint j, idata, numu;\r\n\tBOOLEAN uok[128];\r\n\r\n\tif (random_(28, 100) > uper)\r\n\t\treturn UITYPE_INVALID;\r\n\r\n\tnumu = 0;\r\n\tmemset(uok, 0, sizeof(uok));\r\n\tfor (j = 0; UniqueItemList[j].UIItemId != UITYPE_INVALID; j++) {\r\n\t\tif (UniqueItemList[j].UIItemId == AllItemsList[item[i].IDidx].iItemId\r\n\t\t    && lvl >= UniqueItemList[j].UIMinLvl\r\n\t\t    && (recreate || !UniqueItemFlag[j] || gbMaxPlayers != 1)) {\r\n\t\t\tuok[j] = TRUE;\r\n\t\t\tnumu++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (numu == 0)\r\n\t\treturn UITYPE_INVALID;\r\n\r\n\trandom_(29, 10); /// BUGFIX: unused, last unique in array always gets chosen\r\n\tidata = 0;\r\n\twhile (numu > 0) {\r\n\t\tif (uok[idata])\r\n\t\t\tnumu--;\r\n\t\tif (numu > 0) {\r\n\t\t\tidata++;\r\n\t\t\tif (idata == 128)\r\n\t\t\t\tidata = 0;\r\n\t\t}\r\n\t}\r\n\r\n\treturn idata;\r\n}\r\n\r\nvoid GetUniqueItem(int i, int uid)\r\n{\r\n\tUniqueItemFlag[uid] = TRUE;\r\n\tSaveItemPower(i, UniqueItemList[uid].UIPower1, UniqueItemList[uid].UIParam1, UniqueItemList[uid].UIParam2, 0, 0, 1);\r\n\r\n\tif (UniqueItemList[uid].UINumPL > 1)\r\n\t\tSaveItemPower(i, UniqueItemList[uid].UIPower2, UniqueItemList[uid].UIParam3, UniqueItemList[uid].UIParam4, 0, 0, 1);\r\n\tif (UniqueItemList[uid].UINumPL > 2)\r\n\t\tSaveItemPower(i, UniqueItemList[uid].UIPower3, UniqueItemList[uid].UIParam5, UniqueItemList[uid].UIParam6, 0, 0, 1);\r\n\tif (UniqueItemList[uid].UINumPL > 3)\r\n\t\tSaveItemPower(i, UniqueItemList[uid].UIPower4, UniqueItemList[uid].UIParam7, UniqueItemList[uid].UIParam8, 0, 0, 1);\r\n\tif (UniqueItemList[uid].UINumPL > 4)\r\n\t\tSaveItemPower(i, UniqueItemList[uid].UIPower5, UniqueItemList[uid].UIParam9, UniqueItemList[uid].UIParam10, 0, 0, 1);\r\n\tif (UniqueItemList[uid].UINumPL > 5)\r\n\t\tSaveItemPower(i, UniqueItemList[uid].UIPower6, UniqueItemList[uid].UIParam11, UniqueItemList[uid].UIParam12, 0, 0, 1);\r\n\r\n\tstrcpy(item[i]._iIName, UniqueItemList[uid].UIName);\r\n\titem[i]._iIvalue = UniqueItemList[uid].UIValue;\r\n\r\n\tif (item[i]._iMiscId == IMISC_UNIQUE)\r\n\t\titem[i]._iSeed = uid;\r\n\r\n\titem[i]._iUid = uid;\r\n\titem[i]._iMagical = ITEM_QUALITY_UNIQUE;\r\n\titem[i]._iCreateInfo |= CF_UNIQUE;\r\n}\r\n\r\nvoid SpawnUnique(int uid, int x, int y)\r\n{\r\n\tint ii, itype;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (numitems >= MAXITEMS)\r\n\t\treturn;\r\n\r\n\tii = itemavail[0];\r\n\tGetSuperItemSpace(x, y, ii);\r\n\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\titemactive[numitems] = ii;\r\n\r\n\titype = 0;\r\n\twhile (AllItemsList[itype].iItemId != UniqueItemList[uid].UIItemId) {\r\n\t\titype++;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tGetItemAttrs(ii, itype, curlv);\r\n#else\r\n\tGetItemAttrs(ii, itype, currlevel);\r\n#endif\r\n\tGetUniqueItem(ii, uid);\r\n\tSetupItem(ii);\r\n\tnumitems++;\r\n}\r\n\r\nvoid ItemRndDur(int ii)\r\n{\r\n\tif (item[ii]._iDurability && item[ii]._iDurability != DUR_INDESTRUCTIBLE)\r\n\t\titem[ii]._iDurability = random_(0, item[ii]._iMaxDur >> 1) + (item[ii]._iMaxDur >> 2) + 1;\r\n}\r\n\r\nvoid SetupAllItems(int ii, int idx, int iseed, int lvl, int uper, BOOL onlygood, BOOL recreate, BOOL pregen)\r\n{\r\n\tint iblvl, uid;\r\n\r\n\titem[ii]._iSeed = iseed;\r\n\tSetRndSeed(iseed);\r\n\tGetItemAttrs(ii, idx, lvl >> 1);\r\n\titem[ii]._iCreateInfo = lvl;\r\n\r\n\tif (pregen)\r\n\t\titem[ii]._iCreateInfo = lvl | CF_PREGEN;\r\n\tif (onlygood)\r\n\t\titem[ii]._iCreateInfo |= CF_ONLYGOOD;\r\n\r\n\tif (uper == 15)\r\n\t\titem[ii]._iCreateInfo |= CF_UPER15;\r\n\telse if (uper == 1)\r\n\t\titem[ii]._iCreateInfo |= CF_UPER1;\r\n\r\n\tif (item[ii]._iMiscId != IMISC_UNIQUE) {\r\n\t\tiblvl = -1;\r\n\t\tif (random_(32, 100) <= 10 || random_(33, 100) <= lvl) {\r\n\t\t\tiblvl = lvl;\r\n\t\t}\r\n\t\tif (iblvl == -1 && item[ii]._iMiscId == IMISC_STAFF) {\r\n\t\t\tiblvl = lvl;\r\n\t\t}\r\n\t\tif (iblvl == -1 && item[ii]._iMiscId == IMISC_RING) {\r\n\t\t\tiblvl = lvl;\r\n\t\t}\r\n\t\tif (iblvl == -1 && item[ii]._iMiscId == IMISC_AMULET) {\r\n\t\t\tiblvl = lvl;\r\n\t\t}\r\n\t\tif (onlygood)\r\n\t\t\tiblvl = lvl;\r\n\t\tif (uper == 15)\r\n\t\t\tiblvl = lvl + 4;\r\n\t\tif (iblvl != -1) {\r\n\t\t\tuid = CheckUnique(ii, iblvl, uper, recreate);\r\n\t\t\tif (uid == UITYPE_INVALID) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tGetItemBonus(ii, idx, iblvl >> 1, iblvl, onlygood, TRUE);\r\n#else\r\n\t\t\t\tGetItemBonus(ii, idx, iblvl >> 1, iblvl, onlygood);\r\n#endif\r\n\t\t\t} else {\r\n\t\t\t\tGetUniqueItem(ii, uid);\r\n\t\t\t\titem[ii]._iCreateInfo |= CF_UNIQUE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (item[ii]._iMagical != ITEM_QUALITY_UNIQUE)\r\n\t\t\tItemRndDur(ii);\r\n\t} else {\r\n\t\tif (item[ii]._iLoc != ILOC_UNEQUIPABLE) {\r\n\t\t\t//uid = CheckUnique(ii, iblvl, uper, recreate);\r\n\t\t\t//if (uid != UITYPE_INVALID) {\r\n\t\t\t//\tGetUniqueItem(ii, uid);\r\n\t\t\t//}\r\n\t\t\tGetUniqueItem(ii, iseed); // BUG: the second argument to GetUniqueItem should be uid.\r\n\t\t}\r\n\t}\r\n\tSetupItem(ii);\r\n}\r\n\r\nvoid SpawnItem(int m, int x, int y, BOOL sendmsg)\r\n{\r\n\tint ii, idx;\r\n\t// BUGFIX: onlygood may be used uninitialized in call to SetupAllItems.\r\n\tBOOL onlygood;\r\n\r\n\tif (monster[m]._uniqtype || ((monster[m].MData->mTreasure & 0x8000) && gbMaxPlayers != 1)) {\r\n\t\tidx = RndUItem(m);\r\n\t\tif (idx < 0) {\r\n\t\t\tSpawnUnique(-(idx + 1), x, y);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tonlygood = TRUE;\r\n\t} else if (quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE || quests[Q_MUSHROOM]._qvar1 != QS_MUSHGIVEN) {\r\n\t\tidx = RndItem(m);\r\n\t\tif (!idx)\r\n\t\t\treturn;\r\n\t\tif (idx > 0) {\r\n\t\t\tidx--;\r\n\t\t\tonlygood = FALSE;\r\n\t\t} else {\r\n\t\t\tSpawnUnique(-(idx + 1), x, y);\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else {\r\n\t\tidx = IDI_BRAIN;\r\n\t\tquests[Q_MUSHROOM]._qvar1 = QS_BRAINSPAWNED;\r\n\t}\r\n\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n\t\tif (monster[m]._uniqtype) {\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), monster[m].MData->mLevel, 15, onlygood, FALSE, FALSE);\r\n\t\t} else {\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), monster[m].MData->mLevel, 1, onlygood, FALSE, FALSE);\r\n\t\t}\r\n\t\tnumitems++;\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t}\r\n}\r\n\r\nvoid CreateItem(int uid, int x, int y)\r\n{\r\n\tint ii, idx;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\tidx = 0;\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n\r\n\t\twhile (AllItemsList[idx].iItemId != UniqueItemList[uid].UIItemId) {\r\n\t\t\tidx++;\r\n\t\t}\r\n\r\n#ifdef HELLFIRE\r\n\t\tGetItemAttrs(ii, idx, curlv);\r\n#else\r\n\t\tGetItemAttrs(ii, idx, currlevel);\r\n#endif\r\n\t\tGetUniqueItem(ii, uid);\r\n\t\tSetupItem(ii);\r\n\t\titem[ii]._iMagical = ITEM_QUALITY_UNIQUE;\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\nvoid CreateRndItem(int x, int y, BOOL onlygood, BOOL sendmsg, BOOL delta)\r\n{\r\n\tint idx, ii;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (onlygood)\r\n\t\tidx = RndUItem(-1);\r\n\telse\r\n\t\tidx = RndAllItems();\r\n\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n#ifdef HELLFIRE\r\n\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * curlv, 1, onlygood, FALSE, delta);\r\n#else\r\n\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, onlygood, FALSE, delta);\r\n#endif\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t\tif (delta)\r\n\t\t\tDeltaAddItem(ii);\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\nvoid SetupAllUseful(int ii, int iseed, int lvl)\r\n{\r\n\tint idx;\r\n\r\n\titem[ii]._iSeed = iseed;\r\n\tSetRndSeed(iseed);\r\n\r\n#ifdef HELLFIRE\r\n\tidx = random_(34, 7);\r\n\tswitch (idx) {\r\n\tcase 0:\r\n\t\tidx = IDI_PORTAL;\r\n\t\tif ((lvl <= 1))\r\n\t\t\tidx = IDI_HEAL;\r\n\t\tbreak;\r\n\tcase 1:\r\n\tcase 2:\r\n\t\tidx = IDI_HEAL;\r\n\t\tbreak;\r\n\tcase 3:\r\n\t\tidx = IDI_PORTAL;\r\n\t\tif ((lvl <= 1))\r\n\t\t\tidx = IDI_MANA;\r\n\t\tbreak;\r\n\tcase 4:\r\n\tcase 5:\r\n\t\tidx = IDI_MANA;\r\n\t\tbreak;\r\n\tcase 6:\r\n\t\tidx = IDI_OIL;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tidx = IDI_OIL;\r\n\t\tbreak;\r\n\t}\r\n#else\r\n\tif (random_(34, 2) != 0)\r\n\t\tidx = IDI_HEAL;\r\n\telse\r\n\t\tidx = IDI_MANA;\r\n\r\n\tif (lvl > 1 && random_(34, 3) == 0)\r\n\t\tidx = IDI_PORTAL;\r\n#endif\r\n\r\n\tGetItemAttrs(ii, idx, lvl);\r\n\titem[ii]._iCreateInfo = lvl + CF_USEFUL;\r\n\tSetupItem(ii);\r\n}\r\n\r\nvoid CreateRndUseful(int pnum, int x, int y, BOOL sendmsg)\r\n{\r\n\tint ii;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n#ifdef HELLFIRE\r\n\t\tSetupAllUseful(ii, GetRndSeed(), curlv);\r\n#else\r\n\t\tSetupAllUseful(ii, GetRndSeed(), currlevel);\r\n#endif\r\n\t\tif (sendmsg) {\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t\t}\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\nvoid CreateTypeItem(int x, int y, BOOL onlygood, int itype, int imisc, BOOL sendmsg, BOOL delta)\r\n{\r\n\tint idx, ii;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n\tif (itype != ITYPE_GOLD)\r\n\t\tidx = RndTypeItems(itype, imisc, curlv);\r\n#else\r\n\tif (itype != ITYPE_GOLD)\r\n\t\tidx = RndTypeItems(itype, imisc);\r\n#endif\r\n\telse\r\n\t\tidx = IDI_GOLD;\r\n\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n#ifdef HELLFIRE\r\n\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * curlv, 1, onlygood, FALSE, delta);\r\n#else\r\n\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, onlygood, FALSE, delta);\r\n#endif\r\n\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t\tif (delta)\r\n\t\t\tDeltaAddItem(ii);\r\n\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\nvoid RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue)\r\n{\r\n\tint uper;\r\n\tBOOL onlygood, recreate, pregen;\r\n\r\n\tif (!idx) {\r\n\t\tSetPlrHandItem(&item[ii], IDI_GOLD);\r\n\t\titem[ii]._iSeed = iseed;\r\n\t\titem[ii]._iCreateInfo = icreateinfo;\r\n\t\titem[ii]._ivalue = ivalue;\r\n\t\tif (ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\t\titem[ii]._iCurs = ICURS_GOLD_LARGE;\r\n\t\telse if (ivalue <= GOLD_SMALL_LIMIT)\r\n\t\t\titem[ii]._iCurs = ICURS_GOLD_SMALL;\r\n\t\telse\r\n\t\t\titem[ii]._iCurs = ICURS_GOLD_MEDIUM;\r\n\t} else {\r\n\t\tif (!icreateinfo) {\r\n\t\t\tSetPlrHandItem(&item[ii], idx);\r\n\t\t\tSetPlrHandSeed(&item[ii], iseed);\r\n\t\t} else {\r\n\t\t\tif (icreateinfo & CF_TOWN) {\r\n\t\t\t\tRecreateTownItem(ii, idx, icreateinfo, iseed, ivalue);\r\n\t\t\t} else if ((icreateinfo & CF_USEFUL) == CF_USEFUL) {\r\n\t\t\t\tSetupAllUseful(ii, iseed, icreateinfo & CF_LEVEL);\r\n\t\t\t} else {\r\n\t\t\t\tuper = 0;\r\n\t\t\t\tonlygood = FALSE;\r\n\t\t\t\trecreate = FALSE;\r\n\t\t\t\tpregen = FALSE;\r\n\t\t\t\tif (icreateinfo & CF_UPER1)\r\n\t\t\t\t\tuper = 1;\r\n\t\t\t\tif (icreateinfo & CF_UPER15)\r\n\t\t\t\t\tuper = 15;\r\n\t\t\t\tif (icreateinfo & CF_ONLYGOOD)\r\n\t\t\t\t\tonlygood = TRUE;\r\n\t\t\t\tif (icreateinfo & CF_UNIQUE)\r\n\t\t\t\t\trecreate = TRUE;\r\n\t\t\t\tif (icreateinfo & CF_PREGEN)\r\n\t\t\t\t\tpregen = TRUE;\r\n\t\t\t\tSetupAllItems(ii, idx, iseed, icreateinfo & CF_LEVEL, uper, onlygood, recreate, pregen);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid RecreateEar(int ii, WORD ic, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff)\r\n{\r\n\tSetPlrHandItem(&item[ii], IDI_EAR);\r\n\ttempstr[0] = (ic >> 8) & 0x7F;\r\n\ttempstr[1] = ic & 0x7F;\r\n\ttempstr[2] = (iseed >> 24) & 0x7F;\r\n\ttempstr[3] = (iseed >> 16) & 0x7F;\r\n\ttempstr[4] = (iseed >> 8) & 0x7F;\r\n\ttempstr[5] = iseed & 0x7F;\r\n\ttempstr[6] = Id & 0x7F;\r\n\ttempstr[7] = dur & 0x7F;\r\n\ttempstr[8] = mdur & 0x7F;\r\n\ttempstr[9] = ch & 0x7F;\r\n\ttempstr[10] = mch & 0x7F;\r\n\ttempstr[11] = (ivalue >> 8) & 0x7F;\r\n\ttempstr[12] = (ibuff >> 24) & 0x7F;\r\n\ttempstr[13] = (ibuff >> 16) & 0x7F;\r\n\ttempstr[14] = (ibuff >> 8) & 0x7F;\r\n\ttempstr[15] = ibuff & 0x7F;\r\n\ttempstr[16] = '\\0';\r\n\tsprintf(item[ii]._iName, \"Ear of %s\", tempstr);\r\n\titem[ii]._iCurs = ((ivalue >> 6) & 3) + ICURS_EAR_SORCEROR;\r\n\titem[ii]._ivalue = ivalue & 0x3F;\r\n\titem[ii]._iCreateInfo = ic;\r\n\titem[ii]._iSeed = iseed;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid CornerstoneSave()\r\n{\r\n\tPkItemStruct id;\r\n\tif (CornerStone.activated) {\r\n\t\tif (CornerStone.item.IDidx >= 0) {\r\n\t\t\tPackItem(&id, &CornerStone.item);\r\n\t\t\tSRegSaveData(APP_NAME, CornerStoneRegKey, 0, (BYTE *)&id, 19);\r\n\t\t} else {\r\n\t\t\tSRegSaveData(APP_NAME, CornerStoneRegKey, 0, (BYTE *)\"\", 1);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CornerstoneLoad(int x, int y)\r\n{\r\n\tint i, ii;\r\n\tDWORD dwSize;\r\n\tPkItemStruct PkSItem;\r\n\r\n\tif (CornerStone.activated || x == 0 || y == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tCornerStone.item.IDidx = 0;\r\n\tCornerStone.activated = TRUE;\r\n\tif (dItem[x][y]) {\r\n\t\tii = dItem[x][y] - 1;\r\n\t\tfor (i = 0; i < numitems; i++) {\r\n\t\t\tif (itemactive[i] == ii) {\r\n\t\t\t\tDeleteItem(ii, i);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tdItem[x][y] = 0;\r\n\t}\r\n\tdwSize = 0;\r\n\tif (SRegLoadData(APP_NAME, CornerStoneRegKey, 0, (BYTE *)&PkSItem, sizeof(PkSItem), &dwSize)) {\r\n\t\tif (dwSize == sizeof(PkSItem)) {\r\n\t\t\tii = itemavail[0];\r\n\t\t\tdItem[x][y] = ii + 1;\r\n\t\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\t\titemactive[numitems] = ii;\r\n\t\t\tUnPackItem(&PkSItem, &item[ii]);\r\n\t\t\titem[ii]._ix = x;\r\n\t\t\titem[ii]._iy = y;\r\n\t\t\tRespawnItem(ii, FALSE);\r\n\t\t\tCornerStone.item = item[ii];\r\n\t\t\tnumitems++;\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid SpawnQuestItem(int itemid, int x, int y, int randarea, int selflag)\r\n{\r\n\tBOOL failed;\r\n\tint i, j, tries;\r\n\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (randarea) {\r\n\t\ttries = 0;\r\n\t\twhile (1) {\r\n\t\t\ttries++;\r\n\t\t\tif (tries > 1000 && randarea > 1)\r\n\t\t\t\trandarea--;\r\n\t\t\tx = random_(0, MAXDUNX);\r\n\t\t\ty = random_(0, MAXDUNY);\r\n\t\t\tfailed = FALSE;\r\n\t\t\tfor (i = 0; i < randarea && !failed; i++) {\r\n\t\t\t\tfor (j = 0; j < randarea && !failed; j++) {\r\n\t\t\t\t\tfailed = !ItemSpaceOk(i + x, j + y);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!failed)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (numitems < MAXITEMS) {\r\n\t\ti = itemavail[0];\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = i;\r\n\t\titem[i]._ix = x;\r\n\t\titem[i]._iy = y;\r\n\t\tdItem[x][y] = i + 1;\r\n#ifdef HELLFIRE\r\n\t\tGetItemAttrs(i, itemid, curlv);\r\n#else\r\n\t\tGetItemAttrs(i, itemid, currlevel);\r\n#endif\r\n\t\tSetupItem(i);\r\n\t\titem[i]._iPostDraw = TRUE;\r\n\t\tif (selflag) {\r\n\t\t\titem[i]._iSelFlag = selflag;\r\n\t\t\titem[i]._iAnimFrame = item[i]._iAnimLen;\r\n\t\t\titem[i]._iAnimFlag = FALSE;\r\n\t\t}\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\nvoid SpawnRock()\r\n{\r\n\tint i, ii;\r\n\tint xx, yy;\r\n\tint ostand;\r\n\r\n\tostand = FALSE;\r\n\tfor (i = 0; i < nobjects && !ostand; i++) {\r\n\t\tii = objectactive[i];\r\n\t\tostand = object[ii]._otype == OBJ_STAND;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (ostand) {\r\n\t\ti = itemavail[0];\r\n\t\titemavail[0] = itemavail[127 - numitems - 1];\r\n\t\titemactive[numitems] = i;\r\n\t\txx = object[ii]._ox;\r\n\t\tyy = object[ii]._oy;\r\n\t\titem[i]._ix = xx;\r\n\t\titem[i]._iy = yy;\r\n\t\tdItem[xx][item[i]._iy] = i + 1;\r\n#ifdef HELLFIRE\r\n\t\tGetItemAttrs(i, IDI_ROCK, curlv);\r\n#else\r\n\t\tGetItemAttrs(i, IDI_ROCK, currlevel);\r\n#endif\r\n\t\tSetupItem(i);\r\n\t\titem[i]._iSelFlag = 2;\r\n\t\titem[i]._iPostDraw = TRUE;\r\n\t\titem[i]._iAnimFrame = 11;\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid SpawnRewardItem(int itemid, int xx, int yy)\r\n{\r\n\tint i;\r\n\r\n\ti = itemavail[0];\r\n\tint curlv = items_get_currlevel();\r\n\titemavail[0] = itemavail[127 - numitems - 1];\r\n\titemactive[numitems] = i;\r\n\titem[i]._ix = xx;\r\n\titem[i]._iy = yy;\r\n\tdItem[xx][yy] = i + 1;\r\n\tGetItemAttrs(i, itemid, curlv);\r\n\tSetupItem(i);\r\n\titem[i]._iSelFlag = 2;\r\n\titem[i]._iPostDraw = TRUE;\r\n\titem[i]._iAnimFrame = 1;\r\n\titem[i]._iAnimFlag = TRUE;\r\n\titem[i]._iIdentified = TRUE;\r\n\tnumitems++;\r\n}\r\n\r\nvoid SpawnMapOfDoom(int xx, int yy)\r\n{\r\n\tSpawnRewardItem(IDI_MAPOFDOOM, xx, yy);\r\n}\r\n\r\nvoid SpawnRuneBomb(int xx, int yy)\r\n{\r\n\tSpawnRewardItem(IDI_RUNEBOMB, xx, yy);\r\n}\r\n\r\nvoid SpawnTheodore(int xx, int yy)\r\n{\r\n\tSpawnRewardItem(IDI_THEODORE, xx, yy);\r\n}\r\n#endif\r\n\r\nvoid RespawnItem(int i, BOOL FlipFlag)\r\n{\r\n\tint it;\r\n\r\n\tit = ItemCAnimTbl[item[i]._iCurs];\r\n\titem[i]._iAnimData = itemanims[it];\r\n\titem[i]._iAnimLen = ItemAnimLs[it];\r\n\titem[i]._iAnimWidth = 96;\r\n\titem[i]._iAnimWidth2 = 16;\r\n\titem[i]._iPostDraw = FALSE;\r\n\titem[i]._iRequest = FALSE;\r\n\tif (FlipFlag) {\r\n\t\titem[i]._iAnimFrame = 1;\r\n\t\titem[i]._iAnimFlag = TRUE;\r\n\t\titem[i]._iSelFlag = 0;\r\n\t} else {\r\n\t\titem[i]._iAnimFrame = item[i]._iAnimLen;\r\n\t\titem[i]._iAnimFlag = FALSE;\r\n\t\titem[i]._iSelFlag = 1;\r\n\t}\r\n\r\n\tif (item[i]._iCurs == ICURS_MAGIC_ROCK) {\r\n\t\titem[i]._iSelFlag = 1;\r\n\t\tPlaySfxLoc(ItemDropSnds[it], item[i]._ix, item[i]._iy);\r\n\t}\r\n\tif (item[i]._iCurs == ICURS_TAVERN_SIGN)\r\n\t\titem[i]._iSelFlag = 1;\r\n\tif (item[i]._iCurs == ICURS_ANVIL_OF_FURY)\r\n\t\titem[i]._iSelFlag = 1;\r\n}\r\n\r\nvoid DeleteItem(int ii, int i)\r\n{\r\n\titemavail[MAXITEMS - numitems] = ii;\r\n\tnumitems--;\r\n\tif (numitems > 0 && i != numitems)\r\n\t\titemactive[i] = itemactive[numitems];\r\n}\r\n\r\nvoid ItemDoppel()\r\n{\r\n\tint idoppelx;\r\n\tItemStruct *i;\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tfor (idoppelx = 16; idoppelx < 96; idoppelx++) {\r\n\t\t\tif (dItem[idoppelx][idoppely]) {\r\n\t\t\t\ti = &item[dItem[idoppelx][idoppely] - 1];\r\n\t\t\t\tif (i->_ix != idoppelx || i->_iy != idoppely)\r\n\t\t\t\t\tdItem[idoppelx][idoppely] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\tidoppely++;\r\n\t\tif (idoppely == 96)\r\n\t\t\tidoppely = 16;\r\n\t}\r\n}\r\n\r\nvoid ProcessItems()\r\n{\r\n\tint i, ii;\r\n\r\n\tfor (i = 0; i < numitems; i++) {\r\n\t\tii = itemactive[i];\r\n\t\tif (item[ii]._iAnimFlag) {\r\n\t\t\titem[ii]._iAnimFrame++;\r\n\t\t\tif (item[ii]._iCurs == ICURS_MAGIC_ROCK) {\r\n\t\t\t\tif (item[ii]._iSelFlag == 1 && item[ii]._iAnimFrame == 11)\r\n\t\t\t\t\titem[ii]._iAnimFrame = 1;\r\n\t\t\t\tif (item[ii]._iSelFlag == 2 && item[ii]._iAnimFrame == 21)\r\n\t\t\t\t\titem[ii]._iAnimFrame = 11;\r\n\t\t\t} else {\r\n\t\t\t\tif (item[ii]._iAnimFrame == item[ii]._iAnimLen >> 1)\r\n\t\t\t\t\tPlaySfxLoc(ItemDropSnds[ItemCAnimTbl[item[ii]._iCurs]], item[ii]._ix, item[ii]._iy);\r\n\r\n\t\t\t\tif (item[ii]._iAnimFrame >= item[ii]._iAnimLen) {\r\n\t\t\t\t\titem[ii]._iAnimFrame = item[ii]._iAnimLen;\r\n\t\t\t\t\titem[ii]._iAnimFlag = FALSE;\r\n\t\t\t\t\titem[ii]._iSelFlag = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tItemDoppel();\r\n}\r\n\r\nvoid FreeItemGFX()\r\n{\r\n#ifdef HELLFIRE\r\n\tDWORD i;\r\n#else\r\n\tint i;\r\n#endif\r\n\r\n\tfor (i = 0; i < ITEMTYPES; i++) {\r\n\t\tMemFreeDbg(itemanims[i]);\r\n\t}\r\n}\r\n\r\nvoid GetItemFrm(int i)\r\n{\r\n\titem[i]._iAnimData = itemanims[ItemCAnimTbl[item[i]._iCurs]];\r\n}\r\n\r\nvoid GetItemStr(int i)\r\n{\r\n\tint nGold;\r\n\r\n\tif (item[i]._itype != ITYPE_GOLD) {\r\n\t\tif (item[i]._iIdentified)\r\n\t\t\tstrcpy(infostr, item[i]._iIName);\r\n\t\telse\r\n\t\t\tstrcpy(infostr, item[i]._iName);\r\n\r\n\t\tif (item[i]._iMagical == ITEM_QUALITY_MAGIC)\r\n\t\t\tinfoclr = COL_BLUE;\r\n\t\tif (item[i]._iMagical == ITEM_QUALITY_UNIQUE)\r\n\t\t\tinfoclr = COL_GOLD;\r\n\t} else {\r\n\t\tnGold = item[i]._ivalue;\r\n\t\tsprintf(infostr, \"%i gold %s\", nGold, get_pieces_str(nGold));\r\n\t}\r\n}\r\n\r\nvoid CheckIdentify(int pnum, int cii)\r\n{\r\n\tItemStruct *pi;\r\n\r\n\tif (cii >= NUM_INVLOC)\r\n\t\tpi = &plr[pnum].InvList[cii - NUM_INVLOC];\r\n\telse\r\n\t\tpi = &plr[pnum].InvBody[cii];\r\n\r\n\tpi->_iIdentified = TRUE;\r\n\tCalcPlrInv(pnum, TRUE);\r\n\r\n\tif (pnum == myplr)\r\n\t\tSetCursor_(CURSOR_HAND);\r\n}\r\n\r\nstatic void RepairItem(ItemStruct *i, int lvl)\r\n{\r\n\tint rep, d;\r\n\r\n\tif (i->_iDurability == i->_iMaxDur) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (i->_iMaxDur <= 0) {\r\n\t\ti->_itype = ITYPE_NONE;\r\n\t\treturn;\r\n\t}\r\n\r\n\trep = 0;\r\n\tdo {\r\n\t\trep += lvl + random_(37, lvl);\r\n\t\td = i->_iMaxDur / (lvl + 9);\r\n\t\tif (d < 1)\r\n\t\t\td = 1;\r\n\t\ti->_iMaxDur = i->_iMaxDur - d;\r\n\t\tif (!i->_iMaxDur) {\r\n\t\t\ti->_itype = ITYPE_NONE;\r\n\t\t\treturn;\r\n\t\t}\r\n\t} while (rep + i->_iDurability < i->_iMaxDur);\r\n\r\n\ti->_iDurability += rep;\r\n\tif (i->_iDurability > i->_iMaxDur)\r\n\t\ti->_iDurability = i->_iMaxDur;\r\n}\r\n\r\nvoid DoRepair(int pnum, int cii)\r\n{\r\n\tPlayerStruct *p;\r\n\tItemStruct *pi;\r\n\r\n\tp = &plr[pnum];\r\n\tPlaySfxLoc(IS_REPAIR, p->_px, p->_py);\r\n\r\n\tif (cii >= NUM_INVLOC) {\r\n\t\tpi = &p->InvList[cii - NUM_INVLOC];\r\n\t} else {\r\n\t\tpi = &p->InvBody[cii];\r\n\t}\r\n\r\n\tRepairItem(pi, p->_pLevel);\r\n\tCalcPlrInv(pnum, TRUE);\r\n\r\n\tif (pnum == myplr)\r\n\t\tSetCursor_(CURSOR_HAND);\r\n}\r\n\r\nstatic void RechargeItem(ItemStruct *i, int r)\r\n{\r\n\tif (i->_iCharges != i->_iMaxCharges) {\r\n\t\tdo {\r\n\t\t\ti->_iMaxCharges--;\r\n\t\t\tif (i->_iMaxCharges == 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ti->_iCharges += r;\r\n\t\t} while (i->_iCharges < i->_iMaxCharges);\r\n\t\tif (i->_iCharges > i->_iMaxCharges)\r\n\t\t\ti->_iCharges = i->_iMaxCharges;\r\n\t}\r\n}\r\n\r\nvoid DoRecharge(int pnum, int cii)\r\n{\r\n\tPlayerStruct *p;\r\n\tItemStruct *pi;\r\n\tint r;\r\n\r\n\tp = &plr[pnum];\r\n\tif (cii >= NUM_INVLOC) {\r\n\t\tpi = &p->InvList[cii - NUM_INVLOC];\r\n\t} else {\r\n\t\tpi = &p->InvBody[cii];\r\n\t}\r\n\tif (pi->_itype == ITYPE_STAFF && pi->_iSpell != SPL_NULL) {\r\n\t\tr = spelldata[pi->_iSpell].sBookLvl;\r\n\t\tr = random_(38, p->_pLevel / r) + 1;\r\n\t\tRechargeItem(pi, r);\r\n\t\tCalcPlrInv(pnum, TRUE);\r\n\t}\r\n\r\n\tif (pnum == myplr)\r\n\t\tSetCursor_(CURSOR_HAND);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic BOOL OilItem(ItemStruct *x, PlayerStruct *p)\r\n{\r\n\tint dur, r;\r\n\r\n\tif (x->_iClass == ICLASS_MISC) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (x->_iClass == ICLASS_GOLD) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (x->_iClass == ICLASS_QUEST) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tswitch (p->_pOilType) {\r\n\tcase IMISC_OILACC:\r\n\tcase IMISC_OILMAST:\r\n\tcase IMISC_OILSHARP:\r\n\t\tif (x->_iClass == ICLASS_ARMOR) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILDEATH:\r\n\t\tif (x->_iClass == ICLASS_ARMOR) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t\tif (x->_itype == ITYPE_BOW) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILHARD:\r\n\tcase IMISC_OILIMP:\r\n\t\tif (x->_iClass == ICLASS_WEAPON) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\r\n\tswitch (p->_pOilType) {\r\n\tcase IMISC_OILACC:\r\n\t\tif (x->_iPLToHit < 50) {\r\n\t\t\tx->_iPLToHit += random_(68, 2) + 1;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILMAST:\r\n\t\tif (x->_iPLToHit < 100) {\r\n\t\t\tx->_iPLToHit += random_(68, 3) + 3;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILSHARP:\r\n\t\tif (x->_iMaxDam - x->_iMinDam < 30) {\r\n\t\t\tx->_iMaxDam = x->_iMaxDam + 1;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILDEATH:\r\n\t\tif (x->_iMaxDam - x->_iMinDam < 30) {\r\n\t\t\tx->_iMinDam = x->_iMinDam + 1;\r\n\t\t\tx->_iMaxDam = x->_iMaxDam + 2;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILSKILL:\r\n\t\tr = random_(68, 6) + 5;\r\n\t\tif (x->_iMinStr > r) {\r\n\t\t\tx->_iMinStr = x->_iMinStr - r;\r\n\t\t} else {\r\n\t\t\tx->_iMinStr = 0;\r\n\t\t}\r\n\t\tif (x->_iMinMag > r) {\r\n\t\t\tx->_iMinMag = x->_iMinMag - r;\r\n\t\t} else {\r\n\t\t\tx->_iMinMag = 0;\r\n\t\t}\r\n\t\tif (x->_iMinDex > r) {\r\n\t\t\tx->_iMinDex = x->_iMinDex - r;\r\n\t\t} else {\r\n\t\t\tx->_iMinDex = 0;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILBSMTH:\r\n\t\tif (x->_iMaxDur != 255) {\r\n\t\t\tif (x->_iDurability < x->_iMaxDur) {\r\n\t\t\t\tdur = (x->_iMaxDur + 4) / 5 + x->_iDurability;\r\n\t\t\t\tif (dur > x->_iMaxDur) {\r\n\t\t\t\t\tdur = x->_iMaxDur;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (x->_iMaxDur >= 100) {\r\n\t\t\t\t\treturn TRUE;\r\n\t\t\t\t}\r\n\t\t\t\tdur = x->_iMaxDur + 1;\r\n\t\t\t\tx->_iMaxDur = dur;\r\n\t\t\t}\r\n\t\t\tx->_iDurability = dur;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILFORT:\r\n\t\tif (x->_iMaxDur != 255 && x->_iMaxDur < 200) {\r\n\t\t\tr = random_(68, 41) + 10;\r\n\t\t\tx->_iMaxDur += r;\r\n\t\t\tx->_iDurability += r;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILPERM:\r\n\t\tx->_iDurability = 255;\r\n\t\tx->_iMaxDur = 255;\r\n\t\tbreak;\r\n\tcase IMISC_OILHARD:\r\n\t\tif (x->_iAC < 60) {\r\n\t\t\tx->_iAC += random_(68, 2) + 1;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_OILIMP:\r\n\t\tif (x->_iAC < 120) {\r\n\t\t\tx->_iAC += random_(68, 3) + 3;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nvoid DoOil(int pnum, int cii)\r\n{\r\n\tPlayerStruct *p = &plr[pnum];\r\n\r\n\tif (cii >= NUM_INVLOC || cii == INVLOC_HEAD || (cii > INVLOC_AMULET && cii <= INVLOC_CHEST)) {\r\n\t\tif (OilItem(&p->InvBody[cii], p)) {\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid PrintItemOil(char IDidx)\r\n{\r\n\tswitch (IDidx) {\r\n#ifdef HELLFIRE\r\n\tcase IMISC_OILACC:\r\n\t\tstrcpy(tempstr, \"increases a weapon's\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"chance to hit\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILMAST:\r\n\t\tstrcpy(tempstr, \"greatly increases a\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"weapon's chance to hit\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILSHARP:\r\n\t\tstrcpy(tempstr, \"increases a weapon's\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"damage potential\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILDEATH:\r\n\t\tstrcpy(tempstr, \"greatly increases a weapon's\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"damage potential - not bows\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILSKILL:\r\n\t\tstrcpy(tempstr, \"reduces attributes needed\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"to use armor or weapons\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILBSMTH:\r\n\t\tstrcpy(tempstr, \"restores 20% of an\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"item's durability\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILFORT:\r\n\t\tstrcpy(tempstr, \"increases an item's\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"current and max durability\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILPERM:\r\n\t\tstrcpy(tempstr, \"makes an item indestructible\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILHARD:\r\n\t\tstrcpy(tempstr, \"increases the armor class\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"of armor and shields\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OILIMP:\r\n\t\tstrcpy(tempstr, \"greatly increases the armor\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"class of armor and shields\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_RUNEF:\r\n\t\tstrcpy(tempstr, \"sets fire trap\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_RUNEL:\r\n\t\tstrcpy(tempstr, \"sets lightning trap\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_GR_RUNEL:\r\n\t\tstrcpy(tempstr, \"sets lightning trap\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_GR_RUNEF:\r\n\t\tstrcpy(tempstr, \"sets fire trap\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_RUNES:\r\n\t\tstrcpy(tempstr, \"sets petrification trap\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n#endif\r\n\tcase IMISC_FULLHEAL:\r\n\t\tstrcpy(tempstr, \"fully recover life\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_HEAL:\r\n\t\tstrcpy(tempstr, \"recover partial life\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_OLDHEAL:\r\n\t\tstrcpy(tempstr, \"recover life\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_DEADHEAL:\r\n\t\tstrcpy(tempstr, \"deadly heal\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_MANA:\r\n\t\tstrcpy(tempstr, \"recover mana\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_FULLMANA:\r\n\t\tstrcpy(tempstr, \"fully recover mana\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXSTR:\r\n\t\tstrcpy(tempstr, \"increase strength\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXMAG:\r\n\t\tstrcpy(tempstr, \"increase magic\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXDEX:\r\n\t\tstrcpy(tempstr, \"increase dexterity\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXVIT:\r\n\t\tstrcpy(tempstr, \"increase vitality\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXWEAK:\r\n\t\tstrcpy(tempstr, \"decrease strength\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXDIS:\r\n\t\tstrcpy(tempstr, \"decrease strength\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXCLUM:\r\n\t\tstrcpy(tempstr, \"decrease dexterity\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXSICK:\r\n\t\tstrcpy(tempstr, \"decrease vitality\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_REJUV:\r\n\t\tstrcpy(tempstr, \"recover life and mana\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\tcase IMISC_FULLREJUV:\r\n\t\tstrcpy(tempstr, \"fully recover life and mana\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid PrintItemPower(char plidx, ItemStruct *x)\r\n{\r\n\tswitch (plidx) {\r\n\tcase IPL_TOHIT:\r\n\tcase IPL_TOHIT_CURSE:\r\n\t\tsprintf(tempstr, \"chance to hit : %+i%%\", x->_iPLToHit);\r\n\t\tbreak;\r\n\tcase IPL_DAMP:\r\n\tcase IPL_DAMP_CURSE:\r\n\t\tsprintf(tempstr, \"%+i%% damage\", x->_iPLDam);\r\n\t\tbreak;\r\n\tcase IPL_TOHIT_DAMP:\r\n\tcase IPL_TOHIT_DAMP_CURSE:\r\n\t\tsprintf(tempstr, \"to hit: %+i%%, %+i%% damage\", x->_iPLToHit, x->_iPLDam);\r\n\t\tbreak;\r\n\tcase IPL_ACP:\r\n\tcase IPL_ACP_CURSE:\r\n\t\tsprintf(tempstr, \"%+i%% armor\", x->_iPLAC);\r\n\t\tbreak;\r\n\tcase IPL_SETAC:\r\n\t\tsprintf(tempstr, \"armor class: %i\", x->_iAC);\r\n\t\tbreak;\r\n\tcase IPL_AC_CURSE:\r\n\t\tsprintf(tempstr, \"armor class: %i\", x->_iAC);\r\n\t\tbreak;\r\n\tcase IPL_FIRERES:\r\n#ifdef HELLFIRE\r\n\tcase IPL_FIRERES_CURSE:\r\n#endif\r\n\t\tif (x->_iPLFR < 75)\r\n\t\t\tsprintf(tempstr, \"Resist Fire : %+i%%\", x->_iPLFR);\r\n#ifdef HELLFIRE\r\n\t\telse\r\n#else\r\n\t\tif (x->_iPLFR >= 75)\r\n#endif\r\n\t\t\tsprintf(tempstr, \"Resist Fire : 75%% MAX\");\r\n\t\tbreak;\r\n\tcase IPL_LIGHTRES:\r\n#ifdef HELLFIRE\r\n\tcase IPL_LIGHTRES_CURSE:\r\n#endif\r\n\t\tif (x->_iPLLR < 75)\r\n\t\t\tsprintf(tempstr, \"Resist Lightning : %+i%%\", x->_iPLLR);\r\n#ifdef HELLFIRE\r\n\t\telse\r\n#else\r\n\t\tif (x->_iPLLR >= 75)\r\n#endif\r\n\t\t\tsprintf(tempstr, \"Resist Lightning : 75%% MAX\");\r\n\t\tbreak;\r\n\tcase IPL_MAGICRES:\r\n#ifdef HELLFIRE\r\n\tcase IPL_MAGICRES_CURSE:\r\n#endif\r\n\t\tif (x->_iPLMR < 75)\r\n\t\t\tsprintf(tempstr, \"Resist Magic : %+i%%\", x->_iPLMR);\r\n#ifdef HELLFIRE\r\n\t\telse\r\n#else\r\n\t\tif (x->_iPLMR >= 75)\r\n#endif\r\n\t\t\tsprintf(tempstr, \"Resist Magic : 75%% MAX\");\r\n\t\tbreak;\r\n\tcase IPL_ALLRES:\r\n#ifdef HELLFIRE\r\n\tcase IPL_ALLRES_CURSE:\r\n#endif\r\n\t\tif (x->_iPLFR < 75)\r\n\t\t\tsprintf(tempstr, \"Resist All : %+i%%\", x->_iPLFR);\r\n\t\tif (x->_iPLFR >= 75)\r\n\t\t\tsprintf(tempstr, \"Resist All : 75%% MAX\");\r\n\t\tbreak;\r\n\tcase IPL_SPLLVLADD:\r\n\t\tif (x->_iSplLvlAdd == 1)\r\n\t\t\tstrcpy(tempstr, \"spells are increased 1 level\");\r\n#ifdef HELLFIRE\r\n\t\telse if (x->_iSplLvlAdd > 1)\r\n\t\t\tsprintf(tempstr, \"spells are increased %i levels\", x->_iSplLvlAdd);\r\n\t\telse if (x->_iSplLvlAdd == -1)\r\n#else\r\n\t\tif (x->_iSplLvlAdd == 2)\r\n\t\t\tstrcpy(tempstr, \"spells are increased 2 levels\");\r\n\t\tif (x->_iSplLvlAdd < 1) // BUGFIX: should be `x->_iSplLvlAdd == -1`, not `x->_iSplLvlAdd < 1`.\r\n#endif\r\n\t\t\tstrcpy(tempstr, \"spells are decreased 1 level\");\r\n#ifdef HELLFIRE\r\n\t\telse if (x->_iSplLvlAdd < -1)\r\n\t\t\tsprintf(tempstr, \"spells are decreased %i levels\", -x->_iSplLvlAdd);\r\n\t\telse if (x->_iSplLvlAdd == 0)\r\n\t\t\tstrcpy(tempstr, \"spell levels unchanged (?)\");\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_CHARGES:\r\n\t\tstrcpy(tempstr, \"Extra charges\");\r\n\t\tbreak;\r\n\tcase IPL_SPELL:\r\n\t\tsprintf(tempstr, \"%i %s charges\", x->_iMaxCharges, spelldata[x->_iSpell].sNameText);\r\n\t\tbreak;\r\n\tcase IPL_FIREDAM:\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iFMinDam == x->_iFMaxDam)\r\n\t\t\tsprintf(tempstr, \"Fire hit damage: %i\", x->_iFMinDam);\r\n\t\telse\r\n#endif\r\n\t\t\tsprintf(tempstr, \"Fire hit damage: %i-%i\", x->_iFMinDam, x->_iFMaxDam);\r\n\t\tbreak;\r\n\tcase IPL_LIGHTDAM:\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iLMinDam == x->_iLMaxDam)\r\n\t\t\tsprintf(tempstr, \"Lightning hit damage: %i\", x->_iLMinDam);\r\n\t\telse\r\n#endif\r\n\t\t\tsprintf(tempstr, \"Lightning hit damage: %i-%i\", x->_iLMinDam, x->_iLMaxDam);\r\n\t\tbreak;\r\n\tcase IPL_STR:\r\n\tcase IPL_STR_CURSE:\r\n\t\tsprintf(tempstr, \"%+i to strength\", x->_iPLStr);\r\n\t\tbreak;\r\n\tcase IPL_MAG:\r\n\tcase IPL_MAG_CURSE:\r\n\t\tsprintf(tempstr, \"%+i to magic\", x->_iPLMag);\r\n\t\tbreak;\r\n\tcase IPL_DEX:\r\n\tcase IPL_DEX_CURSE:\r\n\t\tsprintf(tempstr, \"%+i to dexterity\", x->_iPLDex);\r\n\t\tbreak;\r\n\tcase IPL_VIT:\r\n\tcase IPL_VIT_CURSE:\r\n\t\tsprintf(tempstr, \"%+i to vitality\", x->_iPLVit);\r\n\t\tbreak;\r\n\tcase IPL_ATTRIBS:\r\n\tcase IPL_ATTRIBS_CURSE:\r\n\t\tsprintf(tempstr, \"%+i to all attributes\", x->_iPLStr);\r\n\t\tbreak;\r\n\tcase IPL_GETHIT_CURSE:\r\n\tcase IPL_GETHIT:\r\n\t\tsprintf(tempstr, \"%+i damage from enemies\", x->_iPLGetHit);\r\n\t\tbreak;\r\n\tcase IPL_LIFE:\r\n\tcase IPL_LIFE_CURSE:\r\n\t\tsprintf(tempstr, \"Hit Points : %+i\", x->_iPLHP >> 6);\r\n\t\tbreak;\r\n\tcase IPL_MANA:\r\n\tcase IPL_MANA_CURSE:\r\n\t\tsprintf(tempstr, \"Mana : %+i\", x->_iPLMana >> 6);\r\n\t\tbreak;\r\n\tcase IPL_DUR:\r\n\t\tstrcpy(tempstr, \"high durability\");\r\n\t\tbreak;\r\n\tcase IPL_DUR_CURSE:\r\n\t\tstrcpy(tempstr, \"decreased durability\");\r\n\t\tbreak;\r\n\tcase IPL_INDESTRUCTIBLE:\r\n\t\tstrcpy(tempstr, \"indestructible\");\r\n\t\tbreak;\r\n\tcase IPL_LIGHT:\r\n\t\tsprintf(tempstr, \"+%i%% light radius\", 10 * x->_iPLLight);\r\n\t\tbreak;\r\n\tcase IPL_LIGHT_CURSE:\r\n\t\tsprintf(tempstr, \"-%i%% light radius\", -10 * x->_iPLLight);\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_MULT_ARROWS:\r\n\t\tsprintf(tempstr, \"multiple arrows per shot\");\r\n\t\tbreak;\r\n#endif\r\n\tcase IPL_FIRE_ARROWS:\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iFMinDam == x->_iFMaxDam)\r\n\t\t\tsprintf(tempstr, \"fire arrows damage: %i\", x->_iFMinDam);\r\n\t\telse\r\n#endif\r\n\t\t\tsprintf(tempstr, \"fire arrows damage: %i-%i\", x->_iFMinDam, x->_iFMaxDam);\r\n\t\tbreak;\r\n\tcase IPL_LIGHT_ARROWS:\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iLMinDam == x->_iLMaxDam)\r\n\t\t\tsprintf(tempstr, \"lightning arrows damage %i\", x->_iLMinDam);\r\n\t\telse\r\n#endif\r\n\t\t\tsprintf(tempstr, \"lightning arrows damage %i-%i\", x->_iLMinDam, x->_iLMaxDam);\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_FIREBALL:\r\n\t\tif (x->_iFMinDam == x->_iFMaxDam)\r\n\t\t\tsprintf(tempstr, \"fireball damage: %i\", x->_iFMinDam);\r\n\t\telse\r\n\t\t\tsprintf(tempstr, \"fireball damage: %i-%i\", x->_iFMinDam, x->_iFMaxDam);\r\n\t\tbreak;\r\n#endif\r\n\tcase IPL_THORNS:\r\n\t\tstrcpy(tempstr, \"attacker takes 1-3 damage\");\r\n\t\tbreak;\r\n\tcase IPL_NOMANA:\r\n\t\tstrcpy(tempstr, \"user loses all mana\");\r\n\t\tbreak;\r\n\tcase IPL_NOHEALPLR:\r\n\t\tstrcpy(tempstr, \"you can't heal\");\r\n\t\tbreak;\r\n\tcase IPL_ABSHALFTRAP:\r\n\t\tstrcpy(tempstr, \"absorbs half of trap damage\");\r\n\t\tbreak;\r\n\tcase IPL_KNOCKBACK:\r\n\t\tstrcpy(tempstr, \"knocks target back\");\r\n\t\tbreak;\r\n\tcase IPL_3XDAMVDEM:\r\n\t\tstrcpy(tempstr, \"+200% damage vs. demons\");\r\n\t\tbreak;\r\n\tcase IPL_ALLRESZERO:\r\n\t\tstrcpy(tempstr, \"All Resistance equals 0\");\r\n\t\tbreak;\r\n\tcase IPL_NOHEALMON:\r\n\t\tstrcpy(tempstr, \"hit monster doesn't heal\");\r\n\t\tbreak;\r\n\tcase IPL_STEALMANA:\r\n\t\tif (x->_iFlags & ISPL_STEALMANA_3)\r\n\t\t\tstrcpy(tempstr, \"hit steals 3% mana\");\r\n\t\tif (x->_iFlags & ISPL_STEALMANA_5)\r\n\t\t\tstrcpy(tempstr, \"hit steals 5% mana\");\r\n\t\tbreak;\r\n\tcase IPL_STEALLIFE:\r\n\t\tif (x->_iFlags & ISPL_STEALLIFE_3)\r\n\t\t\tstrcpy(tempstr, \"hit steals 3% life\");\r\n\t\tif (x->_iFlags & ISPL_STEALLIFE_5)\r\n\t\t\tstrcpy(tempstr, \"hit steals 5% life\");\r\n\t\tbreak;\r\n\tcase IPL_TARGAC:\r\n#ifdef HELLFIRE\r\n\t\tstrcpy(tempstr, \"penetrates target's armor\");\r\n#else\r\n\t\tstrcpy(tempstr, \"damages target's armor\");\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_FASTATTACK:\r\n\t\tif (x->_iFlags & ISPL_QUICKATTACK)\r\n\t\t\tstrcpy(tempstr, \"quick attack\");\r\n\t\tif (x->_iFlags & ISPL_FASTATTACK)\r\n\t\t\tstrcpy(tempstr, \"fast attack\");\r\n\t\tif (x->_iFlags & ISPL_FASTERATTACK)\r\n\t\t\tstrcpy(tempstr, \"faster attack\");\r\n\t\tif (x->_iFlags & ISPL_FASTESTATTACK)\r\n\t\t\tstrcpy(tempstr, \"fastest attack\");\r\n\t\tbreak;\r\n\tcase IPL_FASTRECOVER:\r\n\t\tif (x->_iFlags & ISPL_FASTRECOVER)\r\n\t\t\tstrcpy(tempstr, \"fast hit recovery\");\r\n\t\tif (x->_iFlags & ISPL_FASTERRECOVER)\r\n\t\t\tstrcpy(tempstr, \"faster hit recovery\");\r\n\t\tif (x->_iFlags & ISPL_FASTESTRECOVER)\r\n\t\t\tstrcpy(tempstr, \"fastest hit recovery\");\r\n\t\tbreak;\r\n\tcase IPL_FASTBLOCK:\r\n\t\tstrcpy(tempstr, \"fast block\");\r\n\t\tbreak;\r\n\tcase IPL_DAMMOD:\r\n\t\tsprintf(tempstr, \"adds %i points to damage\", x->_iPLDamMod);\r\n\t\tbreak;\r\n\tcase IPL_RNDARROWVEL:\r\n\t\tstrcpy(tempstr, \"fires random speed arrows\");\r\n\t\tbreak;\r\n\tcase IPL_SETDAM:\r\n\t\tsprintf(tempstr, \"unusual item damage\");\r\n\t\tbreak;\r\n\tcase IPL_SETDUR:\r\n\t\tstrcpy(tempstr, \"altered durability\");\r\n\t\tbreak;\r\n\tcase IPL_FASTSWING:\r\n\t\tstrcpy(tempstr, \"Faster attack swing\");\r\n\t\tbreak;\r\n\tcase IPL_ONEHAND:\r\n\t\tstrcpy(tempstr, \"one handed sword\");\r\n\t\tbreak;\r\n\tcase IPL_DRAINLIFE:\r\n\t\tstrcpy(tempstr, \"constantly lose hit points\");\r\n\t\tbreak;\r\n\tcase IPL_RNDSTEALLIFE:\r\n\t\tstrcpy(tempstr, \"life stealing\");\r\n\t\tbreak;\r\n\tcase IPL_NOMINSTR:\r\n\t\tstrcpy(tempstr, \"no strength requirement\");\r\n\t\tbreak;\r\n\tcase IPL_INFRAVISION:\r\n\t\tstrcpy(tempstr, \"see with infravision\");\r\n\t\tbreak;\r\n\tcase IPL_INVCURS:\r\n\t\tstrcpy(tempstr, \" \");\r\n\t\tbreak;\r\n\tcase IPL_ADDACLIFE:\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iFMinDam == x->_iFMaxDam)\r\n\t\t\tsprintf(tempstr, \"lightning damage: %i\", x->_iFMinDam);\r\n\t\telse\r\n\t\t\tsprintf(tempstr, \"lightning damage: %i-%i\", x->_iFMinDam, x->_iFMaxDam);\r\n#else\r\n\t\tstrcpy(tempstr, \"Armor class added to life\");\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_ADDMANAAC:\r\n#ifdef HELLFIRE\r\n\t\tstrcpy(tempstr, \"charged bolts on hits\");\r\n#else\r\n\t\tstrcpy(tempstr, \"10% of mana added to armor\");\r\n#endif\r\n\t\tbreak;\r\n\tcase IPL_FIRERESCLVL:\r\n\t\tif (x->_iPLFR <= 0)\r\n\t\t\tsprintf(tempstr, \" \");\r\n\t\telse if (x->_iPLFR >= 1)\r\n\t\t\tsprintf(tempstr, \"Resist Fire : %+i%%\", x->_iPLFR);\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IPL_DEVASTATION:\r\n\t\tstrcpy(tempstr, \"occasional triple damage\");\r\n\t\tbreak;\r\n\tcase IPL_DECAY:\r\n\t\tsprintf(tempstr, \"decaying %+i%% damage\", x->_iPLDam);\r\n\t\tbreak;\r\n\tcase IPL_PERIL:\r\n\t\tstrcpy(tempstr, \"2x dmg to monst, 1x to you\");\r\n\t\tbreak;\r\n\tcase IPL_JESTERS:\r\n\t\tstrcpy(tempstr, \"Random 0 - 500% damage\");\r\n\t\tbreak;\r\n\tcase IPL_CRYSTALLINE:\r\n\t\tsprintf(tempstr, \"low dur, %+i%% damage\", x->_iPLDam);\r\n\t\tbreak;\r\n\tcase IPL_DOPPELGANGER:\r\n\t\tsprintf(tempstr, \"to hit: %+i%%, %+i%% damage\", x->_iPLToHit, x->_iPLDam);\r\n\t\tbreak;\r\n\tcase IPL_ACDEMON:\r\n\t\tsprintf(tempstr, \"extra AC vs demons\");\r\n\t\tbreak;\r\n\tcase IPL_ACUNDEAD:\r\n\t\tsprintf(tempstr, \"extra AC vs undead\");\r\n\t\tbreak;\r\n\tcase IPL_MANATOLIFE:\r\n\t\tsprintf(tempstr, \"50%% Mana moved to Health\");\r\n\t\tbreak;\r\n\tcase IPL_LIFETOMANA:\r\n\t\tsprintf(tempstr, \"40%% Health moved to Mana\");\r\n\t\tbreak;\r\n#endif\r\n\tdefault:\r\n\t\tstrcpy(tempstr, \"Another ability (NW)\");\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid DrawUTextBack()\r\n{\r\n\tCelDraw(PANEL_X + 24, SCREEN_Y + 327, pSTextBoxCels, 1, 271);\r\n\r\n#define TRANS_RECT_X (PANEL_LEFT + 27)\r\n#define TRANS_RECT_Y 28\r\n#define TRANS_RECT_WIDTH 265\r\n#define TRANS_RECT_HEIGHT 297\r\n#include \"asm_trans_rect.inc\"\r\n}\r\n\r\nvoid PrintUString(int x, int y, BOOL cjustflag, const char *str, int col)\r\n{\r\n\tint len, width, off, i, k;\r\n\tBYTE c;\r\n\r\n\toff = x + PitchTbl[SStringY[y] + 44 + SCREEN_Y] + 32 + SCREEN_X;\r\n\tlen = strlen(str);\r\n\tk = 0;\r\n\tif (cjustflag) {\r\n\t\twidth = 0;\r\n\t\tfor (i = 0; i < len; i++)\r\n\t\t\twidth += fontkern[fontframe[gbFontTransTbl[(BYTE)str[i]]]] + 1;\r\n\t\tif (width < 257)\r\n\t\t\tk = (257 - width) >> 1;\r\n\t\toff += k;\r\n\t}\r\n\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tc = fontframe[gbFontTransTbl[(BYTE)str[i]]];\r\n\t\tk += fontkern[c] + 1;\r\n\t\tif (c && k <= 257) {\r\n\t\t\tPrintChar(off, c, col);\r\n\t\t}\r\n\t\toff += fontkern[c] + 1;\r\n\t}\r\n}\r\n\r\nvoid DrawULine(int y)\r\n{\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\tint yy;\r\n\r\n\tyy = PitchTbl[SStringY[y] + 198] + 26 + PANEL_X;\r\n\r\n\t__asm {\r\n\t\tmov\t\tesi, gpBuffer\r\n\t\tmov\t\tedi, esi\r\n\t\tadd\t\tesi, SCREENXY(PANEL_LEFT + 26, 25)\r\n\t\tadd\t\tedi, yy\r\n\t\tmov\t\tebx, BUFFER_WIDTH - 266\r\n\t\tmov\t\tedx, 3\r\n\tcopyline:\r\n\t\tmov\t\tecx, 266 / 4\r\n\t\trep movsd\r\n\t\tmovsw\r\n\t\tadd\t\tesi, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tcopyline\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = &gpBuffer[SCREENXY(PANEL_LEFT + 26, 25)];\r\n\tdst = &gpBuffer[PitchTbl[SStringY[y] + 38 + SCREEN_Y] + 26 + PANEL_X];\r\n\r\n\tfor (i = 0; i < 3; i++, src += BUFFER_WIDTH, dst += BUFFER_WIDTH)\r\n\t\tmemcpy(dst, src, 266); // BUGFIX: should be 267\r\n#endif\r\n}\r\n\r\nvoid DrawUniqueInfo()\r\n{\r\n\tint uid, y;\r\n\r\n\tif (!chrflag && !questlog) {\r\n\t\tuid = curruitem._iUid;\r\n\t\tDrawUTextBack();\r\n\t\tPrintUString(PANEL_LEFT + 0, 2, TRUE, UniqueItemList[uid].UIName, 3);\r\n\t\tDrawULine(5);\r\n\t\tPrintItemPower(UniqueItemList[uid].UIPower1, &curruitem);\r\n\t\ty = 6 - UniqueItemList[uid].UINumPL + 8;\r\n\t\tPrintUString(PANEL_LEFT + 0, y, TRUE, tempstr, 0);\r\n\t\tif (UniqueItemList[uid].UINumPL > 1) {\r\n\t\t\tPrintItemPower(UniqueItemList[uid].UIPower2, &curruitem);\r\n\t\t\tPrintUString(PANEL_LEFT + 0, y + 2, TRUE, tempstr, 0);\r\n\t\t}\r\n\t\tif (UniqueItemList[uid].UINumPL > 2) {\r\n\t\t\tPrintItemPower(UniqueItemList[uid].UIPower3, &curruitem);\r\n\t\t\tPrintUString(PANEL_LEFT + 0, y + 4, TRUE, tempstr, 0);\r\n\t\t}\r\n\t\tif (UniqueItemList[uid].UINumPL > 3) {\r\n\t\t\tPrintItemPower(UniqueItemList[uid].UIPower4, &curruitem);\r\n\t\t\tPrintUString(PANEL_LEFT + 0, y + 6, TRUE, tempstr, 0);\r\n\t\t}\r\n\t\tif (UniqueItemList[uid].UINumPL > 4) {\r\n\t\t\tPrintItemPower(UniqueItemList[uid].UIPower5, &curruitem);\r\n\t\t\tPrintUString(PANEL_LEFT + 0, y + 8, TRUE, tempstr, 0);\r\n\t\t}\r\n\t\tif (UniqueItemList[uid].UINumPL > 5) {\r\n\t\t\tPrintItemPower(UniqueItemList[uid].UIPower6, &curruitem);\r\n\t\t\tPrintUString(PANEL_LEFT + 0, y + 10, TRUE, tempstr, 0);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid PrintItemMisc(ItemStruct *x)\r\n{\r\n\tif (x->_iMiscId == IMISC_SCROLL) {\r\n\t\tstrcpy(tempstr, \"Right-click to read\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iMiscId == IMISC_SCROLLT) {\r\n\t\tstrcpy(tempstr, \"Right-click to read, then\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"left-click to target\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iMiscId >= IMISC_USEFIRST && x->_iMiscId <= IMISC_USELAST) {\r\n\t\tPrintItemOil(x->_iMiscId);\r\n\t\tstrcpy(tempstr, \"Right click to use\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (x->_iMiscId > IMISC_OILFIRST && x->_iMiscId < IMISC_OILLAST) {\r\n\t\tPrintItemOil(x->_iMiscId);\r\n\t\tstrcpy(tempstr, \"Right click to use\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iMiscId > IMISC_RUNEFIRST && x->_iMiscId < IMISC_RUNELAST) {\r\n\t\tPrintItemOil(x->_iMiscId);\r\n\t\tstrcpy(tempstr, \"Right click to use\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n#endif\r\n\tif (x->_iMiscId == IMISC_BOOK) {\r\n\t\tstrcpy(tempstr, \"Right click to read\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (x->_iMiscId == IMISC_NOTE) {\r\n\t\tstrcpy(tempstr, \"Right click to read\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n#endif\r\n\tif (x->_iMiscId == IMISC_MAPOFDOOM) {\r\n\t\tstrcpy(tempstr, \"Right click to view\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iMiscId == IMISC_EAR) {\r\n\t\tsprintf(tempstr, \"Level : %i\", x->_ivalue);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (x->_iMiscId == IMISC_AURIC) {\r\n\t\tsprintf(tempstr, \"Doubles gold capacity\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid PrintItemDetails(ItemStruct *x)\r\n{\r\n\tchar str, dex;\r\n\tBYTE mag;\r\n\r\n\tif (x->_iClass == ICLASS_WEAPON) {\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iMinDam == x->_iMaxDam) {\r\n\t\t\tif (x->_iMaxDur == DUR_INDESTRUCTIBLE)\r\n\t\t\t\tsprintf(tempstr, \"damage: %i  Indestructible\", x->_iMinDam);\r\n\t\t\telse\r\n\t\t\t\tsprintf(tempstr, \"damage: %i  Dur: %i/%i\", x->_iMinDam, x->_iDurability, x->_iMaxDur);\r\n\t\t} else\r\n#endif\r\n\t\t    if (x->_iMaxDur == DUR_INDESTRUCTIBLE)\r\n\t\t\tsprintf(tempstr, \"damage: %i-%i  Indestructible\", x->_iMinDam, x->_iMaxDam);\r\n\t\telse\r\n\t\t\tsprintf(tempstr, \"damage: %i-%i  Dur: %i/%i\", x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iClass == ICLASS_ARMOR) {\r\n\t\tif (x->_iMaxDur == DUR_INDESTRUCTIBLE)\r\n\t\t\tsprintf(tempstr, \"armor: %i  Indestructible\", x->_iAC);\r\n\t\telse\r\n\t\t\tsprintf(tempstr, \"armor: %i  Dur: %i/%i\", x->_iAC, x->_iDurability, x->_iMaxDur);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges) {\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iMinDam == x->_iMaxDam)\r\n\t\t\tsprintf(tempstr, \"dam: %i  Dur: %i/%i\", x->_iMinDam, x->_iDurability, x->_iMaxDur);\r\n\t\telse\r\n#endif\r\n\t\t\tsprintf(tempstr, \"dam: %i-%i  Dur: %i/%i\", x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur);\r\n\t\tsprintf(tempstr, \"Charges: %i/%i\", x->_iCharges, x->_iMaxCharges);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iPrePower != -1) {\r\n\t\tPrintItemPower(x->_iPrePower, x);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iSufPower != -1) {\r\n\t\tPrintItemPower(x->_iSufPower, x);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (x->_iMagical == ITEM_QUALITY_UNIQUE) {\r\n\t\tAddPanelString(\"unique item\", TRUE);\r\n\t\tuitemflag = TRUE;\r\n\t\tcurruitem = *x;\r\n\t}\r\n\tPrintItemMisc(x);\r\n\tmag = x->_iMinMag;\r\n\tdex = x->_iMinDex;\r\n\tstr = x->_iMinStr;\r\n\tif (mag + dex + str) {\r\n\t\tstrcpy(tempstr, \"Required:\");\r\n\t\tif (x->_iMinStr)\r\n\t\t\tsprintf(tempstr, \"%s %i Str\", tempstr, x->_iMinStr);\r\n\t\tif (x->_iMinMag)\r\n\t\t\tsprintf(tempstr, \"%s %i Mag\", tempstr, x->_iMinMag);\r\n\t\tif (x->_iMinDex)\r\n\t\t\tsprintf(tempstr, \"%s %i Dex\", tempstr, x->_iMinDex);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tpinfoflag = TRUE;\r\n}\r\n\r\nvoid PrintItemDur(ItemStruct *x)\r\n{\r\n\tchar str, dex;\r\n\tBYTE mag;\r\n\r\n\tif (x->_iClass == ICLASS_WEAPON) {\r\n#ifdef HELLFIRE\r\n\t\tif (x->_iMinDam == x->_iMaxDam) {\r\n\t\t\tif (x->_iMaxDur == DUR_INDESTRUCTIBLE)\r\n\t\t\t\tsprintf(tempstr, \"damage: %i  Indestructible\", x->_iMinDam);\r\n\t\t\telse\r\n\t\t\t\tsprintf(tempstr, \"damage: %i  Dur: %i/%i\", x->_iMinDam, x->_iDurability, x->_iMaxDur);\r\n\t\t} else\r\n#endif\r\n\t\t    if (x->_iMaxDur == DUR_INDESTRUCTIBLE)\r\n\t\t\tsprintf(tempstr, \"damage: %i-%i  Indestructible\", x->_iMinDam, x->_iMaxDam);\r\n\t\telse\r\n\t\t\tsprintf(tempstr, \"damage: %i-%i  Dur: %i/%i\", x->_iMinDam, x->_iMaxDam, x->_iDurability, x->_iMaxDur);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tif (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges) {\r\n\t\t\tsprintf(tempstr, \"Charges: %i/%i\", x->_iCharges, x->_iMaxCharges);\r\n\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t}\r\n\t\tif (x->_iMagical != ITEM_QUALITY_NORMAL)\r\n\t\t\tAddPanelString(\"Not Identified\", TRUE);\r\n\t}\r\n\tif (x->_iClass == ICLASS_ARMOR) {\r\n\t\tif (x->_iMaxDur == DUR_INDESTRUCTIBLE)\r\n\t\t\tsprintf(tempstr, \"armor: %i  Indestructible\", x->_iAC);\r\n\t\telse\r\n\t\t\tsprintf(tempstr, \"armor: %i  Dur: %i/%i\", x->_iAC, x->_iDurability, x->_iMaxDur);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tif (x->_iMagical != ITEM_QUALITY_NORMAL)\r\n\t\t\tAddPanelString(\"Not Identified\", TRUE);\r\n\t\tif (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges) {\r\n\t\t\tsprintf(tempstr, \"Charges: %i/%i\", x->_iCharges, x->_iMaxCharges);\r\n\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t}\r\n\t}\r\n\tif (x->_itype == ITYPE_RING || x->_itype == ITYPE_AMULET)\r\n\t\tAddPanelString(\"Not Identified\", TRUE);\r\n\tPrintItemMisc(x);\r\n\tstr = x->_iMinStr;\r\n\tmag = x->_iMinMag;\r\n\tdex = x->_iMinDex;\r\n\tif (str + mag + dex) {\r\n\t\tstrcpy(tempstr, \"Required:\");\r\n\t\tif (x->_iMinStr)\r\n\t\t\tsprintf(tempstr, \"%s %i Str\", tempstr, x->_iMinStr);\r\n\t\tif (x->_iMinMag)\r\n\t\t\tsprintf(tempstr, \"%s %i Mag\", tempstr, x->_iMinMag);\r\n\t\tif (x->_iMinDex)\r\n\t\t\tsprintf(tempstr, \"%s %i Dex\", tempstr, x->_iMinDex);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tpinfoflag = TRUE;\r\n}\r\n\r\nvoid UseItem(int p, int Mid, int spl)\r\n{\r\n\tint l, j;\r\n\r\n\tswitch (Mid) {\r\n\tcase IMISC_HEAL:\r\n\tcase IMISC_FOOD:\r\n\t\tj = plr[p]._pMaxHP >> 8;\r\n\t\tl = ((j >> 1) + random_(39, j)) << 6;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[p]._pClass == PC_WARRIOR || plr[p]._pClass == PC_BARBARIAN)\r\n#else\r\n\t\tif (plr[p]._pClass == PC_WARRIOR)\r\n#endif\r\n\t\t\tl <<= 1;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[p]._pClass == PC_ROGUE || plr[p]._pClass == PC_MONK || plr[p]._pClass == PC_BARD)\r\n#else\r\n\t\tif (plr[p]._pClass == PC_ROGUE)\r\n#endif\r\n\t\t\tl += l >> 1;\r\n\t\tplr[p]._pHitPoints += l;\r\n\t\tif (plr[p]._pHitPoints > plr[p]._pMaxHP)\r\n\t\t\tplr[p]._pHitPoints = plr[p]._pMaxHP;\r\n\t\tplr[p]._pHPBase += l;\r\n\t\tif (plr[p]._pHPBase > plr[p]._pMaxHPBase)\r\n\t\t\tplr[p]._pHPBase = plr[p]._pMaxHPBase;\r\n\t\tdrawhpflag = TRUE;\r\n\t\tbreak;\r\n\tcase IMISC_FULLHEAL:\r\n\t\tplr[p]._pHitPoints = plr[p]._pMaxHP;\r\n\t\tplr[p]._pHPBase = plr[p]._pMaxHPBase;\r\n\t\tdrawhpflag = TRUE;\r\n\t\tbreak;\r\n\tcase IMISC_MANA:\r\n\t\tj = plr[p]._pMaxMana >> 8;\r\n\t\tl = ((j >> 1) + random_(40, j)) << 6;\r\n\t\tif (plr[p]._pClass == PC_SORCERER)\r\n\t\t\tl <<= 1;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[p]._pClass == PC_ROGUE || plr[p]._pClass == PC_MONK || plr[p]._pClass == PC_BARD)\r\n#else\r\n\t\tif (plr[p]._pClass == PC_ROGUE)\r\n#endif\r\n\t\t\tl += l >> 1;\r\n\t\tif (!(plr[p]._pIFlags & ISPL_NOMANA)) {\r\n\t\t\tplr[p]._pMana += l;\r\n\t\t\tif (plr[p]._pMana > plr[p]._pMaxMana)\r\n\t\t\t\tplr[p]._pMana = plr[p]._pMaxMana;\r\n\t\t\tplr[p]._pManaBase += l;\r\n\t\t\tif (plr[p]._pManaBase > plr[p]._pMaxManaBase)\r\n\t\t\t\tplr[p]._pManaBase = plr[p]._pMaxManaBase;\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_FULLMANA:\r\n\t\tif (!(plr[p]._pIFlags & ISPL_NOMANA)) {\r\n\t\t\tplr[p]._pMana = plr[p]._pMaxMana;\r\n\t\t\tplr[p]._pManaBase = plr[p]._pMaxManaBase;\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_ELIXSTR:\r\n\t\tModifyPlrStr(p, 1);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXMAG:\r\n\t\tModifyPlrMag(p, 1);\r\n#ifdef HELLFIRE\r\n\t\tplr[p]._pMana = plr[p]._pMaxMana;\r\n\t\tplr[p]._pManaBase = plr[p]._pMaxManaBase;\r\n\t\tdrawmanaflag = TRUE;\r\n#endif\r\n\t\tbreak;\r\n\tcase IMISC_ELIXDEX:\r\n\t\tModifyPlrDex(p, 1);\r\n\t\tbreak;\r\n\tcase IMISC_ELIXVIT:\r\n\t\tModifyPlrVit(p, 1);\r\n#ifdef HELLFIRE\r\n\t\tplr[p]._pHitPoints = plr[p]._pMaxHP;\r\n\t\tplr[p]._pHPBase = plr[p]._pMaxHPBase;\r\n\t\tdrawhpflag = TRUE;\r\n#endif\r\n\t\tbreak;\r\n\tcase IMISC_REJUV:\r\n\t\tj = plr[p]._pMaxHP >> 8;\r\n\t\tl = ((j >> 1) + random_(39, j)) << 6;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[p]._pClass == PC_WARRIOR || plr[p]._pClass == PC_BARBARIAN)\r\n#else\r\n\t\tif (plr[p]._pClass == PC_WARRIOR)\r\n#endif\r\n\t\t\tl <<= 1;\r\n\t\tif (plr[p]._pClass == PC_ROGUE)\r\n\t\t\tl += l >> 1;\r\n\t\tplr[p]._pHitPoints += l;\r\n\t\tif (plr[p]._pHitPoints > plr[p]._pMaxHP)\r\n\t\t\tplr[p]._pHitPoints = plr[p]._pMaxHP;\r\n\t\tplr[p]._pHPBase += l;\r\n\t\tif (plr[p]._pHPBase > plr[p]._pMaxHPBase)\r\n\t\t\tplr[p]._pHPBase = plr[p]._pMaxHPBase;\r\n\t\tdrawhpflag = TRUE;\r\n\t\tj = plr[p]._pMaxMana >> 8;\r\n\t\tl = ((j >> 1) + random_(40, j)) << 6;\r\n\t\tif (plr[p]._pClass == PC_SORCERER)\r\n\t\t\tl <<= 1;\r\n\t\tif (plr[p]._pClass == PC_ROGUE)\r\n\t\t\tl += l >> 1;\r\n\t\tif (!(plr[p]._pIFlags & ISPL_NOMANA)) {\r\n\t\t\tplr[p]._pMana += l;\r\n\t\t\tif (plr[p]._pMana > plr[p]._pMaxMana)\r\n\t\t\t\tplr[p]._pMana = plr[p]._pMaxMana;\r\n\t\t\tplr[p]._pManaBase += l;\r\n\t\t\tif (plr[p]._pManaBase > plr[p]._pMaxManaBase)\r\n\t\t\t\tplr[p]._pManaBase = plr[p]._pMaxManaBase;\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_FULLREJUV:\r\n\t\tplr[p]._pHitPoints = plr[p]._pMaxHP;\r\n\t\tplr[p]._pHPBase = plr[p]._pMaxHPBase;\r\n\t\tdrawhpflag = TRUE;\r\n\t\tif (!(plr[p]._pIFlags & ISPL_NOMANA)) {\r\n\t\t\tplr[p]._pMana = plr[p]._pMaxMana;\r\n\t\t\tplr[p]._pManaBase = plr[p]._pMaxManaBase;\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_SCROLL:\r\n\t\tif (spelldata[spl].sTargeted) {\r\n\t\t\tplr[p]._pTSpell = spl;\r\n\t\t\tplr[p]._pTSplType = RSPLTYPE_INVALID;\r\n\t\t\tif (p == myplr)\r\n\t\t\t\tNewCursor(CURSOR_TELEPORT);\r\n\t\t} else {\r\n\t\t\tClrPlrPath(p);\r\n\t\t\tplr[p]._pSpell = spl;\r\n\t\t\tplr[p]._pSplType = RSPLTYPE_INVALID;\r\n\t\t\tplr[p]._pSplFrom = 3;\r\n\t\t\tplr[p].destAction = ACTION_SPELL;\r\n\t\t\tplr[p].destParam1 = cursmx;\r\n\t\t\tplr[p].destParam2 = cursmy;\r\n#ifndef HELLFIRE\r\n\t\t\tif (p == myplr && spl == SPL_NOVA)\r\n\t\t\t\tNetSendCmdLoc(TRUE, CMD_NOVA, cursmx, cursmy);\r\n#endif\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_SCROLLT:\r\n\t\tif (spelldata[spl].sTargeted) {\r\n\t\t\tplr[p]._pTSpell = spl;\r\n\t\t\tplr[p]._pTSplType = RSPLTYPE_INVALID;\r\n\t\t\tif (p == myplr)\r\n\t\t\t\tNewCursor(CURSOR_TELEPORT);\r\n\t\t} else {\r\n\t\t\tClrPlrPath(p);\r\n\t\t\tplr[p]._pSpell = spl;\r\n\t\t\tplr[p]._pSplType = RSPLTYPE_INVALID;\r\n\t\t\tplr[p]._pSplFrom = 3;\r\n\t\t\tplr[p].destAction = ACTION_SPELL;\r\n\t\t\tplr[p].destParam1 = cursmx;\r\n\t\t\tplr[p].destParam2 = cursmy;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase IMISC_BOOK:\r\n\t\tplr[p]._pMemSpells |= SPELLBIT(spl);\r\n\t\tif (plr[p]._pSplLvl[spl] < MAX_SPELL_LEVEL)\r\n\t\t\tplr[p]._pSplLvl[spl]++;\r\n\t\tplr[p]._pMana += spelldata[spl].sManaCost << 6;\r\n\t\tif (plr[p]._pMana > plr[p]._pMaxMana)\r\n\t\t\tplr[p]._pMana = plr[p]._pMaxMana;\r\n\t\tplr[p]._pManaBase += spelldata[spl].sManaCost << 6;\r\n\t\tif (plr[p]._pManaBase > plr[p]._pMaxManaBase)\r\n\t\t\tplr[p]._pManaBase = plr[p]._pMaxManaBase;\r\n\t\tif (p == myplr)\r\n\t\t\tCalcPlrBookVals(p);\r\n\t\tdrawmanaflag = TRUE;\r\n\t\tbreak;\r\n\tcase IMISC_MAPOFDOOM:\r\n\t\tdoom_init();\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IMISC_OILACC:\r\n\tcase IMISC_OILMAST:\r\n\tcase IMISC_OILSHARP:\r\n\tcase IMISC_OILDEATH:\r\n\tcase IMISC_OILSKILL:\r\n\tcase IMISC_OILBSMTH:\r\n\tcase IMISC_OILFORT:\r\n\tcase IMISC_OILPERM:\r\n\tcase IMISC_OILHARD:\r\n\tcase IMISC_OILIMP:\r\n\t\tplr[p]._pOilType = Mid;\r\n\t\tif (p != myplr) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (sbookflag) {\r\n\t\t\tsbookflag = FALSE;\r\n\t\t}\r\n\t\tif (!invflag) {\r\n\t\t\tinvflag = TRUE;\r\n\t\t}\r\n\t\tNewCursor(CURSOR_OIL);\r\n\t\tbreak;\r\n#endif\r\n\tcase IMISC_SPECELIX:\r\n\t\tModifyPlrStr(p, 3);\r\n\t\tModifyPlrMag(p, 3);\r\n\t\tModifyPlrDex(p, 3);\r\n\t\tModifyPlrVit(p, 3);\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase IMISC_RUNEF:\r\n\t\tplr[p]._pTSpell = SPL_RUNEFIRE;\r\n\t\tplr[p]._pTSplType = RSPLTYPE_INVALID;\r\n\t\tif (p == myplr)\r\n\t\t\tNewCursor(CURSOR_TELEPORT);\r\n\t\tbreak;\r\n\tcase IMISC_RUNEL:\r\n\t\tplr[p]._pTSpell = SPL_RUNELIGHT;\r\n\t\tplr[p]._pTSplType = RSPLTYPE_INVALID;\r\n\t\tif (p == myplr)\r\n\t\t\tNewCursor(CURSOR_TELEPORT);\r\n\t\tbreak;\r\n\tcase IMISC_GR_RUNEL:\r\n\t\tplr[p]._pTSpell = SPL_RUNENOVA;\r\n\t\tplr[p]._pTSplType = RSPLTYPE_INVALID;\r\n\t\tif (p == myplr)\r\n\t\t\tNewCursor(CURSOR_TELEPORT);\r\n\t\tbreak;\r\n\tcase IMISC_GR_RUNEF:\r\n\t\tplr[p]._pTSpell = SPL_RUNEIMMOLAT;\r\n\t\tplr[p]._pTSplType = RSPLTYPE_INVALID;\r\n\t\tif (p == myplr)\r\n\t\t\tNewCursor(CURSOR_TELEPORT);\r\n\t\tbreak;\r\n\tcase IMISC_RUNES:\r\n\t\tplr[p]._pTSpell = SPL_RUNESTONE;\r\n\t\tplr[p]._pTSplType = RSPLTYPE_INVALID;\r\n\t\tif (p == myplr)\r\n\t\t\tNewCursor(CURSOR_TELEPORT);\r\n\t\tbreak;\r\n#endif\r\n\t}\r\n}\r\n\r\nBOOL StoreStatOk(ItemStruct *h)\r\n{\r\n\tBOOL sf;\r\n\r\n\tsf = TRUE;\r\n\tif (plr[myplr]._pStrength < h->_iMinStr)\r\n\t\tsf = FALSE;\r\n\tif (plr[myplr]._pMagic < h->_iMinMag)\r\n\t\tsf = FALSE;\r\n\tif (plr[myplr]._pDexterity < h->_iMinDex)\r\n\t\tsf = FALSE;\r\n\r\n\treturn sf;\r\n}\r\n\r\nBOOL SmithItemOk(int i)\r\n{\r\n\tBOOL rv;\r\n\r\n\trv = TRUE;\r\n\tif (AllItemsList[i].itype == ITYPE_MISC)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].itype == ITYPE_GOLD)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].itype == ITYPE_FOOD)\r\n\t\trv = FALSE;\r\n#ifdef HELLFIRE\r\n\tif (AllItemsList[i].itype == ITYPE_STAFF && AllItemsList[i].iSpell)\r\n#else\r\n\tif (AllItemsList[i].itype == ITYPE_STAFF)\r\n#endif\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].itype == ITYPE_RING)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].itype == ITYPE_AMULET)\r\n\t\trv = FALSE;\r\n\r\n\treturn rv;\r\n}\r\n\r\nint RndSmithItem(int lvl)\r\n{\r\n\tint i, ri;\r\n\tint ril[512];\r\n\r\n\tri = 0;\r\n\tfor (i = 1; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER && SmithItemOk(i) && lvl >= AllItemsList[i].iMinMLvl\r\n#ifdef HELLFIRE\r\n\t\t    && ri < 512\r\n#endif\r\n\t\t) {\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t\tif (AllItemsList[i].iRnd == IDROP_DOUBLE\r\n#ifdef HELLFIRE\r\n\t\t\t    && ri < 512\r\n#endif\r\n\t\t\t) {\r\n\t\t\t\tril[ri] = i;\r\n\t\t\t\tri++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn ril[random_(50, ri)] + 1;\r\n}\r\n\r\nvoid BubbleSwapItem(ItemStruct *a, ItemStruct *b)\r\n{\r\n\tItemStruct h;\r\n\r\n\th = *a;\r\n\t*a = *b;\r\n\t*b = h;\r\n}\r\n\r\nvoid SortSmith()\r\n{\r\n\tint j, k;\r\n\tBOOL sorted;\r\n\r\n\tj = 0;\r\n\twhile (smithitem[j + 1]._itype != ITYPE_NONE) {\r\n\t\tj++;\r\n\t}\r\n\r\n\tsorted = FALSE;\r\n\twhile (j > 0 && !sorted) {\r\n\t\tsorted = TRUE;\r\n\t\tfor (k = 0; k < j; k++) {\r\n\t\t\tif (smithitem[k].IDidx > smithitem[k + 1].IDidx) {\r\n\t\t\t\tBubbleSwapItem(&smithitem[k], &smithitem[k + 1]);\r\n\t\t\t\tsorted = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tj--;\r\n\t}\r\n}\r\n\r\nvoid SpawnSmith(int lvl)\r\n{\r\n\tint i, iCnt, idata;\r\n\r\n#ifdef HELLFIRE\r\n\tItemStruct holditem;\r\n\tholditem = item[0];\r\n#endif\r\n\tiCnt = random_(50, SMITH_ITEMS - 10) + 10;\r\n\tfor (i = 0; i < iCnt; i++) {\r\n\t\tdo {\r\n\t\t\titem[0]._iSeed = GetRndSeed();\r\n\t\t\tSetRndSeed(item[0]._iSeed);\r\n\t\t\tidata = RndSmithItem(lvl) - 1;\r\n\t\t\tGetItemAttrs(0, idata, lvl);\r\n\t\t} while (item[0]._iIvalue > SMITH_MAX_VALUE);\r\n\t\tsmithitem[i] = item[0];\r\n\t\tsmithitem[i]._iCreateInfo = lvl | CF_SMITH;\r\n\t\tsmithitem[i]._iIdentified = TRUE;\r\n\t\tsmithitem[i]._iStatFlag = StoreStatOk(&smithitem[i]);\r\n\t}\r\n\tfor (i = iCnt; i < SMITH_ITEMS; i++)\r\n\t\tsmithitem[i]._itype = ITYPE_NONE;\r\n\r\n\tSortSmith();\r\n#ifdef HELLFIRE\r\n\titem[0] = holditem;\r\n#endif\r\n}\r\n\r\nBOOL PremiumItemOk(int i)\r\n{\r\n\tBOOL rv;\r\n\r\n\trv = TRUE;\r\n#ifdef HELLFIRE\r\n\tif (AllItemsList[i].itype == ITYPE_MISC || AllItemsList[i].itype == ITYPE_GOLD || AllItemsList[i].itype == ITYPE_FOOD)\r\n\t\trv = FALSE;\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tif (AllItemsList[i].iMiscId == IMISC_OILOF || AllItemsList[i].itype == ITYPE_RING || AllItemsList[i].itype == ITYPE_AMULET)\r\n\t\t\trv = FALSE;\r\n\t}\r\n#else\r\n\tif (AllItemsList[i].itype == ITYPE_MISC)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].itype == ITYPE_GOLD)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].itype == ITYPE_FOOD)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].itype == ITYPE_STAFF)\r\n\t\trv = FALSE;\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tif (AllItemsList[i].itype == ITYPE_RING)\r\n\t\t\trv = FALSE;\r\n\t\tif (AllItemsList[i].itype == ITYPE_AMULET)\r\n\t\t\trv = FALSE;\r\n\t}\r\n#endif\r\n\r\n\treturn rv;\r\n}\r\n\r\nint RndPremiumItem(int minlvl, int maxlvl)\r\n{\r\n\tint i, ri;\r\n\tint ril[512];\r\n\r\n\tri = 0;\r\n\tfor (i = 1; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER) {\r\n\t\t\tif (PremiumItemOk(i)) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (AllItemsList[i].iMinMLvl >= minlvl && AllItemsList[i].iMinMLvl <= maxlvl && ri < 512) {\r\n#else\r\n\t\t\t\tif (AllItemsList[i].iMinMLvl >= minlvl && AllItemsList[i].iMinMLvl <= maxlvl) {\r\n#endif\r\n\t\t\t\t\tril[ri] = i;\r\n\t\t\t\t\tri++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn ril[random_(50, ri)] + 1;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic void SpawnOnePremium(int i, int plvl, int myplr, bool noSpells)\r\n#else\r\nstatic void SpawnOnePremium(int i, int plvl)\r\n#endif\r\n{\r\n\tint itype;\r\n\tItemStruct holditem;\r\n\r\n\tholditem = item[0];\r\n\r\n#ifdef HELLFIRE\r\n\tint ivalue;\r\n\tint count = 0;\r\n\r\n\tint strength = get_max_strength(plr[myplr]._pClass);\r\n\tint dexterity = get_max_dexterity(plr[myplr]._pClass);\r\n\tint magic = get_max_magic(plr[myplr]._pClass);\r\n\r\n\tif (strength < plr[myplr]._pStrength) {\r\n\t\tstrength = plr[myplr]._pStrength;\r\n\t}\r\n\tstrength *= 1.2;\r\n\r\n\tif (dexterity < plr[myplr]._pDexterity) {\r\n\t\tdexterity = plr[myplr]._pDexterity;\r\n\t}\r\n\tdexterity *= 1.2;\r\n\r\n\tif (magic < plr[myplr]._pMagic) {\r\n\t\tmagic = plr[myplr]._pMagic;\r\n\t}\r\n\tmagic *= 1.2;\r\n#endif\r\n\r\n\tif (plvl > 30)\r\n\t\tplvl = 30;\r\n\tif (plvl < 1)\r\n\t\tplvl = 1;\r\n\tdo {\r\n\t\titem[0]._iSeed = GetRndSeed();\r\n\t\tSetRndSeed(item[0]._iSeed);\r\n\t\titype = RndPremiumItem(plvl >> 2, plvl) - 1;\r\n\t\tGetItemAttrs(0, itype, plvl);\r\n#ifdef HELLFIRE\r\n\t\tGetItemBonus(0, itype, plvl >> 1, plvl, TRUE, noSpells);\r\n#else\r\n\t\tGetItemBonus(0, itype, plvl >> 1, plvl, TRUE);\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n\t\tivalue = 0;\r\n\t\tswitch (item[0]._itype) {\r\n\t\tcase ITYPE_LARMOR:\r\n\t\tcase ITYPE_MARMOR:\r\n\t\tcase ITYPE_HARMOR:\r\n\t\t\tivalue = get_armor_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_SHIELD:\r\n\t\t\tivalue = get_shield_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_AXE:\r\n\t\t\tivalue = get_axe_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_BOW:\r\n\t\t\tivalue = get_bow_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_MACE:\r\n\t\t\tivalue = get_mace_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_SWORD:\r\n\t\t\tivalue = get_sword_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_HELM:\r\n\t\t\tivalue = get_helm_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_STAFF:\r\n\t\t\tivalue = get_staff_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_RING:\r\n\t\t\tivalue = get_ring_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\tcase ITYPE_AMULET:\r\n\t\t\tivalue = get_amulet_max_value(myplr);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tivalue *= 0.8;\r\n\r\n\t\tcount++;\r\n\t} while ((item[0]._iIvalue > SMITH_MAX_PREMIUM_VALUE\r\n\t             || item[0]._iMinStr > strength\r\n\t             || item[0]._iMinMag > magic\r\n\t             || item[0]._iMinDex > dexterity\r\n\t             || item[0]._iIvalue < ivalue)\r\n\t    && count < 150);\r\n#else\r\n\t} while (item[0]._iIvalue > SMITH_MAX_PREMIUM_VALUE);\r\n#endif\r\n\tpremiumitem[i] = item[0];\r\n\tpremiumitem[i]._iCreateInfo = plvl | CF_SMITHPREMIUM;\r\n\tpremiumitem[i]._iIdentified = TRUE;\r\n\tpremiumitem[i]._iStatFlag = StoreStatOk(&premiumitem[i]);\r\n\titem[0] = holditem;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid SpawnPremium(int pnum)\r\n#else\r\nvoid SpawnPremium(int lvl)\r\n#endif\r\n{\r\n\tint i;\r\n\r\n#ifdef HELLFIRE\r\n\tint lvl = plr[pnum]._pLevel;\r\n#endif\r\n\tif (numpremium < SMITH_PREMIUM_ITEMS) {\r\n\t\tfor (i = 0; i < SMITH_PREMIUM_ITEMS; i++) {\r\n\t\t\tif (premiumitem[i]._itype == ITYPE_NONE)\r\n#ifdef HELLFIRE\r\n\t\t\t\tSpawnOnePremium(i, premiumlevel + premiumlvladd[i], pnum, FALSE);\r\n#else\r\n\t\t\t\tSpawnOnePremium(i, premiumlevel + premiumlvladd[i]);\r\n#endif\r\n\t\t}\r\n\t\tnumpremium = SMITH_PREMIUM_ITEMS;\r\n\t}\r\n\twhile (premiumlevel < lvl) {\r\n\t\tpremiumlevel++;\r\n#ifdef HELLFIRE\r\n\t\tpremiumitem[0] = premiumitem[3];\r\n\t\tpremiumitem[1] = premiumitem[4];\r\n\t\tpremiumitem[2] = premiumitem[5];\r\n\t\tpremiumitem[3] = premiumitem[6];\r\n\t\tpremiumitem[4] = premiumitem[7];\r\n\t\tpremiumitem[5] = premiumitem[8];\r\n\t\tpremiumitem[6] = premiumitem[9];\r\n\t\tpremiumitem[7] = premiumitem[10];\r\n\t\tpremiumitem[8] = premiumitem[11];\r\n\t\tpremiumitem[9] = premiumitem[12];\r\n\t\tSpawnOnePremium(10, premiumlevel + premiumlvladd[10], pnum, FALSE);\r\n\t\tpremiumitem[11] = premiumitem[13];\r\n\t\tSpawnOnePremium(12, premiumlevel + premiumlvladd[12], pnum, FALSE);\r\n\t\tpremiumitem[13] = premiumitem[14];\r\n\t\tSpawnOnePremium(14, premiumlevel + premiumlvladd[14], pnum, FALSE);\r\n#else\r\n\t\tpremiumitem[0] = premiumitem[2];\r\n\t\tpremiumitem[1] = premiumitem[3];\r\n\t\tpremiumitem[2] = premiumitem[4];\r\n\t\tSpawnOnePremium(3, premiumlevel + premiumlvladd[3]);\r\n\t\tpremiumitem[4] = premiumitem[5];\r\n\t\tSpawnOnePremium(5, premiumlevel + premiumlvladd[5]);\r\n#endif\r\n\t}\r\n}\r\n\r\nBOOL WitchItemOk(int i)\r\n{\r\n\tBOOL rv;\r\n\r\n\trv = FALSE;\r\n#ifdef HELLFIRE\r\n\tif (AllItemsList[i].itype == ITYPE_MISC || AllItemsList[i].itype == ITYPE_STAFF)\r\n\t\trv = TRUE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_MANA || AllItemsList[i].iMiscId == IMISC_FULLMANA)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iSpell == SPL_TOWN)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLHEAL || AllItemsList[i].iMiscId == IMISC_HEAL)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iMiscId > IMISC_OILFIRST && AllItemsList[i].iMiscId < IMISC_OILLAST)\r\n\t\trv = FALSE;\r\n\tif ((AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1) || (AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1))\r\n\t\trv = FALSE;\r\n#else\r\n\tif (AllItemsList[i].itype == ITYPE_MISC)\r\n\t\trv = TRUE;\r\n\tif (AllItemsList[i].itype == ITYPE_STAFF)\r\n\t\trv = TRUE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_MANA)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLMANA)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iSpell == SPL_TOWN)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLHEAL)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_HEAL)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers == 1)\r\n\t\trv = FALSE;\r\n\tif (AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers == 1)\r\n\t\trv = FALSE;\r\n#endif\r\n\r\n\treturn rv;\r\n}\r\n\r\nint RndWitchItem(int lvl)\r\n{\r\n\tint i, ri;\r\n\tint ril[512];\r\n\r\n\tri = 0;\r\n\tfor (i = 1; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER && WitchItemOk(i) && lvl >= AllItemsList[i].iMinMLvl\r\n#ifdef HELLFIRE\r\n\t\t    && ri < 512\r\n#endif\r\n\t\t) {\r\n\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn ril[random_(51, ri)] + 1;\r\n}\r\n\r\nvoid SortWitch()\r\n{\r\n\tint j, k;\r\n\tBOOL sorted;\r\n\r\n\tj = 3;\r\n\twhile (witchitem[j + 1]._itype != ITYPE_NONE) {\r\n\t\tj++;\r\n\t}\r\n\r\n\tsorted = FALSE;\r\n\twhile (j > 3 && !sorted) {\r\n\t\tsorted = TRUE;\r\n\t\tfor (k = 3; k < j; k++) {\r\n\t\t\tif (witchitem[k].IDidx > witchitem[k + 1].IDidx) {\r\n\t\t\t\tBubbleSwapItem(&witchitem[k], &witchitem[k + 1]);\r\n\t\t\t\tsorted = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tj--;\r\n\t}\r\n}\r\n\r\nvoid WitchBookLevel(int ii)\r\n{\r\n\tint slvl;\r\n\r\n\tif (witchitem[ii]._iMiscId == IMISC_BOOK) {\r\n\t\twitchitem[ii]._iMinMag = spelldata[witchitem[ii]._iSpell].sMinInt;\r\n\t\tslvl = plr[myplr]._pSplLvl[witchitem[ii]._iSpell];\r\n\t\twhile (slvl) {\r\n\t\t\twitchitem[ii]._iMinMag += 20 * witchitem[ii]._iMinMag / 100;\r\n\t\t\tslvl--;\r\n\t\t\tif (witchitem[ii]._iMinMag + 20 * witchitem[ii]._iMinMag / 100 > 255) {\r\n\t\t\t\twitchitem[ii]._iMinMag = 255;\r\n\t\t\t\tslvl = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SpawnWitch(int lvl)\r\n{\r\n\tint i, j, iCnt;\r\n\tint idata, maxlvl;\r\n\r\n\tj = 3;\r\n#ifdef HELLFIRE\r\n\tiCnt = random_(51, WITCH_ITEMS - 10) + 10;\r\n\tint books = random_(3, 4);\r\n#endif\r\n\r\n\tGetItemAttrs(0, IDI_MANA, 1);\r\n\twitchitem[0] = item[0];\r\n\twitchitem[0]._iCreateInfo = lvl;\r\n\twitchitem[0]._iStatFlag = TRUE;\r\n\tGetItemAttrs(0, IDI_FULLMANA, 1);\r\n\twitchitem[1] = item[0];\r\n\twitchitem[1]._iCreateInfo = lvl;\r\n\twitchitem[1]._iStatFlag = TRUE;\r\n\tGetItemAttrs(0, IDI_PORTAL, 1);\r\n\twitchitem[2] = item[0];\r\n\twitchitem[2]._iCreateInfo = lvl;\r\n\twitchitem[2]._iStatFlag = TRUE;\r\n\r\n#ifdef HELLFIRE\r\n\tint bCnt;\r\n\tfor (i = 114, bCnt = 0; i <= 117 && bCnt < books; ++i) {\r\n\t\tif (WitchItemOk(i)\r\n\t\t    && lvl >= AllItemsList[i].iMinMLvl) {\r\n\t\t\titem[0]._iSeed = GetRndSeed();\r\n\t\t\tSetRndSeed(item[0]._iSeed);\r\n\t\t\tvolatile int junk = random_(0, 1);\r\n\r\n\t\t\tGetItemAttrs(0, i, lvl);\r\n\t\t\twitchitem[j] = item[0];\r\n\t\t\twitchitem[j]._iCreateInfo = lvl | CF_WITCH;\r\n\t\t\twitchitem[j]._iIdentified = TRUE;\r\n\t\t\tWitchBookLevel(j);\r\n\t\t\twitchitem[j]._iStatFlag = StoreStatOk(&witchitem[j]);\r\n\t\t\tj++;\r\n\t\t\tbCnt++;\r\n\t\t}\r\n\t}\r\n#else\r\n\tiCnt = random_(51, 8) + 10;\r\n#endif\r\n\r\n\tfor (i = j; i < iCnt; i++) {\r\n\t\tdo {\r\n\t\t\titem[0]._iSeed = GetRndSeed();\r\n\t\t\tSetRndSeed(item[0]._iSeed);\r\n\t\t\tidata = RndWitchItem(lvl) - 1;\r\n\t\t\tGetItemAttrs(0, idata, lvl);\r\n\t\t\tmaxlvl = -1;\r\n\t\t\tif (random_(51, 100) <= 5)\r\n\t\t\t\tmaxlvl = 2 * lvl;\r\n\t\t\tif (maxlvl == -1 && item[0]._iMiscId == IMISC_STAFF)\r\n\t\t\t\tmaxlvl = 2 * lvl;\r\n\t\t\tif (maxlvl != -1)\r\n#ifdef HELLFIRE\r\n\t\t\t\tGetItemBonus(0, idata, maxlvl >> 1, maxlvl, TRUE, TRUE);\r\n#else\r\n\t\t\t\tGetItemBonus(0, idata, maxlvl >> 1, maxlvl, TRUE);\r\n#endif\r\n\t\t} while (item[0]._iIvalue > WITCH_MAX_VALUE);\r\n\t\twitchitem[i] = item[0];\r\n\t\twitchitem[i]._iCreateInfo = lvl | CF_WITCH;\r\n\t\twitchitem[i]._iIdentified = TRUE;\r\n\t\tWitchBookLevel(i);\r\n\t\twitchitem[i]._iStatFlag = StoreStatOk(&witchitem[i]);\r\n\t}\r\n\r\n\tfor (i = iCnt; i < WITCH_ITEMS; i++)\r\n\t\twitchitem[i]._itype = ITYPE_NONE;\r\n\r\n\tSortWitch();\r\n}\r\n\r\nint RndBoyItem(int lvl)\r\n{\r\n\tint i, ri;\r\n\tint ril[512];\r\n\r\n\tri = 0;\r\n\tfor (i = 1; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER && PremiumItemOk(i) && lvl >= AllItemsList[i].iMinMLvl\r\n#ifdef HELLFIRE\r\n\t\t    && ri < 512\r\n#endif\r\n\t\t) {\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn ril[random_(49, ri)] + 1;\r\n}\r\n\r\nvoid SpawnBoy(int lvl)\r\n{\r\n\tint itype;\r\n\r\n#ifdef HELLFIRE\r\n\tint ivalue;\r\n\tint count = 0;\r\n\r\n\tint strength = get_max_strength(plr[myplr]._pClass);\r\n\tint dexterity = get_max_dexterity(plr[myplr]._pClass);\r\n\tint magic = get_max_magic(plr[myplr]._pClass);\r\n\tint pc = plr[myplr]._pClass;\r\n\r\n\tif (strength < plr[myplr]._pStrength) {\r\n\t\tstrength = plr[myplr]._pStrength;\r\n\t}\r\n\tstrength *= 1.2;\r\n\r\n\tif (dexterity < plr[myplr]._pDexterity) {\r\n\t\tdexterity = plr[myplr]._pDexterity;\r\n\t}\r\n\tdexterity *= 1.2;\r\n\r\n\tif (magic < plr[myplr]._pMagic) {\r\n\t\tmagic = plr[myplr]._pMagic;\r\n\t}\r\n\tmagic *= 1.2;\r\n#endif\r\n\r\n\tif (boylevel < (lvl >> 1) || boyitem._itype == ITYPE_NONE) {\r\n\t\tdo {\r\n\t\t\titem[0]._iSeed = GetRndSeed();\r\n\t\t\tSetRndSeed(item[0]._iSeed);\r\n\t\t\titype = RndBoyItem(lvl) - 1;\r\n\t\t\tGetItemAttrs(0, itype, lvl);\r\n#ifdef HELLFIRE\r\n\t\t\tGetItemBonus(0, itype, lvl, 2 * lvl, TRUE, TRUE);\r\n\r\n\t\t\tivalue = 0;\r\n\r\n\t\t\tint itemType = item[0]._itype;\r\n\r\n\t\t\tswitch (itemType) {\r\n\t\t\tcase ITYPE_LARMOR:\r\n\t\t\tcase ITYPE_MARMOR:\r\n\t\t\tcase ITYPE_HARMOR:\r\n\t\t\t\tivalue = get_armor_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_SHIELD:\r\n\t\t\t\tivalue = get_shield_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_AXE:\r\n\t\t\t\tivalue = get_axe_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_BOW:\r\n\t\t\t\tivalue = get_bow_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_MACE:\r\n\t\t\t\tivalue = get_mace_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_SWORD:\r\n\t\t\t\tivalue = get_sword_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_HELM:\r\n\t\t\t\tivalue = get_helm_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_STAFF:\r\n\t\t\t\tivalue = get_staff_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_RING:\r\n\t\t\t\tivalue = get_ring_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_AMULET:\r\n\t\t\t\tivalue = get_amulet_max_value(myplr);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tivalue *= 0.8;\r\n\r\n\t\t\tcount++;\r\n\r\n\t\t\tif (count < 200) {\r\n\t\t\t\tswitch (pc) {\r\n\t\t\t\tcase PC_WARRIOR:\r\n\t\t\t\t\tif (itemType == ITYPE_BOW || itemType == ITYPE_STAFF)\r\n\t\t\t\t\t\tivalue = INT_MAX;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PC_ROGUE:\r\n\t\t\t\t\tif (itemType == ITYPE_SWORD || itemType == ITYPE_STAFF || itemType == ITYPE_AXE || itemType == ITYPE_MACE || itemType == ITYPE_SHIELD)\r\n\t\t\t\t\t\tivalue = INT_MAX;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PC_SORCERER:\r\n\t\t\t\t\tif (itemType == ITYPE_STAFF || itemType == ITYPE_AXE || itemType == ITYPE_BOW || itemType == ITYPE_MACE)\r\n\t\t\t\t\t\tivalue = INT_MAX;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PC_MONK:\r\n\t\t\t\t\tif (itemType == ITYPE_BOW || itemType == ITYPE_MARMOR || itemType == ITYPE_SHIELD || itemType == ITYPE_MACE)\r\n\t\t\t\t\t\tivalue = INT_MAX;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PC_BARD:\r\n\t\t\t\t\tif (itemType == ITYPE_AXE || itemType == ITYPE_MACE || itemType == ITYPE_STAFF)\r\n\t\t\t\t\t\tivalue = INT_MAX;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PC_BARBARIAN:\r\n\t\t\t\t\tif (itemType == ITYPE_BOW || itemType == ITYPE_STAFF)\r\n\t\t\t\t\t\tivalue = INT_MAX;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while ((item[0]._iIvalue > BOY_MAX_VALUE\r\n\t\t             || item[0]._iMinStr > strength\r\n\t\t             || item[0]._iMinMag > magic\r\n\t\t             || item[0]._iMinDex > dexterity\r\n\t\t             || item[0]._iIvalue < ivalue)\r\n\t\t    && count < 250);\r\n#else\r\n\t\t\tGetItemBonus(0, itype, lvl, 2 * lvl, TRUE);\r\n\t\t} while (item[0]._iIvalue > BOY_MAX_VALUE);\r\n#endif\r\n\t\tboyitem = item[0];\r\n\t\tboyitem._iCreateInfo = lvl | CF_BOY;\r\n\t\tboyitem._iIdentified = TRUE;\r\n\t\tboyitem._iStatFlag = StoreStatOk(&boyitem);\r\n\t\tboylevel = lvl >> 1;\r\n\t}\r\n}\r\n\r\nBOOL HealerItemOk(int i)\r\n{\r\n\tBOOL result;\r\n\r\n\tresult = FALSE;\r\n\tif (AllItemsList[i].itype != ITYPE_MISC)\r\n\t\treturn FALSE;\r\n\r\n\tif (AllItemsList[i].iMiscId == IMISC_SCROLL && AllItemsList[i].iSpell == SPL_HEAL)\r\n\t\tresult = TRUE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_SCROLLT && AllItemsList[i].iSpell == SPL_RESURRECT && gbMaxPlayers != 1)\r\n\t\tresult = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_SCROLLT && AllItemsList[i].iSpell == SPL_HEALOTHER && gbMaxPlayers != 1)\r\n\t\tresult = TRUE;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n#ifdef HELLFIRE\r\n\t\tif (AllItemsList[i].iMiscId == IMISC_ELIXSTR && plr[myplr]._pBaseStr < MaxStats[plr[myplr]._pClass][ATTRIB_STR])\r\n\t\t\tresult = TRUE;\r\n\t\telse if (AllItemsList[i].iMiscId == IMISC_ELIXMAG && plr[myplr]._pBaseMag < MaxStats[plr[myplr]._pClass][ATTRIB_MAG])\r\n\t\t\tresult = TRUE;\r\n\t\telse if (AllItemsList[i].iMiscId == IMISC_ELIXDEX && plr[myplr]._pBaseDex < MaxStats[plr[myplr]._pClass][ATTRIB_DEX])\r\n\t\t\tresult = TRUE;\r\n\t\telse if (AllItemsList[i].iMiscId == IMISC_ELIXVIT && plr[myplr]._pBaseVit < MaxStats[plr[myplr]._pClass][ATTRIB_VIT])\r\n\t\t\tresult = TRUE;\r\n\t}\r\n\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLHEAL) // BUGFIX this is a duplicate with the wrong case\r\n\t\tresult = TRUE;\r\n\r\n\telse if (AllItemsList[i].iMiscId == IMISC_REJUV)\r\n\t\tresult = TRUE;\r\n\telse if (AllItemsList[i].iMiscId == IMISC_FULLREJUV)\r\n\t\tresult = TRUE;\r\n\telse if (AllItemsList[i].iMiscId == IMISC_HEAL)\r\n\t\tresult = FALSE;\r\n\telse if (AllItemsList[i].iMiscId == IMISC_FULLHEAL)\r\n\t\tresult = FALSE;\r\n\telse if (AllItemsList[i].iMiscId == IMISC_MANA)\r\n\t\tresult = FALSE;\r\n\telse if (AllItemsList[i].iMiscId == IMISC_FULLMANA)\r\n\t\tresult = FALSE;\r\n#else\r\n\t\tif (AllItemsList[i].iMiscId == IMISC_ELIXSTR)\r\n\t\t\tresult = TRUE;\r\n\t\tif (AllItemsList[i].iMiscId == IMISC_ELIXMAG)\r\n\t\t\tresult = TRUE;\r\n\t\tif (AllItemsList[i].iMiscId == IMISC_ELIXDEX)\r\n\t\t\tresult = TRUE;\r\n\t\tif (AllItemsList[i].iMiscId == IMISC_ELIXVIT)\r\n\t\t\tresult = TRUE;\r\n\t}\r\n\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLHEAL) // BUGFIX this is a duplicate with the wrong case\r\n\t\tresult = TRUE;\r\n\r\n\tif (AllItemsList[i].iMiscId == IMISC_REJUV)\r\n\t\tresult = TRUE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLREJUV)\r\n\t\tresult = TRUE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_HEAL)\r\n\t\tresult = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLHEAL)\r\n\t\tresult = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_MANA)\r\n\t\tresult = FALSE;\r\n\tif (AllItemsList[i].iMiscId == IMISC_FULLMANA)\r\n\t\tresult = FALSE;\r\n#endif\r\n\r\n\treturn result;\r\n}\r\n\r\nint RndHealerItem(int lvl)\r\n{\r\n\tint i, ri;\r\n\tint ril[512];\r\n\r\n\tri = 0;\r\n\tfor (i = 1; AllItemsList[i].iLoc != ILOC_INVALID; i++) {\r\n\t\tif (AllItemsList[i].iRnd != IDROP_NEVER && HealerItemOk(i) && lvl >= AllItemsList[i].iMinMLvl\r\n#ifdef HELLFIRE\r\n\t\t    && ri < 512\r\n#endif\r\n\t\t) {\r\n\t\t\tril[ri] = i;\r\n\t\t\tri++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn ril[random_(50, ri)] + 1;\r\n}\r\n\r\nvoid SortHealer()\r\n{\r\n\tint j, k;\r\n\tBOOL sorted;\r\n\r\n\tj = 2;\r\n\twhile (healitem[j + 1]._itype != ITYPE_NONE) {\r\n\t\tj++;\r\n\t}\r\n\r\n\tsorted = FALSE;\r\n\twhile (j > 2 && !sorted) {\r\n\t\tsorted = TRUE;\r\n\t\tfor (k = 2; k < j; k++) {\r\n\t\t\tif (healitem[k].IDidx > healitem[k + 1].IDidx) {\r\n\t\t\t\tBubbleSwapItem(&healitem[k], &healitem[k + 1]);\r\n\t\t\t\tsorted = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tj--;\r\n\t}\r\n}\r\n\r\nvoid SpawnHealer(int lvl)\r\n{\r\n\tint i, nsi, srnd, itype;\r\n\r\n\tGetItemAttrs(0, IDI_HEAL, 1);\r\n\thealitem[0] = item[0];\r\n\thealitem[0]._iCreateInfo = lvl;\r\n\thealitem[0]._iStatFlag = TRUE;\r\n\r\n\tGetItemAttrs(0, IDI_FULLHEAL, 1);\r\n\thealitem[1] = item[0];\r\n\thealitem[1]._iCreateInfo = lvl;\r\n\thealitem[1]._iStatFlag = TRUE;\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tGetItemAttrs(0, IDI_RESURRECT, 1);\r\n\t\thealitem[2] = item[0];\r\n\t\thealitem[2]._iCreateInfo = lvl;\r\n\t\thealitem[2]._iStatFlag = TRUE;\r\n\r\n\t\tsrnd = 3;\r\n\t} else {\r\n\t\tsrnd = 2;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tnsi = random_(50, 10) + 10;\r\n#else\r\n\tnsi = random_(50, 8) + 10;\r\n#endif\r\n\tfor (i = srnd; i < nsi; i++) {\r\n\t\titem[0]._iSeed = GetRndSeed();\r\n\t\tSetRndSeed(item[0]._iSeed);\r\n\t\titype = RndHealerItem(lvl) - 1;\r\n\t\tGetItemAttrs(0, itype, lvl);\r\n\t\thealitem[i] = item[0];\r\n\t\thealitem[i]._iCreateInfo = lvl | CF_HEALER;\r\n\t\thealitem[i]._iIdentified = TRUE;\r\n\t\thealitem[i]._iStatFlag = StoreStatOk(&healitem[i]);\r\n\t}\r\n\tfor (i = nsi; i < 20; i++) {\r\n\t\thealitem[i]._itype = ITYPE_NONE;\r\n\t}\r\n\tSortHealer();\r\n}\r\n\r\nvoid SpawnStoreGold()\r\n{\r\n\tGetItemAttrs(0, IDI_GOLD, 1);\r\n\tgolditem = item[0];\r\n\tgolditem._iStatFlag = TRUE;\r\n}\r\n\r\nvoid RecreateSmithItem(int ii, int idx, int lvl, int iseed)\r\n{\r\n\tint itype;\r\n\r\n\tSetRndSeed(iseed);\r\n\titype = RndSmithItem(lvl) - 1;\r\n\tGetItemAttrs(ii, itype, lvl);\r\n\r\n\titem[ii]._iSeed = iseed;\r\n\titem[ii]._iCreateInfo = lvl | CF_SMITH;\r\n\titem[ii]._iIdentified = TRUE;\r\n}\r\n\r\nvoid RecreatePremiumItem(int ii, int idx, int plvl, int iseed)\r\n{\r\n\tint itype;\r\n\r\n\tSetRndSeed(iseed);\r\n\titype = RndPremiumItem(plvl >> 2, plvl) - 1;\r\n\tGetItemAttrs(ii, itype, plvl);\r\n#ifdef HELLFIRE\r\n\tGetItemBonus(ii, itype, plvl >> 1, plvl, TRUE, FALSE);\r\n#else\r\n\tGetItemBonus(ii, itype, plvl >> 1, plvl, TRUE);\r\n#endif\r\n\r\n\titem[ii]._iSeed = iseed;\r\n\titem[ii]._iCreateInfo = plvl | CF_SMITHPREMIUM;\r\n\titem[ii]._iIdentified = TRUE;\r\n}\r\n\r\nvoid RecreateBoyItem(int ii, int idx, int lvl, int iseed)\r\n{\r\n\tint itype;\r\n\r\n\tSetRndSeed(iseed);\r\n\titype = RndBoyItem(lvl) - 1;\r\n\tGetItemAttrs(ii, itype, lvl);\r\n#ifdef HELLFIRE\r\n\tGetItemBonus(ii, itype, lvl, 2 * lvl, TRUE, TRUE);\r\n#else\r\n\tGetItemBonus(ii, itype, lvl, 2 * lvl, TRUE);\r\n#endif\r\n\titem[ii]._iSeed = iseed;\r\n\titem[ii]._iCreateInfo = lvl | CF_BOY;\r\n\titem[ii]._iIdentified = TRUE;\r\n}\r\n\r\nvoid RecreateWitchItem(int ii, int idx, int lvl, int iseed)\r\n{\r\n\tint iblvl, itype;\r\n\r\n\tif (idx == IDI_MANA || idx == IDI_FULLMANA || idx == IDI_PORTAL) {\r\n\t\tGetItemAttrs(ii, idx, lvl);\r\n\t} else {\r\n#ifdef HELLFIRE\r\n\t\tif (idx >= 114 && idx <= 117) {\r\n\t\t\tSetRndSeed(iseed);\r\n\t\t\tvolatile int hi_predelnik = random_(0, 1);\r\n\t\t\tiblvl = lvl;\r\n\t\t\tGetItemAttrs(ii, idx, iblvl);\r\n\t\t} else {\r\n#endif\r\n\t\t\tSetRndSeed(iseed);\r\n\t\t\titype = RndWitchItem(lvl) - 1;\r\n\t\t\tGetItemAttrs(ii, itype, lvl);\r\n\t\t\tiblvl = -1;\r\n\t\t\tif (random_(51, 100) <= 5)\r\n\t\t\t\tiblvl = 2 * lvl;\r\n\t\t\tif (iblvl == -1 && item[ii]._iMiscId == IMISC_STAFF)\r\n\t\t\t\tiblvl = 2 * lvl;\r\n\t\t\tif (iblvl != -1)\r\n#ifdef HELLFIRE\r\n\t\t\t\tGetItemBonus(ii, itype, iblvl >> 1, iblvl, TRUE, TRUE);\r\n\t\t}\r\n#else\r\n\t\t\tGetItemBonus(ii, itype, iblvl >> 1, iblvl, TRUE);\r\n#endif\r\n\t}\r\n\r\n\titem[ii]._iSeed = iseed;\r\n\titem[ii]._iCreateInfo = lvl | CF_WITCH;\r\n\titem[ii]._iIdentified = TRUE;\r\n}\r\n\r\nvoid RecreateHealerItem(int ii, int idx, int lvl, int iseed)\r\n{\r\n\tint itype;\r\n\r\n\tif (idx == IDI_HEAL || idx == IDI_FULLHEAL || idx == IDI_RESURRECT) {\r\n\t\tGetItemAttrs(ii, idx, lvl);\r\n\t} else {\r\n\t\tSetRndSeed(iseed);\r\n\t\titype = RndHealerItem(lvl) - 1;\r\n\t\tGetItemAttrs(ii, itype, lvl);\r\n\t}\r\n\r\n\titem[ii]._iSeed = iseed;\r\n\titem[ii]._iCreateInfo = lvl | CF_HEALER;\r\n\titem[ii]._iIdentified = TRUE;\r\n}\r\n\r\nvoid RecreateTownItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue)\r\n{\r\n\tif (icreateinfo & CF_SMITH)\r\n\t\tRecreateSmithItem(ii, idx, icreateinfo & CF_LEVEL, iseed);\r\n\telse if (icreateinfo & CF_SMITHPREMIUM)\r\n\t\tRecreatePremiumItem(ii, idx, icreateinfo & CF_LEVEL, iseed);\r\n\telse if (icreateinfo & CF_BOY)\r\n\t\tRecreateBoyItem(ii, idx, icreateinfo & CF_LEVEL, iseed);\r\n\telse if (icreateinfo & CF_WITCH)\r\n\t\tRecreateWitchItem(ii, idx, icreateinfo & CF_LEVEL, iseed);\r\n\telse if (icreateinfo & CF_HEALER)\r\n\t\tRecreateHealerItem(ii, idx, icreateinfo & CF_LEVEL, iseed);\r\n}\r\n\r\nvoid RecalcStoreStats()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < SMITH_ITEMS; i++) {\r\n\t\tif (smithitem[i]._itype != ITYPE_NONE) {\r\n\t\t\tsmithitem[i]._iStatFlag = StoreStatOk(&smithitem[i]);\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < SMITH_PREMIUM_ITEMS; i++) {\r\n\t\tif (premiumitem[i]._itype != ITYPE_NONE) {\r\n\t\t\tpremiumitem[i]._iStatFlag = StoreStatOk(&premiumitem[i]);\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < 20; i++) {\r\n\t\tif (witchitem[i]._itype != ITYPE_NONE) {\r\n\t\t\twitchitem[i]._iStatFlag = StoreStatOk(&witchitem[i]);\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < 20; i++) {\r\n\t\tif (healitem[i]._itype != ITYPE_NONE) {\r\n\t\t\thealitem[i]._iStatFlag = StoreStatOk(&healitem[i]);\r\n\t\t}\r\n\t}\r\n\tboyitem._iStatFlag = StoreStatOk(&boyitem);\r\n}\r\n\r\nint ItemNoFlippy()\r\n{\r\n\tint r;\r\n\r\n\tr = itemactive[numitems - 1];\r\n\titem[r]._iAnimFrame = item[r]._iAnimLen;\r\n\titem[r]._iAnimFlag = FALSE;\r\n\titem[r]._iSelFlag = 1;\r\n\r\n\treturn r;\r\n}\r\n\r\nvoid CreateSpellBook(int x, int y, int ispell, BOOL sendmsg, BOOL delta)\r\n{\r\n\tint ii, idx;\r\n\tBOOL done;\r\n\r\n\tdone = FALSE;\r\n#ifdef HELLFIRE\r\n\tint lvl = spelldata[ispell].sBookLvl + 1;\r\n\tif (lvl < 1) {\r\n\t\treturn;\r\n\t}\r\n\tidx = RndTypeItems(ITYPE_MISC, IMISC_BOOK, lvl);\r\n#else\r\n\tidx = RndTypeItems(ITYPE_MISC, IMISC_BOOK);\r\n#endif\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n\t\twhile (!done) {\r\n#ifdef HELLFIRE\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * lvl, 1, TRUE, FALSE, delta);\r\n#else\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, TRUE, FALSE, delta);\r\n#endif\r\n\t\t\tif (item[ii]._iMiscId == IMISC_BOOK && item[ii]._iSpell == ispell)\r\n\t\t\t\tdone = TRUE;\r\n\t\t}\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t\tif (delta)\r\n\t\t\tDeltaAddItem(ii);\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\nvoid CreateMagicArmor(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta)\r\n{\r\n\tint ii, idx;\r\n\tBOOL done;\r\n\r\n\tdone = FALSE;\r\n#ifdef HELLFIRE\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n#ifdef HELLFIRE\r\n\t\tidx = RndTypeItems(imisc, IMISC_NONE, curlv);\r\n#else\r\n\t\tidx = RndTypeItems(imisc, IMISC_NONE);\r\n#endif\r\n\t\twhile (!done) {\r\n#ifdef HELLFIRE\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * curlv, 1, TRUE, FALSE, delta);\r\n#else\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, TRUE, FALSE, delta);\r\n#endif\r\n\t\t\tif (item[ii]._iCurs == icurs)\r\n\t\t\t\tdone = TRUE;\r\n\t\t\telse\r\n#ifdef HELLFIRE\r\n\t\t\t\tidx = RndTypeItems(imisc, IMISC_NONE, curlv);\r\n#else\r\n\t\t\t\tidx = RndTypeItems(imisc, IMISC_NONE);\r\n#endif\r\n\t\t}\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t\tif (delta)\r\n\t\t\tDeltaAddItem(ii);\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid CreateAmulet(int x, int y, int curlv, BOOL sendmsg, BOOL delta)\r\n{\r\n\tint ii, idx;\r\n\tBOOLEAN done;\r\n\r\n\tdone = FALSE;\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n\t\tidx = RndTypeItems(ITYPE_AMULET, IMISC_AMULET, curlv);\r\n\t\twhile (!done) {\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * curlv, 1, TRUE, FALSE, delta);\r\n\t\t\tif (item[ii]._iCurs == ICURS_AMULET) {\r\n\t\t\t\tdone = TRUE;\r\n\t\t\t} else {\r\n\t\t\t\tidx = RndTypeItems(ITYPE_AMULET, IMISC_AMULET, curlv);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t\tif (delta)\r\n\t\t\tDeltaAddItem(ii);\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid CreateMagicWeapon(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta)\r\n{\r\n\tint ii, idx;\r\n\tBOOL done;\r\n\r\n\tdone = FALSE;\r\n#ifdef HELLFIRE\r\n\tint imid;\r\n\tif (imisc == ITYPE_STAFF)\r\n\t\timid = IMISC_STAFF;\r\n\telse\r\n\t\timid = IMISC_NONE;\r\n\tint curlv = items_get_currlevel();\r\n#endif\r\n\tif (numitems < MAXITEMS) {\r\n\t\tii = itemavail[0];\r\n\t\tGetSuperItemSpace(x, y, ii);\r\n\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\titemactive[numitems] = ii;\r\n#ifdef HELLFIRE\r\n\t\tidx = RndTypeItems(imisc, imid, curlv);\r\n#else\r\n\t\tidx = RndTypeItems(imisc, IMISC_NONE);\r\n#endif\r\n\t\twhile (!done) {\r\n#ifdef HELLFIRE\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * curlv, 1, TRUE, FALSE, delta);\r\n#else\r\n\t\t\tSetupAllItems(ii, idx, GetRndSeed(), 2 * currlevel, 1, TRUE, FALSE, delta);\r\n#endif\r\n\t\t\tif (item[ii]._iCurs == icurs)\r\n\t\t\t\tdone = TRUE;\r\n\t\t\telse\r\n#ifdef HELLFIRE\r\n\t\t\t\tidx = RndTypeItems(imisc, imid, curlv);\r\n#else\r\n\t\t\t\tidx = RndTypeItems(imisc, IMISC_NONE);\r\n#endif\r\n\t\t}\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdDItem(FALSE, ii);\r\n\t\tif (delta)\r\n\t\t\tDeltaAddItem(ii);\r\n\t\tnumitems++;\r\n\t}\r\n}\r\n\r\nstatic void NextItemRecord(int i)\r\n{\r\n\tgnNumGetRecords--;\r\n\r\n\tif (gnNumGetRecords == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\titemrecord[i].dwTimestamp = itemrecord[gnNumGetRecords].dwTimestamp;\r\n\titemrecord[i].nSeed = itemrecord[gnNumGetRecords].nSeed;\r\n\titemrecord[i].wCI = itemrecord[gnNumGetRecords].wCI;\r\n\titemrecord[i].nIndex = itemrecord[gnNumGetRecords].nIndex;\r\n}\r\n\r\nBOOL GetItemRecord(int nSeed, WORD wCI, int nIndex)\r\n{\r\n\tint i;\r\n\tDWORD dwTicks;\r\n\r\n\tdwTicks = GetTickCount();\r\n\r\n\tfor (i = 0; i < gnNumGetRecords; i++) {\r\n\t\tif (dwTicks - itemrecord[i].dwTimestamp > 6000) {\r\n\t\t\t// BUGFIX: loot actions for multiple quest items with same seed (e.g. blood stone) performed within less then 6 seconds will be ignored.\r\n\t\t\tNextItemRecord(i);\r\n\t\t\ti--;\r\n\t\t} else if (nSeed == itemrecord[i].nSeed && wCI == itemrecord[i].wCI && nIndex == itemrecord[i].nIndex) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid SetItemRecord(int nSeed, WORD wCI, int nIndex)\r\n{\r\n\tDWORD dwTicks;\r\n\r\n\tdwTicks = GetTickCount();\r\n\r\n\tif (gnNumGetRecords == MAXITEMS) {\r\n\t\treturn;\r\n\t}\r\n\r\n\titemrecord[gnNumGetRecords].dwTimestamp = dwTicks;\r\n\titemrecord[gnNumGetRecords].nSeed = nSeed;\r\n\titemrecord[gnNumGetRecords].wCI = wCI;\r\n\titemrecord[gnNumGetRecords].nIndex = nIndex;\r\n\tgnNumGetRecords++;\r\n}\r\n\r\nvoid PutItemRecord(int nSeed, WORD wCI, int nIndex)\r\n{\r\n\tint i;\r\n\tDWORD dwTicks;\r\n\r\n\tdwTicks = GetTickCount();\r\n\r\n\tfor (i = 0; i < gnNumGetRecords; i++) {\r\n\t\tif (dwTicks - itemrecord[i].dwTimestamp > 6000) {\r\n\t\t\tNextItemRecord(i);\r\n\t\t\ti--;\r\n\t\t} else if (nSeed == itemrecord[i].nSeed && wCI == itemrecord[i].wCI && nIndex == itemrecord[i].nIndex) {\r\n\t\t\tNextItemRecord(i);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/items.h",
    "content": "/**\r\n * @file items.h\r\n *\r\n * Interface of item functionality.\r\n */\r\n#ifndef __ITEMS_H__\r\n#define __ITEMS_H__\r\n\r\nextern int itemactive[MAXITEMS];\r\nextern BOOL uitemflag;\r\nextern int itemavail[MAXITEMS];\r\nextern ItemGetRecordStruct itemrecord[MAXITEMS];\r\nextern ItemStruct item[MAXITEMS + 1];\r\n#ifdef HELLFIRE\r\nextern CornerStoneStruct CornerStone;\r\n#endif\r\nextern BOOL UniqueItemFlag[128];\r\n#ifdef HELLFIRE\r\nextern int auricGold;\r\n#endif\r\nextern int numitems;\r\n\r\n#ifdef HELLFIRE\r\nint get_ring_max_value(int i);\r\nint get_bow_max_value(int i);\r\nint get_staff_max_value(int i);\r\nint get_sword_max_value(int i);\r\nint get_helm_max_value(int i);\r\nint get_shield_max_value(int i);\r\nint get_armor_max_value(int i);\r\nint get_mace_max_value(int i);\r\nint get_amulet_max_value(int i);\r\nint get_axe_max_value(int i);\r\n#endif\r\nvoid InitItemGFX();\r\nvoid InitItems();\r\nvoid CalcPlrItemVals(int p, BOOL Loadgfx);\r\nvoid CalcPlrScrolls(int p);\r\nvoid CalcPlrStaff(int p);\r\nvoid CalcPlrInv(int p, BOOL Loadgfx);\r\nvoid SetPlrHandItem(ItemStruct *h, int idata);\r\nvoid GetPlrHandSeed(ItemStruct *h);\r\nvoid GetGoldSeed(int pnum, ItemStruct *h);\r\nvoid SetPlrHandGoldCurs(ItemStruct *h);\r\nvoid CreatePlrItems(int p);\r\nBOOL ItemSpaceOk(int i, int j);\r\nvoid GetSuperItemLoc(int x, int y, int &xx, int &yy);\r\nvoid GetItemAttrs(int i, int idata, int lvl);\r\nvoid SaveItemPower(int i, int power, int param1, int param2, int minval, int maxval, int multval);\r\nvoid GetItemPower(int i, int minlvl, int maxlvl, int flgs, BOOL onlygood);\r\nvoid SetupItem(int i);\r\nint RndItem(int m);\r\nvoid SpawnUnique(int uid, int x, int y);\r\nvoid SpawnItem(int m, int x, int y, BOOL sendmsg);\r\nvoid CreateItem(int uid, int x, int y);\r\nvoid CreateRndItem(int x, int y, BOOL onlygood, BOOL sendmsg, BOOL delta);\r\nvoid CreateRndUseful(int pnum, int x, int y, BOOL sendmsg);\r\nvoid CreateTypeItem(int x, int y, BOOL onlygood, int itype, int imisc, BOOL sendmsg, BOOL delta);\r\nvoid RecreateItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue);\r\nvoid RecreateEar(int ii, WORD ic, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff);\r\n#ifdef HELLFIRE\r\nvoid CornerstoneSave();\r\nvoid CornerstoneLoad(int x, int y);\r\n#endif\r\nvoid SpawnQuestItem(int itemid, int x, int y, int randarea, int selflag);\r\nvoid SpawnRock();\r\n#ifdef HELLFIRE\r\nvoid SpawnRewardItem(int itemid, int xx, int yy);\r\nvoid SpawnMapOfDoom(int xx, int yy);\r\nvoid SpawnRuneBomb(int xx, int yy);\r\nvoid SpawnTheodore(int xx, int yy);\r\n#endif\r\nvoid RespawnItem(int i, BOOL FlipFlag);\r\nvoid DeleteItem(int ii, int i);\r\nvoid ProcessItems();\r\nvoid FreeItemGFX();\r\nvoid GetItemFrm(int i);\r\nvoid GetItemStr(int i);\r\nvoid CheckIdentify(int pnum, int cii);\r\nvoid DoRepair(int pnum, int cii);\r\nvoid DoRecharge(int pnum, int cii);\r\n#ifdef HELLFIRE\r\nvoid DoOil(int pnum, int cii);\r\n#endif\r\nvoid PrintItemPower(char plidx, ItemStruct *x);\r\nvoid DrawUniqueInfo();\r\nvoid PrintItemDetails(ItemStruct *x);\r\nvoid PrintItemDur(ItemStruct *x);\r\nvoid UseItem(int p, int Mid, int spl);\r\nBOOL StoreStatOk(ItemStruct *h);\r\nvoid SpawnSmith(int lvl);\r\n#ifdef HELLFIRE\r\nvoid SpawnPremium(int pnum);\r\n#else\r\nvoid SpawnPremium(int lvl);\r\n#endif\r\nvoid WitchBookLevel(int ii);\r\nvoid SpawnWitch(int lvl);\r\nvoid SpawnBoy(int lvl);\r\nvoid SpawnHealer(int lvl);\r\nvoid SpawnStoreGold();\r\nvoid RecreateTownItem(int ii, int idx, WORD icreateinfo, int iseed, int ivalue);\r\nvoid RecalcStoreStats();\r\nint ItemNoFlippy();\r\nvoid CreateSpellBook(int x, int y, int ispell, BOOL sendmsg, BOOL delta);\r\nvoid CreateMagicArmor(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta);\r\n#ifdef HELLFIRE\r\nvoid CreateAmulet(int x, int y, int curlv, BOOL sendmsg, BOOL delta);\r\n#endif\r\nvoid CreateMagicWeapon(int x, int y, int imisc, int icurs, BOOL sendmsg, BOOL delta);\r\nBOOL GetItemRecord(int nSeed, WORD wCI, int nIndex);\r\nvoid SetItemRecord(int nSeed, WORD wCI, int nIndex);\r\nvoid PutItemRecord(int nSeed, WORD wCI, int nIndex);\r\n\r\n/* data */\r\n\r\n#ifdef HELLFIRE\r\nextern int MaxGold;\r\n#endif\r\n\r\nextern BYTE ItemCAnimTbl[];\r\nextern int ItemInvSnds[];\r\n\r\n#endif /* __ITEMS_H__ */\r\n"
  },
  {
    "path": "Source/lighting.cpp",
    "content": "/**\r\n * @file lighting.cpp\r\n *\r\n * Implementation of light and vision.\r\n */\r\n#include \"all.h\"\r\n\r\nLightListStruct VisionList[MAXVISION];\r\nBYTE lightactive[MAXLIGHTS];\r\nLightListStruct LightList[MAXLIGHTS];\r\nint numlights;\r\nBYTE lightradius[16][128];\r\nBOOL dovision;\r\nint numvision;\r\nchar lightmax;\r\nBOOL dolighting;\r\nBYTE lightblock[64][16][16];\r\nint visionid;\r\nBYTE *pLightTbl;\r\nBOOL lightflag;\r\n\r\n/**\r\n * CrawlTable specifies X- and Y-coordinate deltas from a missile target coordinate.\r\n *\r\n * n=4\r\n *\r\n *    y\r\n *    ^\r\n *    |  1\r\n *    | 3#4\r\n *    |  2\r\n *    +-----> x\r\n *\r\n * n=16\r\n *\r\n *    y\r\n *    ^\r\n *    |  314\r\n *    | B7 8C\r\n *    | F # G\r\n *    | D9 AE\r\n *    |  526\r\n *    +-------> x\r\n */\r\nchar CrawlTable[2749] = {\r\n\t1,\r\n\t0, 0,\r\n\t4,\r\n\t0, 1, 0, -1, -1, 0, 1, 0,\r\n\t16,\r\n\t0, 2, 0, -2, -1, 2, 1, 2,\r\n\t-1, -2, 1, -2, -1, 1, 1, 1,\r\n\t-1, -1, 1, -1, -2, 1, 2, 1,\r\n\t-2, -1, 2, -1, -2, 0, 2, 0,\r\n\t24,\r\n\t0, 3, 0, -3, -1, 3, 1, 3,\r\n\t-1, -3, 1, -3, -2, 3, 2, 3,\r\n\t-2, -3, 2, -3, -2, 2, 2, 2,\r\n\t-2, -2, 2, -2, -3, 2, 3, 2,\r\n\t-3, -2, 3, -2, -3, 1, 3, 1,\r\n\t-3, -1, 3, -1, -3, 0, 3, 0,\r\n\t32,\r\n\t0, 4, 0, -4, -1, 4, 1, 4,\r\n\t-1, -4, 1, -4, -2, 4, 2, 4,\r\n\t-2, -4, 2, -4, -3, 4, 3, 4,\r\n\t-3, -4, 3, -4, -3, 3, 3, 3,\r\n\t-3, -3, 3, -3, -4, 3, 4, 3,\r\n\t-4, -3, 4, -3, -4, 2, 4, 2,\r\n\t-4, -2, 4, -2, -4, 1, 4, 1,\r\n\t-4, -1, 4, -1, -4, 0, 4, 0,\r\n\t40,\r\n\t0, 5, 0, -5, -1, 5, 1, 5,\r\n\t-1, -5, 1, -5, -2, 5, 2, 5,\r\n\t-2, -5, 2, -5, -3, 5, 3, 5,\r\n\t-3, -5, 3, -5, -4, 5, 4, 5,\r\n\t-4, -5, 4, -5, -4, 4, 4, 4,\r\n\t-4, -4, 4, -4, -5, 4, 5, 4,\r\n\t-5, -4, 5, -4, -5, 3, 5, 3,\r\n\t-5, -3, 5, -3, -5, 2, 5, 2,\r\n\t-5, -2, 5, -2, -5, 1, 5, 1,\r\n\t-5, -1, 5, -1, -5, 0, 5, 0,\r\n\t48,\r\n\t0, 6, 0, -6, -1, 6, 1, 6,\r\n\t-1, -6, 1, -6, -2, 6, 2, 6,\r\n\t-2, -6, 2, -6, -3, 6, 3, 6,\r\n\t-3, -6, 3, -6, -4, 6, 4, 6,\r\n\t-4, -6, 4, -6, -5, 6, 5, 6,\r\n\t-5, -6, 5, -6, -5, 5, 5, 5,\r\n\t-5, -5, 5, -5, -6, 5, 6, 5,\r\n\t-6, -5, 6, -5, -6, 4, 6, 4,\r\n\t-6, -4, 6, -4, -6, 3, 6, 3,\r\n\t-6, -3, 6, -3, -6, 2, 6, 2,\r\n\t-6, -2, 6, -2, -6, 1, 6, 1,\r\n\t-6, -1, 6, -1, -6, 0, 6, 0,\r\n\t56,\r\n\t0, 7, 0, -7, -1, 7, 1, 7,\r\n\t-1, -7, 1, -7, -2, 7, 2, 7,\r\n\t-2, -7, 2, -7, -3, 7, 3, 7,\r\n\t-3, -7, 3, -7, -4, 7, 4, 7,\r\n\t-4, -7, 4, -7, -5, 7, 5, 7,\r\n\t-5, -7, 5, -7, -6, 7, 6, 7,\r\n\t-6, -7, 6, -7, -6, 6, 6, 6,\r\n\t-6, -6, 6, -6, -7, 6, 7, 6,\r\n\t-7, -6, 7, -6, -7, 5, 7, 5,\r\n\t-7, -5, 7, -5, -7, 4, 7, 4,\r\n\t-7, -4, 7, -4, -7, 3, 7, 3,\r\n\t-7, -3, 7, -3, -7, 2, 7, 2,\r\n\t-7, -2, 7, -2, -7, 1, 7, 1,\r\n\t-7, -1, 7, -1, -7, 0, 7, 0,\r\n\t64,\r\n\t0, 8, 0, -8, -1, 8, 1, 8,\r\n\t-1, -8, 1, -8, -2, 8, 2, 8,\r\n\t-2, -8, 2, -8, -3, 8, 3, 8,\r\n\t-3, -8, 3, -8, -4, 8, 4, 8,\r\n\t-4, -8, 4, -8, -5, 8, 5, 8,\r\n\t-5, -8, 5, -8, -6, 8, 6, 8,\r\n\t-6, -8, 6, -8, -7, 8, 7, 8,\r\n\t-7, -8, 7, -8, -7, 7, 7, 7,\r\n\t-7, -7, 7, -7, -8, 7, 8, 7,\r\n\t-8, -7, 8, -7, -8, 6, 8, 6,\r\n\t-8, -6, 8, -6, -8, 5, 8, 5,\r\n\t-8, -5, 8, -5, -8, 4, 8, 4,\r\n\t-8, -4, 8, -4, -8, 3, 8, 3,\r\n\t-8, -3, 8, -3, -8, 2, 8, 2,\r\n\t-8, -2, 8, -2, -8, 1, 8, 1,\r\n\t-8, -1, 8, -1, -8, 0, 8, 0,\r\n\t72,\r\n\t0, 9, 0, -9, -1, 9, 1, 9,\r\n\t-1, -9, 1, -9, -2, 9, 2, 9,\r\n\t-2, -9, 2, -9, -3, 9, 3, 9,\r\n\t-3, -9, 3, -9, -4, 9, 4, 9,\r\n\t-4, -9, 4, -9, -5, 9, 5, 9,\r\n\t-5, -9, 5, -9, -6, 9, 6, 9,\r\n\t-6, -9, 6, -9, -7, 9, 7, 9,\r\n\t-7, -9, 7, -9, -8, 9, 8, 9,\r\n\t-8, -9, 8, -9, -8, 8, 8, 8,\r\n\t-8, -8, 8, -8, -9, 8, 9, 8,\r\n\t-9, -8, 9, -8, -9, 7, 9, 7,\r\n\t-9, -7, 9, -7, -9, 6, 9, 6,\r\n\t-9, -6, 9, -6, -9, 5, 9, 5,\r\n\t-9, -5, 9, -5, -9, 4, 9, 4,\r\n\t-9, -4, 9, -4, -9, 3, 9, 3,\r\n\t-9, -3, 9, -3, -9, 2, 9, 2,\r\n\t-9, -2, 9, -2, -9, 1, 9, 1,\r\n\t-9, -1, 9, -1, -9, 0, 9, 0,\r\n\t80,\r\n\t0, 10, 0, -10, -1, 10, 1, 10,\r\n\t-1, -10, 1, -10, -2, 10, 2, 10,\r\n\t-2, -10, 2, -10, -3, 10, 3, 10,\r\n\t-3, -10, 3, -10, -4, 10, 4, 10,\r\n\t-4, -10, 4, -10, -5, 10, 5, 10,\r\n\t-5, -10, 5, -10, -6, 10, 6, 10,\r\n\t-6, -10, 6, -10, -7, 10, 7, 10,\r\n\t-7, -10, 7, -10, -8, 10, 8, 10,\r\n\t-8, -10, 8, -10, -9, 10, 9, 10,\r\n\t-9, -10, 9, -10, -9, 9, 9, 9,\r\n\t-9, -9, 9, -9, -10, 9, 10, 9,\r\n\t-10, -9, 10, -9, -10, 8, 10, 8,\r\n\t-10, -8, 10, -8, -10, 7, 10, 7,\r\n\t-10, -7, 10, -7, -10, 6, 10, 6,\r\n\t-10, -6, 10, -6, -10, 5, 10, 5,\r\n\t-10, -5, 10, -5, -10, 4, 10, 4,\r\n\t-10, -4, 10, -4, -10, 3, 10, 3,\r\n\t-10, -3, 10, -3, -10, 2, 10, 2,\r\n\t-10, -2, 10, -2, -10, 1, 10, 1,\r\n\t-10, -1, 10, -1, -10, 0, 10, 0,\r\n\t88,\r\n\t0, 11, 0, -11, -1, 11, 1, 11,\r\n\t-1, -11, 1, -11, -2, 11, 2, 11,\r\n\t-2, -11, 2, -11, -3, 11, 3, 11,\r\n\t-3, -11, 3, -11, -4, 11, 4, 11,\r\n\t-4, -11, 4, -11, -5, 11, 5, 11,\r\n\t-5, -11, 5, -11, -6, 11, 6, 11,\r\n\t-6, -11, 6, -11, -7, 11, 7, 11,\r\n\t-7, -11, 7, -11, -8, 11, 8, 11,\r\n\t-8, -11, 8, -11, -9, 11, 9, 11,\r\n\t-9, -11, 9, -11, -10, 11, 10, 11,\r\n\t-10, -11, 10, -11, -10, 10, 10, 10,\r\n\t-10, -10, 10, -10, -11, 10, 11, 10,\r\n\t-11, -10, 11, -10, -11, 9, 11, 9,\r\n\t-11, -9, 11, -9, -11, 8, 11, 8,\r\n\t-11, -8, 11, -8, -11, 7, 11, 7,\r\n\t-11, -7, 11, -7, -11, 6, 11, 6,\r\n\t-11, -6, 11, -6, -11, 5, 11, 5,\r\n\t-11, -5, 11, -5, -11, 4, 11, 4,\r\n\t-11, -4, 11, -4, -11, 3, 11, 3,\r\n\t-11, -3, 11, -3, -11, 2, 11, 2,\r\n\t-11, -2, 11, -2, -11, 1, 11, 1,\r\n\t-11, -1, 11, -1, -11, 0, 11, 0,\r\n\t96,\r\n\t0, 12, 0, -12, -1, 12, 1, 12,\r\n\t-1, -12, 1, -12, -2, 12, 2, 12,\r\n\t-2, -12, 2, -12, -3, 12, 3, 12,\r\n\t-3, -12, 3, -12, -4, 12, 4, 12,\r\n\t-4, -12, 4, -12, -5, 12, 5, 12,\r\n\t-5, -12, 5, -12, -6, 12, 6, 12,\r\n\t-6, -12, 6, -12, -7, 12, 7, 12,\r\n\t-7, -12, 7, -12, -8, 12, 8, 12,\r\n\t-8, -12, 8, -12, -9, 12, 9, 12,\r\n\t-9, -12, 9, -12, -10, 12, 10, 12,\r\n\t-10, -12, 10, -12, -11, 12, 11, 12,\r\n\t-11, -12, 11, -12, -11, 11, 11, 11,\r\n\t-11, -11, 11, -11, -12, 11, 12, 11,\r\n\t-12, -11, 12, -11, -12, 10, 12, 10,\r\n\t-12, -10, 12, -10, -12, 9, 12, 9,\r\n\t-12, -9, 12, -9, -12, 8, 12, 8,\r\n\t-12, -8, 12, -8, -12, 7, 12, 7,\r\n\t-12, -7, 12, -7, -12, 6, 12, 6,\r\n\t-12, -6, 12, -6, -12, 5, 12, 5,\r\n\t-12, -5, 12, -5, -12, 4, 12, 4,\r\n\t-12, -4, 12, -4, -12, 3, 12, 3,\r\n\t-12, -3, 12, -3, -12, 2, 12, 2,\r\n\t-12, -2, 12, -2, -12, 1, 12, 1,\r\n\t-12, -1, 12, -1, -12, 0, 12, 0,\r\n\t104,\r\n\t0, 13, 0, -13, -1, 13, 1, 13,\r\n\t-1, -13, 1, -13, -2, 13, 2, 13,\r\n\t-2, -13, 2, -13, -3, 13, 3, 13,\r\n\t-3, -13, 3, -13, -4, 13, 4, 13,\r\n\t-4, -13, 4, -13, -5, 13, 5, 13,\r\n\t-5, -13, 5, -13, -6, 13, 6, 13,\r\n\t-6, -13, 6, -13, -7, 13, 7, 13,\r\n\t-7, -13, 7, -13, -8, 13, 8, 13,\r\n\t-8, -13, 8, -13, -9, 13, 9, 13,\r\n\t-9, -13, 9, -13, -10, 13, 10, 13,\r\n\t-10, -13, 10, -13, -11, 13, 11, 13,\r\n\t-11, -13, 11, -13, -12, 13, 12, 13,\r\n\t-12, -13, 12, -13, -12, 12, 12, 12,\r\n\t-12, -12, 12, -12, -13, 12, 13, 12,\r\n\t-13, -12, 13, -12, -13, 11, 13, 11,\r\n\t-13, -11, 13, -11, -13, 10, 13, 10,\r\n\t-13, -10, 13, -10, -13, 9, 13, 9,\r\n\t-13, -9, 13, -9, -13, 8, 13, 8,\r\n\t-13, -8, 13, -8, -13, 7, 13, 7,\r\n\t-13, -7, 13, -7, -13, 6, 13, 6,\r\n\t-13, -6, 13, -6, -13, 5, 13, 5,\r\n\t-13, -5, 13, -5, -13, 4, 13, 4,\r\n\t-13, -4, 13, -4, -13, 3, 13, 3,\r\n\t-13, -3, 13, -3, -13, 2, 13, 2,\r\n\t-13, -2, 13, -2, -13, 1, 13, 1,\r\n\t-13, -1, 13, -1, -13, 0, 13, 0,\r\n\t112,\r\n\t0, 14, 0, -14, -1, 14, 1, 14,\r\n\t-1, -14, 1, -14, -2, 14, 2, 14,\r\n\t-2, -14, 2, -14, -3, 14, 3, 14,\r\n\t-3, -14, 3, -14, -4, 14, 4, 14,\r\n\t-4, -14, 4, -14, -5, 14, 5, 14,\r\n\t-5, -14, 5, -14, -6, 14, 6, 14,\r\n\t-6, -14, 6, -14, -7, 14, 7, 14,\r\n\t-7, -14, 7, -14, -8, 14, 8, 14,\r\n\t-8, -14, 8, -14, -9, 14, 9, 14,\r\n\t-9, -14, 9, -14, -10, 14, 10, 14,\r\n\t-10, -14, 10, -14, -11, 14, 11, 14,\r\n\t-11, -14, 11, -14, -12, 14, 12, 14,\r\n\t-12, -14, 12, -14, -13, 14, 13, 14,\r\n\t-13, -14, 13, -14, -13, 13, 13, 13,\r\n\t-13, -13, 13, -13, -14, 13, 14, 13,\r\n\t-14, -13, 14, -13, -14, 12, 14, 12,\r\n\t-14, -12, 14, -12, -14, 11, 14, 11,\r\n\t-14, -11, 14, -11, -14, 10, 14, 10,\r\n\t-14, -10, 14, -10, -14, 9, 14, 9,\r\n\t-14, -9, 14, -9, -14, 8, 14, 8,\r\n\t-14, -8, 14, -8, -14, 7, 14, 7,\r\n\t-14, -7, 14, -7, -14, 6, 14, 6,\r\n\t-14, -6, 14, -6, -14, 5, 14, 5,\r\n\t-14, -5, 14, -5, -14, 4, 14, 4,\r\n\t-14, -4, 14, -4, -14, 3, 14, 3,\r\n\t-14, -3, 14, -3, -14, 2, 14, 2,\r\n\t-14, -2, 14, -2, -14, 1, 14, 1,\r\n\t-14, -1, 14, -1, -14, 0, 14, 0,\r\n\t120,\r\n\t0, 15, 0, -15, -1, 15, 1, 15,\r\n\t-1, -15, 1, -15, -2, 15, 2, 15,\r\n\t-2, -15, 2, -15, -3, 15, 3, 15,\r\n\t-3, -15, 3, -15, -4, 15, 4, 15,\r\n\t-4, -15, 4, -15, -5, 15, 5, 15,\r\n\t-5, -15, 5, -15, -6, 15, 6, 15,\r\n\t-6, -15, 6, -15, -7, 15, 7, 15,\r\n\t-7, -15, 7, -15, -8, 15, 8, 15,\r\n\t-8, -15, 8, -15, -9, 15, 9, 15,\r\n\t-9, -15, 9, -15, -10, 15, 10, 15,\r\n\t-10, -15, 10, -15, -11, 15, 11, 15,\r\n\t-11, -15, 11, -15, -12, 15, 12, 15,\r\n\t-12, -15, 12, -15, -13, 15, 13, 15,\r\n\t-13, -15, 13, -15, -14, 15, 14, 15,\r\n\t-14, -15, 14, -15, -14, 14, 14, 14,\r\n\t-14, -14, 14, -14, -15, 14, 15, 14,\r\n\t-15, -14, 15, -14, -15, 13, 15, 13,\r\n\t-15, -13, 15, -13, -15, 12, 15, 12,\r\n\t-15, -12, 15, -12, -15, 11, 15, 11,\r\n\t-15, -11, 15, -11, -15, 10, 15, 10,\r\n\t-15, -10, 15, -10, -15, 9, 15, 9,\r\n\t-15, -9, 15, -9, -15, 8, 15, 8,\r\n\t-15, -8, 15, -8, -15, 7, 15, 7,\r\n\t-15, -7, 15, -7, -15, 6, 15, 6,\r\n\t-15, -6, 15, -6, -15, 5, 15, 5,\r\n\t-15, -5, 15, -5, -15, 4, 15, 4,\r\n\t-15, -4, 15, -4, -15, 3, 15, 3,\r\n\t-15, -3, 15, -3, -15, 2, 15, 2,\r\n\t-15, -2, 15, -2, -15, 1, 15, 1,\r\n\t-15, -1, 15, -1, -15, 0, 15, 0,\r\n\t(char)128,\r\n\t0, 16, 0, -16, -1, 16, 1, 16,\r\n\t-1, -16, 1, -16, -2, 16, 2, 16,\r\n\t-2, -16, 2, -16, -3, 16, 3, 16,\r\n\t-3, -16, 3, -16, -4, 16, 4, 16,\r\n\t-4, -16, 4, -16, -5, 16, 5, 16,\r\n\t-5, -16, 5, -16, -6, 16, 6, 16,\r\n\t-6, -16, 6, -16, -7, 16, 7, 16,\r\n\t-7, -16, 7, -16, -8, 16, 8, 16,\r\n\t-8, -16, 8, -16, -9, 16, 9, 16,\r\n\t-9, -16, 9, -16, -10, 16, 10, 16,\r\n\t-10, -16, 10, -16, -11, 16, 11, 16,\r\n\t-11, -16, 11, -16, -12, 16, 12, 16,\r\n\t-12, -16, 12, -16, -13, 16, 13, 16,\r\n\t-13, -16, 13, -16, -14, 16, 14, 16,\r\n\t-14, -16, 14, -16, -15, 16, 15, 16,\r\n\t-15, -16, 15, -16, -15, 15, 15, 15,\r\n\t-15, -15, 15, -15, -16, 15, 16, 15,\r\n\t-16, -15, 16, -15, -16, 14, 16, 14,\r\n\t-16, -14, 16, -14, -16, 13, 16, 13,\r\n\t-16, -13, 16, -13, -16, 12, 16, 12,\r\n\t-16, -12, 16, -12, -16, 11, 16, 11,\r\n\t-16, -11, 16, -11, -16, 10, 16, 10,\r\n\t-16, -10, 16, -10, -16, 9, 16, 9,\r\n\t-16, -9, 16, -9, -16, 8, 16, 8,\r\n\t-16, -8, 16, -8, -16, 7, 16, 7,\r\n\t-16, -7, 16, -7, -16, 6, 16, 6,\r\n\t-16, -6, 16, -6, -16, 5, 16, 5,\r\n\t-16, -5, 16, -5, -16, 4, 16, 4,\r\n\t-16, -4, 16, -4, -16, 3, 16, 3,\r\n\t-16, -3, 16, -3, -16, 2, 16, 2,\r\n\t-16, -2, 16, -2, -16, 1, 16, 1,\r\n\t-16, -1, 16, -1, -16, 0, 16, 0,\r\n\t(char)136,\r\n\t0, 17, 0, -17, -1, 17, 1, 17,\r\n\t-1, -17, 1, -17, -2, 17, 2, 17,\r\n\t-2, -17, 2, -17, -3, 17, 3, 17,\r\n\t-3, -17, 3, -17, -4, 17, 4, 17,\r\n\t-4, -17, 4, -17, -5, 17, 5, 17,\r\n\t-5, -17, 5, -17, -6, 17, 6, 17,\r\n\t-6, -17, 6, -17, -7, 17, 7, 17,\r\n\t-7, -17, 7, -17, -8, 17, 8, 17,\r\n\t-8, -17, 8, -17, -9, 17, 9, 17,\r\n\t-9, -17, 9, -17, -10, 17, 10, 17,\r\n\t-10, -17, 10, -17, -11, 17, 11, 17,\r\n\t-11, -17, 11, -17, -12, 17, 12, 17,\r\n\t-12, -17, 12, -17, -13, 17, 13, 17,\r\n\t-13, -17, 13, -17, -14, 17, 14, 17,\r\n\t-14, -17, 14, -17, -15, 17, 15, 17,\r\n\t-15, -17, 15, -17, -16, 17, 16, 17,\r\n\t-16, -17, 16, -17, -16, 16, 16, 16,\r\n\t-16, -16, 16, -16, -17, 16, 17, 16,\r\n\t-17, -16, 17, -16, -17, 15, 17, 15,\r\n\t-17, -15, 17, -15, -17, 14, 17, 14,\r\n\t-17, -14, 17, -14, -17, 13, 17, 13,\r\n\t-17, -13, 17, -13, -17, 12, 17, 12,\r\n\t-17, -12, 17, -12, -17, 11, 17, 11,\r\n\t-17, -11, 17, -11, -17, 10, 17, 10,\r\n\t-17, -10, 17, -10, -17, 9, 17, 9,\r\n\t-17, -9, 17, -9, -17, 8, 17, 8,\r\n\t-17, -8, 17, -8, -17, 7, 17, 7,\r\n\t-17, -7, 17, -7, -17, 6, 17, 6,\r\n\t-17, -6, 17, -6, -17, 5, 17, 5,\r\n\t-17, -5, 17, -5, -17, 4, 17, 4,\r\n\t-17, -4, 17, -4, -17, 3, 17, 3,\r\n\t-17, -3, 17, -3, -17, 2, 17, 2,\r\n\t-17, -2, 17, -2, -17, 1, 17, 1,\r\n\t-17, -1, 17, -1, -17, 0, 17, 0,\r\n\t(char)144,\r\n\t0, 18, 0, -18, -1, 18, 1, 18,\r\n\t-1, -18, 1, -18, -2, 18, 2, 18,\r\n\t-2, -18, 2, -18, -3, 18, 3, 18,\r\n\t-3, -18, 3, -18, -4, 18, 4, 18,\r\n\t-4, -18, 4, -18, -5, 18, 5, 18,\r\n\t-5, -18, 5, -18, -6, 18, 6, 18,\r\n\t-6, -18, 6, -18, -7, 18, 7, 18,\r\n\t-7, -18, 7, -18, -8, 18, 8, 18,\r\n\t-8, -18, 8, -18, -9, 18, 9, 18,\r\n\t-9, -18, 9, -18, -10, 18, 10, 18,\r\n\t-10, -18, 10, -18, -11, 18, 11, 18,\r\n\t-11, -18, 11, -18, -12, 18, 12, 18,\r\n\t-12, -18, 12, -18, -13, 18, 13, 18,\r\n\t-13, -18, 13, -18, -14, 18, 14, 18,\r\n\t-14, -18, 14, -18, -15, 18, 15, 18,\r\n\t-15, -18, 15, -18, -16, 18, 16, 18,\r\n\t-16, -18, 16, -18, -17, 18, 17, 18,\r\n\t-17, -18, 17, -18, -17, 17, 17, 17,\r\n\t-17, -17, 17, -17, -18, 17, 18, 17,\r\n\t-18, -17, 18, -17, -18, 16, 18, 16,\r\n\t-18, -16, 18, -16, -18, 15, 18, 15,\r\n\t-18, -15, 18, -15, -18, 14, 18, 14,\r\n\t-18, -14, 18, -14, -18, 13, 18, 13,\r\n\t-18, -13, 18, -13, -18, 12, 18, 12,\r\n\t-18, -12, 18, -12, -18, 11, 18, 11,\r\n\t-18, -11, 18, -11, -18, 10, 18, 10,\r\n\t-18, -10, 18, -10, -18, 9, 18, 9,\r\n\t-18, -9, 18, -9, -18, 8, 18, 8,\r\n\t-18, -8, 18, -8, -18, 7, 18, 7,\r\n\t-18, -7, 18, -7, -18, 6, 18, 6,\r\n\t-18, -6, 18, -6, -18, 5, 18, 5,\r\n\t-18, -5, 18, -5, -18, 4, 18, 4,\r\n\t-18, -4, 18, -4, -18, 3, 18, 3,\r\n\t-18, -3, 18, -3, -18, 2, 18, 2,\r\n\t-18, -2, 18, -2, -18, 1, 18, 1,\r\n\t-18, -1, 18, -1, -18, 0, 18, 0\r\n};\r\n\r\n/** pCrawlTable maps from circle radius to the X- and Y-coordinate deltas from the center of a circle. */\r\nchar *pCrawlTable[19] = {\r\n\tCrawlTable,\r\n\tCrawlTable + 3,\r\n\tCrawlTable + 12,\r\n\tCrawlTable + 45,\r\n\tCrawlTable + 94,\r\n\tCrawlTable + 159,\r\n\tCrawlTable + 240,\r\n\tCrawlTable + 337,\r\n\tCrawlTable + 450,\r\n\tCrawlTable + 579,\r\n\tCrawlTable + 724,\r\n\tCrawlTable + 885,\r\n\tCrawlTable + 1062,\r\n\tCrawlTable + 1255,\r\n\tCrawlTable + 1464,\r\n\tCrawlTable + 1689,\r\n\tCrawlTable + 1930,\r\n\tCrawlTable + 2187,\r\n\tCrawlTable + 2460\r\n};\r\n/** vCrawlTable specifies the X- Y-coordinate offsets of lighting visions. */\r\nBYTE vCrawlTable[23][30] = {\r\n\t{ 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15, 0 },\r\n\t{ 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15, 1 },\r\n\t{ 1, 0, 2, 0, 3, 0, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 2, 13, 2, 14, 2, 15, 2 },\r\n\t{ 1, 0, 2, 0, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 2, 9, 2, 10, 2, 11, 2, 12, 2, 13, 3, 14, 3, 15, 3 },\r\n\t{ 1, 0, 2, 1, 3, 1, 4, 1, 5, 1, 6, 2, 7, 2, 8, 2, 9, 3, 10, 3, 11, 3, 12, 3, 13, 4, 14, 4, 0, 0 },\r\n\t{ 1, 0, 2, 1, 3, 1, 4, 1, 5, 2, 6, 2, 7, 3, 8, 3, 9, 3, 10, 4, 11, 4, 12, 4, 13, 5, 14, 5, 0, 0 },\r\n\t{ 1, 0, 2, 1, 3, 1, 4, 2, 5, 2, 6, 3, 7, 3, 8, 3, 9, 4, 10, 4, 11, 5, 12, 5, 13, 6, 14, 6, 0, 0 },\r\n\t{ 1, 1, 2, 1, 3, 2, 4, 2, 5, 3, 6, 3, 7, 4, 8, 4, 9, 5, 10, 5, 11, 6, 12, 6, 13, 7, 0, 0, 0, 0 },\r\n\t{ 1, 1, 2, 1, 3, 2, 4, 2, 5, 3, 6, 4, 7, 4, 8, 5, 9, 6, 10, 6, 11, 7, 12, 7, 12, 8, 13, 8, 0, 0 },\r\n\t{ 1, 1, 2, 2, 3, 2, 4, 3, 5, 4, 6, 5, 7, 5, 8, 6, 9, 7, 10, 7, 10, 8, 11, 8, 12, 9, 0, 0, 0, 0 },\r\n\t{ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 5, 7, 6, 8, 7, 9, 8, 10, 9, 11, 9, 11, 10, 0, 0, 0, 0, 0, 0 },\r\n\t{ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t{ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 9, 11, 10, 11, 0, 0, 0, 0, 0, 0 },\r\n\t{ 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 5, 7, 6, 8, 7, 9, 7, 10, 8, 10, 8, 11, 9, 12, 0, 0, 0, 0 },\r\n\t{ 1, 1, 1, 2, 2, 3, 2, 4, 3, 5, 4, 6, 4, 7, 5, 8, 6, 9, 6, 10, 7, 11, 7, 12, 8, 12, 8, 13, 0, 0 },\r\n\t{ 1, 1, 1, 2, 2, 3, 2, 4, 3, 5, 3, 6, 4, 7, 4, 8, 5, 9, 5, 10, 6, 11, 6, 12, 7, 13, 0, 0, 0, 0 },\r\n\t{ 0, 1, 1, 2, 1, 3, 2, 4, 2, 5, 3, 6, 3, 7, 3, 8, 4, 9, 4, 10, 5, 11, 5, 12, 6, 13, 6, 14, 0, 0 },\r\n\t{ 0, 1, 1, 2, 1, 3, 1, 4, 2, 5, 2, 6, 3, 7, 3, 8, 3, 9, 4, 10, 4, 11, 4, 12, 5, 13, 5, 14, 0, 0 },\r\n\t{ 0, 1, 1, 2, 1, 3, 1, 4, 1, 5, 2, 6, 2, 7, 2, 8, 3, 9, 3, 10, 3, 11, 3, 12, 4, 13, 4, 14, 0, 0 },\r\n\t{ 0, 1, 0, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 2, 8, 2, 9, 2, 10, 2, 11, 2, 12, 3, 13, 3, 14, 3, 15 },\r\n\t{ 0, 1, 0, 2, 0, 3, 1, 4, 1, 5, 1, 6, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11, 2, 12, 2, 13, 2, 14, 2, 15 },\r\n\t{ 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 1, 8, 1, 9, 1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 1, 15 },\r\n\t{ 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0, 15 }\r\n};\r\n/** unused */\r\nBYTE byte_49463C[18][18] = {\r\n\t{ 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 },\r\n\t{ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3 },\r\n\t{ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3 },\r\n\t{ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 },\r\n\t{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2 }\r\n};\r\n\r\n/** RadiusAdj maps from vCrawlTable index to lighting vision radius adjustment. */\r\nBYTE RadiusAdj[23] = { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 4, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0 };\r\n\r\nvoid RotateRadius(int *x, int *y, int *dx, int *dy, int *lx, int *ly, int *bx, int *by)\r\n{\r\n\tint swap;\r\n\r\n\t*bx = 0;\r\n\t*by = 0;\r\n\r\n\tswap = *dx;\r\n\t*dx = 7 - *dy;\r\n\t*dy = swap;\r\n\tswap = *lx;\r\n\t*lx = 7 - *ly;\r\n\t*ly = swap;\r\n\r\n\t*x = *dx - *lx;\r\n\t*y = *dy - *ly;\r\n\r\n\tif (*x < 0) {\r\n\t\t*x += 8;\r\n\t\t*bx = 1;\r\n\t}\r\n\tif (*y < 0) {\r\n\t\t*y += 8;\r\n\t\t*by = 1;\r\n\t}\r\n}\r\n\r\nvoid DoLighting(int nXPos, int nYPos, int nRadius, int Lnum)\r\n{\r\n\tint x, y, v, xoff, yoff, mult, radius_block;\r\n\tint min_x, max_x, min_y, max_y;\r\n\tint dist_x, dist_y, light_x, light_y, block_x, block_y, temp_x, temp_y;\r\n\r\n\txoff = 0;\r\n\tyoff = 0;\r\n\tlight_x = 0;\r\n\tlight_y = 0;\r\n\tblock_x = 0;\r\n\tblock_y = 0;\r\n\r\n\tif (Lnum >= 0) {\r\n\t\txoff = LightList[Lnum]._xoff;\r\n\t\tyoff = LightList[Lnum]._yoff;\r\n\t\tif (xoff < 0) {\r\n\t\t\txoff += 8;\r\n\t\t\tnXPos--;\r\n\t\t}\r\n\t\tif (yoff < 0) {\r\n\t\t\tyoff += 8;\r\n\t\t\tnYPos--;\r\n\t\t}\r\n\t}\r\n\r\n\tdist_x = xoff;\r\n\tdist_y = yoff;\r\n\r\n\tif (nXPos - 15 < 0) {\r\n\t\tmin_x = nXPos + 1;\r\n\t} else {\r\n\t\tmin_x = 15;\r\n\t}\r\n\tif (nXPos + 15 > MAXDUNX) {\r\n\t\tmax_x = MAXDUNX - nXPos;\r\n\t} else {\r\n\t\tmax_x = 15;\r\n\t}\r\n\tif (nYPos - 15 < 0) {\r\n\t\tmin_y = nYPos + 1;\r\n\t} else {\r\n\t\tmin_y = 15;\r\n\t}\r\n\tif (nYPos + 15 > MAXDUNY) {\r\n\t\tmax_y = MAXDUNY - nYPos;\r\n\t} else {\r\n\t\tmax_y = 15;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#else\r\n\tif (nXPos >= 0 && nXPos < MAXDUNX && nYPos >= 0 && nYPos < MAXDUNY) {\r\n#endif\r\n\t\tdLight[nXPos][nYPos] = 0;\r\n#ifdef HELLFIRE\r\n\t} else if (dLight[nXPos][nYPos] > lightradius[nRadius][0]) {\r\n\t\tdLight[nXPos][nYPos] = lightradius[nRadius][0];\r\n#endif\r\n\t}\r\n\r\n\tmult = xoff + 8 * yoff;\r\n\tfor (y = 0; y < min_y; y++) {\r\n\t\tfor (x = 1; x < max_x; x++) {\r\n\t\t\tradius_block = lightblock[mult][y][x];\r\n\t\t\tif (radius_block < 128) {\r\n\t\t\t\ttemp_x = nXPos + x;\r\n\t\t\t\ttemp_y = nYPos + y;\r\n\t\t\t\tv = lightradius[nRadius][radius_block];\r\n#ifndef HELLFIRE\r\n\t\t\t\tif (temp_x >= 0 && temp_x < MAXDUNX && temp_y >= 0 && temp_y < MAXDUNY)\r\n#endif\r\n\t\t\t\t\tif (v < dLight[temp_x][temp_y])\r\n\t\t\t\t\t\tdLight[temp_x][temp_y] = v;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tRotateRadius(&xoff, &yoff, &dist_x, &dist_y, &light_x, &light_y, &block_x, &block_y);\r\n\tmult = xoff + 8 * yoff;\r\n\tfor (y = 0; y < max_y; y++) {\r\n\t\tfor (x = 1; x < max_x; x++) {\r\n\t\t\tradius_block = lightblock[mult][y + block_y][x + block_x];\r\n\t\t\tif (radius_block < 128) {\r\n\t\t\t\ttemp_x = nXPos + y;\r\n\t\t\t\ttemp_y = nYPos - x;\r\n\t\t\t\tv = lightradius[nRadius][radius_block];\r\n#ifndef HELLFIRE\r\n\t\t\t\tif (temp_x >= 0 && temp_x < MAXDUNX && temp_y >= 0 && temp_y < MAXDUNY)\r\n#endif\r\n\t\t\t\t\tif (v < dLight[temp_x][temp_y])\r\n\t\t\t\t\t\tdLight[temp_x][temp_y] = v;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tRotateRadius(&xoff, &yoff, &dist_x, &dist_y, &light_x, &light_y, &block_x, &block_y);\r\n\tmult = xoff + 8 * yoff;\r\n\tfor (y = 0; y < max_y; y++) {\r\n\t\tfor (x = 1; x < min_x; x++) {\r\n\t\t\tradius_block = lightblock[mult][y + block_y][x + block_x];\r\n\t\t\tif (radius_block < 128) {\r\n\t\t\t\ttemp_x = nXPos - x;\r\n\t\t\t\ttemp_y = nYPos - y;\r\n\t\t\t\tv = lightradius[nRadius][radius_block];\r\n#ifndef HELLFIRE\r\n\t\t\t\tif (temp_x >= 0 && temp_x < MAXDUNX && temp_y >= 0 && temp_y < MAXDUNY)\r\n#endif\r\n\t\t\t\t\tif (v < dLight[temp_x][temp_y])\r\n\t\t\t\t\t\tdLight[temp_x][temp_y] = v;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tRotateRadius(&xoff, &yoff, &dist_x, &dist_y, &light_x, &light_y, &block_x, &block_y);\r\n\tmult = xoff + 8 * yoff;\r\n\tfor (y = 0; y < min_y; y++) {\r\n\t\tfor (x = 1; x < min_x; x++) {\r\n\t\t\tradius_block = lightblock[mult][y + block_y][x + block_x];\r\n\t\t\tif (radius_block < 128) {\r\n\t\t\t\ttemp_x = nXPos - y;\r\n\t\t\t\ttemp_y = nYPos + x;\r\n\t\t\t\tv = lightradius[nRadius][radius_block];\r\n#ifndef HELLFIRE\r\n\t\t\t\tif (temp_x >= 0 && temp_x < MAXDUNX && temp_y >= 0 && temp_y < MAXDUNY)\r\n#endif\r\n\t\t\t\t\tif (v < dLight[temp_x][temp_y])\r\n\t\t\t\t\t\tdLight[temp_x][temp_y] = v;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DoUnLight(int nXPos, int nYPos, int nRadius)\r\n{\r\n\tint x, y, min_x, min_y, max_x, max_y;\r\n\r\n\tnRadius++;\r\n\tmin_y = nYPos - nRadius;\r\n\tmax_y = nYPos + nRadius;\r\n\tmin_x = nXPos - nRadius;\r\n\tmax_x = nXPos + nRadius;\r\n\r\n\tif (min_y < 0) {\r\n\t\tmin_y = 0;\r\n\t}\r\n\tif (max_y > MAXDUNY) {\r\n\t\tmax_y = MAXDUNY;\r\n\t}\r\n\tif (min_x < 0) {\r\n\t\tmin_x = 0;\r\n\t}\r\n\tif (max_x > MAXDUNX) {\r\n\t\tmax_x = MAXDUNX;\r\n\t}\r\n\r\n\tfor (y = min_y; y < max_y; y++) {\r\n\t\tfor (x = min_x; x < max_x; x++) {\r\n#ifndef HELLFIRE\r\n\t\t\tif (x >= 0 && x < MAXDUNX && y >= 0 && y < MAXDUNY)\r\n#endif\r\n\t\t\t\tdLight[x][y] = dPreLight[x][y];\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DoUnVision(int nXPos, int nYPos, int nRadius)\r\n{\r\n\tint i, j, x1, y1, x2, y2;\r\n\r\n\tnRadius++;\r\n\ty1 = nYPos - nRadius;\r\n\ty2 = nYPos + nRadius;\r\n\tx1 = nXPos - nRadius;\r\n\tx2 = nXPos + nRadius;\r\n\r\n\tif (y1 < 0) {\r\n\t\ty1 = 0;\r\n\t}\r\n\tif (y2 > MAXDUNY) {\r\n\t\ty2 = MAXDUNY;\r\n\t}\r\n\tif (x1 < 0) {\r\n\t\tx1 = 0;\r\n\t}\r\n\tif (x2 > MAXDUNX) {\r\n\t\tx2 = MAXDUNX;\r\n\t}\r\n\r\n\tfor (i = x1; i < x2; i++) {\r\n\t\tfor (j = y1; j < y2; j++) {\r\n\t\t\tdFlags[i][j] &= ~(BFLAG_VISIBLE | BFLAG_LIT);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DoVision(int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible)\r\n{\r\n\tBOOL nBlockerFlag;\r\n\tint nCrawlX, nCrawlY, nLineLen, nTrans;\r\n\tint j, k, v, x1adj, x2adj, y1adj, y2adj;\r\n\r\n\tif (nXPos >= 0 && nXPos <= MAXDUNX && nYPos >= 0 && nYPos <= MAXDUNY) { // BUGFIX < MAXDUNX/MAXDUNY or OOB\r\n\t\tif (doautomap) {\r\n\t\t\tif (dFlags[nXPos][nYPos] >= 0) {\r\n\t\t\t\tSetAutomapView(nXPos, nXPos); // BUGFIX - second argument should be nYPos\r\n\t\t\t}\r\n\t\t\tdFlags[nXPos][nYPos] |= BFLAG_EXPLORED;\r\n\t\t}\r\n\t\tif (visible) {\r\n\t\t\tdFlags[nXPos][nYPos] |= BFLAG_LIT;\r\n\t\t}\r\n\t\tdFlags[nXPos][nYPos] |= BFLAG_VISIBLE;\r\n\t}\r\n\r\n\tfor (v = 0; v < 4; v++) {\r\n\t\tfor (j = 0; j < 23; j++) {\r\n\t\t\tnBlockerFlag = FALSE;\r\n\t\t\tnLineLen = 2 * (nRadius - RadiusAdj[j]);\r\n\t\t\tfor (k = 0; k < nLineLen && !nBlockerFlag; k += 2) {\r\n\t\t\t\tx1adj = 0;\r\n\t\t\t\tx2adj = 0;\r\n\t\t\t\ty1adj = 0;\r\n\t\t\t\ty2adj = 0;\r\n\t\t\t\tswitch (v) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tnCrawlX = nXPos + vCrawlTable[j][k];\r\n\t\t\t\t\tnCrawlY = nYPos + vCrawlTable[j][k + 1];\r\n\t\t\t\t\tif (vCrawlTable[j][k] > 0 && vCrawlTable[j][k + 1] > 0) {\r\n\t\t\t\t\t\tx1adj = -1;\r\n\t\t\t\t\t\ty2adj = -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tnCrawlX = nXPos - vCrawlTable[j][k];\r\n\t\t\t\t\tnCrawlY = nYPos - vCrawlTable[j][k + 1];\r\n\t\t\t\t\tif (vCrawlTable[j][k] > 0 && vCrawlTable[j][k + 1] > 0) {\r\n\t\t\t\t\t\ty1adj = 1;\r\n\t\t\t\t\t\tx2adj = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tnCrawlX = nXPos + vCrawlTable[j][k];\r\n\t\t\t\t\tnCrawlY = nYPos - vCrawlTable[j][k + 1];\r\n\t\t\t\t\tif (vCrawlTable[j][k] > 0 && vCrawlTable[j][k + 1] > 0) {\r\n\t\t\t\t\t\tx1adj = -1;\r\n\t\t\t\t\t\ty2adj = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tnCrawlX = nXPos - vCrawlTable[j][k];\r\n\t\t\t\t\tnCrawlY = nYPos + vCrawlTable[j][k + 1];\r\n\t\t\t\t\tif (vCrawlTable[j][k] > 0 && vCrawlTable[j][k + 1] > 0) {\r\n\t\t\t\t\t\ty1adj = -1;\r\n\t\t\t\t\t\tx2adj = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (nCrawlX >= 0 && nCrawlX <= MAXDUNX && nCrawlY >= 0 && nCrawlY <= MAXDUNY) {\r\n\t\t\t\t\tnBlockerFlag = nBlockTable[dPiece[nCrawlX][nCrawlY]];\r\n\t\t\t\t\tif (!nBlockTable[dPiece[x1adj + nCrawlX][y1adj + nCrawlY]]\r\n\t\t\t\t\t    || !nBlockTable[dPiece[x2adj + nCrawlX][y2adj + nCrawlY]]) {\r\n\t\t\t\t\t\tif (doautomap) {\r\n\t\t\t\t\t\t\tif (dFlags[nCrawlX][nCrawlY] >= 0) {\r\n\t\t\t\t\t\t\t\tSetAutomapView(nCrawlX, nCrawlY);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdFlags[nCrawlX][nCrawlY] |= BFLAG_EXPLORED;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (visible) {\r\n\t\t\t\t\t\t\tdFlags[nCrawlX][nCrawlY] |= BFLAG_LIT;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdFlags[nCrawlX][nCrawlY] |= BFLAG_VISIBLE;\r\n\t\t\t\t\t\tif (!nBlockerFlag) {\r\n\t\t\t\t\t\t\tnTrans = dTransVal[nCrawlX][nCrawlY];\r\n\t\t\t\t\t\t\tif (nTrans != 0) {\r\n\t\t\t\t\t\t\t\tTransList[nTrans] = TRUE;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid FreeLightTable()\r\n{\r\n\tMemFreeDbg(pLightTbl);\r\n}\r\n\r\nvoid InitLightTable()\r\n{\r\n\tassert(!pLightTbl);\r\n\tpLightTbl = DiabloAllocPtr(LIGHTSIZE);\r\n}\r\n\r\nvoid MakeLightTable()\r\n{\r\n\tint i, j, k, l, lights, shade, l1, l2, cnt, rem, div;\r\n\tdouble fs, fa;\r\n\tBYTE col, max;\r\n\tBYTE *tbl, *trn;\r\n\tBYTE blood[16];\r\n\r\n\ttbl = pLightTbl;\r\n\tshade = 0;\r\n\r\n\tif (light4flag) {\r\n\t\tlights = 3;\r\n\t} else {\r\n\t\tlights = 15;\r\n\t}\r\n\r\n\tfor (i = 0; i < lights; i++) {\r\n\t\t*tbl++ = 0;\r\n\t\tfor (j = 0; j < 8; j++) {\r\n\t\t\tcol = 16 * j + shade;\r\n\t\t\tmax = 16 * j + 15;\r\n\t\t\tfor (k = 0; k < 16; k++) {\r\n\t\t\t\tif (k != 0 || j != 0) {\r\n\t\t\t\t\t*tbl++ = col;\r\n\t\t\t\t}\r\n\t\t\t\tif (col < max) {\r\n\t\t\t\t\tcol++;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmax = 0;\r\n\t\t\t\t\tcol = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (j = 16; j < 20; j++) {\r\n\t\t\tcol = 8 * j + (shade >> 1);\r\n\t\t\tmax = 8 * j + 7;\r\n\t\t\tfor (k = 0; k < 8; k++) {\r\n\t\t\t\t*tbl++ = col;\r\n\t\t\t\tif (col < max) {\r\n\t\t\t\t\tcol++;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmax = 0;\r\n\t\t\t\t\tcol = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (j = 10; j < 16; j++) {\r\n\t\t\tcol = 16 * j + shade;\r\n\t\t\tmax = 16 * j + 15;\r\n\t\t\tfor (k = 0; k < 16; k++) {\r\n\t\t\t\t*tbl++ = col;\r\n\t\t\t\tif (col < max) {\r\n\t\t\t\t\tcol++;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmax = 0;\r\n\t\t\t\t\tcol = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (col == 255) {\r\n\t\t\t\t\tmax = 0;\r\n\t\t\t\t\tcol = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (light4flag) {\r\n\t\t\tshade += 5;\r\n\t\t} else {\r\n\t\t\tshade++;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\t*tbl++ = 0;\r\n\t}\r\n\r\n\tif (leveltype == DTYPE_HELL) {\r\n\t\ttbl = pLightTbl;\r\n\t\tfor (i = 0; i < lights; i++) {\r\n\t\t\tl1 = lights - i;\r\n\t\t\tl2 = l1;\r\n\t\t\tdiv = lights / l1;\r\n\t\t\trem = lights % l1;\r\n\t\t\tcnt = 0;\r\n\t\t\tblood[0] = 0;\r\n\t\t\tcol = 1;\r\n\t\t\tfor (j = 1; j < 16; j++) {\r\n\t\t\t\tblood[j] = col;\r\n\t\t\t\tl2 += rem;\r\n\t\t\t\tif (l2 > l1 && j < 15) {\r\n\t\t\t\t\tj++;\r\n\t\t\t\t\tblood[j] = col;\r\n\t\t\t\t\tl2 -= l1;\r\n\t\t\t\t}\r\n\t\t\t\tcnt++;\r\n\t\t\t\tif (cnt == div) {\r\n\t\t\t\t\tcol++;\r\n\t\t\t\t\tcnt = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t*tbl++ = 0;\r\n\t\t\tfor (j = 1; j <= 15; j++) {\r\n\t\t\t\t*tbl++ = blood[j];\r\n\t\t\t}\r\n\t\t\tfor (j = 15; j > 0; j--) {\r\n\t\t\t\t*tbl++ = blood[j];\r\n\t\t\t}\r\n\t\t\t*tbl++ = 1;\r\n\t\t\ttbl += 224;\r\n\t\t}\r\n\t\t*tbl++ = 0;\r\n\t\tfor (j = 0; j < 31; j++) {\r\n\t\t\t*tbl++ = 1;\r\n\t\t}\r\n\t\ttbl += 224;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (currlevel >= 17) {\r\n\t\ttbl = pLightTbl;\r\n\t\tfor (i = 0; i < lights; i++) {\r\n\t\t\t*tbl++ = 0;\r\n\t\t\tfor (j = 1; j < 16; j++)\r\n\t\t\t\t*tbl++ = j;\r\n\t\t\ttbl += 240;\r\n\t\t}\r\n\t\t*tbl++ = 0;\r\n\t\tfor (j = 1; j < 16; j++)\r\n\t\t\t*tbl++ = 1;\r\n\t\ttbl += 240;\r\n\t}\r\n#endif\r\n\r\n\ttrn = LoadFileInMem(\"PlrGFX\\\\Infra.TRN\", NULL);\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\t*tbl++ = trn[i];\r\n\t}\r\n\tmem_free_dbg(trn);\r\n\r\n\ttrn = LoadFileInMem(\"PlrGFX\\\\Stone.TRN\", NULL);\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\t*tbl++ = trn[i];\r\n\t}\r\n\tmem_free_dbg(trn);\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tfor (col = 226; col < 239; col++) {\r\n\t\t\tif (i != 0 || col != 226) {\r\n\t\t\t\t*tbl++ = col;\r\n\t\t\t} else {\r\n\t\t\t\t*tbl++ = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\t*tbl++ = 0;\r\n\t\t*tbl++ = 0;\r\n\t\t*tbl++ = 0;\r\n\t}\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tcol = 224;\r\n\t\tfor (j = 224; j < 239; j += 2) {\r\n\t\t\t*tbl++ = col;\r\n\t\t\tcol += 2;\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < 6; i++) {\r\n\t\tfor (col = 224; col < 239; col++) {\r\n\t\t\t*tbl++ = col;\r\n\t\t}\r\n\t\t*tbl++ = 0;\r\n\t}\r\n\r\n\tfor (j = 0; j < 16; j++) {\r\n\t\tfor (i = 0; i < 128; i++) {\r\n\t\t\tif (i > (j + 1) * 8) {\r\n\t\t\t\tlightradius[j][i] = 15;\r\n\t\t\t} else {\r\n\t\t\t\tfs = (double)15 * i / ((double)8 * (j + 1));\r\n\t\t\t\tlightradius[j][i] = (BYTE)(fs + 0.5);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel >= 17) {\r\n\t\tfor (j = 0; j < 16; j++) {\r\n\t\t\tfa = (sqrt((double)(16 - j))) / 128;\r\n\t\t\tfa *= fa;\r\n\t\t\tfor (i = 0; i < 128; i++) {\r\n\t\t\t\tlightradius[15 - j][i] = 15 - (BYTE)(fa * (double)((128 - i) * (128 - i)));\r\n\t\t\t\tif (lightradius[15 - j][i] > 15)\r\n\t\t\t\t\tlightradius[15 - j][i] = 0;\r\n\t\t\t\tlightradius[15 - j][i] = lightradius[15 - j][i] - (BYTE)((15 - j) / 2);\r\n\t\t\t\tif (lightradius[15 - j][i] > 15)\r\n\t\t\t\t\tlightradius[15 - j][i] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\tfor (j = 0; j < 8; j++) {\r\n\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\tfor (k = 0; k < 16; k++) {\r\n\t\t\t\tfor (l = 0; l < 16; l++) {\r\n\t\t\t\t\tfs = (BYTE)sqrt((8 * l - j) * (8 * l - j) + (8 * k - i) * (8 * k - i));\r\n\t\t\t\t\tfs += fs < 0 ? -0.5 : 0.5;\r\n\r\n\t\t\t\t\t// BUGFIX: This error causes a \"jittery\" effect when a light source moves.\r\n\t\t\t\t\t// Swap the addition and multiplication operators to fix the lookup table.\r\n\t\t\t\t\t// lightblock[j + 8 * i][k][l] = fs;\r\n\t\t\t\t\tlightblock[j * 8 + i][k][l] = fs;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef _DEBUG\r\nvoid ToggleLighting_2()\r\n{\r\n\tint i;\r\n\r\n\tif (lightflag) {\r\n\t\tmemset(dLight, 0, sizeof(dLight));\r\n\t} else {\r\n\t\tmemset(dLight, lightmax, sizeof(dLight));\r\n\t\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\t\tif (plr[i].plractive && plr[i].plrlevel == currlevel) {\r\n\t\t\t\tDoLighting(plr[i]._px, plr[i]._py, plr[i]._pLightRad, -1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ToggleLighting()\r\n{\r\n\tint i;\r\n\r\n\tlightflag ^= TRUE;\r\n\r\n\tif (lightflag) {\r\n\t\tmemset(dLight, 0, sizeof(dLight));\r\n\t} else {\r\n\t\tmemcpy(dLight, dPreLight, sizeof(dLight));\r\n\t\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\t\tif (plr[i].plractive && plr[i].plrlevel == currlevel) {\r\n\t\t\t\tDoLighting(plr[i]._px, plr[i]._py, plr[i]._pLightRad, -1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid InitLightMax()\r\n{\r\n\tif (light4flag) {\r\n\t\tlightmax = 3;\r\n\t} else {\r\n\t\tlightmax = 15;\r\n\t}\r\n}\r\n\r\nvoid InitLighting()\r\n{\r\n\tint i;\r\n\r\n\tnumlights = 0;\r\n\tdolighting = FALSE;\r\n\tlightflag = FALSE;\r\n\r\n\tfor (i = 0; i < MAXLIGHTS; i++) {\r\n\t\tlightactive[i] = i;\r\n\t}\r\n}\r\n\r\nint AddLight(int x, int y, int r)\r\n{\r\n\tint lid;\r\n\r\n\tif (lightflag) {\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tlid = -1;\r\n\r\n\tif (numlights < MAXLIGHTS) {\r\n\t\tlid = lightactive[numlights++];\r\n\t\tLightList[lid]._lx = x;\r\n\t\tLightList[lid]._ly = y;\r\n\t\tLightList[lid]._lradius = r;\r\n\t\tLightList[lid]._xoff = 0;\r\n\t\tLightList[lid]._yoff = 0;\r\n\t\tLightList[lid]._ldel = FALSE;\r\n\t\tLightList[lid]._lunflag = FALSE;\r\n\t\tdolighting = TRUE;\r\n\t}\r\n\r\n\treturn lid;\r\n}\r\n\r\nvoid AddUnLight(int i)\r\n{\r\n\tif (lightflag || i == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tLightList[i]._ldel = TRUE;\r\n\tdolighting = TRUE;\r\n}\r\n\r\nvoid ChangeLightRadius(int i, int r)\r\n{\r\n\tif (lightflag || i == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tLightList[i]._lunflag = TRUE;\r\n\tLightList[i]._lunx = LightList[i]._lx;\r\n\tLightList[i]._luny = LightList[i]._ly;\r\n\tLightList[i]._lunr = LightList[i]._lradius;\r\n\tLightList[i]._lradius = r;\r\n\tdolighting = TRUE;\r\n}\r\n\r\nvoid ChangeLightXY(int i, int x, int y)\r\n{\r\n\tif (lightflag || i == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tLightList[i]._lunflag = TRUE;\r\n\tLightList[i]._lunx = LightList[i]._lx;\r\n\tLightList[i]._luny = LightList[i]._ly;\r\n\tLightList[i]._lunr = LightList[i]._lradius;\r\n\tLightList[i]._lx = x;\r\n\tLightList[i]._ly = y;\r\n\tdolighting = TRUE;\r\n}\r\n\r\nvoid ChangeLightOff(int i, int x, int y)\r\n{\r\n\tif (lightflag || i == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tLightList[i]._lunflag = TRUE;\r\n\tLightList[i]._lunx = LightList[i]._lx;\r\n\tLightList[i]._luny = LightList[i]._ly;\r\n\tLightList[i]._lunr = LightList[i]._lradius;\r\n\tLightList[i]._xoff = x;\r\n\tLightList[i]._yoff = y;\r\n\tdolighting = TRUE;\r\n}\r\n\r\nvoid ChangeLight(int i, int x, int y, int r)\r\n{\r\n\tif (lightflag || i == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tLightList[i]._lunflag = TRUE;\r\n\tLightList[i]._lunx = LightList[i]._lx;\r\n\tLightList[i]._luny = LightList[i]._ly;\r\n\tLightList[i]._lunr = LightList[i]._lradius;\r\n\tLightList[i]._lx = x;\r\n\tLightList[i]._ly = y;\r\n\tLightList[i]._lradius = r;\r\n\tdolighting = TRUE;\r\n}\r\n\r\nvoid ProcessLightList()\r\n{\r\n\tint i, j;\r\n\tBYTE temp;\r\n\r\n\tif (lightflag) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (dolighting) {\r\n\t\tfor (i = 0; i < numlights; i++) {\r\n\t\t\tj = lightactive[i];\r\n\t\t\tif (LightList[j]._ldel) {\r\n\t\t\t\tDoUnLight(LightList[j]._lx, LightList[j]._ly, LightList[j]._lradius);\r\n\t\t\t}\r\n\t\t\tif (LightList[j]._lunflag) {\r\n\t\t\t\tDoUnLight(LightList[j]._lunx, LightList[j]._luny, LightList[j]._lunr);\r\n\t\t\t\tLightList[j]._lunflag = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; i < numlights; i++) {\r\n\t\t\tj = lightactive[i];\r\n\t\t\tif (!LightList[j]._ldel) {\r\n\t\t\t\tDoLighting(LightList[j]._lx, LightList[j]._ly, LightList[j]._lradius, j);\r\n\t\t\t}\r\n\t\t}\r\n\t\ti = 0;\r\n\t\twhile (i < numlights) {\r\n\t\t\tif (LightList[lightactive[i]]._ldel) {\r\n\t\t\t\tnumlights--;\r\n\t\t\t\ttemp = lightactive[numlights];\r\n\t\t\t\tlightactive[numlights] = lightactive[i];\r\n\t\t\t\tlightactive[i] = temp;\r\n\t\t\t} else {\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdolighting = FALSE;\r\n}\r\n\r\nvoid SavePreLighting()\r\n{\r\n\tmemcpy(dPreLight, dLight, sizeof(dPreLight));\r\n}\r\n\r\nvoid InitVision()\r\n{\r\n\tint i;\r\n\r\n\tnumvision = 0;\r\n\tdovision = FALSE;\r\n\tvisionid = 1;\r\n\r\n\tfor (i = 0; i < TransVal; i++) {\r\n\t\tTransList[i] = FALSE;\r\n\t}\r\n}\r\n\r\nint AddVision(int x, int y, int r, BOOL mine)\r\n{\r\n\tint vid; // BUGFIX: if numvision >= MAXVISION behavior is undefined\r\n\r\n\tif (numvision < MAXVISION) {\r\n\t\tVisionList[numvision]._lx = x;\r\n\t\tVisionList[numvision]._ly = y;\r\n\t\tVisionList[numvision]._lradius = r;\r\n\t\tvid = visionid++;\r\n\t\tVisionList[numvision]._lid = vid;\r\n\t\tVisionList[numvision]._ldel = FALSE;\r\n\t\tVisionList[numvision]._lunflag = FALSE;\r\n\t\tVisionList[numvision]._lflags = mine != 0;\r\n\t\tnumvision++;\r\n\t\tdovision = TRUE;\r\n\t}\r\n\r\n\treturn vid;\r\n}\r\n\r\nvoid ChangeVisionRadius(int id, int r)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < numvision; i++) {\r\n\t\tif (VisionList[i]._lid == id) {\r\n\t\t\tVisionList[i]._lunflag = TRUE;\r\n\t\t\tVisionList[i]._lunx = VisionList[i]._lx;\r\n\t\t\tVisionList[i]._luny = VisionList[i]._ly;\r\n\t\t\tVisionList[i]._lunr = VisionList[i]._lradius;\r\n\t\t\tVisionList[i]._lradius = r;\r\n\t\t\tdovision = TRUE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ChangeVisionXY(int id, int x, int y)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < numvision; i++) {\r\n\t\tif (VisionList[i]._lid == id) {\r\n\t\t\tVisionList[i]._lunflag = TRUE;\r\n\t\t\tVisionList[i]._lunx = VisionList[i]._lx;\r\n\t\t\tVisionList[i]._luny = VisionList[i]._ly;\r\n\t\t\tVisionList[i]._lunr = VisionList[i]._lradius;\r\n\t\t\tVisionList[i]._lx = x;\r\n\t\t\tVisionList[i]._ly = y;\r\n\t\t\tdovision = TRUE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ProcessVisionList()\r\n{\r\n\tint i;\r\n\tBOOL delflag;\r\n\r\n\tif (dovision) {\r\n\t\tfor (i = 0; i < numvision; i++) {\r\n\t\t\tif (VisionList[i]._ldel) {\r\n\t\t\t\tDoUnVision(VisionList[i]._lx, VisionList[i]._ly, VisionList[i]._lradius);\r\n\t\t\t}\r\n\t\t\tif (VisionList[i]._lunflag) {\r\n\t\t\t\tDoUnVision(VisionList[i]._lunx, VisionList[i]._luny, VisionList[i]._lunr);\r\n\t\t\t\tVisionList[i]._lunflag = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; i < TransVal; i++) {\r\n\t\t\tTransList[i] = FALSE;\r\n\t\t}\r\n\t\tfor (i = 0; i < numvision; i++) {\r\n\t\t\tif (!VisionList[i]._ldel) {\r\n\t\t\t\tDoVision(\r\n\t\t\t\t    VisionList[i]._lx,\r\n\t\t\t\t    VisionList[i]._ly,\r\n\t\t\t\t    VisionList[i]._lradius,\r\n\t\t\t\t    VisionList[i]._lflags & 1,\r\n\t\t\t\t    VisionList[i]._lflags & 1);\r\n\t\t\t}\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tdelflag = FALSE;\r\n\t\t\tfor (i = 0; i < numvision; i++) {\r\n\t\t\t\tif (VisionList[i]._ldel) {\r\n\t\t\t\t\tnumvision--;\r\n\t\t\t\t\tif (numvision > 0 && i != numvision) {\r\n\t\t\t\t\t\tVisionList[i] = VisionList[numvision];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdelflag = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (delflag);\r\n\t}\r\n\r\n\tdovision = FALSE;\r\n}\r\n\r\nvoid lighting_color_cycling()\r\n{\r\n\tint i, j, l;\r\n\tBYTE col;\r\n\tBYTE *tbl;\r\n\r\n\tl = light4flag ? 4 : 16;\r\n\r\n\tif (leveltype != DTYPE_HELL) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttbl = pLightTbl;\r\n\r\n\tfor (j = 0; j < l; j++) {\r\n\t\ttbl++;\r\n\t\tcol = *tbl;\r\n\t\tfor (i = 0; i < 30; i++) {\r\n\t\t\ttbl[0] = tbl[1];\r\n\t\t\ttbl++;\r\n\t\t}\r\n\t\t*tbl = col;\r\n\t\ttbl += 225;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/lighting.h",
    "content": "/**\r\n * @file lighting.h\r\n *\r\n * Interface of light and vision.\r\n */\r\n#ifndef __LIGHTING_H__\r\n#define __LIGHTING_H__\r\n\r\nextern LightListStruct VisionList[MAXVISION];\r\nextern BYTE lightactive[MAXLIGHTS];\r\nextern LightListStruct LightList[MAXLIGHTS];\r\nextern int numlights;\r\nextern BYTE lightradius[16][128];\r\nextern BOOL dovision;\r\nextern int numvision;\r\nextern char lightmax;\r\nextern BOOL dolighting;\r\nextern int visionid;\r\nextern BYTE *pLightTbl;\r\nextern BOOL lightflag;\r\n\r\nvoid DoLighting(int nXPos, int nYPos, int nRadius, int Lnum);\r\nvoid DoUnVision(int nXPos, int nYPos, int nRadius);\r\nvoid DoVision(int nXPos, int nYPos, int nRadius, BOOL doautomap, BOOL visible);\r\nvoid FreeLightTable();\r\nvoid InitLightTable();\r\nvoid MakeLightTable();\r\n#ifdef _DEBUG\r\nvoid ToggleLighting_2();\r\nvoid ToggleLighting();\r\n#endif\r\nvoid InitLightMax();\r\nvoid InitLighting();\r\nint AddLight(int x, int y, int r);\r\nvoid AddUnLight(int i);\r\nvoid ChangeLightRadius(int i, int r);\r\nvoid ChangeLightXY(int i, int x, int y);\r\nvoid ChangeLightOff(int i, int x, int y);\r\nvoid ChangeLight(int i, int x, int y, int r);\r\nvoid ProcessLightList();\r\nvoid SavePreLighting();\r\nvoid InitVision();\r\nint AddVision(int x, int y, int r, BOOL mine);\r\nvoid ChangeVisionRadius(int id, int r);\r\nvoid ChangeVisionXY(int id, int x, int y);\r\nvoid ProcessVisionList();\r\nvoid lighting_color_cycling();\r\n\r\n/* rdata */\r\n\r\nextern char CrawlTable[2749];\r\nextern BYTE vCrawlTable[23][30];\r\n\r\n#endif /* __LIGHTING_H__ */\r\n"
  },
  {
    "path": "Source/list.h",
    "content": "/**\r\n * @file list.h\r\n * Intrusive double-linked list implementation,\r\n * based on https://github.com/webcoyote/coho/blob/master/Base/List.h\r\n */\r\n\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n#define OBJECT_NAME(obj) (((const char *)&typeid(obj)) + 8)\r\n\r\n/******************************************************************************\r\n *\r\n *   List definition macros\r\n *\r\n ***/\r\n\r\n/** Define a field within a structure that will be used to link it into a list */\r\n#define LIST_LINK(T) TLink<T>\r\n\r\ntemplate <class T>\r\nclass TLink;\r\n\r\n/******************************************************************************\r\n *\r\n *   TList\r\n *\r\n ***/\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\nclass TList {\r\npublic:\r\n\tTList();\r\n\t~TList();\r\n\r\n\tvoid UnlinkAll();\r\n\tvoid DeleteAll();\r\n\r\n\tT *Head();\r\n\r\n\tenum InsertPos {\r\n\t\tNONE = 0,\r\n\t\tAFTER,\r\n\t\tBEFORE\r\n\t};\r\n\r\n\tvoid Insert(T *node, InsertPos pos, T *ref);\r\n\tT *Remove(T *node);\r\n\tT *Create(InsertPos pos = BEFORE, size_t extra = 0, int memflags = 0);\r\n\r\nprivate:\r\n\tsize_t m_offset;\r\n\tTLink<T> m_link;\r\n\r\n\tTLink<T> *GetLinkFromNode(T *node) const;\r\n\r\n\t// Hide copy-constructor and assignment operator\r\n\tTList(const TList &);\r\n\tTList &operator=(const TList &);\r\n\r\n\tstatic __forceinline void SDelete(T *node)\r\n\t{\r\n\t\tSMemFree(node, (char *)OBJECT_NAME(T), SLOG_OBJECT, 0);\r\n\t}\r\n};\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\nTList<T>::~TList()\r\n{\r\n\t// BUGFIX: Unlinking does not free memory, should use DeleteAll()\r\n\tUnlinkAll();\r\n}\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\nTList<T>::TList()\r\n{\r\n\tsize_t offset = offsetof(T, m_Link);\r\n\t// Mark this node as the end of the list, with the link offset set\r\n\tm_link.m_prevLink = &m_link;\r\n\tm_offset = offset;\r\n\tm_link.m_nextNode = (T *)~((size_t)&m_link - offset);\r\n}\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\nvoid TList<T>::DeleteAll()\r\n{\r\n\twhile (T *node = m_link.Next()) {\r\n\t\tnode->Delete(0x0);\r\n\t\tSDelete(node);\r\n\t}\r\n}\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\n__forceinline T *TList<T>::Head()\r\n{\r\n\treturn m_link.Next();\r\n}\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\n__forceinline TLink<T> *TList<T>::GetLinkFromNode(T *node) const\r\n{\r\n\t//    assert(m_offset != (size_t) -1);\r\n\t//    return (TLink<T> *) ((size_t) node + m_offset);\r\n\treturn &node->m_Link;\r\n}\r\n\r\ntemplate <class T>\r\nT *TList<T>::Remove(T *node)\r\n{\r\n\tTLink<T> *link = node ? &node->m_Link : &m_link;\r\n\tT *next = link->Next();\r\n\tnode->Delete(0x0);\r\n\tSDelete(node);\r\n\treturn next;\r\n}\r\n\r\ntemplate <class T>\r\nT *TList<T>::Create(InsertPos pos, size_t extra, int memflags)\r\n{\r\n\tT *node = new (extra, memflags) T;\r\n\tif (pos != NONE)\r\n\t\tInsert(node, pos, NULL);\r\n\treturn node;\r\n}\r\n\r\ntemplate <class T>\r\nvoid TList<T>::Insert(T *node, InsertPos pos, T *ref)\r\n{\r\n\tTLink<T> *reflink;\r\n\tTLink<T> *i = node ? GetLinkFromNode(node) : &m_link;\r\n\tif (i->IsLinked())\r\n\t\ti->Unlink();\r\n\r\n\treflink = ref ? GetLinkFromNode(ref) : &m_link;\r\n\r\n\tswitch (pos) {\r\n\tcase AFTER:\r\n\t\ti->InsertAfter(node, reflink, m_offset);\r\n\t\tbreak;\r\n\tcase BEFORE:\r\n\t\ti->InsertBefore(node, reflink);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\nvoid TList<T>::UnlinkAll()\r\n{\r\n\tfor (;;) {\r\n\t\tT *node = m_link.Next();\r\n\t\tif ((int)node <= 0)\r\n\t\t\tbreak;\r\n\t\tnode->m_Link.Unlink();\r\n\t}\r\n}\r\n\r\n/******************************************************************************\r\n *\r\n *   TLink\r\n *\r\n ***/\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\nclass TLink {\r\npublic:\r\n\tTLink()\r\n\t    : m_prevLink(NULL)\r\n\t    , m_nextNode(NULL)\r\n\t{\r\n\t}\r\n\t~TLink()\r\n\t{\r\n\t\tUnlink();\r\n\t}\r\n\r\n\tbool IsLinked() const\r\n\t{\r\n\t\treturn m_prevLink != NULL;\r\n\t}\r\n\tvoid Unlink();\r\n\r\n\tT *Next()\r\n\t{\r\n\t\tif ((ptrdiff_t)m_nextNode <= 0)\r\n\t\t\treturn NULL;\r\n\t\treturn m_nextNode;\r\n\t}\r\n\r\n\tTLink<T> *NextLink(size_t offset = -1)\r\n\t{\r\n\t\tif ((ptrdiff_t)m_nextNode <= 0)\r\n\t\t\treturn (TLink<T> *)~((size_t)m_nextNode);\r\n\r\n\t\tif ((int)offset < 0) {\r\n\t\t\t// Calculate the offset from a node pointer to a link structure\r\n\t\t\toffset = (size_t)this - (size_t)m_prevLink->m_nextNode;\r\n\t\t}\r\n\r\n\t\t// Get the link field for the next node\r\n\t\treturn (TLink<T> *)((size_t)m_nextNode + offset);\r\n\t}\r\n\r\n\tvoid InsertBefore(T *node, TLink<T> *nextLink)\r\n\t{\r\n\t\tTLink<T> *p = nextLink->m_prevLink;\r\n\t\tm_prevLink = p;\r\n\t\tm_nextNode = p->m_nextNode;\r\n\r\n\t\tp->m_nextNode = node;\r\n\t\tnextLink->m_prevLink = this;\r\n\t}\r\n\r\n\t__forceinline void InsertAfter(T *node, TLink<T> *prevLink, const size_t &offset)\r\n\t{\r\n\t\tm_prevLink = prevLink;\r\n\t\tm_nextNode = prevLink->m_nextNode;\r\n\r\n\t\tprevLink->NextLink(offset)->m_prevLink = this;\r\n\t\tprevLink->m_nextNode = node;\r\n\t}\r\n\r\nprivate:\r\n\tTLink<T> *m_prevLink; // pointer to the previous >link field<\r\n\tT *m_nextNode;        // pointer to the next >object<\r\n\r\n\t// Hide copy-constructor and assignment operator\r\n\tTLink(const TLink &);\r\n\tTLink &operator=(const TLink &);\r\n\r\n\tfriend class TList<T>;\r\n};\r\n\r\n//=============================================================================\r\ntemplate <class T>\r\nvoid TLink<T>::Unlink()\r\n{\r\n\tif (IsLinked()) {\r\n\t\tNextLink()->m_prevLink = m_prevLink;\r\n\t\tm_prevLink->m_nextNode = m_nextNode;\r\n\r\n\t\tm_prevLink = NULL;\r\n\t\tm_nextNode = NULL;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/loadsave.cpp",
    "content": "/**\r\n * @file loadsave.cpp\r\n *\r\n * Implementation of save game functionality.\r\n */\r\n#include \"all.h\"\r\n\r\nBYTE *tbuff;\r\n\r\nstatic char BLoad()\r\n{\r\n\treturn *tbuff++;\r\n}\r\n\r\nstatic int WLoad()\r\n{\r\n\tint rv = *tbuff++ << 24;\r\n\trv |= *tbuff++ << 16;\r\n\trv |= *tbuff++ << 8;\r\n\trv |= *tbuff++;\r\n\r\n\treturn rv;\r\n}\r\n\r\nstatic int ILoad()\r\n{\r\n\tint rv = *tbuff++ << 24;\r\n\trv |= *tbuff++ << 16;\r\n\trv |= *tbuff++ << 8;\r\n\trv |= *tbuff++;\r\n\r\n\treturn rv;\r\n}\r\n\r\nstatic BOOL OLoad()\r\n{\r\n\tif (*tbuff++ == TRUE)\r\n\t\treturn TRUE;\r\n\telse\r\n\t\treturn FALSE;\r\n}\r\n\r\nstatic void LoadPlayer(int i)\r\n{\r\n\tmemcpy(&plr[i], tbuff, sizeof(*plr) - (10 * sizeof(void *)));\r\n\ttbuff += sizeof(*plr) - (10 * sizeof(void *)); // omit last 10 pointers\r\n}\r\n\r\nstatic void LoadMonster(int i)\r\n{\r\n\tmemcpy(&monster[i], tbuff, sizeof(*monster) - (3 * sizeof(void *)));\r\n\ttbuff += sizeof(*monster) - (3 * sizeof(void *)); // omit last 3 pointers\r\n\tSyncMonsterAnim(i);\r\n}\r\n\r\nstatic void LoadMissile(int i)\r\n{\r\n\tmemcpy(&missile[i], tbuff, sizeof(*missile));\r\n\ttbuff += sizeof(*missile);\r\n}\r\n\r\nstatic void LoadObject(int i)\r\n{\r\n\tmemcpy(&object[i], tbuff, sizeof(*object));\r\n\ttbuff += sizeof(*object);\r\n}\r\n\r\nstatic void LoadItem(int i)\r\n{\r\n\tmemcpy(&item[i], tbuff, sizeof(*item));\r\n\ttbuff += sizeof(*item);\r\n\tGetItemFrm(i);\r\n}\r\n\r\nstatic void LoadPremium(int i)\r\n{\r\n\tmemcpy(&premiumitem[i], tbuff, sizeof(*premiumitem));\r\n\ttbuff += sizeof(*premiumitem);\r\n}\r\n\r\nstatic void LoadQuest(int i)\r\n{\r\n\tmemcpy(&quests[i], tbuff, sizeof(*quests));\r\n\ttbuff += sizeof(*quests);\r\n\tReturnLvlX = WLoad();\r\n\tReturnLvlY = WLoad();\r\n\tReturnLvl = WLoad();\r\n\tReturnLvlT = WLoad();\r\n\tDoomQuestState = WLoad();\r\n}\r\n\r\nstatic void LoadLighting(int i)\r\n{\r\n\tmemcpy(&LightList[i], tbuff, sizeof(*LightList));\r\n\ttbuff += sizeof(*LightList);\r\n}\r\n\r\nstatic void LoadVision(int i)\r\n{\r\n\tmemcpy(&VisionList[i], tbuff, sizeof(*VisionList));\r\n\ttbuff += sizeof(*VisionList);\r\n}\r\n\r\nstatic void LoadPortal(int i)\r\n{\r\n\tmemcpy(&portal[i], tbuff, sizeof(*portal));\r\n\ttbuff += sizeof(*portal);\r\n}\r\n\r\n/**\r\n * @brief Load game state\r\n * @param firstflag Can be set to false if we are simply reloading the current game\r\n */\r\nvoid LoadGame(BOOL firstflag)\r\n{\r\n\tint i, j;\r\n\tDWORD dwLen;\r\n\tchar szName[MAX_PATH];\r\n\tBYTE *LoadBuff;\r\n\tint _ViewX, _ViewY, _nummonsters, _numitems, _nummissiles, _nobjects;\r\n\r\n\tFreeGameMem();\r\n\tpfile_remove_temp_files();\r\n\tpfile_get_game_name(szName);\r\n\tLoadBuff = pfile_read(szName, &dwLen);\r\n\ttbuff = LoadBuff;\r\n\r\n#ifdef HELLFIRE\r\n\tif (ILoad() != 'HELF')\r\n#elif defined(SPAWN)\r\n\tif (ILoad() != 'SHAR')\r\n#else\r\n\tif (ILoad() != 'RETL')\r\n#endif\r\n\t\tapp_fatal(\"Invalid save file\");\r\n\r\n\tsetlevel = OLoad();\r\n\tsetlvlnum = WLoad();\r\n\tcurrlevel = WLoad();\r\n\tleveltype = WLoad();\r\n\t_ViewX = WLoad();\r\n\t_ViewY = WLoad();\r\n\tinvflag = OLoad();\r\n\tchrflag = OLoad();\r\n\t_nummonsters = WLoad();\r\n\t_numitems = WLoad();\r\n\t_nummissiles = WLoad();\r\n\t_nobjects = WLoad();\r\n\r\n\tfor (i = 0; i < NUMLEVELS; i++) {\r\n\t\tglSeedTbl[i] = ILoad();\r\n\t\tgnLevelTypeTbl[i] = WLoad();\r\n\t}\r\n\r\n\tLoadPlayer(myplr);\r\n\r\n#ifdef HELLFIRE\r\n\tgnDifficulty = plr[myplr].pDifficulty;\r\n\tif (gnDifficulty < DIFF_NORMAL || gnDifficulty > DIFF_HELL)\r\n\t\tgnDifficulty = DIFF_NORMAL;\r\n#endif\r\n\tfor (i = 0; i < MAXQUESTS; i++)\r\n\t\tLoadQuest(i);\r\n\tfor (i = 0; i < MAXPORTAL; i++)\r\n\t\tLoadPortal(i);\r\n\r\n\tLoadGameLevel(firstflag, ENTRY_LOAD);\r\n\tSyncInitPlr(myplr);\r\n\tSyncPlrAnim(myplr);\r\n\r\n\tViewX = _ViewX;\r\n\tViewY = _ViewY;\r\n\tnummonsters = _nummonsters;\r\n\tnumitems = _numitems;\r\n\tnummissiles = _nummissiles;\r\n\tnobjects = _nobjects;\r\n\r\n\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\tmonstkills[i] = ILoad();\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\t\tmonstactive[i] = WLoad();\r\n\t\tfor (i = 0; i < nummonsters; i++)\r\n\t\t\tLoadMonster(monstactive[i]);\r\n\t\tfor (i = 0; i < MAXMISSILES; i++)\r\n\t\t\tmissileactive[i] = BLoad();\r\n\t\tfor (i = 0; i < MAXMISSILES; i++)\r\n\t\t\tmissileavail[i] = BLoad();\r\n\t\tfor (i = 0; i < nummissiles; i++)\r\n\t\t\tLoadMissile(missileactive[i]);\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tobjectactive[i] = BLoad();\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tobjectavail[i] = BLoad();\r\n\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\tLoadObject(objectactive[i]);\r\n\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\tSyncObjectAnim(objectactive[i]);\r\n\r\n\t\tnumlights = WLoad();\r\n\r\n\t\tfor (i = 0; i < MAXLIGHTS; i++)\r\n\t\t\tlightactive[i] = BLoad();\r\n\t\tfor (i = 0; i < numlights; i++)\r\n\t\t\tLoadLighting(lightactive[i]);\r\n\r\n\t\tvisionid = WLoad();\r\n\t\tnumvision = WLoad();\r\n\r\n\t\tfor (i = 0; i < numvision; i++)\r\n\t\t\tLoadVision(i);\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\titemactive[i] = BLoad();\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\titemavail[i] = BLoad();\r\n\tfor (i = 0; i < numitems; i++)\r\n\t\tLoadItem(itemactive[i]);\r\n\tfor (i = 0; i < 128; i++)\r\n\t\tUniqueItemFlag[i] = OLoad();\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tdLight[i][j] = BLoad();\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tdFlags[i][j] = BLoad();\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tdPlayer[i][j] = BLoad();\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tdItem[i][j] = BLoad();\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdMonster[i][j] = WLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdDead[i][j] = BLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdObject[i][j] = BLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdLight[i][j] = BLoad(); // BUGFIX: dLight got loaded already\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdPreLight[i][j] = BLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < DMAXY; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX; i++)\r\n\t\t\t\tautomapview[i][j] = OLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdMissile[i][j] = BLoad();\r\n\t\t}\r\n\t}\r\n\r\n\tnumpremium = WLoad();\r\n\tpremiumlevel = WLoad();\r\n\r\n\tfor (i = 0; i < SMITH_PREMIUM_ITEMS; i++)\r\n\t\tLoadPremium(i);\r\n\r\n\tautomapflag = OLoad();\r\n\tAutoMapScale = WLoad();\r\n\tmem_free_dbg(LoadBuff);\r\n\tAutomapZoomReset();\r\n\tResyncQuests();\r\n\r\n\tif (leveltype != DTYPE_TOWN)\r\n\t\tProcessLightList();\r\n\r\n\tRedoPlayerVision();\r\n\tProcessVisionList();\r\n\tmissiles_process_charge();\r\n\tResetPal();\r\n\tSetCursor_(CURSOR_HAND);\r\n\tgbProcessPlayers = TRUE;\r\n}\r\n\r\nstatic void BSave(char v)\r\n{\r\n\t*tbuff++ = v;\r\n}\r\n\r\nstatic void WSave(int v)\r\n{\r\n\t*tbuff++ = v >> 24;\r\n\t*tbuff++ = v >> 16;\r\n\t*tbuff++ = v >> 8;\r\n\t*tbuff++ = v;\r\n}\r\n\r\nstatic void ISave(int v)\r\n{\r\n\t*tbuff++ = v >> 24;\r\n\t*tbuff++ = v >> 16;\r\n\t*tbuff++ = v >> 8;\r\n\t*tbuff++ = v;\r\n}\r\n\r\nstatic void OSave(BOOL v)\r\n{\r\n\tif (v != FALSE)\r\n\t\t*tbuff++ = TRUE;\r\n\telse\r\n\t\t*tbuff++ = FALSE;\r\n}\r\n\r\nstatic void SavePlayer(int i)\r\n{\r\n\tmemcpy(tbuff, &plr[i], sizeof(*plr) - (10 * sizeof(void *)));\r\n\ttbuff += sizeof(*plr) - (10 * sizeof(void *)); // omit last 10 pointers\r\n}\r\n\r\nstatic void SaveMonster(int i)\r\n{\r\n\tmemcpy(tbuff, &monster[i], sizeof(*monster) - (3 * sizeof(void *)));\r\n\ttbuff += sizeof(*monster) - (3 * sizeof(void *)); // omit last 3 pointers\r\n}\r\n\r\nstatic void SaveMissile(int i)\r\n{\r\n\tmemcpy(tbuff, &missile[i], sizeof(*missile));\r\n\ttbuff += sizeof(*missile);\r\n}\r\n\r\nstatic void SaveObject(int i)\r\n{\r\n\tmemcpy(tbuff, &object[i], sizeof(*object));\r\n\ttbuff += sizeof(*object);\r\n}\r\n\r\nstatic void SaveItem(int i)\r\n{\r\n\tmemcpy(tbuff, &item[i], sizeof(*item));\r\n\ttbuff += sizeof(*item);\r\n}\r\n\r\nstatic void SavePremium(int i)\r\n{\r\n\tmemcpy(tbuff, &premiumitem[i], sizeof(*premiumitem));\r\n\ttbuff += sizeof(*premiumitem);\r\n}\r\n\r\nstatic void SaveQuest(int i)\r\n{\r\n\tmemcpy(tbuff, &quests[i], sizeof(*quests));\r\n\ttbuff += sizeof(*quests);\r\n\tWSave(ReturnLvlX);\r\n\tWSave(ReturnLvlY);\r\n\tWSave(ReturnLvl);\r\n\tWSave(ReturnLvlT);\r\n\tWSave(DoomQuestState);\r\n}\r\n\r\nstatic void SaveLighting(int i)\r\n{\r\n\tmemcpy(tbuff, &LightList[i], sizeof(*LightList));\r\n\ttbuff += sizeof(*LightList);\r\n}\r\n\r\nstatic void SaveVision(int i)\r\n{\r\n\tmemcpy(tbuff, &VisionList[i], sizeof(*VisionList));\r\n\ttbuff += sizeof(*VisionList);\r\n}\r\n\r\nstatic void SavePortal(int i)\r\n{\r\n\tmemcpy(tbuff, &portal[i], sizeof(*portal));\r\n\ttbuff += sizeof(*portal);\r\n}\r\n\r\nvoid SaveGame()\r\n{\r\n\tint i, j;\r\n\tchar szName[MAX_PATH];\r\n\r\n\tDWORD dwLen = codec_get_encoded_len(FILEBUFF);\r\n\tBYTE *SaveBuff = DiabloAllocPtr(dwLen);\r\n\ttbuff = SaveBuff;\r\n\r\n#ifdef HELLFIRE\r\n\tISave('HELF');\r\n#elif defined(SPAWN)\r\n\tISave('SHAR');\r\n#else\r\n\tISave('RETL');\r\n#endif\r\n\tOSave(setlevel);\r\n\tWSave(setlvlnum);\r\n\tWSave(currlevel);\r\n\tWSave(leveltype);\r\n\tWSave(ViewX);\r\n\tWSave(ViewY);\r\n\tOSave(invflag);\r\n\tOSave(chrflag);\r\n\tWSave(nummonsters);\r\n\tWSave(numitems);\r\n\tWSave(nummissiles);\r\n\tWSave(nobjects);\r\n\r\n\tfor (i = 0; i < NUMLEVELS; i++) {\r\n\t\tISave(glSeedTbl[i]);\r\n\t\tWSave(gnLevelTypeTbl[i]);\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tplr[myplr].pDifficulty = gnDifficulty;\r\n#endif\r\n\tSavePlayer(myplr);\r\n\r\n\tfor (i = 0; i < MAXQUESTS; i++)\r\n\t\tSaveQuest(i);\r\n\tfor (i = 0; i < MAXPORTAL; i++)\r\n\t\tSavePortal(i);\r\n\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\tISave(monstkills[i]);\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\t\tWSave(monstactive[i]);\r\n\t\tfor (i = 0; i < nummonsters; i++)\r\n\t\t\tSaveMonster(monstactive[i]);\r\n\t\tfor (i = 0; i < MAXMISSILES; i++)\r\n\t\t\tBSave(missileactive[i]);\r\n\t\tfor (i = 0; i < MAXMISSILES; i++)\r\n\t\t\tBSave(missileavail[i]);\r\n\t\tfor (i = 0; i < nummissiles; i++)\r\n\t\t\tSaveMissile(missileactive[i]);\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tBSave(objectactive[i]);\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tBSave(objectavail[i]);\r\n\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\tSaveObject(objectactive[i]);\r\n\r\n\t\tWSave(numlights);\r\n\r\n\t\tfor (i = 0; i < MAXLIGHTS; i++)\r\n\t\t\tBSave(lightactive[i]);\r\n\t\tfor (i = 0; i < numlights; i++)\r\n\t\t\tSaveLighting(lightactive[i]);\r\n\r\n\t\tWSave(visionid);\r\n\t\tWSave(numvision);\r\n\r\n\t\tfor (i = 0; i < numvision; i++)\r\n\t\t\tSaveVision(i);\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\tBSave(itemactive[i]);\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\tBSave(itemavail[i]);\r\n\tfor (i = 0; i < numitems; i++)\r\n\t\tSaveItem(itemactive[i]);\r\n\tfor (i = 0; i < 128; i++)\r\n\t\tOSave(UniqueItemFlag[i]);\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tBSave(dLight[i][j]);\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tBSave(dFlags[i][j] & ~(BFLAG_MISSILE | BFLAG_VISIBLE | BFLAG_DEAD_PLAYER));\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tBSave(dPlayer[i][j]);\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tBSave(dItem[i][j]);\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tWSave(dMonster[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dDead[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dObject[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dLight[i][j]); // BUGFIX: dLight got saved already\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dPreLight[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < DMAXY; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX; i++)\r\n\t\t\t\tOSave(automapview[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dMissile[i][j]);\r\n\t\t}\r\n\t}\r\n\r\n\tWSave(numpremium);\r\n\tWSave(premiumlevel);\r\n\r\n\tfor (i = 0; i < SMITH_PREMIUM_ITEMS; i++)\r\n\t\tSavePremium(i);\r\n\r\n\tOSave(automapflag);\r\n\tWSave(AutoMapScale);\r\n\tpfile_get_game_name(szName);\r\n\tdwLen = codec_get_encoded_len(tbuff - SaveBuff);\r\n\tpfile_write_save_file(szName, SaveBuff, tbuff - SaveBuff, dwLen);\r\n\tmem_free_dbg(SaveBuff);\r\n\tgbValidSaveFile = TRUE;\r\n\tpfile_rename_temp_to_perm();\r\n\tpfile_write_hero();\r\n}\r\n\r\nvoid SaveLevel()\r\n{\r\n\tint i, j;\r\n\tchar szName[MAX_PATH];\r\n\tint dwLen;\r\n\tBYTE *SaveBuff;\r\n\r\n\tif (currlevel == 0)\r\n\t\tglSeedTbl[0] = GetRndSeed();\r\n\r\n\tdwLen = codec_get_encoded_len(FILEBUFF);\r\n\tSaveBuff = DiabloAllocPtr(dwLen);\r\n\ttbuff = SaveBuff;\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dDead[i][j]);\r\n\t\t}\r\n\t}\r\n\r\n\tWSave(nummonsters);\r\n\tWSave(numitems);\r\n\tWSave(nobjects);\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\t\tWSave(monstactive[i]);\r\n\t\tfor (i = 0; i < nummonsters; i++)\r\n\t\t\tSaveMonster(monstactive[i]);\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tBSave(objectactive[i]);\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tBSave(objectavail[i]);\r\n\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\tSaveObject(objectactive[i]);\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\tBSave(itemactive[i]);\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\tBSave(itemavail[i]);\r\n\tfor (i = 0; i < numitems; i++)\r\n\t\tSaveItem(itemactive[i]);\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tBSave(dFlags[i][j] & ~(BFLAG_MISSILE | BFLAG_VISIBLE | BFLAG_DEAD_PLAYER));\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tBSave(dItem[i][j]);\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tWSave(dMonster[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dObject[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dLight[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dPreLight[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < DMAXY; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX; i++)\r\n\t\t\t\tOSave(automapview[i][j]);\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tBSave(dMissile[i][j]);\r\n\t\t}\r\n\t}\r\n\r\n\tGetTempLevelNames(szName);\r\n\tdwLen = codec_get_encoded_len(tbuff - SaveBuff);\r\n\tpfile_write_save_file(szName, SaveBuff, tbuff - SaveBuff, dwLen);\r\n\tmem_free_dbg(SaveBuff);\r\n\r\n\tif (!setlevel)\r\n\t\tplr[myplr]._pLvlVisited[currlevel] = TRUE;\r\n\telse\r\n\t\tplr[myplr]._pSLvlVisited[setlvlnum] = TRUE;\r\n}\r\n\r\nvoid LoadLevel()\r\n{\r\n\tint i, j;\r\n\tDWORD dwLen;\r\n\tchar szName[MAX_PATH];\r\n\tBYTE *LoadBuff;\r\n\r\n\tGetPermLevelNames(szName);\r\n\tLoadBuff = pfile_read(szName, &dwLen);\r\n\ttbuff = LoadBuff;\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdDead[i][j] = BLoad();\r\n\t\t}\r\n\t\tSyncUniqDead();\r\n\t}\r\n\r\n\tnummonsters = WLoad();\r\n\tnumitems = WLoad();\r\n\tnobjects = WLoad();\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\t\tmonstactive[i] = WLoad();\r\n\t\tfor (i = 0; i < nummonsters; i++)\r\n\t\t\tLoadMonster(monstactive[i]);\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tobjectactive[i] = BLoad();\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++)\r\n\t\t\tobjectavail[i] = BLoad();\r\n\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\tLoadObject(objectactive[i]);\r\n\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\tSyncObjectAnim(objectactive[i]);\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\titemactive[i] = BLoad();\r\n\tfor (i = 0; i < MAXITEMS; i++)\r\n\t\titemavail[i] = BLoad();\r\n\tfor (i = 0; i < numitems; i++)\r\n\t\tLoadItem(itemactive[i]);\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tdFlags[i][j] = BLoad();\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\tdItem[i][j] = BLoad();\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdMonster[i][j] = WLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdObject[i][j] = BLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdLight[i][j] = BLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdPreLight[i][j] = BLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < DMAXY; j++) {\r\n\t\t\tfor (i = 0; i < DMAXX; i++)\r\n\t\t\t\tautomapview[i][j] = OLoad();\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++)\r\n\t\t\t\tdMissile[i][j] = 0; /// BUGFIX: supposed to load saved missiles with \"BLoad()\"?\r\n\t\t}\r\n\t}\r\n\r\n\tAutomapZoomReset();\r\n\tResyncQuests();\r\n\tSyncPortals();\r\n\tdolighting = TRUE;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (plr[i].plractive && currlevel == plr[i].plrlevel)\r\n\t\t\tLightList[plr[i]._plid]._lunflag = TRUE;\r\n\t}\r\n\r\n\tmem_free_dbg(LoadBuff);\r\n}\r\n"
  },
  {
    "path": "Source/loadsave.h",
    "content": "/**\r\n * @file loadsave.h\r\n *\r\n * Interface of save game functionality.\r\n */\r\n#ifndef __LOADSAVE_H__\r\n#define __LOADSAVE_H__\r\n\r\nvoid LoadGame(BOOL firstflag);\r\nvoid SaveGame();\r\nvoid SaveLevel();\r\nvoid LoadLevel();\r\n\r\n#endif /* __LOADSAVE_H__ */\r\n"
  },
  {
    "path": "Source/logging.cpp",
    "content": "/**\r\n * @file logging.cpp\r\n *\r\n * Implementation of logging functionality.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nstatic CCritSect sgMemCrit;\r\nCHAR FileName[MAX_PATH];\r\nchar log_buffer[388];\r\nLPCVOID lpAddress;\r\nDWORD nNumberOfBytesToWrite;\r\n\r\n/* data */\r\n\r\n/** Has the log file not yet been created. */\r\nBOOL log_not_created = TRUE;\r\n/** Handle to the log file. */\r\nHANDLE log_file = INVALID_HANDLE_VALUE;\r\n\r\nstatic void log_get_version(VS_FIXEDFILEINFO *file_info)\r\n{\r\n\tDWORD size, len, dwHandle;\r\n\tunsigned int puLen;\r\n\tvoid *version;\r\n\tchar Filename[MAX_PATH];\r\n\tLPVOID lpBuffer;\r\n\r\n\tmemset(file_info, 0, sizeof(*file_info));\r\n\tif (GetModuleFileName(0, Filename, sizeof(Filename))) {\r\n\t\tsize = GetFileVersionInfoSize(Filename, &dwHandle);\r\n\t\tif (size) {\r\n\t\t\tversion = VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);\r\n\t\t\tif (GetFileVersionInfo(Filename, 0, size, version) && VerQueryValue(version, \"\\\\\", &lpBuffer, &puLen)) {\r\n\t\t\t\tlen = puLen;\r\n\t\t\t\tif (puLen >= 52)\r\n\t\t\t\t\tlen = 52;\r\n\t\t\t\tmemcpy(file_info, lpBuffer, len);\r\n\t\t\t}\r\n\t\t\tVirtualFree(version, 0, MEM_RELEASE);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic HANDLE log_create()\r\n{\r\n\tchar *last_slash_pos;\r\n\tHANDLE fh;\r\n\tVS_FIXEDFILEINFO file_info;\r\n\tDWORD i;\r\n\tchar buf[32];\r\n\r\n\tif (log_not_created) {\r\n\t\tchar filename_tmp[MAX_PATH];\r\n\t\tif (GetModuleFileName(NULL, filename_tmp, sizeof filename_tmp) == 0)\r\n\t\t\tfilename_tmp[0] = '\\0';\r\n\t\telse {\r\n\t\t\tlast_slash_pos = strrchr(filename_tmp, '\\\\');\r\n\t\t\tif (last_slash_pos == NULL)\r\n\t\t\t\tfilename_tmp[0] = '\\0';\r\n\t\t\telse\r\n\t\t\t\t*(last_slash_pos + 1) = '\\0';\r\n\t\t}\r\n\t\ti = 32;\r\n\t\tif (!GetUserName(buf, &i))\r\n\t\t\tbuf[0] = '\\0';\r\n\t\tlog_get_version(&file_info);\r\n\t\t_snprintf(\r\n\t\t    FileName,\r\n\t\t    sizeof(filename_tmp),\r\n\t\t    \"%s%s%02u%02u%02u.ERR\",\r\n\t\t    filename_tmp,\r\n\t\t    buf,\r\n\t\t    file_info.dwProductVersionMS & 0xFFFF,\r\n\t\t    file_info.dwProductVersionLS >> 16,\r\n\t\t    file_info.dwProductVersionLS & 0xFFFF);\r\n\t}\r\n\tfh = INVALID_HANDLE_VALUE;\r\n\tfor (i = log_not_created ? 0 : 1; (int)i < 2; i++) {\r\n\t\tfh = CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);\r\n\t\tif (fh != INVALID_HANDLE_VALUE) {\r\n\t\t\tif (GetFileSize(fh, NULL) > 0x10000)\r\n\t\t\t\tSetEndOfFile(fh);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tlast_slash_pos = strrchr(FileName, '\\\\');\r\n\t\tif (!last_slash_pos)\r\n\t\t\tlast_slash_pos = FileName;\r\n\t\tchar filename_tmp[MAX_PATH] = \"c:\\\\\";\r\n\t\tstrcat(filename_tmp, last_slash_pos);\r\n\t\tstrcpy(FileName, filename_tmp);\r\n\t}\r\n\tlog_not_created = FALSE;\r\n\treturn fh;\r\n}\r\n\r\nvoid __cdecl log_flush(BOOL force_close)\r\n{\r\n\tDWORD NumberOfBytesWritten;\r\n\r\n\tsgMemCrit.Enter();\r\n\tif (nNumberOfBytesToWrite) {\r\n\t\tif (log_file == INVALID_HANDLE_VALUE) {\r\n\t\t\tlog_file = log_create();\r\n\t\t\tif (log_file == INVALID_HANDLE_VALUE) {\r\n\t\t\t\tnNumberOfBytesToWrite = 0;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tSetFilePointer(log_file, 0, NULL, FILE_END);\r\n\t\t}\r\n\t\tWriteFile(log_file, lpAddress, nNumberOfBytesToWrite, &NumberOfBytesWritten, 0);\r\n\t\tnNumberOfBytesToWrite = 0;\r\n\t}\r\n\tif (force_close && log_file != INVALID_HANDLE_VALUE) {\r\n\t\tCloseHandle(log_file);\r\n\t\tlog_file = INVALID_HANDLE_VALUE;\r\n\t}\r\n\tsgMemCrit.Leave();\r\n}\r\n\r\nvoid __cdecl log_printf(const char *pszFmt, ...)\r\n{\r\n#ifdef HELLFIRE\r\n\tCHAR Buffer[1024];\r\n\tDWORD NumberOfBytesWritten, nNumberOfBytesToWrite;\r\n\tva_list va;\r\n\r\n\tva_start(va, pszFmt);\r\n\tnNumberOfBytesToWrite = wvsprintf(Buffer, va_arg(va, const CHAR *), va);\r\n\tWriteFile((HANDLE)pszFmt, Buffer, nNumberOfBytesToWrite, &NumberOfBytesWritten, 0);\r\n\tva_end(va);\r\n#else\r\n\tsize_t size;\r\n\tchar *pBuffer;\r\n\tchar msg[512];\r\n\tva_list va;\r\n\r\n\tsgMemCrit.Enter();\r\n\tva_start(va, pszFmt);\r\n\t_vsnprintf(msg, 0x200, pszFmt, va);\r\n\tva_end(va);\r\n\tmsg[511] = 0;\r\n\tsize = strlen(msg);\r\n\tif (size + nNumberOfBytesToWrite > 0x1000) {\r\n\t\tlog_flush(FALSE);\r\n\t}\r\n\r\n\tif (lpAddress == NULL) {\r\n\t\tlpAddress = (char *)VirtualAlloc((LPVOID)lpAddress, 0x1000, MEM_COMMIT, PAGE_READWRITE);\r\n\t\tpBuffer = (char *)lpAddress;\r\n\t\tnNumberOfBytesToWrite = 0;\r\n\t}\r\n\tif (lpAddress != NULL) {\r\n\t\tpBuffer = (char *)lpAddress;\r\n\t\tmemcpy(&pBuffer[nNumberOfBytesToWrite], msg, size);\r\n\t\tnNumberOfBytesToWrite += size;\r\n\t}\r\n\tsgMemCrit.Leave();\r\n#endif\r\n}\r\n\r\nvoid log_dump_computer_info()\r\n{\r\n\tchar Buffer[64];\r\n\tVS_FIXEDFILEINFO file_info;\r\n\tSYSTEMTIME SystemTime;\r\n\tDWORD pcbBuffer;\r\n\r\n\tGetLocalTime(&SystemTime);\r\n\tpcbBuffer = 64;\r\n\tif (!GetUserName(Buffer, &pcbBuffer))\r\n\t\tBuffer[0] = 0;\r\n\tlog_get_version(&file_info);\r\n\tlog_printf(\r\n\t    \"\\r\\n\"\r\n\t    \"------------------------------------------------------\\r\\n\"\r\n\t    \"PROGRAM VERSION: %d.%d.%d.%d\\r\\n\"\r\n\t    \"COMPUTER NAME: %s\\r\\n\"\r\n\t    \"TIME: %02u/%02u/%02u %02u:%02u:%02u\\r\\n\"\r\n\t    \"INFO: %s\\r\\n\"\r\n\t    \"\\r\\n\",\r\n\t    file_info.dwProductVersionMS >> 16,\r\n\t    file_info.dwProductVersionMS & 0xFFFF,\r\n\t    file_info.dwProductVersionLS >> 16,\r\n\t    file_info.dwProductVersionLS & 0xFFFF,\r\n\t    Buffer,\r\n\t    SystemTime.wMonth,\r\n\t    SystemTime.wDay,\r\n\t    SystemTime.wYear % 100,\r\n\t    SystemTime.wHour,\r\n\t    SystemTime.wMinute,\r\n\t    SystemTime.wSecond,\r\n\t    log_buffer);\r\n}\r\n"
  },
  {
    "path": "Source/logging.h",
    "content": "/**\r\n * @file logging.h\r\n *\r\n * Interface of logging functionality.\r\n */\r\n#ifndef __LOGGING_H__\r\n#define __LOGGING_H__\r\n\r\nextern CHAR FileName[MAX_PATH];\r\nextern LPCVOID lpAddress;\r\nextern DWORD nNumberOfBytesToWrite;\r\n\r\nvoid __cdecl log_flush(BOOL force_close);\r\nvoid __cdecl log_printf(const char *pszFmt, ...); // LogMessage\r\nvoid log_dump_computer_info();\r\n\r\n/* data */\r\n\r\nextern HANDLE log_file;\r\n\r\n#endif /* __LOGGING_H__ */\r\n"
  },
  {
    "path": "Source/mainmenu.cpp",
    "content": "/**\r\n * @file mainmenu.cpp\r\n *\r\n * Implementation of functions for interacting with the main menu.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n#include \"../DiabloUI/diabloui.h\"\r\n\r\nchar gszHero[16];\r\n\r\n/* data */\r\n\r\n/** The active music track id for the main menu. */\r\nint menu_music_track_id = TMUSIC_INTRO;\r\n\r\nvoid mainmenu_refresh_music()\r\n{\r\n\tmusic_start(menu_music_track_id);\r\n#ifndef SPAWN\r\n\tdo {\r\n\t\tmenu_music_track_id++;\r\n\t\tif (menu_music_track_id == NUM_MUSIC)\r\n\t\t\tmenu_music_track_id = TMUSIC_TOWN;\r\n\t} while (menu_music_track_id == TMUSIC_TOWN || menu_music_track_id == TMUSIC_L1);\r\n#endif\r\n}\r\n\r\nstatic BOOL mainmenu_init_menu(int type)\r\n{\r\n\tBOOL success;\r\n\r\n\tif (type == SELHERO_PREVIOUS)\r\n\t\treturn TRUE;\r\n\r\n\tmusic_stop();\r\n\r\n\tsuccess = StartGame(type != SELHERO_CONTINUE, type != SELHERO_CONNECT);\r\n\tif (success)\r\n\t\tmainmenu_refresh_music();\r\n\r\n\treturn success;\r\n}\r\n\r\nstatic BOOL mainmenu_single_player()\r\n{\r\n#ifdef HELLFIRE\r\n\tint dlgresult;\r\n\r\n\twhile (TRUE) {\r\n\t\tgbMaxPlayers = 1;\r\n\t\tdlgresult = 0;\r\n\r\n\t\tif (!SRegLoadValue(APP_NAME, jogging_title, 0, &jogging_opt)) {\r\n\t\t\tjogging_opt = TRUE;\r\n\t\t}\r\n\r\n\t\tif (!UiSelHeroSingDialog(\r\n\t\t        pfile_ui_set_hero_infos,\r\n\t\t        pfile_ui_save_create,\r\n\t\t        pfile_delete_save,\r\n\t\t        pfile_ui_set_class_stats,\r\n\t\t        &dlgresult,\r\n\t\t        gszHero,\r\n\t\t        &gnDifficulty\r\n\t\t        //,UseBardTest,\r\n\t\t        //UseBarbarianTest\r\n\t\t        )) {\r\n\t\t\tapp_fatal(\"Unable to display SelHeroSing\");\r\n\t\t}\r\n\r\n\t\tif (dlgresult == SELHERO_PREVIOUS)\r\n\t\t\treturn TRUE;\r\n\t\tif (!mainmenu_init_menu(dlgresult))\r\n\t\t\treturn FALSE;\r\n\t}\r\n#else\r\n\tgbMaxPlayers = 1;\r\n\treturn mainmenu_init_menu(SELHERO_NEW_DUNGEON);\r\n#endif\r\n}\r\n\r\nstatic BOOL mainmenu_multi_player()\r\n{\r\n#ifdef HELLFIRE\r\n\tint dlgresult;\r\n\tBOOL hero_is_created = TRUE;\r\n\r\n\twhile (TRUE) {\r\n\t\tgbMaxPlayers = MAX_PLRS;\r\n\t\tdlgresult = 0;\r\n\t\tjogging_opt = FALSE;\r\n\t\tif (!UiSelHeroMultDialog(\r\n\t\t        pfile_ui_set_hero_infos,\r\n\t\t        pfile_ui_save_create,\r\n\t\t        pfile_delete_save,\r\n\t\t        pfile_ui_set_class_stats,\r\n\t\t        &dlgresult,\r\n\t\t        &hero_is_created, // Not in hellfire\r\n\t\t        gszHero\r\n\t\t        //,UseBardTest,\r\n\t\t        //UseBarbarianTest\r\n\t\t        )) {\r\n\t\t\tapp_fatal(\"Can't load multiplayer dialog\");\r\n\t\t}\r\n\r\n\t\tif (dlgresult == SELHERO_PREVIOUS)\r\n\t\t\treturn TRUE;\r\n\t\tif (!mainmenu_init_menu(dlgresult))\r\n\t\t\treturn FALSE;\r\n\t}\r\n#else\r\n\tgbMaxPlayers = MAX_PLRS;\r\n\treturn mainmenu_init_menu(SELHERO_CONNECT);\r\n#endif\r\n}\r\n\r\n#ifndef SPAWN\r\nstatic void mainmenu_play_intro()\r\n{\r\n\tmusic_stop();\r\n#ifdef HELLFIRE\r\n\tplay_movie(\"gendata\\\\Hellfire.smk\", TRUE);\r\n#else\r\n\tplay_movie(\"gendata\\\\diablo1.smk\", TRUE);\r\n#endif\r\n\tmainmenu_refresh_music();\r\n}\r\n#endif\r\n\r\nvoid __stdcall mainmenu_change_name(int arg1, int arg2, int arg3, int arg4, char *name_1, char *name_2)\r\n{\r\n\tif (UiValidPlayerName(name_2))\r\n\t\tpfile_rename_hero(name_1, name_2);\r\n}\r\n\r\nBOOL __stdcall mainmenu_select_hero_dialog(\r\n    const _SNETPROGRAMDATA *client_info,\r\n    const _SNETPLAYERDATA *user_info,\r\n    const _SNETUIDATA *ui_info,\r\n    const _SNETVERSIONDATA *fileinfo,\r\n    DWORD mode,\r\n    char *cname, DWORD clen,\r\n    char *cdesc, DWORD cdlen,\r\n    BOOL *multi)\r\n{\r\n\tBOOL hero_is_created = TRUE;\r\n\tint dlgresult = 0;\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (!UiSelHeroSingDialog(\r\n\t\t        pfile_ui_set_hero_infos,\r\n\t\t        pfile_ui_save_create,\r\n\t\t        pfile_delete_save,\r\n\t\t        pfile_ui_set_class_stats,\r\n\t\t        &dlgresult,\r\n\t\t        gszHero,\r\n\t\t        &gnDifficulty))\r\n\t\t\tapp_fatal(\"Unable to display SelHeroSing\");\r\n\r\n\t\tif (dlgresult == SELHERO_CONTINUE)\r\n\t\t\tgbLoadGame = TRUE;\r\n\t\telse\r\n\t\t\tgbLoadGame = FALSE;\r\n\r\n\t} else if (!UiSelHeroMultDialog(\r\n\t               pfile_ui_set_hero_infos,\r\n\t               pfile_ui_save_create,\r\n\t               pfile_delete_save,\r\n\t               pfile_ui_set_class_stats,\r\n\t               &dlgresult,\r\n\t               &hero_is_created,\r\n\t               gszHero)) {\r\n\t\tapp_fatal(\"Can't load multiplayer dialog\");\r\n\t}\r\n\tif (dlgresult == SELHERO_PREVIOUS) {\r\n\t\tSErrSetLastError(1223);\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tpfile_create_player_description(cdesc, cdlen);\r\n\tif (multi) {\r\n#ifndef HELLFIRE\r\n\t\tif (mode == 'BNET')\r\n\t\t\t*multi = hero_is_created || !plr[myplr].pBattleNet;\r\n\t\telse\r\n\t\t\t*multi = hero_is_created;\r\n#endif\r\n\t}\r\n\tif (cname && clen)\r\n\t\tSStrCopy(cname, gszHero, clen);\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid mainmenu_loop()\r\n{\r\n\tBOOL done;\r\n\tint menu;\r\n\r\n\tmainmenu_refresh_music();\r\n\tdone = FALSE;\r\n\r\n\tdo {\r\n\t\tmenu = 0;\r\n#ifdef HELLFIRE\r\n\t\t//if (!UiMainMenuDialog(gszProductName, &menu, UseMultiTest, effects_play_sound, 30))\r\n\t\tif (!UiMainMenuDialog(gszProductName, &menu, effects_play_sound, 30))\r\n#else\r\n\t\tif (!UiMainMenuDialog(gszProductName, &menu, effects_play_sound, 30))\r\n#endif\r\n\t\t\tapp_fatal(\"Unable to display mainmenu\");\r\n\r\n\t\tswitch (menu) {\r\n\t\tcase MAINMENU_SINGLE_PLAYER:\r\n\t\t\tif (!mainmenu_single_player())\r\n\t\t\t\tdone = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase MAINMENU_MULTIPLAYER:\r\n\t\t\tif (!mainmenu_multi_player())\r\n\t\t\t\tdone = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase MAINMENU_ATTRACT_MODE:\r\n#ifdef HELLFIRE\r\n\t\t\tbreak;\r\n#endif\r\n\t\tcase MAINMENU_REPLAY_INTRO:\r\n#ifdef SPAWN\r\n#ifndef HELLFIRE\r\n\t\t\tdone = FALSE;\r\n#endif\r\n#else\r\n\t\t\tif (gbActive)\r\n\t\t\t\tmainmenu_play_intro();\r\n#endif\r\n\t\t\tbreak;\r\n\t\tcase MAINMENU_SHOW_CREDITS:\r\n\t\t\tUiCreditsDialog(16);\r\n\t\t\tbreak;\r\n#ifdef HELLFIRE\r\n\t\tcase MAINMENU_SHOW_SUPPORT:\r\n\t\t\t//UiSupportDialog(16);\r\n\t\t\tUiCreditsDialog(16);\r\n\t\t\tbreak;\r\n#endif\r\n\t\tcase MAINMENU_EXIT_DIABLO:\r\n\t\t\tdone = TRUE;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t} while (!done);\r\n\r\n\tmusic_stop();\r\n}\r\n"
  },
  {
    "path": "Source/mainmenu.h",
    "content": "/**\r\n * @file mainmenu.h\r\n *\r\n * Interface of functions for interacting with the main menu.\r\n */\r\n#ifndef __MAINMENU_H__\r\n#define __MAINMENU_H__\r\n\r\nextern char gszHero[16];\r\n\r\nvoid __stdcall mainmenu_change_name(int arg1, int arg2, int arg3, int arg4, char *name_1, char *name_2);\r\nBOOL __stdcall mainmenu_select_hero_dialog(\r\n    const _SNETPROGRAMDATA *client_info,\r\n    const _SNETPLAYERDATA *user_info,\r\n    const _SNETUIDATA *ui_info,\r\n    const _SNETVERSIONDATA *fileinfo,\r\n    DWORD mode,               // 4 chars, e.g. 'IPXN', 'BNET' etc. */\r\n    char *cname, DWORD clen,  // character name will be copied here\r\n    char *cdesc, DWORD cdlen, // character \"description\" will be copied here (used to advertise games)\r\n    BOOL *multi);             // new character? - unsure about this\r\nvoid mainmenu_loop();\r\n\r\n#endif /* __MAINMENU_H__ */\r\n"
  },
  {
    "path": "Source/minitext.cpp",
    "content": "/**\r\n * @file minitext.cpp\r\n *\r\n * Implementation of scrolling dialog text.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Current y position of text in px */\r\nint qtexty;\r\n/** Pointer to the current text being displayed */\r\nconst char *qtextptr;\r\n/** Time of last rendering of the text */\r\nint sgLastScroll;\r\n/** Specify if the quest dialog window is being shown */\r\nBOOLEAN qtextflag;\r\n/** Duplicate of qtextSpd */\r\nint qtextDelay;\r\n/** Vertical speed of the scrolling text, see qscroll_spd_tbl */\r\nint qtextSpd;\r\n/** Graphics for the medium size font */\r\nBYTE *pMedTextCels;\r\n/** Graphics for the window border */\r\nBYTE *pTextBoxCels;\r\n\r\n/** Maps from font index to medtexts.cel frame number. */\r\nconst BYTE mfontframe[128] = {\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r\n\t0, 0, 0, 37, 49, 38, 0, 39, 40, 47,\r\n\t42, 43, 41, 45, 52, 44, 53, 55, 36, 27,\r\n\t28, 29, 30, 31, 32, 33, 34, 35, 51, 50,\r\n\t48, 46, 49, 54, 0, 1, 2, 3, 4, 5,\r\n\t6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\r\n\t16, 17, 18, 19, 20, 21, 22, 23, 24, 25,\r\n\t26, 42, 0, 43, 0, 0, 0, 1, 2, 3,\r\n\t4, 5, 6, 7, 8, 9, 10, 11, 12, 13,\r\n\t14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\r\n\t24, 25, 26, 48, 0, 49, 0, 0\r\n};\r\n/**\r\n * Maps from medtexts.cel frame number to character width. Note, the\r\n * character width may be distinct from the frame width, which is 22 for every\r\n * medtexts.cel frame.\r\n */\r\nconst BYTE mfontkern[56] = {\r\n\t5, 15, 10, 13, 14, 10, 9, 13, 11, 5,\r\n\t5, 11, 10, 16, 13, 16, 10, 15, 12, 10,\r\n\t14, 17, 17, 22, 17, 16, 11, 5, 11, 11,\r\n\t11, 10, 11, 11, 11, 11, 15, 5, 10, 18,\r\n\t15, 8, 6, 6, 7, 10, 9, 6, 10, 10,\r\n\t5, 5, 5, 5, 11, 12\r\n};\r\n\r\n/* data */\r\n\r\n/**\r\n * Text scroll speeds. Positive numbers will delay scrolling 1 out of n frames,\r\n * negative numbers will scroll 1+(-n) pixels.\r\n */\r\nint qscroll_spd_tbl[9] = { 2, 4, 6, 8, 0, -1, -2, -3, -4 };\r\n\r\n/**\r\n * @brief Free the resouces used by the quest dialog window\r\n */\r\nvoid FreeQuestText()\r\n{\r\n\tMemFreeDbg(pMedTextCels);\r\n\tMemFreeDbg(pTextBoxCels);\r\n}\r\n\r\n/**\r\n * @brief Load the resouces used by the quest dialog window, and initialize it's state\r\n */\r\nvoid InitQuestText()\r\n{\r\n\tpMedTextCels = LoadFileInMem(\"Data\\\\MedTextS.CEL\", NULL);\r\n\tpTextBoxCels = LoadFileInMem(\"Data\\\\TextBox.CEL\", NULL);\r\n\tqtextflag = FALSE;\r\n}\r\n\r\n/**\r\n * @brief Start the given naration\r\n * @param m Index of narration from the alltext table\r\n */\r\nvoid InitQTextMsg(int m)\r\n{\r\n\tif (alltext[m].scrlltxt) {\r\n\t\tquestlog = FALSE;\r\n\t\tqtextptr = alltext[m].txtstr;\r\n\t\tqtextflag = TRUE;\r\n\t\tqtexty = 340 + SCREEN_Y;\r\n\t\tqtextSpd = qscroll_spd_tbl[alltext[m].txtspd - 1];\r\n\t\tqtextDelay = qtextSpd;\r\n\t\tsgLastScroll = GetTickCount();\r\n\t}\r\n\tPlaySFX(alltext[m].sfxnr);\r\n}\r\n\r\n/**\r\n * @brief Draw the quest dialog window decoration and background\r\n */\r\nvoid DrawQTextBack()\r\n{\r\n\tCelDraw(PANEL_X + 24, SCREEN_Y + 327, pTextBoxCels, 1, 591);\r\n\r\n#define TRANS_RECT_X (PANEL_LEFT + 27)\r\n#define TRANS_RECT_Y 28\r\n#define TRANS_RECT_WIDTH 585\r\n#define TRANS_RECT_HEIGHT 297\r\n#include \"asm_trans_rect.inc\"\r\n}\r\n\r\n/**\r\n * @brief Print a character\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param pCelBuff Cel data\r\n * @param nCel CEL frame number\r\n */\r\nvoid PrintQTextChr(int sx, int sy, BYTE *pCelBuff, int nCel)\r\n{\r\n\tBYTE *dst, *pStart, *pEnd, *end;\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\tpStart = &gpBuffer[PitchTbl[209]];\r\n\tpEnd = &gpBuffer[PitchTbl[469]];\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pCelBuff\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\teax, [ebx+4]\r\n\t\tsub\t\teax, [ebx]\r\n\t\tmov\t\tend, eax\r\n\t\tmov\t\tesi, pCelBuff\r\n\t\tadd\t\tesi, [ebx]\r\n\t\tmov\t\tedi, dst\r\n\t\tmov\t\tebx, end\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, 22\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel7\r\n\t\tsub\t\tedx, eax\r\n\t\tcmp\t\tedi, pStart\r\n\t\tjb\t\tlabel5\r\n\t\tcmp\t\tedi, pEnd\r\n\t\tja\t\tlabel5\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel3\r\n\t\tmovsb\r\n\t\tjecxz\tlabel6\r\n\tlabel3:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tmovsw\r\n\t\tjecxz\tlabel6\r\n\tlabel4:\r\n\t\trep movsd\r\n\t\tjmp\t\tlabel6\r\n\tlabel5:\r\n\t\tadd\t\tesi, eax\r\n\t\tadd\t\tedi, eax\r\n\tlabel6:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel8\r\n\t\tjmp\t\tlabel2\r\n\tlabel7:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel8:\r\n\t\tsub\t\tedi, BUFFER_WIDTH + 22\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE width;\r\n\tBYTE *src;\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)&pCelBuff[4 * nCel];\r\n\tsrc = &pCelBuff[pFrameTable[0]];\r\n\tend = &src[pFrameTable[1] - pFrameTable[0]];\r\n\r\n\tfor (; src != end; dst -= BUFFER_WIDTH + 22) {\r\n\t\tfor (i = 22; i;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif (!(width & 0x80)) {\r\n\t\t\t\ti -= width;\r\n\t\t\t\tif (dst >= pStart && dst <= pEnd) {\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tfor (; width; width--) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\ti -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Draw the quest dialog window decoration and background\r\n */\r\nvoid DrawQText()\r\n{\r\n\tint i, l, w, tx, ty;\r\n\tBYTE c;\r\n\tconst char *p, *pnl, *s;\r\n\tchar tempstr[128];\r\n\tBOOL doneflag;\r\n\tDWORD currTime;\r\n\r\n\tDrawQTextBack();\r\n\r\n\tp = qtextptr;\r\n\tpnl = NULL;\r\n\ttx = 48 + PANEL_X;\r\n\tty = qtexty;\r\n\r\n\tdoneflag = FALSE;\r\n\twhile (!doneflag) {\r\n\t\tw = 0;\r\n\t\ts = p;\r\n\t\tl = 0;\r\n\t\twhile (*s != '\\n' && *s != '|' && w < 543) {\r\n\t\t\tc = gbFontTransTbl[(BYTE)*s];\r\n\t\t\ts++;\r\n\t\t\tif (c != '\\0') {\r\n\t\t\t\ttempstr[l] = c;\r\n\t\t\t\tw += mfontkern[mfontframe[c]] + 2;\r\n\t\t\t} else {\r\n\t\t\t\tl--;\r\n\t\t\t}\r\n\t\t\tl++;\r\n\t\t}\r\n\t\ttempstr[l] = '\\0';\r\n\t\tif (*s == '|') {\r\n\t\t\ttempstr[l] = '\\0';\r\n\t\t\tdoneflag = TRUE;\r\n\t\t} else if (*s != '\\n') {\r\n\t\t\twhile (tempstr[l] != ' ' && l > 0) {\r\n\t\t\t\ttempstr[l] = '\\0';\r\n\t\t\t\tl--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; tempstr[i]; i++) {\r\n\t\t\tp++;\r\n\t\t\tc = mfontframe[gbFontTransTbl[(BYTE)tempstr[i]]];\r\n\t\t\tif (*p == '\\n') {\r\n\t\t\t\tp++;\r\n\t\t\t}\r\n\t\t\tif (c != 0) {\r\n\t\t\t\tPrintQTextChr(tx, ty, pMedTextCels, c);\r\n\t\t\t}\r\n\t\t\ttx += mfontkern[c] + 2;\r\n\t\t}\r\n\t\tif (pnl == NULL) {\r\n\t\t\tpnl = p;\r\n\t\t}\r\n\t\ttx = 48 + PANEL_X;\r\n\t\tty += 38;\r\n\t\tif (ty > 341 + SCREEN_Y) {\r\n\t\t\tdoneflag = TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tcurrTime = GetTickCount();\r\n\twhile (1) {\r\n\t\tif (qtextSpd <= 0) {\r\n\t\t\tqtexty--;\r\n\t\t\tqtexty += qtextSpd;\r\n\t\t} else {\r\n\t\t\tqtextDelay--;\r\n\t\t\tif (qtextDelay != 0) {\r\n\t\t\t\tqtexty--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (qtextDelay == 0) {\r\n\t\t\tqtextDelay = qtextSpd;\r\n\t\t}\r\n\t\tif (qtexty <= 49 + SCREEN_Y) {\r\n\t\t\tqtexty += 38;\r\n\t\t\tqtextptr = pnl;\r\n\t\t\tif (*pnl == '|') {\r\n\t\t\t\tqtextflag = FALSE;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tsgLastScroll += 50;\r\n\t\tif (currTime - sgLastScroll >= 0x7FFFFFFF) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/minitext.h",
    "content": "/**\r\n * @file minitext.h\r\n *\r\n * Interface of scrolling dialog text.\r\n */\r\n#ifndef __MINITEXT_H__\r\n#define __MINITEXT_H__\r\n\r\nextern BOOLEAN qtextflag;\r\n\r\nvoid FreeQuestText();\r\nvoid InitQuestText();\r\nvoid InitQTextMsg(int m);\r\nvoid DrawQTextBack();\r\nvoid DrawQText();\r\n\r\n#endif /* __MINITEXT_H__ */\r\n"
  },
  {
    "path": "Source/misdat.cpp",
    "content": "/**\r\n * @file misdat.cpp\r\n *\r\n * Implementation of data related to missiles.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Data related to each missile ID. */\r\nMissileData missiledata[] = {\r\n\t// clang-format off\r\n\t// mName,             mAddProc,                   mProc,              mDraw, mType, mResist,        mFileNum,        mlSFX,       miSFX;\r\n\t{  MIS_ARROW,         &AddArrow,                  &MI_Arrow,          TRUE,      0, MISR_NONE,      MFILE_ARROWS,    -1,          -1          },\r\n\t{  MIS_FIREBOLT,      &AddFirebolt,               &MI_Firebolt,       TRUE,      1, MISR_FIRE,      MFILE_FIREBA,    LS_FBOLT1,   LS_FIRIMP2  },\r\n\t{  MIS_GUARDIAN,      &AddGuardian,               &MI_Guardian,       TRUE,      1, MISR_NONE,      MFILE_GUARD,     LS_GUARD,    LS_GUARDLAN },\r\n\t{  MIS_RNDTELEPORT,   &AddRndTeleport,            &MI_Teleport,       FALSE,     1, MISR_NONE,      MFILE_NONE,      LS_TELEPORT, -1          },\r\n\t{  MIS_LIGHTBALL,     &AddLightball,              &MI_Lightball,      TRUE,      1, MISR_LIGHTNING, MFILE_LGHNING,   -1,          -1          },\r\n\t{  MIS_FIREWALL,      &AddFirewall,               &MI_Firewall,       TRUE,      1, MISR_FIRE,      MFILE_FIREWAL,   LS_WALLLOOP, LS_FIRIMP2  },\r\n\t{  MIS_FIREBALL,      &AddFireball,               &MI_Fireball,       TRUE,      1, MISR_FIRE,      MFILE_FIREBA,    LS_FBOLT1,   LS_FIRIMP2  },\r\n\t{  MIS_LIGHTCTRL,     &AddLightctrl,              &MI_Lightctrl,      FALSE,     1, MISR_LIGHTNING, MFILE_LGHNING,   -1,          -1          },\r\n\t{  MIS_LIGHTNING,     &AddLightning,              &MI_Lightning,      TRUE,      1, MISR_LIGHTNING, MFILE_LGHNING,   LS_LNING1,   LS_ELECIMP1 },\r\n\t{  MIS_MISEXP,        &AddMisexp,                 &MI_Misexp,         TRUE,      2, MISR_NONE,      MFILE_MAGBLOS,   -1,          -1          },\r\n\t{  MIS_TOWN,          &AddTown,                   &MI_Town,           TRUE,      1, MISR_MAGIC,     MFILE_PORTAL,    LS_SENTINEL, LS_ELEMENTL },\r\n\t{  MIS_FLASH,         &AddFlash,                  &MI_Flash,          TRUE,      1, MISR_MAGIC,     MFILE_BLUEXFR,   LS_NOVA,     LS_ELECIMP1 },\r\n\t{  MIS_FLASH2,        &AddFlash2,                 &MI_Flash2,         TRUE,      1, MISR_MAGIC,     MFILE_BLUEXBK,   -1,          -1          },\r\n#ifdef HELLFIRE\r\n\t{  MIS_MANASHIELD,    &AddManashield,             &MI_SetManashield,  TRUE,      1, MISR_MAGIC,     MFILE_MANASHLD,  LS_MSHIELD,  -1          },\r\n#else\r\n\t{  MIS_MANASHIELD,    &AddManashield,             &MI_SetManashield,  FALSE,     1, MISR_MAGIC,     MFILE_MANASHLD,  LS_MSHIELD,  -1          },\r\n#endif\r\n\t{  MIS_FIREMOVE,      &AddFiremove,               &MI_Firemove,       TRUE,      1, MISR_FIRE,      MFILE_FIREWAL,   -1,          -1          },\r\n\t{  MIS_CHAIN,         &AddChain,                  &MI_Chain,          TRUE,      1, MISR_LIGHTNING, MFILE_LGHNING,   LS_LNING1,   LS_ELECIMP1 },\r\n\t{  MIS_SENTINAL,      NULL,                       NULL,               TRUE,      1, MISR_LIGHTNING, MFILE_LGHNING,   -1,          -1          },\r\n\t{  MIS_BLODSTAR,      &miss_null_11,              &mi_null_11,        TRUE,      2, MISR_NONE,      MFILE_BLOOD,     LS_BLODSTAR, LS_BLSIMPT  },\r\n\t{  MIS_BONE,          &miss_null_12,              &mi_null_11,        TRUE,      2, MISR_NONE,      MFILE_BONE,      -1,          -1          },\r\n\t{  MIS_METLHIT,       &miss_null_13,              &mi_null_11,        TRUE,      2, MISR_NONE,      MFILE_METLHIT,   -1,          -1          },\r\n\t{  MIS_RHINO,         &AddRhino,                  &MI_Rhino,          TRUE,      2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_MAGMABALL,     &AddMagmaball,              &MI_Firebolt,       TRUE,      1, MISR_FIRE,      MFILE_MAGBALL,   -1,          -1          },\r\n\t{  MIS_LIGHTCTRL2,    &AddLightctrl,              &MI_Lightctrl,      FALSE,     1, MISR_LIGHTNING, MFILE_THINLGHT,  -1,          -1          },\r\n\t{  MIS_LIGHTNING2,    &AddLightning,              &MI_Lightning,      TRUE,      1, MISR_LIGHTNING, MFILE_THINLGHT,  -1,          -1          },\r\n\t{  MIS_FLARE,         &AddFlare,                  &MI_Firebolt,       TRUE,      1, MISR_MAGIC,     MFILE_FLARE,     -1,          -1          },\r\n\t{  MIS_MISEXP2,       &AddMisexp,                 &MI_Misexp,         TRUE,      2, MISR_MAGIC,     MFILE_FLAREEXP,  -1,          -1          },\r\n\t{  MIS_TELEPORT,      &AddTeleport,               &MI_Teleport,       FALSE,     1, MISR_NONE,      MFILE_NONE,      LS_ELEMENTL, -1          },\r\n\t{  MIS_FARROW,        &AddLArrow,                 &MI_LArrow,         TRUE,      0, MISR_FIRE,      MFILE_FARROW,    -1,          -1          },\r\n\t{  MIS_DOOMSERP,      NULL,                       NULL,               FALSE,     1, MISR_MAGIC,     MFILE_DOOM,      LS_DSERP,    -1          },\r\n\t{  MIS_FIREWALLA,     &miss_null_1D,              &MI_Firewall,       TRUE,      2, MISR_FIRE,      MFILE_FIREWAL,   -1,          -1          },\r\n\t{  MIS_STONE,         &AddStone,                  &MI_Stone,          FALSE,     1, MISR_MAGIC,     MFILE_NONE,      LS_SCURIMP,  -1          },\r\n\t{  MIS_NULL_1F,       &miss_null_1F,              &MI_Dummy,          TRUE,      1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_INVISIBL,      NULL,                       NULL,               FALSE,     1, MISR_NONE,      MFILE_NONE,      LS_INVISIBL, -1          },\r\n\t{  MIS_GOLEM,         &AddGolem,                  &MI_Golem,          FALSE,     1, MISR_NONE,      MFILE_NONE,      LS_GOLUM,    -1          },\r\n\t{  MIS_ETHEREALIZE,   &AddEtherealize,            &MI_Etherealize,    TRUE,      1, MISR_NONE,      MFILE_ETHRSHLD,  LS_ETHEREAL, -1          },\r\n\t{  MIS_BLODBUR,       &miss_null_23,              &mi_null_11,        TRUE,      2, MISR_NONE,      MFILE_BLODBUR,   -1,          -1          },\r\n\t{  MIS_BOOM,          &AddBoom,                   &MI_Boom,           TRUE,      2, MISR_NONE,      MFILE_NEWEXP,    -1,          -1          },\r\n\t{  MIS_HEAL,          &AddHeal,                   &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_FIREWALLC,     &AddFirewallC,              &MI_FirewallC,      FALSE,     1, MISR_FIRE,      MFILE_FIREWAL,   -1,          -1          },\r\n\t{  MIS_INFRA,         &AddInfra,                  &MI_Infra,          FALSE,     1, MISR_NONE,      MFILE_NONE,      LS_INFRAVIS, -1          },\r\n\t{  MIS_IDENTIFY,      &AddIdentify,               &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_WAVE,          &AddWave,                   &MI_Wave,           TRUE,      1, MISR_FIRE,      MFILE_FIREWAL,   LS_FLAMWAVE, -1          },\r\n\t{  MIS_NOVA,          &AddNova,                   &MI_Nova,           TRUE,      1, MISR_LIGHTNING, MFILE_LGHNING,   LS_NOVA,     -1          },\r\n#ifdef HELLFIRE\r\n\t{  MIS_BLODBOIL,      &miss_null_1F,              &MI_Blodboil,       FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n#else\r\n\t{  MIS_BLODBOIL,      &AddBlodboil,               &MI_Blodboil,       TRUE,      1, MISR_NONE,      MFILE_NONE,      -1,          LS_BLODBOIL },\r\n#endif\r\n\t{  MIS_APOCA,         &AddApoca,                  &MI_Apoca,          TRUE,      1, MISR_MAGIC,     MFILE_NEWEXP,    LS_APOC,     -1          },\r\n\t{  MIS_REPAIR,        &AddRepair,                 &MI_Dummy,          FALSE,     2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_RECHARGE,      &AddRecharge,               &MI_Dummy,          FALSE,     2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_DISARM,        &AddDisarm,                 &MI_Dummy,          FALSE,     2, MISR_NONE,      MFILE_NONE,      LS_TRAPDIS,  -1          },\r\n\t{  MIS_FLAME,         &AddFlame,                  &MI_Flame,          TRUE,      1, MISR_FIRE,      MFILE_INFERNO,   LS_SPOUTSTR, -1          },\r\n\t{  MIS_FLAMEC,        &AddFlamec,                 &MI_Flamec,         FALSE,     1, MISR_FIRE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_FIREMAN,       &miss_null_32,              &mi_null_32,        TRUE,      2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_KRULL,         &miss_null_33,              &mi_null_33,        TRUE,      0, MISR_FIRE,      MFILE_KRULL,     -1,          -1          },\r\n\t{  MIS_CBOLT,         &AddCbolt,                  &MI_Cbolt,          TRUE,      1, MISR_LIGHTNING, MFILE_MINILTNG,  LS_CBOLT,    -1          },\r\n\t{  MIS_HBOLT,         &AddHbolt,                  &MI_Hbolt,          TRUE,      1, MISR_NONE,      MFILE_HOLY,      LS_HOLYBOLT, LS_ELECIMP1 },\r\n\t{  MIS_RESURRECT,     &AddResurrect,              &MI_Dummy,          FALSE,     1, MISR_MAGIC,     MFILE_NONE,      -1,          LS_RESUR    },\r\n\t{  MIS_TELEKINESIS,   &AddTelekinesis,            &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      LS_ETHEREAL, -1          },\r\n\t{  MIS_LARROW,        &AddLArrow,                 &MI_LArrow,         TRUE,      0, MISR_LIGHTNING, MFILE_LARROW,    -1,          -1          },\r\n\t{  MIS_ACID,          &AddAcid,                   &MI_Firebolt,       TRUE,      1, MISR_ACID,      MFILE_ACIDBF,    LS_ACID,     -1          },\r\n\t{  MIS_MISEXP3,       &AddMisexp,                 &MI_Acidsplat,      TRUE,      2, MISR_ACID,      MFILE_ACIDSPLA,  -1,          -1          },\r\n\t{  MIS_ACIDPUD,       &AddAcidpud,                &MI_Acidpud,        TRUE,      2, MISR_ACID,      MFILE_ACIDPUD,   LS_PUDDLE,   -1          },\r\n\t{  MIS_HEALOTHER,     &AddHealOther,              &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_ELEMENT,       &AddElement,                &MI_Element,        TRUE,      1, MISR_FIRE,      MFILE_FIRERUN,   LS_ELEMENTL, -1          },\r\n\t{  MIS_RESURRECTBEAM, &AddResurrectBeam,          &MI_ResurrectBeam,  TRUE,      1, MISR_NONE,      MFILE_RESSUR1,   -1,          -1          },\r\n\t{  MIS_BONESPIRIT,    &AddBoneSpirit,             &MI_Bonespirit,     TRUE,      1, MISR_MAGIC,     MFILE_SKLBALL,   LS_BONESP,   LS_BSIMPCT  },\r\n\t{  MIS_WEAPEXP,       &AddWeapexp,                &MI_Weapexp,        TRUE,      2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_RPORTAL,       &AddRportal,                &MI_Rportal,        TRUE,      2, MISR_NONE,      MFILE_RPORTAL,   LS_SENTINEL, LS_ELEMENTL },\r\n\t{  MIS_BOOM2,         &AddBoom,                   &MI_Boom,           TRUE,      2, MISR_NONE,      MFILE_FIREPLAR,  -1,          -1          },\r\n\t{  MIS_DIABAPOCA,     &AddDiabApoca,              &MI_Dummy,          FALSE,     2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n#ifdef HELLFIRE\r\n\t{  MIS_MANA,          &missiles_rech_mana,        &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_MAGI,          &missiles_magi,             &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_LIGHTWALL,     &missiles_light_wall,       &mi_light_wall,     TRUE,      1, MISR_LIGHTNING, MFILE_LGHNING,   LS_LMAG,     LS_ELECIMP1 },\r\n\t{  MIS_LIGHTNINGWALL, &AddFirewallC,              &mi_lightning_wall, FALSE,     1, MISR_LIGHTNING, MFILE_LGHNING,   -1,          -1          },\r\n\t{  MIS_IMMOLATION,    &AddNova,                   &mi_fire_nova,      TRUE,      1, MISR_FIRE,      MFILE_FIREBA,    LS_FBOLT1,   LS_FIRIMP2  },\r\n\t{  MIS_SPECARROW,     &missiles_spec_arrow,       &mi_spec_arrow,     TRUE,      0, MISR_NONE,      MFILE_ARROWS,    -1,          -1          },\r\n\t{  MIS_FIRENOVA,      &missiles_immo_2,           &MI_Fireball,       TRUE,      1, MISR_FIRE,      MFILE_FIREBA,    IS_FBALLBOW, LS_FIRIMP2  },\r\n\t{  MIS_LIGHTARROW,    &missiles_larrow,           &mi_light_arrow,    FALSE,     1, MISR_LIGHTNING, MFILE_LGHNING,   IS_FBALLBOW, -1          },\r\n\t{  MIS_CBOLTARROW,    &missiles_cbolt_arrow,      &MI_Cbolt,          TRUE,      1, MISR_LIGHTNING, MFILE_MINILTNG,  LS_CBOLT,    -1          },\r\n\t{  MIS_HBOLTARROW,    &missiles_hbolt_arrow,      &MI_Hbolt,          TRUE,      1, MISR_NONE,      MFILE_HOLY,      LS_HOLYBOLT, LS_ELECIMP1 },\r\n\t{  MIS_WARP,          &missiles_warp,             &MI_Teleport,       FALSE,     1, MISR_NONE,      MFILE_NONE,      LS_ETHEREAL, -1          },\r\n\t{  MIS_REFLECT,       &missiles_reflection,       &mi_reflect,        TRUE,      1, MISR_NONE,      MFILE_REFLECT,   LS_MSHIELD,  -1          },\r\n\t{  MIS_BERSERK,       &missiles_berserk,          &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_FIRERING,      &missiles_ring,             &mi_fire_ring,      FALSE,     1, MISR_FIRE,      MFILE_FIREWAL,   -1,          -1          },\r\n\t{  MIS_STEALPOTS,     &missiles_steal_pots,       &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_MANATRAP,      &missiles_mana_trap,        &MI_Dummy,          FALSE,     1, MISR_NONE,      MFILE_NONE,      IS_CAST7,    -1          },\r\n\t{  MIS_LIGHTRING,     &missiles_ring,             &mi_light_ring,     FALSE,     1, MISR_LIGHTNING, MFILE_LGHNING,   -1,          -1          },\r\n\t{  MIS_SEARCH,        &missiles_search,           &mi_search,         FALSE,     1, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_FLASHFR,       &missiles_43303D,           &mi_flashfr,        TRUE,      1, MISR_MAGIC,     MFILE_BLUEXFR,   -1,          LS_ELECIMP1 },\r\n\t{  MIS_FLASHBK,       &missiles_433040,           &mi_flashbk,        TRUE,      1, MISR_MAGIC,     MFILE_BLUEXBK,   -1,          -1          },\r\n\t{  MIS_IMMOLATION2,   &missiles_immo_1,           &mi_immolation,     TRUE,      1, MISR_FIRE,      MFILE_FIREBA,    LS_FBOLT1,   LS_FIRIMP2  },\r\n\t{  MIS_RUNEFIRE,      &missiles_fire_rune,        &MI_Rune,           TRUE,      1, MISR_NONE,      MFILE_RUNE,      -1,          -1          },\r\n\t{  MIS_RUNELIGHT,     &missiles_light_rune,       &MI_Rune,           TRUE,      1, MISR_NONE,      MFILE_RUNE,      -1,          -1          },\r\n\t{  MIS_RUNENOVA,      &missiles_great_light_rune, &MI_Rune,           TRUE,      1, MISR_NONE,      MFILE_RUNE,      -1,          -1          },\r\n\t{  MIS_RUNEIMMOLAT,   &missiles_immolation_rune,  &MI_Rune,           TRUE,      1, MISR_NONE,      MFILE_RUNE,      -1,          -1          },\r\n\t{  MIS_RUNESTONE,     &missiles_stone_rune,       &MI_Rune,           TRUE,      1, MISR_NONE,      MFILE_RUNE,      -1,          -1          },\r\n\t{  MIS_HIVEEXP,       &missiles_rune_explosion,   &mi_hive_explode,   TRUE,      1, MISR_FIRE,      MFILE_BIGEXP,    LS_NESTXPLD, LS_NESTXPLD },\r\n\t{  MIS_HORKDMN,       &missiles_hork_spawn,       &mi_hork_spawn,   TRUE,      2, MISR_NONE,      MFILE_NULL,      -1,          -1          },\r\n\t{  MIS_JESTER,        &missiles_jester,           &MI_Dummy,          FALSE,     2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_HIVEEXP2,      &missiles_hive_explosion,   &MI_Dummy,          FALSE,     2, MISR_NONE,      MFILE_NONE,      -1,          -1          },\r\n\t{  MIS_LICH,          &AddFlare,                  &MI_Firebolt,       TRUE,      1, MISR_MAGIC,     MFILE_LICH,      -1,          -1          },\r\n\t{  MIS_PSYCHORB,      &AddFlare,                  &MI_Firebolt,       TRUE,      1, MISR_MAGIC,     MFILE_BONEDEMON, -1,          -1          },\r\n\t{  MIS_NECROMORB,     &AddFlare,                  &MI_Firebolt,       TRUE,      1, MISR_MAGIC,     MFILE_NECROMORB, -1,          -1          },\r\n\t{  MIS_ARCHLICH,      &AddFlare,                  &MI_Firebolt,       TRUE,      1, MISR_MAGIC,     MFILE_ARCHLICH,  -1,          -1          },\r\n\t{  MIS_BONEDEMON,     &AddFlare,                  &MI_Firebolt,       TRUE,      1, MISR_MAGIC,     MFILE_BONEDEMON, -1,          -1          },\r\n\t{  MIS_EXYEL2,        &AddMisexp,                 &MI_Misexp,         TRUE,      2, MISR_NONE,      MFILE_EXYEL2,    LS_FIRIMP2,  -1          },\r\n\t{  MIS_EXRED3,        &AddMisexp,                 &MI_Misexp,         TRUE,      2, MISR_NONE,      MFILE_EXRED3,    LS_FIRIMP2,  -1          },\r\n\t{  MIS_EXBL2,         &AddMisexp,                 &MI_Misexp,         TRUE,      2, MISR_NONE,      MFILE_EXBL2,     LS_FIRIMP2,  -1          },\r\n\t{  MIS_EXBL3,         &AddMisexp,                 &MI_Misexp,         TRUE,      2, MISR_NONE,      MFILE_EXBL3,     LS_FIRIMP2,  -1          },\r\n\t{  MIS_EXORA1,        &AddMisexp,                 &MI_Misexp,         TRUE,      2, MISR_NONE,      MFILE_EXORA1,    LS_FIRIMP2,  -1          },\r\n#endif\r\n\t// clang-format on\r\n};\r\n\r\n/** Data related to each missile graphic ID. */\r\nMisFileData misfiledata[] = {\r\n\t// clang-format off\r\n\t// mAnimName, mAnimFAmt, mName, mFlags, mAnimData[16],                                      mAnimDelay[16],                                     mAnimLen[16],                                                       mAnimWidth[16],                                                             mAnimWidth2[16]\r\n\t{  MFILE_ARROWS,      1, \"Arrows\",   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 }, { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_FIREBA,     16, \"Fireba\",   0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } },\r\n\t{  MFILE_GUARD,       3, \"Guard\",    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 }, { 15, 14,  3,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,  96,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_LGHNING,     1, \"Lghning\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_FIREWAL,     2, \"Firewal\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 13, 11,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128, 128,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_MAGBLOS,     1, \"MagBlos\",  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 }, { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_PORTAL,      2, \"Portal\",   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 }, { 16, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_BLUEXFR,     1, \"Bluexfr\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 160,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_BLUEXBK,     1, \"Bluexbk\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 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,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 160,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_MANASHLD,    1, \"Manashld\", 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 }, {  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_BLOOD,       4, \"Blood\",    0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15,  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96, 128, 128, 128,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 32, 32, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_BONE,        3, \"Bone\",     0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {  8,  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128, 128, 128,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32, 32, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_METLHIT,     3, \"Metlhit\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10, 10, 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,  96,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_FARROW,     16, \"Farrow\",   0, { 0, 0, 0, 0, 0, 0, 0, 0, 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,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } },\r\n\t{  MFILE_DOOM,        9, \"Doom\",     1, { 0, 0, 0, 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 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16, 16, 16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_0F,          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 } },\r\n\t{  MFILE_BLODBUR,     2, \"Blodbur\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {  8,  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128, 128,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_NEWEXP,      1, \"Newexp\",   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 }, { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SHATTER1,    1, \"Shatter1\", 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 }, { 12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_BIGEXP,      1, \"Bigexp\",   0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 15,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 160,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_INFERNO,     1, \"Inferno\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 20,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_THINLGHT,    1, \"Thinlght\", 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 }, {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_FLARE,       1, \"Flare\",    0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_FLAREEXP,    1, \"Flareexp\", 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_MAGBALL,     8, \"Magball\",  1, { 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 }, { 16, 16, 16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128, 128, 128, 128, 128, 128, 128, 128,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32, 32, 32, 32, 32, 32, 32, 32,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_KRULL,       1, \"Krull\",    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 }, { 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_MINILTNG,    1, \"Miniltng\", 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 }, {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  64,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_HOLY,       16, \"Holy\",     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 }, { 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } },\r\n\t{  MFILE_HOLYEXPL,    1, \"Holyexpl\", 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 160,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_LARROW,     16, \"Larrow\",   0, { 0, 0, 0, 0, 0, 0, 0, 0, 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,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } },\r\n\t{  MFILE_FIRARWEX,    1, \"Firarwex\", 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  64,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_ACIDBF,     16, \"Acidbf\",   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 }, {  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {  16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 } },\r\n\t{  MFILE_ACIDSPLA,    1, \"Acidspla\", 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 }, {  8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_ACIDPUD,     2, \"Acidpud\",  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 }, {  9,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_ETHRSHLD,    1, \"Ethrshld\", 0, { 0, 0, 0, 0, 0, 0, 0, 0, 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 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_FIRERUN,     8, \"Firerun\",  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 }, { 12, 12, 12, 12, 12, 12, 12, 12,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,  96,  96,  96,  96,  96,  96,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16, 16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_RESSUR1,     1, \"Ressur1\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SKLBALL,     9, \"Sklball\",  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, 1, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16, 16, 16, 16, 16, 16, 16,  8,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16, 16, 16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_RPORTAL,     2, \"Rportal\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 16, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_FIREPLAR,    1, \"Fireplar\", 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 }, { 17,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 160,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  48,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SCUBMISB,    1, \"Scubmisb\", 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 }, { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SCBSEXPB,    1, \"Scbsexpb\", 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 }, {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SCUBMISC,    1, \"Scubmisc\", 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 }, { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SCBSEXPC,    1, \"Scbsexpc\", 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 }, {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SCUBMISD,    1, \"Scubmisd\", 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 }, { 16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_SCBSEXPD,    1, \"Scbsexpd\", 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 }, {  6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 128,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  32,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n#ifdef HELLFIRE\r\n\t{  MFILE_SPAWNS,      8, \"spawns\",   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 }, {  9,  9,  9,  9,  9,  9,  9,  9,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,  96,  96,  96,  96,  96,  96,  96,  0,  0,  0,  0,  0,  0,  0,  0 }, {  16, 16, 16, 16, 16, 16, 16, 16,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_REFLECT,     1, \"reflect\",  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 }, {  1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 160,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 160,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_LICH,       16, \"ms_ora\",   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 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 } },\r\n\t{  MFILE_MSBLA,      16, \"ms_bla\",   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 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 } },\r\n\t{  MFILE_NECROMORB,  16, \"ms_reb\",   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 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 } },\r\n\t{  MFILE_ARCHLICH,   16, \"ms_yeb\",   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 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 } },\r\n\t{  MFILE_RUNE,        1, \"rglows1\",  0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {   8,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_EXYEL2,      1, \"ex_yel2\",  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 }, { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 220,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  78,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_EXBL2,       1, \"ex_blu2\",  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 }, { 10,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 212,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  86,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_EXRED3,      1, \"ex_red3\",  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 }, {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 292,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 114,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_BONEDEMON,  16, \"ms_blb\",   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 }, { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 }, {  96,  96,  96,  96,  96,  96,  96,  96, 96, 96, 96, 96, 96, 96, 96, 96 }, {   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8 } },\r\n\t{  MFILE_EXORA1,      1, \"ex_ora1\",  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 }, { 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {  96,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, { -12,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t{  MFILE_EXBL3,       1, \"ex_blu3\",  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 }, {  7,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 292,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, { 114,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n#endif\r\n\t{  MFILE_NONE,        0, \"\",         0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }, {   0,   0,   0,   0,   0,   0,   0,   0,  0,  0,  0,  0,  0,  0,  0,  0 }, {   0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 } },\r\n\t// clang-format on\r\n};\r\n"
  },
  {
    "path": "Source/misdat.h",
    "content": "/**\r\n * @file misdat.h\r\n *\r\n * Interface of data related to missiles.\r\n */\r\n#ifndef __MISDAT_H__\r\n#define __MISDAT_H__\r\n\r\nextern MissileData missiledata[];\r\nextern MisFileData misfiledata[];\r\n\r\n#endif /* __MISDAT_H__ */\r\n"
  },
  {
    "path": "Source/missiles.cpp",
    "content": "/**\r\n * @file missiles.cpp\r\n *\r\n * Implementation of missile functionality.\r\n */\r\n#include \"all.h\"\r\n\r\nint missileactive[MAXMISSILES];\r\nint missileavail[MAXMISSILES];\r\nMissileStruct missile[MAXMISSILES];\r\nint nummissiles;\r\nBOOL ManashieldFlag;\r\nChainStruct chain[MAXMISSILES];\r\nBOOL MissilePreFlag;\r\nint numchains;\r\n\r\n/** Maps from direction to X-offset. */\r\nint XDirAdd[8] = { 1, 0, -1, -1, -1, 0, 1, 1 };\r\n/** Maps from direction to Y-offset. */\r\nint YDirAdd[8] = { 1, 1, 1, 0, -1, -1, -1, 0 };\r\n#ifdef HELLFIRE\r\nint CrawlNum[19] = { 0, 3, 12, 45, 94, 159, 240, 337, 450, 579, 724, 885, 1062, 1255, 1464, 1689, 1930, 2187, 2460 };\r\n#endif\r\n\r\nvoid GetDamageAmt(int i, int *mind, int *maxd)\r\n{\r\n\tint k, sl;\r\n\r\n\tassert((DWORD)myplr < MAX_PLRS);\r\n\tassert((DWORD)i < 64);\r\n\tsl = plr[myplr]._pSplLvl[i] + plr[myplr]._pISplLvlAdd;\r\n\r\n\tswitch (i) {\r\n\tcase SPL_FIREBOLT:\r\n\t\t*mind = (plr[myplr]._pMagic >> 3) + sl + 1;\r\n\t\t*maxd = (plr[myplr]._pMagic >> 3) + sl + 10;\r\n\t\tbreak;\r\n\tcase SPL_HEAL: /// BUGFIX: healing calculation is unused\r\n\t\t*mind = plr[myplr]._pLevel + sl + 1;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR || plr[myplr]._pClass == PC_MONK || plr[myplr]._pClass == PC_BARBARIAN) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n#endif\r\n\t\t\t*mind <<= 1;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_ROGUE || plr[myplr]._pClass == PC_BARD) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\t\t*mind += *mind >> 1;\r\n\t\t}\r\n\t\t*maxd = 10;\r\n\t\tfor (k = 0; k < plr[myplr]._pLevel; k++) {\r\n\t\t\t*maxd += 4;\r\n\t\t}\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*maxd += 6;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR || plr[myplr]._pClass == PC_MONK || plr[myplr]._pClass == PC_BARBARIAN) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n#endif\r\n\t\t\t*maxd <<= 1;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_ROGUE || plr[myplr]._pClass == PC_BARD) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\t\t*maxd += *maxd >> 1;\r\n\t\t}\r\n\t\t*mind = -1;\r\n\t\t*maxd = -1;\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase SPL_RUNELIGHT:\r\n#endif\r\n\tcase SPL_LIGHTNING:\r\n\t\t*mind = 2;\r\n\t\t*maxd = plr[myplr]._pLevel + 2;\r\n\t\tbreak;\r\n\tcase SPL_FLASH:\r\n\t\t*mind = plr[myplr]._pLevel;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*mind += *mind >> 3;\r\n\t\t}\r\n\t\t*mind += *mind >> 1;\r\n\t\t*maxd = *mind * 2;\r\n\t\tbreak;\r\n\tcase SPL_IDENTIFY:\r\n\tcase SPL_TOWN:\r\n\tcase SPL_STONE:\r\n\tcase SPL_INFRA:\r\n\tcase SPL_RNDTELEPORT:\r\n\tcase SPL_MANASHIELD:\r\n\tcase SPL_DOOMSERP:\r\n\tcase SPL_BLODRIT:\r\n\tcase SPL_INVISIBIL:\r\n\tcase SPL_BLODBOIL:\r\n\tcase SPL_TELEPORT:\r\n\tcase SPL_ETHEREALIZE:\r\n\tcase SPL_REPAIR:\r\n\tcase SPL_RECHARGE:\r\n\tcase SPL_DISARM:\r\n\tcase SPL_RESURRECT:\r\n\tcase SPL_TELEKINESIS:\r\n\tcase SPL_BONESPIRIT:\r\n#ifdef HELLFIRE\r\n\tcase SPL_WARP:\r\n\tcase SPL_REFLECT:\r\n\tcase SPL_BERSERK:\r\n\tcase SPL_SEARCH:\r\n\tcase SPL_RUNESTONE:\r\n#endif\r\n\t\t*mind = -1;\r\n\t\t*maxd = -1;\r\n\t\tbreak;\r\n\tcase SPL_FIREWALL:\r\n\t\t*mind = (4 * plr[myplr]._pLevel + 8) >> 1;\r\n\t\t*maxd = (4 * plr[myplr]._pLevel + 80) >> 1;\r\n\t\tbreak;\r\n\tcase SPL_FIREBALL:\r\n\t\t*mind = 2 * plr[myplr]._pLevel + 4;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*mind += *mind >> 3;\r\n\t\t}\r\n\t\t*maxd = 2 * plr[myplr]._pLevel + 40;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*maxd += *maxd >> 3;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase SPL_GUARDIAN:\r\n\t\t*mind = (plr[myplr]._pLevel >> 1) + 1;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*mind += *mind >> 3;\r\n\t\t}\r\n\t\t*maxd = (plr[myplr]._pLevel >> 1) + 10;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*maxd += *maxd >> 3;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase SPL_CHAIN:\r\n\t\t*mind = 4;\r\n\t\t*maxd = 2 * plr[myplr]._pLevel + 4;\r\n\t\tbreak;\r\n\tcase SPL_WAVE:\r\n\t\t*mind = 6 * (plr[myplr]._pLevel + 1);\r\n\t\t*maxd = 6 * (plr[myplr]._pLevel + 10);\r\n\t\tbreak;\r\n\tcase SPL_NOVA:\r\n\t\t*mind = (plr[myplr]._pLevel + 5) >> 1;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*mind += *mind >> 3;\r\n\t\t}\r\n\t\t*mind *= 5;\r\n\t\t*maxd = (plr[myplr]._pLevel + 30) >> 1;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*maxd += *maxd >> 3;\r\n\t\t}\r\n\t\t*maxd *= 5;\r\n\t\tbreak;\r\n\tcase SPL_FLAME:\r\n\t\t*mind = 3;\r\n\t\t*maxd = plr[myplr]._pLevel + 4;\r\n\t\t*maxd += *maxd >> 1;\r\n\t\tbreak;\r\n\tcase SPL_GOLEM:\r\n\t\t*mind = 11;\r\n\t\t*maxd = 17;\r\n\t\tbreak;\r\n\tcase SPL_APOCA:\r\n\t\t*mind = 0;\r\n\t\tfor (k = 0; k < plr[myplr]._pLevel; k++) {\r\n\t\t\t*mind += 1;\r\n\t\t}\r\n\t\t*maxd = 0;\r\n\t\tfor (k = 0; k < plr[myplr]._pLevel; k++) {\r\n\t\t\t*maxd += 6;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase SPL_ELEMENT:\r\n\t\t*mind = 2 * plr[myplr]._pLevel + 4;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*mind += *mind >> 3;\r\n\t\t}\r\n\t\t/// BUGFIX: add here '*mind >>= 1;'\r\n\t\t*maxd = 2 * plr[myplr]._pLevel + 40;\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*maxd += *maxd >> 3;\r\n\t\t}\r\n\t\t/// BUGFIX: add here '*maxd >>= 1;'\r\n\t\tbreak;\r\n\tcase SPL_CBOLT:\r\n\t\t*mind = 1;\r\n\t\t*maxd = (plr[myplr]._pMagic >> 2) + 1;\r\n\t\tbreak;\r\n\tcase SPL_HBOLT:\r\n\t\t*mind = plr[myplr]._pLevel + 9;\r\n\t\t*maxd = plr[myplr]._pLevel + 18;\r\n\t\tbreak;\r\n\tcase SPL_HEALOTHER: /// BUGFIX: healing calculation is unused\r\n\t\t*mind = plr[myplr]._pLevel + sl + 1;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR || plr[myplr]._pClass == PC_MONK || plr[myplr]._pClass == PC_BARBARIAN) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n#endif\r\n\t\t\t*mind <<= 1;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE || plr[myplr]._pClass == PC_BARD) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\t\t*mind += *mind >> 1;\r\n\t\t}\r\n\t\t*maxd = 10;\r\n\t\tfor (k = 0; k < plr[myplr]._pLevel; k++) {\r\n\t\t\t*maxd += 4;\r\n\t\t}\r\n\t\tfor (k = 0; k < sl; k++) {\r\n\t\t\t*maxd += 6;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR || plr[myplr]._pClass == PC_MONK || plr[myplr]._pClass == PC_BARBARIAN) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n#endif\r\n\t\t\t*maxd <<= 1;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE || plr[myplr]._pClass == PC_BARD) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\t\t*maxd += *maxd >> 1;\r\n\t\t}\r\n\t\t*mind = -1;\r\n\t\t*maxd = -1;\r\n\t\tbreak;\r\n\tcase SPL_FLARE:\r\n\t\t*mind = (plr[myplr]._pMagic >> 1) + 3 * sl - (plr[myplr]._pMagic >> 3);\r\n\t\t*maxd = *mind;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nBOOL CheckBlock(int fx, int fy, int tx, int ty)\r\n{\r\n\tint pn;\r\n\tBOOL coll;\r\n\r\n\tcoll = FALSE;\r\n\twhile (fx != tx || fy != ty) {\r\n\t\tpn = GetDirection(fx, fy, tx, ty);\r\n\t\tfx += XDirAdd[pn];\r\n\t\tfy += YDirAdd[pn];\r\n\t\tif (nSolidTable[dPiece[fx][fy]])\r\n\t\t\tcoll = TRUE;\r\n\t}\r\n\r\n\treturn coll;\r\n}\r\n\r\nint FindClosest(int sx, int sy, int rad)\r\n{\r\n\tint j, i, mid, tx, ty, cr;\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[19] = { 0, 3, 12, 45, 94, 159, 240, 337, 450, 579, 724, 885, 1062, 1255, 1464, 1689, 1930, 2187, 2460 };\r\n#endif\r\n\r\n\tif (rad > 19)\r\n\t\trad = 19;\r\n\r\n\tfor (i = 1; i < rad; i++) {\r\n\t\tcr = CrawlNum[i] + 2;\r\n#ifdef HELLFIRE\r\n\t\tfor (j = CrawlTable[CrawlNum[i]]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\tfor (j = (BYTE)CrawlTable[CrawlNum[i]]; j > 0; j--) {\r\n#endif\r\n\t\t\ttx = sx + CrawlTable[cr - 1];\r\n\t\t\tty = sy + CrawlTable[cr];\r\n\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\tmid = dMonster[tx][ty];\r\n\t\t\t\tif (mid > 0 && !CheckBlock(sx, sy, tx, ty))\r\n\t\t\t\t\treturn mid - 1;\r\n\t\t\t}\r\n\t\t\tcr += 2;\r\n\t\t}\r\n\t}\r\n\treturn -1;\r\n}\r\n\r\nint GetSpellLevel(int id, int sn)\r\n{\r\n\tint result;\r\n\r\n\tif (id == myplr)\r\n\t\tresult = plr[id]._pISplLvlAdd + plr[id]._pSplLvl[sn];\r\n\telse\r\n\t\tresult = 1;\r\n\r\n\tif (result < 0)\r\n\t\tresult = 0;\r\n\r\n\treturn result;\r\n}\r\n\r\nint GetDirection8(int x1, int y1, int x2, int y2)\r\n{\r\n\tBYTE Dirs[16][16] = {\r\n\t\t{ 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },\r\n\t\t{ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },\r\n\t\t{ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }\r\n\t};\r\n\tint mx, my, md;\r\n\tALIGN_BY_1 BYTE urtoll[] = { 3, 4, 5 },\r\n\t                ultolr[] = { 3, 2, 1 },\r\n\t                lrtoul[] = { 7, 6, 5 },\r\n\t                lltour[] = { 7, 0, 1 };\r\n\r\n\tmx = abs(x2 - x1);\r\n\tif (mx > 15)\r\n\t\tmx = 15;\r\n\tmy = abs(y2 - y1);\r\n\tif (my > 15)\r\n\t\tmy = 15;\r\n\tmd = Dirs[my][mx];\r\n\tif (x1 > x2) {\r\n\t\tif (y1 > y2)\r\n\t\t\tmd = urtoll[md];\r\n\t\telse\r\n\t\t\tmd = ultolr[md];\r\n\t} else if (y1 > y2)\r\n\t\tmd = lrtoul[md];\r\n\telse\r\n\t\tmd = lltour[md];\r\n\treturn md;\r\n}\r\n\r\nint GetDirection16(int x1, int y1, int x2, int y2)\r\n{\r\n\tBYTE Dirs[16][16] = {\r\n\t\t{ 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 4, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 4, 3, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },\r\n\t\t{ 4, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // BUGFIX: should be `{ 4, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },`\r\n\t\t{ 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 }, // BUGFIX: should be `{ 4, 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 },`\r\n\t\t{ 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2 }\r\n\t};\r\n\t// The correct quadrant of direction indices is presented below:\r\n\t/*\r\n\t\t{ 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 4, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 4, 3, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },\r\n\t\t{ 4, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 },\r\n\t\t{ 4, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1 },\r\n\t\t{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2 },\r\n\t\t{ 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2 }\r\n\t*/\r\n\r\n\tBYTE urtoll[5] = { 6, 7, 8, 9, 10 };\r\n\tBYTE ultolr[5] = { 6, 5, 4, 3, 2 };\r\n\tBYTE lltour[5] = { 14, 13, 12, 11, 10 };\r\n\tBYTE lrtoul[5] = { 14, 15, 0, 1, 2 };\r\n\tint mx, my, md;\r\n\r\n\tmx = abs(x2 - x1);\r\n\tif (mx > 15)\r\n\t\tmx = 15;\r\n\tmy = abs(y2 - y1);\r\n\tif (my > 15)\r\n\t\tmy = 15;\r\n\tmd = Dirs[my][mx]; // BUGFIX, md can be 99, leading to an OOB read\r\n\tif (x1 > x2) {\r\n\t\tif (y1 > y2)\r\n\t\t\tmd = urtoll[md];\r\n\t\telse\r\n\t\t\tmd = ultolr[md];\r\n\t} else if (y1 > y2) {\r\n\t\tmd = lltour[md];\r\n\t} else {\r\n\t\tmd = lrtoul[md];\r\n\t}\r\n\treturn md;\r\n}\r\n\r\nvoid DeleteMissile(int mi, int i)\r\n{\r\n#ifndef HELLFIRE\r\n\tint src;\r\n\r\n\tif (missile[mi]._mitype == MIS_MANASHIELD) {\r\n\t\tsrc = missile[mi]._misource;\r\n\t\tif (src == myplr)\r\n\t\t\tNetSendCmd(TRUE, CMD_REMSHIELD);\r\n\t\tplr[src].pManaShield = FALSE;\r\n\t}\r\n#endif\r\n\tmissileavail[MAXMISSILES - nummissiles] = mi;\r\n\tnummissiles--;\r\n\tif (nummissiles > 0 && i != nummissiles)\r\n\t\tmissileactive[i] = missileactive[nummissiles];\r\n}\r\n\r\nvoid GetMissileVel(int i, int sx, int sy, int dx, int dy, int v)\r\n{\r\n\tdouble dxp, dyp, dr;\r\n\r\n#ifndef HELLFIRE\r\n\tif (dx != sx || dy != sy) {\r\n#endif\r\n\t\tdxp = (dx + sy - sx - dy) << 21;\r\n\t\tdyp = (dy + dx - sx - sy) << 21;\r\n\t\tdr = sqrt(dxp * dxp + dyp * dyp);\r\n\t\tmissile[i]._mixvel = (dxp * (v << 16)) / dr;\r\n\t\tmissile[i]._miyvel = (dyp * (v << 15)) / dr;\r\n#ifndef HELLFIRE\r\n\t} else {\r\n\t\tmissile[i]._mixvel = 0;\r\n\t\tmissile[i]._miyvel = 0;\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid PutMissile(int i)\r\n{\r\n\tint x, y;\r\n\r\n\tx = missile[i]._mix;\r\n\ty = missile[i]._miy;\r\n\t// BUGFIX: should be `x < 0 || y < 0`, was `x <= 0 || y <= 0`.\r\n\tif (x <= 0 || y <= 0 || x >= MAXDUNX || y >= MAXDUNY)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tif (!missile[i]._miDelFlag) {\r\n\t\tdFlags[x][y] |= BFLAG_MISSILE;\r\n\t\tif (dMissile[x][y] == 0)\r\n\t\t\tdMissile[x][y] = i + 1;\r\n\t\telse\r\n\t\t\tdMissile[x][y] = -1;\r\n\t\tif (missile[i]._miPreFlag)\r\n\t\t\tMissilePreFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid GetMissilePos(int i)\r\n{\r\n\tint mx, my, dx, dy, lx, ly;\r\n\r\n\tmx = missile[i]._mitxoff >> 16;\r\n\tmy = missile[i]._mityoff >> 16;\r\n\tdx = mx + 2 * my;\r\n\tdy = 2 * my - mx;\r\n\tif (dx < 0) {\r\n\t\tlx = -(-dx >> 3);\r\n\t\tdx = -(-dx >> 6);\r\n\t} else {\r\n\t\tlx = dx >> 3;\r\n\t\tdx = dx >> 6;\r\n\t}\r\n\tif (dy < 0) {\r\n\t\tly = -(-dy >> 3);\r\n\t\tdy = -(-dy >> 6);\r\n\t} else {\r\n\t\tly = dy >> 3;\r\n\t\tdy = dy >> 6;\r\n\t}\r\n\tmissile[i]._mix = dx + missile[i]._misx;\r\n\tmissile[i]._miy = dy + missile[i]._misy;\r\n\tmissile[i]._mixoff = mx + (dy << 5) - (dx << 5);\r\n\tmissile[i]._miyoff = my - (dx << 4) - (dy << 4);\r\n\tChangeLightOff(missile[i]._mlid, lx - (dx << 3), ly - (dy << 3));\r\n}\r\n\r\nvoid MoveMissilePos(int i)\r\n{\r\n\tint dx, dy, x, y;\r\n\r\n\tswitch (missile[i]._mimfnum) {\r\n\tcase DIR_S:\r\n\t\tdx = 1;\r\n\t\tdy = 1;\r\n\t\tbreak;\r\n\tcase DIR_SW:\r\n\t\tdx = 1;\r\n\t\tdy = 1;\r\n\t\tbreak;\r\n\tcase DIR_W:\r\n\t\tdx = 0;\r\n\t\tdy = 1;\r\n\t\tbreak;\r\n\tcase DIR_NW:\r\n\t\tdx = 0;\r\n\t\tdy = 0;\r\n\t\tbreak;\r\n\tcase DIR_N:\r\n\t\tdx = 0;\r\n\t\tdy = 0;\r\n\t\tbreak;\r\n\tcase DIR_NE:\r\n\t\tdx = 0;\r\n\t\tdy = 0;\r\n\t\tbreak;\r\n\tcase DIR_E:\r\n\t\tdx = 1;\r\n\t\tdy = 0;\r\n\t\tbreak;\r\n\tcase DIR_SE:\r\n\t\tdx = 1;\r\n\t\tdy = 1;\r\n\t\tbreak;\r\n\t}\r\n\tx = missile[i]._mix + dx;\r\n\ty = missile[i]._miy + dy;\r\n\tif (PosOkMonst(missile[i]._misource, x, y)) {\r\n\t\tmissile[i]._mix += dx;\r\n\t\tmissile[i]._miy += dy;\r\n\t\tmissile[i]._mixoff += (dy << 5) - (dx << 5);\r\n\t\tmissile[i]._miyoff -= (dy << 4) + (dx << 4);\r\n\t}\r\n}\r\n\r\nBOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift)\r\n{\r\n\tint hit, hper, dam, mor, mir;\r\n\tBOOL resist, ret;\r\n\r\n\tresist = FALSE;\r\n\tif (monster[m].mtalkmsg) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (monster[m]._mhitpoints >> 6 <= 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == MGOAL_RETREAT)\r\n\t\treturn FALSE;\r\n\tif (monster[m]._mmode == MM_CHARGE)\r\n\t\treturn FALSE;\r\n\r\n\tmir = missiledata[t].mResist;\r\n\tmor = monster[m].mMagicRes;\r\n\tif (mor & IMMUNE_MAGIC && mir == MISR_MAGIC\r\n\t    || mor & IMMUNE_FIRE && mir == MISR_FIRE\r\n\t    || mor & IMMUNE_LIGHTNING && mir == MISR_LIGHTNING) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif ((mor & RESIST_MAGIC && mir == MISR_MAGIC)\r\n\t    || (mor & RESIST_FIRE && mir == MISR_FIRE)\r\n\t    || (mor & RESIST_LIGHTNING && mir == MISR_LIGHTNING)) {\r\n\t\tresist = TRUE;\r\n\t}\r\n\r\n\thit = random_(68, 100);\r\n#ifdef HELLFIRE\r\n\thper = 90 - (char)monster[m].mArmorClass - dist;\r\n#else\r\n\thper = 90 - (BYTE)monster[m].mArmorClass - dist;\r\n#endif\r\n\tif (hper < 5)\r\n\t\thper = 5;\r\n\tif (hper > 95)\r\n\t\thper = 95;\r\n\tif (CheckMonsterHit(m, ret)) {\r\n\t\treturn ret;\r\n\t}\r\n#ifdef _DEBUG\r\n\telse if (hit < hper || debug_mode_dollar_sign || debug_mode_key_inverted_v || monster[m]._mmode == MM_STONE) {\r\n#else\r\n\telse if (hit < hper || monster[m]._mmode == MM_STONE) {\r\n#endif\r\n\t\tdam = mindam + random_(68, maxdam - mindam + 1);\r\n\t\tif (!shift)\r\n\t\t\tdam <<= 6;\r\n\t\tif (resist)\r\n\t\t\tmonster[m]._mhitpoints -= dam >> 2;\r\n\t\telse\r\n\t\t\tmonster[m]._mhitpoints -= dam;\r\n#ifdef _DEBUG\r\n\t\tif (debug_mode_dollar_sign || debug_mode_key_inverted_v)\r\n\t\t\tmonster[m]._mhitpoints = 0;\r\n#endif\r\n\t\tif (monster[m]._mhitpoints >> 6 <= 0) {\r\n\t\t\tif (monster[m]._mmode == MM_STONE) {\r\n\t\t\t\tM_StartKill(m, -1);\r\n\t\t\t\tmonster[m]._mmode = MM_STONE;\r\n\t\t\t} else {\r\n\t\t\t\tM_StartKill(m, -1);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (resist) {\r\n\t\t\t\tPlayEffect(m, 1);\r\n\t\t\t} else if (monster[m]._mmode == MM_STONE) {\r\n\t\t\t\tif (m > MAX_PLRS - 1)\r\n\t\t\t\t\tM_StartHit(m, -1, dam);\r\n\t\t\t\tmonster[m]._mmode = MM_STONE;\r\n\t\t\t} else {\r\n\t\t\t\tif (m > MAX_PLRS - 1)\r\n\t\t\t\t\tM_StartHit(m, -1, dam);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn TRUE;\r\n\t} else {\r\n\t\treturn FALSE;\r\n\t}\r\n}\r\n\r\nBOOL MonsterMHit(int pnum, int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift)\r\n{\r\n\tint hit, hper, dam, mor, mir;\r\n\tBOOL resist, ret;\r\n\r\n\tresist = FALSE;\r\n\tif (monster[m].mtalkmsg\r\n\t    || monster[m]._mhitpoints >> 6 <= 0\r\n\t    || t == MIS_HBOLT && monster[m].MType->mtype != MT_DIABLO && monster[m].MData->mMonstClass != MC_UNDEAD) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == MGOAL_RETREAT)\r\n\t\treturn FALSE;\r\n\tif (monster[m]._mmode == MM_CHARGE)\r\n\t\treturn FALSE;\r\n\r\n\tmor = monster[m].mMagicRes;\r\n\tmir = missiledata[t].mResist;\r\n\r\n\tif (mor & IMMUNE_MAGIC && mir == MISR_MAGIC\r\n\t    || mor & IMMUNE_FIRE && mir == MISR_FIRE\r\n\t    || mor & IMMUNE_LIGHTNING && mir == MISR_LIGHTNING\r\n\t    || (mor & IMMUNE_ACID) && mir == MISR_ACID)\r\n\t\treturn FALSE;\r\n\r\n\tif (mor & RESIST_MAGIC && mir == MISR_MAGIC\r\n\t    || mor & RESIST_FIRE && mir == MISR_FIRE\r\n\t    || mor & RESIST_LIGHTNING && mir == MISR_LIGHTNING)\r\n\t\tresist = TRUE;\r\n\r\n#ifdef HELLFIRE\r\n\tif (t == MIS_HBOLT && (monster[m].MType->mtype == MT_DIABLO || monster[m].MType->mtype == MT_BONEDEMN))\r\n\t\tresist = TRUE;\r\n#endif\r\n\r\n\thit = random_(69, 100);\r\n#ifdef HELLFIRE\r\n\tif (pnum != -1) {\r\n#endif\r\n\t\tif (missiledata[t].mType == 0) {\r\n\t\t\thper = plr[pnum]._pDexterity;\r\n\t\t\thper += plr[pnum]._pIBonusToHit;\r\n\t\t\thper += plr[pnum]._pLevel;\r\n\t\t\thper -= monster[m].mArmorClass;\r\n\t\t\thper -= (dist * dist) >> 1;\r\n#ifdef HELLFIRE\r\n\t\t\thper -= plr[pnum]._pIEnAc; // BUGFIX: armor piercing DECREASES hit chance here, probably a 1.04 bug that got fixed in 1.09, go with +=\r\n#endif\r\n#ifndef HELLFIRE\r\n\t\t\thper += plr[pnum]._pIEnAc;\r\n#endif\r\n\t\t\thper += 50;\r\n\t\t\tif (plr[pnum]._pClass == PC_ROGUE)\r\n\t\t\t\thper += 20;\r\n#ifdef HELLFIRE\r\n\t\t\tif (plr[pnum]._pClass == PC_WARRIOR || plr[pnum]._pClass == PC_BARD)\r\n\t\t\t\thper += 10;\r\n#endif\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum]._pClass == PC_WARRIOR)\r\n\t\t\t\thper += 10;\r\n#endif\r\n\t\t} else {\r\n\t\t\thper = plr[pnum]._pMagic - (monster[m].mLevel << 1) - dist + 50;\r\n\t\t\tif (plr[pnum]._pClass == PC_SORCERER)\r\n\t\t\t\thper += 20;\r\n#ifdef HELLFIRE\r\n\t\t\telse if (plr[pnum]._pClass == PC_BARD)\r\n\t\t\t\thper += 10;\r\n#endif\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\thper = random_(71, 75) - monster[m].mLevel * 2;\r\n\t}\r\n#endif\r\n\r\n\tif (hper < 5)\r\n\t\thper = 5;\r\n\tif (hper > 95)\r\n\t\thper = 95;\r\n\tif (monster[m]._mmode == MM_STONE)\r\n\t\thit = 0;\r\n\tif (CheckMonsterHit(m, ret))\r\n\t\treturn ret;\r\n#ifdef _DEBUG\r\n\tif (hit < hper || debug_mode_key_inverted_v || debug_mode_dollar_sign) {\r\n#else\r\n\tif (hit < hper) {\r\n#endif\r\n\t\tif (t == MIS_BONESPIRIT) {\r\n\t\t\tdam = monster[m]._mhitpoints / 3 >> 6;\r\n\t\t} else {\r\n\t\t\tdam = mindam + random_(70, maxdam - mindam + 1);\r\n\t\t}\r\n\t\tif (missiledata[t].mType == 0) {\r\n\t\t\tdam = plr[pnum]._pIBonusDamMod + dam * plr[pnum]._pIBonusDam / 100 + dam;\r\n\t\t\tif (plr[pnum]._pClass == PC_ROGUE)\r\n\t\t\t\tdam += plr[pnum]._pDamageMod;\r\n\t\t\telse\r\n\t\t\t\tdam += (plr[pnum]._pDamageMod >> 1);\r\n\t\t}\r\n\t\tif (!shift)\r\n\t\t\tdam <<= 6;\r\n\t\tif (resist)\r\n\t\t\tdam >>= 2;\r\n\t\tif (pnum == myplr)\r\n\t\t\tmonster[m]._mhitpoints -= dam;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum]._pIFlags & ISPL_NOHEALMON)\r\n#else\r\n\t\tif (plr[pnum]._pIFlags & ISPL_FIRE_ARROWS)\r\n#endif\r\n\t\t\tmonster[m]._mFlags |= MFLAG_NOHEAL;\r\n\r\n\t\tif (monster[m]._mhitpoints >> 6 <= 0) {\r\n\t\t\tif (monster[m]._mmode == MM_STONE) {\r\n\t\t\t\tM_StartKill(m, pnum);\r\n\t\t\t\tmonster[m]._mmode = MM_STONE;\r\n\t\t\t} else {\r\n\t\t\t\tM_StartKill(m, pnum);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (resist) {\r\n\t\t\t\tPlayEffect(m, 1);\r\n\t\t\t} else if (monster[m]._mmode == MM_STONE) {\r\n\t\t\t\tif (m > MAX_PLRS - 1)\r\n\t\t\t\t\tM_StartHit(m, pnum, dam);\r\n\t\t\t\tmonster[m]._mmode = MM_STONE;\r\n\t\t\t} else {\r\n\t\t\t\tif (missiledata[t].mType == 0 && plr[pnum]._pIFlags & ISPL_KNOCKBACK) {\r\n\t\t\t\t\tM_GetKnockback(m);\r\n\t\t\t\t}\r\n\t\t\t\tif (m > MAX_PLRS - 1)\r\n\t\t\t\t\tM_StartHit(m, pnum, dam);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (monster[m]._msquelch == 0) {\r\n\t\t\tmonster[m]._msquelch = UCHAR_MAX;\r\n\t\t\tmonster[m]._lastx = plr[pnum]._px;\r\n\t\t\tmonster[m]._lasty = plr[pnum]._py;\r\n\t\t}\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag\r\n#ifdef HELLFIRE\r\n    ,\r\n    BOOLEAN *blocked\r\n#endif\r\n)\r\n{\r\n\tint hit, hper, tac, dam, blk, blkper, resper;\r\n#ifdef HELLFIRE\r\n\t*blocked = false;\r\n#endif\r\n\r\n\tif (plr[pnum]._pHitPoints >> 6 <= 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (plr[pnum]._pSpellFlags & 1 && missiledata[mtype].mType == 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\thit = random_(72, 100);\r\n#ifdef _DEBUG\r\n\tif (debug_mode_dollar_sign || debug_mode_key_inverted_v)\r\n\t\thit = 1000;\r\n#endif\r\n\tif (missiledata[mtype].mType == 0) {\r\n\t\ttac = plr[pnum]._pIAC + plr[pnum]._pIBonusAC + plr[pnum]._pDexterity / 5;\r\n\t\tif (m != -1) {\r\n\t\t\thper = monster[m].mHit\r\n\t\t\t    + ((monster[m].mLevel - plr[pnum]._pLevel) << 1)\r\n\t\t\t    + 30\r\n\t\t\t    - (dist << 1) - tac;\r\n\t\t} else {\r\n\t\t\thper = 100 - (tac >> 1) - (dist << 1);\r\n\t\t}\r\n\t} else {\r\n\t\tif (m != -1) {\r\n\t\t\thper = +40 - (plr[pnum]._pLevel << 1) - (dist << 1) + (monster[m].mLevel << 1);\r\n\t\t} else {\r\n\t\t\thper = 40;\r\n\t\t}\r\n\t}\r\n\r\n\tif (hper < 10)\r\n\t\thper = 10;\r\n\tif (currlevel == 14 && hper < 20) {\r\n\t\thper = 20;\r\n\t}\r\n\tif (currlevel == 15 && hper < 25) {\r\n\t\thper = 25;\r\n\t}\r\n\tif (currlevel == 16 && hper < 30) {\r\n\t\thper = 30;\r\n\t}\r\n\r\n\tif ((plr[pnum]._pmode == PM_STAND || plr[pnum]._pmode == PM_ATTACK) && plr[pnum]._pBlockFlag) {\r\n\t\tblk = random_(73, 100);\r\n\t} else {\r\n\t\tblk = 100;\r\n\t}\r\n\r\n\tif (shift == TRUE)\r\n\t\tblk = 100;\r\n\tif (mtype == MIS_ACIDPUD)\r\n\t\tblk = 100;\r\n\tif (m != -1)\r\n\t\tblkper = plr[pnum]._pBaseToBlk + plr[pnum]._pDexterity - ((monster[m].mLevel - plr[pnum]._pLevel) << 1);\r\n\telse\r\n\t\tblkper = plr[pnum]._pBaseToBlk + plr[pnum]._pDexterity;\r\n\tif (blkper < 0)\r\n\t\tblkper = 0;\r\n\tif (blkper > 100)\r\n\t\tblkper = 100;\r\n\r\n\tswitch (missiledata[mtype].mResist) {\r\n\tcase MISR_FIRE:\r\n\t\tresper = plr[pnum]._pFireResist;\r\n\t\tbreak;\r\n\tcase MISR_LIGHTNING:\r\n\t\tresper = plr[pnum]._pLghtResist;\r\n\t\tbreak;\r\n\tcase MISR_MAGIC:\r\n\tcase MISR_ACID:\r\n\t\tresper = plr[pnum]._pMagResist;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tresper = 0;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (hit < hper) {\r\n\t\tif (mtype == MIS_BONESPIRIT) {\r\n\t\t\tdam = plr[pnum]._pHitPoints / 3;\r\n\t\t} else {\r\n\t\t\tif (shift == FALSE) {\r\n\r\n\t\t\t\tdam = (mind << 6) + random_(75, (maxd - mind + 1) << 6);\r\n#ifndef HELLFIRE\r\n\t\t\t\tif (m == -1)\r\n#endif\r\n\t\t\t\t\tif (plr[pnum]._pIFlags & ISPL_ABSHALFTRAP)\r\n\t\t\t\t\t\tdam >>= 1;\r\n\t\t\t\tdam += (plr[pnum]._pIGetHit << 6);\r\n\t\t\t} else {\r\n\t\t\t\tdam = mind + random_(75, maxd - mind + 1);\r\n#ifndef HELLFIRE\r\n\t\t\t\tif (m == -1)\r\n#endif\r\n\t\t\t\t\tif (plr[pnum]._pIFlags & ISPL_ABSHALFTRAP)\r\n\t\t\t\t\t\tdam >>= 1;\r\n\t\t\t\tdam += plr[pnum]._pIGetHit;\r\n\t\t\t}\r\n\r\n\t\t\tif (dam < 64)\r\n\t\t\t\tdam = 64;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (blk < blkper) {\r\n\t\t\tif (m != -1) {\r\n\t\t\t\ttac = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[m]._mx, monster[m]._my);\r\n\t\t\t} else {\r\n\t\t\t\ttac = plr[pnum]._pdir;\r\n\t\t\t}\r\n\t\t\t*blocked = true;\r\n\t\t\tStartPlrBlock(pnum, tac);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n#endif\r\n\t\tif (resper > 0) {\r\n\r\n\t\t\tdam = dam - dam * resper / 100;\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\tplr[pnum]._pHitPoints -= dam;\r\n\t\t\t\tplr[pnum]._pHPBase -= dam;\r\n\t\t\t}\r\n\t\t\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\t\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\t\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\t\t}\r\n\r\n\t\t\tif (plr[pnum]._pHitPoints >> 6 <= 0) {\r\n\t\t\t\tSyncPlrKill(pnum, earflag);\r\n\t\t\t} else {\r\n\t\t\t\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\t\t\tPlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py);\r\n#ifndef SPAWN\r\n\t\t\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\t\t\tPlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\t\t\tPlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\t\t\tPlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\t\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\t\t\t\tPlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\t\t\tPlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py);\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t\tdrawhpflag = TRUE;\r\n\t\t\t}\r\n\t\t\treturn TRUE;\r\n\t\t} else {\r\n#ifndef HELLFIRE\r\n\t\t\tif (blk < blkper) {\r\n\t\t\t\tif (m != -1) {\r\n\t\t\t\t\ttac = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[m]._mx, monster[m]._my);\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttac = plr[pnum]._pdir;\r\n\t\t\t\t}\r\n\t\t\t\tStartPlrBlock(pnum, tac);\r\n\t\t\t} else\r\n#endif\r\n\t\t\t{\r\n\t\t\t\tif (pnum == myplr) {\r\n\t\t\t\t\tplr[pnum]._pHitPoints -= dam;\r\n\t\t\t\t\tplr[pnum]._pHPBase -= dam;\r\n\t\t\t\t}\r\n\t\t\t\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\t\t\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\t\t\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\t\t\t}\r\n\t\t\t\tif (plr[pnum]._pHitPoints >> 6 <= 0) {\r\n\t\t\t\t\tSyncPlrKill(pnum, earflag);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tStartPlrHit(pnum, dam, FALSE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, BOOLEAN shift\r\n#ifdef HELLFIRE\r\n    ,\r\n    BOOLEAN *blocked\r\n#endif\r\n)\r\n{\r\n\tint dam, blk, blkper, hper, hit, resper;\r\n\r\n#ifdef HELLFIRE\r\n\t*blocked = false;\r\n#endif\r\n\tif (plr[p]._pInvincible) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (mtype == MIS_HBOLT) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (plr[p]._pSpellFlags & 1 && missiledata[mtype].mType == 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tswitch (missiledata[mtype].mResist) {\r\n\tcase MISR_FIRE:\r\n\t\tresper = plr[p]._pFireResist;\r\n\t\tbreak;\r\n\tcase MISR_LIGHTNING:\r\n\t\tresper = plr[p]._pLghtResist;\r\n\t\tbreak;\r\n\tcase MISR_MAGIC:\r\n\tcase MISR_ACID:\r\n\t\tresper = plr[p]._pMagResist;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tresper = 0;\r\n\t\tbreak;\r\n\t}\r\n\thper = random_(69, 100);\r\n\tif (missiledata[mtype].mType == 0) {\r\n\t\thit = plr[pnum]._pIBonusToHit\r\n\t\t    + plr[pnum]._pLevel\r\n\t\t    - (dist * dist >> 1)\r\n\t\t    - plr[p]._pDexterity / 5\r\n\t\t    - plr[p]._pIBonusAC\r\n\t\t    - plr[p]._pIAC\r\n\t\t    + plr[pnum]._pDexterity + 50;\r\n\t\tif (plr[pnum]._pClass == PC_ROGUE)\r\n\t\t\thit += 20;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR || plr[pnum]._pClass == PC_BARD)\r\n#else\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR)\r\n#endif\r\n\t\t\thit += 10;\r\n\t} else {\r\n\t\thit = plr[pnum]._pMagic\r\n\t\t    - (plr[p]._pLevel << 1)\r\n\t\t    - dist\r\n\t\t    + 50;\r\n\t\tif (plr[pnum]._pClass == PC_SORCERER)\r\n\t\t\thit += 20;\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[pnum]._pClass == PC_BARD)\r\n\t\t\thit += 10;\r\n#endif\r\n\t}\r\n\tif (hit < 5)\r\n\t\thit = 5;\r\n\tif (hit > 95)\r\n\t\thit = 95;\r\n\tif (hper < hit) {\r\n\t\tif ((plr[p]._pmode == PM_STAND || plr[p]._pmode == PM_ATTACK) && plr[p]._pBlockFlag) {\r\n\t\t\tblkper = random_(73, 100);\r\n\t\t} else {\r\n\t\t\tblkper = 100;\r\n\t\t}\r\n\t\tif (shift == TRUE)\r\n\t\t\tblkper = 100;\r\n\t\tblk = plr[p]._pDexterity + plr[p]._pBaseToBlk + (plr[p]._pLevel << 1) - (plr[pnum]._pLevel << 1);\r\n\r\n\t\tif (blk < 0) {\r\n\t\t\tblk = 0;\r\n\t\t}\r\n\t\tif (blk > 100) {\r\n\t\t\tblk = 100;\r\n\t\t}\r\n\r\n\t\tif (mtype == MIS_BONESPIRIT) {\r\n\t\t\tdam = plr[p]._pHitPoints / 3;\r\n\t\t} else {\r\n\t\t\tdam = mindam + random_(70, maxdam - mindam + 1);\r\n\t\t\tif (missiledata[mtype].mType == 0)\r\n\t\t\t\tdam += plr[pnum]._pIBonusDamMod + plr[pnum]._pDamageMod + dam * plr[pnum]._pIBonusDam / 100;\r\n\t\t\tif (!shift)\r\n\t\t\t\tdam <<= 6;\r\n\t\t}\r\n\t\tif (missiledata[mtype].mType != 0)\r\n\t\t\tdam >>= 1;\r\n\t\tif (resper > 0) {\r\n\t\t\tdam -= (dam * resper) / 100;\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdDamage(TRUE, p, dam);\r\n\t\t\tif (plr[pnum]._pClass == PC_WARRIOR) {// BUGFIX: should use p instead of pnum\r\n\t\t\t\tPlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py);// BUGFIX: should use p instead of pnum\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {// BUGFIX: should use p instead of pnum\r\n\t\t\t\tPlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py);// BUGFIX: should use p instead of pnum\r\n\t\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {// BUGFIX: should use p instead of pnum\r\n\t\t\t\tPlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py);// BUGFIX: should use p instead of pnum\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t\t} else if (plr[pnum]._pClass == PC_MONK) {// BUGFIX: should use p instead of pnum\r\n\t\t\t\tPlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py);// BUGFIX: should use p instead of pnum\r\n\t\t\t} else if (plr[pnum]._pClass == PC_BARD) {// BUGFIX: should use p instead of pnum\r\n\t\t\t\tPlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py);// BUGFIX: should use p instead of pnum\r\n\t\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {// BUGFIX: should use p instead of pnum\r\n\t\t\t\tPlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py);// BUGFIX: should use p instead of pnum\r\n#endif\r\n\t\t\t}\r\n\t\t\treturn TRUE;\r\n\t\t} else {\r\n\t\t\tif (blkper < blk) {\r\n\t\t\t\tStartPlrBlock(p, GetDirection(plr[p]._px, plr[p]._py, plr[pnum]._px, plr[pnum]._py));\r\n#ifdef HELLFIRE\r\n\t\t\t\t*blocked = true;\r\n#endif\r\n\t\t\t} else {\r\n\t\t\t\tif (pnum == myplr)\r\n\t\t\t\t\tNetSendCmdDamage(TRUE, p, dam);\r\n\t\t\t\tStartPlrHit(p, dam, FALSE);\r\n\t\t\t}\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\treturn FALSE;\r\n}\r\n\r\nvoid CheckMissileCol(int i, int mindam, int maxdam, BOOL shift, int mx, int my, BOOLEAN nodel)\r\n{\r\n\tint oi;\r\n#ifdef HELLFIRE\r\n\tint dir, mAnimFAmt;\r\n\tBOOLEAN blocked;\r\n\r\n\tif (i >= MAXMISSILES || i < 0)\r\n\t\treturn;\r\n\tif (mx >= MAXDUNX || mx < 0)\r\n\t\treturn;\r\n\tif (my >= MAXDUNY || my < 0)\r\n\t\treturn;\r\n\tif (missile[i]._micaster != TARGET_BOTH && missile[i]._misource != -1) {\r\n#else\r\n\tif (missile[i]._miAnimType != MFILE_FIREWAL && missile[i]._misource != -1) {\r\n#endif\r\n\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\tif (dMonster[mx][my] > 0) {\r\n\t\t\t\tif (MonsterMHit(\r\n\t\t\t\t        missile[i]._misource,\r\n\t\t\t\t        dMonster[mx][my] - 1,\r\n\t\t\t\t        mindam,\r\n\t\t\t\t        maxdam,\r\n\t\t\t\t        missile[i]._midist,\r\n\t\t\t\t        missile[i]._mitype,\r\n\t\t\t\t        shift)) {\r\n\t\t\t\t\tif (!nodel)\r\n\t\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (dMonster[mx][my] < 0\r\n\t\t\t\t    && monster[-(dMonster[mx][my] + 1)]._mmode == MM_STONE\r\n\t\t\t\t    && MonsterMHit(\r\n\t\t\t\t        missile[i]._misource,\r\n\t\t\t\t        -(dMonster[mx][my] + 1),\r\n\t\t\t\t        mindam,\r\n\t\t\t\t        maxdam,\r\n\t\t\t\t        missile[i]._midist,\r\n\t\t\t\t        missile[i]._mitype,\r\n\t\t\t\t        shift)) {\r\n\t\t\t\t\tif (!nodel)\r\n\t\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (dPlayer[mx][my] > 0\r\n\t\t\t    && dPlayer[mx][my] - 1 != missile[i]._misource\r\n\t\t\t    && Plr2PlrMHit(\r\n\t\t\t        missile[i]._misource,\r\n\t\t\t        dPlayer[mx][my] - 1,\r\n\t\t\t        mindam,\r\n\t\t\t        maxdam,\r\n\t\t\t        missile[i]._midist,\r\n\t\t\t        missile[i]._mitype,\r\n\t\t\t        shift\r\n#ifdef HELLFIRE\r\n\t\t\t        ,\r\n\t\t\t        &blocked\r\n#endif\r\n\t\t\t        )) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (blocked) {\r\n\t\t\t\t\tdir = missile[i]._mimfnum + (random_(10, 2) ? 1 : -1);\r\n\t\t\t\t\tmAnimFAmt = misfiledata[missile[i]._miAnimType].mAnimFAmt;\r\n\t\t\t\t\tif (dir < 0)\r\n\t\t\t\t\t\tdir = mAnimFAmt - 1;\r\n\t\t\t\t\telse if (dir > mAnimFAmt)\r\n\t\t\t\t\t\tdir = 0;\r\n\r\n\t\t\t\t\tSetMissDir(i, dir);\r\n\t\t\t\t} else\r\n#endif\r\n\t\t\t\t{\r\n\t\t\t\t\tif (!nodel)\r\n\t\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\t}\r\n\t\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (monster[missile[i]._misource]._mFlags & MFLAG_TARGETS_MONSTER\r\n\t\t\t    && dMonster[mx][my] > 0\r\n\t\t\t    && monster[dMonster[mx][my] - 1]._mFlags & MFLAG_GOLEM\r\n\t\t\t    && MonsterTrapHit(dMonster[mx][my] - 1, mindam, maxdam, missile[i]._midist, missile[i]._mitype, shift)) {\r\n\t\t\t\tif (!nodel)\r\n\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dPlayer[mx][my] > 0\r\n\t\t\t    && PlayerMHit(\r\n\t\t\t        dPlayer[mx][my] - 1,\r\n\t\t\t        missile[i]._misource,\r\n\t\t\t        missile[i]._midist,\r\n\t\t\t        mindam,\r\n\t\t\t        maxdam,\r\n\t\t\t        missile[i]._mitype,\r\n\t\t\t        shift,\r\n\t\t\t        0\r\n#ifdef HELLFIRE\r\n\t\t\t        ,\r\n\t\t\t        &blocked\r\n#endif\r\n\t\t\t        )) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (blocked) {\r\n\t\t\t\t\tdir = missile[i]._mimfnum + (random_(10, 2) ? 1 : -1);\r\n\t\t\t\t\tmAnimFAmt = misfiledata[missile[i]._miAnimType].mAnimFAmt;\r\n\t\t\t\t\tif (dir < 0)\r\n\t\t\t\t\t\tdir = mAnimFAmt - 1;\r\n\t\t\t\t\telse if (dir > mAnimFAmt)\r\n\t\t\t\t\t\tdir = 0;\r\n\r\n\t\t\t\t\tSetMissDir(i, dir);\r\n\t\t\t\t} else\r\n#endif\r\n\t\t\t\t{\r\n\t\t\t\t\tif (!nodel)\r\n\t\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\t}\r\n\t\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tif (dMonster[mx][my] > 0) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (missile[i]._micaster == TARGET_BOTH) {\r\n#else\r\n\t\t\tif (missile[i]._miAnimType == MFILE_FIREWAL) {\r\n#endif\r\n\t\t\t\tif (MonsterMHit(\r\n\t\t\t\t        missile[i]._misource,\r\n\t\t\t\t        dMonster[mx][my] - 1,\r\n\t\t\t\t        mindam,\r\n\t\t\t\t        maxdam,\r\n\t\t\t\t        missile[i]._midist,\r\n\t\t\t\t        missile[i]._mitype,\r\n\t\t\t\t        shift)) {\r\n\t\t\t\t\tif (!nodel)\r\n\t\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t\t\t}\r\n\t\t\t} else if (MonsterTrapHit(dMonster[mx][my] - 1, mindam, maxdam, missile[i]._midist, missile[i]._mitype, shift)) {\r\n\t\t\t\tif (!nodel)\r\n\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dPlayer[mx][my] > 0\r\n\t\t    && PlayerMHit(dPlayer[mx][my] - 1, -1, missile[i]._midist, mindam, maxdam, missile[i]._mitype, shift, missile[i]._miAnimType == MFILE_FIREWAL\r\n#ifdef HELLFIRE\r\n\t\t            || missile[i]._miAnimType == MFILE_LGHNING,\r\n\t\t        &blocked\r\n#endif\r\n\t\t        )) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (blocked) {\r\n\t\t\t\tdir = missile[i]._mimfnum + (random_(10, 2) ? 1 : -1);\r\n\t\t\t\tmAnimFAmt = misfiledata[missile[i]._miAnimType].mAnimFAmt;\r\n\t\t\t\tif (dir < 0)\r\n\t\t\t\t\tdir = mAnimFAmt - 1;\r\n\t\t\t\telse if (dir > mAnimFAmt)\r\n\t\t\t\t\tdir = 0;\r\n\r\n\t\t\t\tSetMissDir(i, dir);\r\n\t\t\t} else\r\n#endif\r\n\t\t\t{\r\n\t\t\t\tif (!nodel)\r\n\t\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t}\r\n\t\t\tmissile[i]._miHitFlag = TRUE;\r\n\t\t}\r\n\t}\r\n\tif (dObject[mx][my] != 0) {\r\n\t\toi = dObject[mx][my] > 0 ? dObject[mx][my] - 1 : -(dObject[mx][my] + 1);\r\n\t\tif (!object[oi]._oMissFlag) {\r\n\t\t\tif (object[oi]._oBreak == 1)\r\n\t\t\t\tBreakObject(-1, oi);\r\n\t\t\tif (!nodel)\r\n\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\tmissile[i]._miHitFlag = FALSE;\r\n\t\t}\r\n\t}\r\n\tif (nMissileTable[dPiece[mx][my]]) {\r\n\t\tif (!nodel)\r\n\t\t\tmissile[i]._mirange = 0;\r\n\t\tmissile[i]._miHitFlag = FALSE;\r\n\t}\r\n\tif (missile[i]._mirange == 0 && missiledata[missile[i]._mitype].miSFX != -1)\r\n\t\tPlaySfxLoc(missiledata[missile[i]._mitype].miSFX, missile[i]._mix, missile[i]._miy);\r\n}\r\n\r\nvoid SetMissAnim(int mi, int animtype)\r\n{\r\n\tint dir = missile[mi]._mimfnum;\r\n\r\n\tmissile[mi]._miAnimType = animtype;\r\n\tmissile[mi]._miAnimFlags = misfiledata[animtype].mFlags;            // BUGFIX: buffer overflow for MFILE_NONE (255).\r\n\tmissile[mi]._miAnimData = misfiledata[animtype].mAnimData[dir];     // BUGFIX: buffer overflow for MFILE_NONE (255).\r\n\tmissile[mi]._miAnimDelay = misfiledata[animtype].mAnimDelay[dir];   // BUGFIX: buffer overflow for MFILE_NONE (255).\r\n\tmissile[mi]._miAnimLen = misfiledata[animtype].mAnimLen[dir];       // BUGFIX: buffer overflow for MFILE_NONE (255).\r\n\tmissile[mi]._miAnimWidth = misfiledata[animtype].mAnimWidth[dir];   // BUGFIX: buffer overflow for MFILE_NONE (255).\r\n\tmissile[mi]._miAnimWidth2 = misfiledata[animtype].mAnimWidth2[dir]; // BUGFIX: buffer overflow for MFILE_NONE (255).\r\n\tmissile[mi]._miAnimCnt = 0;\r\n\tmissile[mi]._miAnimFrame = 1;\r\n}\r\n\r\nvoid SetMissDir(int mi, int dir)\r\n{\r\n\tmissile[mi]._mimfnum = dir;\r\n\tSetMissAnim(mi, missile[mi]._miAnimType);\r\n}\r\n\r\nvoid LoadMissileGFX(BYTE mi)\r\n{\r\n\tchar pszName[256];\r\n\tint i;\r\n\tBYTE *file;\r\n\tMisFileData *mfd;\r\n\r\n\tmfd = &misfiledata[mi];\r\n\tif (mfd->mFlags & MFLAG_ALLOW_SPECIAL) {\r\n\t\tsprintf(pszName, \"Missiles\\\\%s.CL2\", mfd->mName);\r\n\t\tfile = LoadFileInMem(pszName, NULL);\r\n\t\tfor (i = 0; i < mfd->mAnimFAmt; i++)\r\n\t\t\tmfd->mAnimData[i] = &file[((int *)file)[i]];\r\n\t} else if (mfd->mAnimFAmt == 1) {\r\n\t\tsprintf(pszName, \"Missiles\\\\%s.CL2\", mfd->mName);\r\n\t\tif (!mfd->mAnimData[0])\r\n\t\t\tmfd->mAnimData[0] = LoadFileInMem(pszName, NULL);\r\n\t} else {\r\n\t\tfor (i = 0; i < mfd->mAnimFAmt; i++) {\r\n\t\t\tsprintf(pszName, \"Missiles\\\\%s%i.CL2\", mfd->mName, i + 1);\r\n\t\t\tif (!mfd->mAnimData[i]) {\r\n\t\t\t\tfile = LoadFileInMem(pszName, NULL);\r\n\t\t\t\tmfd->mAnimData[i] = file;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid InitMissileGFX()\r\n{\r\n\tint mi;\r\n\r\n\tfor (mi = 0; misfiledata[mi].mAnimFAmt; mi++) {\r\n\t\tif (!(misfiledata[mi].mFlags & MFLAG_HIDDEN))\r\n\t\t\tLoadMissileGFX(mi);\r\n\t}\r\n}\r\n\r\nvoid FreeMissileGFX(int mi)\r\n{\r\n\tint i;\r\n\tDWORD *p;\r\n\r\n\tif (misfiledata[mi].mFlags & MFLAG_ALLOW_SPECIAL) {\r\n\t\tif (misfiledata[mi].mAnimData[0]) {\r\n\t\t\tp = (DWORD *)misfiledata[mi].mAnimData[0];\r\n\t\t\tp -= misfiledata[mi].mAnimFAmt;\r\n\t\t\tMemFreeDbg(p);\r\n\t\t\tmisfiledata[mi].mAnimData[0] = NULL;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (i = 0; i < misfiledata[mi].mAnimFAmt; i++) {\r\n\t\tif (misfiledata[mi].mAnimData[i]) {\r\n\t\t\tMemFreeDbg(misfiledata[mi].mAnimData[i]);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid FreeMissiles()\r\n{\r\n\tint mi;\r\n\r\n\tfor (mi = 0; misfiledata[mi].mAnimFAmt; mi++) {\r\n\t\tif (!(misfiledata[mi].mFlags & MFLAG_HIDDEN))\r\n\t\t\tFreeMissileGFX(mi);\r\n\t}\r\n}\r\n\r\nvoid FreeMissiles2()\r\n{\r\n\tint mi;\r\n\r\n\tfor (mi = 0; misfiledata[mi].mAnimFAmt; mi++) {\r\n\t\tif (misfiledata[mi].mFlags & MFLAG_HIDDEN)\r\n\t\t\tFreeMissileGFX(mi);\r\n\t}\r\n}\r\n\r\nvoid InitMissiles()\r\n{\r\n\tint mi, src, i, j;\r\n\r\n#ifdef HELLFIRE\r\n\tAutoMapShowItems = FALSE;\r\n#endif\r\n\tplr[myplr]._pSpellFlags &= ~0x1;\r\n\tif (plr[myplr]._pInfraFlag == TRUE) {\r\n\t\tfor (i = 0; i < nummissiles; ++i) {\r\n\t\t\tmi = missileactive[i];\r\n\t\t\tif (missile[mi]._mitype == MIS_INFRA) {\r\n\t\t\t\tsrc = missile[mi]._misource;\r\n\t\t\t\tif (src == myplr)\r\n\t\t\t\t\tCalcPlrItemVals(src, TRUE);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif ((plr[myplr]._pSpellFlags & 2) == 2 || (plr[myplr]._pSpellFlags & 4) == 4) {\r\n\t\tplr[myplr]._pSpellFlags &= ~0x2;\r\n\t\tplr[myplr]._pSpellFlags &= ~0x4;\r\n\t\tfor (i = 0; i < nummissiles; ++i) {\r\n\t\t\tmi = missileactive[i];\r\n\t\t\tif (missile[mi]._mitype == MIS_BLODBOIL) {\r\n\t\t\t\tif (missile[mi]._misource == myplr) {\r\n\t\t\t\t\tint missingHP = plr[myplr]._pMaxHP - plr[myplr]._pHitPoints;\r\n\t\t\t\t\tCalcPlrItemVals(myplr, TRUE);\r\n\t\t\t\t\tplr[myplr]._pHitPoints -= missingHP + missile[mi]._miVar2;\r\n\t\t\t\t\tif (plr[myplr]._pHitPoints < 64) {\r\n\t\t\t\t\t\tplr[myplr]._pHitPoints = 64;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tnummissiles = 0;\r\n\tfor (i = 0; i < MAXMISSILES; i++) {\r\n\t\tmissileavail[i] = i;\r\n\t\tmissileactive[i] = 0;\r\n\t}\r\n\tnumchains = 0;\r\n\tfor (i = 0; i < MAXMISSILES; i++) {\r\n\t\tchain[i].idx = -1;\r\n\t\tchain[i]._mitype = 0;\r\n\t\tchain[i]._mirange = 0;\r\n\t}\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tdFlags[i][j] &= ~BFLAG_MISSILE;\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\tplr[myplr].wReflections = 0;\r\n#endif\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid missiles_hive_explosion(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tAddMissile(80, 62, 80, 62, midir, MIS_HIVEEXP, mienemy, id, dam, 0);\r\n\tAddMissile(80, 63, 80, 62, midir, MIS_HIVEEXP, mienemy, id, dam, 0);\r\n\tAddMissile(81, 62, 80, 62, midir, MIS_HIVEEXP, mienemy, id, dam, 0);\r\n\tAddMissile(81, 63, 80, 62, midir, MIS_HIVEEXP, mienemy, id, dam, 0);\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n}\r\n\r\nstatic BOOLEAN missiles_found_target(int mi, int *x, int *y, int rad)\r\n{\r\n\tBOOLEAN found;\r\n\tint i, j, k, tx, ty, dp;\r\n\r\n\tfound = FALSE;\r\n\r\n\tif (rad > 19)\r\n\t\trad = 19;\r\n\r\n\tfor (j = 0; j < rad; j++) {\r\n\t\tif (found) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tk = CrawlNum[j] + 2;\r\n\t\tfor (i = CrawlTable[CrawlNum[j]]; i > 0; i--, k += 2) {\r\n\t\t\ttx = *x + CrawlTable[k - 1];\r\n\t\t\tty = *y + CrawlTable[k];\r\n\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\tdp = dPiece[tx][ty];\r\n\t\t\t\tif (!nSolidTable[dp] && dObject[tx][ty] == 0 && dMissile[tx][ty] == 0) {\r\n\t\t\t\t\tmissile[mi]._mix = tx;\r\n\t\t\t\t\tmissile[mi]._miy = ty;\r\n\t\t\t\t\t*x = tx;\r\n\t\t\t\t\t*y = ty;\r\n\t\t\t\t\tfound = TRUE;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn found;\r\n}\r\n\r\nvoid missiles_fire_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (LineClear(sx, sy, dx, dy)) {\r\n\t\tif (id >= 0)\r\n\t\t\tUseMana(id, SPL_RUNEFIRE);\r\n\t\tif (missiles_found_target(mi, &dx, &dy, 10)) {\r\n\t\t\tmissile[mi]._miVar1 = MIS_HIVEEXP;\r\n\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\tmissile[mi]._mlid = AddLight(dx, dy, 8);\r\n\t\t} else {\r\n\t\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid missiles_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (LineClear(sx, sy, dx, dy)) {\r\n\t\tif (id >= 0)\r\n\t\t\tUseMana(id, SPL_RUNELIGHT);\r\n\t\tif (missiles_found_target(mi, &dx, &dy, 10)) {\r\n\t\t\tmissile[mi]._miVar1 = MIS_LIGHTBALL;\r\n\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\tmissile[mi]._mlid = AddLight(dx, dy, 8);\r\n\t\t} else {\r\n\t\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid missiles_great_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (LineClear(sx, sy, dx, dy)) {\r\n\t\tif (id >= 0)\r\n\t\t\tUseMana(id, SPL_RUNENOVA);\r\n\t\tif (missiles_found_target(mi, &dx, &dy, 10)) {\r\n\t\t\tmissile[mi]._miVar1 = MIS_NOVA;\r\n\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\tmissile[mi]._mlid = AddLight(dx, dy, 8);\r\n\t\t} else {\r\n\t\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid missiles_immolation_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (LineClear(sx, sy, dx, dy)) {\r\n\t\tif (id >= 0)\r\n\t\t\tUseMana(id, SPL_RUNEIMMOLAT);\r\n\t\tif (missiles_found_target(mi, &dx, &dy, 10)) {\r\n\t\t\tmissile[mi]._miVar1 = MIS_IMMOLATION;\r\n\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\tmissile[mi]._mlid = AddLight(dx, dy, 8);\r\n\t\t} else {\r\n\t\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid missiles_stone_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (LineClear(sx, sy, dx, dy)) {\r\n\t\tif (id >= 0)\r\n\t\t\tUseMana(id, SPL_RUNESTONE);\r\n\t\tif (missiles_found_target(mi, &dx, &dy, 10)) {\r\n\t\t\tmissile[mi]._miVar1 = MIS_STONE;\r\n\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\tmissile[mi]._mlid = AddLight(dx, dy, 8);\r\n\t\t} else {\r\n\t\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid missiles_reflection(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint lvl;\r\n\r\n\tif (id >= 0) {\r\n\t\tif (missile[mi]._mispllvl)\r\n\t\t\tlvl = missile[mi]._mispllvl;\r\n\t\telse\r\n\t\t\tlvl = 2;\r\n\t\tplr[id].wReflections += lvl * plr[id]._pLevel;\r\n\t\tUseMana(id, SPL_REFLECT);\r\n\t}\r\n\tmissile[mi]._mirange = 0;\r\n\tmissile[mi]._miDelFlag = 0;\r\n}\r\n\r\nvoid missiles_berserk(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, j, k, tx, ty, dm, r;\r\n\r\n\tif (id >= 0) {\r\n\t\tmissile[mi]._misource = id;\r\n\t\tfor (j = 0; j < 6; j++) {\r\n\t\t\tk = CrawlNum[j] + 2;\r\n\t\t\tfor (i = CrawlTable[CrawlNum[j]]; i > 0; i--, k += 2) {\r\n\t\t\t\ttx = dx + CrawlTable[k - 1];\r\n\t\t\t\tty = dy + CrawlTable[k];\r\n\t\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\t\tdm = dMonster[tx][ty];\r\n\t\t\t\t\tdm = dm > 0 ? dm - 1 : -(dm + 1);\r\n\t\t\t\t\tif (dm > 3) {\r\n\t\t\t\t\t\tif (!monster[dm]._uniqtype && monster[dm]._mAi != AI_DIABLO) {\r\n\t\t\t\t\t\t\tif (monster[dm]._mmode != MM_FADEIN && monster[dm]._mmode != MM_FADEOUT) {\r\n\t\t\t\t\t\t\t\tif (!(monster[dm].mMagicRes & IMMUNE_MAGIC)) {\r\n\t\t\t\t\t\t\t\t\tif ((!(monster[dm].mMagicRes & RESIST_MAGIC) || (monster[dm].mMagicRes & RESIST_MAGIC) == 1 && !random_(99, 2)) && monster[dm]._mmode != MM_CHARGE) {\r\n\t\t\t\t\t\t\t\t\t\tj = 6;\r\n\t\t\t\t\t\t\t\t\t\tdouble slvl = (double)GetSpellLevel(id, SPL_BERSERK);\r\n\t\t\t\t\t\t\t\t\t\tmonster[dm]._mFlags |= MFLAG_BERSERK | MFLAG_GOLEM;\r\n\t\t\t\t\t\t\t\t\t\tmonster[dm].mMinDamage = ((double)(random_(145, 10) + 20) / 100 - -1) * (double)monster[dm].mMinDamage + slvl;\r\n\t\t\t\t\t\t\t\t\t\tmonster[dm].mMaxDamage = ((double)(random_(145, 10) + 20) / 100 - -1) * (double)monster[dm].mMaxDamage + slvl;\r\n\t\t\t\t\t\t\t\t\t\tmonster[dm].mMinDamage2 = ((double)(random_(145, 10) + 20) / 100 - -1) * (double)monster[dm].mMinDamage2 + slvl;\r\n\t\t\t\t\t\t\t\t\t\tmonster[dm].mMaxDamage2 = ((double)(random_(145, 10) + 20) / 100 - -1) * (double)monster[dm].mMaxDamage2 + slvl;\r\n\t\t\t\t\t\t\t\t\t\tif (currlevel < 17 || currlevel > 20)\r\n\t\t\t\t\t\t\t\t\t\t\tr = 3;\r\n\t\t\t\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\t\t\t\tr = 9;\r\n\t\t\t\t\t\t\t\t\t\tmonster[dm].mlid = AddLight(monster[dm]._mx, monster[dm]._my, r);\r\n\t\t\t\t\t\t\t\t\t\tUseMana(id, SPL_BERSERK);\r\n\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._mirange = 0;\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid missiles_hork_spawn(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 8);\r\n\tmissile[mi]._mirange = 9;\r\n\tmissile[mi]._miVar1 = midir;\r\n\tPutMissile(mi);\r\n}\r\n\r\nvoid missiles_jester(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint spell;\r\n\r\n\tspell = MIS_FIREBOLT;\r\n\tswitch (random_(255, 10)) {\r\n\tcase 0:\r\n\tcase 1:\r\n\t\tspell = MIS_FIREBOLT;\r\n\t\tbreak;\r\n\tcase 2:\r\n\t\tspell = MIS_FIREBALL;\r\n\t\tbreak;\r\n\tcase 3:\r\n\t\tspell = MIS_FIREWALLC;\r\n\t\tbreak;\r\n\tcase 4:\r\n\t\tspell = MIS_GUARDIAN;\r\n\t\tbreak;\r\n\tcase 5:\r\n\t\tspell = MIS_CHAIN;\r\n\t\tbreak;\r\n\tcase 6:\r\n\t\tspell = MIS_TOWN;\r\n\t\tUseMana(id, SPL_TOWN);\r\n\t\tbreak;\r\n\tcase 7:\r\n\t\tspell = MIS_TELEPORT;\r\n\t\tbreak;\r\n\tcase 8:\r\n\t\tspell = MIS_APOCA;\r\n\t\tbreak;\r\n\tcase 9:\r\n\t\tspell = MIS_STONE;\r\n\t\tbreak;\r\n\t}\r\n\tAddMissile(sx, sy, dx, dy, midir, spell, missile[mi]._micaster, missile[mi]._misource, 0, missile[mi]._mispllvl);\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tmissile[mi]._mirange = 0;\r\n}\r\n\r\nvoid missiles_steal_pots(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, l, k, j, tx, ty, si, ii, pnum;\r\n\tBOOL hasPlayedSFX;\r\n\r\n\tmissile[mi]._misource = id;\r\n\tfor (i = 0; i < 3; i++) {\r\n\t\tk = CrawlNum[i];\r\n\t\tl = k + 2;\r\n\t\tfor (j = CrawlTable[k]; j > 0; j--, l += 2) {\r\n\t\t\ttx = sx + CrawlTable[l - 1];\r\n\t\t\tty = sy + CrawlTable[l];\r\n\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\tpnum = dPlayer[tx][ty];\r\n\t\t\t\tif (pnum) {\r\n\t\t\t\t\tpnum = pnum > 0 ? pnum - 1 : -(pnum + 1);\r\n\r\n\t\t\t\t\thasPlayedSFX = FALSE;\r\n\t\t\t\t\tfor (si = 0; si < MAXBELTITEMS; si++) {\r\n\t\t\t\t\t\tii = -1;\r\n\t\t\t\t\t\tif (plr[pnum].SpdList[si]._itype == ITYPE_MISC) {\r\n\t\t\t\t\t\t\tif (random_(205, 2) == 0)\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\tswitch (plr[pnum].SpdList[si]._iMiscId) {\r\n\t\t\t\t\t\t\tcase IMISC_FULLHEAL:\r\n\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_HEAL);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase IMISC_HEAL:\r\n\t\t\t\t\t\t\tcase IMISC_MANA:\r\n\t\t\t\t\t\t\t\tRemoveSpdBarItem(pnum, si);\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\tcase IMISC_FULLMANA:\r\n\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_MANA);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase IMISC_REJUV:\r\n\t\t\t\t\t\t\t\tif (random_(205, 2) != 0) {\r\n\t\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_MANA);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_HEAL);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_HEAL);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase IMISC_FULLREJUV:\r\n\t\t\t\t\t\t\t\tswitch (random_(205, 3)) {\r\n\t\t\t\t\t\t\t\tcase 0:\r\n\t\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_FULLMANA);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tcase 1:\r\n\t\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_FULLHEAL);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\tii = ItemMiscIdIdx(IMISC_REJUV);\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (ii != -1) {\r\n\t\t\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, ii);\r\n\t\t\t\t\t\t\tGetPlrHandSeed(&plr[pnum].HoldItem);\r\n\t\t\t\t\t\t\tplr[pnum].HoldItem._iStatFlag = TRUE;\r\n\t\t\t\t\t\t\tplr[pnum].SpdList[si] = plr[pnum].HoldItem;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!hasPlayedSFX) {\r\n\t\t\t\t\t\t\tPlaySfxLoc(IS_POPPOP2, tx, ty);\r\n\t\t\t\t\t\t\thasPlayedSFX = TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tforce_redraw = 255;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._mirange = 0;\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid missiles_mana_trap(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, pn, k, j, tx, ty, pid;\r\n\r\n\tmissile[mi]._misource = id;\r\n\tfor (i = 0; i < 3; i++) {\r\n\t\tk = CrawlNum[i];\r\n\t\tpn = k + 2;\r\n\t\tfor (j = CrawlTable[k]; j > 0; j--) {\r\n\t\t\ttx = sx + CrawlTable[pn - 1];\r\n\t\t\tty = sy + CrawlTable[pn];\r\n\t\t\tif (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {\r\n\t\t\t\tpid = dPlayer[tx][ty];\r\n\t\t\t\tif (pid != 0) {\r\n\t\t\t\t\tif (pid > 0)\r\n\t\t\t\t\t\tpid = pid - 1;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tpid = -(pid + 1);\r\n\t\t\t\t\tplr[pid]._pMana = 0;\r\n\t\t\t\t\tplr[pid]._pManaBase = plr[pid]._pMana + plr[pid]._pMaxManaBase - plr[pid]._pMaxMana;\r\n\t\t\t\t\tCalcPlrInv(pid, FALSE);\r\n\t\t\t\t\tdrawmanaflag = TRUE;\r\n\t\t\t\t\tPlaySfxLoc(TSFX_COW7, tx, ty);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpn += 2;\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._mirange = 0;\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid missiles_spec_arrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint av;\r\n\r\n\tav = 0;\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tif (plr[id]._pClass == PC_ROGUE)\r\n\t\t\tav += (plr[id]._pLevel - 1) >> 2;\r\n\t\telse if (plr[id]._pClass == PC_WARRIOR || plr[id]._pClass == PC_BARD)\r\n\t\t\tav += (plr[id]._pLevel - 1) >> 3;\r\n\r\n\t\tif (plr[id]._pIFlags & ISPL_QUICKATTACK)\r\n\t\t\tav++;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTATTACK)\r\n\t\t\tav += 2;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTERATTACK)\r\n\t\t\tav += 4;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTESTATTACK)\r\n\t\t\tav += 8;\r\n\t}\r\n\tmissile[mi]._mirange = 1;\r\n\tmissile[mi]._miVar1 = dx;\r\n\tmissile[mi]._miVar2 = dy;\r\n\tmissile[mi]._miVar3 = av;\r\n}\r\n\r\nvoid missiles_warp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint tx, ty, fx, fy, i, dist;\r\n\tTriggerStruct *trg;\r\n\r\n\tdist = INT_MAX;\r\n\tif (id >= 0) {\r\n\t\tsx = plr[id]._px;\r\n\t\tsy = plr[id]._py;\r\n\t}\r\n\ttx = sx;\r\n\tty = sy;\r\n\r\n\tfor (i = 0; i < numtrigs && i < MAXTRIGGERS; i++) {\r\n\t\ttrg = &trigs[i];\r\n\t\tif (trg->_tmsg == WM_DIABTWARPUP || trg->_tmsg == WM_DIABPREVLVL || trg->_tmsg == WM_DIABNEXTLVL || trg->_tmsg == WM_DIABRTNLVL) {\r\n\t\t\tif ((leveltype == DTYPE_CATHEDRAL || leveltype == DTYPE_CATACOMBS) && (trg->_tmsg == WM_DIABNEXTLVL || trg->_tmsg == WM_DIABPREVLVL || trg->_tmsg == WM_DIABRTNLVL)) {\r\n\t\t\t\tfx = trg->_tx;\r\n\t\t\t\tfy = trg->_ty + 1;\r\n\t\t\t} else {\r\n\t\t\t\tfx = trg->_tx + 1;\r\n\t\t\t\tfy = trg->_ty;\r\n\t\t\t}\r\n\t\t\tint dify = (sy - fy);\r\n\t\t\tint difx = (sx - fx);\r\n\t\t\tint dif = dify * dify + difx * difx;\r\n\t\t\tif (dif < dist) {\r\n\t\t\t\tdist = dif;\r\n\t\t\t\ttx = fx;\r\n\t\t\t\tty = fy;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._mirange = 2;\r\n\tmissile[mi]._miVar1 = 0;\r\n\tmissile[mi]._mix = tx;\r\n\tmissile[mi]._miy = ty;\r\n\tif (mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_WARP);\r\n}\r\n\r\nvoid missiles_light_wall(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tmissile[mi]._midam = dam;\r\n\tmissile[mi]._miAnimFrame = random_(63, 8) + 1;\r\n\tmissile[mi]._mirange = 255 * (missile[mi]._mispllvl + 1);\r\n\tif (id < 0) {\r\n\t\tmissile[mi]._miVar1 = sx;\r\n\t\tmissile[mi]._miVar2 = sy;\r\n\t} else {\r\n\t\tmissile[mi]._miVar1 = plr[id]._px;\r\n\t\tmissile[mi]._miVar2 = plr[id]._py;\r\n\t}\r\n}\r\n\r\nvoid missiles_rune_explosion(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, dmg;\r\n\r\n\tif (mienemy == TARGET_MONSTERS || mienemy == TARGET_BOTH) {\r\n\t\tmissile[mi]._midam = 2 * (plr[id]._pLevel + random_(60, 10) + random_(60, 10)) + 4;\r\n\t\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t\t}\r\n\r\n\t\tdmg = missile[mi]._midam;\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix - 1, missile[mi]._miy - 1, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix, missile[mi]._miy - 1, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix + 1, missile[mi]._miy - 1, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix - 1, missile[mi]._miy, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix, missile[mi]._miy, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix + 1, missile[mi]._miy, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix - 1, missile[mi]._miy + 1, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix, missile[mi]._miy + 1, 1);\r\n\t\tCheckMissileCol(mi, dmg, dmg, 0, missile[mi]._mix + 1, missile[mi]._miy + 1, 1);\r\n\t}\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n\tSetMissDir(mi, 0);\r\n\tmissile[mi]._miDelFlag = 0;\r\n\tmissile[mi]._mirange = missile[mi]._miAnimLen - 1;\r\n}\r\n\r\nvoid missiles_immo_1(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tmissile[mi]._midam = 2 * (plr[id]._pLevel + random_(60, 10) + random_(60, 10)) + 4;\r\n\t\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t\t}\r\n\t\ti = 2 * missile[mi]._mispllvl + 16;\r\n\t\tif (i > 50)\r\n\t\t\ti = 50;\r\n\t\tUseMana(id, SPL_FIREBALL);\r\n\t} else {\r\n\t\ti = 16;\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, i);\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = sx;\r\n\tmissile[mi]._miVar5 = sy;\r\n\tmissile[mi]._miVar6 = 2;\r\n\tmissile[mi]._miVar7 = 2;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n}\r\n\r\nvoid missiles_immo_2(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\ti = missile[mi]._mispllvl + 16;\r\n\t\tif (i > 50) {\r\n\t\t\ti = 50;\r\n\t\t}\r\n\t} else {\r\n\t\ti = 16;\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, i);\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = sx;\r\n\tmissile[mi]._miVar5 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n}\r\n\r\nvoid missiles_larrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 32);\r\n\tmissile[mi]._miAnimFrame = random_(52, 8) + 1;\r\n\tmissile[mi]._mirange = 255;\r\n\tif (id < 0) {\r\n\t\tmissile[mi]._miVar1 = sx;\r\n\t\tmissile[mi]._miVar2 = sy;\r\n\t} else {\r\n\t\tmissile[mi]._miVar1 = plr[id]._px;\r\n\t\tmissile[mi]._miVar2 = plr[id]._py;\r\n\t}\r\n\tmissile[mi]._midam <<= 6;\r\n}\r\n\r\nvoid missiles_43303D(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n}\r\n\r\nvoid missiles_433040(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint lvl;\r\n\r\n\tif (mienemy == TARGET_MONSTERS && id != -1) {\r\n\t\tmissile[mi]._midam = 0;\r\n\t\tif (2 * (id > 0)) // BUGFIX, wrong order of operation, this should be `2 * lvl` after the else.\r\n\t\t\tlvl = plr[id]._pLevel;\r\n\t\telse\r\n\t\t\tlvl = 1;\r\n\t\tmissile[mi]._mirange = lvl + 10 * missile[mi]._mispllvl + 245;\r\n\t}\r\n}\r\n\r\nvoid missiles_rech_mana(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, ManaAmount;\r\n\r\n\tManaAmount = (random_(57, 10) + 1) << 6;\r\n\tfor (i = 0; i < plr[id]._pLevel; i++) {\r\n\t\tManaAmount += (random_(57, 4) + 1) << 6;\r\n\t}\r\n\tfor (i = 0; i < missile[mi]._mispllvl; i++) {\r\n\t\tManaAmount += (random_(57, 6) + 1) << 6;\r\n\t}\r\n\tif (plr[id]._pClass == PC_SORCERER)\r\n\t\tManaAmount <<= 1;\r\n\tif (plr[id]._pClass == PC_ROGUE || plr[id]._pClass == PC_BARD)\r\n\t\tManaAmount += ManaAmount >> 1;\r\n\tplr[id]._pMana += ManaAmount;\r\n\tif (plr[id]._pMana > plr[id]._pMaxMana)\r\n\t\tplr[id]._pMana = plr[id]._pMaxMana;\r\n\tplr[id]._pManaBase += ManaAmount;\r\n\tif (plr[id]._pManaBase > plr[id]._pMaxManaBase)\r\n\t\tplr[id]._pManaBase = plr[id]._pMaxManaBase;\r\n\tUseMana(id, SPL_MANA);\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tdrawmanaflag = TRUE;\r\n}\r\n\r\nvoid missiles_magi(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tplr[id]._pMana = plr[id]._pMaxMana;\r\n\tplr[id]._pManaBase = plr[id]._pMaxManaBase;\r\n\tUseMana(id, SPL_MAGI);\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tdrawmanaflag = TRUE;\r\n}\r\n\r\nvoid missiles_ring(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tif (mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_FIRERING);\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miDelFlag = FALSE;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = 0;\r\n\tmissile[mi]._miVar5 = 0;\r\n\tmissile[mi]._miVar6 = 0;\r\n\tmissile[mi]._miVar7 = 0;\r\n\tmissile[mi]._miVar8 = 0;\r\n\tmissile[mi]._mirange = 7;\r\n}\r\n\r\nvoid missiles_search(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint lvl, i, mx, r1, r2;\r\n\tMissileStruct *mis;\r\n\r\n\tmissile[mi]._miDelFlag = FALSE;\r\n\tmissile[mi]._miVar1 = id;\r\n\tmissile[mi]._miVar2 = 0;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = 0;\r\n\tmissile[mi]._miVar5 = 0;\r\n\tmissile[mi]._miVar6 = 0;\r\n\tmissile[mi]._miVar7 = 0;\r\n\tmissile[mi]._miVar8 = 0;\r\n\tAutoMapShowItems = TRUE;\r\n\tif (2 * (id > 0)) // BUGFIX, wrong order of operation, this should be `2 * lvl` after the else.\r\n\t\tlvl = plr[id]._pLevel;\r\n\telse\r\n\t\tlvl = 1;\r\n\tmissile[mi]._mirange = lvl + 10 * missile[mi]._mispllvl + 245;\r\n\tif (mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_SEARCH);\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmx = missileactive[i];\r\n\t\tif (mx != mi) {\r\n\t\t\tmis = &missile[mx];\r\n\t\t\tif (mis->_miVar1 == id && mis->_mitype == 85) {\r\n\t\t\t\tr1 = missile[mi]._mirange;\r\n\t\t\t\tr2 = mis->_mirange;\r\n\t\t\t\tif (r2 < INT_MAX - r1)\r\n\t\t\t\t\tmis->_mirange = r1 + r2;\r\n\t\t\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid missiles_cbolt_arrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tif (id == myplr) {\r\n\t\t\tmissile[mi]._mirnd = random_(63, 15) + 1;\r\n\t\t} else {\r\n\t\t\tmissile[mi]._mirnd = random_(63, 15) + 1;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._mirnd = random_(63, 15) + 1;\r\n\t\tmissile[mi]._midam = 15;\r\n\t}\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tmissile[mi]._miAnimFrame = random_(63, 8) + 1;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 5);\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 8);\r\n\tmissile[mi]._miVar1 = 5;\r\n\tmissile[mi]._miVar2 = midir;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._mirange = 256;\r\n}\r\n\r\nvoid missiles_hbolt_arrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\r\n\tif (id != -1) {\r\n\t\ti = 2 * missile[mi]._mispllvl + 16;\r\n\t\tif (i >= 63) {\r\n\t\t\ti = 63;\r\n\t\t}\r\n\t} else {\r\n\t\ti = 16;\r\n\t}\r\n\r\n\tGetMissileVel(mi, sx, sy, dx, dy, i);\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n}\r\n#endif\r\n\r\nvoid AddLArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\tint av = 32;\r\n\r\n\t\tif (plr[id]._pClass == PC_ROGUE)\r\n\t\t\tav += (plr[id]._pLevel) >> 2;\r\n\t\telse if (plr[id]._pClass == PC_WARRIOR || plr[id]._pClass == PC_BARD)\r\n\t\t\tav += (plr[id]._pLevel) >> 3;\r\n\r\n\t\tif (plr[id]._pIFlags & ISPL_QUICKATTACK)\r\n\t\t\tav++;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTATTACK)\r\n\t\t\tav += 2;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTERATTACK)\r\n\t\t\tav += 4;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTESTATTACK)\r\n\t\t\tav += 8;\r\n\t\tGetMissileVel(mi, sx, sy, dx, dy, av);\r\n#else\r\n\t\tif (plr[id]._pClass == PC_ROGUE)\r\n\t\t\tGetMissileVel(mi, sx, sy, dx, dy, (plr[id]._pLevel >> 2) + 31);\r\n\t\telse if (plr[id]._pClass == PC_WARRIOR)\r\n\t\t\tGetMissileVel(mi, sx, sy, dx, dy, (plr[id]._pLevel >> 3) + 31);\r\n\t\telse\r\n\t\t\tGetMissileVel(mi, sx, sy, dx, dy, 32);\r\n#endif\r\n\t} else\r\n\t\tGetMissileVel(mi, sx, sy, dx, dy, 32);\r\n\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 5);\r\n}\r\n\r\nvoid AddArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint av;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tav = 32;\r\n\t\tif (plr[id]._pIFlags & ISPL_RNDARROWVEL) {\r\n\t\t\tav = random_(64, 32) + 16;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (plr[id]._pClass == PC_ROGUE)\r\n\t\t\tav += (plr[id]._pLevel - 1) >> 2;\r\n\t\telse if (plr[id]._pClass == PC_WARRIOR || plr[id]._pClass == PC_BARD)\r\n\t\t\tav += (plr[id]._pLevel - 1) >> 3;\r\n\r\n\t\tif (plr[id]._pIFlags & ISPL_QUICKATTACK)\r\n\t\t\tav++;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTATTACK)\r\n\t\t\tav += 2;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTERATTACK)\r\n\t\t\tav += 4;\r\n\t\tif (plr[id]._pIFlags & ISPL_FASTESTATTACK)\r\n\t\t\tav += 8;\r\n#else\r\n\t\tif (plr[id]._pClass == PC_ROGUE)\r\n\t\t\tav += (plr[id]._pLevel - 1) >> 2;\r\n\t\tif (plr[id]._pClass == PC_WARRIOR)\r\n\t\t\tav += (plr[id]._pLevel - 1) >> 3;\r\n#endif\r\n\t\tGetMissileVel(mi, sx, sy, dx, dy, av);\r\n\t} else {\r\n\t\tGetMissileVel(mi, sx, sy, dx, dy, 32);\r\n\t}\r\n\tmissile[mi]._miAnimFrame = GetDirection16(sx, sy, dx, dy) + 1;\r\n\tmissile[mi]._mirange = 256;\r\n}\r\n\r\nvoid GetVileMissPos(int mi, int dx, int dy)\r\n{\r\n\tint xx, yy, k, j, i;\r\n\r\n\tfor (k = 1; k < 50; k++) {\r\n\t\tfor (j = -k; j <= k; j++) {\r\n\t\t\tyy = j + dy;\r\n\t\t\tfor (i = -k; i <= k; i++) {\r\n\t\t\t\txx = i + dx;\r\n\t\t\t\tif (PosOkPlayer(myplr, xx, yy)) {\r\n\t\t\t\t\tmissile[mi]._mix = xx;\r\n\t\t\t\t\tmissile[mi]._miy = yy;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._mix = dx;\r\n\tmissile[mi]._miy = dy;\r\n}\r\n\r\nvoid AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint pn, r1, r2, nTries;\r\n\r\n\tnTries = 0;\r\n\tdo {\r\n\t\tnTries++;\r\n\t\tif (nTries > 500) {\r\n\t\t\tr1 = 0;\r\n\t\t\tr2 = 0;\r\n\t\t\tbreak; //BUGFIX: warps player to 0/0 in hellfire, change to return or use 1.09's version of the code\r\n\t\t}\r\n\t\tr1 = random_(58, 3) + 4;\r\n\t\tr2 = random_(58, 3) + 4;\r\n\t\tif (random_(58, 2) == 1)\r\n\t\t\tr1 = -r1;\r\n\t\tif (random_(58, 2) == 1)\r\n\t\t\tr2 = -r2;\r\n\r\n#ifdef HELLFIRE\r\n\t\tr1 += sx;\r\n\t\tr2 += sy;\r\n\t\tif (r1 <= MAXDUNX && r1 >= 0 && r2 <= MAXDUNY && r2 >= 0) { ///BUGFIX: < MAXDUNX / < MAXDUNY\r\n\t\t\tpn = dPiece[r1][r2];\r\n\t\t}\r\n\t} while (nSolidTable[pn] || dObject[r1][r2] != 0 || dMonster[r1][r2] != 0);\r\n#else\r\n\t\tpn = dPiece[r1 + sx][sy + r2];\r\n\t} while (nSolidTable[pn] || dObject[r1 + sx][sy + r2] != 0 || dMonster[r1 + sx][sy + r2] != 0);\r\n#endif\r\n\r\n\tmissile[mi]._mirange = 2;\r\n\tmissile[mi]._miVar1 = 0;\r\n\tif (!setlevel || setlvlnum != SL_VILEBETRAYER) {\r\n#ifdef HELLFIRE\r\n\t\tmissile[mi]._mix = r1;\r\n\t\tmissile[mi]._miy = r2;\r\n#else\r\n\t\tmissile[mi]._mix = sx + r1;\r\n\t\tmissile[mi]._miy = sy + r2;\r\n#endif\r\n\t\tif (mienemy == TARGET_MONSTERS)\r\n\t\t\tUseMana(id, SPL_RNDTELEPORT);\r\n\t} else {\r\n\t\tpn = dObject[dx][dy] - 1;\r\n\t\t// BUGFIX: should only run magic circle check if dObject[dx][dy] is non-zero.\r\n\t\tif (object[pn]._otype == OBJ_MCIRCLE1 || object[pn]._otype == OBJ_MCIRCLE2) {\r\n\t\t\tmissile[mi]._mix = dx;\r\n\t\t\tmissile[mi]._miy = dy;\r\n\t\t\tif (!PosOkPlayer(myplr, dx, dy))\r\n\t\t\t\tGetVileMissPos(mi, dx, dy);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddFirebolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam)\r\n{\r\n\tint i, mx, sp;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tif (!micaster) {\r\n\t\tfor (i = 0; i < nummissiles; i++) {\r\n\t\t\tmx = missileactive[i];\r\n\t\t\tif (missile[mx]._mitype == MIS_GUARDIAN && missile[mx]._misource == id && missile[mx]._miVar3 == mi)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (i == nummissiles)\r\n\t\t\tUseMana(id, SPL_FIREBOLT);\r\n\t\tif (id != -1) {\r\n\t\t\tsp = 2 * missile[mi]._mispllvl + 16;\r\n\t\t\tif (sp >= 63)\r\n\t\t\t\tsp = 63;\r\n\t\t} else {\r\n\t\t\tsp = 16;\r\n\t\t}\r\n\t} else {\r\n\t\tsp = 26;\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, sp);\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n}\r\n\r\nvoid AddMagmaball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tmissile[mi]._mitxoff += 3 * missile[mi]._mixvel;\r\n\tmissile[mi]._mityoff += 3 * missile[mi]._miyvel;\r\n\tGetMissilePos(mi);\r\n#ifdef HELLFIRE\r\n\tif (missile[mi]._mixvel & 0xFFFF0000 || missile[mi]._miyvel & 0xFFFF0000)\r\n\t\tmissile[mi]._mirange = 256;\r\n\telse\r\n\t\tmissile[mi]._mirange = 1;\r\n#else\r\n\tmissile[mi]._mirange = 256;\r\n#endif\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n}\r\n\r\nvoid miss_null_33(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tPutMissile(mi);\r\n}\r\n\r\nvoid AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, pn, k, j, tx, ty;\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[6] = { 0, 3, 12, 45, 94, 159 };\r\n#endif\r\n\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tfor (i = 0; i < 6; i++) {\r\n\t\tk = CrawlNum[i];\r\n\t\tpn = k + 2;\r\n#ifdef HELLFIRE\r\n\t\tfor (j = CrawlTable[k]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\tfor (j = (BYTE)CrawlTable[k]; j > 0; j--) {\r\n#endif\r\n\t\t\ttx = dx + CrawlTable[pn - 1];\r\n\t\t\tty = dy + CrawlTable[pn];\r\n\t\t\tif (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {\r\n\t\t\t\tif ((nSolidTable[dPiece[tx][ty]] | dMonster[tx][ty] | dObject[tx][ty] | dPlayer[tx][ty]) == 0) {\r\n\t\t\t\t\tmissile[mi]._mix = tx;\r\n\t\t\t\t\tmissile[mi]._miy = ty;\r\n\t\t\t\t\tmissile[mi]._misx = tx;\r\n\t\t\t\t\tmissile[mi]._misy = ty;\r\n\t\t\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\t\t\ti = 6;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpn += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!missile[mi]._miDelFlag) {\r\n\t\tUseMana(id, SPL_TELEPORT);\r\n\t\tmissile[mi]._mirange = 2;\r\n\t}\r\n}\r\n\r\nvoid AddLightball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tmissile[mi]._midam = dam;\r\n\tmissile[mi]._miAnimFrame = random_(63, 8) + 1;\r\n\tmissile[mi]._mirange = 255;\r\n\tif (id < 0) {\r\n\t\tmissile[mi]._miVar1 = sx;\r\n\t\tmissile[mi]._miVar2 = sy;\r\n\t} else {\r\n\t\tmissile[mi]._miVar1 = plr[id]._px;\r\n\t\tmissile[mi]._miVar2 = plr[id]._py;\r\n\t}\r\n}\r\n\r\nvoid AddFirewall(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n#ifdef HELLFIRE\r\n\tmissile[mi]._midam = (random_(53, 10) + random_(53, 10) + 2 + (id > 0) ? plr[id]._pLevel : currlevel); // BUGFIX: missing parenthesis around ternary\r\n#else\r\n\tmissile[mi]._midam = (random_(53, 10) + random_(53, 10) + 2 + plr[id]._pLevel);\r\n#endif\r\n\tmissile[mi]._midam <<= 4;\r\n\tmissile[mi]._midam >>= 1;\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\ti = missile[mi]._mispllvl;\r\n\tmissile[mi]._mirange = 10;\r\n#ifndef HELLFIRE\r\n\tif (i > 0)\r\n#endif\r\n\t\tmissile[mi]._mirange *= i + 1;\r\n#ifdef HELLFIRE\r\n\tif (mienemy != TARGET_MONSTERS || id < 0)\r\n\t\tmissile[mi]._mirange += currlevel;\r\n\telse\r\n#endif\r\n\t\tmissile[mi]._mirange += (plr[id]._pISplDur * missile[mi]._mirange) >> 7;\r\n\tmissile[mi]._mirange <<= 4;\r\n\tmissile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen;\r\n\tmissile[mi]._miVar2 = 0;\r\n}\r\n\r\nvoid AddFireball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tmissile[mi]._midam = 2 * (plr[id]._pLevel + random_(60, 10) + random_(60, 10)) + 4;\r\n\t\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t\t}\r\n\t\ti = 2 * missile[mi]._mispllvl + 16;\r\n\t\tif (i > 50)\r\n\t\t\ti = 50;\r\n\t\tUseMana(id, SPL_FIREBALL);\r\n\t} else {\r\n\t\ti = 16;\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, i);\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = sx;\r\n\tmissile[mi]._miVar5 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n}\r\n\r\nvoid AddLightctrl(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (!dam && mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_LIGHTNING);\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 32);\r\n\tmissile[mi]._miAnimFrame = random_(52, 8) + 1;\r\n\tmissile[mi]._mirange = 256;\r\n}\r\n\r\nvoid AddLightning(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._misx = dx;\r\n\tmissile[mi]._misy = dy;\r\n\tif (midir >= 0) {\r\n\t\tmissile[mi]._mixoff = missile[midir]._mixoff;\r\n\t\tmissile[mi]._miyoff = missile[midir]._miyoff;\r\n\t\tmissile[mi]._mitxoff = missile[midir]._mitxoff;\r\n\t\tmissile[mi]._mityoff = missile[midir]._mityoff;\r\n\t}\r\n\tmissile[mi]._miAnimFrame = random_(52, 8) + 1;\r\n\r\n\tif (midir < 0 || mienemy == TARGET_PLAYERS || id == -1) {\r\n\t\tif (midir < 0 || id == -1)\r\n\t\t\tmissile[mi]._mirange = 8;\r\n\t\telse\r\n\t\t\tmissile[mi]._mirange = 10;\r\n\t} else {\r\n\t\tmissile[mi]._mirange = (missile[mi]._mispllvl >> 1) + 6;\r\n\t}\r\n\tmissile[mi]._mlid = AddLight(missile[mi]._mix, missile[mi]._miy, 4);\r\n}\r\n\r\nvoid AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tCMonster *mon;\r\n\r\n\tif (mienemy && id > 0) {\r\n\t\tmon = monster[id].MType;\r\n#ifndef HELLFIRE\r\n\t\tif (mon->mtype == MT_SUCCUBUS)\r\n\t\t\tSetMissAnim(mi, MFILE_FLAREEXP);\r\n\t\tif (mon->mtype == MT_SNOWWICH)\r\n\t\t\tSetMissAnim(mi, MFILE_SCBSEXPB);\r\n\t\tif (mon->mtype == MT_HLSPWN)\r\n\t\t\tSetMissAnim(mi, MFILE_SCBSEXPD);\r\n\t\tif (mon->mtype == MT_SOLBRNR)\r\n\t\t\tSetMissAnim(mi, MFILE_SCBSEXPC);\r\n#else\r\n\t\tswitch (mon->mtype) {\r\n\t\tcase MT_SUCCUBUS:\r\n\t\t\tSetMissAnim(mi, MFILE_FLAREEXP);\r\n\t\t\tbreak;\r\n\t\tcase MT_SNOWWICH:\r\n\t\t\tSetMissAnim(mi, MFILE_SCBSEXPB);\r\n\t\t\tbreak;\r\n\t\tcase MT_HLSPWN:\r\n\t\t\tSetMissAnim(mi, MFILE_SCBSEXPD);\r\n\t\t\tbreak;\r\n\t\tcase MT_SOLBRNR:\r\n\t\t\tSetMissAnim(mi, MFILE_SCBSEXPC);\r\n\t\t\tbreak;\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\tmissile[mi]._mix = missile[dx]._mix;\r\n\tmissile[mi]._miy = missile[dx]._miy;\r\n\tmissile[mi]._misx = missile[dx]._misx;\r\n\tmissile[mi]._misy = missile[dx]._misy;\r\n\tmissile[mi]._mixoff = missile[dx]._mixoff;\r\n\tmissile[mi]._miyoff = missile[dx]._miyoff;\r\n\tmissile[mi]._mitxoff = missile[dx]._mitxoff;\r\n\tmissile[mi]._mityoff = missile[dx]._mityoff;\r\n\tmissile[mi]._mixvel = 0;\r\n\tmissile[mi]._miyvel = 0;\r\n\tmissile[mi]._mirange = missile[mi]._miAnimLen;\r\n\tmissile[mi]._miVar1 = 0;\r\n}\r\n\r\nvoid AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._mix = sx;\r\n\tmissile[mi]._miy = sy;\r\n\tmissile[mi]._misx = sx;\r\n\tmissile[mi]._misy = sy;\r\n\tmissile[mi]._mixvel = 0;\r\n\tmissile[mi]._miyvel = 0;\r\n\tmissile[mi]._miVar1 = 0;\r\n\tmissile[mi]._miVar2 = dx;\r\n\tmissile[mi]._mimfnum = 0;\r\n\tif (dx == 1)\r\n\t\tSetMissAnim(mi, MFILE_MAGBLOS);\r\n\telse\r\n\t\tSetMissAnim(mi, MFILE_MINILTNG);\r\n\tmissile[mi]._mirange = missile[mi]._miAnimLen - 1;\r\n}\r\n\r\nBOOL CheckIfTrig(int x, int y)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < numtrigs; i++) {\r\n\t\tif ((x == trigs[i]._tx && y == trigs[i]._ty) || (abs(trigs[i]._tx - x) < 2 && abs(trigs[i]._ty - y) < 2))\r\n\t\t\treturn TRUE;\r\n\t}\r\n\treturn FALSE;\r\n}\r\n\r\nvoid AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, j, k, mx, tx, ty, dp;\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[6] = { 0, 3, 12, 45, 94, 159 };\r\n#endif\r\n\r\n\tif (currlevel != 0) {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\tfor (j = 0; j < 6; j++) {\r\n\t\t\tk = CrawlNum[j] + 2;\r\n#ifdef HELLFIRE\r\n\t\t\tfor (i = CrawlTable[CrawlNum[j]]; i > 0; i--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\t\tfor (i = (BYTE)CrawlTable[CrawlNum[j]]; i > 0; i--) {\r\n#endif\r\n\t\t\t\ttx = dx + CrawlTable[k - 1];\r\n\t\t\t\tty = dy + CrawlTable[k];\r\n\t\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\t\tdp = dPiece[tx][ty];\r\n\t\t\t\t\tif ((dMissile[tx][ty] | nSolidTable[dp] | nMissileTable[dp] | dObject[tx][ty] | dPlayer[tx][ty]) == 0) {\r\n\t\t\t\t\t\tif (!CheckIfTrig(tx, ty)) {\r\n\t\t\t\t\t\t\tmissile[mi]._mix = tx;\r\n\t\t\t\t\t\t\tmissile[mi]._miy = ty;\r\n\t\t\t\t\t\t\tmissile[mi]._misx = tx;\r\n\t\t\t\t\t\t\tmissile[mi]._misy = ty;\r\n\t\t\t\t\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\t\t\t\t\tj = 6;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tk += 2;\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\ttx = dx;\r\n\t\tty = dy;\r\n\t\tmissile[mi]._mix = tx;\r\n\t\tmissile[mi]._miy = ty;\r\n\t\tmissile[mi]._misx = tx;\r\n\t\tmissile[mi]._misy = ty;\r\n\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t}\r\n\tmissile[mi]._mirange = 100;\r\n\tmissile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen;\r\n\tmissile[mi]._miVar2 = 0;\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmx = missileactive[i];\r\n\t\tif (missile[mx]._mitype == MIS_TOWN && mx != mi && missile[mx]._misource == id)\r\n\t\t\tmissile[mx]._mirange = 0;\r\n\t}\r\n\tPutMissile(mi);\r\n\tif (id == myplr && !missile[mi]._miDelFlag && currlevel != 0) {\r\n\t\tif (!setlevel) {\r\n\t\t\tNetSendCmdLocParam3(TRUE, CMD_ACTIVATEPORTAL, tx, ty, currlevel, leveltype, 0);\r\n\t\t} else {\r\n\t\t\tNetSendCmdLocParam3(TRUE, CMD_ACTIVATEPORTAL, tx, ty, setlvlnum, leveltype, 1);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddFlash(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tif (id != -1) {\r\n\t\t\tmissile[mi]._midam = 0;\r\n\t\t\tfor (i = 0; i <= plr[id]._pLevel; i++) {\r\n\t\t\t\tmissile[mi]._midam += random_(55, 20) + 1;\r\n\t\t\t}\r\n\t\t\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\t\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t\t\t}\r\n\t\t\tmissile[mi]._midam += missile[mi]._midam >> 1;\r\n\t\t\tUseMana(id, SPL_FLASH);\r\n\t\t} else {\r\n\t\t\tmissile[mi]._midam = currlevel >> 1;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._midam = monster[id].mLevel << 1;\r\n\t}\r\n\tmissile[mi]._mirange = 19;\r\n}\r\n\r\nvoid AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tif (id != -1) {\r\n\t\t\tmissile[mi]._midam = 0;\r\n\t\t\tfor (i = 0; i <= plr[id]._pLevel; i++) {\r\n\t\t\t\tmissile[mi]._midam += random_(56, 2) + 1;\r\n\t\t\t}\r\n\t\t\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\t\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t\t\t}\r\n\t\t\tmissile[mi]._midam += missile[mi]._midam >> 1;\r\n\t\t} else {\r\n\t\t\tmissile[mi]._midam = currlevel >> 1;\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._miPreFlag = TRUE;\r\n\tmissile[mi]._mirange = 19;\r\n}\r\n\r\nvoid AddManashield(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._mirange = 48 * plr[id]._pLevel;\r\n\tmissile[mi]._miVar1 = plr[id]._pHitPoints;\r\n\tmissile[mi]._miVar2 = plr[id]._pHPBase;\r\n\tmissile[mi]._miVar8 = -1;\r\n\tif (mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_MANASHIELD);\r\n#ifndef HELLFIRE\r\n\tif (id == myplr)\r\n\t\tNetSendCmd(TRUE, CMD_SETSHIELD);\r\n\tplr[id].pManaShield = TRUE;\r\n#endif\r\n}\r\n\r\nvoid AddFiremove(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._midam = random_(59, 10) + plr[id]._pLevel + 1;\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tmissile[mi]._mirange = 255;\r\n\tmissile[mi]._miVar1 = 0;\r\n\tmissile[mi]._miVar2 = 0;\r\n\tmissile[mi]._mix++;\r\n\tmissile[mi]._miy++;\r\n\tmissile[mi]._miyoff -= 32;\r\n}\r\n\r\nvoid AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, pn, k, j, tx, ty;\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[6] = { 0, 3, 12, 45, 94, 159 };\r\n#endif\r\n\r\n\tmissile[mi]._midam = random_(62, 10) + (plr[id]._pLevel >> 1) + 1;\r\n\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t}\r\n\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tfor (i = 0; i < 6; i++) {\r\n\t\tpn = CrawlNum[i];\r\n\t\tk = pn + 2;\r\n#ifdef HELLFIRE\r\n\t\tfor (j = CrawlTable[pn]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\tfor (j = (BYTE)CrawlTable[pn]; j > 0; j--) {\r\n#endif\r\n\t\t\ttx = dx + CrawlTable[k - 1];\r\n\t\t\tty = dy + CrawlTable[k];\r\n\t\t\tpn = dPiece[tx][ty];\r\n\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\tif (LineClear(sx, sy, tx, ty)) {\r\n\t\t\t\t\tif ((dMonster[tx][ty] | nSolidTable[pn] | nMissileTable[pn] | dObject[tx][ty] | dMissile[tx][ty]) == 0) {\r\n\t\t\t\t\t\tmissile[mi]._mix = tx;\r\n\t\t\t\t\t\tmissile[mi]._miy = ty;\r\n\t\t\t\t\t\tmissile[mi]._misx = tx;\r\n\t\t\t\t\t\tmissile[mi]._misy = ty;\r\n\t\t\t\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\t\t\t\tUseMana(id, SPL_GUARDIAN);\r\n\t\t\t\t\t\ti = 6;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tk += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tif (missile[mi]._miDelFlag != TRUE) {\r\n\t\tmissile[mi]._misource = id;\r\n\t\tmissile[mi]._mlid = AddLight(missile[mi]._mix, missile[mi]._miy, 1);\r\n\t\tmissile[mi]._mirange = missile[mi]._mispllvl + (plr[id]._pLevel >> 1);\r\n\t\tmissile[mi]._mirange += (missile[mi]._mirange * plr[id]._pISplDur) >> 7;\r\n\r\n\t\tif (missile[mi]._mirange > 30)\r\n\t\t\tmissile[mi]._mirange = 30;\r\n\t\tmissile[mi]._mirange <<= 4;\r\n\t\tif (missile[mi]._mirange < 30)\r\n\t\t\tmissile[mi]._mirange = 30;\r\n\r\n\t\tmissile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen;\r\n\t\tmissile[mi]._miVar2 = 0;\r\n\t\tmissile[mi]._miVar3 = 1;\r\n\t}\r\n}\r\n\r\nvoid AddChain(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miVar1 = dx;\r\n\tmissile[mi]._miVar2 = dy;\r\n\tmissile[mi]._mirange = 1;\r\n\tUseMana(id, SPL_CHAIN);\r\n}\r\n\r\nvoid miss_null_11(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tSetMissDir(mi, dx);\r\n\tmissile[mi]._midam = 0;\r\n\tmissile[mi]._miLightFlag = TRUE;\r\n\tmissile[mi]._mirange = 250;\r\n}\r\n\r\nvoid miss_null_12(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (dx > 3)\r\n\t\tdx = 2;\r\n\tSetMissDir(mi, dx);\r\n\tmissile[mi]._midam = 0;\r\n\tmissile[mi]._miLightFlag = TRUE;\r\n\tmissile[mi]._mirange = 250;\r\n}\r\n\r\nvoid miss_null_13(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (dx > 3)\r\n\t\tdx = 2;\r\n\tSetMissDir(mi, dx);\r\n\tmissile[mi]._midam = 0;\r\n\tmissile[mi]._miLightFlag = TRUE;\r\n\tmissile[mi]._mirange = missile[mi]._miAnimLen;\r\n}\r\n\r\nvoid AddRhino(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tAnimStruct *anim;\r\n\r\n\tif (monster[id].MType->mtype < MT_HORNED || monster[id].MType->mtype > MT_OBLORD) {\r\n\t\tif (monster[id].MType->mtype < MT_NSNAKE || monster[id].MType->mtype > MT_GSNAKE) {\r\n\t\t\tanim = &monster[id].MType->Anims[MA_WALK];\r\n\t\t} else {\r\n\t\t\tanim = &monster[id].MType->Anims[MA_ATTACK];\r\n\t\t}\r\n\t} else {\r\n\t\tanim = &monster[id].MType->Anims[MA_SPECIAL];\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 18);\r\n\tmissile[mi]._mimfnum = midir;\r\n\tmissile[mi]._miAnimFlags = 0;\r\n\tmissile[mi]._miAnimData = anim->Data[midir];\r\n\tmissile[mi]._miAnimDelay = anim->Rate;\r\n\tmissile[mi]._miAnimLen = anim->Frames;\r\n\tmissile[mi]._miAnimWidth = monster[id].MType->width;\r\n\tmissile[mi]._miAnimWidth2 = monster[id].MType->width2;\r\n\tmissile[mi]._miAnimAdd = 1;\r\n\tif (monster[id].MType->mtype >= MT_NSNAKE && monster[id].MType->mtype <= MT_GSNAKE)\r\n\t\tmissile[mi]._miAnimFrame = 7;\r\n\tmissile[mi]._miVar1 = 0;\r\n\tmissile[mi]._miVar2 = 0;\r\n\tmissile[mi]._miLightFlag = TRUE;\r\n\tif (monster[id]._uniqtype != 0) {\r\n\t\tmissile[mi]._miUniqTrans = monster[id]._uniqtrans + 1;\r\n\t\tmissile[mi]._mlid = monster[id].mlid;\r\n\t}\r\n\tmissile[mi]._mirange = 256;\r\n\tPutMissile(mi);\r\n}\r\n\r\nvoid miss_null_32(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tAnimStruct *anim;\r\n\tMonsterStruct *mon;\r\n\r\n\tanim = &monster[id].MType->Anims[MA_WALK];\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tmissile[mi]._mimfnum = midir;\r\n\tmissile[mi]._miAnimFlags = 0;\r\n\tmissile[mi]._miAnimData = anim->Data[midir];\r\n\tmissile[mi]._miAnimDelay = anim->Rate;\r\n\tmissile[mi]._miAnimLen = anim->Frames;\r\n\tmissile[mi]._miAnimWidth = monster[id].MType->width;\r\n\tmissile[mi]._miAnimWidth2 = monster[id].MType->width2;\r\n\tmissile[mi]._miAnimAdd = 1;\r\n\tmissile[mi]._miVar1 = 0;\r\n\tmissile[mi]._miVar2 = 0;\r\n\tmissile[mi]._miLightFlag = TRUE;\r\n\tif (monster[id]._uniqtype != 0)\r\n\t\tmissile[mi]._miUniqTrans = monster[id]._uniqtrans + 1;\r\n\tmon = &monster[id];\r\n\tdMonster[mon->_mx][mon->_my] = 0;\r\n\tmissile[mi]._mirange = 256;\r\n\tPutMissile(mi);\r\n}\r\n\r\nvoid AddFlare(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tUseMana(id, SPL_FLARE);\r\n\t\tplr[id]._pHitPoints -= 320;\r\n\t\tplr[id]._pHPBase -= 320;\r\n\t\tdrawhpflag = TRUE;\r\n\t\tif (plr[id]._pHitPoints <= 0)\r\n\t\t\tSyncPlrKill(id, 0);\r\n\t} else {\r\n\t\tif (id > 0) {\r\n\t\t\tif (monster[id].MType->mtype == MT_SUCCUBUS)\r\n\t\t\t\tSetMissAnim(mi, MFILE_FLARE);\r\n\t\t\tif (monster[id].MType->mtype == MT_SNOWWICH)\r\n\t\t\t\tSetMissAnim(mi, MFILE_SCUBMISB);\r\n\t\t\tif (monster[id].MType->mtype == MT_HLSPWN)\r\n\t\t\t\tSetMissAnim(mi, MFILE_SCUBMISD);\r\n\t\t\tif (monster[id].MType->mtype == MT_SOLBRNR)\r\n\t\t\t\tSetMissAnim(mi, MFILE_SCUBMISC);\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (misfiledata[missile[mi]._miAnimType].mAnimFAmt == 16) {\r\n\t\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid AddAcid(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n#ifdef HELLFIRE\r\n\tif (missile[mi]._mixvel & 0xFFFF0000 || missile[mi]._miyvel & 0xFFFF0000)\r\n\t\tmissile[mi]._mirange = 5 * (monster[id]._mint + 4);\r\n\telse\r\n\t\tmissile[mi]._mirange = 1;\r\n#else\r\n\tmissile[mi]._mirange = 5 * (monster[id]._mint + 4);\r\n#endif\r\n\tmissile[mi]._mlid = -1;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tPutMissile(mi);\r\n}\r\n\r\nvoid miss_null_1D(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._midam = dam;\r\n\tmissile[mi]._mixvel = 0;\r\n\tmissile[mi]._miyvel = 0;\r\n\tmissile[mi]._mirange = 50;\r\n\tmissile[mi]._miVar1 = missile[mi]._mirange - missile[mi]._miAnimLen;\r\n\tmissile[mi]._miVar2 = 0;\r\n}\r\n\r\nvoid AddAcidpud(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint monst;\r\n\r\n\tmissile[mi]._mixvel = 0;\r\n\tmissile[mi]._miyvel = 0;\r\n\tmissile[mi]._mixoff = 0;\r\n\tmissile[mi]._miyoff = 0;\r\n\tmissile[mi]._miLightFlag = TRUE;\r\n\tmonst = missile[mi]._misource;\r\n\tmissile[mi]._mirange = random_(50, 15) + 40 * (monster[monst]._mint + 1);\r\n\tmissile[mi]._miPreFlag = TRUE;\r\n}\r\n\r\nvoid AddStone(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, j, k, l, tx, ty, mid;\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[6] = { 0, 3, 12, 45, 94, 159 };\r\n#endif\r\n\r\n\tmissile[mi]._misource = id;\r\n\tfor (i = 0; i < 6; i++) {\r\n\t\tk = CrawlNum[i];\r\n\t\tl = k + 2;\r\n#ifdef HELLFIRE\r\n\t\tfor (j = CrawlTable[k]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\tfor (j = (BYTE)CrawlTable[k]; j > 0; j--) {\r\n#endif\r\n\t\t\ttx = dx + CrawlTable[l - 1];\r\n\t\t\tty = dy + CrawlTable[l];\r\n\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\tmid = dMonster[tx][ty];\r\n\t\t\t\tmid = mid > 0 ? mid - 1 : -1 - mid;\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (mid > MAX_PLRS - 1 && monster[mid]._mAi != AI_DIABLO && monster[mid].MType->mtype != MT_NAKRUL) {\r\n#else\r\n\t\t\t\tif (mid > MAX_PLRS - 1 && monster[mid]._mAi != AI_DIABLO) {\r\n#endif\r\n\t\t\t\t\tif (monster[mid]._mmode != MM_FADEIN && monster[mid]._mmode != MM_FADEOUT && monster[mid]._mmode != MM_CHARGE) {\r\n\t\t\t\t\t\tj = -99;\r\n\t\t\t\t\t\ti = 6;\r\n\t\t\t\t\t\tmissile[mi]._miVar1 = monster[mid]._mmode;\r\n\t\t\t\t\t\tmissile[mi]._miVar2 = mid;\r\n\t\t\t\t\t\tmonster[mid]._mmode = MM_STONE;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tl += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tif (j != -99) {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t} else {\r\n\t\tmissile[mi]._mix = tx;\r\n\t\tmissile[mi]._miy = ty;\r\n\t\tmissile[mi]._misx = missile[mi]._mix;\r\n\t\tmissile[mi]._misy = missile[mi]._miy;\r\n\t\tmissile[mi]._mirange = missile[mi]._mispllvl + 6;\r\n\t\tmissile[mi]._mirange += (missile[mi]._mirange * plr[id]._pISplDur) >> 7;\r\n\r\n\t\tif (missile[mi]._mirange > 15)\r\n\t\t\tmissile[mi]._mirange = 15;\r\n\t\tmissile[mi]._mirange <<= 4;\r\n\t\tUseMana(id, SPL_STONE);\r\n\t}\r\n}\r\n\r\nvoid AddGolem(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\tint mx;\r\n\r\n\tmissile[mi]._miDelFlag = FALSE;\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmx = missileactive[i];\r\n\t\tif (missile[mx]._mitype == MIS_GOLEM) {\r\n\t\t\tif (mx != mi && missile[mx]._misource == id) {\r\n\t\t\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miVar4 = dx;\r\n\tmissile[mi]._miVar5 = dy;\r\n\tif ((monster[id]._mx != 1 || monster[id]._my != 0) && id == myplr)\r\n\t\tM_StartKill(id, id);\r\n\tUseMana(id, SPL_GOLEM);\r\n}\r\n\r\nvoid AddEtherealize(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tmissile[mi]._mirange = 16 * plr[id]._pLevel >> 1;\r\n\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\tmissile[mi]._mirange += missile[mi]._mirange >> 3;\r\n\t}\r\n\tmissile[mi]._mirange += missile[mi]._mirange * plr[id]._pISplDur >> 7;\r\n\tmissile[mi]._miVar1 = plr[id]._pHitPoints;\r\n\tmissile[mi]._miVar2 = plr[id]._pHPBase;\r\n\tif (mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_ETHEREALIZE);\r\n}\r\n\r\nvoid miss_null_1F(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid miss_null_23(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._midam = dam;\r\n\tmissile[mi]._mix = sx;\r\n\tmissile[mi]._miy = sy;\r\n\tmissile[mi]._misx = sx;\r\n\tmissile[mi]._misy = sy;\r\n\tmissile[mi]._misource = id;\r\n\tif (dam == 1)\r\n\t\tSetMissDir(mi, 0);\r\n\telse\r\n\t\tSetMissDir(mi, 1);\r\n\tmissile[mi]._miLightFlag = TRUE;\r\n\tmissile[mi]._mirange = missile[mi]._miAnimLen;\r\n}\r\n\r\nvoid AddBoom(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._mix = dx;\r\n\tmissile[mi]._miy = dy;\r\n\tmissile[mi]._misx = dx;\r\n\tmissile[mi]._misy = dy;\r\n\tmissile[mi]._mixvel = 0;\r\n\tmissile[mi]._miyvel = 0;\r\n\tmissile[mi]._midam = dam;\r\n\tmissile[mi]._mirange = missile[mi]._miAnimLen;\r\n\tmissile[mi]._miVar1 = 0;\r\n}\r\n\r\nvoid AddHeal(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\tint HealAmount;\r\n\r\n\tHealAmount = (random_(57, 10) + 1) << 6;\r\n\tfor (i = 0; i < plr[id]._pLevel; i++) {\r\n\t\tHealAmount += (random_(57, 4) + 1) << 6;\r\n\t}\r\n\tfor (i = 0; i < missile[mi]._mispllvl; i++) {\r\n\t\tHealAmount += (random_(57, 6) + 1) << 6;\r\n\t}\r\n\r\n\tif (plr[id]._pClass == PC_WARRIOR)\r\n\t\tHealAmount <<= 1;\r\n#ifdef HELLFIRE\r\n\telse if (plr[id]._pClass == PC_BARBARIAN || plr[id]._pClass == PC_MONK)\r\n\t\tHealAmount <<= 1;\r\n#endif\r\n\r\n\tif (plr[id]._pClass == PC_ROGUE)\r\n\t\tHealAmount += HealAmount >> 1;\r\n#ifdef HELLFIRE\r\n\telse if (plr[id]._pClass == PC_BARD)\r\n\t\tHealAmount += HealAmount >> 1;\r\n#endif\r\n\r\n\tplr[id]._pHitPoints += HealAmount;\r\n\tif (plr[id]._pHitPoints > plr[id]._pMaxHP)\r\n\t\tplr[id]._pHitPoints = plr[id]._pMaxHP;\r\n\r\n\tplr[id]._pHPBase += HealAmount;\r\n\tif (plr[id]._pHPBase > plr[id]._pMaxHPBase)\r\n\t\tplr[id]._pHPBase = plr[id]._pMaxHPBase;\r\n\r\n\tUseMana(id, SPL_HEAL);\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tdrawhpflag = TRUE;\r\n}\r\n\r\nvoid AddHealOther(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tUseMana(id, SPL_HEALOTHER);\r\n\tif (id == myplr)\r\n\t\tSetCursor_(CURSOR_HEALOTHER);\r\n}\r\n\r\nvoid AddElement(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tmissile[mi]._midam = 2 * (plr[id]._pLevel + random_(60, 10) + random_(60, 10)) + 4;\r\n\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t}\r\n\tmissile[mi]._midam >>= 1;\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tSetMissDir(mi, GetDirection8(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = dx;\r\n\tmissile[mi]._miVar5 = dy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n\tUseMana(id, SPL_ELEMENT);\r\n}\r\n\r\nvoid AddIdentify(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tUseMana(id, SPL_IDENTIFY);\r\n\tif (id == myplr) {\r\n\t\tif (sbookflag)\r\n\t\t\tsbookflag = FALSE;\r\n\t\tif (!invflag)\r\n\t\t\tinvflag = TRUE;\r\n\t\tSetCursor_(CURSOR_IDENTIFY);\r\n\t}\r\n}\r\n\r\nvoid AddFirewallC(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i, j, k, tx, ty, pn;\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[6] = { 0, 3, 12, 45, 94, 159 };\r\n#endif\r\n\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tfor (i = 0; i < 6; i++) {\r\n\t\tk = CrawlNum[i];\r\n\t\tpn = k + 2;\r\n#ifdef HELLFIRE\r\n\t\tfor (j = CrawlTable[k]; j > 0; j--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\tfor (j = (BYTE)CrawlTable[k]; j > 0; j--) {\r\n#endif\r\n\t\t\ttx = dx + CrawlTable[pn - 1];\r\n\t\t\tty = dy + CrawlTable[pn];\r\n\t\t\tif (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {\r\n\t\t\t\tk = dPiece[tx][ty];\r\n\t\t\t\tif (LineClear(sx, sy, tx, ty)) {\r\n\t\t\t\t\tif ((sx != tx || sy != ty) && (nSolidTable[k] | dObject[tx][ty]) == 0) {\r\n\t\t\t\t\t\tmissile[mi]._miVar1 = tx;\r\n\t\t\t\t\t\tmissile[mi]._miVar2 = ty;\r\n\t\t\t\t\t\tmissile[mi]._miVar5 = tx;\r\n\t\t\t\t\t\tmissile[mi]._miVar6 = ty;\r\n\t\t\t\t\t\tmissile[mi]._miDelFlag = FALSE;\r\n\t\t\t\t\t\ti = 6;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tpn += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tif (missile[mi]._miDelFlag != TRUE) {\r\n\t\tmissile[mi]._miVar7 = 0;\r\n\t\tmissile[mi]._miVar8 = 0;\r\n\t\tmissile[mi]._miVar3 = (midir - 2) & 7;\r\n\t\tmissile[mi]._miVar4 = (midir + 2) & 7;\r\n\t\tmissile[mi]._mirange = 7;\r\n\t\tUseMana(id, SPL_FIREWALL);\r\n\t}\r\n}\r\n\r\nvoid AddInfra(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tmissile[mi]._mirange = 1584;\r\n\tfor (i = missile[mi]._mispllvl; i > 0; i--) {\r\n\t\tmissile[mi]._mirange += missile[mi]._mirange >> 3;\r\n\t}\r\n\tmissile[mi]._mirange += missile[mi]._mirange * plr[id]._pISplDur >> 7;\r\n\tif (mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_INFRA);\r\n}\r\n\r\nvoid AddWave(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miVar1 = dx;\r\n\tmissile[mi]._miVar2 = dy;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = 0;\r\n\tmissile[mi]._mirange = 1;\r\n\tmissile[mi]._miAnimFrame = 4;\r\n\tUseMana(id, SPL_WAVE);\r\n}\r\n\r\nvoid AddNova(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint k;\r\n\r\n\tmissile[mi]._miVar1 = dx;\r\n\tmissile[mi]._miVar2 = dy;\r\n\tif (id != -1) {\r\n\t\tmissile[mi]._midam = (random_(66, 6) + random_(66, 6) + random_(66, 6) + random_(66, 6) + random_(66, 6));\r\n\t\tmissile[mi]._midam += plr[id]._pLevel + 5;\r\n\t\tmissile[mi]._midam >>= 1;\r\n\t\tfor (k = missile[mi]._mispllvl; k > 0; k--) {\r\n\t\t\tmissile[mi]._midam += missile[mi]._midam >> 3;\r\n\t\t}\r\n\t\tif (mienemy == TARGET_MONSTERS)\r\n\t\t\tUseMana(id, SPL_NOVA);\r\n\t} else {\r\n\t\tmissile[mi]._midam = ((DWORD)currlevel >> 1) + random_(66, 3) + random_(66, 3) + random_(66, 3);\r\n\t}\r\n\tmissile[mi]._mirange = 1;\r\n}\r\n\r\nvoid AddBlodboil(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n#ifdef HELLFIRE\r\n\tint lvl;\r\n\r\n\tif (id == -1 || plr[id]._pSpellFlags & 6 || plr[id]._pHitPoints <= plr[id]._pLevel << 6) {\r\n\t\tmissile[mi]._miDelFlag = TRUE;\r\n\t} else {\r\n\t\tint blodboilSFX[NUM_CLASSES] = {\r\n\t\t\tPS_WARR70,\r\n#ifndef SPAWN\r\n\t\t\tPS_ROGUE70,\r\n\t\t\tPS_MAGE70,\r\n\t\t\tPS_MAGE70, // BUGFIX: PS_MONK70?\r\n\t\t\tPS_ROGUE70,\r\n#else\r\n\t\t\t0,\r\n\t\t\t0,\r\n\t\t\t0,\r\n\t\t\t0,\r\n#endif\r\n\t\t\tPS_WARR70\r\n\t\t};\r\n\t\tUseMana(id, 22);\r\n\t\tmissile[mi]._miVar1 = id;\r\n\t\tint tmp = 3 * plr[id]._pLevel;\r\n\t\ttmp <<= 7;\r\n\t\tplr[id]._pSpellFlags |= 2u;\r\n\t\tmissile[mi]._miVar2 = tmp;\r\n\t\tif (2 * (id > 0)) // BUGFIX, wrong order of operation, this should be `2 * lvl` after the else.\r\n\t\t\tlvl = plr[id]._pLevel;\r\n\t\telse\r\n\t\t\tlvl = 1;\r\n\t\tmissile[mi]._mirange = lvl + 10 * missile[mi]._mispllvl + 245;\r\n\t\tCalcPlrItemVals(id, TRUE);\r\n\t\tforce_redraw = 255;\r\n\t\tPlaySfxLoc(blodboilSFX[plr[id]._pClass], plr[id]._px, plr[id]._py);\r\n\t}\r\n#else\r\n\tmissile[mi]._miDelFlag = 1;\r\n#endif\r\n}\r\n\r\nvoid AddRepair(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tUseMana(id, SPL_REPAIR);\r\n\tif (id == myplr) {\r\n\t\tif (sbookflag)\r\n\t\t\tsbookflag = FALSE;\r\n\t\tif (!invflag)\r\n\t\t\tinvflag = TRUE;\r\n\t\tSetCursor_(CURSOR_REPAIR);\r\n\t}\r\n}\r\n\r\nvoid AddRecharge(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tUseMana(id, SPL_RECHARGE);\r\n\tif (id == myplr) {\r\n\t\tif (sbookflag)\r\n\t\t\tsbookflag = FALSE;\r\n\t\tif (!invflag)\r\n\t\t\tinvflag = TRUE;\r\n\t\tSetCursor_(CURSOR_RECHARGE);\r\n\t}\r\n}\r\n\r\nvoid AddDisarm(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tUseMana(id, SPL_DISARM);\r\n\tif (id == myplr)\r\n\t\tSetCursor_(CURSOR_DISARM);\r\n}\r\n\r\nvoid AddApoca(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tmissile[mi]._miVar1 = 8;\r\n\tmissile[mi]._miVar2 = sy - missile[mi]._miVar1;\r\n\tmissile[mi]._miVar3 = missile[mi]._miVar1 + sy;\r\n\tmissile[mi]._miVar4 = sx - missile[mi]._miVar1;\r\n\tmissile[mi]._miVar5 = missile[mi]._miVar1 + sx;\r\n\tmissile[mi]._miVar6 = missile[mi]._miVar4;\r\n\tif (missile[mi]._miVar2 <= 0)\r\n\t\tmissile[mi]._miVar2 = 1;\r\n\tif (missile[mi]._miVar3 >= MAXDUNY)\r\n\t\tmissile[mi]._miVar3 = MAXDUNY - 1;\r\n\tif (missile[mi]._miVar4 <= 0)\r\n\t\tmissile[mi]._miVar4 = 1;\r\n\tif (missile[mi]._miVar5 >= MAXDUNX)\r\n\t\tmissile[mi]._miVar5 = MAXDUNX - 1;\r\n\tfor (i = 0; i < plr[id]._pLevel; i++) {\r\n\t\tmissile[mi]._midam += random_(67, 6) + 1;\r\n\t}\r\n\tmissile[mi]._mirange = 255;\r\n\tmissile[mi]._miDelFlag = FALSE;\r\n\tUseMana(id, SPL_APOCA);\r\n}\r\n\r\nvoid AddFlame(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint i;\r\n\r\n\tmissile[mi]._miVar2 = 0;\r\n\tfor (i = dam; i > 0; i--) {\r\n\t\tmissile[mi]._miVar2 += 5;\r\n\t}\r\n\tmissile[mi]._misx = dx;\r\n\tmissile[mi]._misy = dy;\r\n\tmissile[mi]._mixoff = missile[midir]._mixoff;\r\n\tmissile[mi]._miyoff = missile[midir]._miyoff;\r\n\tmissile[mi]._mitxoff = missile[midir]._mitxoff;\r\n\tmissile[mi]._mityoff = missile[midir]._mityoff;\r\n\tmissile[mi]._mirange = missile[mi]._miVar2 + 20;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 1);\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\ti = random_(79, plr[id]._pLevel) + random_(79, 2);\r\n\t\tmissile[mi]._midam = 8 * i + 16 + ((8 * i + 16) >> 1);\r\n\t} else {\r\n\t\tmissile[mi]._midam = monster[id].mMinDamage + random_(77, monster[id].mMaxDamage - monster[id].mMinDamage + 1);\r\n\t}\r\n}\r\n\r\nvoid AddFlamec(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 32);\r\n\tif (mienemy == TARGET_MONSTERS)\r\n\t\tUseMana(id, SPL_FLAME);\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._mirange = 256;\r\n}\r\n\r\nvoid AddCbolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam)\r\n{\r\n\t/// ASSERT: assert((DWORD)mi < MAXMISSILES);\r\n\r\n\tif (micaster == 0) {\r\n\t\tif (id == myplr) {\r\n\t\t\tmissile[mi]._mirnd = random_(63, 15) + 1;\r\n\t\t\tmissile[mi]._midam = random_(68, plr[id]._pMagic >> 2) + 1;\r\n\t\t} else {\r\n\t\t\tmissile[mi]._mirnd = random_(63, 15) + 1;\r\n\t\t\tmissile[mi]._midam = random_(68, plr[id]._pMagic >> 2) + 1;\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[mi]._mirnd = random_(63, 15) + 1;\r\n\t\tmissile[mi]._midam = 15;\r\n\t}\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\r\n\tmissile[mi]._miAnimFrame = random_(63, 8) + 1;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 5);\r\n\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 8);\r\n\tmissile[mi]._miVar1 = 5;\r\n\tmissile[mi]._miVar2 = midir;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._mirange = 256;\r\n}\r\n\r\nvoid AddHbolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam)\r\n{\r\n\tint sp;\r\n\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx += XDirAdd[midir];\r\n\t\tdy += YDirAdd[midir];\r\n\t}\r\n\tif (id != -1) {\r\n\t\tsp = 2 * missile[mi]._mispllvl + 16;\r\n\t\tif (sp >= 63) {\r\n\t\t\tsp = 63;\r\n\t\t}\r\n\t} else {\r\n\t\tsp = 16;\r\n\t}\r\n\tGetMissileVel(mi, sx, sy, dx, dy, sp);\r\n\tSetMissDir(mi, GetDirection16(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n\tmissile[mi]._midam = random_(69, 10) + plr[id]._pLevel + 9;\r\n\tUseMana(id, SPL_HBOLT);\r\n}\r\n\r\nvoid AddResurrect(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tUseMana(id, SPL_RESURRECT);\r\n\tif (id == myplr)\r\n\t\tSetCursor_(CURSOR_RESURRECT);\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid AddResurrectBeam(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._mix = dx;\r\n\tmissile[mi]._miy = dy;\r\n\tmissile[mi]._misx = missile[mi]._mix;\r\n\tmissile[mi]._misy = missile[mi]._miy;\r\n\tmissile[mi]._mixvel = 0;\r\n\tmissile[mi]._miyvel = 0;\r\n\tmissile[mi]._mirange = misfiledata[MFILE_RESSUR1].mAnimLen[0];\r\n}\r\n\r\nvoid AddTelekinesis(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n\tUseMana(id, SPL_TELEKINESIS);\r\n\tif (id == myplr)\r\n\t\tSetCursor_(CURSOR_TELEKINESIS);\r\n}\r\n\r\nvoid AddBoneSpirit(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tif (sx == dx && sy == dy) {\r\n\t\tdx = XDirAdd[midir] + dx;\r\n\t\tdy = YDirAdd[midir] + dy;\r\n\t}\r\n\tmissile[mi]._midam = 0;\r\n\tGetMissileVel(mi, sx, sy, dx, dy, 16);\r\n\tSetMissDir(mi, GetDirection8(sx, sy, dx, dy));\r\n\tmissile[mi]._mirange = 256;\r\n\tmissile[mi]._miVar1 = sx;\r\n\tmissile[mi]._miVar2 = sy;\r\n\tmissile[mi]._miVar3 = 0;\r\n\tmissile[mi]._miVar4 = dx;\r\n\tmissile[mi]._miVar5 = dy;\r\n\tmissile[mi]._mlid = AddLight(sx, sy, 8);\r\n\tif (mienemy == TARGET_MONSTERS) {\r\n\t\tUseMana(id, SPL_BONESPIRIT);\r\n\t\tplr[id]._pHitPoints -= 384;\r\n\t\tplr[id]._pHPBase -= 384;\r\n\t\tdrawhpflag = TRUE;\r\n\t\tif (plr[id]._pHitPoints <= 0)\r\n\t\t\tSyncPlrKill(id, 0);\r\n\t}\r\n}\r\n\r\nvoid AddRportal(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tmissile[mi]._mix = sx;\r\n\tmissile[mi]._miy = sy;\r\n\tmissile[mi]._misx = sx;\r\n\tmissile[mi]._misy = sy;\r\n\tmissile[mi]._mirange = 100;\r\n\tmissile[mi]._miVar1 = 100 - missile[mi]._miAnimLen;\r\n\tmissile[mi]._miVar2 = 0;\r\n\tPutMissile(mi);\r\n}\r\n\r\nvoid AddDiabApoca(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam)\r\n{\r\n\tint pnum;\r\n\r\n\tfor (pnum = 0; pnum < gbMaxPlayers; pnum++) {\r\n\t\tif (plr[pnum].plractive) {\r\n\t\t\tif (LineClear(sx, sy, plr[pnum]._pfutx, plr[pnum]._pfuty)) {\r\n\t\t\t\tAddMissile(0, 0, plr[pnum]._pfutx, plr[pnum]._pfuty, 0, MIS_BOOM2, mienemy, id, dam, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[mi]._miDelFlag = TRUE;\r\n}\r\n\r\nint AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, char micaster, int id, int midam, int spllvl)\r\n{\r\n\tint i, mi;\r\n\r\n#ifdef HELLFIRE\r\n\tif (nummissiles >= MAXMISSILES - 1)\r\n#else\r\n\tif (nummissiles >= MAXMISSILES)\r\n#endif\r\n\t\treturn -1;\r\n\r\n#ifndef HELLFIRE\r\n\tif (mitype == MIS_MANASHIELD && plr[id].pManaShield == TRUE) {\r\n\t\tif (currlevel != plr[id].plrlevel)\r\n\t\t\treturn -1;\r\n\r\n\t\tfor (i = 0; i < nummissiles; i++) {\r\n\t\t\tmi = missileactive[i];\r\n\t\t\tif (missile[mi]._mitype == MIS_MANASHIELD && missile[mi]._misource == id)\r\n\t\t\t\treturn -1;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tmi = missileavail[0];\r\n\r\n\tmissileavail[0] = missileavail[MAXMISSILES - nummissiles - 1];\r\n\tmissileactive[nummissiles] = mi;\r\n\tnummissiles++;\r\n\r\n#ifdef HELLFIRE\r\n\tmemset(&missile[mi], 0, sizeof(*missile));\r\n#endif\r\n\r\n\tmissile[mi]._mitype = mitype;\r\n\tmissile[mi]._micaster = micaster;\r\n\tmissile[mi]._misource = id;\r\n\tmissile[mi]._miAnimType = missiledata[mitype].mFileNum;\r\n\tmissile[mi]._miDrawFlag = missiledata[mitype].mDraw;\r\n\tmissile[mi]._mispllvl = spllvl;\r\n\tmissile[mi]._mimfnum = midir;\r\n\r\n\tif (missile[mi]._miAnimType == MFILE_NONE || misfiledata[missile[mi]._miAnimType].mAnimFAmt < 8)\r\n\t\tSetMissDir(mi, 0);\r\n\telse\r\n\t\tSetMissDir(mi, midir);\r\n\r\n\tmissile[mi]._mix = sx;\r\n\tmissile[mi]._miy = sy;\r\n\tmissile[mi]._mixoff = 0;\r\n\tmissile[mi]._miyoff = 0;\r\n\tmissile[mi]._misx = sx;\r\n\tmissile[mi]._misy = sy;\r\n\tmissile[mi]._mitxoff = 0;\r\n\tmissile[mi]._mityoff = 0;\r\n\tmissile[mi]._miDelFlag = FALSE;\r\n\tmissile[mi]._miAnimAdd = 1;\r\n\tmissile[mi]._miLightFlag = FALSE;\r\n\tmissile[mi]._miPreFlag = FALSE;\r\n\tmissile[mi]._miUniqTrans = 0;\r\n\tmissile[mi]._midam = midam;\r\n\tmissile[mi]._miHitFlag = FALSE;\r\n\tmissile[mi]._midist = 0;\r\n\tmissile[mi]._mlid = -1;\r\n\tmissile[mi]._mirnd = 0;\r\n\r\n\tif (missiledata[mitype].mlSFX != -1) {\r\n\t\tPlaySfxLoc(missiledata[mitype].mlSFX, missile[mi]._misx, missile[mi]._misy);\r\n\t}\r\n\r\n\tmissiledata[mitype].mAddProc(mi, sx, sy, dx, dy, midir, micaster, id, midam);\r\n\r\n\treturn mi;\r\n}\r\n\r\nint Sentfire(int i, int sx, int sy)\r\n{\r\n\tint ex, dir;\r\n\r\n\tex = 0;\r\n\tif (LineClear(missile[i]._mix, missile[i]._miy, sx, sy)) {\r\n\t\tif (dMonster[sx][sy] > 0 && monster[dMonster[sx][sy] - 1]._mhitpoints >> 6 > 0 && dMonster[sx][sy] - 1 > MAX_PLRS - 1) {\r\n\t\t\tdir = GetDirection(missile[i]._mix, missile[i]._miy, sx, sy);\r\n\t\t\tmissile[i]._miVar3 = missileavail[0];\r\n\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, sx, sy, dir, MIS_FIREBOLT, TARGET_MONSTERS, missile[i]._misource, missile[i]._midam, GetSpellLevel(missile[i]._misource, SPL_FIREBOLT));\r\n\t\t\tex = -1;\r\n\t\t}\r\n\t}\r\n\tif (ex == -1) {\r\n\t\tSetMissDir(i, 2);\r\n\t\tmissile[i]._miVar2 = 3;\r\n\t}\r\n\r\n\treturn ex;\r\n}\r\n\r\nvoid MI_Dummy(int i)\r\n{\r\n\treturn;\r\n}\r\n\r\nvoid MI_Golem(int i)\r\n{\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[6] = { 0, 3, 12, 45, 94, 159 };\r\n#endif\r\n\tint tx, ty, dp, l, m, src, k, tid;\r\n\tchar *ct;\r\n\r\n\tsrc = missile[i]._misource;\r\n\tif (monster[src]._mx == 1 && monster[src]._my == 0) {\r\n\t\tfor (l = 0; l < 6; l++) {\r\n\t\t\tk = CrawlNum[l];\r\n\t\t\ttid = k + 2;\r\n#ifdef HELLFIRE\r\n\t\t\tfor (m = CrawlTable[k]; m > 0; m--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\t\tfor (m = (BYTE)CrawlTable[k]; m > 0; m--) {\r\n#endif\r\n\t\t\t\tct = &CrawlTable[tid];\r\n\t\t\t\ttx = missile[i]._miVar4 + *(ct - 1);\r\n\t\t\t\tty = missile[i]._miVar5 + *ct;\r\n\t\t\t\tif (0 < tx && tx < MAXDUNX && 0 < ty && ty < MAXDUNY) {\r\n\t\t\t\t\tdp = dPiece[tx][ty];\r\n\t\t\t\t\tif (LineClear(missile[i]._miVar1, missile[i]._miVar2, tx, ty)) {\r\n\t\t\t\t\t\tif ((dMonster[tx][ty] | nSolidTable[dp] | dObject[tx][ty]) == 0) {\r\n\t\t\t\t\t\t\tl = 6;\r\n\t\t\t\t\t\t\tSpawnGolum(src, tx, ty, i);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\ttid += 2;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid MI_SetManashield(int i)\r\n{\r\n\tManashieldFlag = TRUE;\r\n}\r\n\r\nvoid MI_LArrow(int i)\r\n{\r\n\tint p, mind, maxd, rst;\r\n\r\n\tmissile[i]._mirange--;\r\n\tp = missile[i]._misource;\r\n\tif (missile[i]._miAnimType == MFILE_MINILTNG || missile[i]._miAnimType == MFILE_MAGBLOS) {\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, missile[i]._miAnimFrame + 5);\r\n\t\trst = missiledata[missile[i]._mitype].mResist;\r\n\t\tif (missile[i]._mitype == MIS_LARROW) {\r\n\t\t\tif (p != -1) {\r\n\t\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\t\t\tmind = plr[p]._pILMinDam;\r\n\t\t\t\tmaxd = plr[p]._pILMaxDam;\r\n\t\t\t} else {\r\n\t\t\t\tmind = random_(68, 10) + 1 + currlevel;\r\n\t\t\t\tmaxd = random_(68, 10) + 1 + currlevel * 2;\r\n\t\t\t}\r\n\t\t\tmissiledata[MIS_LARROW].mResist = MISR_LIGHTNING;\r\n\t\t\tCheckMissileCol(i, mind, maxd, FALSE, missile[i]._mix, missile[i]._miy, TRUE);\r\n\t\t}\r\n\t\tif (missile[i]._mitype == MIS_FARROW) {\r\n\t\t\tif (p != -1) {\r\n\t\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\t\t\tmind = plr[p]._pIFMinDam;\r\n\t\t\t\tmaxd = plr[p]._pIFMaxDam;\r\n\t\t\t} else {\r\n\t\t\t\tmind = random_(68, 10) + 1 + currlevel;\r\n\t\t\t\tmaxd = random_(68, 10) + 1 + currlevel * 2;\r\n\t\t\t}\r\n\t\t\tmissiledata[MIS_FARROW].mResist = MISR_FIRE;\r\n\t\t\tCheckMissileCol(i, mind, maxd, FALSE, missile[i]._mix, missile[i]._miy, TRUE);\r\n\t\t}\r\n\t\tmissiledata[missile[i]._mitype].mResist = rst;\r\n\t} else {\r\n\t\tmissile[i]._midist++;\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\r\n\t\tif (p != -1) {\r\n\t\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\t\t\tmind = plr[p]._pIMinDam;\r\n\t\t\t\tmaxd = plr[p]._pIMaxDam;\r\n\t\t\t} else {\r\n\t\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; monster can be dead before missile arrives.\r\n\t\t\t\tmind = monster[p].mMinDamage;\r\n\t\t\t\tmaxd = monster[p].mMaxDamage;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmind = random_(68, 10) + 1 + currlevel;\r\n\t\t\tmaxd = random_(68, 10) + 1 + currlevel * 2;\r\n\t\t}\r\n\r\n\t\tif (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy) {\r\n\t\t\trst = missiledata[missile[i]._mitype].mResist;\r\n\t\t\tmissiledata[missile[i]._mitype].mResist = 0;\r\n\t\t\tCheckMissileCol(i, mind, maxd, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\t\t\tmissiledata[missile[i]._mitype].mResist = rst;\r\n\t\t}\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._mimfnum = 0;\r\n\t\t\tmissile[i]._mitxoff -= missile[i]._mixvel;\r\n\t\t\tmissile[i]._mityoff -= missile[i]._miyvel;\r\n\t\t\tGetMissilePos(i);\r\n\t\t\tif (missile[i]._mitype == MIS_LARROW)\r\n\t\t\t\tSetMissAnim(i, MFILE_MINILTNG);\r\n\t\t\telse\r\n\t\t\t\tSetMissAnim(i, MFILE_MAGBLOS);\r\n\t\t\tmissile[i]._mirange = missile[i]._miAnimLen - 1;\r\n\t\t} else {\r\n\t\t\tif (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) {\r\n\t\t\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\t\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\t\t\tChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 5);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Arrow(int i)\r\n{\r\n\tint p, mind, maxd;\r\n\r\n\tmissile[i]._mirange--;\r\n\tmissile[i]._midist++;\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\tp = missile[i]._misource;\r\n\tif (p != -1) {\r\n\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\t\tmind = plr[p]._pIMinDam;\r\n\t\t\tmaxd = plr[p]._pIMaxDam;\r\n\t\t} else {\r\n\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; monster can be dead before missile arrives.\r\n\t\t\tmind = monster[p].mMinDamage;\r\n\t\t\tmaxd = monster[p].mMaxDamage;\r\n\t\t}\r\n\t} else {\r\n\t\tmind = currlevel;\r\n\t\tmaxd = 2 * currlevel;\r\n\t}\r\n\tif (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy)\r\n\t\tCheckMissileCol(i, mind, maxd, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Firebolt(int i)\r\n{\r\n\tint omx, omy;\r\n\tint d, p;\r\n\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mitype != MIS_BONESPIRIT || missile[i]._mimfnum != 8) {\r\n\t\tomx = missile[i]._mitxoff;\r\n\t\tomy = missile[i]._mityoff;\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t\tp = missile[i]._misource;\r\n\t\tif (p != -1) {\r\n\t\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\t\tswitch (missile[i]._mitype) {\r\n\t\t\t\tcase MIS_FIREBOLT:\r\n\t\t\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\t\t\t\td = random_(75, 10) + (plr[p]._pMagic >> 3) + missile[i]._mispllvl + 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase MIS_FLARE:\r\n\t\t\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\t\t\t\td = 3 * missile[i]._mispllvl - (plr[p]._pMagic >> 3) + (plr[p]._pMagic >> 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase MIS_BONESPIRIT:\r\n\t\t\t\t\td = 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; monster can be dead before missile arrives.\r\n\t\t\t\td = monster[p].mMinDamage + random_(77, monster[p].mMaxDamage - monster[p].mMinDamage + 1);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\td = currlevel + random_(78, 2 * currlevel);\r\n\t\t}\r\n\t\tif (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy) {\r\n\t\t\tCheckMissileCol(i, d, d, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\t\t}\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tmissile[i]._mitxoff = omx;\r\n\t\t\tmissile[i]._mityoff = omy;\r\n\t\t\tGetMissilePos(i);\r\n\t\t\tswitch (missile[i]._mitype) {\r\n\t\t\tcase MIS_FIREBOLT:\r\n\t\t\tcase MIS_MAGMABALL:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_MISEXP, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MIS_FLARE:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_MISEXP2, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MIS_ACID:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_MISEXP3, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MIS_BONESPIRIT:\r\n\t\t\t\tSetMissDir(i, 8);\r\n\t\t\t\tmissile[i]._mirange = 7;\r\n\t\t\t\tmissile[i]._miDelFlag = FALSE;\r\n\t\t\t\tPutMissile(i);\r\n\t\t\t\treturn;\r\n#ifdef HELLFIRE\r\n\t\t\tcase MIS_LICH:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_EXORA1, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MIS_PSYCHORB:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_EXBL2, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MIS_NECROMORB:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_EXRED3, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MIS_ARCHLICH:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_EXYEL2, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MIS_BONEDEMON:\r\n\t\t\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_EXBL3, missile[i]._micaster, missile[i]._misource, 0, 0);\r\n\t\t\t\tbreak;\r\n#endif\r\n\t\t\t}\r\n\t\t\tif (missile[i]._mlid >= 0)\r\n\t\t\t\tAddUnLight(missile[i]._mlid);\r\n\t\t\tPutMissile(i);\r\n\t\t} else {\r\n\t\t\tif (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) {\r\n\t\t\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\t\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\t\t\tif (missile[i]._mlid >= 0)\r\n\t\t\t\t\tChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8);\r\n\t\t\t}\r\n\t\t\tPutMissile(i);\r\n\t\t}\r\n\t} else if (missile[i]._mirange == 0) {\r\n\t\tif (missile[i]._mlid >= 0)\r\n\t\t\tAddUnLight(missile[i]._mlid);\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tPlaySfxLoc(LS_BSIMPCT, missile[i]._mix, missile[i]._miy);\r\n\t\tPutMissile(i);\r\n\t} else\r\n\t\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Lightball(int i)\r\n{\r\n\tint tx, ty, j, oi;\r\n\tchar obj;\r\n\r\n\ttx = missile[i]._miVar1;\r\n\tty = missile[i]._miVar2;\r\n\tmissile[i]._mirange--;\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\tj = missile[i]._mirange;\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tif (missile[i]._miHitFlag == TRUE)\r\n\t\tmissile[i]._mirange = j;\r\n\tobj = dObject[tx][ty];\r\n\tif (obj && tx == missile[i]._mix && ty == missile[i]._miy) {\r\n\t\tif (obj > 0) {\r\n\t\t\toi = obj - 1;\r\n\t\t} else {\r\n\t\t\toi = -1 - obj;\r\n\t\t}\r\n\t\tif (object[oi]._otype == OBJ_SHRINEL || object[oi]._otype == OBJ_SHRINER)\r\n\t\t\tmissile[i]._mirange = j;\r\n\t}\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_null_33(int i)\r\n{\r\n\tmissile[i]._mirange--;\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Acidpud(int i)\r\n{\r\n\tint range;\r\n\r\n\tmissile[i]._mirange--;\r\n\trange = missile[i]._mirange;\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tmissile[i]._mirange = range;\r\n\tif (range == 0) {\r\n\t\tif (missile[i]._mimfnum != 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t} else {\r\n\t\t\tSetMissDir(i, 1);\r\n\t\t\tmissile[i]._mirange = missile[i]._miAnimLen;\r\n\t\t}\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Firewall(int i)\r\n{\r\n\tint ExpLight[14] = { 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12 };\r\n\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == missile[i]._miVar1) {\r\n\t\tSetMissDir(i, 1);\r\n\t\tmissile[i]._miAnimFrame = random_(83, 11) + 1;\r\n\t}\r\n\tif (missile[i]._mirange == missile[i]._miAnimLen - 1) {\r\n\t\tSetMissDir(i, 0);\r\n\t\tmissile[i]._miAnimFrame = 13;\r\n\t\tmissile[i]._miAnimAdd = -1;\r\n\t}\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix, missile[i]._miy, TRUE);\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tif (missile[i]._mimfnum != 0 && missile[i]._mirange != 0 && missile[i]._miAnimAdd != -1 && missile[i]._miVar2 < 12) {\r\n\t\tif (missile[i]._miVar2 == 0)\r\n\t\t\tmissile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, ExpLight[0]);\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar2]);\r\n\t\tmissile[i]._miVar2++;\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Fireball(int i)\r\n{\r\n\tint dam, id, px, py, mx, my;\r\n\r\n\tid = missile[i]._misource;\r\n\tdam = missile[i]._midam;\r\n\tmissile[i]._mirange--;\r\n\r\n\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\tpx = plr[id]._px;\r\n\t\tpy = plr[id]._py;\r\n\t} else {\r\n\t\tpx = monster[id]._mx;\r\n\t\tpy = monster[id]._my;\r\n\t}\r\n\r\n\tif (missile[i]._miAnimType == MFILE_BIGEXP) {\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tAddUnLight(missile[i]._mlid);\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t\tif (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy)\r\n\t\t\tCheckMissileCol(i, dam, dam, 0, missile[i]._mix, missile[i]._miy, 0);\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmx = missile[i]._mix;\r\n\t\t\tmy = missile[i]._miy;\r\n\t\t\tChangeLight(missile[i]._mlid, missile[i]._mix, my, missile[i]._miAnimFrame);\r\n\t\t\tif (!CheckBlock(px, py, mx, my))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx, my, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx, my + 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx, my + 1, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx, my - 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx, my - 1, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx + 1, my))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx + 1, my, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx + 1, my - 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx + 1, my - 1, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx + 1, my + 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx + 1, my + 1, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx - 1, my))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx - 1, my, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx - 1, my + 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx - 1, my + 1, 1);\r\n\t\t\tif (!CheckBlock(px, py, mx - 1, my - 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, 0, mx - 1, my - 1, 1);\r\n\t\t\tif (!TransList[dTransVal[mx][my]]\r\n\t\t\t    || (missile[i]._mixvel < 0 && ((TransList[dTransVal[mx][my + 1]] && nSolidTable[dPiece[mx][my + 1]]) || (TransList[dTransVal[mx][my - 1]] && nSolidTable[dPiece[mx][my - 1]])))) {\r\n\t\t\t\tmissile[i]._mix++;\r\n\t\t\t\tmissile[i]._miy++;\r\n\t\t\t\tmissile[i]._miyoff -= 32;\r\n\t\t\t}\r\n\t\t\tif (missile[i]._miyvel > 0\r\n\t\t\t    && (TransList[dTransVal[mx + 1][my]] && nSolidTable[dPiece[mx + 1][my]]\r\n\t\t\t        || TransList[dTransVal[mx - 1][my]] && nSolidTable[dPiece[mx - 1][my]])) {\r\n\t\t\t\tmissile[i]._miyoff -= 32;\r\n\t\t\t}\r\n\t\t\tif (missile[i]._mixvel > 0\r\n\t\t\t    && (TransList[dTransVal[mx][my + 1]] && nSolidTable[dPiece[mx][my + 1]]\r\n\t\t\t        || TransList[dTransVal[mx][my - 1]] && nSolidTable[dPiece[mx][my - 1]])) {\r\n\t\t\t\tmissile[i]._mixoff -= 32;\r\n\t\t\t}\r\n\t\t\tmissile[i]._mimfnum = 0;\r\n\t\t\tSetMissAnim(i, MFILE_BIGEXP);\r\n\t\t\tmissile[i]._mirange = missile[i]._miAnimLen - 1;\r\n\t\t} else if (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) {\r\n\t\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\t\tChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8);\r\n\t\t}\r\n\t}\r\n\r\n\tPutMissile(i);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid mi_hork_spawn(int i)\r\n{\r\n\tint t, j, k, tx, ty, dp;\r\n\r\n\tmissile[i]._mirange--;\r\n\tCheckMissileCol(i, 0, 0, 0, missile[i]._mix, missile[i]._miy, 0);\r\n\tif (missile[i]._mirange <= 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tfor (j = 0; j < 2; j++) {\r\n\t\t\tk = CrawlNum[j] + 2;\r\n\t\t\tfor (t = CrawlTable[CrawlNum[j]]; t > 0; t--, k += 2) {\r\n\t\t\t\ttx = missile[i]._mix + CrawlTable[k - 1];\r\n\t\t\t\tty = missile[i]._miy + CrawlTable[k];\r\n\t\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\t\tdp = dPiece[tx][ty];\r\n\t\t\t\t\tif (!nSolidTable[dp] && dMonster[tx][ty] == 0 && dPlayer[tx][ty] == 0 && dObject[tx][ty] == 0) {\r\n\t\t\t\t\t\tj = 6;\r\n\t\t\t\t\t\tint mon = AddMonster(tx, ty, missile[i]._miVar1, 1, TRUE);\r\n\t\t\t\t\t\tM_StartStand(mon, missile[i]._miVar1);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[i]._midist++;\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Rune(int i)\r\n{\r\n\tint mid, pid, dir, mx, my;\r\n\r\n\tmx = missile[i]._mix;\r\n\tmy = missile[i]._miy;\r\n\tmid = dMonster[mx][my];\r\n\tpid = dPlayer[mx][my];\r\n\tif (mid != 0 || pid != 0) {\r\n\t\tif (mid != 0) {\r\n\t\t\tif (mid > 0)\r\n\t\t\t\tmid = mid - 1;\r\n\t\t\telse\r\n\t\t\t\tmid = -(mid + 1);\r\n\t\t\tdir = GetDirection(missile[i]._mix, missile[i]._miy, monster[mid]._mx, monster[mid]._my);\r\n\t\t} else {\r\n\t\t\tif (pid > 0)\r\n\t\t\t\tpid = pid - 1;\r\n\t\t\telse\r\n\t\t\t\tpid = -(pid + 1);\r\n\t\t\tdir = GetDirection(missile[i]._mix, missile[i]._miy, plr[pid]._px, plr[pid]._py);\r\n\t\t}\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t\tAddMissile(mx, my, mx, my, dir, missile[i]._miVar1, TARGET_BOTH, missile[i]._misource, missile[i]._midam, missile[i]._mispllvl);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_light_wall(int i)\r\n{\r\n\tint range;\r\n\r\n\tmissile[i]._mirange--;\r\n\trange = missile[i]._mirange;\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, 1, missile[i]._mix, missile[i]._miy, 0);\r\n\tif (missile[i]._miHitFlag == TRUE)\r\n\t\tmissile[i]._mirange = range;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_hive_explode(int i)\r\n{\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange <= 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_immolation(int i)\r\n{\r\n\tint dam, id, px, py, mx, my, xof, yof;\r\n\r\n\tid = missile[i]._misource;\r\n\tdam = missile[i]._midam;\r\n\r\n\tif (missile[i]._miVar7 < 0) {\r\n\t\tint v = 2 * missile[i]._miVar6;\r\n\t\tmissile[i]._miVar6 = v;\r\n\t\tmissile[i]._miVar7 = v;\r\n\t\tmissile[i]._mimfnum--;\r\n\t\tif (missile[i]._mimfnum < 0)\r\n\t\t\tmissile[i]._mimfnum = 7;\r\n\t} else {\r\n\t\tmissile[i]._miVar7--;\r\n\t}\r\n\r\n\tswitch (missile[i]._mimfnum) {\r\n\tcase DIR_S:\r\n\t\txof = missile[i]._mixvel;\r\n\t\tyof = 0;\r\n\t\tbreak;\r\n\tcase DIR_SW:\r\n\t\txof = missile[i]._mixvel;\r\n\t\tyof = missile[i]._miyvel;\r\n\t\tbreak;\r\n\tcase DIR_W:\r\n\t\txof = 0;\r\n\t\tyof = missile[i]._miyvel;\r\n\t\tbreak;\r\n\tcase DIR_NW:\r\n\t\txof = missile[i]._mixvel;\r\n\t\tyof = missile[i]._miyvel;\r\n\t\tbreak;\r\n\tcase DIR_N:\r\n\t\txof = missile[i]._mixvel;\r\n\t\tyof = 0;\r\n\t\tbreak;\r\n\tcase DIR_NE:\r\n\t\txof = missile[i]._mixvel;\r\n\t\tyof = missile[i]._miyvel;\r\n\t\tbreak;\r\n\tcase DIR_E:\r\n\t\txof = 0;\r\n\t\tyof = missile[i]._miyvel;\r\n\t\tbreak;\r\n\tcase DIR_SE:\r\n\t\txof = missile[i]._mixvel;\r\n\t\tyof = missile[i]._miyvel;\r\n\t\tbreak;\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\r\n\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\tpx = plr[id]._px;\r\n\t\tpy = plr[id]._py;\r\n\t} else {\r\n\t\tpx = monster[id]._mx;\r\n\t\tpy = monster[id]._my;\r\n\t}\r\n\r\n\tif (missile[i]._miAnimType == MFILE_BIGEXP) {\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tAddUnLight(missile[i]._mlid);\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[i]._mitxoff += xof;\r\n\t\tmissile[i]._mityoff += yof;\r\n\t\tGetMissilePos(i);\r\n\t\tif (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy)\r\n\t\t\tCheckMissileCol(i, dam, dam, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmx = missile[i]._mix;\r\n\t\t\tmy = missile[i]._miy;\r\n\t\t\tChangeLight(missile[i]._mlid, missile[i]._mix, my, missile[i]._miAnimFrame);\r\n\t\t\tif (!CheckBlock(px, py, mx, my))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx, my, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx, my + 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx, my + 1, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx, my - 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx, my - 1, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx + 1, my))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx + 1, my, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx + 1, my - 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx + 1, my - 1, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx + 1, my + 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx + 1, my + 1, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx - 1, my))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx - 1, my, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx - 1, my + 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx - 1, my + 1, TRUE);\r\n\t\t\tif (!CheckBlock(px, py, mx - 1, my - 1))\r\n\t\t\t\tCheckMissileCol(i, dam, dam, FALSE, mx - 1, my - 1, TRUE);\r\n\t\t\tif (!TransList[dTransVal[mx][my]]\r\n\t\t\t    || (missile[i]._mixvel < 0 && ((TransList[dTransVal[mx][my + 1]] && nSolidTable[dPiece[mx][my + 1]]) || (TransList[dTransVal[mx][my - 1]] && nSolidTable[dPiece[mx][my - 1]])))) {\r\n\t\t\t\tmissile[i]._mix++;\r\n\t\t\t\tmissile[i]._miy++;\r\n\t\t\t\tmissile[i]._miyoff -= 32;\r\n\t\t\t}\r\n\t\t\tif (missile[i]._miyvel > 0\r\n\t\t\t    && (TransList[dTransVal[mx + 1][my]] && nSolidTable[dPiece[mx + 1][my]]\r\n\t\t\t        || TransList[dTransVal[mx - 1][my]] && nSolidTable[dPiece[mx - 1][my]])) {\r\n\t\t\t\tmissile[i]._miyoff -= 32;\r\n\t\t\t}\r\n\t\t\tif (missile[i]._mixvel > 0\r\n\t\t\t    && (TransList[dTransVal[mx][my + 1]] && nSolidTable[dPiece[mx][my + 1]]\r\n\t\t\t        || TransList[dTransVal[mx][my - 1]] && nSolidTable[dPiece[mx][my - 1]])) {\r\n\t\t\t\tmissile[i]._mixoff -= 32;\r\n\t\t\t}\r\n\t\t\tmissile[i]._mimfnum = 0;\r\n\t\t\tSetMissAnim(i, MFILE_BIGEXP);\r\n\t\t\tmissile[i]._mirange = missile[i]._miAnimLen - 1;\r\n\t\t} else if (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) {\r\n\t\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\t\tChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8);\r\n\t\t}\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t}\r\n\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_light_arrow(int i)\r\n{\r\n\tint pn, dam, mx, my;\r\n\r\n\tmissile[i]._mirange--;\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\r\n\tmx = missile[i]._mix;\r\n\tmy = missile[i]._miy;\r\n\t/// ASSERT: assert((DWORD)mx < MAXDUNX);\r\n\t/// ASSERT: assert((DWORD)my < MAXDUNY);\r\n\tpn = dPiece[mx][my];\r\n\t/// ASSERT: assert((DWORD)pn <= MAXTILES);\r\n\r\n\tif (missile[i]._misource == -1) {\r\n\t\tif ((mx != missile[i]._misx || my != missile[i]._misy) && nMissileTable[pn]) {\r\n\t\t\tmissile[i]._mirange = 0;\r\n\t\t}\r\n\t} else if (nMissileTable[pn]) {\r\n\t\tmissile[i]._mirange = 0;\r\n\t}\r\n\r\n\tif (!nMissileTable[pn]) {\r\n\t\tif ((mx != missile[i]._miVar1 || my != missile[i]._miVar2) && mx > 0 && my > 0 && mx < MAXDUNX && my < MAXDUNY) {\r\n\t\t\tif (missile[i]._misource != -1) {\r\n\t\t\t\tif (missile[i]._micaster == TARGET_PLAYERS\r\n\t\t\t\t    && monster[missile[i]._misource].MType->mtype >= MT_STORM\r\n\t\t\t\t    && monster[missile[i]._misource].MType->mtype <= MT_MAEL) {\r\n\t\t\t\t\tAddMissile(\r\n\t\t\t\t\t    missile[i]._mix,\r\n\t\t\t\t\t    missile[i]._miy,\r\n\t\t\t\t\t    missile[i]._misx,\r\n\t\t\t\t\t    missile[i]._misy,\r\n\t\t\t\t\t    i,\r\n\t\t\t\t\t    MIS_LIGHTNING2,\r\n\t\t\t\t\t    missile[i]._micaster,\r\n\t\t\t\t\t    missile[i]._misource,\r\n\t\t\t\t\t    missile[i]._midam,\r\n\t\t\t\t\t    missile[i]._mispllvl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tAddMissile(\r\n\t\t\t\t\t    missile[i]._mix,\r\n\t\t\t\t\t    missile[i]._miy,\r\n\t\t\t\t\t    missile[i]._misx,\r\n\t\t\t\t\t    missile[i]._misy,\r\n\t\t\t\t\t    i,\r\n\t\t\t\t\t    MIS_LIGHTNING,\r\n\t\t\t\t\t    missile[i]._micaster,\r\n\t\t\t\t\t    missile[i]._misource,\r\n\t\t\t\t\t    missile[i]._midam,\r\n\t\t\t\t\t    missile[i]._mispllvl);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tAddMissile(\r\n\t\t\t\t    missile[i]._mix,\r\n\t\t\t\t    missile[i]._miy,\r\n\t\t\t\t    missile[i]._misx,\r\n\t\t\t\t    missile[i]._misy,\r\n\t\t\t\t    i,\r\n\t\t\t\t    MIS_LIGHTNING,\r\n\t\t\t\t    missile[i]._micaster,\r\n\t\t\t\t    missile[i]._misource,\r\n\t\t\t\t    missile[i]._midam,\r\n\t\t\t\t    missile[i]._mispllvl);\r\n\t\t\t}\r\n\t\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\t}\r\n\t}\r\n\r\n\tif (missile[i]._mirange == 0 || mx <= 0 || my <= 0 || mx >= MAXDUNX || my > MAXDUNY) { // BUGFIX my >= MAXDUNY\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid mi_flashfr(int i)\r\n{\r\n\tint src;\r\n\r\n\tsrc = missile[i]._misource;\r\n\tif (missile[i]._micaster == TARGET_MONSTERS && src != -1) {\r\n\t\tmissile[i]._mix = plr[src]._px;\r\n\t\tmissile[i]._miy = plr[src]._py;\r\n\t\tmissile[i]._mitxoff = plr[src]._pxoff << 16;\r\n\t\tmissile[i]._mityoff = plr[src]._pyoff << 16;\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\tsrc = missile[i]._misource;\r\n\t\t\tif (src != -1)\r\n\t\t\t\tplr[src]._pBaseToBlk -= 50;\r\n\t\t}\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_flashbk(int i)\r\n{\r\n\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\tif (missile[i]._misource != -1) {\r\n\t\t\tmissile[i]._mix = plr[missile[i]._misource]._pfutx;\r\n\t\t\tmissile[i]._miy = plr[missile[i]._misource]._pfuty;\r\n\t\t}\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_reflect(int i)\r\n{\r\n\tint src;\r\n\r\n\tsrc = missile[i]._misource;\r\n\tmissile[i]._mitxoff = plr[src]._pxoff << 16;\r\n\tmissile[i]._mityoff = plr[src]._pyoff << 16;\r\n\tif (plr[src]._pmode == PM_WALK3) {\r\n\t\tmissile[i]._misx = plr[src]._pfutx + 2;\r\n\t\tmissile[i]._misy = plr[src]._pfuty - 1;\r\n\t} else {\r\n\t\tmissile[i]._misx = plr[src]._px + 2;\r\n\t\tmissile[i]._misy = plr[src]._py - 1;\r\n\t}\r\n\tGetMissilePos(i);\r\n\tif (plr[src]._pmode == PM_WALK3) {\r\n\t\tif (plr[src]._pdir == DIR_W)\r\n\t\t\tmissile[i]._mix++;\r\n\t\telse\r\n\t\t\tmissile[i]._miy++;\r\n\t}\r\n\tif (src != myplr && currlevel != plr[src].plrlevel)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tif (plr[src].wReflections <= 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tNetSendCmd(TRUE, CMD_REFLECT);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_fire_ring(int i)\r\n{\r\n\tint src, tx, ty, dmg, k, j, dp, b;\r\n\tBYTE lvl;\r\n\r\n\tb = CrawlNum[3];\r\n\tmissile[i]._miDelFlag = 1;\r\n\tsrc = missile[i]._micaster;\r\n\tk = CrawlNum[3] + 1;\r\n\tif (src > 0)\r\n\t\tlvl = plr[src]._pLevel;\r\n\telse\r\n\t\tlvl = currlevel;\r\n\tdmg = 16 * (random_(53, 10) + random_(53, 10) + lvl + 2) >> 1;\r\n\tfor (j = CrawlTable[b]; j > 0; j--, k += 2) {\r\n\t\ttx = missile[i]._miVar1 + CrawlTable[k];\r\n\t\tty = missile[i]._miVar2 + CrawlTable[k + 1];\r\n\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\tdp = dPiece[tx][ty];\r\n\t\t\tif (!nSolidTable[dp] && dObject[tx][ty] == 0) {\r\n\t\t\t\tif (LineClear(missile[i]._mix, missile[i]._miy, tx, ty)) {\r\n\t\t\t\t\tif (nMissileTable[dp] || missile[i]._miVar8)\r\n\t\t\t\t\t\tmissile[i]._miVar8 = 1;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tAddMissile(tx, ty, tx, ty, 0, MIS_FIREWALL, TARGET_BOTH, src, dmg, missile[i]._mispllvl);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid mi_light_ring(int i)\r\n{\r\n\tint src, tx, ty, dmg, k, j, dp, b;\r\n\tBYTE lvl;\r\n\r\n\tb = CrawlNum[3];\r\n\tmissile[i]._miDelFlag = 1;\r\n\tsrc = missile[i]._micaster;\r\n\tk = CrawlNum[3] + 1;\r\n\tif (src > 0)\r\n\t\tlvl = plr[src]._pLevel;\r\n\telse\r\n\t\tlvl = currlevel;\r\n\tdmg = 16 * (random_(53, 10) + random_(53, 10) + lvl + 2) >> 1;\r\n\tfor (j = CrawlTable[b]; j > 0; j--, k += 2) {\r\n\t\ttx = missile[i]._miVar1 + CrawlTable[k];\r\n\t\tty = missile[i]._miVar2 + CrawlTable[k + 1];\r\n\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\tdp = dPiece[tx][ty];\r\n\t\t\tif (!nSolidTable[dp] && dObject[tx][ty] == 0) {\r\n\t\t\t\tif (LineClear(missile[i]._mix, missile[i]._miy, tx, ty)) {\r\n\t\t\t\t\tif (nMissileTable[dp] || missile[i]._miVar8)\r\n\t\t\t\t\t\tmissile[i]._miVar8 = 1;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tAddMissile(tx, ty, tx, ty, 0, MIS_LIGHTWALL, TARGET_BOTH, src, dmg, missile[i]._mispllvl);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid mi_search(int i)\r\n{\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tPlaySfxLoc(IS_CAST7, plr[missile[i]._miVar1]._px, plr[missile[i]._miVar1]._py);\r\n\t\tAutoMapShowItems = FALSE;\r\n\t}\r\n}\r\n\r\nvoid mi_lightning_wall(int i)\r\n{\r\n\tint src, lvl, dmg, tx, ty, dp;\r\n\r\n\tmissile[i]._mirange--;\r\n\tsrc = missile[i]._misource;\r\n\tif (src > 0)\r\n\t\tlvl = plr[src]._pLevel;\r\n\telse\r\n\t\tlvl = 0;\r\n\tdmg = 16 * (random_(53, 10) + random_(53, 10) + lvl + 2);\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t} else {\r\n\t\tdp = dPiece[missile[i]._miVar1][missile[i]._miVar2];\r\n\t\tif (dp || 1) {\r\n\t\t\ttx = missile[i]._miVar1 + XDirAdd[missile[i]._miVar3];\r\n\t\t\tty = missile[i]._miVar2 + YDirAdd[missile[i]._miVar3];\r\n\t\t\tif (!nMissileTable[dp] && !missile[i]._miVar8 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\tAddMissile(missile[i]._miVar1, missile[i]._miVar2, missile[i]._miVar1, missile[i]._miVar2, plr[src]._pdir, MIS_LIGHTWALL, TARGET_BOTH, src, dmg, missile[i]._mispllvl);\r\n\t\t\t\tmissile[i]._miVar1 = tx;\r\n\t\t\t\tmissile[i]._miVar2 = ty;\r\n\t\t\t} else {\r\n\t\t\t\tmissile[i]._miVar8 = 1;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmissile[i]._miVar8 = 1;\r\n\t\t}\r\n\t\tdp = dPiece[missile[i]._miVar5][missile[i]._miVar6];\r\n\t\tif (dp || 1) {\r\n\t\t\ttx = missile[i]._miVar5 + XDirAdd[missile[i]._miVar4];\r\n\t\t\tty = missile[i]._miVar6 + YDirAdd[missile[i]._miVar4];\r\n\t\t\tif (!nMissileTable[dp] && !missile[i]._miVar7 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\t\tAddMissile(missile[i]._miVar5, missile[i]._miVar6, missile[i]._miVar5, missile[i]._miVar6, plr[src]._pdir, MIS_LIGHTWALL, TARGET_BOTH, src, dmg, missile[i]._mispllvl);\r\n\t\t\t\tmissile[i]._miVar5 = tx;\r\n\t\t\t\tmissile[i]._miVar6 = ty;\r\n\t\t\t} else {\r\n\t\t\t\tmissile[i]._miVar7 = 1;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmissile[i]._miVar7 = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid mi_fire_nova(int i)\r\n{\r\n\tint k, id, sx, sy, dir, en, sx1, sy1, dam;\r\n\r\n\tsx1 = 0;\r\n\tsy1 = 0;\r\n\tid = missile[i]._misource;\r\n\tdam = missile[i]._midam;\r\n\tsx = missile[i]._mix;\r\n\tsy = missile[i]._miy;\r\n\tif (id != -1) {\r\n\t\tdir = plr[id]._pdir;\r\n\t\ten = TARGET_MONSTERS;\r\n\t} else {\r\n\t\tdir = 0;\r\n\t\ten = TARGET_PLAYERS;\r\n\t}\r\n\tfor (k = 0; k < 23; k++) {\r\n\t\tif (sx1 != vCrawlTable[k][6] || sy1 != vCrawlTable[k][7]) {\r\n\t\t\tAddMissile(sx, sy, sx + vCrawlTable[k][6], sy + vCrawlTable[k][7], dir, MIS_FIRENOVA, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tAddMissile(sx, sy, sx - vCrawlTable[k][6], sy - vCrawlTable[k][7], dir, MIS_FIRENOVA, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tAddMissile(sx, sy, sx - vCrawlTable[k][6], sy + vCrawlTable[k][7], dir, MIS_FIRENOVA, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tAddMissile(sx, sy, sx + vCrawlTable[k][6], sy - vCrawlTable[k][7], dir, MIS_FIRENOVA, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tsx1 = vCrawlTable[k][6];\r\n\t\t\tsy1 = vCrawlTable[k][7];\r\n\t\t}\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid mi_spec_arrow(int i)\r\n{\r\n\tint dir, src, dam, sx, sy, dx, dy, spllvl, mitype, micaster;\r\n\r\n\tsrc = missile[i]._misource;\r\n\tdam = missile[i]._midam;\r\n\tsx = missile[i]._mix;\r\n\tsy = missile[i]._miy;\r\n\tdx = missile[i]._miVar1;\r\n\tdy = missile[i]._miVar2;\r\n\tspllvl = missile[i]._miVar3;\r\n\tmitype = 0;\r\n\tif (src != -1) {\r\n\t\tdir = plr[src]._pdir;\r\n\t\tmicaster = TARGET_MONSTERS;\r\n\r\n\t\tswitch (plr[src]._pILMinDam) {\r\n\t\tcase 0:\r\n\t\t\tmitype = MIS_FIRENOVA;\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tmitype = MIS_LIGHTARROW;\r\n\t\t\tbreak;\r\n\t\tcase 2:\r\n\t\t\tmitype = MIS_CBOLTARROW;\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tmitype = MIS_HBOLTARROW;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t} else {\r\n\t\tdir = 0;\r\n\t\tmicaster = TARGET_PLAYERS;\r\n\t}\r\n\tAddMissile(sx, sy, dx, dy, dir, mitype, micaster, src, dam, spllvl);\r\n\tif (mitype == MIS_CBOLTARROW) {\r\n\t\tAddMissile(sx, sy, dx, dy, dir, mitype, micaster, src, dam, spllvl);\r\n\t\tAddMissile(sx, sy, dx, dy, dir, mitype, micaster, src, dam, spllvl);\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n\r\n#endif\r\nvoid MI_Lightctrl(int i)\r\n{\r\n\tint pn, dam, p, mx, my;\r\n\r\n\t/// ASSERT: assert((DWORD)i < MAXMISSILES);\r\n\tmissile[i]._mirange--;\r\n\r\n\tp = missile[i]._misource;\r\n\tif (p != -1) {\r\n\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\t\tdam = (random_(79, 2) + random_(79, plr[p]._pLevel) + 2) << 6;\r\n\t\t} else {\r\n\t\t\t// BUGFIX: damage of missile should be encoded in missile struct; monster can be dead before missile arrives.\r\n\t\t\tdam = 2 * (monster[p].mMinDamage + random_(80, monster[p].mMaxDamage - monster[p].mMinDamage + 1));\r\n\t\t}\r\n\t} else {\r\n\t\tdam = random_(81, currlevel) + 2 * currlevel;\r\n\t}\r\n\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\r\n\tmx = missile[i]._mix;\r\n\tmy = missile[i]._miy;\r\n\t/// ASSERT: assert((DWORD)mx < MAXDUNX);\r\n\t/// ASSERT: assert((DWORD)my < MAXDUNY);\r\n\tpn = dPiece[mx][my];\r\n\t/// ASSERT: assert((DWORD)pn <= MAXTILES);\r\n\r\n\tif (missile[i]._misource == -1) {\r\n\t\tif ((mx != missile[i]._misx || my != missile[i]._misy) && nMissileTable[pn]) {\r\n\t\t\tmissile[i]._mirange = 0;\r\n\t\t}\r\n\t} else if (nMissileTable[pn]) {\r\n\t\tmissile[i]._mirange = 0;\r\n\t}\r\n\tif (!nMissileTable[pn]) {\r\n\t\tif ((mx != missile[i]._miVar1 || my != missile[i]._miVar2) && mx > 0 && my > 0 && mx < MAXDUNX && my < MAXDUNY) {\r\n\t\t\tif (missile[i]._misource != -1) {\r\n\t\t\t\tif (missile[i]._micaster == TARGET_PLAYERS\r\n\t\t\t\t    && monster[missile[i]._misource].MType->mtype >= MT_STORM\r\n\t\t\t\t    && monster[missile[i]._misource].MType->mtype <= MT_MAEL) {\r\n\t\t\t\t\tAddMissile(\r\n\t\t\t\t\t    missile[i]._mix,\r\n\t\t\t\t\t    missile[i]._miy,\r\n\t\t\t\t\t    missile[i]._misx,\r\n\t\t\t\t\t    missile[i]._misy,\r\n\t\t\t\t\t    i,\r\n\t\t\t\t\t    MIS_LIGHTNING2,\r\n\t\t\t\t\t    missile[i]._micaster,\r\n\t\t\t\t\t    missile[i]._misource,\r\n\t\t\t\t\t    dam,\r\n\t\t\t\t\t    missile[i]._mispllvl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tAddMissile(\r\n\t\t\t\t\t    missile[i]._mix,\r\n\t\t\t\t\t    missile[i]._miy,\r\n\t\t\t\t\t    missile[i]._misx,\r\n\t\t\t\t\t    missile[i]._misy,\r\n\t\t\t\t\t    i,\r\n\t\t\t\t\t    MIS_LIGHTNING,\r\n\t\t\t\t\t    missile[i]._micaster,\r\n\t\t\t\t\t    missile[i]._misource,\r\n\t\t\t\t\t    dam,\r\n\t\t\t\t\t    missile[i]._mispllvl);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tAddMissile(\r\n\t\t\t\t    missile[i]._mix,\r\n\t\t\t\t    missile[i]._miy,\r\n\t\t\t\t    missile[i]._misx,\r\n\t\t\t\t    missile[i]._misy,\r\n\t\t\t\t    i,\r\n\t\t\t\t    MIS_LIGHTNING,\r\n\t\t\t\t    missile[i]._micaster,\r\n\t\t\t\t    missile[i]._misource,\r\n\t\t\t\t    dam,\r\n\t\t\t\t    missile[i]._mispllvl);\r\n\t\t\t}\r\n\t\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\t}\r\n\t}\r\n\tif (missile[i]._mirange == 0 || mx <= 0 || my <= 0 || mx >= MAXDUNX || my > MAXDUNY) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid MI_Lightning(int i)\r\n{\r\n\tint j;\r\n\r\n\tmissile[i]._mirange--;\r\n\tj = missile[i]._mirange;\r\n\tif (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy)\r\n\t\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tif (missile[i]._miHitFlag == TRUE)\r\n\t\tmissile[i]._mirange = j;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Town(int i)\r\n{\r\n\tint ExpLight[17] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15 };\r\n\tint p;\r\n\r\n\tif (missile[i]._mirange > 1)\r\n\t\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == missile[i]._miVar1)\r\n\t\tSetMissDir(i, 1);\r\n\tif (currlevel != 0 && missile[i]._mimfnum != 1 && missile[i]._mirange != 0) {\r\n\t\tif (missile[i]._miVar2 == 0)\r\n\t\t\tmissile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, 1);\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar2]);\r\n\t\tmissile[i]._miVar2++;\r\n\t}\r\n\r\n\tfor (p = 0; p < MAX_PLRS; p++) {\r\n\t\tif (plr[p].plractive && currlevel == plr[p].plrlevel && !plr[p]._pLvlChanging && plr[p]._pmode == PM_STAND && plr[p]._px == missile[i]._mix && plr[p]._py == missile[i]._miy) {\r\n\t\t\tClrPlrPath(p);\r\n\t\t\tif (p == myplr) {\r\n\t\t\t\tNetSendCmdParam1(TRUE, CMD_WARP, missile[i]._misource);\r\n\t\t\t\tplr[p]._pmode = PM_NEWLVL;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Flash(int i)\r\n{\r\n\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\tif (missile[i]._misource != -1)\r\n\t\t\tplr[missile[i]._misource]._pInvincible = TRUE;\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix - 1, missile[i]._miy, TRUE);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix, missile[i]._miy, TRUE);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix + 1, missile[i]._miy, TRUE);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix - 1, missile[i]._miy + 1, TRUE);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix, missile[i]._miy + 1, TRUE);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix + 1, missile[i]._miy + 1, TRUE);\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\tif (missile[i]._misource != -1)\r\n\t\t\t\tplr[missile[i]._misource]._pInvincible = FALSE;\r\n\t\t}\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Flash2(int i)\r\n{\r\n\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\tif (missile[i]._misource != -1)\r\n\t\t\tplr[missile[i]._misource]._pInvincible = TRUE;\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix - 1, missile[i]._miy - 1, TRUE);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix, missile[i]._miy - 1, TRUE);\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix + 1, missile[i]._miy - 1, TRUE);\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tif (missile[i]._micaster == TARGET_MONSTERS) {\r\n\t\t\tif (missile[i]._misource != -1)\r\n\t\t\t\tplr[missile[i]._misource]._pInvincible = FALSE;\r\n\t\t}\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Manashield(int i)\r\n{\r\n\tint id, diff;\r\n\r\n\tid = missile[i]._misource;\r\n\tmissile[i]._mix = plr[id]._px;\r\n\tmissile[i]._miy = plr[id]._py;\r\n\tmissile[i]._mitxoff = plr[id]._pxoff << 16;\r\n\tmissile[i]._mityoff = plr[id]._pyoff << 16;\r\n\tif (plr[id]._pmode == PM_WALK3) {\r\n\t\tmissile[i]._misx = plr[id]._pfutx;\r\n\t\tmissile[i]._misy = plr[id]._pfuty;\r\n\t} else {\r\n\t\tmissile[i]._misx = plr[id]._px;\r\n\t\tmissile[i]._misy = plr[id]._py;\r\n\t}\r\n\tGetMissilePos(i);\r\n\tif (plr[id]._pmode == PM_WALK3) {\r\n\t\tif (plr[id]._pdir == DIR_W)\r\n\t\t\tmissile[i]._mix++;\r\n\t\telse\r\n\t\t\tmissile[i]._miy++;\r\n\t}\r\n\tif (id != myplr) {\r\n\t\tif (currlevel != plr[id].plrlevel)\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t} else {\r\n\t\tif (plr[id]._pMana <= 0 || !plr[id].plractive)\r\n\t\t\tmissile[i]._mirange = 0;\r\n\t\tif (plr[id]._pHitPoints < missile[i]._miVar1) {\r\n\t\t\tdiff = missile[i]._miVar1 - plr[id]._pHitPoints;\r\n#ifdef HELLFIRE\r\n\t\t\tint div = 0;\r\n\t\t\tfor (int m = 0; m < missile[i]._mispllvl && m < 7; m++) {\r\n\t\t\t\tdiv += 3;\r\n\t\t\t}\r\n\t\t\tif (div > 0)\r\n\t\t\t\tdiff -= diff / div;\r\n#else\r\n\t\t\tif (missile[i]._mispllvl > 0) {\r\n\t\t\t\tdiff += diff / -3;\r\n\t\t\t}\r\n#endif\r\n\r\n\t\t\tif (diff < 0)\r\n\t\t\t\tdiff = 0;\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t\t\tdrawhpflag = TRUE;\r\n\r\n\t\t\tif (plr[id]._pMana >= diff) {\r\n\t\t\t\tplr[id]._pHitPoints = missile[i]._miVar1;\r\n\t\t\t\tplr[id]._pHPBase = missile[i]._miVar2;\r\n\t\t\t\tplr[id]._pMana -= diff;\r\n\t\t\t\tplr[id]._pManaBase -= diff;\r\n\t\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\t\tplr[id]._pHitPoints += plr[id]._pMana - diff;\r\n\t\t\t\tplr[id]._pHPBase += plr[id]._pMana - diff;\r\n#else\r\n\t\t\t\tplr[id]._pHitPoints = plr[id]._pMana + missile[i]._miVar1 - diff;\r\n\t\t\t\tplr[id]._pHPBase = plr[id]._pMana + missile[i]._miVar2 - diff;\r\n#endif\r\n\t\t\t\tplr[id]._pMana = 0;\r\n\t\t\t\tplr[id]._pManaBase = plr[id]._pMaxManaBase - plr[id]._pMaxMana;\r\n\t\t\t\tmissile[i]._mirange = 0;\r\n\t\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\t\tif (plr[id]._pHitPoints < 0)\r\n\t\t\t\t\tSetPlayerHitPoints(id, 0);\r\n\t\t\t\tif ((plr[id]._pHitPoints >> 6) == 0 && id == myplr) {\r\n\t\t\t\t\tSyncPlrKill(id, missile[i]._miVar8);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n#ifndef HELLFIRE\r\n\t\tif (id == myplr && plr[id]._pHitPoints == 0 && missile[i]._miVar1 == 0 && plr[id]._pmode != PM_DEATH) {\r\n\t\t\tmissile[i]._mirange = 0;\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tSyncPlrKill(id, -1);\r\n\t\t}\r\n#endif\r\n\t\tmissile[i]._miVar1 = plr[id]._pHitPoints;\r\n\t\tmissile[i]._miVar2 = plr[id]._pHPBase;\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tNetSendCmd(TRUE, CMD_ENDSHIELD);\r\n\t\t}\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Etherealize(int i)\r\n{\r\n\tint src;\r\n\r\n\tmissile[i]._mirange--;\r\n\tsrc = missile[i]._misource;\r\n\tmissile[i]._mix = plr[src]._px;\r\n\tmissile[i]._miy = plr[src]._py;\r\n\tmissile[i]._mitxoff = plr[src]._pxoff << 16;\r\n\tmissile[i]._mityoff = plr[src]._pyoff << 16;\r\n\tif (plr[src]._pmode == PM_WALK3) {\r\n\t\tmissile[i]._misx = plr[src]._pfutx;\r\n\t\tmissile[i]._misy = plr[src]._pfuty;\r\n\t} else {\r\n\t\tmissile[i]._misx = plr[src]._px;\r\n\t\tmissile[i]._misy = plr[src]._py;\r\n\t}\r\n\tGetMissilePos(i);\r\n\tif (plr[src]._pmode == PM_WALK3) {\r\n\t\tif (plr[src]._pdir == DIR_W)\r\n\t\t\tmissile[i]._mix++;\r\n\t\telse\r\n\t\t\tmissile[i]._miy++;\r\n\t}\r\n\tplr[src]._pSpellFlags |= 1;\r\n\tif (missile[i]._mirange == 0 || plr[src]._pHitPoints <= 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tplr[src]._pSpellFlags &= ~0x1;\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Firemove(int i)\r\n{\r\n\tint j;\r\n\tint ExpLight[14] = { 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 12 };\r\n\r\n\tmissile[i]._mix--;\r\n\tmissile[i]._miy--;\r\n\tmissile[i]._miyoff += 32;\r\n\tmissile[i]._miVar1++;\r\n\tif (missile[i]._miVar1 == missile[i]._miAnimLen) {\r\n\t\tSetMissDir(i, 1);\r\n\t\tmissile[i]._miAnimFrame = random_(82, 11) + 1;\r\n\t}\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\tj = missile[i]._mirange;\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tif (missile[i]._miHitFlag == TRUE)\r\n\t\tmissile[i]._mirange = j;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tif (missile[i]._mimfnum != 0 || missile[i]._mirange == 0) {\r\n\t\tif (missile[i]._mix != missile[i]._miVar3 || missile[i]._miy != missile[i]._miVar4) {\r\n\t\t\tmissile[i]._miVar3 = missile[i]._mix;\r\n\t\t\tmissile[i]._miVar4 = missile[i]._miy;\r\n\t\t\t// BUGFIX: Flame wave gets darker after reaching full height.\r\n\t\t\t// ChangeLightXY(missile[i]._mlid, missile[i]._miVar3, missile[i]._miVar4);\r\n\t\t\tChangeLight(missile[i]._mlid, missile[i]._miVar3, missile[i]._miVar4, 8);\r\n\t\t}\r\n\t} else {\r\n\t\tif (missile[i]._miVar2 == 0)\r\n\t\t\tmissile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, ExpLight[0]);\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar2]);\r\n\t\tmissile[i]._miVar2++;\r\n\t}\r\n\tmissile[i]._mix++;\r\n\tmissile[i]._miy++;\r\n\tmissile[i]._miyoff -= 32;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Guardian(int i)\r\n{\r\n\tint j, k, sx, sy, sx1, sy1, ex;\r\n\r\n\t/// ASSERT: assert((DWORD)i < MAXMISSILES);\r\n\r\n#ifndef HELLFIRE\r\n\tsx1 = 0;\r\n\tsy1 = 0;\r\n#endif\r\n\tmissile[i]._mirange--;\r\n\r\n\tif (missile[i]._miVar2 > 0) {\r\n\t\tmissile[i]._miVar2--;\r\n\t}\r\n\tif (missile[i]._mirange == missile[i]._miVar1 || missile[i]._mimfnum == MFILE_GUARD && missile[i]._miVar2 == 0) {\r\n\t\tSetMissDir(i, 1);\r\n\t}\r\n\r\n\tif (!(missile[i]._mirange % 16)) {\r\n\t\tex = 0;\r\n\t\tfor (j = 0; j < 23 && ex != -1; j++) {\r\n\t\t\tfor (k = 10; k >= 0 && ex != -1 && (vCrawlTable[j][k] != 0 || vCrawlTable[j][k + 1] != 0); k -= 2) {\r\n\t\t\t\tif (sx1 == vCrawlTable[j][k] && sy1 == vCrawlTable[j][k + 1]) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tsx = missile[i]._mix + vCrawlTable[j][k];\r\n\t\t\t\tsy = missile[i]._miy + vCrawlTable[j][k + 1];\r\n\t\t\t\tex = Sentfire(i, sx, sy);\r\n\t\t\t\tif (ex == -1) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tsx = missile[i]._mix - vCrawlTable[j][k];\r\n\t\t\t\tsy = missile[i]._miy - vCrawlTable[j][k + 1];\r\n\t\t\t\tex = Sentfire(i, sx, sy);\r\n\t\t\t\tif (ex == -1) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tsx = missile[i]._mix + vCrawlTable[j][k];\r\n\t\t\t\tsy = missile[i]._miy - vCrawlTable[j][k + 1];\r\n\t\t\t\tex = Sentfire(i, sx, sy);\r\n\t\t\t\tif (ex == -1) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tsx = missile[i]._mix - vCrawlTable[j][k];\r\n\t\t\t\tsy = missile[i]._miy + vCrawlTable[j][k + 1];\r\n\t\t\t\tex = Sentfire(i, sx, sy);\r\n\t\t\t\tif (ex == -1) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tsx1 = vCrawlTable[j][k];\r\n\t\t\t\tsy1 = vCrawlTable[j][k + 1];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (missile[i]._mirange == 14) {\r\n\t\tSetMissDir(i, 0);\r\n\t\tmissile[i]._miAnimFrame = 15;\r\n\t\tmissile[i]._miAnimAdd = -1;\r\n\t}\r\n\r\n\tmissile[i]._miVar3 += missile[i]._miAnimAdd;\r\n\r\n\tif (missile[i]._miVar3 > 15) {\r\n\t\tmissile[i]._miVar3 = 15;\r\n\t} else if (missile[i]._miVar3 > 0) {\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, missile[i]._miVar3);\r\n\t}\r\n\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Chain(int i)\r\n{\r\n\tint sx, sy, id, l, n, m, k, rad, tx, ty, dir;\r\n#ifndef HELLFIRE\r\n\tint CrawlNum[19] = { 0, 3, 12, 45, 94, 159, 240, 337, 450, 579, 724, 885, 1062, 1255, 1464, 1689, 1930, 2187, 2460 };\r\n#endif\r\n\r\n\tid = missile[i]._misource;\r\n\tsx = missile[i]._mix;\r\n\tsy = missile[i]._miy;\r\n\tdir = GetDirection(sx, sy, missile[i]._miVar1, missile[i]._miVar2);\r\n\tAddMissile(sx, sy, missile[i]._miVar1, missile[i]._miVar2, dir, MIS_LIGHTCTRL, TARGET_MONSTERS, id, 1, missile[i]._mispllvl);\r\n\trad = missile[i]._mispllvl + 3;\r\n\tif (rad > 19)\r\n\t\trad = 19;\r\n\tfor (m = 1; m < rad; m++) {\r\n\t\tk = CrawlNum[m];\r\n\t\tl = k + 2;\r\n#ifdef HELLFIRE\r\n\t\tfor (n = CrawlTable[k]; n > 0; n--) { // BUGFIX: should cast to BYTE or CrawlTable header will be wrong\r\n#else\r\n\t\tfor (n = (BYTE)CrawlTable[k]; n > 0; n--) {\r\n#endif\r\n\t\t\ttx = sx + CrawlTable[l - 1];\r\n\t\t\tty = sy + CrawlTable[l];\r\n\t\t\tif (tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY && dMonster[tx][ty] > 0) {\r\n\t\t\t\tdir = GetDirection(sx, sy, tx, ty);\r\n\t\t\t\tAddMissile(sx, sy, tx, ty, dir, MIS_LIGHTCTRL, TARGET_MONSTERS, id, 1, missile[i]._mispllvl);\r\n\t\t\t}\r\n\t\t\tl += 2;\r\n\t\t}\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid mi_null_11(int i)\r\n{\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tif (missile[i]._miAnimFrame == missile[i]._miAnimLen)\r\n\t\tmissile[i]._miPreFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Weapexp(int i)\r\n{\r\n\tint id, mind, maxd;\r\n\tint ExpLight[10] = { 9, 10, 11, 12, 11, 10, 8, 6, 4, 2 };\r\n\r\n\tmissile[i]._mirange--;\r\n\tid = missile[i]._misource;\r\n\tif (missile[i]._miVar2 == 1) {\r\n\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\tmind = plr[id]._pIFMinDam;\r\n\t\tmaxd = plr[id]._pIFMaxDam;\r\n\t\tmissiledata[missile[i]._mitype].mResist = MISR_FIRE;\r\n\t} else {\r\n\t\t// BUGFIX: damage of missile should be encoded in missile struct; player can be dead/have left the game before missile arrives.\r\n\t\tmind = plr[id]._pILMinDam;\r\n\t\tmaxd = plr[id]._pILMaxDam;\r\n\t\tmissiledata[missile[i]._mitype].mResist = MISR_LIGHTNING;\r\n\t}\r\n\tCheckMissileCol(i, mind, maxd, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tif (missile[i]._miVar1 == 0) {\r\n\t\tmissile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, 9);\r\n\t} else {\r\n\t\tif (missile[i]._mirange != 0)\r\n\t\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar1]);\r\n\t}\r\n\tmissile[i]._miVar1++;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t} else {\r\n\t\tPutMissile(i);\r\n\t}\r\n}\r\n\r\nvoid MI_Misexp(int i)\r\n{\r\n#ifdef HELLFIRE\r\n\tint ExpLight[] = { 9, 10, 11, 12, 11, 10, 8, 6, 4, 2, 1, 0, 0, 0, 0 };\r\n#else\r\n\tint ExpLight[10] = { 9, 10, 11, 12, 11, 10, 8, 6, 4, 2 };\r\n#endif\r\n\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t} else {\r\n\t\tif (missile[i]._miVar1 == 0)\r\n\t\t\tmissile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, 9);\r\n\t\telse\r\n\t\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar1]);\r\n\t\tmissile[i]._miVar1++;\r\n\t\tPutMissile(i);\r\n\t}\r\n}\r\n\r\nvoid MI_Acidsplat(int i)\r\n{\r\n\tint monst, dam;\r\n\r\n\tif (missile[i]._mirange == missile[i]._miAnimLen) {\r\n\t\tmissile[i]._mix++;\r\n\t\tmissile[i]._miy++;\r\n\t\tmissile[i]._miyoff -= 32;\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tmonst = missile[i]._misource;\r\n\t\tdam = (monster[monst].MData->mLevel >= 2 ? 2 : 1);\r\n\t\tAddMissile(missile[i]._mix, missile[i]._miy, i, 0, missile[i]._mimfnum, MIS_ACIDPUD, TARGET_PLAYERS, monst, dam, missile[i]._mispllvl);\r\n\t} else {\r\n\t\tPutMissile(i);\r\n\t}\r\n}\r\n\r\nvoid MI_Teleport(int i)\r\n{\r\n\tint id;\r\n\r\n\tid = missile[i]._misource;\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange <= 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t} else {\r\n\t\tdPlayer[plr[id]._px][plr[id]._py] = 0;\r\n\t\tPlrClrTrans(plr[id]._px, plr[id]._py);\r\n\t\tplr[id]._px = missile[i]._mix;\r\n\t\tplr[id]._py = missile[i]._miy;\r\n\t\tplr[id]._pfutx = plr[id]._px;\r\n\t\tplr[id]._pfuty = plr[id]._py;\r\n\t\tplr[id]._poldx = plr[id]._px;\r\n\t\tplr[id]._poldy = plr[id]._py;\r\n\t\tPlrDoTrans(plr[id]._px, plr[id]._py);\r\n\t\tmissile[i]._miVar1 = 1;\r\n\t\tdPlayer[plr[id]._px][plr[id]._py] = id + 1;\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tChangeLightXY(plr[id]._plid, plr[id]._px, plr[id]._py);\r\n\t\t\tChangeVisionXY(plr[id]._pvid, plr[id]._px, plr[id]._py);\r\n\t\t}\r\n\t\tif (id == myplr) {\r\n\t\t\tViewX = plr[id]._px - ScrollInfo._sdx;\r\n\t\t\tViewY = plr[id]._py - ScrollInfo._sdy;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid MI_Stone(int i)\r\n{\r\n\tint m;\r\n\r\n\tmissile[i]._mirange--;\r\n\tm = missile[i]._miVar2;\r\n\tif (monster[m]._mhitpoints == 0 && missile[i]._miAnimType != MFILE_SHATTER1) {\r\n#ifndef HELLFIRE\r\n\t\tmissile[i]._mimfnum = 0;\r\n\t\tmissile[i]._miDrawFlag = TRUE;\r\n#endif\r\n\t\tSetMissAnim(i, MFILE_SHATTER1);\r\n\t\tmissile[i]._mirange = 11;\r\n\t}\r\n\tif (monster[m]._mmode != MM_STONE) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tif (monster[m]._mhitpoints > 0)\r\n\t\t\tmonster[m]._mmode = missile[i]._miVar1;\r\n\t\telse\r\n\t\t\tAddDead(monster[m]._mx, monster[m]._my, stonendx, (direction)monster[m]._mdir);\r\n\t}\r\n\tif (missile[i]._miAnimType == MFILE_SHATTER1)\r\n\t\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Boom(int i)\r\n{\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._miVar1 == 0)\r\n\t\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, FALSE, missile[i]._mix, missile[i]._miy, TRUE);\r\n\tif (missile[i]._miHitFlag == TRUE)\r\n\t\tmissile[i]._miVar1 = 1;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Rhino(int i)\r\n{\r\n\tint mix, miy, mix2, miy2, omx, omy, monst;\r\n\r\n\tmonst = missile[i]._misource;\r\n\tif (monster[monst]._mmode != MM_CHARGE) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\treturn;\r\n\t}\r\n\tGetMissilePos(i);\r\n\tmix = missile[i]._mix;\r\n\tmiy = missile[i]._miy;\r\n\tdMonster[mix][miy] = 0;\r\n\tif (monster[monst]._mAi == AI_SNAKE) {\r\n\t\tmissile[i]._mitxoff += 2 * missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += 2 * missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t\tmix2 = missile[i]._mix;\r\n\t\tmiy2 = missile[i]._miy;\r\n\t\tmissile[i]._mitxoff -= missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff -= missile[i]._miyvel;\r\n\t} else {\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t}\r\n\tGetMissilePos(i);\r\n\tomx = missile[i]._mix;\r\n\tomy = missile[i]._miy;\r\n\tif (!PosOkMonst(monst, missile[i]._mix, missile[i]._miy) || (monster[monst]._mAi == AI_SNAKE && !PosOkMonst(monst, mix2, miy2))) {\r\n\t\tMissToMonst(i, mix, miy);\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\treturn;\r\n\t}\r\n\tmonster[monst]._mfutx = omx;\r\n\tmonster[monst]._moldx = omx;\r\n\tdMonster[omx][omy] = -1 - monst;\r\n\tmonster[monst]._mx = omx;\r\n\tmonster[monst]._mfuty = omy;\r\n\tmonster[monst]._moldy = omy;\r\n\tmonster[monst]._my = omy;\r\n\tif (monster[monst]._uniqtype != 0)\r\n\t\tChangeLightXY(missile[i]._mlid, omx, omy);\r\n\tMoveMissilePos(i);\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid mi_null_32(int i)\r\n{\r\n\tint src, enemy, ax, ay, bx, by, cx, cy, j;\r\n\r\n\tGetMissilePos(i);\r\n\tax = missile[i]._mix;\r\n\tay = missile[i]._miy;\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\tsrc = missile[i]._misource;\r\n\tbx = missile[i]._mix;\r\n\tby = missile[i]._miy;\r\n\tenemy = monster[src]._menemy;\r\n\tif (!(monster[src]._mFlags & MFLAG_TARGETS_MONSTER)) {\r\n\t\tcx = plr[enemy]._px;\r\n\t\tcy = plr[enemy]._py;\r\n\t} else {\r\n\t\tcx = monster[enemy]._mx;\r\n\t\tcy = monster[enemy]._my;\r\n\t}\r\n\tif ((bx != ax || by != ay) && (missile[i]._miVar1 & 1 && (abs(ax - cx) >= 4 || abs(ay - cy) >= 4) || missile[i]._miVar2 > 1) && PosOkMonst(missile[i]._misource, ax, ay)) {\r\n\t\tMissToMonst(i, ax, ay);\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t} else if (!(monster[src]._mFlags & MFLAG_TARGETS_MONSTER)) {\r\n\t\tj = dPlayer[bx][by];\r\n\t} else {\r\n\t\tj = dMonster[bx][by];\r\n\t}\r\n\tif (!PosOkMissile(bx, by) || j > 0 && !(missile[i]._miVar1 & 1)) {\r\n\t\tmissile[i]._mixvel *= -1;\r\n\t\tmissile[i]._miyvel *= -1;\r\n\t\tmissile[i]._mimfnum = opposite[missile[i]._mimfnum];\r\n\t\tmissile[i]._miAnimData = monster[src].MType->Anims[MA_WALK].Data[missile[i]._mimfnum];\r\n\t\tmissile[i]._miVar2++;\r\n\t\tif (j > 0)\r\n\t\t\tmissile[i]._miVar1 |= 1;\r\n\t}\r\n\tMoveMissilePos(i);\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_FirewallC(int i)\r\n{\r\n\tint tx, ty, id, dp, micaster;\r\n\r\n\tmissile[i]._mirange--;\r\n\tid = missile[i]._misource;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t} else {\r\n#ifdef HELLFIRE\r\n\t\tmicaster = TARGET_BOTH;\r\n#else\r\n\t\tmicaster = TARGET_MONSTERS;\r\n#endif\r\n\t\tdp = dPiece[missile[i]._miVar1][missile[i]._miVar2];\r\n\t\tassert(dp <= MAXTILES && dp >= 0);\r\n\t\ttx = missile[i]._miVar1 + XDirAdd[missile[i]._miVar3];\r\n\t\tty = missile[i]._miVar2 + YDirAdd[missile[i]._miVar3];\r\n\t\tif (!nMissileTable[dp] && missile[i]._miVar8 == 0 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\tAddMissile(missile[i]._miVar1, missile[i]._miVar2, missile[i]._miVar1, missile[i]._miVar2, plr[id]._pdir, MIS_FIREWALL, micaster, id, 0, missile[i]._mispllvl);\r\n\t\t\tmissile[i]._miVar1 = tx;\r\n\t\t\tmissile[i]._miVar2 = ty;\r\n\t\t} else {\r\n\t\t\tmissile[i]._miVar8 = 1;\r\n\t\t}\r\n\t\tdp = dPiece[missile[i]._miVar5][missile[i]._miVar6];\r\n\t\tassert(dp <= MAXTILES && dp >= 0);\r\n\t\ttx = missile[i]._miVar5 + XDirAdd[missile[i]._miVar4];\r\n\t\tty = missile[i]._miVar6 + YDirAdd[missile[i]._miVar4];\r\n\t\tif (!nMissileTable[dp] && missile[i]._miVar7 == 0 && tx > 0 && tx < MAXDUNX && ty > 0 && ty < MAXDUNY) {\r\n\t\t\tAddMissile(missile[i]._miVar5, missile[i]._miVar6, missile[i]._miVar5, missile[i]._miVar6, plr[id]._pdir, MIS_FIREWALL, micaster, id, 0, missile[i]._mispllvl);\r\n\t\t\tmissile[i]._miVar5 = tx;\r\n\t\t\tmissile[i]._miVar6 = ty;\r\n\t\t} else {\r\n\t\t\tmissile[i]._miVar7 = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid MI_Infra(int i)\r\n{\r\n\tmissile[i]._mirange--;\r\n\tplr[missile[i]._misource]._pInfraFlag = TRUE;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tCalcPlrItemVals(missile[i]._misource, TRUE);\r\n\t}\r\n}\r\n\r\nvoid MI_Apoca(int i)\r\n{\r\n\tint j, k, id;\r\n\tBOOL exit;\r\n\r\n\tid = missile[i]._misource;\r\n\texit = FALSE;\r\n\tfor (j = missile[i]._miVar2; j < missile[i]._miVar3 && !exit; j++) {\r\n\t\tfor (k = missile[i]._miVar4; k < missile[i]._miVar5 && !exit; k++) {\r\n\t\t\t// BUGFIX: was `dMonster[k][j] > MAX_PLRS-1`, should be `dMonster[k][j]-1 >= MAX_PLRS`.\r\n\t\t\tif (dMonster[k][j] > MAX_PLRS - 1 && !nSolidTable[dPiece[k][j]]) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (LineClear(missile[i]._mix, missile[i]._miy, k, j)) {\r\n\t\t\t\t\tAddMissile(k, j, k, j, plr[id]._pdir, MIS_BOOM, TARGET_MONSTERS, id, missile[i]._midam, 0);\r\n\t\t\t\t\texit = TRUE;\r\n\t\t\t\t}\r\n#else\r\n\t\t\t\tAddMissile(k, j, k, j, plr[id]._pdir, MIS_BOOM, TARGET_MONSTERS, id, missile[i]._midam, 0);\r\n\t\t\t\texit = TRUE;\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!exit) {\r\n\t\t\tmissile[i]._miVar4 = missile[i]._miVar6;\r\n\t\t}\r\n\t}\r\n\r\n\tif (exit == TRUE) {\r\n\t\tmissile[i]._miVar2 = j - 1;\r\n\t\tmissile[i]._miVar4 = k;\r\n\t} else {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid MI_Wave(int i)\r\n{\r\n\tint sx, sy, sd, nxa, nxb, nya, nyb, dira, dirb;\r\n\tint j, id, pn;\r\n\tBOOL f1, f2;\r\n\tint v1, v2;\r\n\r\n\tf1 = FALSE;\r\n\tf2 = FALSE;\r\n\t/// ASSERT: assert((DWORD)i < MAXMISSILES);\r\n\r\n\tid = missile[i]._misource;\r\n\tsx = missile[i]._mix;\r\n\tsy = missile[i]._miy;\r\n\tv1 = missile[i]._miVar1;\r\n\tv2 = missile[i]._miVar2;\r\n\tsd = GetDirection(sx, sy, v1, v2);\r\n\tdira = (sd - 2) & 7;\r\n\tdirb = (sd + 2) & 7;\r\n\tnxa = sx + XDirAdd[sd];\r\n\tnya = sy + YDirAdd[sd];\r\n\tpn = dPiece[nxa][nya];\r\n\t/// ASSERT: assert((DWORD)pn <= MAXTILES);\r\n\tif (!nMissileTable[pn]) {\r\n\t\tAddMissile(nxa, nya, nxa + XDirAdd[sd], nya + YDirAdd[sd], plr[id]._pdir, MIS_FIREMOVE, TARGET_MONSTERS, id, 0, missile[i]._mispllvl);\r\n\t\tnxa += XDirAdd[dira];\r\n\t\tnya += YDirAdd[dira];\r\n\t\tnxb = sx + XDirAdd[sd] + XDirAdd[dirb];\r\n\t\tnyb = sy + YDirAdd[sd] + YDirAdd[dirb];\r\n\t\tfor (j = 0; j < (missile[i]._mispllvl >> 1) + 2; j++) {\r\n\t\t\tpn = dPiece[nxa][nya]; // BUGFIX: dPiece is accessed before check against dungeon size and 0\r\n\t\t\t                       /// ASSERT: assert((DWORD)pn <= MAXTILES);\r\n\t\t\tif (nMissileTable[pn] || f1 || nxa <= 0 || nxa >= MAXDUNX || nya <= 0 || nya >= MAXDUNY) {\r\n\t\t\t\tf1 = TRUE;\r\n\t\t\t} else {\r\n\t\t\t\tAddMissile(nxa, nya, nxa + XDirAdd[sd], nya + YDirAdd[sd], plr[id]._pdir, MIS_FIREMOVE, TARGET_MONSTERS, id, 0, missile[i]._mispllvl);\r\n\t\t\t\tnxa += XDirAdd[dira];\r\n\t\t\t\tnya += YDirAdd[dira];\r\n\t\t\t}\r\n\t\t\tpn = dPiece[nxb][nyb]; // BUGFIX: dPiece is accessed before check against dungeon size and 0\r\n\t\t\t                       /// ASSERT: assert((DWORD)pn <= MAXTILES);\r\n\t\t\tif (nMissileTable[pn] || f2 || nxb <= 0 || nxb >= MAXDUNX || nyb <= 0 || nyb >= MAXDUNY) {\r\n\t\t\t\tf2 = TRUE;\r\n\t\t\t} else {\r\n\t\t\t\tAddMissile(nxb, nyb, nxb + XDirAdd[sd], nyb + YDirAdd[sd], plr[id]._pdir, MIS_FIREMOVE, TARGET_MONSTERS, id, 0, missile[i]._mispllvl);\r\n\t\t\t\tnxb += XDirAdd[dirb];\r\n\t\t\t\tnyb += YDirAdd[dirb];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid MI_Nova(int i)\r\n{\r\n\tint k, id, sx, sy, dir, en, sx1, sy1, dam;\r\n\r\n\tsx1 = 0;\r\n\tsy1 = 0;\r\n\tid = missile[i]._misource;\r\n\tdam = missile[i]._midam;\r\n\tsx = missile[i]._mix;\r\n\tsy = missile[i]._miy;\r\n\tif (id != -1) {\r\n\t\tdir = plr[id]._pdir;\r\n\t\ten = TARGET_MONSTERS;\r\n\t} else {\r\n\t\tdir = 0;\r\n\t\ten = TARGET_PLAYERS;\r\n\t}\r\n\tfor (k = 0; k < 23; k++) {\r\n\t\tif (sx1 != vCrawlTable[k][6] || sy1 != vCrawlTable[k][7]) {\r\n\t\t\tAddMissile(sx, sy, sx + vCrawlTable[k][6], sy + vCrawlTable[k][7], dir, MIS_LIGHTBALL, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tAddMissile(sx, sy, sx - vCrawlTable[k][6], sy - vCrawlTable[k][7], dir, MIS_LIGHTBALL, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tAddMissile(sx, sy, sx - vCrawlTable[k][6], sy + vCrawlTable[k][7], dir, MIS_LIGHTBALL, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tAddMissile(sx, sy, sx + vCrawlTable[k][6], sy - vCrawlTable[k][7], dir, MIS_LIGHTBALL, en, id, dam, missile[i]._mispllvl);\r\n\t\t\tsx1 = vCrawlTable[k][6];\r\n\t\t\tsy1 = vCrawlTable[k][7];\r\n\t\t}\r\n\t}\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid MI_Blodboil(int i)\r\n{\r\n\tint lvl, id, hpdif;\r\n\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tid = missile[i]._miVar1;\r\n\t\tif ((plr[id]._pSpellFlags & 2) == 2) {\r\n\t\t\tint blodboilSFX[NUM_CLASSES] = {\r\n\t\t\t\tPS_WARR72,\r\n#ifndef SPAWN\r\n\t\t\t\tPS_ROGUE72,\r\n\t\t\t\tPS_MAGE72,\r\n\t\t\t\tPS_MAGE72,\r\n\t\t\t\tPS_ROGUE72,\r\n#else\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n#endif\r\n\t\t\t\tPS_WARR72\r\n\t\t\t};\r\n\t\t\tplr[id]._pSpellFlags &= ~0x2;\r\n\t\t\tplr[id]._pSpellFlags |= 4;\r\n\t\t\tif (2 * (id > 0)) // BUGFIX, wrong order of operation, this should be `2 * lvl` after the else.\r\n\t\t\t\tlvl = plr[id]._pLevel;\r\n\t\t\telse\r\n\t\t\t\tlvl = 1;\r\n\t\t\tmissile[i]._mirange = lvl + 10 * missile[i]._mispllvl + 245;\r\n\t\t\thpdif = plr[id]._pMaxHP - plr[id]._pHitPoints;\r\n\t\t\tCalcPlrItemVals(id, TRUE);\r\n\t\t\tplr[id]._pHitPoints -= hpdif;\r\n\t\t\tif (plr[id]._pHitPoints < 64)\r\n\t\t\t\tplr[id]._pHitPoints = 64;\r\n\t\t\tforce_redraw = 255;\r\n\t\t\tPlaySfxLoc(blodboilSFX[plr[id]._pClass], plr[id]._px, plr[id]._py);\r\n\t\t} else {\r\n\t\t\tint blodboilSFX[NUM_CLASSES] = {\r\n\t\t\t\tPS_WARR72,\r\n#ifndef SPAWN\r\n\t\t\t\tPS_ROGUE72,\r\n\t\t\t\tPS_MAGE72,\r\n\t\t\t\tPS_MAGE72,\r\n\t\t\t\tPS_ROGUE72,\r\n#else\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n#endif\r\n\t\t\t\tPS_WARR72\r\n\t\t\t};\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tplr[id]._pSpellFlags &= ~0x4;\r\n\t\t\thpdif = plr[id]._pMaxHP - plr[id]._pHitPoints;\r\n\t\t\tCalcPlrItemVals(id, TRUE);\r\n\t\t\tplr[id]._pHitPoints -= hpdif + missile[i]._miVar2;\r\n\t\t\tif (plr[id]._pHitPoints < 64)\r\n\t\t\t\tplr[id]._pHitPoints = 64;\r\n\t\t\tforce_redraw = 255;\r\n\t\t\tPlaySfxLoc(blodboilSFX[plr[id]._pClass], plr[id]._px, plr[id]._py);\r\n\t\t}\r\n\t}\r\n}\r\n#else\r\nvoid MI_Blodboil(int i)\r\n{\r\n\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n#endif\r\n\r\nvoid MI_Flame(int i)\r\n{\r\n\tint k;\r\n\r\n\tmissile[i]._mirange--;\r\n\tmissile[i]._miVar2--;\r\n\tk = missile[i]._mirange;\r\n\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, TRUE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\tif (missile[i]._mirange == 0 && missile[i]._miHitFlag == TRUE)\r\n\t\tmissile[i]._mirange = k;\r\n\tif (missile[i]._miVar2 == 0)\r\n\t\tmissile[i]._miAnimFrame = 20;\r\n\tif (missile[i]._miVar2 <= 0) {\r\n\t\tk = missile[i]._miAnimFrame;\r\n\t\tif (k > 11)\r\n\t\t\tk = 24 - k;\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, k);\r\n\t}\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tif (missile[i]._miVar2 <= 0)\r\n\t\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Flamec(int i)\r\n{\r\n\tint id, src;\r\n\r\n\tmissile[i]._mirange--;\r\n\tsrc = missile[i]._misource;\r\n\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\tGetMissilePos(i);\r\n\tif (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) {\r\n\t\tid = dPiece[missile[i]._mix][missile[i]._miy];\r\n\t\tif (!nMissileTable[id]) {\r\n\t\t\tAddMissile(\r\n\t\t\t    missile[i]._mix,\r\n\t\t\t    missile[i]._miy,\r\n\t\t\t    missile[i]._misx,\r\n\t\t\t    missile[i]._misy,\r\n\t\t\t    i,\r\n\t\t\t    MIS_FLAME,\r\n\t\t\t    missile[i]._micaster,\r\n\t\t\t    src,\r\n\t\t\t    missile[i]._miVar3,\r\n\t\t\t    missile[i]._mispllvl);\r\n\t\t} else {\r\n\t\t\tmissile[i]._mirange = 0;\r\n\t\t}\r\n\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\tmissile[i]._miVar3++;\r\n\t}\r\n\tif (missile[i]._mirange == 0 || missile[i]._miVar3 == 3)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n}\r\n\r\nvoid MI_Cbolt(int i)\r\n{\r\n\tint md;\r\n\tint bpath[16] = { -1, 0, 1, -1, 0, 1, -1, -1, 0, 0, 1, 1, 0, 1, -1, 0 };\r\n\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._miAnimType != MFILE_LGHNING) {\r\n\t\tif (missile[i]._miVar3 == 0) {\r\n\t\t\tmd = (missile[i]._miVar2 + bpath[missile[i]._mirnd]) & 7;\r\n\t\t\tmissile[i]._mirnd = (missile[i]._mirnd + 1) & 0xF;\r\n\t\t\tGetMissileVel(i, missile[i]._mix, missile[i]._miy, missile[i]._mix + XDirAdd[md], missile[i]._miy + YDirAdd[md], 8);\r\n\t\t\tmissile[i]._miVar3 = 16;\r\n\t\t} else {\r\n\t\t\tmissile[i]._miVar3--;\r\n\t\t}\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t\tCheckMissileCol(i, missile[i]._midam, missile[i]._midam, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\t\tif (missile[i]._miHitFlag == TRUE) {\r\n\t\t\tmissile[i]._miVar1 = 8;\r\n\t\t\tmissile[i]._mimfnum = 0;\r\n\t\t\tmissile[i]._mixoff = 0;\r\n\t\t\tmissile[i]._miyoff = 0;\r\n\t\t\tSetMissAnim(i, MFILE_LGHNING);\r\n\t\t\tmissile[i]._mirange = missile[i]._miAnimLen;\r\n\t\t\tGetMissilePos(i);\r\n\t\t}\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, missile[i]._miVar1);\r\n\t}\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Hbolt(int i)\r\n{\r\n\tint dam;\r\n\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._miAnimType != MFILE_HOLYEXPL) {\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t\tdam = missile[i]._midam;\r\n\t\tif (missile[i]._mix != missile[i]._misx || missile[i]._miy != missile[i]._misy) {\r\n\t\t\tCheckMissileCol(i, dam, dam, FALSE, missile[i]._mix, missile[i]._miy, FALSE);\r\n\t\t}\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._mitxoff -= missile[i]._mixvel;\r\n\t\t\tmissile[i]._mityoff -= missile[i]._miyvel;\r\n\t\t\tGetMissilePos(i);\r\n\t\t\tmissile[i]._mimfnum = 0;\r\n\t\t\tSetMissAnim(i, MFILE_HOLYEXPL);\r\n\t\t\tmissile[i]._mirange = missile[i]._miAnimLen - 1;\r\n\t\t} else {\r\n\t\t\tif (missile[i]._mix != missile[i]._miVar1 || missile[i]._miy != missile[i]._miVar2) {\r\n\t\t\t\tmissile[i]._miVar1 = missile[i]._mix;\r\n\t\t\t\tmissile[i]._miVar2 = missile[i]._miy;\r\n\t\t\t\tChangeLight(missile[i]._mlid, missile[i]._miVar1, missile[i]._miVar2, 8);\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, missile[i]._miAnimFrame + 7);\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tAddUnLight(missile[i]._mlid);\r\n\t\t}\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Element(int i)\r\n{\r\n\tint mid, sd, dam, cx, cy, px, py, id;\r\n\r\n\tmissile[i]._mirange--;\r\n\tdam = missile[i]._midam;\r\n\tid = missile[i]._misource;\r\n\tif (missile[i]._miAnimType == MFILE_BIGEXP) {\r\n\t\tcx = missile[i]._mix;\r\n\t\tcy = missile[i]._miy;\r\n\t\tpx = plr[id]._px;\r\n\t\tpy = plr[id]._py;\r\n\t\tChangeLight(missile[i]._mlid, cx, cy, missile[i]._miAnimFrame);\r\n\t\tif (!CheckBlock(px, py, cx, cy))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx, cy, TRUE);\r\n\t\tif (!CheckBlock(px, py, cx, cy + 1))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx, cy + 1, TRUE);\r\n\t\tif (!CheckBlock(px, py, cx, cy - 1))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx, cy - 1, TRUE);\r\n\t\tif (!CheckBlock(px, py, cx + 1, cy))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx + 1, cy, TRUE); /* check x/y */\r\n\t\tif (!CheckBlock(px, py, cx + 1, cy - 1))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx + 1, cy - 1, TRUE);\r\n\t\tif (!CheckBlock(px, py, cx + 1, cy + 1))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx + 1, cy + 1, TRUE);\r\n\t\tif (!CheckBlock(px, py, cx - 1, cy))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx - 1, cy, TRUE);\r\n\t\tif (!CheckBlock(px, py, cx - 1, cy + 1))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx - 1, cy + 1, TRUE);\r\n\t\tif (!CheckBlock(px, py, cx - 1, cy - 1))\r\n\t\t\tCheckMissileCol(i, dam, dam, TRUE, cx - 1, cy - 1, TRUE);\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tAddUnLight(missile[i]._mlid);\r\n\t\t}\r\n\t} else {\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t\tcx = missile[i]._mix;\r\n\t\tcy = missile[i]._miy;\r\n\t\tCheckMissileCol(i, dam, dam, FALSE, cx, cy, FALSE);\r\n\t\tif (missile[i]._miVar3 == 0 && cx == missile[i]._miVar4 && cy == missile[i]._miVar5)\r\n\t\t\tmissile[i]._miVar3 = 1;\r\n\t\tif (missile[i]._miVar3 == 1) {\r\n\t\t\tmissile[i]._miVar3 = 2;\r\n\t\t\tmissile[i]._mirange = 255;\r\n\t\t\t// BUGFIX: should be `mid >= 0`, was `mid > 0`; FindClosest returns -1 if no monster is found.\r\n\t\t\tmid = FindClosest(cx, cy, 19);\r\n\t\t\tif (mid > 0) {\r\n\t\t\t\tsd = GetDirection8(cx, cy, monster[mid]._mx, monster[mid]._my);\r\n\t\t\t\tSetMissDir(i, sd);\r\n\t\t\t\tGetMissileVel(i, cx, cy, monster[mid]._mx, monster[mid]._my, 16);\r\n\t\t\t} else {\r\n\t\t\t\tsd = plr[id]._pdir;\r\n\t\t\t\tSetMissDir(i, sd);\r\n\t\t\t\tGetMissileVel(i, cx, cy, cx + XDirAdd[sd], cy + YDirAdd[sd], 16);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (cx != missile[i]._miVar1 || cy != missile[i]._miVar2) {\r\n\t\t\tmissile[i]._miVar1 = cx;\r\n\t\t\tmissile[i]._miVar2 = cy;\r\n\t\t\tChangeLight(missile[i]._mlid, cx, cy, 8);\r\n\t\t}\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._mimfnum = 0;\r\n\t\t\tSetMissAnim(i, MFILE_BIGEXP);\r\n\t\t\tmissile[i]._mirange = missile[i]._miAnimLen - 1;\r\n\t\t}\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Bonespirit(int i)\r\n{\r\n\tint id, mid, sd, dam;\r\n\tint cx, cy;\r\n\r\n\tmissile[i]._mirange--;\r\n\tdam = missile[i]._midam;\r\n\tid = missile[i]._misource;\r\n\tif (missile[i]._mimfnum == 8) {\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, missile[i]._miAnimFrame);\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\t\tAddUnLight(missile[i]._mlid);\r\n\t\t}\r\n\t\tPutMissile(i);\r\n\t} else {\r\n\t\tmissile[i]._mitxoff += missile[i]._mixvel;\r\n\t\tmissile[i]._mityoff += missile[i]._miyvel;\r\n\t\tGetMissilePos(i);\r\n\t\tcx = missile[i]._mix;\r\n\t\tcy = missile[i]._miy;\r\n\t\tCheckMissileCol(i, dam, dam, FALSE, cx, cy, FALSE);\r\n\t\tif (missile[i]._miVar3 == 0 && cx == missile[i]._miVar4 && cy == missile[i]._miVar5)\r\n\t\t\tmissile[i]._miVar3 = 1;\r\n\t\tif (missile[i]._miVar3 == 1) {\r\n\t\t\tmissile[i]._miVar3 = 2;\r\n\t\t\tmissile[i]._mirange = 255;\r\n\t\t\t// BUGFIX: should be `mid >= 0`, was `mid > 0`; FindClosest returns -1 if no monster is found.\r\n\t\t\tmid = FindClosest(cx, cy, 19);\r\n\t\t\tif (mid > 0) {\r\n\t\t\t\tmissile[i]._midam = monster[mid]._mhitpoints >> 7;\r\n\t\t\t\tSetMissDir(i, GetDirection8(cx, cy, monster[mid]._mx, monster[mid]._my));\r\n\t\t\t\tGetMissileVel(i, cx, cy, monster[mid]._mx, monster[mid]._my, 16);\r\n\t\t\t} else {\r\n\t\t\t\tsd = plr[id]._pdir;\r\n\t\t\t\tSetMissDir(i, sd);\r\n\t\t\t\tGetMissileVel(i, cx, cy, cx + XDirAdd[sd], cy + YDirAdd[sd], 16);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (cx != missile[i]._miVar1 || cy != missile[i]._miVar2) {\r\n\t\t\tmissile[i]._miVar1 = cx;\r\n\t\t\tmissile[i]._miVar2 = cy;\r\n\t\t\tChangeLight(missile[i]._mlid, cx, cy, 8);\r\n\t\t}\r\n\t\tif (missile[i]._mirange == 0) {\r\n\t\t\tSetMissDir(i, 8);\r\n\t\t\tmissile[i]._mirange = 7;\r\n\t\t}\r\n\t\tPutMissile(i);\r\n\t}\r\n}\r\n\r\nvoid MI_ResurrectBeam(int i)\r\n{\r\n\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == 0)\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid MI_Rportal(int i)\r\n{\r\n\tint ExpLight[17] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15 };\r\n\r\n\tif (missile[i]._mirange > 1)\r\n\t\tmissile[i]._mirange--;\r\n\tif (missile[i]._mirange == missile[i]._miVar1)\r\n\t\tSetMissDir(i, 1);\r\n\r\n\tif (currlevel != 0 && missile[i]._mimfnum != 1 && missile[i]._mirange != 0) {\r\n\t\tif (missile[i]._miVar2 == 0)\r\n\t\t\tmissile[i]._mlid = AddLight(missile[i]._mix, missile[i]._miy, 1);\r\n\t\tChangeLight(missile[i]._mlid, missile[i]._mix, missile[i]._miy, ExpLight[missile[i]._miVar2]);\r\n\t\tmissile[i]._miVar2++;\r\n\t}\r\n\tif (missile[i]._mirange == 0) {\r\n\t\tmissile[i]._miDelFlag = TRUE;\r\n\t\tAddUnLight(missile[i]._mlid);\r\n\t}\r\n\tPutMissile(i);\r\n}\r\n\r\nvoid ProcessMissiles()\r\n{\r\n\tint i, mi;\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tdFlags[missile[missileactive[i]]._mix][missile[missileactive[i]]._miy] &= ~BFLAG_MISSILE;\r\n\t\tdMissile[missile[missileactive[i]]._mix][missile[missileactive[i]]._miy] = 0;\r\n#ifdef HELLFIRE\r\n\t\tif (missile[missileactive[i]]._mix < 0 || missile[missileactive[i]]._mix >= MAXDUNX - 1 || missile[missileactive[i]]._miy < 0 || missile[missileactive[i]]._miy >= MAXDUNY - 1)\r\n\t\t\tmissile[missileactive[i]]._miDelFlag = TRUE;\r\n#endif\r\n\t}\r\n\r\n\ti = 0;\r\n\twhile (i < nummissiles) {\r\n\t\tif (missile[missileactive[i]]._miDelFlag) {\r\n\t\t\tDeleteMissile(missileactive[i], i);\r\n\t\t\ti = 0;\r\n\t\t} else {\r\n\t\t\ti++;\r\n\t\t}\r\n\t}\r\n\r\n\tMissilePreFlag = FALSE;\r\n\tManashieldFlag = FALSE;\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmi = missileactive[i];\r\n\t\tmissiledata[missile[mi]._mitype].mProc(missileactive[i]);\r\n\t\tif (!(missile[mi]._miAnimFlags & MFLAG_LOCK_ANIMATION)) {\r\n\t\t\tmissile[mi]._miAnimCnt++;\r\n\t\t\tif (missile[mi]._miAnimCnt >= missile[mi]._miAnimDelay) {\r\n\t\t\t\tmissile[mi]._miAnimCnt = 0;\r\n\t\t\t\tmissile[mi]._miAnimFrame += missile[mi]._miAnimAdd;\r\n\t\t\t\tif (missile[mi]._miAnimFrame > missile[mi]._miAnimLen)\r\n\t\t\t\t\tmissile[mi]._miAnimFrame = 1;\r\n\t\t\t\tif (missile[mi]._miAnimFrame < 1)\r\n\t\t\t\t\tmissile[mi]._miAnimFrame = missile[mi]._miAnimLen;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (ManashieldFlag) {\r\n\t\tfor (i = 0; i < nummissiles; i++) {\r\n\t\t\tif (missile[missileactive[i]]._mitype == MIS_MANASHIELD) {\r\n\t\t\t\tMI_Manashield(missileactive[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\ti = 0;\r\n\twhile (i < nummissiles) {\r\n#ifdef HELLFIRE\r\n\t\tif (missile[missileactive[i]]._miDelFlag == TRUE) {\r\n#else\r\n\t\tif (missile[missileactive[i]]._miDelFlag) {\r\n#endif\r\n\t\t\tDeleteMissile(missileactive[i], i);\r\n\t\t\ti = 0;\r\n\t\t} else {\r\n\t\t\ti++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid missiles_process_charge()\r\n{\r\n\tCMonster *mon;\r\n\tAnimStruct *anim;\r\n\tMissileStruct *mis;\r\n\tint i, mi;\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmi = missileactive[i];\r\n\t\tmis = &missile[mi];\r\n\t\tmis->_miAnimData = misfiledata[mis->_miAnimType].mAnimData[mis->_mimfnum];\r\n\t\tif (mis->_mitype == MIS_RHINO) {\r\n\t\t\tmon = monster[mis->_misource].MType;\r\n\t\t\tif (mon->mtype >= MT_HORNED && mon->mtype <= MT_OBLORD) {\r\n\t\t\t\tanim = &mon->Anims[MA_SPECIAL];\r\n\t\t\t} else {\r\n\t\t\t\tif (mon->mtype >= MT_NSNAKE && mon->mtype <= MT_GSNAKE)\r\n\t\t\t\t\tanim = &mon->Anims[MA_ATTACK];\r\n\t\t\t\telse\r\n\t\t\t\t\tanim = &mon->Anims[MA_WALK];\r\n\t\t\t}\r\n\t\t\tmissile[mi]._miAnimData = anim->Data[mis->_mimfnum];\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ClearMissileSpot(int mi)\r\n{\r\n\tdFlags[missile[mi]._mix][missile[mi]._miy] &= ~BFLAG_MISSILE;\r\n\tdMissile[missile[mi]._mix][missile[mi]._miy] = 0;\r\n}\r\n"
  },
  {
    "path": "Source/missiles.h",
    "content": "/**\r\n * @file missiles.h\r\n *\r\n * Interface of missile functionality.\r\n */\r\n#ifndef __MISSILES_H__\r\n#define __MISSILES_H__\r\n\r\nextern int missileactive[MAXMISSILES];\r\nextern int missileavail[MAXMISSILES];\r\nextern MissileStruct missile[MAXMISSILES];\r\nextern int nummissiles;\r\nextern BOOL MissilePreFlag;\r\n\r\nvoid GetDamageAmt(int i, int *mind, int *maxd);\r\nint GetSpellLevel(int id, int sn);\r\nvoid DeleteMissile(int mi, int i);\r\nBOOL MonsterTrapHit(int m, int mindam, int maxdam, int dist, int t, BOOLEAN shift);\r\nBOOL PlayerMHit(int pnum, int m, int dist, int mind, int maxd, int mtype, BOOLEAN shift, int earflag\r\n#ifdef HELLFIRE\r\n    ,\r\n    BOOLEAN *blocked\r\n#endif\r\n);\r\nvoid SetMissAnim(int mi, int animtype);\r\nvoid SetMissDir(int mi, int dir);\r\nvoid LoadMissileGFX(BYTE mi);\r\nvoid InitMissileGFX();\r\nvoid FreeMissiles();\r\nvoid FreeMissiles2();\r\nvoid InitMissiles();\r\n#ifdef HELLFIRE\r\nvoid missiles_hive_explosion(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_fire_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_great_light_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_immolation_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_stone_rune(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_reflection(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_berserk(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_hork_spawn(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_jester(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_steal_pots(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_mana_trap(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_spec_arrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_warp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_light_wall(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_rune_explosion(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_immo_1(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_immo_2(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_larrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_43303D(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_433040(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_rech_mana(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_magi(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_ring(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_search(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_cbolt_arrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid missiles_hbolt_arrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddBlodboil(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\n#endif\r\nvoid AddLArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddArrow(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddRndTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFirebolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam);\r\nvoid AddMagmaball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_33(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddTeleport(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddLightball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFirewall(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFireball(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddLightctrl(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddLightning(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddMisexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddWeapexp(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddTown(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFlash(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFlash2(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddManashield(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFiremove(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddGuardian(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddChain(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_11(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_12(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_13(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddRhino(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_32(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFlare(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddAcid(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_1D(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddAcidpud(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddStone(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddGolem(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddEtherealize(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_1F(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid miss_null_23(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddBoom(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddHeal(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddHealOther(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddElement(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddIdentify(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFirewallC(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddInfra(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddWave(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddNova(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddBlodboil(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddRepair(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddRecharge(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddDisarm(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddApoca(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFlame(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddFlamec(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddCbolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam);\r\nvoid AddHbolt(int mi, int sx, int sy, int dx, int dy, int midir, char micaster, int id, int dam);\r\nvoid AddResurrect(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddResurrectBeam(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddTelekinesis(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddBoneSpirit(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddRportal(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nvoid AddDiabApoca(int mi, int sx, int sy, int dx, int dy, int midir, char mienemy, int id, int dam);\r\nint AddMissile(int sx, int sy, int dx, int dy, int midir, int mitype, char micaster, int id, int midam, int spllvl);\r\nvoid MI_Dummy(int i);\r\nvoid MI_Golem(int i);\r\nvoid MI_SetManashield(int i);\r\nvoid MI_LArrow(int i);\r\nvoid MI_Arrow(int i);\r\nvoid MI_Firebolt(int i);\r\nvoid MI_Lightball(int i);\r\nvoid mi_null_33(int i);\r\nvoid MI_Acidpud(int i);\r\nvoid MI_Firewall(int i);\r\nvoid MI_Fireball(int i);\r\n#ifdef HELLFIRE\r\nvoid mi_hork_spawn(int i);\r\nvoid MI_Rune(int i);\r\nvoid mi_light_wall(int i);\r\nvoid mi_hive_explode(int i);\r\nvoid mi_immolation(int i);\r\nvoid mi_light_arrow(int i);\r\nvoid mi_flashfr(int i);\r\nvoid mi_flashbk(int i);\r\nvoid mi_reflect(int i);\r\nvoid mi_fire_ring(int i);\r\nvoid mi_light_ring(int i);\r\nvoid mi_search(int i);\r\nvoid mi_lightning_wall(int i);\r\nvoid mi_fire_nova(int i);\r\nvoid mi_spec_arrow(int i);\r\n#endif\r\nvoid MI_Lightctrl(int i);\r\nvoid MI_Lightning(int i);\r\nvoid MI_Town(int i);\r\nvoid MI_Flash(int i);\r\nvoid MI_Flash2(int i);\r\nvoid MI_Etherealize(int i);\r\nvoid MI_Firemove(int i);\r\nvoid MI_Guardian(int i);\r\nvoid MI_Chain(int i);\r\nvoid mi_null_11(int i);\r\nvoid MI_Weapexp(int i);\r\nvoid MI_Misexp(int i);\r\nvoid MI_Acidsplat(int i);\r\nvoid MI_Teleport(int i);\r\nvoid MI_Stone(int i);\r\nvoid MI_Boom(int i);\r\nvoid MI_Rhino(int i);\r\nvoid mi_null_32(int i);\r\nvoid MI_FirewallC(int i);\r\nvoid MI_Infra(int i);\r\nvoid MI_Apoca(int i);\r\nvoid MI_Wave(int i);\r\nvoid MI_Nova(int i);\r\nvoid MI_Blodboil(int i);\r\nvoid MI_Flame(int i);\r\nvoid MI_Flamec(int i);\r\nvoid MI_Cbolt(int i);\r\nvoid MI_Hbolt(int i);\r\nvoid MI_Element(int i);\r\nvoid MI_Bonespirit(int i);\r\nvoid MI_ResurrectBeam(int i);\r\nvoid MI_Rportal(int i);\r\nvoid ProcessMissiles();\r\nvoid missiles_process_charge();\r\nvoid ClearMissileSpot(int mi);\r\n\r\n#endif /* __MISSILES_H__ */\r\n"
  },
  {
    "path": "Source/monstdat.cpp",
    "content": "/**\r\n * @file monstdat.cpp\r\n *\r\n * Implementation of all monster data.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Contains the data related to each monster ID. */\r\nMonsterData monsterdata[] = {\r\n\t// clang-format off\r\n\t// width, mImage, GraphicType,                        has_special, sndfile,                             snd_special, has_trans, TransFile,                         Frames[6],                  Rate[6],              mName,               mMinDLvl, mMaxDLvl, mLevel, mMinHP, mMaxHP, mAi,          mFlags                                                             , mInt, mHit, mAFNum, mMinDamage, mMaxDamage, mHit2, mAFNum2, mMinDamage2, mMaxDamage2, mArmorClass, mMonstClass, mMagicRes                                                    , mMagicRes2                                                   , mTreasure, mSelFlag,  mExp\r\n\t{    128,    799, \"Monsters\\\\Zombie\\\\Zombie%c.CL2\",   FALSE,       \"Monsters\\\\Zombie\\\\Zombie%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 11, 24, 12,  6, 16,  0 }, { 4, 0, 0, 0, 0, 0 }, \"Zombie\",                   1,        3,      1,      4,      7, AI_ZOMBIE,    0                                                                  ,    0,   10,      8,          2,          5,     0,       0,           0,           0,           5, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,    54 },\r\n\t{    128,    799, \"Monsters\\\\Zombie\\\\Zombie%c.CL2\",   FALSE,       \"Monsters\\\\Zombie\\\\Zombie%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\Zombie\\\\Bluered.TRN\",   { 11, 24, 12,  6, 16,  0 }, { 4, 0, 0, 0, 0, 0 }, \"Ghoul\",                    2,        4,      2,      7,     11, AI_ZOMBIE,    0                                                                  ,    1,   10,      8,          3,         10,     0,       0,           0,           0,          10, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,    58 },\r\n\t{    128,    799, \"Monsters\\\\Zombie\\\\Zombie%c.CL2\",   FALSE,       \"Monsters\\\\Zombie\\\\Zombie%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\Zombie\\\\Grey.TRN\",      { 11, 24, 12,  6, 16,  0 }, { 4, 0, 0, 0, 0, 0 }, \"Rotting Carcass\",          2,        6,      4,     15,     25, AI_ZOMBIE,    0                                                                  ,    2,   25,      8,          5,         15,     0,       0,           0,           0,          15, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE |                    IMMUNE_NULL_40,         0,        3,   136 },\r\n\t{    128,    799, \"Monsters\\\\Zombie\\\\Zombie%c.CL2\",   FALSE,       \"Monsters\\\\Zombie\\\\Zombie%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\Zombie\\\\Yellow.TRN\",    { 11, 24, 12,  6, 16,  0 }, { 4, 0, 0, 0, 0, 0 }, \"Black Death\",              4,        8,      6,     25,     40, AI_ZOMBIE,    0                                                                  ,    3,   30,      8,          6,         22,     0,       0,           0,           0,          20, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   240 },\r\n\t{    128,    543, \"Monsters\\\\FalSpear\\\\Phall%c.CL2\",  TRUE,        \"Monsters\\\\FalSpear\\\\Phall%c%i.WAV\", TRUE,        TRUE,      \"Monsters\\\\FalSpear\\\\FallenT.TRN\", { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, \"Fallen One\",               1,        3,      1,      1,      4, AI_FALLEN,    0                                                                  ,    0,   15,      7,          1,          3,     0,       5,           0,           0,           0, MC_ANIMAL,   0                                                            , 0                                                            ,         0,        3,    46 },\r\n\t{    128,    543, \"Monsters\\\\FalSpear\\\\Phall%c.CL2\",  TRUE,        \"Monsters\\\\FalSpear\\\\Phall%c%i.WAV\", TRUE,        TRUE,      \"Monsters\\\\FalSpear\\\\Dark.TRN\",    { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, \"Carver\",                   2,        5,      3,      4,      8, AI_FALLEN,    0                                                                  ,    2,   20,      7,          2,          5,     0,       5,           0,           0,           5, MC_ANIMAL,   0                                                            , 0                                                            ,         0,        3,    80 },\r\n\t{    128,    543, \"Monsters\\\\FalSpear\\\\Phall%c.CL2\",  TRUE,        \"Monsters\\\\FalSpear\\\\Phall%c%i.WAV\", TRUE,        FALSE,     NULL,                              { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, \"Devil Kin\",                3,        7,      5,     12,     24, AI_FALLEN,    0                                                                  ,    2,   25,      7,          3,          7,     0,       5,           0,           0,          10, MC_ANIMAL,   0                                                            ,                RESIST_FIRE                                   ,         0,        3,   155 },\r\n\t{    128,    543, \"Monsters\\\\FalSpear\\\\Phall%c.CL2\",  TRUE,        \"Monsters\\\\FalSpear\\\\Phall%c%i.WAV\", TRUE,        TRUE,      \"Monsters\\\\FalSpear\\\\Blue.TRN\",    { 11, 11, 13, 11, 18, 13 }, { 3, 0, 0, 0, 0, 0 }, \"Dark One\",                 5,        9,      7,     20,     36, AI_FALLEN,    0                                                                  ,    3,   30,      7,          4,          8,     0,       5,           0,           0,          15, MC_ANIMAL,                                                   IMMUNE_NULL_40,                              RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   255 },\r\n\t{    128,    553, \"Monsters\\\\SkelAxe\\\\SklAx%c.CL2\",   TRUE,        \"Monsters\\\\SkelAxe\\\\SklAx%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\SkelAxe\\\\White.TRN\",    { 12,  8, 13,  6, 17, 16 }, { 5, 0, 0, 0, 0, 0 }, \"Skeleton\",                 1,        3,      1,      2,      4, AI_SKELSD,    0                                                                  ,    0,   20,      8,          1,          4,     0,       0,           0,           0,           0, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,    64 },\r\n\t{    128,    553, \"Monsters\\\\SkelAxe\\\\SklAx%c.CL2\",   TRUE,        \"Monsters\\\\SkelAxe\\\\SklAx%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\SkelAxe\\\\Skelt.TRN\",    { 12,  8, 13,  6, 17, 16 }, { 4, 0, 0, 0, 0, 0 }, \"Corpse Axe\",               2,        5,      2,      4,      7, AI_SKELSD,    0                                                                  ,    1,   25,      8,          3,          5,     0,       0,           0,           0,           0, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,    68 },\r\n\t{    128,    553, \"Monsters\\\\SkelAxe\\\\SklAx%c.CL2\",   TRUE,        \"Monsters\\\\SkelAxe\\\\SklAx%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 12,  8, 13,  6, 17, 16 }, { 2, 0, 0, 0, 0, 0 }, \"Burning Dead\",             2,        6,      4,      8,     12, AI_SKELSD,    0                                                                  ,    2,   30,      8,          3,          7,     0,       0,           0,           0,           5, MC_UNDEAD,   IMMUNE_MAGIC  | RESIST_FIRE |                    IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  |                    IMMUNE_NULL_40,         0,        3,   154 },\r\n\t{    128,    553, \"Monsters\\\\SkelAxe\\\\SklAx%c.CL2\",   TRUE,        \"Monsters\\\\SkelAxe\\\\SklAx%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\SkelAxe\\\\Black.TRN\",    { 12,  8, 13,  6, 17, 16 }, { 3, 0, 0, 0, 0, 0 }, \"Horror\",                   4,        8,      6,     12,     20, AI_SKELSD,    0                                                                  ,    3,   35,      8,          4,          9,     0,       0,           0,           0,          15, MC_UNDEAD,   IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   264 },\r\n\t{    128,    623, \"Monsters\\\\FalSword\\\\Fall%c.CL2\",   TRUE,        \"Monsters\\\\FalSword\\\\Fall%c%i.WAV\",  TRUE,        TRUE,      \"Monsters\\\\FalSword\\\\FallenT.TRN\", { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, \"Fallen One\",               1,        3,      1,      2,      5, AI_FALLEN,    0                                                                  ,    0,   15,      8,          1,          4,     0,       5,           0,           0,          10, MC_ANIMAL,   0                                                            , 0                                                            ,         0,        3,    52 },\r\n\t{    128,    623, \"Monsters\\\\FalSword\\\\Fall%c.CL2\",   TRUE,        \"Monsters\\\\FalSword\\\\Fall%c%i.WAV\",  TRUE,        TRUE,      \"Monsters\\\\FalSword\\\\Dark.TRN\",    { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, \"Carver\",                   2,        5,      3,      5,      9, AI_FALLEN,    0                                                                  ,    1,   20,      8,          2,          7,     0,       5,           0,           0,          15, MC_ANIMAL,   0                                                            , 0                                                            ,         0,        3,    90 },\r\n\t{    128,    623, \"Monsters\\\\FalSword\\\\Fall%c.CL2\",   TRUE,        \"Monsters\\\\FalSword\\\\Fall%c%i.WAV\",  TRUE,        FALSE,     NULL,                              { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, \"Devil Kin\",                3,        7,      5,     16,     24, AI_FALLEN,    0                                                                  ,    2,   25,      8,          4,         10,     0,       5,           0,           0,          20, MC_ANIMAL,   0                                                            ,                RESIST_FIRE                                   ,         0,        3,   180 },\r\n\t{    128,    623, \"Monsters\\\\FalSword\\\\Fall%c.CL2\",   TRUE,        \"Monsters\\\\FalSword\\\\Fall%c%i.WAV\",  TRUE,        TRUE,      \"Monsters\\\\FalSword\\\\Blue.TRN\",    { 12, 12, 13, 11, 14, 15 }, { 3, 0, 0, 0, 0, 0 }, \"Dark One\",                 5,        9,      7,     24,     36, AI_FALLEN,    0                                                                  ,    3,   30,      8,          4,         12,     0,       5,           0,           0,          25, MC_ANIMAL,                                                   IMMUNE_NULL_40,                              RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   280 },\r\n\t{    128,    410, \"Monsters\\\\Scav\\\\Scav%c.CL2\",       TRUE,        \"Monsters\\\\Scav\\\\Scav%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 12,  8, 12,  6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, \"Scavenger\",                1,        4,      2,      3,      6, AI_SCAV,      0                                                                  ,    0,   20,      7,          1,          5,     0,       0,           0,           0,          10, MC_ANIMAL,   0                                                            ,                RESIST_FIRE                                   ,         0,        3,    80 },\r\n\t{    128,    410, \"Monsters\\\\Scav\\\\Scav%c.CL2\",       TRUE,        \"Monsters\\\\Scav\\\\Scav%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Scav\\\\ScavBr.TRN\",      { 12,  8, 12,  6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, \"Plague Eater\",             3,        6,      4,     12,     24, AI_SCAV,      0                                                                  ,    1,   30,      7,          1,          8,     0,       0,           0,           0,          20, MC_ANIMAL,   0                                                            ,                              RESIST_LIGHTNING                ,         0,        3,   188 },\r\n\t{    128,    410, \"Monsters\\\\Scav\\\\Scav%c.CL2\",       TRUE,        \"Monsters\\\\Scav\\\\Scav%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Scav\\\\ScavBe.TRN\",      { 12,  8, 12,  6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, \"Shadow Beast\",             4,        8,      6,     24,     36, AI_SCAV,      0                                                                  ,    2,   35,      7,          3,         12,     0,       0,           0,           0,          25, MC_ANIMAL,                                                   IMMUNE_NULL_40,                RESIST_FIRE |                    IMMUNE_NULL_40,         0,        3,   375 },\r\n\t{    128,    410, \"Monsters\\\\Scav\\\\Scav%c.CL2\",       TRUE,        \"Monsters\\\\Scav\\\\Scav%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Scav\\\\ScavW.TRN\",       { 12,  8, 12,  6, 20, 11 }, { 2, 0, 0, 0, 0, 0 }, \"Bone Gasher\",              6,       10,      8,     28,     40, AI_SCAV,      0                                                                  ,    3,   35,      7,          5,         15,     0,       0,           0,           0,          30, MC_ANIMAL,   RESIST_MAGIC |                                  IMMUNE_NULL_40,                              RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   552 },\r\n\t{    128,    567, \"Monsters\\\\SkelBow\\\\SklBw%c.CL2\",   TRUE,        \"Monsters\\\\SkelBow\\\\SklBw%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\SkelBow\\\\White.TRN\",    {  9,  8, 16,  5, 16, 16 }, { 4, 0, 0, 0, 0, 0 }, \"Skeleton\",                 2,        5,      3,      2,      4, AI_SKELBOW,   0                                                                  ,    0,   15,     12,          1,          2,     0,       0,           0,           0,           0, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,   110 },\r\n\t{    128,    567, \"Monsters\\\\SkelBow\\\\SklBw%c.CL2\",   TRUE,        \"Monsters\\\\SkelBow\\\\SklBw%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\SkelBow\\\\Skelt.TRN\",    {  9,  8, 16,  5, 16, 16 }, { 4, 0, 0, 0, 0, 0 }, \"Corpse Bow\",               3,        7,      5,      8,     16, AI_SKELBOW,   0                                                                  ,    1,   25,     12,          1,          4,     0,       0,           0,           0,           0, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,   210 },\r\n\t{    128,    567, \"Monsters\\\\SkelBow\\\\SklBw%c.CL2\",   TRUE,        \"Monsters\\\\SkelBow\\\\SklBw%c%i.WAV\",  FALSE,       FALSE,     NULL,                              {  9,  8, 16,  5, 16, 16 }, { 2, 0, 0, 0, 0, 0 }, \"Burning Dead\",             5,        9,      7,     10,     24, AI_SKELBOW,   0                                                                  ,    2,   30,     12,          1,          6,     0,       0,           0,           0,           5, MC_UNDEAD,   IMMUNE_MAGIC  | RESIST_FIRE |                    IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  |                    IMMUNE_NULL_40,         0,        3,   364 },\r\n\t{    128,    567, \"Monsters\\\\SkelBow\\\\SklBw%c.CL2\",   TRUE,        \"Monsters\\\\SkelBow\\\\SklBw%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\SkelBow\\\\Black.TRN\",    {  9,  8, 16,  5, 16, 16 }, { 3, 0, 0, 0, 0, 0 }, \"Horror\",                   7,       11,      9,     15,     45, AI_SKELBOW,   0                                                                  ,    3,   35,     12,          2,          9,     0,       0,           0,           0,          15, MC_UNDEAD,   IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   594 },\r\n\t{    128,    575, \"Monsters\\\\SkelSd\\\\SklSr%c.CL2\",    TRUE,        \"Monsters\\\\SkelSd\\\\SklSr%c%i.WAV\",   TRUE,        TRUE,      \"Monsters\\\\SkelSd\\\\White.TRN\",     { 13,  8, 12,  7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, \"Skeleton Captain\",         1,        4,      2,      3,      6, AI_SKELSD,    0                                                                  ,    0,   20,      8,          2,          7,     0,       0,           0,           0,          10, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,    90 },\r\n\t{    128,    575, \"Monsters\\\\SkelSd\\\\SklSr%c.CL2\",    TRUE,        \"Monsters\\\\SkelSd\\\\SklSr%c%i.WAV\",   FALSE,       TRUE,      \"Monsters\\\\SkelSd\\\\Skelt.TRN\",     { 13,  8, 12,  7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, \"Corpse Captain\",           2,        6,      4,     12,     20, AI_SKELSD,    0                                                                  ,    1,   30,      8,          3,          9,     0,       0,           0,           0,           5, MC_UNDEAD,   IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,   200 },\r\n\t{    128,    575, \"Monsters\\\\SkelSd\\\\SklSr%c.CL2\",    TRUE,        \"Monsters\\\\SkelSd\\\\SklSr%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 13,  8, 12,  7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, \"Burning Dead Captain\",     4,        8,      6,     16,     30, AI_SKELSD,    0                                                                  ,    2,   35,      8,          4,         10,     0,       0,           0,           0,          15, MC_UNDEAD,   IMMUNE_MAGIC  | RESIST_FIRE |                    IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  |                    IMMUNE_NULL_40,         0,        3,   393 },\r\n\t{    128,    575, \"Monsters\\\\SkelSd\\\\SklSr%c.CL2\",    TRUE,        \"Monsters\\\\SkelSd\\\\SklSr%c%i.WAV\",   FALSE,       TRUE,      \"Monsters\\\\SkelSd\\\\Black.TRN\",     { 13,  8, 12,  7, 15, 16 }, { 4, 0, 0, 0, 0, 0 }, \"Horror Captain\",           6,       10,      8,     35,     50, AI_SKELSD,                                     MFLAG_SEARCH                      ,    3,   40,      8,          5,         14,     0,       0,           0,           0,          30, MC_UNDEAD,   IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   604 },\r\n#ifdef HELLFIRE\r\n\t{    128,    800, \"Monsters\\\\TSneak\\\\TSneak%c.CL2\",   FALSE,       \"Monsters\\\\TSneak\\\\Sneakl%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 13, 13, 15, 11, 16,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Invisible Lord\",          36,       39,     14,    278,    278, AI_SKELSD,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   65,      8,         16,         30,     0,       0,           0,           0,          60, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,  2000 },\r\n#else\r\n\t{    128,   2000, \"Monsters\\\\TSneak\\\\TSneak%c.CL2\",   FALSE,       \"Monsters\\\\TSneak\\\\Sneakl%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 13, 13, 15, 11, 16,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Invisible Lord\",          14,       14,     14,    278,    278, AI_SKELSD,                                     MFLAG_SEARCH                      ,    3,   65,      8,         16,         30,     0,       0,           0,           0,          60, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,  2000 },\r\n#endif\r\n\t{    128,    992, \"Monsters\\\\Sneak\\\\Sneak%c.CL2\",     TRUE,        \"Monsters\\\\Sneak\\\\Sneak%c%i.WAV\",    FALSE,       FALSE,     NULL,                              { 16,  8, 12,  8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, \"Hidden\",                   3,        8,      5,      8,     24, AI_SNEAK,     MFLAG_HIDDEN                                                       ,    0,   35,      8,          3,          6,     0,       0,           0,           0,          25, MC_DEMON,    0                                                            ,                                                 IMMUNE_NULL_40,         0,        3,   278 },\r\n\t{    128,    992, \"Monsters\\\\Sneak\\\\Sneak%c.CL2\",     TRUE,        \"Monsters\\\\Sneak\\\\Sneak%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Sneak\\\\Sneakv2.TRN\",    { 16,  8, 12,  8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, \"Stalker\",                  8,       12,      9,     30,     45, AI_SNEAK,     MFLAG_HIDDEN |                   MFLAG_SEARCH                      ,    1,   40,      8,          8,         16,     0,       0,           0,           0,          30, MC_DEMON,    0                                                            ,                                                 IMMUNE_NULL_40,         0,        3,   630 },\r\n\t{    128,    992, \"Monsters\\\\Sneak\\\\Sneak%c.CL2\",     TRUE,        \"Monsters\\\\Sneak\\\\Sneak%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Sneak\\\\Sneakv3.TRN\",    { 16,  8, 12,  8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, \"Unseen\",                  10,       14,     11,     35,     50, AI_SNEAK,     MFLAG_HIDDEN |                   MFLAG_SEARCH                      ,    2,   45,      8,         12,         20,     0,       0,           0,           0,          30, MC_DEMON,    RESIST_MAGIC |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,   935 },\r\n\t{    128,    992, \"Monsters\\\\Sneak\\\\Sneak%c.CL2\",     TRUE,        \"Monsters\\\\Sneak\\\\Sneak%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Sneak\\\\Sneakv1.TRN\",    { 16,  8, 12,  8, 24, 15 }, { 2, 0, 0, 0, 0, 0 }, \"Illusion Weaver\",         14,       18,     13,     40,     60, AI_SNEAK,     MFLAG_HIDDEN |                   MFLAG_SEARCH                      ,    3,   60,      8,         16,         24,     0,       0,           0,           0,          30, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE                                   , IMMUNE_MAGIC  | RESIST_FIRE |                    IMMUNE_NULL_40,         0,        3,  1500 },\r\n#ifdef HELLFIRE\r\n\t{    160,    800, \"Monsters\\\\GoatLord\\\\GoatL%c.CL2\",  FALSE,       \"Monsters\\\\newsfx\\\\Satyr%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 13, 13, 14,  9, 16,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Satyr Lord\",              40,       43,     28,    160,    200, AI_SKELSD,                                     MFLAG_SEARCH                      ,    3,   90,      8,         20,         30,     0,       0,           0,           0,          70, MC_ANIMAL,                  RESIST_FIRE | RESIST_LIGHTNING                , RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING                 ,         0,        3,  2800 },\r\n#else\r\n\t{    160,   2000, \"Monsters\\\\GoatLord\\\\GoatL%c.CL2\",  FALSE,       \"Monsters\\\\GoatLord\\\\Goatl%c%i.WAV\", FALSE,       FALSE,     NULL,                              { 13, 13, 14,  9, 16,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Lord Sayter\",             13,       13,     12,    351,    351, AI_SKELSD,                                     MFLAG_SEARCH                      ,    3,   80,      8,         14,         24,     0,       0,           0,           0,          60, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40,         0,        3,  1500 },\r\n#endif\r\n\t{    128,   1030, \"Monsters\\\\GoatMace\\\\Goat%c.CL2\",   TRUE,        \"Monsters\\\\GoatMace\\\\Goat%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 12,  8, 12,  6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, \"Flesh Clan\",               6,       10,      8,     30,     45, AI_GOATMC,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    0,   50,      8,          4,         10,     0,       0,           0,           0,          40, MC_DEMON,    0                                                            , 0                                                            ,         0,        3,   460 },\r\n\t{    128,   1030, \"Monsters\\\\GoatMace\\\\Goat%c.CL2\",   TRUE,        \"Monsters\\\\GoatMace\\\\Goat%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\GoatMace\\\\Beige.TRN\",   { 12,  8, 12,  6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, \"Stone Clan\",               8,       12,     10,     40,     55, AI_GOATMC,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    1,   60,      8,          6,         12,     0,       0,           0,           0,          40, MC_DEMON,    RESIST_MAGIC |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,   685 },\r\n\t{    128,   1030, \"Monsters\\\\GoatMace\\\\Goat%c.CL2\",   TRUE,        \"Monsters\\\\GoatMace\\\\Goat%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\GoatMace\\\\Red.TRN\",     { 12,  8, 12,  6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, \"Fire Clan\",               10,       14,     12,     50,     65, AI_GOATMC,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,   70,      8,          8,         16,     0,       0,           0,           0,          45, MC_DEMON,                   RESIST_FIRE                                   ,                IMMUNE_FIRE                                    ,         0,        3,   906 },\r\n\t{    128,   1030, \"Monsters\\\\GoatMace\\\\Goat%c.CL2\",   TRUE,        \"Monsters\\\\GoatMace\\\\Goat%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\GoatMace\\\\Gray.TRN\",    { 12,  8, 12,  6, 20, 12 }, { 2, 0, 0, 0, 1, 0 }, \"Night Clan\",              12,       16,     14,     55,     70, AI_GOATMC,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   80,      8,         10,         20,    15,       0,          30,          30,          50, MC_DEMON,    RESIST_MAGIC |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,  1190 },\r\n\t{     96,    364, \"Monsters\\\\Bat\\\\Bat%c.CL2\",         FALSE,       \"Monsters\\\\Bat\\\\Bat%c%i.WAV\",        FALSE,       TRUE,      \"Monsters\\\\Bat\\\\red.trn\",          {  9, 13, 10,  9, 13,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Fiend\",                    2,        5,      3,      3,      6, AI_BAT,       0                                                                  ,    0,   35,      5,          1,          6,     0,       0,           0,           0,           0, MC_ANIMAL,   0                                                            , 0                                                            ,    0x4000,        6,   102 },\r\n\t{     96,    364, \"Monsters\\\\Bat\\\\Bat%c.CL2\",         FALSE,       \"Monsters\\\\Bat\\\\Bat%c%i.WAV\",        FALSE,       FALSE,     NULL,                              {  9, 13, 10,  9, 13,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Blink\",                    5,        9,      7,     12,     28, AI_BAT,       0                                                                  ,    1,   45,      5,          1,          8,     0,       0,           0,           0,          15, MC_ANIMAL,   0                                                            , 0                                                            ,    0x4000,        6,   340 },\r\n\t{     96,    364, \"Monsters\\\\Bat\\\\Bat%c.CL2\",         FALSE,       \"Monsters\\\\Bat\\\\Bat%c%i.WAV\",        FALSE,       TRUE,      \"Monsters\\\\Bat\\\\grey.trn\",         {  9, 13, 10,  9, 13,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Gloom\",                    7,       11,      9,     28,     36, AI_BAT,                                        MFLAG_SEARCH                      ,    2,   70,      5,          4,         12,     0,       0,           0,           0,          35, MC_ANIMAL,   RESIST_MAGIC                                                 , RESIST_MAGIC |                                  IMMUNE_NULL_40,    0x4000,        6,   509 },\r\n\t{     96,    364, \"Monsters\\\\Bat\\\\Bat%c.CL2\",         FALSE,       \"Monsters\\\\Bat\\\\Bat%c%i.WAV\",        FALSE,       TRUE,      \"Monsters\\\\Bat\\\\orange.trn\",       {  9, 13, 10,  9, 13,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Familiar\",                11,       15,     13,     20,     35, AI_BAT,                                        MFLAG_SEARCH                      ,    3,   50,      5,          4,         16,     0,       0,           0,           0,          35, MC_DEMON,    RESIST_MAGIC |               IMMUNE_LIGHTNING                 , RESIST_MAGIC |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40,    0x4000,        6,   448 },\r\n\t{    128,   1040, \"Monsters\\\\GoatBow\\\\GoatB%c.CL2\",   FALSE,       \"Monsters\\\\GoatBow\\\\GoatB%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 12,  8, 16,  6, 20,  0 }, { 3, 0, 0, 0, 0, 0 }, \"Flesh Clan\",               6,       10,      8,     20,     35, AI_GOATBOW,                                                   MFLAG_CAN_OPEN_DOOR,    0,   35,     13,          1,          7,     0,       0,           0,           0,          35, MC_DEMON,    0                                                            , 0                                                            ,         0,        3,   448 },\r\n\t{    128,   1040, \"Monsters\\\\GoatBow\\\\GoatB%c.CL2\",   FALSE,       \"Monsters\\\\GoatBow\\\\GoatB%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\GoatBow\\\\Beige.TRN\",    { 12,  8, 16,  6, 20,  0 }, { 3, 0, 0, 0, 0, 0 }, \"Stone Clan\",               8,       12,     10,     30,     40, AI_GOATBOW,                                                   MFLAG_CAN_OPEN_DOOR,    1,   40,     13,          2,          9,     0,       0,           0,           0,          35, MC_DEMON,    RESIST_MAGIC |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,   645 },\r\n\t{    128,   1040, \"Monsters\\\\GoatBow\\\\GoatB%c.CL2\",   FALSE,       \"Monsters\\\\GoatBow\\\\GoatB%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\GoatBow\\\\Red.TRN\",      { 12,  8, 16,  6, 20,  0 }, { 3, 0, 0, 0, 0, 0 }, \"Fire Clan\",               10,       14,     12,     40,     50, AI_GOATBOW,                                    MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,   45,     13,          3,         11,     0,       0,           0,           0,          35, MC_DEMON,                   RESIST_FIRE                                   ,                IMMUNE_FIRE                                    ,         0,        3,   822 },\r\n\t{    128,   1040, \"Monsters\\\\GoatBow\\\\GoatB%c.CL2\",   FALSE,       \"Monsters\\\\GoatBow\\\\GoatB%c%i.WAV\",  FALSE,       TRUE,      \"Monsters\\\\GoatBow\\\\Gray.TRN\",     { 12,  8, 16,  6, 20,  0 }, { 3, 0, 0, 0, 0, 0 }, \"Night Clan\",              12,       16,     14,     50,     65, AI_GOATBOW,                                    MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   50,     13,          4,         13,    15,       0,           0,           0,          40, MC_DEMON,    RESIST_MAGIC |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        3,  1092 },\r\n\t{    128,    716, \"Monsters\\\\Acid\\\\Acid%c.CL2\",       TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      TRUE,        FALSE,     NULL,                              { 13,  8, 12,  8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, \"Acid Beast\",              10,       14,     11,     40,     66, AI_ACID,      0                                                                  ,    0,   40,      8,          4,         12,    25,       8,           0,           0,          30, MC_ANIMAL,                                                   IMMUNE_ACID   , IMMUNE_MAGIC  |                                  IMMUNE_ACID   ,         0,        3,   846 },\r\n\t{    128,    716, \"Monsters\\\\Acid\\\\Acid%c.CL2\",       TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Acid\\\\AcidBlk.TRN\",     { 13,  8, 12,  8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, \"Poison Spitter\",          14,       18,     15,     60,     85, AI_ACID,      0                                                                  ,    1,   45,      8,          4,         16,    25,       8,           0,           0,          30, MC_ANIMAL,                                                   IMMUNE_ACID   , IMMUNE_MAGIC  |                                  IMMUNE_ACID   ,         0,        3,  1248 },\r\n\t{    128,    716, \"Monsters\\\\Acid\\\\Acid%c.CL2\",       TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Acid\\\\AcidB.TRN\",       { 13,  8, 12,  8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, \"Pit Beast\",               18,       22,     21,     80,    110, AI_ACID,      0                                                                  ,    2,   55,      8,          8,         18,    35,       8,           0,           0,          35, MC_ANIMAL,   RESIST_MAGIC |                                  IMMUNE_ACID   , IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_ACID   ,         0,        3,  2060 },\r\n\t{    128,    716, \"Monsters\\\\Acid\\\\Acid%c.CL2\",       TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Acid\\\\AcidR.TRN\",       { 13,  8, 12,  8, 16, 12 }, { 0, 0, 0, 0, 0, 0 }, \"Lava Maw\",                22,       27,     25,    100,    150, AI_ACID,      0                                                                  ,    3,   65,      8,         10,         20,    40,       8,           0,           0,          35, MC_ANIMAL,   RESIST_MAGIC | IMMUNE_FIRE  |                    IMMUNE_ACID   , IMMUNE_MAGIC  | IMMUNE_FIRE  |                    IMMUNE_ACID   ,         0,        3,  2940 },\r\n\t{    160,   1010, \"Monsters\\\\SKing\\\\SKing%c.CL2\",     TRUE,        \"Monsters\\\\SKing\\\\SKing%c%i.WAV\",    TRUE,        TRUE,      \"Monsters\\\\SkelAxe\\\\White.TRN\",    {  8,  6, 16,  6, 16,  6 }, { 2, 0, 0, 0, 0, 2 }, \"Skeleton King\",            6,        6,      9,    140,    140, AI_SKELKING,                                   MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   60,      8,          6,         16,     0,       0,           0,           0,          70, MC_UNDEAD,   IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,    0x8001,        7,   570 },\r\n\t{    128,    980, \"Monsters\\\\FatC\\\\FatC%c.CL2\",       FALSE,       \"Monsters\\\\FatC\\\\FatC%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10,  8, 12,  6, 16,  0 }, { 1, 0, 0, 0, 0, 0 }, \"The Butcher\",              0,        0,      1,    320,    320, AI_CLEAVER,   0                                                                  ,    3,   50,      8,          6,         12,     0,       0,           0,           0,          50, MC_DEMON,                   RESIST_FIRE | RESIST_LIGHTNING                , RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING                 ,    0x8000,        3,   710 },\r\n\t{    128,   1130, \"Monsters\\\\Fat\\\\Fat%c.CL2\",         TRUE,        \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       FALSE,     NULL,                              {  8, 10, 15,  6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, \"Overlord\",                 8,       12,     10,     60,     80, AI_FAT,       0                                                                  ,    0,   55,      8,          6,         12,     0,       0,           0,           0,          55, MC_DEMON,    0                                                            ,                RESIST_FIRE                                   ,         0,        3,   635 },\r\n\t{    128,   1130, \"Monsters\\\\Fat\\\\Fat%c.CL2\",         TRUE,        \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       TRUE,      \"Monsters\\\\Fat\\\\Blue.TRN\",         {  8, 10, 15,  6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, \"Mud Man\",                 13,       17,     14,    100,    125, AI_FAT,                                        MFLAG_SEARCH                      ,    1,   60,      8,          8,         16,     0,       0,           0,           0,          60, MC_DEMON,    0                                                            ,                              IMMUNE_LIGHTNING                 ,         0,        3,  1165 },\r\n\t{    128,   1130, \"Monsters\\\\Fat\\\\Fat%c.CL2\",         TRUE,        \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       TRUE,      \"Monsters\\\\Fat\\\\FatB.TRN\",         {  8, 10, 15,  6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, \"Toad Demon\",              15,       19,     16,    135,    160, AI_FAT,                                        MFLAG_SEARCH                      ,    2,   70,      8,          8,         16,    40,       0,           8,          20,          65, MC_DEMON,    IMMUNE_MAGIC                                                  , IMMUNE_MAGIC  |               RESIST_LIGHTNING                ,         0,        3,  1380 },\r\n\t{    128,   1130, \"Monsters\\\\Fat\\\\Fat%c.CL2\",         TRUE,        \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       TRUE,      \"Monsters\\\\Fat\\\\FatF.TRN\",         {  8, 10, 15,  6, 16, 10 }, { 4, 0, 0, 0, 0, 0 }, \"Flayed One\",              19,       23,     20,    160,    200, AI_FAT,                                        MFLAG_SEARCH                      ,    3,   85,      8,         10,         20,     0,       0,           0,           0,          70, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        3,  2058 },\r\n\t{    160,   2420, \"Monsters\\\\Worm\\\\Worm%c.CL2\",       FALSE,       \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       FALSE,     NULL,                              { 13, 13, 13, 11, 19,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Wyrm\",                     9,       13,     11,     60,     90, AI_SKELSD,    0                                                                  ,    0,   40,      8,          4,         10,     0,       0,           0,           0,          25, MC_ANIMAL,   RESIST_MAGIC                                                 , RESIST_MAGIC                                                 ,         0,        3,   660 },\r\n\t{    160,   2420, \"Monsters\\\\Worm\\\\Worm%c.CL2\",       FALSE,       \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       FALSE,     NULL,                              { 13, 13, 13, 11, 19,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Cave Slug\",               11,       15,     13,     75,    110, AI_SKELSD,    0                                                                  ,    1,   50,      8,          6,         13,     0,       0,           0,           0,          30, MC_ANIMAL,   RESIST_MAGIC                                                 , RESIST_MAGIC                                                 ,         0,        3,   994 },\r\n\t{    160,   2420, \"Monsters\\\\Worm\\\\Worm%c.CL2\",       FALSE,       \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       FALSE,     NULL,                              { 13, 13, 13, 11, 19,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Devil Wyrm\",              13,       17,     15,    100,    140, AI_SKELSD,    0                                                                  ,    2,   55,      8,          8,         16,     0,       0,           0,           0,          30, MC_ANIMAL,   RESIST_MAGIC | RESIST_FIRE                                   , RESIST_MAGIC | RESIST_FIRE                                   ,         0,        3,  1320 },\r\n\t{    160,   2420, \"Monsters\\\\Worm\\\\Worm%c.CL2\",       FALSE,       \"Monsters\\\\Fat\\\\Fat%c%i.WAV\",        FALSE,       FALSE,     NULL,                              { 13, 13, 13, 11, 19,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Devourer\",                15,       19,     17,    125,    200, AI_SKELSD,    0                                                                  ,    3,   60,      8,         10,         20,     0,       0,           0,           0,          35, MC_ANIMAL,   RESIST_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40,         0,        3,  1827 },\r\n\t{    128,   1680, \"Monsters\\\\Magma\\\\Magma%c.CL2\",     TRUE,        \"Monsters\\\\Magma\\\\Magma%c%i.WAV\",    TRUE,        FALSE,     NULL,                              {  8, 10, 14,  7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, \"Magma Demon\",             14,       17,     13,     50,     70, AI_MAGMA,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    0,   45,      4,          2,         10,    50,      13,           0,           0,          45, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE                                   , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        7,  1076 },\r\n\t{    128,   1680, \"Monsters\\\\Magma\\\\Magma%c.CL2\",     TRUE,        \"Monsters\\\\Magma\\\\Magma%c%i.WAV\",    TRUE,        TRUE,      \"Monsters\\\\Magma\\\\Yellow.TRN\",     {  8, 10, 14,  7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, \"Blood Stone\",             15,       19,     14,     55,     75, AI_MAGMA,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    1,   50,      4,          2,         12,    50,      14,           0,           0,          45, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        7,  1309 },\r\n\t{    128,   1680, \"Monsters\\\\Magma\\\\Magma%c.CL2\",     TRUE,        \"Monsters\\\\Magma\\\\Magma%c%i.WAV\",    TRUE,        TRUE,      \"Monsters\\\\Magma\\\\Blue.TRN\",       {  8, 10, 14,  7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, \"Hell Stone\",              16,       20,     16,     60,     80, AI_MAGMA,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,   60,      4,          2,         20,    60,      14,           0,           0,          50, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        7,  1680 },\r\n\t{    128,   1680, \"Monsters\\\\Magma\\\\Magma%c.CL2\",     TRUE,        \"Monsters\\\\Magma\\\\Magma%c%i.WAV\",    TRUE,        TRUE,      \"Monsters\\\\Magma\\\\Wierd.TRN\",      {  8, 10, 14,  7, 18, 18 }, { 2, 0, 0, 0, 1, 0 }, \"Lava Lord\",               17,       21,     18,     70,     85, AI_MAGMA,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   75,      4,          4,         24,    60,      14,           0,           0,          60, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        7,  2124 },\r\n\t{    160,   1630, \"Monsters\\\\Rhino\\\\Rhino%c.CL2\",     TRUE,        \"Monsters\\\\Rhino\\\\Rhino%c%i.WAV\",    TRUE,        FALSE,     NULL,                              {  8,  8, 14,  6, 16,  6 }, { 2, 0, 0, 0, 0, 0 }, \"Horned Demon\",            12,       16,     13,     40,     80, AI_RHINO,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    0,   60,      7,          2,         16,   100,       0,           5,          32,          40, MC_ANIMAL,   0                                                            ,                RESIST_FIRE                                   ,         0,        7,  1172 },\r\n\t{    160,   1630, \"Monsters\\\\Rhino\\\\Rhino%c.CL2\",     TRUE,        \"Monsters\\\\Rhino\\\\Rhino%c%i.WAV\",    TRUE,        TRUE,      \"Monsters\\\\Rhino\\\\Orange.TRN\",     {  8,  8, 14,  6, 16,  6 }, { 2, 0, 0, 0, 0, 0 }, \"Mud Runner\",              14,       18,     15,     50,     90, AI_RHINO,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    1,   70,      7,          6,         18,   100,       0,          12,          36,          45, MC_ANIMAL,   0                                                            ,                RESIST_FIRE                                   ,         0,        7,  1404 },\r\n\t{    160,   1630, \"Monsters\\\\Rhino\\\\Rhino%c.CL2\",     TRUE,        \"Monsters\\\\Rhino\\\\Rhino%c%i.WAV\",    TRUE,        TRUE,      \"Monsters\\\\Rhino\\\\Blue.TRN\",       {  8,  8, 14,  6, 16,  6 }, { 2, 0, 0, 0, 0, 0 }, \"Frost Charger\",           16,       20,     17,     60,    100, AI_RHINO,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,   80,      7,          8,         20,   100,       0,          20,          40,          50, MC_ANIMAL,   IMMUNE_MAGIC  |               RESIST_LIGHTNING                , IMMUNE_MAGIC  |               RESIST_LIGHTNING                ,         0,        7,  1720 },\r\n\t{    160,   1630, \"Monsters\\\\Rhino\\\\Rhino%c.CL2\",     TRUE,        \"Monsters\\\\Rhino\\\\Rhino%c%i.WAV\",    TRUE,        TRUE,      \"Monsters\\\\Rhino\\\\RhinoB.TRN\",     {  8,  8, 14,  6, 16,  6 }, { 2, 0, 0, 0, 0, 0 }, \"Obsidian Lord\",           18,       22,     19,     70,    110, AI_RHINO,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   90,      7,         10,         22,   100,       0,          20,          50,          55, MC_ANIMAL,   IMMUNE_MAGIC  |               RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING                 ,         0,        7,  1809 },\r\n#ifdef HELLFIRE\r\n\t{    128,   1740, \"Monsters\\\\Demskel\\\\Demskl%c.CL2\",  TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        FALSE,     \"Monsters\\\\Thin\\\\Thinv3.TRN\",      { 10,  8, 20,  6, 24, 16 }, { 3, 0, 0, 0, 0, 0 }, \"oldboned\",                46,       47,     12,     70,     70, AI_STORM,     0                                                                  ,    0,   60,      8,          6,         14,    12,       0,           0,           0,          50, MC_DEMON,    IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        7,  1344 },\r\n#else\r\n\t{    128,   1740, \"Monsters\\\\Demskel\\\\Demskl%c.CL2\",  TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        FALSE,     \"Monsters\\\\Thin\\\\Thinv3.TRN\",      { 10,  8, 20,  6, 24, 16 }, { 3, 0, 0, 0, 0, 0 }, \"Bone Demon\",              10,       14,     12,     70,     70, AI_STORM,     0                                                                  ,    0,   60,      8,          6,         14,    12,       0,           0,           0,          50, MC_DEMON,    IMMUNE_MAGIC  |                                  IMMUNE_NULL_40, IMMUNE_MAGIC  |                                  IMMUNE_NULL_40,         0,        7,  1344 },\r\n#endif\r\n\t{    160,   1740, \"Monsters\\\\Thin\\\\Thin%c.CL2\",       TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Thin\\\\Thinv3.TRN\",      {  8,  8, 18,  4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, \"Red Death\",               14,       18,     16,     96,     96, AI_STORM,     0                                                                  ,    1,   75,      5,         10,         20,     0,       0,           0,           0,          60, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        7,  2168 },\r\n\t{    160,   1740, \"Monsters\\\\Thin\\\\Thin%c.CL2\",       TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Thin\\\\Thinv3.TRN\",      {  8,  8, 18,  4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, \"Litch Demon\",             16,       20,     18,    110,    110, AI_STORM,     0                                                                  ,    2,   80,      5,         10,         24,     0,       0,           0,           0,          45, MC_DEMON,    IMMUNE_MAGIC  |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  2736 },\r\n\t{    160,   1740, \"Monsters\\\\Thin\\\\Thin%c.CL2\",       TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Thin\\\\Thinv3.TRN\",      {  8,  8, 18,  4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, \"Undead Balrog\",           20,       24,     22,    130,    130, AI_STORM,     0                                                                  ,    3,   85,      5,         12,         30,     0,       0,           0,           0,          65, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7,  3575 },\r\n#ifdef HELLFIRE\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Incinerator\",             40,       43,     16,     30,     45, AI_FIREMAN,   0                                                                  ,    0,   75,      8,          8,         16,     0,       0,           0,           0,          25, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        3,  1888 },\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Flame Lord\",              42,       45,     18,     40,     55, AI_FIREMAN,   0                                                                  ,    1,   75,      8,         10,         20,     0,       0,           0,           0,          25, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        3,  2250 },\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Doom Fire\",               44,       47,     20,     50,     65, AI_FIREMAN,   0                                                                  ,    2,   80,      8,         12,         24,     0,       0,           0,           0,          30, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        3,  2740 },\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Hell Burner\",             46,       47,     22,     60,     80, AI_FIREMAN,   0                                                                  ,    3,   85,      8,         15,         30,     0,       0,           0,           0,          30, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        3,  3355 },\r\n#else\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Incinerator\",             14,       18,     16,     30,     45, AI_FIREMAN,   0                                                                  ,    0,   75,      8,          8,         16,     0,       0,           0,           0,          25, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        3,  1888 },\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Flame Lord\",              16,       20,     18,     40,     55, AI_FIREMAN,   0                                                                  ,    1,   75,      8,         10,         20,     0,       0,           0,           0,          25, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE                                    , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        3,  2250 },\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Doom Fire\",               18,       22,     20,     50,     65, AI_FIREMAN,   0                                                                  ,    2,   80,      8,         12,         24,     0,       0,           0,           0,          30, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        3,  2740 },\r\n\t{    128,   1460, \"Monsters\\\\Fireman\\\\FireM%c.CL2\",   TRUE,        \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14, 19, 20,  8, 14, 23 }, { 0, 0, 0, 0, 0, 0 }, \"Hell Burner\",             20,       24,     22,     60,     80, AI_FIREMAN,   0                                                                  ,    3,   85,      8,         15,         30,     0,       0,           0,           0,          30, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        3,  3355 },\r\n#endif\r\n\t{    160,   1740, \"Monsters\\\\Thin\\\\Thin%c.CL2\",       TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Thin\\\\Thinv3.TRN\",      {  8,  8, 18,  4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, \"Red Storm\",               17,       21,     18,     55,    110, AI_STORM,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    0,   80,      5,          8,         18,    75,       8,           4,          16,          30, MC_DEMON,    IMMUNE_MAGIC  |               RESIST_LIGHTNING                , IMMUNE_MAGIC  |               IMMUNE_LIGHTNING                 ,         0,        7,  2160 },\r\n\t{    160,   1740, \"Monsters\\\\Thin\\\\Thin%c.CL2\",       TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        FALSE,     NULL,                              {  8,  8, 18,  4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, \"Storm Rider\",             19,       23,     20,     60,    120, AI_STORM,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    1,   80,      5,          8,         18,    80,       8,           4,          16,          30, MC_DEMON,    RESIST_MAGIC |               IMMUNE_LIGHTNING                 , IMMUNE_MAGIC  |               IMMUNE_LIGHTNING                 ,         0,        7,  2391 },\r\n\t{    160,   1740, \"Monsters\\\\Thin\\\\Thin%c.CL2\",       TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Thin\\\\Thinv2.TRN\",      {  8,  8, 18,  4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, \"Storm Lord\",              21,       25,     22,     75,    135, AI_STORM,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,   85,      5,         12,         24,    75,       8,           4,          16,          35, MC_DEMON,    RESIST_MAGIC |               IMMUNE_LIGHTNING                 , IMMUNE_MAGIC  |               IMMUNE_LIGHTNING                 ,         0,        7,  2775 },\r\n\t{    160,   1740, \"Monsters\\\\Thin\\\\Thin%c.CL2\",       TRUE,        \"Monsters\\\\Thin\\\\Thin%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Thin\\\\Thinv1.TRN\",      {  8,  8, 18,  4, 17, 14 }, { 3, 0, 0, 0, 0, 0 }, \"Maelstorm\",               23,       27,     24,     90,    150, AI_STORM,                                      MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   90,      5,         12,         28,    75,       8,           4,          16,          40, MC_DEMON,    RESIST_MAGIC |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  3177 },\r\n#ifdef HELLFIRE\r\n\t{    128,    800, \"Monsters\\\\BigFall\\\\Fallg%c.CL2\",   TRUE,        \"Monsters\\\\newsfx\\\\KBrute%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 10,  8, 11,  8, 17,  0 }, { 0, 0, 0, 0, 2, 2 }, \"Devil Kin Brute\",         40,       43,     27,    120,    160, AI_SKELSD,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,  100,      6,         18,         24,     0,       0,           0,           0,          70, MC_ANIMAL,                  RESIST_FIRE | RESIST_LIGHTNING                , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                ,         0,        3,  2400 },\r\n#else\r\n\t{    128,   1650, \"Monsters\\\\BigFall\\\\Fallg%c.CL2\",   TRUE,        \"Monsters\\\\BigFall\\\\Bfal%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 10,  8, 11,  8, 17,  0 }, { 0, 0, 0, 0, 2, 2 }, \"Devil Kin Brute\",         20,       20,     24,    160,    220, AI_SKELSD,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,  100,      6,         18,         24,     0,       0,           0,           0,          75, MC_ANIMAL,   0                                                            , 0                                                            ,         0,        6,  2000 },\r\n#endif\r\n\t{    160,   1650, \"Monsters\\\\Gargoyle\\\\Gargo%c.CL2\",  TRUE,        \"Monsters\\\\Gargoyle\\\\Gargo%c%i.WAV\", FALSE,       FALSE,     NULL,                              { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 2 }, \"Winged-Demon\",             8,       12,      9,     45,     60, AI_GARG,                                                      MFLAG_CAN_OPEN_DOOR,    0,   50,      7,         10,         16,     0,       0,           0,           0,          45, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE |                    IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  |                    IMMUNE_NULL_40,         0,        6,   662 },\r\n\t{    160,   1650, \"Monsters\\\\Gargoyle\\\\Gargo%c.CL2\",  TRUE,        \"Monsters\\\\Gargoyle\\\\Gargo%c%i.WAV\", FALSE,       TRUE,      \"Monsters\\\\Gargoyle\\\\GarE.TRN\",    { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 2 }, \"Gargoyle\",                12,       16,     13,     60,     90, AI_GARG,                                                      MFLAG_CAN_OPEN_DOOR,    1,   65,      7,         10,         16,     0,       0,           0,           0,          45, MC_DEMON,    IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        6,  1205 },\r\n\t{    160,   1650, \"Monsters\\\\Gargoyle\\\\Gargo%c.CL2\",  TRUE,        \"Monsters\\\\Gargoyle\\\\Gargo%c%i.WAV\", FALSE,       TRUE,      \"Monsters\\\\Gargoyle\\\\GargBr.TRN\",  { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 0 }, \"Blood Claw\",              16,       20,     19,     75,    125, AI_GARG,                                                      MFLAG_CAN_OPEN_DOOR,    2,   80,      7,         14,         22,     0,       0,           0,           0,          50, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE  |                    IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        6,  1873 },\r\n\t{    160,   1650, \"Monsters\\\\Gargoyle\\\\Gargo%c.CL2\",  TRUE,        \"Monsters\\\\Gargoyle\\\\Gargo%c%i.WAV\", FALSE,       TRUE,      \"Monsters\\\\Gargoyle\\\\GargB.TRN\",   { 14, 14, 14, 10, 18, 14 }, { 0, 0, 0, 0, 0, 0 }, \"Death Wing\",              18,       22,     23,     90,    150, AI_GARG,                                                      MFLAG_CAN_OPEN_DOOR,    3,   95,      7,         16,         28,     0,       0,           0,           0,          60, MC_DEMON,    IMMUNE_MAGIC  |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        6,  2278 },\r\n\t{    160,   2220, \"Monsters\\\\Mega\\\\Mega%c.CL2\",       TRUE,        \"Monsters\\\\Mega\\\\Mega%c%i.WAV\",      TRUE,        FALSE,     NULL,                              {  6,  7, 14,  1, 24,  5 }, { 3, 0, 0, 0, 2, 0 }, \"Slayer\",                  19,       23,     20,    120,    140, AI_MEGA,                                       MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    0,  100,      8,         12,         20,     0,       3,           0,           0,          60, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE                                    , RESIST_MAGIC | IMMUNE_FIRE                                    ,         0,        7,  2300 },\r\n\t{    160,   2220, \"Monsters\\\\Mega\\\\Mega%c.CL2\",       TRUE,        \"Monsters\\\\Mega\\\\Mega%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Mega\\\\Guard.TRN\",       {  6,  7, 14,  1, 24,  5 }, { 3, 0, 0, 0, 2, 0 }, \"Guardian\",                21,       25,     22,    140,    160, AI_MEGA,                                       MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    1,  110,      8,         14,         22,     0,       3,           0,           0,          65, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE                                    , RESIST_MAGIC | IMMUNE_FIRE                                    ,         0,        7,  2714 },\r\n\t{    160,   2220, \"Monsters\\\\Mega\\\\Mega%c.CL2\",       TRUE,        \"Monsters\\\\Mega\\\\Mega%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Mega\\\\Vtexl.TRN\",       {  6,  7, 14,  1, 24,  5 }, { 3, 0, 0, 0, 2, 0 }, \"Vortex Lord\",             23,       26,     24,    160,    180, AI_MEGA,                                       MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,  120,      8,         18,         24,     0,       3,           0,           0,          70, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE  |                    IMMUNE_NULL_40, RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7,  3252 },\r\n\t{    160,   2220, \"Monsters\\\\Mega\\\\Mega%c.CL2\",       TRUE,        \"Monsters\\\\Mega\\\\Mega%c%i.WAV\",      TRUE,        TRUE,      \"Monsters\\\\Mega\\\\Balr.TRN\",        {  6,  7, 14,  1, 24,  5 }, { 3, 0, 0, 0, 2, 0 }, \"Balrog\",                  25,       29,     26,    180,    200, AI_MEGA,                                       MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,  130,      8,         22,         30,     0,       3,           0,           0,          75, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE  |                    IMMUNE_NULL_40, RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7,  3643 },\r\n\t{    160,   1270, \"Monsters\\\\Snake\\\\Snake%c.CL2\",     FALSE,       \"Monsters\\\\Snake\\\\Snake%c%i.WAV\",    FALSE,       FALSE,     NULL,                              { 12, 11, 13,  5, 18,  0 }, { 2, 0, 0, 0, 1, 0 }, \"Cave Viper\",              20,       24,     21,    100,    150, AI_SNAKE,                                      MFLAG_SEARCH                      ,    0,   90,      8,          8,         20,     0,       0,           0,           0,          60, MC_DEMON,    IMMUNE_MAGIC                                                  , IMMUNE_MAGIC                                                  ,         0,        7,  2725 },\r\n\t{    160,   1270, \"Monsters\\\\Snake\\\\Snake%c.CL2\",     FALSE,       \"Monsters\\\\Snake\\\\Snake%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Snake\\\\SnakR.TRN\",      { 12, 11, 13,  5, 18,  0 }, { 2, 0, 0, 0, 1, 0 }, \"Fire Drake\",              22,       26,     23,    120,    170, AI_SNAKE,                                      MFLAG_SEARCH                      ,    1,  105,      8,         12,         24,     0,       0,           0,           0,          65, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE                                   , IMMUNE_MAGIC  | IMMUNE_FIRE                                    ,         0,        7,  3139 },\r\n\t{    160,   1270, \"Monsters\\\\Snake\\\\Snake%c.CL2\",     FALSE,       \"Monsters\\\\Snake\\\\Snake%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Snake\\\\Snakg.TRN\",      { 12, 11, 13,  5, 18,  0 }, { 2, 0, 0, 0, 1, 0 }, \"Gold Viper\",              24,       27,     25,    140,    180, AI_SNAKE,                                      MFLAG_SEARCH                      ,    2,  120,      8,         15,         26,     0,       0,           0,           0,          70, MC_DEMON,    IMMUNE_MAGIC  |               RESIST_LIGHTNING                , IMMUNE_MAGIC  |               RESIST_LIGHTNING                ,         0,        7,  3540 },\r\n\t{    160,   1270, \"Monsters\\\\Snake\\\\Snake%c.CL2\",     FALSE,       \"Monsters\\\\Snake\\\\Snake%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Snake\\\\Snakb.TRN\",      { 12, 11, 13,  5, 18,  0 }, { 2, 0, 0, 0, 1, 0 }, \"Azure Drake\",             28,       30,     27,    160,    200, AI_SNAKE,                                      MFLAG_SEARCH                      ,    3,  130,      8,         18,         30,     0,       0,           0,           0,          75, MC_DEMON,                   RESIST_FIRE | RESIST_LIGHTNING                , IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING                 ,         0,        7,  3791 },\r\n\t{    160,   2120, \"Monsters\\\\Black\\\\Black%c.CL2\",     FALSE,       \"Monsters\\\\Black\\\\Black%c%i.WAV\",    FALSE,       FALSE,     NULL,                              {  8,  8, 16,  4, 24,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Black Knight\",            23,       27,     24,    150,    150, AI_SKELSD,                                     MFLAG_SEARCH                      ,    0,  110,      8,         15,         20,     0,       0,           0,           0,          75, MC_DEMON,    RESIST_MAGIC |               RESIST_LIGHTNING | IMMUNE_NULL_40, RESIST_MAGIC |               IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  3360 },\r\n\t{    160,   2120, \"Monsters\\\\Black\\\\Black%c.CL2\",     FALSE,       \"Monsters\\\\Black\\\\Black%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Black\\\\BlkKntRT.TRN\",   {  8,  8, 16,  4, 24,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Doom Guard\",              25,       29,     26,    165,    165, AI_SKELSD,                                     MFLAG_SEARCH                      ,    0,  130,      8,         18,         25,     0,       0,           0,           0,          75, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40, RESIST_MAGIC | IMMUNE_FIRE  |                    IMMUNE_NULL_40,         0,        7,  3650 },\r\n\t{    160,   2120, \"Monsters\\\\Black\\\\Black%c.CL2\",     FALSE,       \"Monsters\\\\Black\\\\Black%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Black\\\\BlkKntBT.TRN\",   {  8,  8, 16,  4, 24,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Steel Lord\",              27,       30,     28,    180,    180, AI_SKELSD,                                     MFLAG_SEARCH                      ,    1,  120,      8,         20,         30,     0,       0,           0,           0,          80, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7,  4252 },\r\n\t{    160,   2120, \"Monsters\\\\Black\\\\Black%c.CL2\",     FALSE,       \"Monsters\\\\Black\\\\Black%c%i.WAV\",    FALSE,       TRUE,      \"Monsters\\\\Black\\\\BlkKntBe.TRN\",   {  8,  8, 16,  4, 24,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Blood Knight\",            24,       26,     30,    200,    200, AI_SKELSD,                                     MFLAG_SEARCH                      ,    1,  130,      8,         25,         35,     0,       0,           0,           0,          85, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  5130 },\r\n#ifdef HELLFIRE\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\Shred%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"The Shredded\",            32,       35,     23,     70,     90, AI_SKELSD,    0                                                                  ,    0,   75,      7,          4,         12,     0,       0,           0,           0,          65, MC_UNDEAD,                  RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,                RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   900 },\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Hollow One\",              34,       37,     27,    135,    240, AI_SKELSD,    0                                                                  ,    1,   75,      7,         12,         24,     0,       0,           0,           0,          75, MC_UNDEAD,   IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,  4374 },\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Pain Master\",             36,       39,     29,    110,    200, AI_SKELSD,    0                                                                  ,    2,   80,      7,         16,         30,     0,       0,           0,           0,          80, MC_UNDEAD,   IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,  5147 },\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Reality Weaver\",          38,       39,     30,    135,    240, AI_SKELSD,    0                                                                  ,    3,   85,      7,         20,         35,     0,       0,           0,           0,          85, MC_UNDEAD,   RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40, RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        3,  5925 },\r\n#else\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Unraveler\",               26,       28,     25,     70,    150, AI_SKELSD,    0                                                                  ,    0,   75,      7,         10,         20,     0,       0,           0,           0,          70, MC_UNDEAD,   IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        3,  3812 },\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Hollow One\",              28,       30,     27,    135,    240, AI_SKELSD,    0                                                                  ,    1,   75,      7,         12,         24,     0,       0,           0,           0,          75, MC_UNDEAD,   IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,  4374 },\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Pain Master\",             27,       30,     29,    110,    200, AI_SKELSD,    0                                                                  ,    2,   80,      7,         16,         30,     0,       0,           0,           0,          80, MC_UNDEAD,   IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,  5147 },\r\n\t{     96,    484, \"Monsters\\\\Unrav\\\\Unrav%c.CL2\",     FALSE,       \"Monsters\\\\Acid\\\\Acid%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 10, 10, 12,  5, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Reality Weaver\",          28,       30,     30,    135,    240, AI_SKELSD,    0                                                                  ,    3,   85,      7,         20,         35,     0,       0,           0,           0,          85, MC_UNDEAD,   RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40, RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        3,  5925 },\r\n#endif\r\n\t{    128,    980, \"Monsters\\\\Succ\\\\Scbs%c.CL2\",       FALSE,       \"Monsters\\\\Succ\\\\Scbs%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 14,  8, 16,  7, 24,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Succubus\",                22,       26,     24,    120,    150, AI_SUCC,                                                      MFLAG_CAN_OPEN_DOOR,    0,  100,     10,          1,         20,     0,       0,           0,           0,          60, MC_DEMON,    RESIST_MAGIC                                                 , IMMUNE_MAGIC  | RESIST_FIRE                                   ,         0,        3,  3696 },\r\n\t{    128,    980, \"Monsters\\\\Succ\\\\Scbs%c.CL2\",       FALSE,       \"Monsters\\\\Succ\\\\Scbs%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Succ\\\\Succb.TRN\",       { 14,  8, 16,  7, 24,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Snow Witch\",              25,       28,     26,    135,    175, AI_SUCC,                                                      MFLAG_CAN_OPEN_DOOR,    1,  110,     10,          1,         24,     0,       0,           0,           0,          65, MC_DEMON,                                 RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  |               RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,  4084 },\r\n#ifdef HELLFIRE\r\n\t{    128,    980, \"Monsters\\\\Succ\\\\Scbs%c.CL2\",       FALSE,       \"Monsters\\\\Succ\\\\Scbs%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Succ\\\\Succrw.TRN\",      { 14,  8, 16,  7, 24,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Hell Spawn\",              27,       30,     28,    150,    200, AI_SUCC,                                       MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,  115,     10,          1,         30,     0,       0,           0,           0,          75, MC_ANIMAL,   RESIST_MAGIC |               IMMUNE_LIGHTNING                 , IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        3,  4480 },\r\n#else\r\n\t{    128,    980, \"Monsters\\\\Succ\\\\Scbs%c.CL2\",       FALSE,       \"Monsters\\\\Succ\\\\Scbs%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Succ\\\\Succrw.TRN\",      { 14,  8, 16,  7, 24,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Hell Spawn\",              27,       30,     28,    150,    200, AI_SUCC,                                       MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    2,  115,     10,          1,         30,     0,       0,           0,           0,          75, MC_DEMON,    RESIST_MAGIC |               IMMUNE_LIGHTNING                 , IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        3,  4480 },\r\n#endif\r\n\t{    128,    980, \"Monsters\\\\Succ\\\\Scbs%c.CL2\",       FALSE,       \"Monsters\\\\Succ\\\\Scbs%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Succ\\\\Succbw.TRN\",      { 14,  8, 16,  7, 24,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Soul Burner\",             28,       30,     30,    140,    225, AI_SUCC,                                       MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,  120,     10,          1,         35,     0,       0,           0,           0,          85, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING                 ,         0,        3,  4644 },\r\n\t{    128,   2000, \"Monsters\\\\Mage\\\\Mage%c.CL2\",       TRUE,        \"Monsters\\\\Mage\\\\Mage%c%i.WAV\",      FALSE,       FALSE,     NULL,                              { 12,  1, 20,  8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, \"Counselor\",               24,       26,     25,     70,     70, AI_COUNSLR,                                                   MFLAG_CAN_OPEN_DOOR,    0,   90,      8,          8,         20,     0,       0,           0,           0,           0, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                ,         0,        7,  4070 },\r\n\t{    128,   2000, \"Monsters\\\\Mage\\\\Mage%c.CL2\",       TRUE,        \"Monsters\\\\Mage\\\\Mage%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Mage\\\\Cnselg.TRN\",      { 12,  1, 20,  8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, \"Magistrate\",              26,       28,     27,     85,     85, AI_COUNSLR,                                                   MFLAG_CAN_OPEN_DOOR,    1,  100,      8,         10,         24,     0,       0,           0,           0,           0, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7,  4478 },\r\n\t{    128,   2000, \"Monsters\\\\Mage\\\\Mage%c.CL2\",       TRUE,        \"Monsters\\\\Mage\\\\Mage%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Mage\\\\Cnselgd.TRN\",     { 12,  1, 20,  8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, \"Cabalist\",                28,       30,     29,    120,    120, AI_COUNSLR,                                                   MFLAG_CAN_OPEN_DOOR,    2,  110,      8,         14,         30,     0,       0,           0,           0,           0, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  4929 },\r\n\t{    128,   2000, \"Monsters\\\\Mage\\\\Mage%c.CL2\",       TRUE,        \"Monsters\\\\Mage\\\\Mage%c%i.WAV\",      FALSE,       TRUE,      \"Monsters\\\\Mage\\\\Cnselbk.TRN\",     { 12,  1, 20,  8, 28, 20 }, { 0, 0, 0, 0, 0, 0 }, \"Advocate\",                30,       30,     30,    145,    145, AI_COUNSLR,                                                   MFLAG_CAN_OPEN_DOOR,    3,  120,      8,         15,         25,     0,       0,           0,           0,           0, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  4968 },\r\n\t{     96,    386, \"Monsters\\\\Golem\\\\Golem%c.CL2\",     TRUE,        \"Monsters\\\\Golem\\\\Golm%c%i.WAV\",     FALSE,       FALSE,     NULL,                              {  0, 16, 12,  0, 12, 20 }, { 0, 0, 0, 0, 0, 0 }, \"Golem\",                    0,        0,     12,      1,      1, AI_GOLUM,                                                     MFLAG_CAN_OPEN_DOOR,    0,    0,      7,          1,          1,     0,       0,           0,           0,           1, MC_DEMON,    0                                                            , 0                                                            ,         0,        0,     0 },\r\n#ifdef HELLFIRE\r\n\t{    160,   2000, \"Monsters\\\\Diablo\\\\Diablo%c.CL2\",   TRUE,        \"Monsters\\\\Diablo\\\\Diablo%c%i.WAV\",  TRUE,        FALSE,     NULL,                              { 16,  6, 16,  2, 16, 16 }, { 0, 0, 0, 0, 0, 0 }, \"The Dark Lord\",           50,       50,     45,   3333,   3333, AI_DIABLO,                   MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,  220,      4,         30,         60,     0,      11,           0,           0,          90, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7,  31666 },\r\n\t{    128,   1060, \"Monsters\\\\DarkMage\\\\Dmage%c.CL2\",  TRUE,        \"Monsters\\\\DarkMage\\\\Dmag%c%i.WAV\",  FALSE,       FALSE,     NULL,                              {  6,  1, 21,  6, 23, 18 }, { 0, 0, 0, 0, 0, 0 }, \"The Arch-Litch Malignus\", 40,       41,     30,    160,    160, AI_COUNSLR,                                                   MFLAG_CAN_OPEN_DOOR,    3,  120,      8,         20,         40,     0,       0,           0,           0,          70, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  4968 },\r\n\t{    188,    800, \"Monsters\\\\Fork\\\\Fork%c.CL2\",       FALSE,       \"Monsters\\\\newsfx\\\\HBoar%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 10, 10, 15,  6, 16,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Hellboar\",                32,       35,     23,     80,    100, AI_SKELSD,                   MFLAG_KNOCKBACK | MFLAG_SEARCH                      ,    2,   70,      7,         16,         24,     0,       0,           0,           0,          60, MC_DEMON,    0                                                            ,                RESIST_FIRE | RESIST_LIGHTNING                ,         0,        3,   750 },\r\n\t{     64,    305, \"Monsters\\\\Scorp\\\\Scorp%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\Stingr%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 10, 10, 12,  6, 15,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Stinger\",                 32,       35,     22,     30,     40, AI_SKELSD,    0                                                                  ,    3,   85,      8,          1,         20,     0,       0,           0,           0,          50, MC_ANIMAL,   0                                                            ,                              RESIST_LIGHTNING                ,         0,        1,   500 },\r\n\t{    156,    800, \"Monsters\\\\Eye\\\\Eye%c.CL2\",         FALSE,       \"Monsters\\\\newsfx\\\\psyco%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 12, 13, 13,  7, 21,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Psychorb\",                32,       35,     22,     20,     30, AI_PSYCHORB,  0                                                                  ,    3,   80,      8,         10,         10,     0,       0,           0,           0,          40, MC_ANIMAL,   0                                                            ,                RESIST_FIRE                                   ,         0,        6,   450 },\r\n\t{    148,    800, \"Monsters\\\\Spider\\\\Spider%c.CL2\",   FALSE,       \"Monsters\\\\newsfx\\\\SLord%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 12, 10, 15,  6, 20,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Arachnon\",                32,       35,     22,     60,     80, AI_SKELSD,                                     MFLAG_SEARCH                      ,    3,   50,      8,          5,         15,     0,       0,           0,           0,          50, MC_ANIMAL,   0                                                            ,                              RESIST_LIGHTNING                ,         0,        7,   500 },\r\n\t{    128,    800, \"Monsters\\\\TSneak\\\\TSneak%c.CL2\",   FALSE,       \"Monsters\\\\newsfx\\\\FTwin%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 13, 13, 15, 11, 16,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Felltwin\",                32,       35,     22,     50,     70, AI_SKELSD,                                     MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,   70,      8,         10,         18,     0,       0,           0,           0,          50, MC_DEMON,                                                    IMMUNE_NULL_40,                RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        3,   600 },\r\n\t{    164,    520, \"Monsters\\\\Spawn\\\\Spawn%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\HSpawn%c%i.WAV\",  TRUE,        FALSE,     NULL,                              { 15, 12, 14, 11, 14,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Hork Spawn\",              34,       37,     22,     30,     30, AI_SKELSD,    0                                                                  ,    3,   60,      8,         10,         25,     0,       0,           0,           0,          25, MC_DEMON,    RESIST_MAGIC                                                 , RESIST_MAGIC                                                 ,         0,        3,   250 },\r\n\t{     86,    305, \"Monsters\\\\WScorp\\\\WScorp%c.CL2\",   FALSE,       \"Monsters\\\\newsfx\\\\Stingr%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 10, 10, 12,  6, 15,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Venomtail\",               36,       39,     24,     40,     50, AI_SKELSD,    0                                                                  ,    3,   85,      8,          1,         30,     0,       0,           0,           0,          60, MC_ANIMAL,                                RESIST_LIGHTNING                ,                              IMMUNE_LIGHTNING                 ,         0,        1,  1000 },\r\n\t{    140,    800, \"Monsters\\\\Eye2\\\\Eye2%c.CL2\",       FALSE,       \"Monsters\\\\newsfx\\\\Psyco%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 12, 13, 13,  7, 21,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Necromorb\",               36,       39,     24,     30,     40, AI_NECROMORB, 0                                                                  ,    3,   80,      8,         20,         20,     0,       0,           0,           0,          50, MC_ANIMAL,                  RESIST_FIRE                                   ,                IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        6,  1100 },\r\n\t{    148,    800, \"Monsters\\\\bSpidr\\\\bSpidr%c.CL2\",   TRUE,        \"Monsters\\\\newsfx\\\\SLord%c%i.WAV\",   TRUE,        FALSE,     NULL,                              { 12, 10, 15,  6, 20, 10 }, { 2, 0, 0, 0, 0, 0 }, \"Spider Lord\",             36,       39,     24,     80,    100, AI_ACID,                                       MFLAG_SEARCH                      ,    3,   60,      8,          8,         20,    75,       8,          10,          10,          60, MC_ANIMAL,                                RESIST_LIGHTNING                ,                RESIST_FIRE | IMMUNE_LIGHTNING                 ,         0,        7,  1250 },\r\n\t{    176,    800, \"Monsters\\\\Clasp\\\\Clasp%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\Lworm%c%i.WAV\",   FALSE,       FALSE,     NULL,                              { 10, 12, 15,  6, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Lashworm\",                36,       39,     20,     30,     30, AI_SKELSD,    0                                                                  ,    3,   90,      8,         12,         20,     0,       0,           0,           0,          50, MC_ANIMAL,   0                                                            ,                RESIST_FIRE                                   ,         0,        3,   600 },\r\n\t{    192,    800, \"Monsters\\\\AntWorm\\\\Worm%c.CL2\",    FALSE,       \"Monsters\\\\newsfx\\\\TchAnt%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 14, 12, 12,  6, 20,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Torchant\",                36,       39,     22,     60,     80, AI_TORCHANT,  0                                                                  ,    3,   75,      8,         20,         30,     0,       0,           0,           0,          70, MC_ANIMAL,                  IMMUNE_FIRE                                    , RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        7,  1250 },\r\n\t{    138,    800, \"Monsters\\\\HorkD\\\\HorkD%c.CL2\",     TRUE,        \"Monsters\\\\newsfx\\\\HDemon%c%i.WAV\",  TRUE,        FALSE,     NULL,                              { 15,  8, 16,  6, 16,  9 }, { 2, 0, 0, 0, 0, 2 }, \"Hork Demon\",              36,       37,     27,    120,    160, AI_SKELSD,    0                                                                  ,    3,   60,      8,         20,         35,    80,       8,           0,           0,          80, MC_DEMON,                                 RESIST_LIGHTNING                , RESIST_MAGIC |               IMMUNE_LIGHTNING                 ,         0,        7,  2000 },\r\n\t{    198,    800, \"Monsters\\\\Hellbug\\\\Hellbg%c.CL2\",  TRUE,        \"Monsters\\\\newsfx\\\\Defile%c%i.WAV\",  TRUE,        FALSE,     NULL,                              {  8,  8, 14,  6, 14, 12 }, { 0, 0, 0, 0, 0, 0 }, \"Hell Bug\",                38,       39,     30,    240,    240, AI_SKELSD,                                     MFLAG_SEARCH                      ,    3,  110,      8,         20,         30,    90,       8,          50,          60,          80, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING                 , RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING                 ,         0,        7,  5000 },\r\n\t{    124,    800, \"Monsters\\\\Gravdg\\\\Gravdg%c.CL2\",   TRUE,        \"Monsters\\\\newsfx\\\\GDiggr%c%i.WAV\",  TRUE,        FALSE,     NULL,                              { 24, 24, 12,  6, 16, 16 }, { 2, 0, 0, 0, 0, 0 }, \"Gravedigger\",             40,       41,     26,    120,    240, AI_SCAV,                                                      MFLAG_CAN_OPEN_DOOR,    3,   80,      6,          2,         12,     0,       0,           0,           0,          20, MC_UNDEAD,                                IMMUNE_LIGHTNING  | IMMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        3,  2000 },\r\n\t{    104,    550, \"Monsters\\\\Rat\\\\Rat%c.CL2\",         FALSE,       \"Monsters\\\\newsfx\\\\TmbRat%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 11,  8, 12,  6, 20,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Tomb Rat\",                40,       43,     24,     80,    120, AI_SKELSD,    0                                                                  ,    3,  120,      8,         12,         25,     0,       0,           0,           0,          30, MC_ANIMAL,   0                                                            ,                RESIST_FIRE | RESIST_LIGHTNING                ,         0,        3,  1800 },\r\n\t{     96,    550, \"Monsters\\\\Hellbat\\\\Helbat%c.CL2\",  FALSE,       \"Monsters\\\\newsfx\\\\HelBat%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 18, 16, 14,  6, 18, 11 }, { 2, 0, 0, 0, 0, 0 }, \"Firebat\",                 40,       43,     24,     60,     80, AI_FIREBAT,   0                                                                  ,    3,  100,      8,         15,         20,     0,       0,           0,           0,          70, MC_ANIMAL,                  IMMUNE_FIRE                                    , RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        7,  2400 },\r\n\t{    128,   1740, \"Monsters\\\\Demskel\\\\Demskl%c.CL2\",  TRUE,        \"Monsters\\\\newsfx\\\\SWing%c%i.WAV\",   FALSE,       FALSE,     \"Monsters\\\\Thin\\\\Thinv3.TRN\",      { 10,  8, 20,  6, 24, 16 }, { 3, 0, 0, 0, 0, 0 }, \"Skullwing\",               40,       43,     27,     70,     70, AI_SKELSD,    0                                                                  ,    0,   75,      7,         15,         20,    75,       9,          15,          20,          80, MC_UNDEAD,                  RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,                RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7,  3000 },\r\n\t{     96,    800, \"Monsters\\\\Lich\\\\Lich%c.CL2\",       FALSE,       \"Monsters\\\\newsfx\\\\Lich%c%i.WAV\",    TRUE,        FALSE,     NULL,                              { 12, 10, 10,  7, 21,  0 }, { 2, 0, 0, 0, 2, 0 }, \"Lich\",                    40,       43,     25,     80,    100, AI_LICH,      0                                                                  ,    3,  100,      8,         15,         20,     0,       0,           0,           0,          60, MC_UNDEAD,                                RESIST_LIGHTNING | IMMUNE_NULL_40, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        3,  3000 },\r\n\t{    154,    800, \"Monsters\\\\Bubba\\\\Bubba%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\Crypt%c%i.WAV\",   TRUE,        FALSE,     NULL,                              {  8, 18, 12,  8, 21,  0 }, { 3, 0, 0, 0, 0, 0 }, \"Crypt Demon\",             42,       45,     28,    200,    240, AI_SKELSD,    0                                                                  ,    3,  100,      8,         20,         40,     0,       0,           0,           0,          85, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                ,         0,        3,  3200 },\r\n\t{     96,    550, \"Monsters\\\\Hellbat2\\\\bhelbt%c.CL2\", TRUE,        \"Monsters\\\\newsfx\\\\HelBat%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 18, 16, 14,  6, 18, 11 }, { 2, 0, 0, 0, 0, 0 }, \"Hellbat\",                 44,       47,     29,    100,    140, AI_TORCHANT,  0                                                                  ,    3,  110,      8,         30,         30,     0,       0,           0,           0,          80, MC_DEMON,    RESIST_MAGIC | IMMUNE_FIRE  | RESIST_LIGHTNING                , RESIST_MAGIC | IMMUNE_FIRE  | IMMUNE_LIGHTNING                 ,         0,        7,  3600 },\r\n\t{    128,   1740, \"Monsters\\\\Demskel\\\\Demskl%c.CL2\",  TRUE,        \"Monsters\\\\newsfx\\\\SWing%c%i.WAV\",   TRUE,        FALSE,     \"Monsters\\\\Thin\\\\Thinv3.TRN\",      { 10,  8, 20,  6, 24, 16 }, { 3, 0, 0, 0, 0, 0 }, \"Bone Demon\",              44,       47,     30,    240,    280, AI_BONEDEMON, 0                                                                  ,    0,  100,      8,         40,         50,   160,      12,          50,          50,          50, MC_UNDEAD,                  IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,                IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  5000 },\r\n\t{    136,    800, \"Monsters\\\\Lich2\\\\Lich2%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\Lich%c%i.WAV\",    TRUE,        FALSE,     NULL,                              { 12, 10, 10,  7, 21,  0 }, { 2, 0, 0, 0, 2, 0 }, \"Arch Lich\",               44,       47,     30,    180,    200, AI_ARCHLICH,  0                                                                  ,    3,  120,      8,         30,         30,     0,       0,           0,           0,          75, MC_UNDEAD,   RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING  | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        3,  4000 },\r\n\t{    180,    800, \"Monsters\\\\Byclps\\\\Byclps%c.CL2\",   FALSE,       \"Monsters\\\\newsfx\\\\Biclop%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 10, 11, 16,  6, 16,  0 }, { 2, 0, 0, 0, 2, 0 }, \"Biclops\",                 44,       47,     30,    200,    240, AI_SKELSD,                   MFLAG_KNOCKBACK |                MFLAG_CAN_OPEN_DOOR,    3,   90,      8,         40,         50,     0,       0,           0,           0,          80, MC_DEMON,                                 RESIST_LIGHTNING                ,                RESIST_FIRE | RESIST_LIGHTNING                ,         0,        3,  4000 },\r\n\t{    164,    800, \"Monsters\\\\Flesh\\\\Flesh%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\FleshT%c%i.WAV\",  TRUE,        FALSE,     NULL,                              { 15, 24, 15,  6, 16,  0 }, { 0, 0, 0, 0, 0, 0 }, \"Flesh Thing\",             44,       47,     28,    300,    400, AI_SKELSD,    0                                                                  ,    3,  150,      8,         12,         18,     0,       0,           0,           0,          70, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                , RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                ,         0,        3,  4000 },\r\n\t{    180,    800, \"Monsters\\\\Reaper\\\\Reap%c.CL2\",     FALSE,       \"Monsters\\\\newsfx\\\\Reaper%c%i.WAV\",  FALSE,       FALSE,     NULL,                              { 12, 10, 14,  6, 16,  0 }, { 2, 0, 0, 0, 0, 0 }, \"Reaper\",                  44,       47,     30,    260,    300, AI_SKELSD,    0                                                                  ,    3,  120,      8,         30,         35,     0,       0,           0,           0,          90, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING                , IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING                 ,         0,        3,  6000 },\r\n\t{    226,   1200, \"Monsters\\\\Nkr\\\\Nkr%c.CL2\",         TRUE,        \"Monsters\\\\newsfx\\\\Nakrul%c%i.WAV\",  TRUE,        FALSE,     NULL,                              {  2,  6, 16,  3, 16, 16 }, { 0, 0, 0, 0, 0, 0 }, \"Na-Krul\",                 60,       60,     40,   1332,   1332, AI_SKELSD,                   MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,  150,      7,         40,         50,   150,      10,          40,          50,         125, MC_DEMON,    IMMUNE_MAGIC  | IMMUNE_FIRE  | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7, 13333 },\r\n#else\r\n\t{    160,   2000, \"Monsters\\\\Diablo\\\\Diablo%c.CL2\",   TRUE,        \"Monsters\\\\Diablo\\\\Diablo%c%i.WAV\",  TRUE,        FALSE,     NULL,                              { 16,  6, 16,  6, 16, 16 }, { 0, 0, 0, 0, 0, 0 }, \"The Dark Lord\",           50,       50,     30,   1666,   1666, AI_DIABLO,                   MFLAG_KNOCKBACK | MFLAG_SEARCH | MFLAG_CAN_OPEN_DOOR,    3,  220,      4,         30,         60,     0,      11,           0,           0,          90, MC_DEMON,    IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,         0,        7, 31666 },\r\n\t{    128,   1060, \"Monsters\\\\DarkMage\\\\Dmage%c.CL2\",  TRUE,        \"Monsters\\\\DarkMage\\\\Dmag%c%i.WAV\",  FALSE,       FALSE,     NULL,                              {  6,  1, 21,  6, 23, 18 }, { 0, 0, 0, 0, 0, 0 }, \"The Arch-Litch Malignus\", 30,       30,     30,    160,    160, AI_COUNSLR,                                                   MFLAG_CAN_OPEN_DOOR,    3,  120,      8,         20,         40,     0,       0,           0,           0,          70, MC_DEMON,    RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40, IMMUNE_MAGIC  | IMMUNE_FIRE  | IMMUNE_LIGHTNING  | IMMUNE_NULL_40,         0,        7,  4968 },\r\n#endif\r\n\t// clang-format on\r\n};\r\n\r\n/**\r\n * Map between .DUN file value and monster type enum\r\n */\r\n#ifdef HELLFIRE\r\nint MonstConvTbl[] = {\r\n#else\r\nchar MonstConvTbl[] = {\r\n#endif\r\n\tMT_NZOMBIE,\r\n\tMT_BZOMBIE,\r\n\tMT_GZOMBIE,\r\n\tMT_YZOMBIE,\r\n\tMT_RFALLSP,\r\n\tMT_DFALLSP,\r\n\tMT_YFALLSP,\r\n\tMT_BFALLSP,\r\n\tMT_WSKELAX,\r\n\tMT_TSKELAX,\r\n\tMT_RSKELAX,\r\n\tMT_XSKELAX,\r\n\tMT_RFALLSD,\r\n\tMT_DFALLSD,\r\n\tMT_YFALLSD,\r\n\tMT_BFALLSD,\r\n\tMT_NSCAV,\r\n\tMT_BSCAV,\r\n\tMT_WSCAV,\r\n\tMT_YSCAV,\r\n\tMT_WSKELBW,\r\n\tMT_TSKELBW,\r\n\tMT_RSKELBW,\r\n\tMT_XSKELBW,\r\n\tMT_WSKELSD,\r\n\tMT_TSKELSD,\r\n\tMT_RSKELSD,\r\n\tMT_XSKELSD,\r\n\tMT_SNEAK,\r\n\tMT_STALKER,\r\n\tMT_UNSEEN,\r\n\tMT_ILLWEAV,\r\n\tMT_NGOATMC,\r\n\tMT_BGOATMC,\r\n\tMT_RGOATMC,\r\n\tMT_GGOATMC,\r\n\tMT_FIEND,\r\n\tMT_GLOOM,\r\n\tMT_BLINK,\r\n\tMT_FAMILIAR,\r\n\tMT_NGOATBW,\r\n\tMT_BGOATBW,\r\n\tMT_RGOATBW,\r\n\tMT_GGOATBW,\r\n\tMT_NACID,\r\n\tMT_RACID,\r\n\tMT_BACID,\r\n\tMT_XACID,\r\n\tMT_SKING,\r\n\tMT_FAT,\r\n\tMT_MUDMAN,\r\n\tMT_TOAD,\r\n\tMT_FLAYED,\r\n\tMT_WYRM,\r\n\tMT_CAVSLUG,\r\n\tMT_DEVOUR,\r\n\tMT_DVLWYRM,\r\n\tMT_NMAGMA,\r\n\tMT_YMAGMA,\r\n\tMT_BMAGMA,\r\n\tMT_WMAGMA,\r\n\tMT_HORNED,\r\n\tMT_MUDRUN,\r\n\tMT_FROSTC,\r\n\tMT_OBLORD,\r\n\tMT_BONEDMN,\r\n\tMT_REDDTH,\r\n\tMT_LTCHDMN,\r\n\tMT_UDEDBLRG,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tMT_INCIN,\r\n\tMT_FLAMLRD,\r\n\tMT_DOOMFIRE,\r\n\tMT_HELLBURN,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tMT_RSTORM,\r\n\tMT_STORM,\r\n\tMT_STORML,\r\n\tMT_MAEL,\r\n\tMT_WINGED,\r\n\tMT_GARGOYLE,\r\n\tMT_BLOODCLW,\r\n\tMT_DEATHW,\r\n\tMT_MEGA,\r\n\tMT_GUARD,\r\n\tMT_VTEXLRD,\r\n\tMT_BALROG,\r\n\tMT_NSNAKE,\r\n\tMT_RSNAKE,\r\n\tMT_GSNAKE,\r\n\tMT_BSNAKE,\r\n\tMT_NBLACK,\r\n\tMT_RTBLACK,\r\n\tMT_BTBLACK,\r\n\tMT_RBLACK,\r\n\tMT_UNRAV,\r\n\tMT_HOLOWONE,\r\n\tMT_PAINMSTR,\r\n\tMT_REALWEAV,\r\n\tMT_SUCCUBUS,\r\n\tMT_SNOWWICH,\r\n\tMT_HLSPWN,\r\n\tMT_SOLBRNR,\r\n\tMT_COUNSLR,\r\n\tMT_MAGISTR,\r\n\tMT_CABALIST,\r\n\tMT_ADVOCATE,\r\n\t0,\r\n\tMT_DIABLO,\r\n\t0,\r\n\tMT_GOLEM,\r\n\t0,\r\n\t0,\r\n\t0, // Monster from blood1.dun and blood2.dun\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0, // Snotspill from banner2.dun\r\n\t0,\r\n\t0,\r\n\tMT_BIGFALL,\r\n\tMT_DARKMAGE,\r\n#ifdef HELLFIRE\r\n\tMT_HELLBOAR,\r\n\tMT_STINGER,\r\n\tMT_PSYCHORB,\r\n\tMT_ARACHNON,\r\n\tMT_FELLTWIN,\r\n\tMT_HORKSPWN,\r\n\tMT_STINGER,\r\n\tMT_PSYCHORB,\r\n\tMT_ARACHNON,\r\n\tMT_LASHWORM,\r\n\tMT_TORCHANT,\r\n\tMT_HORKDMN,\r\n\tMT_DEFILER,\r\n\tMT_GRAVEDIG,\r\n\tMT_TOMBRAT,\r\n\tMT_FIREBAT,\r\n\tMT_SKLWING,\r\n\tMT_LICH,\r\n\tMT_CRYPTDMN,\r\n\tMT_FIREBAT,\r\n\tMT_SKLWING,\r\n\tMT_LICH,\r\n\tMT_BICLOPS,\r\n\tMT_FLESTHNG,\r\n\tMT_REAPER,\r\n\tMT_NAKRUL,\r\n#endif\r\n};\r\n\r\n#define MAT_NEVER 0\r\n#define MAT_ALWAYS 1\r\n#define MAT_RETAIL 2\r\n/**\r\n * Define what version a monster type is available in\r\n */\r\n#ifdef HELLFIRE\r\nint MonstAvailTbl[] = {\r\n#else\r\nchar MonstAvailTbl[] = {\r\n#endif\r\n\tMAT_ALWAYS, // Zombie\r\n\tMAT_ALWAYS, // Ghoul\r\n\tMAT_ALWAYS, // Rotting Carcass\r\n\tMAT_ALWAYS, // Black Death\r\n\tMAT_ALWAYS, // Fallen One\r\n\tMAT_ALWAYS, // Carver\r\n\tMAT_ALWAYS, // Devil Kin\r\n\tMAT_ALWAYS, // Dark One\r\n\tMAT_ALWAYS, // Skeleton\r\n\tMAT_ALWAYS, // Corpse Axe\r\n\tMAT_ALWAYS, // Burning Dead\r\n\tMAT_ALWAYS, // Horror\r\n\tMAT_ALWAYS, // Fallen One\r\n\tMAT_ALWAYS, // Carver\r\n\tMAT_ALWAYS, // Devil Kin\r\n\tMAT_ALWAYS, // Dark One\r\n\tMAT_ALWAYS, // Scavenger\r\n\tMAT_ALWAYS, // Plague Eater\r\n\tMAT_ALWAYS, // Shadow Beast\r\n\tMAT_ALWAYS, // Bone Gasher\r\n\tMAT_ALWAYS, // Skeleton\r\n\tMAT_ALWAYS, // Corpse Bow\r\n\tMAT_ALWAYS, // Burning Dead\r\n\tMAT_ALWAYS, // Horror\r\n\tMAT_ALWAYS, // Skeleton Captain\r\n\tMAT_ALWAYS, // Corpse Captain\r\n\tMAT_ALWAYS, // Burning Dead Captain\r\n\tMAT_ALWAYS, // Horror Captain\r\n\tMAT_NEVER,  // Invisible Lord\r\n\tMAT_RETAIL, // Hidden\r\n\tMAT_RETAIL, // Stalker\r\n\tMAT_RETAIL, // Unseen\r\n\tMAT_RETAIL, // Illusion Weaver\r\n#ifdef HELLFIRE\r\n\tMAT_RETAIL, // Satyr Lord\r\n#else\r\n\tMAT_NEVER, // Lord Sayter\r\n#endif\r\n\tMAT_RETAIL, // Flesh Clan\r\n\tMAT_RETAIL, // Stone Clan\r\n\tMAT_RETAIL, // Fire Clan\r\n\tMAT_RETAIL, // Night Clan\r\n\tMAT_ALWAYS, // Fiend\r\n\tMAT_ALWAYS, // Blink\r\n\tMAT_ALWAYS, // Gloom\r\n\tMAT_ALWAYS, // Familiar\r\n\tMAT_RETAIL, // Flesh Clan\r\n\tMAT_RETAIL, // Stone Clan\r\n\tMAT_RETAIL, // Fire Clan\r\n\tMAT_RETAIL, // Night Clan\r\n\tMAT_RETAIL, // Acid Beast\r\n\tMAT_RETAIL, // Poison Spitter\r\n\tMAT_RETAIL, // Pit Beast\r\n\tMAT_RETAIL, // Lava Maw\r\n\tMAT_NEVER,  // Skeleton King\r\n\tMAT_NEVER,  // The Butcher\r\n\tMAT_RETAIL, // Overlord\r\n\tMAT_RETAIL, // Mud Man\r\n\tMAT_RETAIL, // Toad Demon\r\n\tMAT_RETAIL, // Flayed One\r\n\tMAT_NEVER,  // Wyrm\r\n\tMAT_NEVER,  // Cave Slug\r\n\tMAT_NEVER,  // Devil Wyrm\r\n\tMAT_NEVER,  // Devourer\r\n\tMAT_RETAIL, // Magma Demon\r\n\tMAT_RETAIL, // Blood Stone\r\n\tMAT_RETAIL, // Hell Stone\r\n\tMAT_RETAIL, // Lava Lord\r\n\tMAT_RETAIL, // Horned Demon\r\n\tMAT_RETAIL, // Mud Runner\r\n\tMAT_RETAIL, // Frost Charger\r\n\tMAT_RETAIL, // Obsidian Lord\r\n\tMAT_NEVER,  // Bone Demon (oldboned in Hellfire)\r\n\tMAT_NEVER,  // Red Death\r\n\tMAT_NEVER,  // Litch Demon\r\n\tMAT_NEVER,  // Undead Balrog\r\n\tMAT_NEVER,  // Incinerator\r\n\tMAT_NEVER,  // Flame Lord\r\n\tMAT_NEVER,  // Doom Fire\r\n\tMAT_NEVER,  // Hell Burner\r\n\tMAT_RETAIL, // Red Storm\r\n\tMAT_RETAIL, // Storm Rider\r\n\tMAT_RETAIL, // Storm Lord\r\n\tMAT_RETAIL, // Maelstorm\r\n#ifdef HELLFIRE\r\n\tMAT_RETAIL, // Devil Kin Brute\r\n#else\r\n\tMAT_NEVER, // Devil Kin Brute\r\n#endif\r\n\tMAT_RETAIL, // Winged-Demon\r\n\tMAT_RETAIL, // Gargoyle\r\n\tMAT_RETAIL, // Blood Claw\r\n\tMAT_RETAIL, // Death Wing\r\n\tMAT_RETAIL, // Slayer\r\n\tMAT_RETAIL, // Guardian\r\n\tMAT_RETAIL, // Vortex Lord\r\n\tMAT_RETAIL, // Balrog\r\n\tMAT_RETAIL, // Cave Viper\r\n\tMAT_RETAIL, // Fire Drake\r\n\tMAT_RETAIL, // Gold Viper\r\n\tMAT_RETAIL, // Azure Drake\r\n\tMAT_RETAIL, // Black Knight\r\n\tMAT_RETAIL, // Doom Guard\r\n\tMAT_RETAIL, // Steel Lord\r\n\tMAT_RETAIL, // Blood Knight\r\n#ifdef HELLFIRE\r\n\tMAT_RETAIL, // The Shredded\r\n#else\r\n\tMAT_NEVER, // Unraveler\r\n#endif\r\n\tMAT_NEVER,  // Hollow One\r\n\tMAT_NEVER,  // Pain Master\r\n\tMAT_NEVER,  // Reality Weaver\r\n\tMAT_RETAIL, // Succubus\r\n\tMAT_RETAIL, // Snow Witch\r\n\tMAT_RETAIL, // Hell Spawn\r\n\tMAT_RETAIL, // Soul Burner\r\n\tMAT_RETAIL, // Counselor\r\n\tMAT_RETAIL, // Magistrate\r\n\tMAT_RETAIL, // Cabalist\r\n\tMAT_RETAIL, // Advocate\r\n\tMAT_NEVER,  // Golem\r\n\tMAT_NEVER,  // The Dark Lord\r\n\tMAT_NEVER,  // The Arch-Litch Malignus\r\n#ifdef HELLFIRE\r\n\tMAT_RETAIL, // Hellboar\r\n\tMAT_RETAIL, // Stinger\r\n\tMAT_RETAIL, // Psychorb\r\n\tMAT_RETAIL, // Arachnon\r\n\tMAT_RETAIL, // Felltwin\r\n\tMAT_RETAIL, // Hork Spawn\r\n\tMAT_RETAIL, // Venomtail\r\n\tMAT_RETAIL, // Necromorb\r\n\tMAT_RETAIL, // Spider Lord\r\n\tMAT_RETAIL, // Lashworm\r\n\tMAT_RETAIL, // Torchant\r\n\tMAT_NEVER,  // Hork Demon\r\n\tMAT_NEVER,  // Hell Bug\r\n\tMAT_RETAIL, // Gravedigger\r\n\tMAT_RETAIL, // Tomb Rat\r\n\tMAT_RETAIL, // Firebat\r\n\tMAT_RETAIL, // Skullwing\r\n\tMAT_RETAIL, // Lich\r\n\tMAT_RETAIL, // Crypt Demon\r\n\tMAT_RETAIL, // Hellbat\r\n\tMAT_RETAIL, // Bone Demon\r\n\tMAT_RETAIL, // Arch Lich\r\n\tMAT_RETAIL, // Biclops\r\n\tMAT_RETAIL, // Flesh Thing\r\n\tMAT_RETAIL, // Reaper\r\n\tMAT_NEVER,  // Na-Krul\r\n#endif\r\n};\r\n/** Contains the data related to each unique monster ID. */\r\nUniqMonstStruct UniqMonst[] = {\r\n\t// clang-format off\r\n\t// mtype,       mName,                      mTrnName,    mlevel, mmaxhp, mAi,      mint, mMinDamage, mMaxDamage, mMagicRes,                                                     mUnqAttr, mUnqVar1, mUnqVar2, mtalkmsg\r\n\t{  MT_NGOATMC,  \"Gharbad the Weak\",         \"BSDB\",        4,    120, AI_GARBUD,   3,          8,         16,                              IMMUNE_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, TEXT_GARBUD1   },\r\n\t{  MT_SKING,    \"Skeleton King\",            \"GENRL\",       0,    240, AI_SKELKING, 3,          6,         16, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        1,        0,        0, 0              },\r\n\t{  MT_COUNSLR,  \"Zhar the Mad\",             \"GENERAL\",     8,    360, AI_ZHAR,     3,         16,         40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                 ,        0,        0,        0, TEXT_ZHAR1     },\r\n\t{  MT_BFALLSP,  \"Snotspill\",                \"BNG\",         4,    220, AI_SNOTSPIL, 3,         10,         18,                              RESIST_LIGHTNING                 ,        0,        0,        0, TEXT_BANNER10  },\r\n\t{  MT_ADVOCATE, \"Arch-Bishop Lazarus\",      \"GENERAL\",     0,    600, AI_LAZURUS,  3,         30,         50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, TEXT_VILE13    },\r\n\t{  MT_HLSPWN,   \"Red Vex\",                  \"REDV\",        0,    400, AI_LAZHELP,  3,         30,         50, IMMUNE_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40,        0,        0,        0, TEXT_VILE13    },\r\n\t{  MT_HLSPWN,   \"BlackJade\",                \"BLKJD\",       0,    400, AI_LAZHELP,  3,         30,         50, IMMUNE_MAGIC |               RESIST_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, TEXT_VILE13    },\r\n\t{  MT_RBLACK,   \"Lachdanan\",                \"BHKA\",       14,    500, AI_LACHDAN,  3,          0,          0, 0                                                             ,        0,        0,        0, TEXT_VEIL9     },\r\n\t{  MT_BTBLACK,  \"Warlord of Blood\",         \"GENERAL\",    13,    850, AI_WARLORD,  3,         35,         50, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, TEXT_WARLRD9   },\r\n\t{  MT_CLEAVER,  \"The Butcher\",              \"GENRL\",       0,    220, AI_CLEAVER,  3,          6,         12,                RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n#ifdef HELLFIRE\r\n\t{  MT_HORKDMN,  \"Hork Demon\",               \"GENRL\",      19,    300, AI_HORKDMN,  3,         20,         35,                              RESIST_LIGHTNING                 ,        0,        0,        0, 0              },\r\n\t{  MT_DEFILER,  \"The Defiler\",              \"GENRL\",      20,    480, AI_SKELSD,   3,         30,         40, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING                 ,        0,        0,        0, 0              },\r\n\t{  MT_NAKRUL,   \"Na-Krul\",                  \"GENRL\",       0,   1332, AI_SKELSD,   3,         40,         50, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n#endif\r\n\t{  MT_TSKELAX,  \"Bonehead Keenaxe\",         \"BHKA\",        2,     91, AI_SKELSD,   2,          4,         10, IMMUNE_MAGIC |                                  IMMUNE_NULL_40,        7,      100,        0, 0              },\r\n\t{  MT_RFALLSD,  \"Bladeskin the Slasher\",    \"BSTS\",        2,     51, AI_FALLEN,   0,          6,         18,                RESIST_FIRE                                    ,       11,       45,        0, 0              },\r\n\t{  MT_NZOMBIE,  \"Soulpus\",                  \"GENERAL\",     2,    133, AI_ZOMBIE,   0,          4,          8,                RESIST_FIRE | RESIST_LIGHTNING                 ,        0,        0,        0, 0              },\r\n\t{  MT_RFALLSP,  \"Pukerat the Unclean\",      \"PTU\",         2,     77, AI_FALLEN,   3,          1,          5,                RESIST_FIRE                                    ,        0,        0,        0, 0              },\r\n\t{  MT_WSKELAX,  \"Boneripper\",               \"BR\",          2,     54, AI_BAT,      0,          6,         15, IMMUNE_MAGIC | IMMUNE_FIRE |                    IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_NZOMBIE,  \"Rotfeast the Hungry\",      \"ETH\",         2,     85, AI_SKELSD,   3,          4,         12, IMMUNE_MAGIC |                                  IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_DFALLSD,  \"Gutshank the Quick\",       \"GTQ\",         3,     66, AI_BAT,      2,          6,         16,                RESIST_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_TSKELSD,  \"Brokenhead Bangshield\",    \"BHBS\",        3,    108, AI_SKELSD,   3,         12,         20, IMMUNE_MAGIC |               RESIST_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_YFALLSP,  \"Bongo\",                    \"BNG\",         3,    178, AI_FALLEN,   3,          9,         21, 0                                                             ,        3,        0,        0, 0              },\r\n\t{  MT_BZOMBIE,  \"Rotcarnage\",               \"RCRN\",        3,    102, AI_ZOMBIE,   3,          9,         24, IMMUNE_MAGIC |               RESIST_LIGHTNING | IMMUNE_NULL_40,       11,       45,        0, 0              },\r\n\t{  MT_NSCAV,    \"Shadowbite\",               \"SHBT\",        2,     60, AI_SKELSD,   3,          3,         20,                IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_WSKELBW,  \"Deadeye\",                  \"DE\",          2,     49, AI_GOATBOW,  0,          6,          9, IMMUNE_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_RSKELAX,  \"Madeye the Dead\",          \"MTD\",         4,     75, AI_BAT,      0,          9,         21, IMMUNE_MAGIC | IMMUNE_FIRE                                    ,       11,       30,        0, 0              },\r\n\t{  MT_BSCAV,    \"El Chupacabras\",           \"GENERAL\",     3,    120, AI_GOATMC,   0,         10,         18,                RESIST_FIRE                                    ,        3,       30,        0, 0              },\r\n\t{  MT_TSKELBW,  \"Skullfire\",                \"SKFR\",        3,    125, AI_GOATBOW,  1,          6,         10,                IMMUNE_FIRE                                    ,        0,      100,        0, 0              },\r\n\t{  MT_SNEAK,    \"Warpskull\",                \"TSPO\",        3,    117, AI_SNEAK,    2,          6,         18,                RESIST_FIRE | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_GZOMBIE,  \"Goretongue\",               \"PMR\",         3,    156, AI_SKELSD,   1,         15,         30, IMMUNE_MAGIC |                                  IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_WSCAV,    \"Pulsecrawler\",             \"BHKA\",        4,    150, AI_SCAV,     0,         16,         20,                IMMUNE_FIRE | RESIST_LIGHTNING                 ,       11,       45,        0, 0              },\r\n\t{  MT_BLINK,    \"Moonbender\",               \"GENERAL\",     4,    135, AI_BAT,      0,          9,         27,                IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_BLINK,    \"Wrathraven\",               \"GENERAL\",     5,    135, AI_BAT,      2,          9,         22,                IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_YSCAV,    \"Spineeater\",               \"GENERAL\",     4,    180, AI_SCAV,     1,         18,         25,                              IMMUNE_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_RSKELBW,  \"Blackash the Burning\",     \"BASHTB\",      4,    120, AI_GOATBOW,  0,          6,         16, IMMUNE_MAGIC | IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_BFALLSD,  \"Shadowcrow\",               \"GENERAL\",     5,    270, AI_SNEAK,    2,         12,         25, 0                                                             ,        3,        0,        0, 0              },\r\n\t{  MT_LRDSAYTR, \"Blightstone the Weak\",     \"BHKA\",        4,    360, AI_SKELSD,   0,          4,         12, IMMUNE_MAGIC |               RESIST_LIGHTNING                 ,        7,       70,        0, 0              },\r\n\t{  MT_FAT,      \"Bilefroth the Pit Master\", \"BFTP\",        6,    210, AI_BAT,      1,         16,         23, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_NGOATBW,  \"Bloodskin Darkbow\",        \"BSDB\",        5,    207, AI_GOATBOW,  0,          3,         16,                RESIST_FIRE | RESIST_LIGHTNING                 ,       11,       55,        0, 0              },\r\n\t{  MT_GLOOM,    \"Foulwing\",                 \"DB\",          5,    246, AI_RHINO,    3,         12,         28,                RESIST_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_XSKELSD,  \"Shadowdrinker\",            \"SHDR\",        5,    300, AI_SNEAK,    1,         18,         26, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        8,       45,        0, 0              },\r\n\t{  MT_UNSEEN,   \"Hazeshifter\",              \"BHKA\",        5,    285, AI_SNEAK,    3,         18,         30,                              IMMUNE_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_NACID,    \"Deathspit\",                \"BFDS\",        6,    303, AI_ACIDUNIQ, 0,         12,         32,                RESIST_FIRE | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_RGOATMC,  \"Bloodgutter\",              \"BGBL\",        6,    315, AI_BAT,      1,         24,         34,                IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_BGOATMC,  \"Deathshade Fleshmaul\",     \"DSFM\",        6,    276, AI_RHINO,    0,         12,         24, IMMUNE_MAGIC | RESIST_FIRE                                    ,        8,       65,        0, 0              },\r\n\t{  MT_WYRM,     \"Warmaggot the Mad\",        \"GENERAL\",     6,    246, AI_BAT,      3,         15,         30,                              RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_STORM,    \"Glasskull the Jagged\",     \"BHKA\",        7,    354, AI_STORM,    0,         18,         30, IMMUNE_MAGIC | IMMUNE_FIRE |                    IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_RGOATBW,  \"Blightfire\",               \"BLF\",         7,    321, AI_SUCC,     2,         13,         21,                IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_GARGOYLE, \"Nightwing the Cold\",       \"GENERAL\",     7,    342, AI_BAT,      1,         18,         26, IMMUNE_MAGIC |               RESIST_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_GGOATBW,  \"Gorestone\",                \"GENERAL\",     7,    303, AI_GOATBOW,  1,         15,         28,                              RESIST_LIGHTNING | IMMUNE_NULL_40,        7,       70,        0, 0              },\r\n\t{  MT_BMAGMA,   \"Bronzefist Firestone\",     \"GENERAL\",     8,    360, AI_MAGMA,    0,         30,         36, IMMUNE_MAGIC | RESIST_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_INCIN,    \"Wrathfire the Doomed\",     \"WFTD\",        8,    270, AI_SKELSD,   2,         20,         30, IMMUNE_MAGIC | RESIST_FIRE |  RESIST_LIGHTNING                ,        3,        0,        0, 0              },\r\n\t{  MT_NMAGMA,   \"Firewound the Grim\",       \"BHKA\",        8,    303, AI_MAGMA,    0,         18,         22, IMMUNE_MAGIC | RESIST_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_MUDMAN,   \"Baron Sludge\",             \"BSM\",         8,    315, AI_SNEAK,    3,         25,         34, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,       11,       75,        0, 0              },\r\n\t{  MT_GGOATMC,  \"Blighthorn Steelmace\",     \"BHSM\",        7,    250, AI_RHINO,    0,         20,         28,                              RESIST_LIGHTNING                 ,       11,       45,        0, 0              },\r\n\t{  MT_RACID,    \"Chaoshowler\",              \"GENERAL\",     8,    240, AI_ACIDUNIQ, 0,         12,         20, 0                                                             ,        3,        0,        0, 0              },\r\n\t{  MT_REDDTH,   \"Doomgrin the Rotting\",     \"GENERAL\",     8,    405, AI_STORM,    3,         25,         50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_FLAMLRD,  \"Madburner\",                \"GENERAL\",     9,    270, AI_STORM,    0,         20,         40, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_LTCHDMN,  \"Bonesaw the Litch\",        \"GENERAL\",     9,    495, AI_STORM,    2,         30,         55, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_MUDRUN,   \"Breakspine\",               \"GENERAL\",     9,    351, AI_RHINO,    0,         25,         34,                RESIST_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_REDDTH,   \"Devilskull Sharpbone\",     \"GENERAL\",     9,    444, AI_STORM,    1,         25,         40,                IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_STORM,    \"Brokenstorm\",              \"GENERAL\",     9,    411, AI_STORM,    2,         25,         36,                              IMMUNE_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_RSTORM,   \"Stormbane\",                \"GENERAL\",     9,    555, AI_STORM,    3,         30,         30,                              IMMUNE_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_TOAD,     \"Oozedrool\",                \"GENERAL\",     9,    483, AI_FAT,      3,         25,         30,                              RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_BLOODCLW, \"Goldblight of the Flame\",  \"GENERAL\",    10,    405, AI_GARG,     0,         15,         35, IMMUNE_MAGIC | IMMUNE_FIRE                                    ,       11,       80,        0, 0              },\r\n\t{  MT_OBLORD,   \"Blackstorm\",               \"GENERAL\",    10,    525, AI_RHINO,    3,         20,         40, IMMUNE_MAGIC |               IMMUNE_LIGHTNING                 ,       11,       90,        0, 0              },\r\n\t{  MT_RACID,    \"Plaguewrath\",              \"GENERAL\",    10,    450, AI_ACIDUNIQ, 2,         20,         30, IMMUNE_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_RSTORM,   \"The Flayer\",               \"GENERAL\",    10,    501, AI_STORM,    1,         20,         35, RESIST_MAGIC | RESIST_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_FROSTC,   \"Bluehorn\",                 \"GENERAL\",    11,    477, AI_RHINO,    1,         25,         30, IMMUNE_MAGIC | RESIST_FIRE                                    ,       11,       90,        0, 0              },\r\n\t{  MT_HELLBURN, \"Warpfire Hellspawn\",       \"GENERAL\",    11,    525, AI_FIREMAN,  3,         10,         40, RESIST_MAGIC | IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_NSNAKE,   \"Fangspeir\",                \"GENERAL\",    11,    444, AI_SKELSD,   1,         15,         32,                IMMUNE_FIRE |                    IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_UDEDBLRG, \"Festerskull\",              \"GENERAL\",    11,    600, AI_STORM,    2,         15,         30, IMMUNE_MAGIC |                                  IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_NBLACK,   \"Lionskull the Bent\",       \"GENERAL\",    12,    525, AI_SKELSD,   2,         25,         25, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_COUNSLR,  \"Blacktongue\",              \"GENERAL\",    12,    360, AI_COUNSLR,  3,         15,         30,                RESIST_FIRE |                    IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_DEATHW,   \"Viletouch\",                \"GENERAL\",    12,    525, AI_GARG,     3,         20,         40,                              IMMUNE_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_RSNAKE,   \"Viperflame\",               \"GENERAL\",    12,    570, AI_SKELSD,   1,         25,         35,               IMMUNE_FIRE  | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_BSNAKE,   \"Fangskin\",                 \"BHKA\",       14,    681, AI_SKELSD,   2,         15,         50, IMMUNE_MAGIC |               RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_SUCCUBUS, \"Witchfire the Unholy\",     \"GENERAL\",    12,    444, AI_SUCC,     3,         10,         20, IMMUNE_MAGIC | IMMUNE_FIRE | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_BALROG,   \"Blackskull\",               \"BHKA\",       13,    750, AI_SKELSD,   3,         25,         40, IMMUNE_MAGIC |               RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_UNRAV,    \"Soulslash\",                \"GENERAL\",    12,    450, AI_SKELSD,   0,         25,         25, IMMUNE_MAGIC |                                  IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_VTEXLRD,  \"Windspawn\",                \"GENERAL\",    12,    711, AI_SKELSD,   1,         35,         40, IMMUNE_MAGIC | IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_GSNAKE,   \"Lord of the Pit\",          \"GENERAL\",    13,    762, AI_SKELSD,   2,         25,         42,                RESIST_FIRE |                    IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_RTBLACK,  \"Rustweaver\",               \"GENERAL\",    13,    400, AI_SKELSD,   3,          1,         60, IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_HOLOWONE, \"Howlingire the Shade\",     \"GENERAL\",    13,    450, AI_SKELSD,   2,         40,         75,                RESIST_FIRE | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_MAEL,     \"Doomcloud\",                \"GENERAL\",    13,    612, AI_STORM,    1,          1,         60,                RESIST_FIRE | IMMUNE_LIGHTNING                 ,        0,        0,        0, 0              },\r\n\t{  MT_PAINMSTR, \"Bloodmoon Soulfire\",       \"GENERAL\",    13,    684, AI_SKELSD,   1,         15,         40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_SNOWWICH, \"Witchmoon\",                \"GENERAL\",    13,    310, AI_SUCC,     3,         30,         40,                              RESIST_LIGHTNING                 ,        0,        0,        0, 0              },\r\n\t{  MT_VTEXLRD,  \"Gorefeast\",                \"GENERAL\",    13,    771, AI_SKELSD,   3,         20,         55,                RESIST_FIRE |                    IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_RTBLACK,  \"Graywar the Slayer\",       \"GENERAL\",    14,    672, AI_SKELSD,   1,         30,         50,                              RESIST_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_MAGISTR,  \"Dreadjudge\",               \"GENERAL\",    14,    540, AI_COUNSLR,  1,         30,         40, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING                 ,        3,        0,        0, 0              },\r\n\t{  MT_HLSPWN,   \"Stareye the Witch\",        \"GENERAL\",    14,    726, AI_SUCC,     2,         30,         50,                IMMUNE_FIRE                                    ,        0,        0,        0, 0              },\r\n\t{  MT_BTBLACK,  \"Steelskull the Hunter\",    \"GENERAL\",    14,    831, AI_SKELSD,   3,         40,         50,                              RESIST_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_RBLACK,   \"Sir Gorash\",               \"GENERAL\",    16,   1050, AI_SKELSD,   1,         20,         60,                                                 IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_CABALIST, \"The Vizier\",               \"GENERAL\",    15,    850, AI_COUNSLR,  2,         25,         40,                IMMUNE_FIRE                                    ,        3,        0,        0, 0              },\r\n\t{  MT_REALWEAV, \"Zamphir\",                  \"GENERAL\",    15,    891, AI_SKELSD,   2,         30,         50, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_HLSPWN,   \"Bloodlust\",                \"GENERAL\",    15,    825, AI_SUCC,     1,         20,         55, IMMUNE_MAGIC |               IMMUNE_LIGHTNING | IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_HLSPWN,   \"Webwidow\",                 \"GENERAL\",    16,    774, AI_SUCC,     1,         20,         50, IMMUNE_MAGIC | IMMUNE_FIRE |                    IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_SOLBRNR,  \"Fleshdancer\",              \"GENERAL\",    16,    999, AI_SUCC,     3,         30,         50, IMMUNE_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40,        0,        0,        0, 0              },\r\n\t{  MT_OBLORD,   \"Grimspike\",                \"GENERAL\",    19,    534, AI_SNEAK,    1,         25,         40, IMMUNE_MAGIC | RESIST_FIRE |                    IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  MT_STORML,   \"Doomlock\",                 \"GENERAL\",    28,    534, AI_SNEAK,    1,         35,         55, IMMUNE_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_NULL_40,        3,        0,        0, 0              },\r\n\t{  -1,          NULL,                       NULL,          0,      0, 0,           0,          0,          0, 0                                                             ,        0,        0,        0, 0              },\r\n\t// clang-format on\r\n};\r\n"
  },
  {
    "path": "Source/monstdat.h",
    "content": "/**\r\n * @file monstdat.h\r\n *\r\n * Interface of all monster data.\r\n */\r\n#ifndef __MONSTDAT_H__\r\n#define __MONSTDAT_H__\r\n\r\nextern MonsterData monsterdata[];\r\n#ifdef HELLFIRE\r\nextern int MonstConvTbl[];\r\nextern int MonstAvailTbl[];\r\n#else\r\nextern char MonstConvTbl[];\r\nextern char MonstAvailTbl[];\r\n#endif\r\nextern UniqMonstStruct UniqMonst[];\r\n\r\n#endif /* __MONSTDAT_H__ */\r\n"
  },
  {
    "path": "Source/monster.cpp",
    "content": "/**\r\n * @file monster.cpp\r\n *\r\n * Implementation of monster functionality, AI, actions, spawning, loading, etc.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n/** Tracks which missile files are already loaded */\r\nint MissileFileFlag;\r\n\r\n// BUGFIX: replace monstkills[MAXMONSTERS] with monstkills[NUM_MTYPES].\r\n/** Tracks the total number of monsters killed per monster_id. */\r\nint monstkills[MAXMONSTERS];\r\nint monstactive[MAXMONSTERS];\r\nint nummonsters;\r\nBOOLEAN sgbSaveSoundOn;\r\nMonsterStruct monster[MAXMONSTERS];\r\nint totalmonsters;\r\nCMonster Monsters[MAX_LVLMTYPES];\r\n#ifdef HELLFIRE\r\nint GraphicTable[NUMLEVELS][MAX_LVLMTYPES];\r\n#else\r\nBYTE GraphicTable[NUMLEVELS][MAX_LVLMTYPES];\r\n#endif\r\nint monstimgtot;\r\nint uniquetrans;\r\nint nummtypes;\r\n\r\n/** Maps from walking path step to facing direction. */\r\nconst char plr2monst[9] = { 0, 5, 3, 7, 1, 4, 6, 0, 2 };\r\n/** Maps from monster intelligence factor to missile type. */\r\nconst BYTE counsmiss[4] = { MIS_FIREBOLT, MIS_CBOLT, MIS_LIGHTCTRL, MIS_FIREBALL };\r\n\r\n/* data */\r\n\r\n// BUGFIX: MWVel velocity values are not rounded consistently. The correct\r\n// formula for monster walk velocity is calculated as follows (for 16, 32 and 64\r\n// pixel distances, respectively):\r\n//\r\n//    vel16 = (16 << monsterWalkShift) / nframes\r\n//    vel32 = (32 << monsterWalkShift) / nframes\r\n//    vel64 = (64 << monsterWalkShift) / nframes\r\n//\r\n// The correct monster walk velocity table is as follows:\r\n//\r\n//   int MWVel[24][3] = {\r\n//      { 256, 512, 1024 },\r\n//      { 128, 256, 512 },\r\n//      { 85, 171, 341 },\r\n//      { 64, 128, 256 },\r\n//      { 51, 102, 205 },\r\n//      { 43, 85, 171 },\r\n//      { 37, 73, 146 },\r\n//      { 32, 64, 128 },\r\n//      { 28, 57, 114 },\r\n//      { 26, 51, 102 },\r\n//      { 23, 47, 93 },\r\n//      { 21, 43, 85 },\r\n//      { 20, 39, 79 },\r\n//      { 18, 37, 73 },\r\n//      { 17, 34, 68 },\r\n//      { 16, 32, 64 },\r\n//      { 15, 30, 60 },\r\n//      { 14, 28, 57 },\r\n//      { 13, 27, 54 },\r\n//      { 13, 26, 51 },\r\n//      { 12, 24, 49 },\r\n//      { 12, 23, 47 },\r\n//      { 11, 22, 45 },\r\n//      { 11, 21, 43 }\r\n//   };\r\n\r\n/** Maps from monster walk animation frame num to monster velocity. */\r\nint MWVel[24][3] = {\r\n\t{ 256, 512, 1024 },\r\n\t{ 128, 256, 512 },\r\n\t{ 85, 170, 341 },\r\n\t{ 64, 128, 256 },\r\n\t{ 51, 102, 204 },\r\n\t{ 42, 85, 170 },\r\n\t{ 36, 73, 146 },\r\n\t{ 32, 64, 128 },\r\n\t{ 28, 56, 113 },\r\n\t{ 26, 51, 102 },\r\n\t{ 23, 46, 93 },\r\n\t{ 21, 42, 85 },\r\n\t{ 19, 39, 78 },\r\n\t{ 18, 36, 73 },\r\n\t{ 17, 34, 68 },\r\n\t{ 16, 32, 64 },\r\n\t{ 15, 30, 60 },\r\n\t{ 14, 28, 57 },\r\n\t{ 13, 26, 54 },\r\n\t{ 12, 25, 51 },\r\n\t{ 12, 24, 48 },\r\n\t{ 11, 23, 46 },\r\n\t{ 11, 22, 44 },\r\n\t{ 10, 21, 42 }\r\n};\r\n/** Maps from monster action to monster animation letter. */\r\nchar animletter[7] = \"nwahds\";\r\n/** Maps from direction to a left turn from the direction. */\r\nint left[8] = { 7, 0, 1, 2, 3, 4, 5, 6 };\r\n/** Maps from direction to a right turn from the direction. */\r\nint right[8] = { 1, 2, 3, 4, 5, 6, 7, 0 };\r\n/** Maps from direction to the opposite direction. */\r\nint opposite[8] = { 4, 5, 6, 7, 0, 1, 2, 3 };\r\n/** Maps from direction to delta X-offset. */\r\nint offset_x[8] = { 1, 0, -1, -1, -1, 0, 1, 1 };\r\n/** Maps from direction to delta Y-offset. */\r\nint offset_y[8] = { 1, 1, 1, 0, -1, -1, -1, 0 };\r\n\r\n#ifdef HELLFIRE\r\nint HorkXAdd[8] = { 1, 0, -1, -1, -1, 0, 1, 1 }; // CODEFIX: same values as offset_x, remove it and use offset_x instead\r\nint HorkYAdd[8] = { 1, 1, 1, 0, -1, -1, -1, 0 }; // CODEFIX: same values as offset_y, remove it and use offset_y instead\r\n#endif\r\n\r\n/** unused */\r\nint rnd5[4] = { 5, 10, 15, 20 };\r\nint rnd10[4] = { 10, 15, 20, 30 };\r\nint rnd20[4] = { 20, 30, 40, 50 };\r\nint rnd60[4] = { 60, 70, 80, 90 };\r\n\r\n/** Maps from monster AI ID to monster AI function. */\r\nvoid (*AiProc[])(int i) = {\r\n\t&MAI_Zombie,\r\n\t&MAI_Fat,\r\n\t&MAI_SkelSd,\r\n\t&MAI_SkelBow,\r\n\t&MAI_Scav,\r\n\t&MAI_Rhino,\r\n\t&MAI_GoatMc,\r\n\t&MAI_GoatBow,\r\n\t&MAI_Fallen,\r\n\t&MAI_Magma,\r\n\t&MAI_SkelKing,\r\n\t&MAI_Bat,\r\n\t&MAI_Garg,\r\n\t&MAI_Cleaver,\r\n\t&MAI_Succ,\r\n\t&MAI_Sneak,\r\n\t&MAI_Storm,\r\n\t&MAI_Fireman,\r\n\t&MAI_Garbud,\r\n\t&MAI_Acid,\r\n\t&MAI_AcidUniq,\r\n\t&MAI_Golum,\r\n\t&MAI_Zhar,\r\n\t&MAI_SnotSpil,\r\n\t&MAI_Snake,\r\n\t&MAI_Counselor,\r\n\t&MAI_Mega,\r\n\t&MAI_Diablo,\r\n\t&MAI_Lazurus,\r\n\t&MAI_Lazhelp,\r\n\t&MAI_Lachdanan,\r\n\t&MAI_Warlord,\r\n#ifdef HELLFIRE\r\n\t&MAI_Firebat,\r\n\t&MAI_Torchant,\r\n\t&MAI_HorkDemon,\r\n\t&MAI_Lich,\r\n\t&MAI_ArchLich,\r\n\t&MAI_Psychorb,\r\n\t&MAI_Necromorb,\r\n\t&MAI_BoneDemon\r\n#endif\r\n};\r\n\r\nvoid InitMonsterTRN(int monst, BOOL special)\r\n{\r\n\tBYTE *f;\r\n\tint i, n, j;\r\n\r\n\tf = Monsters[monst].trans_file;\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\tif (*f == 255) {\r\n\t\t\t*f = 0;\r\n\t\t}\r\n\t\tf++;\r\n\t}\r\n\r\n\tn = special ? 6 : 5;\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tif (i != 1 || Monsters[monst].mtype < MT_COUNSLR || Monsters[monst].mtype > MT_ADVOCATE) {\r\n\t\t\tfor (j = 0; j < 8; j++) {\r\n\t\t\t\tCl2ApplyTrans(\r\n\t\t\t\t    Monsters[monst].Anims[i].Data[j],\r\n\t\t\t\t    Monsters[monst].trans_file,\r\n\t\t\t\t    Monsters[monst].Anims[i].Frames);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid InitLevelMonsters()\r\n{\r\n\tint i;\r\n\r\n\tnummtypes = 0;\r\n\tmonstimgtot = 0;\r\n\tMissileFileFlag = 0;\r\n\r\n\tfor (i = 0; i < MAX_LVLMTYPES; i++) {\r\n\t\tMonsters[i].mPlaceFlags = 0;\r\n\t}\r\n\r\n\tClrAllMonsters();\r\n\tnummonsters = 0;\r\n\ttotalmonsters = MAXMONSTERS;\r\n\r\n\tfor (i = 0; i < MAXMONSTERS; i++) {\r\n\t\tmonstactive[i] = i;\r\n\t}\r\n\r\n\tuniquetrans = 0;\r\n}\r\n\r\nint AddMonsterType(int type, int placeflag)\r\n{\r\n\tBOOL done = FALSE;\r\n\tint i;\r\n\r\n\tfor (i = 0; i < nummtypes && !done; i++) {\r\n\t\tdone = Monsters[i].mtype == type;\r\n\t}\r\n\r\n\ti--;\r\n\r\n\tif (!done) {\r\n\t\ti = nummtypes;\r\n\t\tnummtypes++;\r\n\t\tMonsters[i].mtype = type;\r\n\t\tmonstimgtot += monsterdata[type].mImage;\r\n\t\tInitMonsterGFX(i);\r\n\t\tInitMonsterSND(i);\r\n\t}\r\n\r\n\tMonsters[i].mPlaceFlags |= placeflag;\r\n\treturn i;\r\n}\r\n\r\nvoid GetLevelMTypes()\r\n{\r\n\tint i;\r\n\r\n\t// this array is merged with skeltypes down below.\r\n\tint typelist[MAXMONSTERS];\r\n\tint skeltypes[NUM_MTYPES];\r\n\r\n\tint minl; // min level\r\n\tint maxl; // max level\r\n\tchar mamask;\r\n\tconst int numskeltypes = 19;\r\n\r\n\tint nt; // number of types\r\n\r\n#ifdef SPAWN\r\n\tmamask = 1; // monster availability mask\r\n#else\r\n\tmamask = 3; // monster availability mask\r\n#endif\r\n\r\n\tAddMonsterType(MT_GOLEM, PLACE_SPECIAL);\r\n\tif (currlevel == 16) {\r\n\t\tAddMonsterType(MT_ADVOCATE, PLACE_SCATTER);\r\n\t\tAddMonsterType(MT_RBLACK, PLACE_SCATTER);\r\n\t\tAddMonsterType(MT_DIABLO, PLACE_SPECIAL);\r\n\t\treturn;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 18)\r\n\t\tAddMonsterType(MT_HORKSPWN, PLACE_SCATTER);\r\n\tif (currlevel == 19) {\r\n\t\tAddMonsterType(MT_HORKSPWN, PLACE_SCATTER);\r\n\t\tAddMonsterType(MT_HORKDMN, PLACE_UNIQUE);\r\n\t}\r\n\tif (currlevel == 20)\r\n\t\tAddMonsterType(MT_DEFILER, PLACE_UNIQUE);\r\n\tif (currlevel == 24) {\r\n\t\tAddMonsterType(MT_ARCHLICH, PLACE_SCATTER);\r\n\t\tAddMonsterType(MT_NAKRUL, PLACE_SPECIAL);\r\n\t}\r\n#endif\r\n\r\n\tif (!setlevel) {\r\n\t\tif (QuestStatus(Q_BUTCHER))\r\n\t\t\tAddMonsterType(MT_CLEAVER, PLACE_SPECIAL);\r\n\t\tif (QuestStatus(Q_GARBUD))\r\n\t\t\tAddMonsterType(UniqMonst[UMT_GARBUD].mtype, PLACE_UNIQUE);\r\n\t\tif (QuestStatus(Q_ZHAR))\r\n\t\t\tAddMonsterType(UniqMonst[UMT_ZHAR].mtype, PLACE_UNIQUE);\r\n\t\tif (QuestStatus(Q_LTBANNER))\r\n\t\t\tAddMonsterType(UniqMonst[UMT_SNOTSPIL].mtype, PLACE_UNIQUE);\r\n\t\tif (QuestStatus(Q_VEIL))\r\n\t\t\tAddMonsterType(UniqMonst[UMT_LACHDAN].mtype, PLACE_UNIQUE);\r\n\t\tif (QuestStatus(Q_WARLORD))\r\n\t\t\tAddMonsterType(UniqMonst[UMT_WARLORD].mtype, PLACE_UNIQUE);\r\n\r\n\t\tif (gbMaxPlayers != 1 && currlevel == quests[Q_SKELKING]._qlevel) {\r\n\r\n\t\t\tAddMonsterType(MT_SKING, PLACE_UNIQUE);\r\n\r\n\t\t\tnt = 0;\r\n\t\t\tfor (i = MT_WSKELAX; i <= MT_WSKELAX + numskeltypes; i++) {\r\n\t\t\t\tif (IsSkel(i)) {\r\n\t\t\t\t\tminl = 15 * monsterdata[i].mMinDLvl / 30 + 1;\r\n\t\t\t\t\tmaxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1;\r\n\r\n\t\t\t\t\tif (currlevel >= minl && currlevel <= maxl) {\r\n\t\t\t\t\t\tif (MonstAvailTbl[i] & mamask) {\r\n\t\t\t\t\t\t\tskeltypes[nt++] = i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tAddMonsterType(skeltypes[random_(88, nt)], PLACE_SCATTER);\r\n\t\t}\r\n\r\n\t\tnt = 0;\r\n\t\tfor (i = 0; i < NUM_MTYPES; i++) {\r\n\t\t\tminl = 15 * monsterdata[i].mMinDLvl / 30 + 1;\r\n\t\t\tmaxl = 15 * monsterdata[i].mMaxDLvl / 30 + 1;\r\n\r\n\t\t\tif (currlevel >= minl && currlevel <= maxl) {\r\n\t\t\t\tif (MonstAvailTbl[i] & mamask) {\r\n\t\t\t\t\ttypelist[nt++] = i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (monstdebug) {\r\n\t\t\tfor (i = 0; i < debugmonsttypes; i++)\r\n\t\t\t\tAddMonsterType(DebugMonsters[i], PLACE_SCATTER);\r\n\t\t} else {\r\n\r\n\t\t\twhile (nt > 0 && nummtypes < MAX_LVLMTYPES && monstimgtot < 4000) {\r\n\t\t\t\tfor (i = 0; i < nt;) {\r\n\t\t\t\t\tif (monsterdata[typelist[i]].mImage > 4000 - monstimgtot) {\r\n\t\t\t\t\t\ttypelist[i] = typelist[--nt];\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ti++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (nt != 0) {\r\n\t\t\t\t\ti = random_(88, nt);\r\n\t\t\t\t\tAddMonsterType(typelist[i], PLACE_SCATTER);\r\n\t\t\t\t\ttypelist[i] = typelist[--nt];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t} else {\r\n\t\tif (setlvlnum == SL_SKELKING) {\r\n\t\t\tAddMonsterType(MT_SKING, PLACE_UNIQUE);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid InitMonsterGFX(int monst)\r\n{\r\n\tint mtype, anim, i;\r\n\tchar strBuff[256];\r\n\tBYTE *celBuf;\r\n\r\n\tmtype = Monsters[monst].mtype;\r\n\r\n\tfor (anim = 0; anim < 6; anim++) {\r\n\t\tif ((animletter[anim] != 's' || monsterdata[mtype].has_special) && monsterdata[mtype].Frames[anim] > 0) {\r\n\t\t\tsprintf(strBuff, monsterdata[mtype].GraphicType, animletter[anim]);\r\n\r\n\t\t\tcelBuf = LoadFileInMem(strBuff, NULL);\r\n\t\t\tMonsters[monst].Anims[anim].CMem = celBuf;\r\n\r\n\t\t\tif (Monsters[monst].mtype != MT_GOLEM || (animletter[anim] != 's' && animletter[anim] != 'd')) {\r\n\r\n\t\t\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\t\t\tMonsters[monst].Anims[anim].Data[i] = &celBuf[((int *)celBuf)[i]];\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\t\t\tMonsters[monst].Anims[anim].Data[i] = celBuf;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// TODO: either the AnimStruct members have wrong naming or the MonsterData ones it seems\r\n\t\tMonsters[monst].Anims[anim].Frames = monsterdata[mtype].Frames[anim];\r\n\t\tMonsters[monst].Anims[anim].Rate = monsterdata[mtype].Rate[anim];\r\n\t}\r\n\r\n\tMonsters[monst].width = monsterdata[mtype].width;\r\n\tMonsters[monst].width2 = (monsterdata[mtype].width - 64) >> 1;\r\n\tMonsters[monst].mMinHP = monsterdata[mtype].mMinHP;\r\n\tMonsters[monst].mMaxHP = monsterdata[mtype].mMaxHP;\r\n\tMonsters[monst].has_special = monsterdata[mtype].has_special;\r\n\tMonsters[monst].mAFNum = monsterdata[mtype].mAFNum;\r\n\tMonsters[monst].MData = &monsterdata[mtype];\r\n\r\n\tif (monsterdata[mtype].has_trans) {\r\n\t\tMonsters[monst].trans_file = LoadFileInMem(monsterdata[mtype].TransFile, NULL);\r\n\t\tInitMonsterTRN(monst, monsterdata[mtype].has_special);\r\n\t\tMemFreeDbg(Monsters[monst].trans_file);\r\n\t}\r\n\r\n\tif (mtype >= MT_NMAGMA && mtype <= MT_WMAGMA && !(MissileFileFlag & 1)) {\r\n\t\tMissileFileFlag |= 1;\r\n\t\tLoadMissileGFX(MFILE_MAGBALL);\r\n\t}\r\n\tif (mtype >= MT_STORM && mtype <= MT_MAEL && !(MissileFileFlag & 2)) {\r\n\t\tMissileFileFlag |= 2;\r\n\t\tLoadMissileGFX(MFILE_THINLGHT);\r\n\t}\r\n\tif (mtype == MT_SUCCUBUS && !(MissileFileFlag & 4)) {\r\n\t\tMissileFileFlag |= 4;\r\n#ifndef HELLFIRE\r\n\t\tLoadMissileGFX(MFILE_FLARE);\r\n\t\tLoadMissileGFX(MFILE_FLAREEXP);\r\n#endif\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (mtype >= MT_INCIN && mtype <= MT_HELLBURN && !(MissileFileFlag & 8)) {\r\n\t\tMissileFileFlag |= 8;\r\n\t\tLoadMissileGFX(MFILE_KRULL);\r\n\t}\r\n\tif ((mtype >= MT_NACID && mtype <= MT_XACID || mtype == MT_SPIDLORD) && !(MissileFileFlag & 0x10)) {\r\n\t\tMissileFileFlag |= 0x10;\r\n\t\tLoadMissileGFX(MFILE_ACIDBF);\r\n\t\tLoadMissileGFX(MFILE_ACIDSPLA);\r\n\t\tLoadMissileGFX(MFILE_ACIDPUD);\r\n\t}\r\n#endif\r\n\tif (mtype == MT_SNOWWICH && !(MissileFileFlag & 0x20)) {\r\n\t\tMissileFileFlag |= 0x20;\r\n\t\tLoadMissileGFX(MFILE_SCUBMISB);\r\n\t\tLoadMissileGFX(MFILE_SCBSEXPB);\r\n\t}\r\n\tif (mtype == MT_HLSPWN && !(MissileFileFlag & 0x40)) {\r\n\t\tMissileFileFlag |= 0x40;\r\n\t\tLoadMissileGFX(MFILE_SCUBMISD);\r\n\t\tLoadMissileGFX(MFILE_SCBSEXPD);\r\n\t}\r\n\tif (mtype == MT_SOLBRNR && !(MissileFileFlag & 0x80)) {\r\n\t\tMissileFileFlag |= 0x80;\r\n\t\tLoadMissileGFX(MFILE_SCUBMISC);\r\n\t\tLoadMissileGFX(MFILE_SCBSEXPC);\r\n\t}\r\n#ifndef HELLFIRE\r\n\tif (mtype >= MT_INCIN && mtype <= MT_HELLBURN && !(MissileFileFlag & 8)) {\r\n\t\tMissileFileFlag |= 8;\r\n\t\tLoadMissileGFX(MFILE_KRULL);\r\n\t}\r\n\tif (mtype >= MT_NACID && mtype <= MT_XACID && !(MissileFileFlag & 0x10)) {\r\n\t\tMissileFileFlag |= 0x10;\r\n\t\tLoadMissileGFX(MFILE_ACIDBF);\r\n\t\tLoadMissileGFX(MFILE_ACIDSPLA);\r\n\t\tLoadMissileGFX(MFILE_ACIDPUD);\r\n\t}\r\n#else\r\n\tif (mtype == MT_LICH && !(MissileFileFlag & 0x100)) {\r\n\t\tMissileFileFlag |= 0x100u;\r\n\t\tLoadMissileGFX(MFILE_LICH);\r\n\t\tLoadMissileGFX(MFILE_EXORA1);\r\n\t}\r\n\tif (mtype == MT_ARCHLICH && !(MissileFileFlag & 0x200)) {\r\n\t\tMissileFileFlag |= 0x200u;\r\n\t\tLoadMissileGFX(MFILE_ARCHLICH);\r\n\t\tLoadMissileGFX(MFILE_EXYEL2);\r\n\t}\r\n\tif ((mtype == MT_PSYCHORB || mtype == MT_BONEDEMN) && !(MissileFileFlag & 0x400)) {\r\n\t\tMissileFileFlag |= 0x400u;\r\n\t\tLoadMissileGFX(MFILE_BONEDEMON);\r\n\t}\r\n\tif (mtype == MT_NECRMORB && !(MissileFileFlag & 0x800)) {\r\n\t\tMissileFileFlag |= 0x800u;\r\n\t\tLoadMissileGFX(MFILE_NECROMORB);\r\n\t\tLoadMissileGFX(MFILE_EXRED3);\r\n\t}\r\n\tif (mtype == MT_PSYCHORB && !(MissileFileFlag & 0x1000)) {\r\n\t\tMissileFileFlag |= 0x1000u;\r\n\t\tLoadMissileGFX(MFILE_EXBL2);\r\n\t}\r\n\tif (mtype == MT_BONEDEMN && !(MissileFileFlag & 0x2000)) {\r\n\t\tMissileFileFlag |= 0x2000u;\r\n\t\tLoadMissileGFX(MFILE_EXBL3);\r\n\t}\r\n#endif\r\n\tif (mtype == MT_DIABLO) {\r\n\t\tLoadMissileGFX(MFILE_FIREPLAR);\r\n\t}\r\n}\r\n\r\nvoid ClearMVars(int i)\r\n{\r\n\tmonster[i]._mVar1 = 0;\r\n\tmonster[i]._mVar2 = 0;\r\n\tmonster[i]._mVar3 = 0;\r\n\tmonster[i]._mVar4 = 0;\r\n\tmonster[i]._mVar5 = 0;\r\n\tmonster[i]._mVar6 = 0;\r\n\tmonster[i]._mVar7 = 0;\r\n\tmonster[i]._mVar8 = 0;\r\n}\r\n\r\nvoid InitMonster(int i, int rd, int mtype, int x, int y)\r\n{\r\n\tCMonster *monst = &Monsters[mtype];\r\n\r\n\tmonster[i]._mdir = rd;\r\n\tmonster[i]._mx = x;\r\n\tmonster[i]._my = y;\r\n\tmonster[i]._mfutx = x;\r\n\tmonster[i]._mfuty = y;\r\n\tmonster[i]._moldx = x;\r\n\tmonster[i]._moldy = y;\r\n\tmonster[i]._mMTidx = mtype;\r\n\tmonster[i]._mmode = MM_STAND;\r\n\tmonster[i].mName = monst->MData->mName;\r\n\tmonster[i].MType = monst;\r\n\tmonster[i].MData = monst->MData;\r\n\tmonster[i]._mAnimData = monst->Anims[MA_STAND].Data[rd];\r\n\tmonster[i]._mAnimDelay = monst->Anims[MA_STAND].Rate;\r\n\tmonster[i]._mAnimCnt = random_(88, monster[i]._mAnimDelay - 1);\r\n\tmonster[i]._mAnimLen = monst->Anims[MA_STAND].Frames;\r\n\tmonster[i]._mAnimFrame = random_(88, monster[i]._mAnimLen - 1) + 1;\r\n\r\n\tif (monst->mtype == MT_DIABLO) {\r\n#ifdef HELLFIRE\r\n\t\tmonster[i]._mmaxhp = (random_(88, 1) + 3333) << 6;\r\n#else\r\n\t\tmonster[i]._mmaxhp = (random_(88, 1) + 1666) << 6;\r\n#endif\r\n\t} else {\r\n\t\tmonster[i]._mmaxhp = (monst->mMinHP + random_(88, monst->mMaxHP - monst->mMinHP + 1)) << 6;\r\n\t}\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tmonster[i]._mmaxhp >>= 1;\r\n\t\tif (monster[i]._mmaxhp < 64) {\r\n\t\t\tmonster[i]._mmaxhp = 64;\r\n\t\t}\r\n\t}\r\n\r\n\tmonster[i]._mhitpoints = monster[i]._mmaxhp;\r\n\tmonster[i]._mAi = monst->MData->mAi;\r\n\tmonster[i]._mint = monst->MData->mInt;\r\n\tmonster[i]._mgoal = MGOAL_NORMAL;\r\n\tmonster[i]._mgoalvar1 = 0;\r\n\tmonster[i]._mgoalvar2 = 0;\r\n\tmonster[i]._mgoalvar3 = 0;\r\n\tmonster[i].field_18 = 0;\r\n\tmonster[i]._pathcount = 0;\r\n\tmonster[i]._mDelFlag = FALSE;\r\n\tmonster[i]._uniqtype = 0;\r\n\tmonster[i]._msquelch = 0;\r\n#ifdef HELLFIRE\r\n\tmonster[i].mlid = 0;\r\n#endif\r\n\tmonster[i]._mRndSeed = GetRndSeed();\r\n\tmonster[i]._mAISeed = GetRndSeed();\r\n\tmonster[i].mWhoHit = 0;\r\n\tmonster[i].mLevel = monst->MData->mLevel;\r\n\tmonster[i].mExp = monst->MData->mExp;\r\n\tmonster[i].mHit = monst->MData->mHit;\r\n\tmonster[i].mMinDamage = monst->MData->mMinDamage;\r\n\tmonster[i].mMaxDamage = monst->MData->mMaxDamage;\r\n\tmonster[i].mHit2 = monst->MData->mHit2;\r\n\tmonster[i].mMinDamage2 = monst->MData->mMinDamage2;\r\n\tmonster[i].mMaxDamage2 = monst->MData->mMaxDamage2;\r\n\tmonster[i].mArmorClass = monst->MData->mArmorClass;\r\n\tmonster[i].mMagicRes = monst->MData->mMagicRes;\r\n\tmonster[i].leader = 0;\r\n\tmonster[i].leaderflag = 0;\r\n\tmonster[i]._mFlags = monst->MData->mFlags;\r\n\tmonster[i].mtalkmsg = 0;\r\n\r\n\tif (monster[i]._mAi == AI_GARG) {\r\n\t\tmonster[i]._mAnimData = monst->Anims[MA_SPECIAL].Data[rd];\r\n\t\tmonster[i]._mAnimFrame = 1;\r\n\t\tmonster[i]._mFlags |= MFLAG_ALLOW_SPECIAL;\r\n\t\tmonster[i]._mmode = MM_SATTACK;\r\n\t}\r\n\r\n\tif (gnDifficulty == DIFF_NIGHTMARE) {\r\n#ifdef HELLFIRE\r\n\t\tmonster[i]._mmaxhp = 3 * monster[i]._mmaxhp + ((gbMaxPlayers != 1 ? 100 : 50) << 6);\r\n#else\r\n\t\tmonster[i]._mmaxhp = 3 * monster[i]._mmaxhp + 64;\r\n#endif\r\n\t\tmonster[i]._mhitpoints = monster[i]._mmaxhp;\r\n\t\tmonster[i].mLevel += 15;\r\n\t\tmonster[i].mExp = 2 * (monster[i].mExp + 1000);\r\n\t\tmonster[i].mHit += 85;\r\n\t\tmonster[i].mMinDamage = 2 * (monster[i].mMinDamage + 2);\r\n\t\tmonster[i].mMaxDamage = 2 * (monster[i].mMaxDamage + 2);\r\n\t\tmonster[i].mHit2 += 85;\r\n\t\tmonster[i].mMinDamage2 = 2 * (monster[i].mMinDamage2 + 2);\r\n\t\tmonster[i].mMaxDamage2 = 2 * (monster[i].mMaxDamage2 + 2);\r\n\t\tmonster[i].mArmorClass += 50;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\telse\r\n#endif\r\n\t    if (gnDifficulty == DIFF_HELL) {\r\n#ifdef HELLFIRE\r\n\t\tmonster[i]._mmaxhp = 4 * monster[i]._mmaxhp + ((gbMaxPlayers != 1 ? 200 : 100) << 6);\r\n#else\r\n\t\tmonster[i]._mmaxhp = 4 * monster[i]._mmaxhp + 192;\r\n#endif\r\n\t\tmonster[i]._mhitpoints = monster[i]._mmaxhp;\r\n\t\tmonster[i].mLevel += 30;\r\n\t\tmonster[i].mExp = 4 * (monster[i].mExp + 1000);\r\n\t\tmonster[i].mHit += 120;\r\n\t\tmonster[i].mMinDamage = 4 * monster[i].mMinDamage + 6;\r\n\t\tmonster[i].mMaxDamage = 4 * monster[i].mMaxDamage + 6;\r\n\t\tmonster[i].mHit2 += 120;\r\n\t\tmonster[i].mMinDamage2 = 4 * monster[i].mMinDamage2 + 6;\r\n\t\tmonster[i].mMaxDamage2 = 4 * monster[i].mMaxDamage2 + 6;\r\n\t\tmonster[i].mArmorClass += 80;\r\n\t\tmonster[i].mMagicRes = monst->MData->mMagicRes2;\r\n\t}\r\n}\r\n\r\nvoid ClrAllMonsters()\r\n{\r\n\tint i;\r\n\tMonsterStruct *Monst;\r\n\r\n\tfor (i = 0; i < MAXMONSTERS; i++) {\r\n\t\tMonst = &monster[i];\r\n\t\tClearMVars(i);\r\n\t\tMonst->mName = \"Invalid Monster\";\r\n\t\tMonst->_mgoal = 0;\r\n\t\tMonst->_mmode = MM_STAND;\r\n\t\tMonst->_mVar1 = 0;\r\n\t\tMonst->_mVar2 = 0;\r\n\t\tMonst->_mx = 0;\r\n\t\tMonst->_my = 0;\r\n\t\tMonst->_mfutx = 0;\r\n\t\tMonst->_mfuty = 0;\r\n\t\tMonst->_moldx = 0;\r\n\t\tMonst->_moldy = 0;\r\n\t\tMonst->_mdir = random_(89, 8);\r\n\t\tMonst->_mxvel = 0;\r\n\t\tMonst->_myvel = 0;\r\n\t\tMonst->_mAnimData = NULL;\r\n\t\tMonst->_mAnimDelay = 0;\r\n\t\tMonst->_mAnimCnt = 0;\r\n\t\tMonst->_mAnimLen = 0;\r\n\t\tMonst->_mAnimFrame = 0;\r\n\t\tMonst->_mFlags = 0;\r\n\t\tMonst->_mDelFlag = FALSE;\r\n\t\tMonst->_menemy = random_(89, gbActivePlayers);\r\n\t\t// BUGFIX: `Monst->_menemy` may be referencing a player who already left the game, thus reading garbage data from `plr[Monst->_menemy]._pfutx`.\r\n\t\tMonst->_menemyx = plr[Monst->_menemy]._pfutx;\r\n\t\tMonst->_menemyy = plr[Monst->_menemy]._pfuty;\r\n\t}\r\n}\r\n\r\nBOOL MonstPlace(int xp, int yp)\r\n{\r\n\tchar f;\r\n\r\n\tif (xp < 0 || xp >= MAXDUNX\r\n\t    || yp < 0 || yp >= MAXDUNY\r\n\t    || dMonster[xp][yp] != 0\r\n\t    || dPlayer[xp][yp] != 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tf = dFlags[xp][yp];\r\n\r\n\tif (f & BFLAG_VISIBLE) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (f & BFLAG_POPULATED) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\treturn !SolidLoc(xp, yp);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid monster_some_crypt()\r\n{\r\n\tMonsterStruct *mon;\r\n\tint hp;\r\n\r\n\tif (currlevel == 24 && UberDiabloMonsterIndex >= 0 && UberDiabloMonsterIndex < nummonsters) {\r\n\t\tmon = &monster[UberDiabloMonsterIndex];\r\n\t\tPlayEffect(UberDiabloMonsterIndex, 2);\r\n\t\tquests[Q_NAKRUL]._qlog = FALSE;\r\n\t\tmon->mArmorClass -= 50;\r\n\t\thp = mon->_mmaxhp / 2;\r\n\t\tmon->mMagicRes = 0;\r\n\t\tmon->_mhitpoints = hp;\r\n\t\tmon->_mmaxhp = hp;\r\n\t}\r\n}\r\n\r\n#endif\r\nvoid PlaceMonster(int i, int mtype, int x, int y)\r\n{\r\n\tint rd;\r\n\r\n#ifdef HELLFIRE\r\n\tif (Monsters[mtype].mtype == MT_NAKRUL) {\r\n\t\tfor (int j = 0; j < nummonsters; j++) {\r\n\t\t\tif (monster[j]._mMTidx == mtype) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (monster[j].MType->mtype == MT_NAKRUL) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\tdMonster[x][y] = i + 1;\r\n\r\n\trd = random_(90, 8);\r\n\tInitMonster(i, rd, mtype, x, y);\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid PlaceUniqueMonst(int uniqindex, int miniontype, int bosspacksize)\r\n{\r\n\tint xp, yp, x, y, i;\r\n\tint uniqtype;\r\n\tint count2;\r\n\tchar filestr[64];\r\n\tBOOL zharflag, done;\r\n\tUniqMonstStruct *Uniq;\r\n\tMonsterStruct *Monst;\r\n\tint count;\r\n\r\n\tMonst = &monster[nummonsters];\r\n\tcount = 0;\r\n\tUniq = &UniqMonst[uniqindex];\r\n\r\n\tif ((uniquetrans + 19) << 8 >= LIGHTSIZE) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (uniqtype = 0; uniqtype < nummtypes; uniqtype++) {\r\n\t\tif (Monsters[uniqtype].mtype == UniqMonst[uniqindex].mtype) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\twhile (1) {\r\n\t\txp = random_(91, 80) + 16;\r\n\t\typ = random_(91, 80) + 16;\r\n\t\tcount2 = 0;\r\n\t\tfor (x = xp - 3; x < xp + 3; x++) {\r\n\t\t\tfor (y = yp - 3; y < yp + 3; y++) {\r\n\t\t\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX && MonstPlace(x, y)) {\r\n\t\t\t\t\tcount2++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (count2 < 9) {\r\n\t\t\tcount++;\r\n\t\t\tif (count < 1000) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (MonstPlace(xp, yp)) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (uniqindex == UMT_SNOTSPIL) {\r\n\t\txp = 2 * setpc_x + 24;\r\n\t\typ = 2 * setpc_y + 28;\r\n\t}\r\n\tif (uniqindex == UMT_WARLORD) {\r\n\t\txp = 2 * setpc_x + 22;\r\n\t\typ = 2 * setpc_y + 23;\r\n\t}\r\n\tif (uniqindex == UMT_ZHAR) {\r\n\t\tzharflag = TRUE;\r\n\t\tfor (i = 0; i < themeCount; i++) {\r\n\t\t\tif (i == zharlib && zharflag == TRUE) {\r\n\t\t\t\tzharflag = FALSE;\r\n\t\t\t\txp = 2 * themeLoc[i].x + 20;\r\n\t\t\t\typ = 2 * themeLoc[i].y + 20;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (uniqindex == UMT_LAZURUS) {\r\n\t\t\txp = 32;\r\n\t\t\typ = 46;\r\n\t\t}\r\n\t\tif (uniqindex == UMT_RED_VEX) {\r\n\t\t\txp = 40;\r\n\t\t\typ = 45;\r\n\t\t}\r\n\t\tif (uniqindex == UMT_BLACKJADE) {\r\n\t\t\txp = 38;\r\n\t\t\typ = 49;\r\n\t\t}\r\n\t\tif (uniqindex == UMT_SKELKING) {\r\n\t\t\txp = 35;\r\n\t\t\typ = 47;\r\n\t\t}\r\n\t} else {\r\n\t\tif (uniqindex == UMT_LAZURUS) {\r\n\t\t\txp = 2 * setpc_x + 19;\r\n\t\t\typ = 2 * setpc_y + 22;\r\n\t\t}\r\n\t\tif (uniqindex == UMT_RED_VEX) {\r\n\t\t\txp = 2 * setpc_x + 21;\r\n\t\t\typ = 2 * setpc_y + 19;\r\n\t\t}\r\n\t\tif (uniqindex == UMT_BLACKJADE) {\r\n\t\t\txp = 2 * setpc_x + 21;\r\n\t\t\typ = 2 * setpc_y + 25;\r\n\t\t}\r\n\t}\r\n\tif (uniqindex == UMT_BUTCHER) {\r\n\t\tdone = FALSE;\r\n\t\tfor (yp = 0; yp < MAXDUNY && !done; yp++) {\r\n\t\t\tfor (xp = 0; xp < MAXDUNX && !done; xp++) {\r\n\t\t\t\tdone = dPiece[xp][yp] == 367;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (uniqindex == UMT_NAKRUL) {\r\n\t\tif (UberRow == 0 || UberCol == 0) {\r\n\t\t\tUberDiabloMonsterIndex = -1;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\txp = UberRow - 2;\r\n\t\typ = UberCol;\r\n\t\tUberDiabloMonsterIndex = nummonsters;\r\n\t}\r\n#endif\r\n\tPlaceMonster(nummonsters, uniqtype, xp, yp);\r\n\tMonst->_uniqtype = uniqindex + 1;\r\n\r\n\tif (Uniq->mlevel) {\r\n\t\tMonst->mLevel = 2 * Uniq->mlevel;\r\n\t} else {\r\n\t\tMonst->mLevel += 5;\r\n\t}\r\n\r\n\tMonst->mExp *= 2;\r\n\tMonst->mName = Uniq->mName;\r\n\tMonst->_mmaxhp = Uniq->mmaxhp << 6;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tMonst->_mmaxhp = Monst->_mmaxhp >> 1;\r\n\t\tif (Monst->_mmaxhp < 64) {\r\n\t\t\tMonst->_mmaxhp = 64;\r\n\t\t}\r\n\t}\r\n\r\n\tMonst->_mhitpoints = Monst->_mmaxhp;\r\n\tMonst->_mAi = Uniq->mAi;\r\n\tMonst->_mint = Uniq->mint;\r\n\tMonst->mMinDamage = Uniq->mMinDamage;\r\n\tMonst->mMaxDamage = Uniq->mMaxDamage;\r\n\tMonst->mMinDamage2 = Uniq->mMinDamage;\r\n\tMonst->mMaxDamage2 = Uniq->mMaxDamage;\r\n\tMonst->mMagicRes = Uniq->mMagicRes;\r\n\tMonst->mtalkmsg = Uniq->mtalkmsg;\r\n#ifdef HELLFIRE\r\n\tif (uniqindex == UMT_HORKDMN)\r\n\t\tMonst->mlid = 0;\r\n\telse\r\n#endif\r\n\t\tMonst->mlid = AddLight(Monst->_mx, Monst->_my, 3);\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tif (Monst->_mAi == AI_LAZHELP)\r\n\t\t\tMonst->mtalkmsg = 0;\r\n#ifndef HELLFIRE\r\n\t\tif (Monst->_mAi != AI_LAZURUS || quests[Q_BETRAYER]._qvar1 <= 3) {\r\n\t\t\tif (Monst->mtalkmsg) {\r\n\t\t\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t}\r\n#endif\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (Monst->mtalkmsg)\r\n#else\r\n\telse if (Monst->mtalkmsg)\r\n#endif\r\n\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\r\n\tif (gnDifficulty == DIFF_NIGHTMARE) {\r\n#ifdef HELLFIRE\r\n\t\tMonst->_mmaxhp = 3 * Monst->_mmaxhp + ((gbMaxPlayers != 1 ? 100 : 50) << 6);\r\n#else\r\n\t\tMonst->_mmaxhp = 3 * Monst->_mmaxhp + 64;\r\n#endif\r\n\t\tMonst->mLevel += 15;\r\n\t\tMonst->_mhitpoints = Monst->_mmaxhp;\r\n\t\tMonst->mExp = 2 * (Monst->mExp + 1000);\r\n\t\tMonst->mMinDamage = 2 * (Monst->mMinDamage + 2);\r\n\t\tMonst->mMaxDamage = 2 * (Monst->mMaxDamage + 2);\r\n\t\tMonst->mMinDamage2 = 2 * (Monst->mMinDamage2 + 2);\r\n\t\tMonst->mMaxDamage2 = 2 * (Monst->mMaxDamage2 + 2);\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\telse if (gnDifficulty == DIFF_HELL) {\r\n#else\r\n\tif (gnDifficulty == DIFF_HELL) {\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\tMonst->_mmaxhp = 4 * Monst->_mmaxhp + ((gbMaxPlayers != 1 ? 200 : 100) << 6);\r\n#else\r\n\t\tMonst->_mmaxhp = 4 * Monst->_mmaxhp + 192;\r\n#endif\r\n\t\tMonst->mLevel += 30;\r\n\t\tMonst->_mhitpoints = Monst->_mmaxhp;\r\n\t\tMonst->mExp = 4 * (Monst->mExp + 1000);\r\n\t\tMonst->mMinDamage = 4 * Monst->mMinDamage + 6;\r\n\t\tMonst->mMaxDamage = 4 * Monst->mMaxDamage + 6;\r\n\t\tMonst->mMinDamage2 = 4 * Monst->mMinDamage2 + 6;\r\n\t\tMonst->mMaxDamage2 = 4 * Monst->mMaxDamage2 + 6;\r\n\t}\r\n\r\n\tsprintf(filestr, \"Monsters\\\\Monsters\\\\%s.TRN\", Uniq->mTrnName);\r\n\tLoadFileWithMem(filestr, &pLightTbl[256 * (uniquetrans + 19)]);\r\n\r\n\tMonst->_uniqtrans = uniquetrans++;\r\n\r\n\tif (Uniq->mUnqAttr & 4) {\r\n\t\tMonst->mHit = Uniq->mUnqVar1;\r\n\t\tMonst->mHit2 = Uniq->mUnqVar1;\r\n\t}\r\n\tif (Uniq->mUnqAttr & 8) {\r\n\t\tMonst->mArmorClass = Uniq->mUnqVar1;\r\n\t}\r\n\r\n\tnummonsters++;\r\n\r\n\tif (Uniq->mUnqAttr & 1) {\r\n\t\tPlaceGroup(miniontype, bosspacksize, Uniq->mUnqAttr, nummonsters - 1);\r\n\t}\r\n\r\n\tif (Monst->_mAi != AI_GARG) {\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];\r\n\t\tMonst->_mAnimFrame = random_(88, Monst->_mAnimLen - 1) + 1;\r\n\t\tMonst->_mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\tMonst->_mmode = MM_STAND;\r\n\t}\r\n}\r\n\r\nstatic void PlaceUniques()\r\n{\r\n\tint u, mt;\r\n\tBOOL done;\r\n\r\n\tfor (u = 0; UniqMonst[u].mtype != -1; u++) {\r\n\t\tif (UniqMonst[u].mlevel != currlevel)\r\n\t\t\tcontinue;\r\n\t\tdone = FALSE;\r\n\t\tfor (mt = 0; mt < nummtypes; mt++) {\r\n\t\t\tif (done)\r\n\t\t\t\tbreak;\r\n\t\t\tdone = (Monsters[mt].mtype == UniqMonst[u].mtype);\r\n\t\t}\r\n\t\tmt--;\r\n\t\tif (u == UMT_GARBUD && quests[Q_GARBUD]._qactive == QUEST_NOTAVAIL)\r\n\t\t\tdone = FALSE;\r\n\t\tif (u == UMT_ZHAR && quests[Q_ZHAR]._qactive == QUEST_NOTAVAIL)\r\n\t\t\tdone = FALSE;\r\n\t\tif (u == UMT_SNOTSPIL && quests[Q_LTBANNER]._qactive == QUEST_NOTAVAIL)\r\n\t\t\tdone = FALSE;\r\n\t\tif (u == UMT_LACHDAN && quests[Q_VEIL]._qactive == QUEST_NOTAVAIL)\r\n\t\t\tdone = FALSE;\r\n\t\tif (u == UMT_WARLORD && quests[Q_WARLORD]._qactive == QUEST_NOTAVAIL)\r\n\t\t\tdone = FALSE;\r\n\t\tif (done)\r\n\t\t\tPlaceUniqueMonst(u, mt, 8);\r\n\t}\r\n}\r\n\r\nvoid PlaceQuestMonsters()\r\n{\r\n\tint skeltype;\r\n\tBYTE *setp;\r\n\r\n\tif (!setlevel) {\r\n\t\tif (QuestStatus(Q_BUTCHER)) {\r\n\t\t\tPlaceUniqueMonst(UMT_BUTCHER, 0, 0);\r\n\t\t}\r\n\r\n\t\tif (currlevel == quests[Q_SKELKING]._qlevel && gbMaxPlayers != 1) {\r\n\t\t\tskeltype = 0;\r\n\r\n\t\t\tfor (skeltype = 0; skeltype < nummtypes; skeltype++) {\r\n\t\t\t\tif (IsSkel(Monsters[skeltype].mtype)) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tPlaceUniqueMonst(UMT_SKELKING, skeltype, 30);\r\n\t\t}\r\n\r\n\t\tif (QuestStatus(Q_LTBANNER)) {\r\n\t\t\tsetp = LoadFileInMem(\"Levels\\\\L1Data\\\\Banner1.DUN\", NULL);\r\n\t\t\tSetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\tmem_free_dbg(setp);\r\n\t\t}\r\n\t\tif (QuestStatus(Q_BLOOD)) {\r\n\t\t\tsetp = LoadFileInMem(\"Levels\\\\L2Data\\\\Blood2.DUN\", NULL);\r\n\t\t\tSetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\tmem_free_dbg(setp);\r\n\t\t}\r\n\t\tif (QuestStatus(Q_BLIND)) {\r\n\t\t\tsetp = LoadFileInMem(\"Levels\\\\L2Data\\\\Blind2.DUN\", NULL);\r\n\t\t\tSetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\tmem_free_dbg(setp);\r\n\t\t}\r\n\t\tif (QuestStatus(Q_ANVIL)) {\r\n\t\t\tsetp = LoadFileInMem(\"Levels\\\\L3Data\\\\Anvil.DUN\", NULL);\r\n\t\t\tSetMapMonsters(setp, 2 * setpc_x + 2, 2 * setpc_y + 2);\r\n\t\t\tmem_free_dbg(setp);\r\n\t\t}\r\n\t\tif (QuestStatus(Q_WARLORD)) {\r\n\t\t\tsetp = LoadFileInMem(\"Levels\\\\L4Data\\\\Warlord.DUN\", NULL);\r\n\t\t\tSetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\tmem_free_dbg(setp);\r\n\t\t\tAddMonsterType(UniqMonst[UMT_WARLORD].mtype, PLACE_SCATTER);\r\n\t\t}\r\n\t\tif (QuestStatus(Q_VEIL)) {\r\n\t\t\tAddMonsterType(UniqMonst[UMT_LACHDAN].mtype, PLACE_SCATTER);\r\n\t\t}\r\n\t\tif (QuestStatus(Q_ZHAR) && zharlib == -1) {\r\n\t\t\tquests[Q_ZHAR]._qactive = QUEST_NOTAVAIL;\r\n\t\t}\r\n\r\n\t\tif (currlevel == quests[Q_BETRAYER]._qlevel && gbMaxPlayers != 1) {\r\n\t\t\tAddMonsterType(UniqMonst[UMT_LAZURUS].mtype, PLACE_UNIQUE);\r\n\t\t\tAddMonsterType(UniqMonst[UMT_RED_VEX].mtype, PLACE_UNIQUE);\r\n\t\t\tPlaceUniqueMonst(UMT_LAZURUS, 0, 0);\r\n\t\t\tPlaceUniqueMonst(UMT_RED_VEX, 0, 0);\r\n\t\t\tPlaceUniqueMonst(UMT_BLACKJADE, 0, 0);\r\n\t\t\tsetp = LoadFileInMem(\"Levels\\\\L4Data\\\\Vile1.DUN\", NULL);\r\n\t\t\tSetMapMonsters(setp, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\tmem_free_dbg(setp);\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\r\n\t\tif (currlevel == 24) {\r\n\t\t\tUberDiabloMonsterIndex = -1;\r\n\t\t\tint i1;\r\n\t\t\tfor (i1 = 0; i1 < nummtypes; i1++) {\r\n\t\t\t\tif (Monsters[i1].mtype == UniqMonst[UMT_NAKRUL].mtype)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tif (i1 < nummtypes) {\r\n\t\t\t\tfor (int i2 = 0; i2 < nummonsters; i2++) {\r\n\t\t\t\t\tif (monster[i2]._uniqtype != 0 || monster[i2]._mMTidx == i1) {\r\n\t\t\t\t\t\tUberDiabloMonsterIndex = i2;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (UberDiabloMonsterIndex == -1)\r\n\t\t\t\tPlaceUniqueMonst(UMT_NAKRUL, 0, 0);\r\n\t\t}\r\n#endif\r\n\t} else if (setlvlnum == SL_SKELKING) {\r\n\t\tPlaceUniqueMonst(UMT_SKELKING, 0, 0);\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid PlaceGroup(int mtype, int num, int leaderf, int leader)\r\n{\r\n\tint placed, try1, try2, j;\r\n\tint xp, yp, x1, y1;\r\n\r\n\tplaced = 0;\r\n\r\n\tfor (try1 = 0; try1 < 10; try1++) {\r\n\t\twhile (placed) {\r\n\t\t\tnummonsters--;\r\n\t\t\tplaced--;\r\n\t\t\tdMonster[monster[nummonsters]._mx][monster[nummonsters]._my] = 0;\r\n\t\t}\r\n\r\n\t\tif (leaderf & 1) {\r\n\t\t\tint offset = random_(92, 8);\r\n\t\t\tx1 = xp = monster[leader]._mx + offset_x[offset];\r\n\t\t\ty1 = yp = monster[leader]._my + offset_y[offset];\r\n\t\t} else {\r\n\t\t\tdo {\r\n\t\t\t\tx1 = xp = random_(93, 80) + 16;\r\n\t\t\t\ty1 = yp = random_(93, 80) + 16;\r\n\t\t\t} while (!MonstPlace(xp, yp));\r\n\t\t}\r\n\r\n\t\tif (num + nummonsters > totalmonsters) {\r\n\t\t\tnum = totalmonsters - nummonsters;\r\n\t\t}\r\n\r\n\t\tj = 0;\r\n\t\tfor (try2 = 0; j < num && try2 < 100; xp += offset_x[random_(94, 8)], yp += offset_x[random_(94, 8)]) { /// BUGFIX: `yp += offset_y`\r\n\t\t\tif (!MonstPlace(xp, yp)\r\n\t\t\t    || (dTransVal[xp][yp] != dTransVal[x1][y1])\r\n\t\t\t    || (leaderf & 2) && ((abs(xp - x1) >= 4) || (abs(yp - y1) >= 4))) {\r\n\t\t\t\ttry2++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tPlaceMonster(nummonsters, mtype, xp, yp);\r\n\t\t\tif (leaderf & 1) {\r\n\t\t\t\tmonster[nummonsters]._mmaxhp *= 2;\r\n\t\t\t\tmonster[nummonsters]._mhitpoints = monster[nummonsters]._mmaxhp;\r\n\t\t\t\tmonster[nummonsters]._mint = monster[leader]._mint;\r\n\r\n\t\t\t\tif (leaderf & 2) {\r\n\t\t\t\t\tmonster[nummonsters].leader = leader;\r\n\t\t\t\t\tmonster[nummonsters].leaderflag = 1;\r\n\t\t\t\t\tmonster[nummonsters]._mAi = monster[leader]._mAi;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (monster[nummonsters]._mAi != AI_GARG) {\r\n\t\t\t\t\tmonster[nummonsters]._mAnimData = monster[nummonsters].MType->Anims[MA_STAND].Data[monster[nummonsters]._mdir];\r\n\t\t\t\t\tmonster[nummonsters]._mAnimFrame = random_(88, monster[nummonsters]._mAnimLen - 1) + 1;\r\n\t\t\t\t\tmonster[nummonsters]._mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\t\t\t\tmonster[nummonsters]._mmode = MM_STAND;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tnummonsters++;\r\n\t\t\tplaced++;\r\n\t\t\tj++;\r\n\t\t}\r\n\r\n\t\tif (placed >= num) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (leaderf & 2) {\r\n\t\tmonster[leader].packsize = placed;\r\n\t}\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid LoadDiabMonsts()\r\n{\r\n\tBYTE *lpSetPiece;\r\n\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab1.DUN\", NULL);\r\n\tSetMapMonsters(lpSetPiece, 2 * diabquad1x, 2 * diabquad1y);\r\n\tmem_free_dbg(lpSetPiece);\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab2a.DUN\", NULL);\r\n\tSetMapMonsters(lpSetPiece, 2 * diabquad2x, 2 * diabquad2y);\r\n\tmem_free_dbg(lpSetPiece);\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab3a.DUN\", NULL);\r\n\tSetMapMonsters(lpSetPiece, 2 * diabquad3x, 2 * diabquad3y);\r\n\tmem_free_dbg(lpSetPiece);\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab4a.DUN\", NULL);\r\n\tSetMapMonsters(lpSetPiece, 2 * diabquad4x, 2 * diabquad4y);\r\n\tmem_free_dbg(lpSetPiece);\r\n}\r\n#endif\r\n\r\nvoid InitMonsters()\r\n{\r\n\tint na, nt;\r\n\tint i, s, t;\r\n\tint numplacemonsters;\r\n\tint mtype;\r\n\tint numscattypes;\r\n\tint scattertypes[NUM_MTYPES];\r\n\r\n\tnumscattypes = 0;\r\n\tif (gbMaxPlayers != 1)\r\n\t\tCheckDungeonClear();\r\n\tif (!setlevel) {\r\n\t\tAddMonster(1, 0, 0, 0, FALSE);\r\n\t\tAddMonster(1, 0, 0, 0, FALSE);\r\n\t\tAddMonster(1, 0, 0, 0, FALSE);\r\n\t\tAddMonster(1, 0, 0, 0, FALSE);\r\n\t}\r\n#ifndef SPAWN\r\n\tif (!setlevel && currlevel == 16)\r\n\t\tLoadDiabMonsts();\r\n#endif\r\n\tnt = numtrigs;\r\n\tif (currlevel == 15)\r\n\t\tnt = 1;\r\n\tfor (i = 0; i < nt; i++) {\r\n\t\tfor (s = -2; s < 2; s++) {\r\n\t\t\tfor (t = -2; t < 2; t++)\r\n\t\t\t\tDoVision(s + trigs[i]._tx, t + trigs[i]._ty, 15, FALSE, FALSE);\r\n\t\t}\r\n\t}\r\n#ifndef SPAWN\r\n\tPlaceQuestMonsters();\r\n#endif\r\n\tif (!setlevel) {\r\n#ifndef SPAWN\r\n\t\tPlaceUniques();\r\n#endif\r\n\t\tna = 0;\r\n\t\tfor (s = 16; s < 96; s++)\r\n\t\t\tfor (t = 16; t < 96; t++)\r\n\t\t\t\tif (!SolidLoc(s, t))\r\n\t\t\t\t\tna++;\r\n\t\tnumplacemonsters = na / 30;\r\n\t\tif (gbMaxPlayers != 1)\r\n\t\t\tnumplacemonsters += numplacemonsters >> 1;\r\n\t\tif (nummonsters + numplacemonsters > MAXMONSTERS - 10)\r\n\t\t\tnumplacemonsters = MAXMONSTERS - 10 - nummonsters;\r\n\t\ttotalmonsters = nummonsters + numplacemonsters;\r\n\t\tfor (i = 0; i < nummtypes; i++) {\r\n\t\t\tif (Monsters[i].mPlaceFlags & PLACE_SCATTER) {\r\n\t\t\t\tscattertypes[numscattypes] = i;\r\n\t\t\t\tnumscattypes++;\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile (nummonsters < totalmonsters) {\r\n\t\t\tmtype = scattertypes[random_(95, numscattypes)];\r\n\t\t\tif (currlevel == 1 || random_(95, 2) == 0)\r\n\t\t\t\tna = 1;\r\n#ifdef HELLFIRE\r\n\t\t\telse if (currlevel == 2 || currlevel >= 21 && currlevel <= 24)\r\n#else\r\n\t\t\telse if (currlevel == 2)\r\n#endif\r\n\t\t\t\tna = random_(95, 2) + 2;\r\n\t\t\telse\r\n\t\t\t\tna = random_(95, 3) + 3;\r\n\t\t\tPlaceGroup(mtype, na, 0, 0);\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; i < nt; i++) {\r\n\t\tfor (s = -2; s < 2; s++) {\r\n\t\t\tfor (t = -2; t < 2; t++)\r\n\t\t\t\tDoUnVision(s + trigs[i]._tx, t + trigs[i]._ty, 15);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid SetMapMonsters(BYTE *pMap, int startx, int starty)\r\n{\r\n\tWORD rw, rh;\r\n\tWORD *lm;\r\n\tint i, j;\r\n\tint mtype;\r\n\r\n\tAddMonsterType(MT_GOLEM, PLACE_SPECIAL);\r\n\t// See https://github.com/diasurgical/devilutionX/pull/2822\r\n\tAddMonster(1, 0, 0, 0, FALSE); // BUGFIX: add only if setlevel is true\r\n\tAddMonster(1, 0, 0, 0, FALSE); // BUGFIX: add only if setlevel is true\r\n\tAddMonster(1, 0, 0, 0, FALSE); // BUGFIX: add only if setlevel is true\r\n\tAddMonster(1, 0, 0, 0, FALSE); // BUGFIX: add only if setlevel is true\r\n\tif (setlevel && setlvlnum == SL_VILEBETRAYER) {\r\n\t\tAddMonsterType(UniqMonst[UMT_LAZURUS].mtype, PLACE_UNIQUE);\r\n\t\tAddMonsterType(UniqMonst[UMT_RED_VEX].mtype, PLACE_UNIQUE);\r\n\t\tAddMonsterType(UniqMonst[UMT_BLACKJADE].mtype, PLACE_UNIQUE);\r\n\t\tPlaceUniqueMonst(UMT_LAZURUS, 0, 0);\r\n\t\tPlaceUniqueMonst(UMT_RED_VEX, 0, 0);\r\n\t\tPlaceUniqueMonst(UMT_BLACKJADE, 0, 0);\r\n\t}\r\n\tlm = (WORD *)pMap;\r\n\trw = *lm++;\r\n\trh = *lm++;\r\n\tlm += rw * rh;\r\n\trw = rw << 1;\r\n\trh = rh << 1;\r\n\tlm += rw * rh;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm != 0) {\r\n\t\t\t\tmtype = AddMonsterType(MonstConvTbl[(*lm) - 1], PLACE_SPECIAL);\r\n\t\t\t\tPlaceMonster(nummonsters++, mtype, i + startx + 16, j + starty + 16);\r\n\t\t\t}\r\n\t\t\tlm++;\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid DeleteMonster(int i)\r\n{\r\n\tint temp;\r\n\r\n\tnummonsters--;\r\n\ttemp = monstactive[nummonsters];\r\n\tmonstactive[nummonsters] = monstactive[i];\r\n\tmonstactive[i] = temp;\r\n}\r\n\r\nint AddMonster(int x, int y, int dir, int mtype, BOOL InMap)\r\n{\r\n\tif (nummonsters < MAXMONSTERS) {\r\n\t\tint i = monstactive[nummonsters++];\r\n\t\tif (InMap)\r\n\t\t\tdMonster[x][y] = i + 1;\r\n\t\tInitMonster(i, dir, mtype, x, y);\r\n\t\treturn i;\r\n\t}\r\n\r\n\treturn -1;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid AddDoppelganger(int i)\r\n{\r\n\tint x, y, d, j, oi, dir, mx, my;\r\n\r\n\tif (monster[i].MType) {\r\n\t\tmx = monster[i]._mx;\r\n\t\tmy = monster[i]._my;\r\n\t\tdir = monster[i]._mdir;\r\n\t\tfor (d = 0; d < 8; d++) {\r\n\t\t\tx = mx + offset_x[d];\r\n\t\t\ty = my + offset_y[d];\r\n\t\t\tif (!SolidLoc(x, y)) {\r\n\t\t\t\tif (dPlayer[x][y] == 0 && dMonster[x][y] == 0) {\r\n\t\t\t\t\tif (dObject[x][y] == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\toi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);\r\n\t\t\t\t\tif (!object[oi]._oSolidFlag)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (d < 8) {\r\n\t\t\tfor (j = 0; j < MAX_LVLMTYPES; j++) {\r\n\t\t\t\tif (Monsters[j].mtype == monster[i].MType->mtype)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (j < MAX_LVLMTYPES)\r\n\t\t\t\tAddMonster(x, y, dir, j, TRUE);\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid NewMonsterAnim(int i, AnimStruct &anim, int md)\r\n{\r\n\tMonsterStruct *Monst = &monster[i];\r\n\tMonst->_mAnimData = anim.Data[md];\r\n\tMonst->_mAnimLen = anim.Frames;\r\n\tMonst->_mAnimCnt = 0;\r\n\tMonst->_mAnimFrame = 1;\r\n\tMonst->_mAnimDelay = anim.Rate;\r\n\tMonst->_mFlags &= ~(MFLAG_LOCK_ANIMATION | MFLAG_ALLOW_SPECIAL);\r\n\tMonst->_mdir = md;\r\n}\r\n\r\nBOOL M_Ranged(int i)\r\n{\r\n\tchar ai = monster[i]._mAi;\r\n\treturn ai == AI_SKELBOW || ai == AI_GOATBOW || ai == AI_SUCC || ai == AI_LAZHELP;\r\n}\r\n\r\nBOOL M_Talker(int i)\r\n{\r\n\tchar ai = monster[i]._mAi;\r\n\treturn ai == AI_LAZURUS\r\n\t    || ai == AI_WARLORD\r\n\t    || ai == AI_GARBUD\r\n\t    || ai == AI_ZHAR\r\n\t    || ai == AI_SNOTSPIL\r\n\t    || ai == AI_LACHDAN\r\n\t    || ai == AI_LAZHELP;\r\n}\r\n\r\nvoid M_Enemy(int i)\r\n{\r\n\tint j;\r\n\tint mi, pnum;\r\n\tint dist, best_dist;\r\n\tint _menemy;\r\n\tDIABOOL sameroom, bestsameroom;\r\n\tMonsterStruct *Monst;\r\n\tBYTE enemyx, enemyy;\r\n\r\n\t_menemy = -1;\r\n\tbest_dist = -1;\r\n\tbestsameroom = 0;\r\n\tMonst = &monster[i];\r\n\tif (\r\n#ifdef HELLFIRE\r\n\t    Monst->_mFlags & MFLAG_BERSERK ||\r\n#endif\r\n\t    !(Monst->_mFlags & MFLAG_GOLEM)) {\r\n\t\tfor (pnum = 0; pnum < MAX_PLRS; pnum++) {\r\n\t\t\tif (!plr[pnum].plractive || currlevel != plr[pnum].plrlevel || plr[pnum]._pLvlChanging\r\n#ifdef HELLFIRE\r\n\t\t\t    || ((plr[pnum]._pHitPoints >> 6) == 0)\r\n#else\r\n\t\t\t    || (plr[pnum]._pHitPoints == 0 && gbMaxPlayers != 1)\r\n#endif\r\n\t\t\t)\r\n\t\t\t\tcontinue;\r\n#ifdef HELLFIRE\r\n\t\t\tsameroom = (dTransVal[Monst->_mx][Monst->_my] == dTransVal[plr[pnum]._px][plr[pnum]._py]);\r\n#else\r\n\t\t\tif (dTransVal[Monst->_mx][Monst->_my] == dTransVal[plr[pnum]._px][plr[pnum]._py])\r\n\t\t\t\tsameroom = TRUE;\r\n\t\t\telse\r\n\t\t\t\tsameroom = FALSE;\r\n#endif\r\n\t\t\tif (abs(Monst->_mx - plr[pnum]._px) > abs(Monst->_my - plr[pnum]._py))\r\n\t\t\t\tdist = Monst->_mx - plr[pnum]._px;\r\n\t\t\telse\r\n\t\t\t\tdist = Monst->_my - plr[pnum]._py;\r\n\t\t\tdist = abs(dist);\r\n\t\t\tif ((sameroom && !bestsameroom)\r\n\t\t\t    || ((sameroom || !bestsameroom) && dist < best_dist)\r\n\t\t\t    || (_menemy == -1)) {\r\n\t\t\t\tMonst->_mFlags &= ~MFLAG_TARGETS_MONSTER;\r\n\t\t\t\t_menemy = pnum;\r\n\t\t\t\tenemyx = plr[pnum]._pfutx;\r\n\t\t\t\tenemyy = plr[pnum]._pfuty;\r\n\t\t\t\tbest_dist = dist;\r\n\t\t\t\tbestsameroom = sameroom;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (j = 0; j < nummonsters; j++) {\r\n\t\tmi = monstactive[j];\r\n\t\tif (mi == i)\r\n\t\t\tcontinue;\r\n#ifdef HELLFIRE\r\n\t\tif (!((monster[mi]._mhitpoints >> 6) > 0))\r\n\t\t\tcontinue;\r\n#endif\r\n\t\tif (monster[mi]._mx == 1 && monster[mi]._my == 0)\r\n\t\t\tcontinue;\r\n\t\tif (M_Talker(mi) && monster[mi].mtalkmsg)\r\n\t\t\tcontinue;\r\n\t\tif ((!(Monst->_mFlags & MFLAG_GOLEM)\r\n#ifdef HELLFIRE\r\n\t\t        && !(Monst->_mFlags & MFLAG_BERSERK)\r\n#endif\r\n\t\t        && (abs(monster[mi]._mx - Monst->_mx) >= 2 || abs(monster[mi]._my - Monst->_my) >= 2)\r\n\t\t        && !M_Ranged(i))\r\n\t\t    || (!(Monst->_mFlags & MFLAG_GOLEM)\r\n#ifdef HELLFIRE\r\n\t\t        && !(Monst->_mFlags & MFLAG_BERSERK)\r\n#endif\r\n\t\t        && !(monster[mi]._mFlags & MFLAG_GOLEM))) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tsameroom = dTransVal[Monst->_mx][Monst->_my] == dTransVal[monster[mi]._mx][monster[mi]._my];\r\n\t\tif (abs(Monst->_mx - monster[mi]._mx) > abs(Monst->_my - monster[mi]._my))\r\n\t\t\tdist = Monst->_mx - monster[mi]._mx;\r\n\t\telse\r\n\t\t\tdist = Monst->_my - monster[mi]._my;\r\n\t\tdist = abs(dist);\r\n\t\tif ((sameroom && !bestsameroom)\r\n\t\t    || ((sameroom || !bestsameroom) && dist < best_dist)\r\n\t\t    || (_menemy == -1)) {\r\n\t\t\tMonst->_mFlags |= MFLAG_TARGETS_MONSTER;\r\n\t\t\t_menemy = mi;\r\n\t\t\tenemyx = monster[mi]._mfutx;\r\n\t\t\tenemyy = monster[mi]._mfuty;\r\n\t\t\tbest_dist = dist;\r\n\t\t\tbestsameroom = sameroom;\r\n\t\t}\r\n\t}\r\n\tif (_menemy != -1) {\r\n\t\tMonst->_mFlags &= ~MFLAG_NO_ENEMY;\r\n\t\tMonst->_menemy = _menemy;\r\n\t\tMonst->_menemyx = enemyx;\r\n\t\tMonst->_menemyy = enemyy;\r\n\t} else {\r\n\t\tMonst->_mFlags |= MFLAG_NO_ENEMY;\r\n\t}\r\n}\r\n\r\nint M_GetDir(int i)\r\n{\r\n\treturn GetDirection(monster[i]._mx, monster[i]._my, monster[i]._menemyx, monster[i]._menemyy);\r\n}\r\n\r\nvoid M_CheckEFlag(int i)\r\n{\r\n\tint f, j;\r\n\tint x, y;\r\n\tWORD *m;\r\n\r\n\tx = monster[i]._mx - 1;\r\n\ty = monster[i]._my + 1;\r\n\tf = 0;\r\n\t// BUGFIX check (x > 0 && y < MAXDUNY)\r\n\tm = dpiece_defs_map_2[x][y].mt;\r\n#ifdef HELLFIRE\r\n\tfor (j = 2; j < 10; j++) {\r\n\t\tf |= m[j];\r\n\t}\r\n#else\r\n\tif (m >= dpiece_defs_map_2[0][0].mt) {\r\n\t\tfor (j = 2; j < 10; j++) {\r\n\t\t\tf |= m[j];\r\n\t\t}\r\n\t} else {\r\n\t\tmonster[i]._meflag = FALSE;\r\n\t\treturn;\r\n\t}\r\n#endif\r\n\r\n\tif (f | dSpecial[x][y])\r\n\t\tmonster[i]._meflag = TRUE;\r\n\telse {\r\n\t\tmonster[i]._meflag = FALSE;\r\n\t}\r\n}\r\n\r\nvoid M_StartStand(int i, int md)\r\n{\r\n\tClearMVars(i);\r\n\tif (monster[i].MType->mtype == MT_GOLEM)\r\n\t\tNewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], md);\r\n\telse\r\n\t\tNewMonsterAnim(i, monster[i].MType->Anims[MA_STAND], md);\r\n\tmonster[i]._mVar1 = monster[i]._mmode;\r\n\tmonster[i]._mVar2 = 0;\r\n\tmonster[i]._mmode = MM_STAND;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mdir = md;\r\n\tM_CheckEFlag(i);\r\n\tM_Enemy(i);\r\n}\r\n\r\nvoid M_StartDelay(int i, int len)\r\n{\r\n\tif (len <= 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (monster[i]._mAi != AI_LAZURUS) {\r\n\t\tmonster[i]._mVar2 = len;\r\n\t\tmonster[i]._mmode = MM_DELAY;\r\n\t}\r\n}\r\n\r\nvoid M_StartSpStand(int i, int md)\r\n{\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);\r\n\tmonster[i]._mmode = MM_SPSTAND;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mdir = md;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartWalk(int i, int xvel, int yvel, int xadd, int yadd, int EndDir)\r\n{\r\n\tint fx = xadd + monster[i]._mx;\r\n\tint fy = yadd + monster[i]._my;\r\n\r\n\tdMonster[fx][fy] = -(i + 1);\r\n\tmonster[i]._mmode = MM_WALK;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mfutx = fx;\r\n\tmonster[i]._mfuty = fy;\r\n\tmonster[i]._mxvel = xvel;\r\n\tmonster[i]._myvel = yvel;\r\n\tmonster[i]._mVar1 = xadd;\r\n\tmonster[i]._mVar2 = yadd;\r\n\tmonster[i]._mVar3 = EndDir;\r\n\tmonster[i]._mdir = EndDir;\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], EndDir);\r\n\tmonster[i]._mVar6 = 0;\r\n\tmonster[i]._mVar7 = 0;\r\n\tmonster[i]._mVar8 = 0;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartWalk2(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int EndDir)\r\n{\r\n\tint fx = xadd + monster[i]._mx;\r\n\tint fy = yadd + monster[i]._my;\r\n\r\n\tdMonster[monster[i]._mx][monster[i]._my] = -(i + 1);\r\n\tmonster[i]._mVar1 = monster[i]._mx;\r\n\tmonster[i]._mVar2 = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mx = fx;\r\n\tmonster[i]._my = fy;\r\n\tmonster[i]._mfutx = fx;\r\n\tmonster[i]._mfuty = fy;\r\n\tdMonster[fx][fy] = i + 1;\r\n#ifdef HELLFIRE\r\n\tif (!(monster[i]._mFlags & MFLAG_HIDDEN) && monster[i].mlid != 0)\r\n#else\r\n\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\tChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my);\r\n\tmonster[i]._mxoff = xoff;\r\n\tmonster[i]._myoff = yoff;\r\n\tmonster[i]._mmode = MM_WALK2;\r\n\tmonster[i]._mxvel = xvel;\r\n\tmonster[i]._myvel = yvel;\r\n\tmonster[i]._mVar3 = EndDir;\r\n\tmonster[i]._mdir = EndDir;\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], EndDir);\r\n\tmonster[i]._mVar6 = 16 * xoff;\r\n\tmonster[i]._mVar7 = 16 * yoff;\r\n\tmonster[i]._mVar8 = 0;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartWalk3(int i, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int mapx, int mapy, int EndDir)\r\n{\r\n\tint fx = xadd + monster[i]._mx;\r\n\tint fy = yadd + monster[i]._my;\r\n\tint x = mapx + monster[i]._mx;\r\n\tint y = mapy + monster[i]._my;\r\n\r\n#ifdef HELLFIRE\r\n\tif (!(monster[i]._mFlags & MFLAG_HIDDEN) && monster[i].mlid != 0)\r\n#else\r\n\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\tChangeLightXY(monster[i].mlid, x, y);\r\n\r\n\tdMonster[monster[i]._mx][monster[i]._my] = -(i + 1);\r\n\tdMonster[fx][fy] = -(i + 1);\r\n\tmonster[i]._mVar4 = x;\r\n\tmonster[i]._mVar5 = y;\r\n\tdFlags[x][y] |= BFLAG_MONSTLR;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mfutx = fx;\r\n\tmonster[i]._mfuty = fy;\r\n\tmonster[i]._mxoff = xoff;\r\n\tmonster[i]._myoff = yoff;\r\n\tmonster[i]._mmode = MM_WALK3;\r\n\tmonster[i]._mxvel = xvel;\r\n\tmonster[i]._myvel = yvel;\r\n\tmonster[i]._mVar1 = fx;\r\n\tmonster[i]._mVar2 = fy;\r\n\tmonster[i]._mVar3 = EndDir;\r\n\tmonster[i]._mdir = EndDir;\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_WALK], EndDir);\r\n\tmonster[i]._mVar6 = 16 * xoff;\r\n\tmonster[i]._mVar7 = 16 * yoff;\r\n\tmonster[i]._mVar8 = 0;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartAttack(int i)\r\n{\r\n\tint md = M_GetDir(i);\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_ATTACK], md);\r\n\tmonster[i]._mmode = MM_ATTACK;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mdir = md;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartRAttack(int i, int missile_type, int dam)\r\n{\r\n\tint md = M_GetDir(i);\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_ATTACK], md);\r\n\tmonster[i]._mmode = MM_RATTACK;\r\n\tmonster[i]._mVar1 = missile_type;\r\n\tmonster[i]._mVar2 = dam;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mdir = md;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartRSpAttack(int i, int missile_type, int dam)\r\n{\r\n\tint md = M_GetDir(i);\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);\r\n\tmonster[i]._mmode = MM_RSPATTACK;\r\n\tmonster[i]._mVar1 = missile_type;\r\n\tmonster[i]._mVar2 = 0;\r\n\tmonster[i]._mVar3 = dam;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mdir = md;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartSpAttack(int i)\r\n{\r\n\tint md = M_GetDir(i);\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);\r\n\tmonster[i]._mmode = MM_SATTACK;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tmonster[i]._mdir = md;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_StartEat(int i)\r\n{\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], monster[i]._mdir);\r\n\tmonster[i]._mmode = MM_SATTACK;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tM_CheckEFlag(i);\r\n}\r\n\r\nvoid M_ClearSquares(int i)\r\n{\r\n\tint x, y, mx, my, m1, m2;\r\n\r\n\tmx = monster[i]._moldx;\r\n\tmy = monster[i]._moldy;\r\n\tm1 = -1 - i;\r\n\tm2 = i + 1;\r\n\r\n#ifdef HELLFIRE\r\n\tfor (y = my - 1; y <= my + 1; y++) {\r\n\t\tfor (x = mx - 1; x <= mx + 1; x++) {\r\n\t\t\tif (dMonster[x][y] == m1 || dMonster[x][y] == m2)\r\n\t\t\t\tdMonster[x][y] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tdFlags[mx + 1][my] &= ~BFLAG_MONSTLR;\r\n\tdFlags[mx][my + 1] &= ~BFLAG_MONSTLR;\r\n#else\r\n\tfor (y = my - 1; y <= my + 1; y++) {\r\n\t\tif (y >= 0 && y < MAXDUNY) {\r\n\t\t\tfor (x = mx - 1; x <= mx + 1; x++) {\r\n\t\t\t\tif (x >= 0 && x < MAXDUNX && (dMonster[x][y] == m1 || dMonster[x][y] == m2))\r\n\t\t\t\t\tdMonster[x][y] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (mx + 1 < MAXDUNX)\r\n\t\tdFlags[mx + 1][my] &= ~BFLAG_MONSTLR;\r\n\tif (my + 1 < MAXDUNY)\r\n\t\tdFlags[mx][my + 1] &= ~BFLAG_MONSTLR;\r\n#endif\r\n}\r\n\r\nvoid M_GetKnockback(int i)\r\n{\r\n\tint d = (monster[i]._mdir - 4) & 7;\r\n\tif (DirOK(i, d)) {\r\n\t\tM_ClearSquares(i);\r\n\t\tmonster[i]._moldx += offset_x[d];\r\n\t\tmonster[i]._moldy += offset_y[d];\r\n\t\tNewMonsterAnim(i, monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir);\r\n\t\tmonster[i]._mmode = MM_GOTHIT;\r\n\t\tmonster[i]._mxoff = 0;\r\n\t\tmonster[i]._myoff = 0;\r\n\t\tmonster[i]._mx = monster[i]._moldx;\r\n\t\tmonster[i]._my = monster[i]._moldy;\r\n\t\tmonster[i]._mfutx = monster[i]._mx;\r\n\t\tmonster[i]._mfuty = monster[i]._my;\r\n\t\tmonster[i]._moldx = monster[i]._mx; // CODEFIX: useless assignment\r\n\t\tmonster[i]._moldy = monster[i]._my; // CODEFIX: useless assignment\r\n\t\tM_CheckEFlag(i);\r\n\t\tM_ClearSquares(i);\r\n\t\tdMonster[monster[i]._mx][monster[i]._my] = i + 1;\r\n\t}\r\n}\r\n\r\nvoid M_StartHit(int i, int pnum, int dam)\r\n{\r\n\tif (pnum >= 0)\r\n\t\tmonster[i].mWhoHit |= 1 << pnum;\r\n\tif (pnum == myplr) {\r\n\t\tdelta_monster_hp(i, monster[i]._mhitpoints, currlevel);\r\n#ifdef HELLFIRE\r\n\t\tNetSendCmdMonDmg(FALSE, i, dam);\r\n#else\r\n\t\tNetSendCmdParam2(FALSE, CMD_MONSTDAMAGE, i, dam);\r\n#endif\r\n\t}\r\n\tPlayEffect(i, 1);\r\n\tif (monster[i].MType->mtype >= MT_SNEAK && monster[i].MType->mtype <= MT_ILLWEAV || dam >> 6 >= monster[i].mLevel + 3) {\r\n\t\tif (pnum >= 0) {\r\n\t\t\tmonster[i]._menemy = pnum;\r\n\t\t\tmonster[i]._menemyx = plr[pnum]._pfutx;\r\n\t\t\tmonster[i]._menemyy = plr[pnum]._pfuty;\r\n\t\t\tmonster[i]._mFlags &= ~MFLAG_TARGETS_MONSTER;\r\n\t\t\tmonster[i]._mdir = M_GetDir(i);\r\n\t\t}\r\n\t\tif (monster[i].MType->mtype == MT_BLINK) {\r\n\t\t\tM_Teleport(i);\r\n\t\t} else if ((monster[i].MType->mtype >= MT_NSCAV && monster[i].MType->mtype <= MT_YSCAV)\r\n#ifdef HELLFIRE\r\n\t\t    || monster[i].MType->mtype == MT_GRAVEDIG\r\n#endif\r\n\t\t) {\r\n\t\t\tmonster[i]._mgoal = MGOAL_NORMAL;\r\n#ifdef HELLFIRE\r\n\t\t\tmonster[i]._mgoalvar1 = 0;\r\n\t\t\tmonster[i]._mgoalvar2 = 0;\r\n#endif\r\n\t\t}\r\n\t\tif (monster[i]._mmode != MM_STONE) {\r\n\t\t\tNewMonsterAnim(i, monster[i].MType->Anims[MA_GOTHIT], monster[i]._mdir);\r\n\t\t\tmonster[i]._mmode = MM_GOTHIT;\r\n\t\t\tmonster[i]._mxoff = 0;\r\n\t\t\tmonster[i]._myoff = 0;\r\n\t\t\tmonster[i]._mx = monster[i]._moldx;\r\n\t\t\tmonster[i]._my = monster[i]._moldy;\r\n\t\t\tmonster[i]._mfutx = monster[i]._moldx;\r\n\t\t\tmonster[i]._mfuty = monster[i]._moldy;\r\n\t\t\tmonster[i]._moldx = monster[i]._mx;\r\n\t\t\tmonster[i]._moldy = monster[i]._my;\r\n\t\t\tM_CheckEFlag(i);\r\n\t\t\tM_ClearSquares(i);\r\n\t\t\tdMonster[monster[i]._mx][monster[i]._my] = i + 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid M_DiabloDeath(int i, BOOL sendmsg)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint dist;\r\n\tint j, k;\r\n\r\n\tMonst = &monster[i];\r\n#ifndef SPAWN\r\n\tPlaySFX(USFX_DIABLOD);\r\n#endif\r\n\tquests[Q_DIABLO]._qactive = QUEST_DONE;\r\n\tif (sendmsg)\r\n\t\tNetSendCmdQuest(TRUE, Q_DIABLO);\r\n\tsgbSaveSoundOn = gbSoundOn;\r\n\tgbProcessPlayers = FALSE;\r\n#ifdef HELLFIRE\r\n\tgbSoundOn = FALSE;\r\n#endif\r\n\tfor (j = 0; j < nummonsters; j++) {\r\n\t\tk = monstactive[j];\r\n\t\tif (k == i || monster[i]._msquelch == 0)\r\n\t\t\tcontinue;\r\n\r\n\t\tNewMonsterAnim(k, monster[k].MType->Anims[MA_DEATH], monster[k]._mdir);\r\n\t\tmonster[k]._mmode = MM_DEATH;\r\n\t\tmonster[k]._mxoff = 0;\r\n\t\tmonster[k]._myoff = 0;\r\n\t\tmonster[k]._mVar1 = 0;\r\n\t\tmonster[k]._mx = monster[k]._moldx;\r\n\t\tmonster[k]._my = monster[k]._moldy;\r\n\t\tmonster[k]._mfutx = monster[k]._mx;\r\n\t\tmonster[k]._mfuty = monster[k]._my;\r\n\t\tmonster[k]._moldx = monster[k]._mx; // CODEFIX: useless assignment\r\n\t\tmonster[k]._moldy = monster[k]._my; // CODEFIX: useless assignment\r\n\t\tM_CheckEFlag(k);\r\n\t\tM_ClearSquares(k);\r\n\t\tdMonster[monster[k]._mx][monster[k]._my] = k + 1;\r\n\t}\r\n\tAddLight(Monst->_mx, Monst->_my, 8);\r\n\tDoVision(Monst->_mx, Monst->_my, 8, FALSE, TRUE);\r\n\tif (abs(ViewX - Monst->_mx) > abs(ViewY - Monst->_my))\r\n\t\tdist = abs(ViewX - Monst->_mx);\r\n\telse\r\n\t\tdist = abs(ViewY - Monst->_my);\r\n\tif (dist > 20)\r\n\t\tdist = 20;\r\n\tMonst->_mVar3 = ViewX << 16;\r\n\tMonst->_mVar4 = ViewY << 16;\r\n\tMonst->_mVar5 = (int)((Monst->_mVar3 - (Monst->_mx << 16)) / (double)dist);\r\n\tMonst->_mVar6 = (int)((Monst->_mVar4 - (Monst->_my << 16)) / (double)dist);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid SpawnLoot(int i, BOOL sendmsg)\r\n{\r\n\tint nSFX;\r\n\tMonsterStruct *Monst;\r\n\r\n\tMonst = &monster[i];\r\n\tif (QuestStatus(Q_GARBUD) && Monst->mName == UniqMonst[UMT_GARBUD].mName) {\r\n\t\tCreateTypeItem(Monst->_mx + 1, Monst->_my + 1, TRUE, ITYPE_MACE, IMISC_NONE, TRUE, FALSE);\r\n\t} else if (Monst->mName == UniqMonst[UMT_DEFILER].mName) {\r\n\t\tif (effect_is_playing(USFX_DEFILER8))\r\n\t\t\tstream_stop();\r\n\t\tquests[Q_DEFILER]._qlog = FALSE;\r\n\t\tSpawnMapOfDoom(Monst->_mx, Monst->_my);\r\n\t} else if (Monst->mName == UniqMonst[UMT_HORKDMN].mName) {\r\n\t\tif (UseTheoQuest) {\r\n\t\t\tSpawnTheodore(Monst->_mx, Monst->_my);\r\n\t\t} else {\r\n\t\t\tCreateAmulet(Monst->_mx, Monst->_my, 13, FALSE, TRUE);\r\n\t\t}\r\n\t} else if (Monst->MType->mtype == MT_HORKSPWN) {\r\n\t} else if (Monst->MType->mtype == MT_NAKRUL) {\r\n\t\tnSFX = IsUberRoomOpened ? USFX_NAKRUL4 : USFX_NAKRUL5;\r\n\t\tif (UseCowFarmer)\r\n\t\t\tnSFX = USFX_NAKRUL6;\r\n\t\tif (effect_is_playing(nSFX))\r\n\t\t\tstream_stop();\r\n\t\tquests[Q_NAKRUL]._qlog = FALSE;\r\n\t\tUberDiabloMonsterIndex = -2;\r\n\t\tCreateMagicWeapon(Monst->_mx, Monst->_my, ITYPE_SWORD, ICURS_GREAT_SWORD, FALSE, TRUE);\r\n\t\tCreateMagicWeapon(Monst->_mx, Monst->_my, ITYPE_STAFF, ICURS_WAR_STAFF, FALSE, TRUE);\r\n\t\tCreateMagicWeapon(Monst->_mx, Monst->_my, ITYPE_BOW, ICURS_LONG_WAR_BOW, FALSE, TRUE);\r\n\t\tCreateSpellBook(Monst->_mx, Monst->_my, SPL_APOCA, FALSE, TRUE);\r\n\t} else if (i > MAX_PLRS - 1) { // Golems should not spawn loot\r\n\t\tSpawnItem(i, Monst->_mx, Monst->_my, sendmsg);\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid M2MStartHit(int mid, int i, int dam)\r\n{\r\n\tif ((DWORD)mid >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"Invalid monster %d getting hit by monster\", mid);\r\n#endif\r\n\t}\r\n\r\n\tif (monster[mid].MType == NULL) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"Monster %d \\\"%s\\\" getting hit by monster: MType NULL\", mid, monster[mid].mName);\r\n#endif\r\n\t}\r\n\r\n\tif (i >= 0) // BUGFIX: Missing check for golems `&& i < MAX_PLRS`\r\n\t\tmonster[i].mWhoHit |= 1 << i; // BUGFIX Should be monster[mid].mWhoHit\r\n\r\n\tdelta_monster_hp(mid, monster[mid]._mhitpoints, currlevel);\r\n#ifdef HELLFIRE\r\n\tNetSendCmdMonDmg(FALSE, mid, dam);\r\n#else\r\n\tNetSendCmdParam2(FALSE, CMD_MONSTDAMAGE, mid, dam);\r\n#endif\r\n\tPlayEffect(mid, 1);\r\n\r\n\tif (monster[mid].MType->mtype >= MT_SNEAK && monster[mid].MType->mtype <= MT_ILLWEAV || dam >> 6 >= monster[mid].mLevel + 3) {\r\n\t\tif (i >= 0)\r\n\t\t\tmonster[mid]._mdir = (monster[i]._mdir - 4) & 7;\r\n\r\n\t\tif (monster[mid].MType->mtype == MT_BLINK) {\r\n\t\t\tM_Teleport(mid);\r\n\t\t} else if (monster[mid].MType->mtype >= MT_NSCAV && monster[mid].MType->mtype <= MT_YSCAV\r\n#ifdef HELLFIRE\r\n\t\t    || monster[mid].MType->mtype == MT_GRAVEDIG\r\n#endif\r\n\t\t) {\r\n\t\t\tmonster[mid]._mgoal = MGOAL_NORMAL;\r\n#ifdef HELLFIRE\r\n\t\t\tmonster[mid]._mgoalvar1 = 0;\r\n\t\t\tmonster[mid]._mgoalvar2 = 0;\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (monster[mid]._mmode != MM_STONE) {\r\n\t\t\tif (monster[mid].MType->mtype != MT_GOLEM) {\r\n\t\t\t\tNewMonsterAnim(mid, monster[mid].MType->Anims[MA_GOTHIT], monster[mid]._mdir);\r\n\t\t\t\tmonster[mid]._mmode = MM_GOTHIT;\r\n\t\t\t}\r\n\r\n\t\t\tmonster[mid]._mxoff = 0;\r\n\t\t\tmonster[mid]._myoff = 0;\r\n\t\t\tmonster[mid]._mx = monster[mid]._moldx;\r\n\t\t\tmonster[mid]._my = monster[mid]._moldy;\r\n\t\t\tmonster[mid]._mfutx = monster[mid]._moldx;\r\n\t\t\tmonster[mid]._mfuty = monster[mid]._moldy;\r\n\t\t\tmonster[mid]._moldx = monster[mid]._mx;\r\n\t\t\tmonster[mid]._moldy = monster[mid]._my;\r\n\t\t\tM_CheckEFlag(mid);\r\n\t\t\tM_ClearSquares(mid);\r\n\t\t\tdMonster[monster[mid]._mx][monster[mid]._my] = mid + 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid MonstStartKill(int i, int pnum, BOOL sendmsg)\r\n{\r\n\tint md;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MonstStartKill: Invalid monster %d\", i);\r\n#endif\r\n\t}\r\n\tif (monster[i].MType == NULL) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MonstStartKill: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\t}\r\n\r\n\tMonst = &monster[i];\r\n\tif (pnum >= 0)\r\n\t\tMonst->mWhoHit |= 1 << pnum;\r\n\tif (pnum < MAX_PLRS && i > MAX_PLRS) /// BUGFIX: i >= MAX_PLRS\r\n\t\tAddPlrMonstExper(Monst->mLevel, Monst->mExp, Monst->mWhoHit);\r\n\tmonstkills[Monst->MType->mtype]++;\r\n\tMonst->_mhitpoints = 0;\r\n\tSetRndSeed(Monst->_mRndSeed);\r\n#ifdef HELLFIRE\r\n\tSpawnLoot(i, sendmsg);\r\n#else\r\n\tif (QuestStatus(Q_GARBUD) && Monst->mName == UniqMonst[UMT_GARBUD].mName) {\r\n\t\tCreateTypeItem(Monst->_mx + 1, Monst->_my + 1, TRUE, ITYPE_MACE, IMISC_NONE, TRUE, FALSE);\r\n\t} else if (i > MAX_PLRS - 1) { // Golems should not spawn items\r\n\t\tSpawnItem(i, Monst->_mx, Monst->_my, sendmsg);\r\n\t}\r\n#endif\r\n\tif (Monst->MType->mtype == MT_DIABLO)\r\n\t\tM_DiabloDeath(i, TRUE);\r\n\telse\r\n\t\tPlayEffect(i, 2);\r\n\r\n\tif (pnum >= 0)\r\n\t\tmd = M_GetDir(i);\r\n\telse\r\n\t\tmd = Monst->_mdir;\r\n\tMonst->_mdir = md;\r\n\tNewMonsterAnim(i, Monst->MType->Anims[MA_DEATH], md);\r\n\tMonst->_mmode = MM_DEATH;\r\n#ifdef HELLFIRE\r\n\tMonst->_mgoal = 0;\r\n#endif\r\n\tMonst->_mxoff = 0;\r\n\tMonst->_myoff = 0;\r\n\tMonst->_mVar1 = 0;\r\n\tMonst->_mx = Monst->_moldx;\r\n\tMonst->_my = Monst->_moldy;\r\n\tMonst->_mfutx = Monst->_moldx;\r\n\tMonst->_mfuty = Monst->_moldy;\r\n\tM_CheckEFlag(i);\r\n\tM_ClearSquares(i);\r\n\tdMonster[Monst->_mx][Monst->_my] = i + 1;\r\n\tCheckQuestKill(i, sendmsg);\r\n\tM_FallenFear(Monst->_mx, Monst->_my);\r\n#ifdef HELLFIRE\r\n\tif (Monst->MType->mtype >= MT_NACID && Monst->MType->mtype <= MT_XACID || Monst->MType->mtype == MT_SPIDLORD)\r\n#else\r\n\tif (Monst->MType->mtype >= MT_NACID && Monst->MType->mtype <= MT_XACID)\r\n#endif\r\n\t\tAddMissile(Monst->_mx, Monst->_my, 0, 0, 0, MIS_ACIDPUD, TARGET_PLAYERS, i, Monst->_mint + 1, 0);\r\n}\r\n\r\nvoid M2MStartKill(int i, int mid)\r\n{\r\n\tint md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M2MStartKill: Invalid monster (attacker) %d\", i);\r\n#endif\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif ((DWORD)mid >= MAXMONSTERS) {\r\n\t\treturn;\r\n#else\r\n\tif ((DWORD)i >= MAXMONSTERS) { /// BUGFIX: should check `mid`\r\n\t\tapp_fatal(\"M2MStartKill: Invalid monster (killed) %d\", mid);\r\n#endif\r\n\t}\r\n\tif (monster[i].MType == NULL) /// BUGFIX: should check `mid`\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M2MStartKill: Monster %d \\\"%s\\\" MType NULL\", mid, monster[mid].mName);\r\n#endif\r\n\r\n\tdelta_kill_monster(mid, monster[mid]._mx, monster[mid]._my, currlevel);\r\n\tNetSendCmdLocParam1(FALSE, CMD_MONSTDEATH, monster[mid]._mx, monster[mid]._my, mid);\r\n\r\n\t// BUGFIX: missing check for attacking golems `if (0 <= i && i < MAX_PLRS)`.\r\n\tmonster[mid].mWhoHit |= 1 << i;\r\n\tif (i < MAX_PLRS) {\r\n\t\t// BUGFIX: missing check for target golems `if (mid >= MAX_PLRS)`.\r\n\t\tAddPlrMonstExper(monster[mid].mLevel, monster[mid].mExp, monster[mid].mWhoHit);\r\n\t}\r\n\r\n\tmonstkills[monster[mid].MType->mtype]++;\r\n\tmonster[mid]._mhitpoints = 0;\r\n\tSetRndSeed(monster[mid]._mRndSeed);\r\n\r\n#ifdef HELLFIRE\r\n\tSpawnLoot(mid, TRUE);\r\n#else\r\n\tif (mid >= MAX_PLRS) // Golems should not spawn loot\r\n\t\tSpawnItem(mid, monster[mid]._mx, monster[mid]._my, TRUE);\r\n#endif\r\n\r\n\tif (monster[mid].MType->mtype == MT_DIABLO)\r\n\t\tM_DiabloDeath(mid, TRUE);\r\n\telse\r\n#ifndef HELLFIRE\r\n\t\tPlayEffect(i, 2);\r\n\r\n#endif\r\n\tPlayEffect(mid, 2);\r\n\r\n\tmd = (monster[i]._mdir - 4) & 7;\r\n\tif (monster[mid].MType->mtype == MT_GOLEM)\r\n\t\tmd = 0;\r\n\r\n\tmonster[mid]._mdir = md;\r\n\tNewMonsterAnim(mid, monster[mid].MType->Anims[MA_DEATH], md);\r\n\tmonster[mid]._mmode = MM_DEATH;\r\n\tmonster[mid]._mxoff = 0;\r\n\tmonster[mid]._myoff = 0;\r\n\tmonster[mid]._mx = monster[mid]._moldx;\r\n\tmonster[mid]._my = monster[mid]._moldy;\r\n\tmonster[mid]._mfutx = monster[mid]._mx;\r\n\tmonster[mid]._mfuty = monster[mid]._my;\r\n\tmonster[mid]._moldx = monster[mid]._mx;\r\n\tmonster[mid]._moldy = monster[mid]._my;\r\n\tM_CheckEFlag(mid);\r\n\tM_ClearSquares(mid);\r\n\tdMonster[monster[mid]._mx][monster[mid]._my] = mid + 1;\r\n\tCheckQuestKill(mid, TRUE);\r\n\tM_FallenFear(monster[mid]._mx, monster[mid]._my);\r\n\tif (monster[mid].MType->mtype >= MT_NACID && monster[mid].MType->mtype <= MT_XACID)\r\n\t\tAddMissile(monster[mid]._mx, monster[mid]._my, 0, 0, 0, MIS_ACIDPUD, TARGET_PLAYERS, mid, monster[mid]._mint + 1, 0);\r\n\r\n#ifdef HELLFIRE\r\n\tM_StartStand(i, monster[i]._mdir);\r\n#endif\r\n}\r\n\r\nvoid M_StartKill(int i, int pnum)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_StartKill: Invalid monster %d\", i);\r\n#endif\r\n\t}\r\n\r\n\tif (myplr == pnum) {\r\n\t\tdelta_kill_monster(i, monster[i]._mx, monster[i]._my, currlevel);\r\n\t\tif (i != pnum) {\r\n\t\t\tNetSendCmdLocParam1(FALSE, CMD_MONSTDEATH, monster[i]._mx, monster[i]._my, i);\r\n\t\t} else {\r\n\t\t\tNetSendCmdLocParam1(FALSE, CMD_KILLGOLEM, monster[i]._mx, monster[i]._my, currlevel);\r\n\t\t}\r\n\t}\r\n\r\n\tMonstStartKill(i, pnum, TRUE);\r\n}\r\n\r\nvoid M_SyncStartKill(int i, int x, int y, int pnum)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_SyncStartKill: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tif (monster[i]._mhitpoints == 0 || monster[i]._mmode == MM_DEATH) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (dMonster[x][y] == 0) {\r\n\t\tM_ClearSquares(i);\r\n\t\tmonster[i]._mx = x;\r\n\t\tmonster[i]._my = y;\r\n\t\tmonster[i]._moldx = x;\r\n\t\tmonster[i]._moldy = y;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tMonstStartKill(i, pnum, FALSE);\r\n#else\r\n\tif (monster[i]._mmode == MM_STONE) {\r\n\t\tMonstStartKill(i, pnum, FALSE);\r\n\t\tmonster[i]._mmode = MM_STONE;\r\n\t} else {\r\n\t\tMonstStartKill(i, pnum, FALSE);\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid M_StartFadein(int i, int md, BOOL backwards)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_StartFadein: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_StartFadein: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);\r\n\tmonster[i]._mmode = MM_FADEIN;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tM_CheckEFlag(i);\r\n\tmonster[i]._mdir = md;\r\n\tmonster[i]._mFlags &= ~MFLAG_HIDDEN;\r\n\tif (backwards) {\r\n\t\tmonster[i]._mFlags |= MFLAG_LOCK_ANIMATION;\r\n\t\tmonster[i]._mAnimFrame = monster[i]._mAnimLen;\r\n\t}\r\n}\r\n\r\nvoid M_StartFadeout(int i, int md, BOOL backwards)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_StartFadeout: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_StartFadeout: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tNewMonsterAnim(i, monster[i].MType->Anims[MA_SPECIAL], md);\r\n\tmonster[i]._mmode = MM_FADEOUT;\r\n\tmonster[i]._mxoff = 0;\r\n\tmonster[i]._myoff = 0;\r\n\tmonster[i]._mfutx = monster[i]._mx;\r\n\tmonster[i]._mfuty = monster[i]._my;\r\n\tmonster[i]._moldx = monster[i]._mx;\r\n\tmonster[i]._moldy = monster[i]._my;\r\n\tM_CheckEFlag(i);\r\n\tmonster[i]._mdir = md;\r\n\tif (backwards) {\r\n\t\tmonster[i]._mFlags |= MFLAG_LOCK_ANIMATION;\r\n\t\tmonster[i]._mAnimFrame = monster[i]._mAnimLen;\r\n\t}\r\n}\r\n\r\nvoid M_StartHeal(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_StartHeal: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_StartHeal: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tMonst->_mAnimData = Monst->MType->Anims[MA_SPECIAL].Data[Monst->_mdir];\r\n\tMonst->_mAnimFrame = Monst->MType->Anims[MA_SPECIAL].Frames;\r\n\tMonst->_mFlags |= MFLAG_LOCK_ANIMATION;\r\n\tMonst->_mmode = MM_HEAL;\r\n\tMonst->_mVar1 = Monst->_mmaxhp / (16 * (random_(97, 5) + 4));\r\n}\r\n\r\nvoid M_ChangeLightOffset(int monst)\r\n{\r\n\tint lx, ly, _mxoff, _myoff, sign;\r\n\r\n\tif ((DWORD)monst >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_ChangeLightOffset: Invalid monster %d\", monst);\r\n#endif\r\n\r\n\tlx = monster[monst]._mxoff + 2 * monster[monst]._myoff;\r\n\tly = 2 * monster[monst]._myoff - monster[monst]._mxoff;\r\n\r\n\tif (lx < 0) {\r\n\t\tsign = -1;\r\n\t\tlx = -lx;\r\n\t} else {\r\n\t\tsign = 1;\r\n\t}\r\n\r\n\t_mxoff = sign * (lx >> 3);\r\n\tif (ly < 0) {\r\n\t\t_myoff = -1;\r\n\t\tly = -ly;\r\n\t} else {\r\n\t\t_myoff = 1;\r\n\t}\r\n\r\n\t_myoff *= (ly >> 3);\r\n#ifdef HELLFIRE\r\n\tif (monster[monst].mlid != 0)\r\n#endif\r\n\t\tChangeLightOff(monster[monst].mlid, _mxoff, _myoff);\r\n}\r\n\r\nBOOL M_DoStand(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoStand: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoStand: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->MType->mtype == MT_GOLEM)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_WALK].Data[Monst->_mdir];\r\n\telse\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];\r\n\r\n\tif (Monst->_mAnimFrame == Monst->_mAnimLen)\r\n\t\tM_Enemy(i);\r\n\r\n\tMonst->_mVar2++; // BUGFIX: Should have a bound check as this will overflow if a player stays on same level for over 3 years.\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoWalk(int i)\r\n{\r\n\tBOOL rv;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoWalk: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoWalk: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tif (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) {\r\n\t\tdMonster[monster[i]._mx][monster[i]._my] = 0;\r\n\t\tmonster[i]._mx += monster[i]._mVar1;\r\n\t\tmonster[i]._my += monster[i]._mVar2;\r\n\t\tdMonster[monster[i]._mx][monster[i]._my] = i + 1;\r\n#ifdef HELLFIRE\r\n\t\tif (!(monster[i]._mFlags & MFLAG_HIDDEN) && monster[i].mlid != 0)\r\n#else\r\n\t\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\t\tChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my);\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\trv = TRUE;\r\n\t} else {\r\n\t\tif (monster[i]._mAnimCnt == 0) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (monster[i]._mVar8 == 0 && monster[i].MType->mtype == MT_FLESTHNG)\r\n\t\t\t\tPlayEffect(i, 3);\r\n#endif\r\n\t\t\tmonster[i]._mVar8++;\r\n\t\t\tmonster[i]._mVar6 += monster[i]._mxvel;\r\n\t\t\tmonster[i]._mVar7 += monster[i]._myvel;\r\n\t\t\tmonster[i]._mxoff = monster[i]._mVar6 >> 4;\r\n\t\t\tmonster[i]._myoff = monster[i]._mVar7 >> 4;\r\n\t\t}\r\n\t\trv = FALSE;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (!(monster[i]._mFlags & MFLAG_HIDDEN) && monster[i].mlid != 0)\r\n#else\r\n\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\tM_ChangeLightOffset(i);\r\n\r\n\treturn rv;\r\n}\r\n\r\nBOOL M_DoWalk2(int i)\r\n{\r\n\tBOOL rv;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoWalk2: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoWalk2: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tif (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) {\r\n\t\tdMonster[monster[i]._mVar1][monster[i]._mVar2] = 0;\r\n#ifdef HELLFIRE\r\n\t\tif (!(monster[i]._mFlags & MFLAG_HIDDEN) && monster[i].mlid != 0)\r\n#else\r\n\t\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\t\tChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my);\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\trv = TRUE;\r\n\t} else {\r\n\t\tif (monster[i]._mAnimCnt == 0) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (monster[i]._mVar8 == 0 && monster[i].MType->mtype == MT_FLESTHNG)\r\n\t\t\t\tPlayEffect(i, 3);\r\n#endif\r\n\t\t\tmonster[i]._mVar8++;\r\n\t\t\tmonster[i]._mVar6 += monster[i]._mxvel;\r\n\t\t\tmonster[i]._mVar7 += monster[i]._myvel;\r\n\t\t\tmonster[i]._mxoff = monster[i]._mVar6 >> 4;\r\n\t\t\tmonster[i]._myoff = monster[i]._mVar7 >> 4;\r\n\t\t}\r\n\t\trv = FALSE;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (!(monster[i]._mFlags & MFLAG_HIDDEN) && monster[i].mlid != 0)\r\n#else\r\n\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\tM_ChangeLightOffset(i);\r\n\r\n\treturn rv;\r\n}\r\n\r\nBOOL M_DoWalk3(int i)\r\n{\r\n\tBOOL rv;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoWalk3: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoWalk3: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tif (monster[i]._mVar8 == monster[i].MType->Anims[MA_WALK].Frames) {\r\n\t\tdMonster[monster[i]._mx][monster[i]._my] = 0;\r\n\t\tmonster[i]._mx = monster[i]._mVar1;\r\n\t\tmonster[i]._my = monster[i]._mVar2;\r\n\t\tdFlags[monster[i]._mVar4][monster[i]._mVar5] &= ~BFLAG_MONSTLR;\r\n\t\tdMonster[monster[i]._mx][monster[i]._my] = i + 1;\r\n#ifdef HELLFIRE\r\n\t\tif (!(monster[i]._mFlags & MFLAG_HIDDEN) && monster[i].mlid != 0)\r\n#else\r\n\t\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\t\tChangeLightXY(monster[i].mlid, monster[i]._mx, monster[i]._my);\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\trv = TRUE;\r\n\t} else {\r\n\t\tif (monster[i]._mAnimCnt == 0) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (monster[i]._mVar8 == 0 && monster[i].MType->mtype == MT_FLESTHNG)\r\n\t\t\t\tPlayEffect(i, 3);\r\n#endif\r\n\t\t\tmonster[i]._mVar8++;\r\n\t\t\tmonster[i]._mVar6 += monster[i]._mxvel;\r\n\t\t\tmonster[i]._mVar7 += monster[i]._myvel;\r\n\t\t\tmonster[i]._mxoff = monster[i]._mVar6 >> 4;\r\n\t\t\tmonster[i]._myoff = monster[i]._mVar7 >> 4;\r\n\t\t}\r\n\t\trv = FALSE;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (monster[i]._uniqtype != 0 && !(monster[i]._mFlags & MFLAG_HIDDEN)) // BUGFIX: change uniqtype check to mlid check like it is in all other places\r\n#else\r\n\tif (monster[i]._uniqtype != 0)\r\n#endif\r\n\t\tM_ChangeLightOffset(i);\r\n\r\n\treturn rv;\r\n}\r\n\r\nvoid M_TryM2MHit(int i, int mid, int hper, int mind, int maxd)\r\n{\r\n\tBOOL ret;\r\n\r\n\tif ((DWORD)mid >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_TryM2MHit: Invalid monster %d\", mid);\r\n#endif\r\n\t}\r\n\tif (monster[mid].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_TryM2MHit: Monster %d \\\"%s\\\" MType NULL\", mid, monster[mid].mName);\r\n#endif\r\n\tif (monster[mid]._mhitpoints >> 6 > 0 && (monster[mid].MType->mtype != MT_ILLWEAV || monster[mid]._mgoal != MGOAL_RETREAT)) {\r\n\t\tint hit = random_(4, 100);\r\n\t\tif (monster[mid]._mmode == MM_STONE)\r\n\t\t\thit = 0;\r\n\t\tif (!CheckMonsterHit(mid, ret) && hit < hper) {\r\n\t\t\tint dam = (mind + random_(5, maxd - mind + 1)) << 6;\r\n\t\t\tmonster[mid]._mhitpoints -= dam;\r\n\t\t\tif (monster[mid]._mhitpoints >> 6 <= 0) {\r\n\t\t\t\tif (monster[mid]._mmode == MM_STONE) {\r\n\t\t\t\t\tM2MStartKill(i, mid);\r\n\t\t\t\t\tmonster[mid]._mmode = MM_STONE;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tM2MStartKill(i, mid);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (monster[mid]._mmode == MM_STONE) {\r\n\t\t\t\t\tM2MStartHit(mid, i, dam);\r\n\t\t\t\t\tmonster[mid]._mmode = MM_STONE;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tM2MStartHit(mid, i, dam);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid M_TryH2HHit(int i, int pnum, int Hit, int MinDam, int MaxDam)\r\n{\r\n\tint hit, hper;\r\n\tint dx, dy;\r\n\tint blk, blkper;\r\n\tint dam, mdam;\r\n\tint newx, newy;\r\n\tint j, misnum, ms_num, cur_ms_num, new_hp, dir, ac;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_TryH2HHit: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_TryH2HHit: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\tif (monster[i]._mFlags & MFLAG_TARGETS_MONSTER) {\r\n\t\tM_TryM2MHit(i, pnum, Hit, MinDam, MaxDam);\r\n\t\treturn;\r\n\t}\r\n\tif (plr[pnum]._pHitPoints >> 6 <= 0 || plr[pnum]._pInvincible || plr[pnum]._pSpellFlags & 1)\r\n\t\treturn;\r\n\tdx = abs(monster[i]._mx - plr[pnum]._px);\r\n\tdy = abs(monster[i]._my - plr[pnum]._py);\r\n\tif (dx >= 2 || dy >= 2)\r\n\t\treturn;\r\n\r\n\thper = random_(98, 100);\r\n#ifdef _DEBUG\r\n\tif (debug_mode_dollar_sign || debug_mode_key_inverted_v)\r\n\t\thper = 1000;\r\n#endif\r\n\tac = plr[pnum]._pIBonusAC + plr[pnum]._pIAC;\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum].pDamAcFlags & ISPLHF_ACDEMON && monster[i].MData->mMonstClass == MC_DEMON)\r\n\t\tac += 40;\r\n\tif (plr[pnum].pDamAcFlags & ISPLHF_ACUNDEAD && monster[i].MData->mMonstClass == MC_UNDEAD)\r\n\t\tac += 20;\r\n#endif\r\n\thit = Hit\r\n\t    + 2 * (monster[i].mLevel - plr[pnum]._pLevel)\r\n\t    + 30\r\n\t    - ac\r\n\t    - plr[pnum]._pDexterity / 5;\r\n\tif (hit < 15)\r\n\t\thit = 15;\r\n\tif (currlevel == 14 && hit < 20)\r\n\t\thit = 20;\r\n\tif (currlevel == 15 && hit < 25)\r\n\t\thit = 25;\r\n\tif (currlevel == 16 && hit < 30)\r\n\t\thit = 30;\r\n\tif ((plr[pnum]._pmode == PM_STAND || plr[pnum]._pmode == PM_ATTACK) && plr[pnum]._pBlockFlag) {\r\n\t\tblkper = random_(98, 100);\r\n\t} else {\r\n\t\tblkper = 100;\r\n\t}\r\n\tblk = plr[pnum]._pDexterity\r\n\t    + plr[pnum]._pBaseToBlk\r\n\t    - (monster[i].mLevel << 1)\r\n\t    + (plr[pnum]._pLevel << 1);\r\n\tif (blk < 0)\r\n\t\tblk = 0;\r\n\tif (blk > 100)\r\n\t\tblk = 100;\r\n\tif (hper >= hit)\r\n\t\treturn;\r\n\tif (blkper < blk) {\r\n\t\tdir = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[i]._mx, monster[i]._my);\r\n\t\tStartPlrBlock(pnum, dir);\r\n#ifdef HELLFIRE\r\n\t\tif (pnum == myplr && plr[pnum].wReflections > 0) {\r\n\t\t\tplr[pnum].wReflections--;\r\n\t\t\tdam = random_(99, (MaxDam - MinDam + 1) << 6) + (MinDam << 6);\r\n\t\t\tdam += plr[pnum]._pIGetHit << 6;\r\n\t\t\tif (dam < 64)\r\n\t\t\t\tdam = 64;\r\n\t\t\tmdam = dam * (0.01 * (random_(100, 10) + 20));\r\n\t\t\tmonster[i]._mhitpoints -= mdam;\r\n\t\t\tdam -= mdam;\r\n\t\t\tif (dam < 0)\r\n\t\t\t\tdam = 0;\r\n\t\t\tif (monster[i]._mhitpoints >> 6 <= 0)\r\n\t\t\t\tM_StartKill(i, pnum);\r\n\t\t\telse\r\n\t\t\t\tM_StartHit(i, pnum, mdam);\r\n\t\t}\r\n#endif\r\n\t\treturn;\r\n\t}\r\n\tif (monster[i].MType->mtype == MT_YZOMBIE && pnum == myplr) {\r\n\t\tms_num = -1;\r\n\t\tcur_ms_num = -1;\r\n\t\tfor (j = 0; j < nummissiles; j++) {\r\n\t\t\tmisnum = missileactive[j];\r\n\t\t\tif (missile[misnum]._mitype != MIS_MANASHIELD)\r\n\t\t\t\tcontinue;\r\n\t\t\tif (missile[misnum]._misource == pnum)\r\n\t\t\t\tcur_ms_num = misnum;\r\n\t\t\telse\r\n\t\t\t\tms_num = misnum;\r\n\t\t}\r\n\t\tif (plr[pnum]._pMaxHP > 64) {\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum]._pMaxHPBase > 64)\r\n#endif\r\n\t\t\t{\r\n\t\t\t\tplr[pnum]._pMaxHP -= 64;\r\n\t\t\t\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\t\t\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\t\t\t\tif (cur_ms_num >= 0)\r\n\t\t\t\t\t\tmissile[cur_ms_num]._miVar1 = plr[pnum]._pHitPoints;\r\n\t\t\t\t}\r\n\t\t\t\tplr[pnum]._pMaxHPBase -= 64;\r\n\t\t\t\tif (plr[pnum]._pHPBase > plr[pnum]._pMaxHPBase) {\r\n\t\t\t\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\t\t\t\tif (cur_ms_num >= 0)\r\n\t\t\t\t\t\tmissile[cur_ms_num]._miVar2 = plr[pnum]._pHPBase;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tdam = (MinDam << 6) + random_(99, (MaxDam - MinDam + 1) << 6);\r\n\tdam += (plr[pnum]._pIGetHit << 6);\r\n\tif (dam < 64)\r\n\t\tdam = 64;\r\n\tif (pnum == myplr) {\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum].wReflections > 0) {\r\n\t\t\tplr[pnum].wReflections--;\r\n\t\t\tmdam = dam * (0.01 * (random_(100, 10) + 20));\r\n\t\t\tmonster[i]._mhitpoints -= mdam;\r\n\t\t\tdam -= mdam;\r\n\t\t\tif (dam < 0)\r\n\t\t\t\tdam = 0;\r\n\t\t\tif (monster[i]._mhitpoints >> 6 <= 0)\r\n\t\t\t\tM_StartKill(i, pnum);\r\n\t\t\telse\r\n\t\t\t\tM_StartHit(i, pnum, mdam);\r\n\t\t}\r\n#endif\r\n\t\tplr[pnum]._pHitPoints -= dam;\r\n\t\tplr[pnum]._pHPBase -= dam;\r\n\t}\r\n\tif (plr[pnum]._pIFlags & ISPL_THORNS) {\r\n\t\tmdam = (random_(99, 3) + 1) << 6;\r\n\t\tmonster[i]._mhitpoints -= mdam;\r\n\t\tif (monster[i]._mhitpoints >> 6 <= 0)\r\n\t\t\tM_StartKill(i, pnum);\r\n\t\telse\r\n\t\t\tM_StartHit(i, pnum, mdam);\r\n\t}\r\n\tif (!(monster[i]._mFlags & MFLAG_NOLIFESTEAL) && monster[i].MType->mtype == MT_SKING && gbMaxPlayers != 1)\r\n\t\tmonster[i]._mhitpoints += dam;\r\n\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t}\r\n\tif (plr[pnum]._pHitPoints >> 6 <= 0) {\r\n\t\tSyncPlrKill(pnum, 0);\r\n#ifdef HELLFIRE\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n#endif\r\n\t\treturn;\r\n\t}\r\n\tStartPlrHit(pnum, dam, FALSE);\r\n\tif (monster[i]._mFlags & MFLAG_KNOCKBACK) {\r\n\t\tif (plr[pnum]._pmode != PM_GOTHIT)\r\n\t\t\tStartPlrHit(pnum, 0, TRUE);\r\n\t\tnewx = plr[pnum]._px + offset_x[monster[i]._mdir];\r\n\t\tnewy = plr[pnum]._py + offset_y[monster[i]._mdir];\r\n\t\tif (PosOkPlayer(pnum, newx, newy)) {\r\n\t\t\tplr[pnum]._px = newx;\r\n\t\t\tplr[pnum]._py = newy;\r\n\t\t\tFixPlayerLocation(pnum, plr[pnum]._pdir);\r\n\t\t\tFixPlrWalkTags(pnum);\r\n\t\t\tdPlayer[newx][newy] = pnum + 1;\r\n\t\t\tSetPlayerOld(pnum);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL M_DoAttack(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoAttack: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoAttack: Monster %d \\\"%s\\\" MType NULL\", i, Monst->mName);\r\n#endif\r\n\tif (Monst->MType == NULL) // BUGFIX: should check MData\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoAttack: Monster %d \\\"%s\\\" MData NULL\", i, Monst->mName);\r\n#endif\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i].MData->mAFNum) {\r\n\t\tM_TryH2HHit(i, monster[i]._menemy, monster[i].mHit, monster[i].mMinDamage, monster[i].mMaxDamage);\r\n\t\tif (monster[i]._mAi != AI_SNAKE)\r\n\t\t\tPlayEffect(i, 0);\r\n\t}\r\n\tif (monster[i].MType->mtype >= MT_NMAGMA && monster[i].MType->mtype <= MT_WMAGMA && monster[i]._mAnimFrame == 9) {\r\n\t\tM_TryH2HHit(i, monster[i]._menemy, monster[i].mHit + 10, monster[i].mMinDamage - 2, monster[i].mMaxDamage - 2);\r\n\t\tPlayEffect(i, 0);\r\n\t}\r\n\tif (monster[i].MType->mtype >= MT_STORM && monster[i].MType->mtype <= MT_MAEL && monster[i]._mAnimFrame == 13) {\r\n\t\tM_TryH2HHit(i, monster[i]._menemy, monster[i].mHit - 20, monster[i].mMinDamage + 4, monster[i].mMaxDamage + 4);\r\n\t\tPlayEffect(i, 0);\r\n\t}\r\n\tif (monster[i]._mAi == AI_SNAKE && monster[i]._mAnimFrame == 1)\r\n\t\tPlayEffect(i, 0);\r\n\tif (monster[i]._mAnimFrame == monster[i]._mAnimLen) {\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoRAttack(int i)\r\n{\r\n\tint multimissiles, mi;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoRAttack: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoRAttack: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\tif (monster[i].MType == NULL) // BUGFIX: should check MData\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoRAttack: Monster %d \\\"%s\\\" MData NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i].MData->mAFNum) {\r\n\t\tif (monster[i]._mVar1 != -1) {\r\n\t\t\tif (monster[i]._mVar1 == MIS_CBOLT)\r\n\t\t\t\tmultimissiles = 3;\r\n\t\t\telse\r\n\t\t\t\tmultimissiles = 1;\r\n\t\t\tfor (mi = 0; mi < multimissiles; mi++) {\r\n\t\t\t\tAddMissile(\r\n#ifdef HELLFIRE\r\n\t\t\t\t    monster[i]._mx + HorkXAdd[monster[i]._mdir],\r\n\t\t\t\t    monster[i]._my + HorkYAdd[monster[i]._mdir],\r\n#else\r\n\t\t\t\t    monster[i]._mx,\r\n\t\t\t\t    monster[i]._my,\r\n#endif\r\n\t\t\t\t    monster[i]._menemyx,\r\n\t\t\t\t    monster[i]._menemyy,\r\n\t\t\t\t    monster[i]._mdir,\r\n\t\t\t\t    monster[i]._mVar1,\r\n\t\t\t\t    TARGET_PLAYERS,\r\n\t\t\t\t    i,\r\n\t\t\t\t    monster[i]._mVar2,\r\n\t\t\t\t    0);\r\n\t\t\t}\r\n\t\t}\r\n\t\tPlayEffect(i, 0);\r\n\t}\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i]._mAnimLen) {\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoRSpAttack(int i)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoRSpAttack: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoRSpAttack: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\tif (monster[i].MType == NULL) // BUGFIX: should check MData\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoRSpAttack: Monster %d \\\"%s\\\" MData NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i].MData->mAFNum2 && monster[i]._mAnimCnt == 0) {\r\n\t\tAddMissile(\r\n#ifdef HELLFIRE\r\n\t\t    monster[i]._mx + HorkXAdd[monster[i]._mdir],\r\n\t\t    monster[i]._my + HorkYAdd[monster[i]._mdir],\r\n#else\r\n\t\t    monster[i]._mx,\r\n\t\t    monster[i]._my,\r\n#endif\r\n\t\t    monster[i]._menemyx,\r\n\t\t    monster[i]._menemyy,\r\n\t\t    monster[i]._mdir,\r\n\t\t    monster[i]._mVar1,\r\n\t\t    TARGET_PLAYERS,\r\n\t\t    i,\r\n\t\t    monster[i]._mVar3,\r\n\t\t    0);\r\n#ifdef HELLFIRE\r\n\t\tif (Monsters[i].Snds[3][0] != 0) // BUGFIX `Monsters[i].` should be `monster[i].MType->`\r\n#endif\r\n\t\t\tPlayEffect(i, 3);\r\n\t}\r\n\r\n\tif (monster[i]._mAi == AI_MEGA && monster[i]._mAnimFrame == 3) {\r\n\t\tif (monster[i]._mVar2++ == 0) {\r\n\t\t\tmonster[i]._mFlags |= MFLAG_ALLOW_SPECIAL;\r\n\t\t} else if (monster[i]._mVar2 == 15) {\r\n\t\t\tmonster[i]._mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\t}\r\n\t}\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i]._mAnimLen) {\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoSAttack(int i)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoSAttack: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoSAttack: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\tif (monster[i].MType == NULL) // BUGFIX: should check MData\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoSAttack: Monster %d \\\"%s\\\" MData NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i].MData->mAFNum2)\r\n\t\tM_TryH2HHit(i, monster[i]._menemy, monster[i].mHit2, monster[i].mMinDamage2, monster[i].mMaxDamage2);\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i]._mAnimLen) {\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoFadein(int i)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoFadein: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tif ((!(monster[i]._mFlags & MFLAG_LOCK_ANIMATION) || monster[i]._mAnimFrame != 1)\r\n\t    && (monster[i]._mFlags & MFLAG_LOCK_ANIMATION || monster[i]._mAnimFrame != monster[i]._mAnimLen)) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tM_StartStand(i, monster[i]._mdir);\r\n\tmonster[i]._mFlags &= ~MFLAG_LOCK_ANIMATION;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL M_DoFadeout(int i)\r\n{\r\n\tint mt;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoFadeout: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tif ((!(monster[i]._mFlags & MFLAG_LOCK_ANIMATION) || monster[i]._mAnimFrame != 1)\r\n\t    && (monster[i]._mFlags & MFLAG_LOCK_ANIMATION || monster[i]._mAnimFrame != monster[i]._mAnimLen)) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tmt = monster[i].MType->mtype;\r\n\tif (mt < MT_INCIN || mt > MT_HELLBURN) {\r\n\t\tmonster[i]._mFlags &= ~MFLAG_LOCK_ANIMATION;\r\n\t\tmonster[i]._mFlags |= MFLAG_HIDDEN;\r\n\t} else {\r\n\t\tmonster[i]._mFlags &= ~MFLAG_LOCK_ANIMATION;\r\n\t}\r\n\r\n\tM_StartStand(i, monster[i]._mdir);\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL M_DoHeal(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoHeal: Invalid monster %d\", i);\r\n#endif\r\n\tMonst = &monster[i];\r\n\tif (monster[i]._mFlags & MFLAG_NOHEAL) {\r\n#ifndef HELLFIRE\r\n\t\tMonst->_mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\tMonst->_mmode = MM_SATTACK;\r\n#endif\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (Monst->_mAnimFrame == 1) {\r\n\t\tMonst->_mFlags &= ~MFLAG_LOCK_ANIMATION;\r\n\t\tMonst->_mFlags |= MFLAG_ALLOW_SPECIAL;\r\n\t\tif (Monst->_mVar1 + Monst->_mhitpoints < Monst->_mmaxhp) {\r\n\t\t\tMonst->_mhitpoints = Monst->_mVar1 + Monst->_mhitpoints;\r\n\t\t} else {\r\n\t\t\tMonst->_mhitpoints = Monst->_mmaxhp;\r\n\t\t\tMonst->_mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\t\tMonst->_mmode = MM_SATTACK;\r\n\t\t}\r\n\t}\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoTalk(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint tren;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoTalk: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tM_StartStand(i, monster[i]._mdir);\r\n\tMonst->_mgoal = MGOAL_TALKING; // CODEFIX: apply Monst instead of monster[i] in the rest of the function\r\n\tif (effect_is_playing(alltext[monster[i].mtalkmsg].sfxnr))\r\n\t\treturn FALSE;\r\n\tInitQTextMsg(monster[i].mtalkmsg);\r\n\tif (monster[i].mName == UniqMonst[UMT_GARBUD].mName) {\r\n\t\tif (monster[i].mtalkmsg == TEXT_GARBUD1)\r\n\t\t\tquests[Q_GARBUD]._qactive = QUEST_ACTIVE;\r\n\t\tquests[Q_GARBUD]._qlog = TRUE; // BUGFIX: (?) for other quests qactive and qlog go together, maybe this should actually go into the if above\r\n\t\tif (monster[i].mtalkmsg == TEXT_GARBUD2 && !(monster[i]._mFlags & MFLAG_QUEST_COMPLETE)) {\r\n\t\t\tSpawnItem(i, monster[i]._mx + 1, monster[i]._my + 1, TRUE);\r\n\t\t\tmonster[i]._mFlags |= MFLAG_QUEST_COMPLETE;\r\n\t\t}\r\n\t}\r\n\tif (monster[i].mName == UniqMonst[UMT_ZHAR].mName\r\n\t    && monster[i].mtalkmsg == TEXT_ZHAR1\r\n\t    && !(monster[i]._mFlags & MFLAG_QUEST_COMPLETE)) {\r\n\t\tquests[Q_ZHAR]._qactive = QUEST_ACTIVE;\r\n\t\tquests[Q_ZHAR]._qlog = TRUE;\r\n\t\tCreateTypeItem(monster[i]._mx + 1, monster[i]._my + 1, FALSE, ITYPE_MISC, IMISC_BOOK, TRUE, FALSE);\r\n\t\tmonster[i]._mFlags |= MFLAG_QUEST_COMPLETE;\r\n\t}\r\n\tif (monster[i].mName == UniqMonst[UMT_SNOTSPIL].mName) {\r\n\t\tif (monster[i].mtalkmsg == TEXT_BANNER10 && !(monster[i]._mFlags & MFLAG_QUEST_COMPLETE)) {\r\n\t\t\tObjChangeMap(setpc_x, setpc_y, (setpc_w >> 1) + setpc_x + 2, (setpc_h >> 1) + setpc_y - 2);\r\n\t\t\ttren = TransVal;\r\n\t\t\tTransVal = 9;\r\n\t\t\tDRLG_MRectTrans(setpc_x, setpc_y, (setpc_w >> 1) + setpc_x + 4, setpc_y + (setpc_h >> 1));\r\n\t\t\tTransVal = tren;\r\n\t\t\tquests[Q_LTBANNER]._qvar1 = 2;\r\n\t\t\tif (quests[Q_LTBANNER]._qactive == QUEST_INIT)\r\n\t\t\t\tquests[Q_LTBANNER]._qactive = QUEST_ACTIVE;\r\n\t\t\tmonster[i]._mFlags |= MFLAG_QUEST_COMPLETE;\r\n\t\t}\r\n\t\tif (quests[Q_LTBANNER]._qvar1 < 2) {\r\n\t\t\tsprintf(tempstr, \"SS Talk = %i, Flags = %i\", monster[i].mtalkmsg, monster[i]._mFlags); // CODEFIX: no need for tempstr, app_fatal supports v_args\r\n\t\t\tapp_fatal(tempstr);\r\n\t\t}\r\n\t}\r\n\tif (monster[i].mName == UniqMonst[UMT_LACHDAN].mName) {\r\n\t\tif (monster[i].mtalkmsg == TEXT_VEIL9) {\r\n\t\t\tquests[Q_VEIL]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_VEIL]._qlog = TRUE;\r\n\t\t}\r\n\t\tif (monster[i].mtalkmsg == TEXT_VEIL11 && !(monster[i]._mFlags & MFLAG_QUEST_COMPLETE)) {\r\n\t\t\tSpawnUnique(UITEM_STEELVEIL, monster[i]._mx + 1, monster[i]._my + 1);\r\n\t\t\tmonster[i]._mFlags |= MFLAG_QUEST_COMPLETE;\r\n\t\t}\r\n\t}\r\n\tif (monster[i].mName == UniqMonst[UMT_WARLORD].mName)\r\n\t\tquests[Q_WARLORD]._qvar1 = 2;\r\n\tif (monster[i].mName == UniqMonst[UMT_LAZURUS].mName && gbMaxPlayers != 1) {\r\n\t\tquests[Q_BETRAYER]._qvar1 = 6;\r\n\t\tmonster[i]._mgoal = MGOAL_NORMAL;\r\n\t\tmonster[i]._msquelch = UCHAR_MAX;\r\n\t\tmonster[i].mtalkmsg = 0;\r\n\t}\r\n\treturn FALSE;\r\n}\r\n\r\nvoid M_Teleport(int i)\r\n{\r\n\tBOOL done;\r\n\tMonsterStruct *Monst;\r\n\tint k, j, x, y, _mx, _my, rx, ry;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_Teleport: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tdone = FALSE;\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode == MM_STONE)\r\n\t\treturn;\r\n\r\n\t_mx = Monst->_menemyx;\r\n\t_my = Monst->_menemyy;\r\n\trx = 2 * random_(100, 2) - 1;\r\n\try = 2 * random_(100, 2) - 1;\r\n\r\n\tfor (j = -1; j <= 1 && !done; j++) {\r\n\t\tfor (k = -1; k < 1 && !done; k++) {\r\n\t\t\tif (j != 0 || k != 0) {\r\n\t\t\t\tx = _mx + rx * j;\r\n\t\t\t\ty = _my + ry * k;\r\n\t\t\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX && x != Monst->_mx && y != Monst->_my) {\r\n\t\t\t\t\tif (PosOkMonst(i, x, y))\r\n\t\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (done) {\r\n\t\tM_ClearSquares(i);\r\n\t\tdMonster[Monst->_mx][Monst->_my] = 0;\r\n\t\tdMonster[x][y] = i + 1;\r\n\t\tMonst->_moldx = x;\r\n\t\tMonst->_moldy = y;\r\n\t\tMonst->_mdir = M_GetDir(i);\r\n\t\tM_CheckEFlag(i);\r\n\t}\r\n}\r\n\r\nBOOL M_DoGotHit(int i)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoGotHit: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoGotHit: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\tif (monster[i]._mAnimFrame == monster[i]._mAnimLen) {\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid M_UpdateLeader(int i)\r\n{\r\n\tint ma, j;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_UpdateLeader: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tfor (j = 0; j < nummonsters; j++) {\r\n\t\tma = monstactive[j];\r\n\t\tif (monster[ma].leaderflag == 1 && monster[ma].leader == i)\r\n\t\t\tmonster[ma].leaderflag = 0;\r\n\t}\r\n\r\n\tif (monster[i].leaderflag == 1) {\r\n\t\tmonster[monster[i].leader].packsize--;\r\n\t}\r\n}\r\n\r\nvoid DoEnding()\r\n{\r\n\tBOOL bMusicOn;\r\n\tint musicVolume;\r\n\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tSNetLeaveGame(LEAVE_ENDING);\r\n\t}\r\n\r\n\tmusic_stop();\r\n\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tSleep(1000);\r\n\t}\r\n\r\n#ifndef SPAWN\r\n#ifdef HELLFIRE\r\n\tif (plr[myplr]._pClass == PC_WARRIOR || plr[myplr]._pClass == PC_BARBARIAN) {\r\n#else\r\n\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n#endif\r\n\t\tplay_movie(\"gendata\\\\DiabVic2.smk\", FALSE);\r\n\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\tplay_movie(\"gendata\\\\DiabVic1.smk\", FALSE);\r\n#ifdef HELLFIRE\r\n\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\tplay_movie(\"gendata\\\\DiabVic1.smk\", FALSE);\r\n#endif\r\n\t} else {\r\n\t\tplay_movie(\"gendata\\\\DiabVic3.smk\", FALSE);\r\n\t}\r\n\tplay_movie(\"gendata\\\\Diabend.smk\", FALSE);\r\n\r\n\tbMusicOn = gbMusicOn;\r\n\tgbMusicOn = TRUE;\r\n\r\n\tmusicVolume = sound_get_or_set_music_volume(1);\r\n\tsound_get_or_set_music_volume(0);\r\n\r\n\tmusic_start(TMUSIC_L2);\r\n\tloop_movie = TRUE;\r\n\tplay_movie(\"gendata\\\\loopdend.smk\", TRUE);\r\n\tloop_movie = FALSE;\r\n\tmusic_stop();\r\n\r\n\tsound_get_or_set_music_volume(musicVolume);\r\n\tgbMusicOn = bMusicOn;\r\n#endif\r\n}\r\n\r\nvoid PrepDoEnding()\r\n{\r\n\tint newKillLevel, i;\r\n\tDWORD *killLevel;\r\n\r\n\tgbSoundOn = sgbSaveSoundOn;\r\n\tgbRunGame = FALSE;\r\n\tdeathflag = FALSE;\r\n\tcineflag = TRUE;\r\n\r\n\tkillLevel = &plr[myplr].pDiabloKillLevel;\r\n\tnewKillLevel = gnDifficulty + 1;\r\n\tif (*killLevel > newKillLevel)\r\n\t\tnewKillLevel = *killLevel;\r\n\tplr[myplr].pDiabloKillLevel = newKillLevel;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tplr[i]._pmode = PM_QUIT;\r\n\t\tplr[i]._pInvincible = TRUE;\r\n\t\tif (gbMaxPlayers > 1) {\r\n\t\t\tif (plr[i]._pHitPoints >> 6 == 0)\r\n\t\t\t\tplr[i]._pHitPoints = 64;\r\n\t\t\tif (plr[i]._pMana >> 6 == 0)\r\n\t\t\t\tplr[i]._pMana = 64;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL M_DoDeath(int i)\r\n{\r\n\tint x, y;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoDeath: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoDeath: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tmonster[i]._mVar1++;\r\n\tif (monster[i].MType->mtype == MT_DIABLO) {\r\n\t\tx = monster[i]._mx - ViewX;\r\n\t\tif (x < 0)\r\n\t\t\tx = -1;\r\n\t\telse\r\n\t\t\tx = x > 0;\r\n\t\tViewX += x;\r\n\r\n\t\ty = monster[i]._my - ViewY;\r\n\t\tif (y < 0) {\r\n\t\t\ty = -1;\r\n\t\t} else {\r\n\t\t\ty = y > 0;\r\n\t\t}\r\n\t\tViewY += y;\r\n\r\n\t\tif (monster[i]._mVar1 == 140)\r\n\t\t\tPrepDoEnding();\r\n\t} else if (monster[i]._mAnimFrame == monster[i]._mAnimLen) {\r\n\t\tif (monster[i]._uniqtype == 0)\r\n\t\t\tAddDead(monster[i]._mx, monster[i]._my, monster[i].MType->mdeadval, (direction)monster[i]._mdir);\r\n\t\telse\r\n\t\t\tAddDead(monster[i]._mx, monster[i]._my, monster[i]._udeadval, (direction)monster[i]._mdir);\r\n\r\n\t\tdMonster[monster[i]._mx][monster[i]._my] = 0;\r\n\t\tmonster[i]._mDelFlag = TRUE;\r\n\r\n\t\tM_UpdateLeader(i);\r\n\t}\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoSpStand(int i)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoSpStand: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoSpStand: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i].MData->mAFNum2)\r\n\t\tPlayEffect(i, 3);\r\n\r\n\tif (monster[i]._mAnimFrame == monster[i]._mAnimLen) {\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoDelay(int i)\r\n{\r\n\tint oFrame;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoDelay: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i].MType == NULL)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoDelay: Monster %d \\\"%s\\\" MType NULL\", i, monster[i].mName);\r\n#endif\r\n\r\n\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_STAND].Data[M_GetDir(i)];\r\n\tif (monster[i]._mAi == AI_LAZURUS) {\r\n\t\tif (monster[i]._mVar2 > 8 || monster[i]._mVar2 < 0)\r\n\t\t\tmonster[i]._mVar2 = 8;\r\n\t}\r\n\r\n\tif (monster[i]._mVar2-- == 0) {\r\n\t\toFrame = monster[i]._mAnimFrame;\r\n\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\tmonster[i]._mAnimFrame = oFrame;\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_DoStone(int i)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_DoStone: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tif (monster[i]._mhitpoints == 0) {\r\n\t\tdMonster[monster[i]._mx][monster[i]._my] = 0;\r\n\t\tmonster[i]._mDelFlag = TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid M_WalkDir(int i, int md)\r\n{\r\n\tint mwi;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"M_WalkDir: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tmwi = monster[i].MType->Anims[MA_WALK].Frames - 1;\r\n\tswitch (md) {\r\n\tcase DIR_N:\r\n\t\tM_StartWalk(i, 0, -MWVel[mwi][1], -1, -1, DIR_N);\r\n\t\tbreak;\r\n\tcase DIR_NE:\r\n\t\tM_StartWalk(i, MWVel[mwi][1], -MWVel[mwi][0], 0, -1, DIR_NE);\r\n\t\tbreak;\r\n\tcase DIR_E:\r\n\t\tM_StartWalk3(i, MWVel[mwi][2], 0, -32, -16, 1, -1, 1, 0, DIR_E);\r\n\t\tbreak;\r\n\tcase DIR_SE:\r\n\t\tM_StartWalk2(i, MWVel[mwi][1], MWVel[mwi][0], -32, -16, 1, 0, DIR_SE);\r\n\t\tbreak;\r\n\tcase DIR_S:\r\n\t\tM_StartWalk2(i, 0, MWVel[mwi][1], 0, -32, 1, 1, DIR_S);\r\n\t\tbreak;\r\n\tcase DIR_SW:\r\n\t\tM_StartWalk2(i, -MWVel[mwi][1], MWVel[mwi][0], 32, -16, 0, 1, DIR_SW);\r\n\t\tbreak;\r\n\tcase DIR_W:\r\n\t\tM_StartWalk3(i, -MWVel[mwi][2], 0, 32, -16, -1, 1, 0, 1, DIR_W);\r\n\t\tbreak;\r\n\tcase DIR_NW:\r\n\t\tM_StartWalk(i, -MWVel[mwi][1], -MWVel[mwi][0], -1, 0, DIR_NW);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid GroupUnity(int i)\r\n{\r\n\tint leader, m, j;\r\n\tBOOL clear;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"GroupUnity: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tif (monster[i].leaderflag != 0) {\r\n\t\tleader = monster[i].leader;\r\n\t\tclear = LineClearF(CheckNoSolid, monster[i]._mx, monster[i]._my, monster[leader]._mfutx, monster[leader]._mfuty);\r\n\t\tif (clear || monster[i].leaderflag != 1) {\r\n\t\t\tif (clear\r\n\t\t\t    && monster[i].leaderflag == 2\r\n\t\t\t    && abs(monster[i]._mx - monster[leader]._mfutx) < 4\r\n\t\t\t    && abs(monster[i]._my - monster[leader]._mfuty) < 4) {\r\n\t\t\t\tmonster[leader].packsize++;\r\n\t\t\t\tmonster[i].leaderflag = 1;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tmonster[leader].packsize--;\r\n\t\t\tmonster[i].leaderflag = 2;\r\n\t\t}\r\n\t}\r\n\r\n\tif (monster[i].leaderflag == 1) {\r\n\t\tif (monster[i]._msquelch > monster[leader]._msquelch) {\r\n\t\t\tmonster[leader]._lastx = monster[i]._mx;\r\n\t\t\tmonster[leader]._lasty = monster[i]._my;\r\n\t\t\tmonster[leader]._msquelch = monster[i]._msquelch - 1;\r\n\t\t}\r\n\t\tif (monster[leader]._mAi == AI_GARG) {\r\n\t\t\tif (monster[leader]._mFlags & MFLAG_ALLOW_SPECIAL) {\r\n\t\t\t\tmonster[leader]._mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\t\t\tmonster[leader]._mmode = MM_SATTACK;\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (monster[i]._uniqtype != 0) {\r\n\t\tif (UniqMonst[monster[i]._uniqtype - 1].mUnqAttr & 2) {\r\n\t\t\tfor (j = 0; j < nummonsters; j++) {\r\n\t\t\t\tm = monstactive[j];\r\n\t\t\t\tif (monster[m].leaderflag == 1 && monster[m].leader == i) {\r\n\t\t\t\t\tif (monster[i]._msquelch > monster[m]._msquelch) {\r\n\t\t\t\t\t\tmonster[m]._lastx = monster[i]._mx;\r\n\t\t\t\t\t\tmonster[m]._lasty = monster[i]._my;\r\n\t\t\t\t\t\tmonster[m]._msquelch = monster[i]._msquelch - 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (monster[m]._mAi == AI_GARG) {\r\n\t\t\t\t\t\tif (monster[m]._mFlags & MFLAG_ALLOW_SPECIAL) {\r\n\t\t\t\t\t\t\tmonster[m]._mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\t\t\t\t\t\tmonster[m]._mmode = MM_SATTACK;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL M_CallWalk(int i, int md)\r\n{\r\n\tint mdtemp;\r\n\tBOOL ok;\r\n\r\n\tmdtemp = md;\r\n\tok = DirOK(i, md);\r\n\tif (random_(101, 2) != 0)\r\n\t\tok = ok || (md = left[mdtemp], DirOK(i, md)) || (md = right[mdtemp], DirOK(i, md));\r\n\telse\r\n\t\tok = ok || (md = right[mdtemp], DirOK(i, md)) || (md = left[mdtemp], DirOK(i, md));\r\n\tif (random_(102, 2) != 0)\r\n\t\tok = ok\r\n\t\t    || (md = right[right[mdtemp]], DirOK(i, md))\r\n\t\t    || (md = left[left[mdtemp]], DirOK(i, md));\r\n\telse\r\n\t\tok = ok\r\n\t\t    || (md = left[left[mdtemp]], DirOK(i, md))\r\n\t\t    || (md = right[right[mdtemp]], DirOK(i, md));\r\n\tif (ok)\r\n\t\tM_WalkDir(i, md);\r\n\treturn ok;\r\n}\r\n\r\nBOOL M_PathWalk(int i)\r\n{\r\n\tchar path[MAX_PATH_LENGTH];\r\n\tBOOL(*Check)\r\n\t(int, int, int);\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"M_PathWalk: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tCheck = PosOkMonst3;\r\n\tif (!(monster[i]._mFlags & MFLAG_CAN_OPEN_DOOR))\r\n\t\tCheck = PosOkMonst;\r\n\r\n\tif (FindPath(Check, i, monster[i]._mx, monster[i]._my, monster[i]._menemyx, monster[i]._menemyy, path)) {\r\n\t\tM_CallWalk(i, plr2monst[path[0]]); /* plr2monst is local */\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL M_CallWalk2(int i, int md)\r\n{\r\n\tBOOL ok;\r\n\tint mdtemp;\r\n\r\n\tmdtemp = md;\r\n\tok = DirOK(i, md);          // Can we continue in the same direction\r\n\tif (random_(101, 2) != 0) { // Randomly go left or right\r\n\t\tok = ok || (mdtemp = left[md], DirOK(i, left[md])) || (mdtemp = right[md], DirOK(i, right[md]));\r\n\t} else {\r\n\t\tok = ok || (mdtemp = right[md], DirOK(i, right[md])) || (mdtemp = left[md], DirOK(i, left[md]));\r\n\t}\r\n\r\n\tif (ok)\r\n\t\tM_WalkDir(i, mdtemp);\r\n\r\n\treturn ok;\r\n}\r\n\r\nBOOL M_DumbWalk(int i, int md)\r\n{\r\n\tBOOL ok;\r\n\tok = DirOK(i, md);\r\n\tif (ok)\r\n\t\tM_WalkDir(i, md);\r\n\r\n\treturn ok;\r\n}\r\n\r\nBOOL M_RoundWalk(int i, int md, int &dir)\r\n{\r\n\tint mdtemp;\r\n\tBOOL ok;\r\n\tif (dir)\r\n\t\tmd = left[left[md]];\r\n\telse\r\n\t\tmd = right[right[md]];\r\n\r\n\tmdtemp = md;\r\n\tok = DirOK(i, md);\r\n\tif (!ok) {\r\n\t\tif (dir) {\r\n\t\t\tmd = right[mdtemp];\r\n\t\t\tok = DirOK(i, md) || (md = right[right[mdtemp]], DirOK(i, md));\r\n\t\t} else {\r\n\t\t\tmd = left[mdtemp];\r\n\t\t\tok = (DirOK(i, md) || (md = left[left[mdtemp]], DirOK(i, md)));\r\n\t\t}\r\n\t}\r\n\tif (ok) {\r\n\t\tM_WalkDir(i, md);\r\n\t} else {\r\n\t\tdir = !dir;\r\n\t\tok = M_CallWalk(i, opposite[mdtemp]);\r\n\t}\r\n\treturn ok;\r\n}\r\n\r\nvoid MAI_Zombie(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my;\r\n\tint md, v;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Zombie: Invalid monster %d\", i);\r\n#endif\r\n\t}\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx;\r\n\tmy = Monst->_my;\r\n\tif (!(dFlags[mx][my] & BFLAG_VISIBLE)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = mx - Monst->_menemyx;\r\n\tmy = my - Monst->_menemyy;\r\n\tmd = Monst->_mdir;\r\n\tv = random_(103, 100);\r\n\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\tif (v < 2 * Monst->_mint + 10) {\r\n\t\t\tif (abs(mx) >= 2 * Monst->_mint + 4 || abs(my) >= 2 * Monst->_mint + 4) {\r\n\t\t\t\tif (random_(104, 100) < 2 * Monst->_mint + 20) {\r\n\t\t\t\t\tmd = random_(104, 8);\r\n\t\t\t\t}\r\n\t\t\t\tM_DumbWalk(i, md);\r\n\t\t\t} else {\r\n\t\t\t\tmd = M_GetDir(i);\r\n\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (v < 2 * Monst->_mint + 10) {\r\n\t\tM_StartAttack(i);\r\n\t}\r\n\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];\r\n}\r\n\r\nvoid MAI_SkelSd(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, x, y, md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_SkelSd: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx;\r\n\tmy = Monst->_my;\r\n\tx = mx - Monst->_menemyx;\r\n\ty = my - Monst->_menemyy;\r\n\tmd = GetDirection(mx, my, Monst->_lastx, Monst->_lasty);\r\n\tMonst->_mdir = md;\r\n\tif (abs(x) >= 2 || abs(y) >= 2) {\r\n\t\tif (Monst->_mVar1 == MM_DELAY || (random_(106, 100) >= 35 - 4 * Monst->_mint)) {\r\n\t\t\tM_CallWalk(i, md);\r\n\t\t} else {\r\n\t\t\tM_StartDelay(i, 15 - 2 * Monst->_mint + random_(106, 10));\r\n\t\t}\r\n\t} else {\r\n\t\tif (Monst->_mVar1 == MM_DELAY || (random_(105, 100) < 2 * Monst->_mint + 20)) {\r\n\t\t\tM_StartAttack(i);\r\n\t\t} else {\r\n\t\t\tM_StartDelay(i, 2 * (5 - Monst->_mint) + random_(105, 10));\r\n\t\t}\r\n\t}\r\n\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nBOOL MAI_Path(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tBOOL clear;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"MAI_Path: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->MType->mtype != MT_GOLEM) {\r\n\t\tif (Monst->_msquelch == 0)\r\n\t\t\treturn FALSE;\r\n\t\tif (Monst->_mmode != MM_STAND)\r\n\t\t\treturn FALSE;\r\n\t\tif (Monst->_mgoal != MGOAL_NORMAL && Monst->_mgoal != MGOAL_MOVE && Monst->_mgoal != MGOAL_ATTACK2)\r\n\t\t\treturn FALSE;\r\n\t\tif (Monst->_mx == 1 && Monst->_my == 0)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\tclear = LineClearF1(\r\n\t    PosOkMonst2,\r\n\t    i,\r\n\t    Monst->_mx,\r\n\t    Monst->_my,\r\n\t    Monst->_menemyx,\r\n\t    Monst->_menemyy);\r\n\tif (!clear || Monst->_pathcount >= 5 && Monst->_pathcount < 8) {\r\n\t\tif (Monst->_mFlags & MFLAG_CAN_OPEN_DOOR)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tMonst->_pathcount++;\r\n\t\tif (Monst->_pathcount < 5)\r\n\t\t\treturn FALSE;\r\n\t\tif (M_PathWalk(i))\r\n\t\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (Monst->MType->mtype != MT_GOLEM)\r\n\t\tMonst->_pathcount = 0;\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid MAI_Snake(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint fx, fy, mx, my, md;\r\n\tint pnum;\r\n\tint tmp;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Snake: Invalid monster %d\", i);\r\n#endif\r\n\t}\r\n\tchar pattern[6] = { 1, 1, 0, -1, -1, 0 };\r\n\tMonst = &monster[i];\r\n\tpnum = Monst->_menemy;\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0)\r\n\t\treturn;\r\n\tfx = Monst->_menemyx;\r\n\tfy = Monst->_menemyy;\r\n\tmx = Monst->_mx - fx;\r\n\tmy = Monst->_my - fy;\r\n\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\tMonst->_mdir = md;\r\n\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\tif (abs(mx) < 3 && abs(my) < 3 && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy) && Monst->_mVar1 != MM_CHARGE) {\r\n\t\t\tif (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) {\r\n\t\t\t\tPlayEffect(i, 0);\r\n\t\t\t\tdMonster[Monst->_mx][Monst->_my] = -(i + 1);\r\n\t\t\t\tMonst->_mmode = MM_CHARGE;\r\n\t\t\t}\r\n\t\t} else if (Monst->_mVar1 == MM_DELAY || random_(106, 100) >= 35 - 2 * Monst->_mint) {\r\n\t\t\tif (md + pattern[Monst->_mgoalvar1] < 0) {\r\n\t\t\t\ttmp = md + pattern[Monst->_mgoalvar1] + 8;\r\n\t\t\t} else {\r\n\t\t\t\ttmp = md + pattern[Monst->_mgoalvar1] - 8;\r\n\t\t\t\tif (md + pattern[Monst->_mgoalvar1] < 8)\r\n\t\t\t\t\ttmp = md + pattern[Monst->_mgoalvar1];\r\n\t\t\t}\r\n\t\t\tMonst->_mgoalvar1++;\r\n\t\t\tif (Monst->_mgoalvar1 > 5)\r\n\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\tif (tmp - Monst->_mgoalvar2 < 0) {\r\n\t\t\t\tmd = tmp - Monst->_mgoalvar2 + 8;\r\n\t\t\t} else if (tmp - Monst->_mgoalvar2 >= 8) {\r\n\t\t\t\tmd = tmp - Monst->_mgoalvar2 - 8;\r\n\t\t\t} else\r\n\t\t\t\tmd = tmp - Monst->_mgoalvar2;\r\n\t\t\tif (md > 0) {\r\n\t\t\t\tif (md < 4) {\r\n\t\t\t\t\tif (Monst->_mgoalvar2 + 1 < 0) {\r\n\t\t\t\t\t\tmd = Monst->_mgoalvar2 + 9;\r\n\t\t\t\t\t} else if (Monst->_mgoalvar2 + 1 >= 8) {\r\n\t\t\t\t\t\tmd = Monst->_mgoalvar2 - 7;\r\n\t\t\t\t\t} else\r\n\t\t\t\t\t\tmd = Monst->_mgoalvar2 + 1;\r\n\t\t\t\t\tMonst->_mgoalvar2 = md;\r\n\t\t\t\t} else if (md == 4) {\r\n\t\t\t\t\tMonst->_mgoalvar2 = tmp;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (Monst->_mgoalvar2 - 1 < 0) {\r\n\t\t\t\t\t\tmd = Monst->_mgoalvar2 + 7;\r\n\t\t\t\t\t} else if (Monst->_mgoalvar2 - 1 >= 8) {\r\n\t\t\t\t\t\tmd = Monst->_mgoalvar2 - 9;\r\n\t\t\t\t\t} else\r\n\t\t\t\t\t\tmd = Monst->_mgoalvar2 - 1;\r\n\t\t\t\t\tMonst->_mgoalvar2 = md;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!M_DumbWalk(i, Monst->_mgoalvar2))\r\n\t\t\t\tM_CallWalk2(i, Monst->_mdir);\r\n\t\t} else {\r\n\t\t\tM_StartDelay(i, 15 - Monst->_mint + random_(106, 10));\r\n\t\t}\r\n\t} else {\r\n\t\tif (Monst->_mVar1 == MM_DELAY\r\n\t\t    || Monst->_mVar1 == MM_CHARGE\r\n\t\t    || (random_(105, 100) < Monst->_mint + 20)) {\r\n\t\t\tM_StartAttack(i);\r\n\t\t} else\r\n\t\t\tM_StartDelay(i, 10 - Monst->_mint + random_(105, 10));\r\n\t}\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];\r\n}\r\n\r\nvoid MAI_Bat(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint md, v, pnum;\r\n\tint fx, fy, xd, yd;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Bat: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tpnum = Monst->_menemy;\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\txd = Monst->_mx - Monst->_menemyx;\r\n\tyd = Monst->_my - Monst->_menemyy;\r\n\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\tMonst->_mdir = md;\r\n\tv = random_(107, 100);\r\n\tif (Monst->_mgoal == MGOAL_RETREAT) {\r\n\t\tif (!Monst->_mgoalvar1) {\r\n\t\t\tM_CallWalk(i, opposite[md]);\r\n\t\t\tMonst->_mgoalvar1++;\r\n\t\t} else {\r\n\t\t\tif (random_(108, 2) != 0)\r\n\t\t\t\tM_CallWalk(i, left[md]);\r\n\t\t\telse\r\n\t\t\t\tM_CallWalk(i, right[md]);\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tfx = Monst->_menemyx;\r\n\tfy = Monst->_menemyy;\r\n\tif (Monst->MType->mtype == MT_GLOOM\r\n\t    && (abs(xd) >= 5 || abs(yd) >= 5)\r\n\t    && v < 4 * Monst->_mint + 33\r\n\t    && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\tif (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, pnum, i, 0, 0) != -1) {\r\n\t\t\tdMonster[Monst->_mx][Monst->_my] = -(i + 1);\r\n\t\t\tMonst->_mmode = MM_CHARGE;\r\n\t\t}\r\n\t} else if (abs(xd) >= 2 || abs(yd) >= 2) {\r\n\t\tif (Monst->_mVar2 > 20 && v < Monst->_mint + 13\r\n\t\t    || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3)\r\n\t\t        && Monst->_mVar2 == 0\r\n\t\t        && v < Monst->_mint + 63) {\r\n\t\t\tM_CallWalk(i, md);\r\n\t\t}\r\n\t} else if (v < 4 * Monst->_mint + 8) {\r\n\t\tM_StartAttack(i);\r\n\t\tMonst->_mgoal = MGOAL_RETREAT;\r\n\t\tMonst->_mgoalvar1 = 0;\r\n\t\tif (Monst->MType->mtype == MT_FAMILIAR) {\r\n\t\t\tAddMissile(Monst->_menemyx, Monst->_menemyy, Monst->_menemyx + 1, 0, -1, MIS_LIGHTNING, TARGET_PLAYERS, i, random_(109, 10) + 1, 0);\r\n\t\t}\r\n\t}\r\n\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_SkelBow(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, md, v;\r\n\tBOOL walking;\r\n\r\n\twalking = FALSE;\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_SkelBow: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx - Monst->_menemyx;\r\n\tmy = Monst->_my - Monst->_menemyy;\r\n\r\n\tmd = M_GetDir(i);\r\n\tMonst->_mdir = md;\r\n\tv = random_(110, 100);\r\n\r\n\tif (abs(mx) < 4 && abs(my) < 4) {\r\n\t\tif (Monst->_mVar2 > 20 && v < 2 * Monst->_mint + 13\r\n\t\t    || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3)\r\n\t\t        && Monst->_mVar2 == 0\r\n\t\t        && v < 2 * Monst->_mint + 63) {\r\n\t\t\twalking = M_DumbWalk(i, opposite[md]);\r\n\t\t}\r\n\t}\r\n\r\n\tmx = Monst->_menemyx;\r\n\tmy = Monst->_menemyy;\r\n\tif (!walking) {\r\n\t\tif (random_(110, 100) < 2 * Monst->_mint + 3) {\r\n\t\t\tif (LineClear(Monst->_mx, Monst->_my, mx, my))\r\n\t\t\t\tM_StartRAttack(i, MIS_ARROW, 4);\r\n\t\t}\r\n\t}\r\n\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Fat(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, md, v;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Fat: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx - Monst->_menemyx;\r\n\tmy = Monst->_my - Monst->_menemyy;\r\n\tmd = M_GetDir(i);\r\n\tMonst->_mdir = md;\r\n\tv = random_(111, 100);\r\n\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\tif (Monst->_mVar2 > 20 && v < 4 * Monst->_mint + 20\r\n\t\t    || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3)\r\n\t\t        && Monst->_mVar2 == 0\r\n\t\t        && v < 4 * Monst->_mint + 70) {\r\n\t\t\tM_CallWalk(i, md);\r\n\t\t}\r\n\t} else if (v < 4 * Monst->_mint + 15) {\r\n\t\tM_StartAttack(i);\r\n\t} else if (v < 4 * Monst->_mint + 20) {\r\n\t\tM_StartSpAttack(i);\r\n\t}\r\n\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Sneak(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, md;\r\n\tint dist, v;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Sneak: Invalid monster %d\", i);\r\n#endif\r\n\t}\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode == MM_STAND) {\r\n\t\tmx = Monst->_mx;\r\n\t\tmy = Monst->_my;\r\n\t\tif (dLight[mx][my] != lightmax) {\r\n\t\t\tmx -= Monst->_menemyx;\r\n\t\t\tmy -= Monst->_menemyy;\r\n\r\n\t\t\tmd = M_GetDir(i);\r\n\t\t\tdist = 5 - Monst->_mint;\r\n\t\t\tif (Monst->_mVar1 == MM_GOTHIT) {\r\n\t\t\t\tMonst->_mgoal = MGOAL_RETREAT;\r\n\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t} else {\r\n\t\t\t\tif (abs(mx) >= dist + 3 || abs(my) >= dist + 3 || Monst->_mgoalvar1 > 8) {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (Monst->_mgoal == MGOAL_RETREAT && !(Monst->_mFlags & MFLAG_NO_ENEMY)) {\r\n\t\t\t\tif (Monst->_mFlags & MFLAG_TARGETS_MONSTER)\r\n\t\t\t\t\tmd = GetDirection(Monst->_mx, Monst->_my, monster[Monst->_menemy]._mx, monster[Monst->_menemy]._my);\r\n\t\t\t\telse\r\n#else\r\n\t\t\tif (Monst->_mgoal == MGOAL_RETREAT) {\r\n\t\t\t\tif (Monst->_mFlags & MFLAG_TARGETS_MONSTER)\r\n#endif\r\n\t\t\t\t\tmd = GetDirection(Monst->_mx, Monst->_my, plr[Monst->_menemy]._pownerx, plr[Monst->_menemy]._pownery);\r\n\t\t\t\tmd = opposite[md];\r\n\t\t\t\tif (Monst->MType->mtype == MT_UNSEEN) {\r\n\t\t\t\t\tif (random_(112, 2) != 0)\r\n\t\t\t\t\t\tmd = left[md];\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tmd = right[md];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tMonst->_mdir = md;\r\n\t\t\tv = random_(112, 100);\r\n\t\t\tif (abs(mx) < dist && abs(my) < dist && Monst->_mFlags & MFLAG_HIDDEN) {\r\n\t\t\t\tM_StartFadein(i, md, FALSE);\r\n\t\t\t} else {\r\n\t\t\t\tif ((abs(mx) >= dist + 1 || abs(my) >= dist + 1) && !(Monst->_mFlags & MFLAG_HIDDEN)) {\r\n\t\t\t\t\tM_StartFadeout(i, md, TRUE);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (Monst->_mgoal == MGOAL_RETREAT\r\n\t\t\t\t\t    || (abs(mx) >= 2 || abs(my) >= 2) && (Monst->_mVar2 > 20 && v < 4 * Monst->_mint + 14 || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3) && Monst->_mVar2 == 0 && v < 4 * Monst->_mint + 64)) {\r\n\t\t\t\t\t\tMonst->_mgoalvar1++;\r\n\t\t\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (Monst->_mmode == MM_STAND) {\r\n\t\t\t\tif (abs(mx) >= 2 || abs(my) >= 2 || v >= 4 * Monst->_mint + 10)\r\n\t\t\t\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n\t\t\t\telse\r\n\t\t\t\t\tM_StartAttack(i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid MAI_Fireman(int i)\r\n{\r\n\tint xd, yd;\r\n\tint md, pnum;\r\n\tint fx, fy;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Fireman: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (monster[i]._mmode != MM_STAND || Monst->_msquelch == 0)\r\n\t\treturn;\r\n\r\n\tpnum = monster[i]._menemy;\r\n\tfx = monster[i]._menemyx;\r\n\tfy = monster[i]._menemyy;\r\n\txd = monster[i]._mx - fx;\r\n\tyd = monster[i]._my - fy;\r\n\r\n\tmd = M_GetDir(i);\r\n\tif (Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\tif (LineClear(Monst->_mx, Monst->_my, fx, fy)\r\n\t\t    && AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_FIREMAN, pnum, i, 0, 0) != -1) {\r\n\t\t\tMonst->_mmode = MM_CHARGE;\r\n\t\t\tMonst->_mgoal = MGOAL_ATTACK2;\r\n\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t}\r\n\t} else if (Monst->_mgoal == MGOAL_ATTACK2) {\r\n\t\tif (Monst->_mgoalvar1 == 3) {\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\tM_StartFadeout(i, md, TRUE);\r\n\t\t} else if (LineClear(Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\t\tM_StartRAttack(i, MIS_KRULL, 4);\r\n\t\t\tMonst->_mgoalvar1++;\r\n\t\t} else {\r\n\t\t\tM_StartDelay(i, random_(112, 10) + 5);\r\n\t\t\tMonst->_mgoalvar1++;\r\n\t\t}\r\n\t} else if (Monst->_mgoal == MGOAL_RETREAT) {\r\n\t\tM_StartFadein(i, md, FALSE);\r\n\t\tMonst->_mgoal = MGOAL_ATTACK2;\r\n\t}\r\n\tMonst->_mdir = md;\r\n\trandom_(112, 100);\r\n\tif (Monst->_mmode != MM_STAND)\r\n\t\treturn;\r\n\r\n\tif (abs(xd) < 2 && abs(yd) < 2 && Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\tM_TryH2HHit(i, monster[i]._menemy, monster[i].mHit, monster[i].mMinDamage, monster[i].mMaxDamage);\r\n\t\tMonst->_mgoal = MGOAL_RETREAT;\r\n\t\tif (!M_CallWalk(i, opposite[md])) {\r\n\t\t\tM_StartFadein(i, md, FALSE);\r\n\t\t\tMonst->_mgoal = MGOAL_ATTACK2;\r\n\t\t}\r\n\t} else if (!M_CallWalk(i, md) && (Monst->_mgoal == MGOAL_NORMAL || Monst->_mgoal == MGOAL_RETREAT)) {\r\n\t\tM_StartFadein(i, md, FALSE);\r\n\t\tMonst->_mgoal = MGOAL_ATTACK2;\r\n\t}\r\n}\r\n\r\nvoid MAI_Fallen(int i)\r\n{\r\n\tint x, y, xpos, ypos;\r\n\tint m, rad;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Fallen: Invalid monster %d\", i);\r\n#endif\r\n\t}\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mgoal == MGOAL_ATTACK2) {\r\n\t\tif (Monst->_mgoalvar1 != 0)\r\n\t\t\tMonst->_mgoalvar1--;\r\n\t\telse\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t}\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (Monst->_mgoal == MGOAL_RETREAT) {\r\n\t\tif (Monst->_mgoalvar1-- == 0) {\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\tM_StartStand(i, opposite[Monst->_mdir]);\r\n\t\t}\r\n\t}\r\n\r\n\tif (Monst->_mAnimFrame == Monst->_mAnimLen) {\r\n\t\tif (random_(113, 4) != 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!(monster[i]._mFlags & MFLAG_NOHEAL)) { // CODEFIX: - change to Monst-> in devilutionx\r\n\t\t\tM_StartSpStand(i, Monst->_mdir);\r\n\t\t\tif (Monst->_mmaxhp - (2 * Monst->_mint + 2) >= Monst->_mhitpoints)\r\n\t\t\t\tMonst->_mhitpoints += 2 * Monst->_mint + 2;\r\n\t\t\telse\r\n\t\t\t\tMonst->_mhitpoints = Monst->_mmaxhp;\r\n\t\t}\r\n\t\trad = 2 * Monst->_mint + 4;\r\n\t\tfor (y = -rad; y <= rad; y++) {\r\n\t\t\tfor (x = -rad; x <= rad; x++) {\r\n\t\t\t\txpos = Monst->_mx + x;\r\n\t\t\t\typos = Monst->_my + y;\r\n\t\t\t\t// BUGFIX: should check `xpos` and `ypos` for out-of-bounds, was checking `x` and `y`.\r\n\t\t\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\t\t\tm = dMonster[xpos][ypos];\r\n\t\t\t\t\tif (m > 0) {\r\n\t\t\t\t\t\tm--;\r\n\t\t\t\t\t\tif (monster[m]._mAi == AI_FALLEN) {\r\n\t\t\t\t\t\t\tmonster[m]._mgoal = MGOAL_ATTACK2;\r\n\t\t\t\t\t\t\tmonster[m]._mgoalvar1 = 30 * Monst->_mint + 105;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (Monst->_mgoal == MGOAL_RETREAT) {\r\n\t\tM_CallWalk(i, Monst->_mdir);\r\n\t} else if (Monst->_mgoal == MGOAL_ATTACK2) {\r\n\t\txpos = Monst->_mx - Monst->_menemyx;\r\n\t\typos = Monst->_my - Monst->_menemyy;\r\n\t\tif (abs(xpos) < 2 && abs(ypos) < 2)\r\n\t\t\tM_StartAttack(i);\r\n\t\telse\r\n\t\t\tM_CallWalk(i, M_GetDir(i));\r\n\t} else\r\n\t\tMAI_SkelSd(i);\r\n}\r\n\r\nvoid MAI_Cleaver(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint x, y, mx, my, md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Cleaver: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx;\r\n\tmy = Monst->_my;\r\n\tx = mx - Monst->_menemyx;\r\n\ty = my - Monst->_menemyy;\r\n\r\n\tmd = GetDirection(mx, my, Monst->_lastx, Monst->_lasty);\r\n\tMonst->_mdir = md;\r\n\r\n\tif (abs(x) >= 2 || abs(y) >= 2)\r\n\t\tM_CallWalk(i, md);\r\n\telse\r\n\t\tM_StartAttack(i);\r\n\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Round(int i, BOOL special)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint fx, fy;\r\n\tint mx, my, md;\r\n\tint dist, v;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Round: Invalid monster %d\", i);\r\n#endif\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) {\r\n\t\tfy = Monst->_menemyy;\r\n\t\tfx = Monst->_menemyx;\r\n\t\tmx = Monst->_mx - fx;\r\n\t\tmy = Monst->_my - fy;\r\n\t\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\t\tif (Monst->_msquelch < UCHAR_MAX)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tv = random_(114, 100);\r\n\t\tif ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) {\r\n\t\t\tif (Monst->_mgoal == MGOAL_MOVE || (abs(mx) >= 4 || abs(my) >= 4) && random_(115, 4) == 0) {\r\n\t\t\t\tif (Monst->_mgoal != MGOAL_MOVE) {\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t\tMonst->_mgoalvar2 = random_(116, 2);\r\n\t\t\t\t}\r\n\t\t\t\tMonst->_mgoal = MGOAL_MOVE;\r\n\t\t\t\tif (abs(mx) > abs(my))\r\n\t\t\t\t\tdist = abs(mx);\r\n\t\t\t\telse\r\n\t\t\t\t\tdist = abs(my);\r\n\t\t\t\tif (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md) || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\t} else if (!M_RoundWalk(i, md, Monst->_mgoalvar2)) {\r\n\t\t\t\t\tM_StartDelay(i, random_(125, 10) + 10);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\tif (Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\t\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\t\t\tif (Monst->_mVar2 > 20 && v < 2 * Monst->_mint + 28\r\n\t\t\t\t    || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3)\r\n\t\t\t\t        && Monst->_mVar2 == 0\r\n\t\t\t\t        && v < 2 * Monst->_mint + 78) {\r\n\t\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t\t}\r\n\t\t\t} else if (v < 2 * Monst->_mint + 23) {\r\n\t\t\t\tMonst->_mdir = md;\r\n\t\t\t\tif (special && Monst->_mhitpoints < (Monst->_mmaxhp >> 1) && random_(117, 2) != 0)\r\n\t\t\t\t\tM_StartSpAttack(i);\r\n\t\t\t\telse\r\n\t\t\t\t\tM_StartAttack(i);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Monst->_mmode == MM_STAND)\r\n\t\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n\t}\r\n}\r\n\r\nvoid MAI_GoatMc(int i)\r\n{\r\n\tMAI_Round(i, TRUE);\r\n}\r\n\r\nvoid MAI_Ranged(int i, int missile_type, BOOL special)\r\n{\r\n\tint md;\r\n\tint fx, fy, mx, my;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Ranged: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tif (monster[i]._mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_msquelch == UCHAR_MAX || Monst->_mFlags & MFLAG_TARGETS_MONSTER) {\r\n\t\tfx = Monst->_menemyx;\r\n\t\tfy = Monst->_menemyy;\r\n\t\tmx = Monst->_mx - fx;\r\n\t\tmy = Monst->_my - fy;\r\n\t\tmd = M_GetDir(i);\r\n\t\tif (Monst->_msquelch < UCHAR_MAX)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tMonst->_mdir = md;\r\n\t\tif (Monst->_mVar1 == MM_RATTACK) {\r\n\t\t\tM_StartDelay(i, random_(118, 20));\r\n\t\t} else if (abs(mx) < 4 && abs(my) < 4) {\r\n\t\t\tif (random_(119, 100) < 10 * (Monst->_mint + 7))\r\n\t\t\t\tM_CallWalk(i, opposite[md]);\r\n\t\t}\r\n\t\tif (Monst->_mmode == MM_STAND) {\r\n\t\t\tif (LineClear(Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\t\t\tif (special)\r\n\t\t\t\t\tM_StartRSpAttack(i, missile_type, 4);\r\n\t\t\t\telse\r\n\t\t\t\t\tM_StartRAttack(i, missile_type, 4);\r\n\t\t\t} else {\r\n\t\t\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (Monst->_msquelch != 0) {\r\n\t\tfx = Monst->_lastx;\r\n\t\tfy = Monst->_lasty;\r\n\t\tmd = GetDirection(Monst->_mx, Monst->_my, fx, fy);\r\n\t\tM_CallWalk(i, md);\r\n\t}\r\n}\r\n\r\nvoid MAI_GoatBow(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_ARROW, FALSE);\r\n}\r\n\r\nvoid MAI_Succ(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_FLARE, FALSE);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid MAI_Lich(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_LICH, FALSE);\r\n}\r\n\r\nvoid MAI_ArchLich(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_ARCHLICH, FALSE);\r\n}\r\n\r\nvoid MAI_Psychorb(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_PSYCHORB, FALSE);\r\n}\r\n\r\nvoid MAI_Necromorb(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_NECROMORB, FALSE);\r\n}\r\n#endif\r\n\r\nvoid MAI_AcidUniq(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_ACID, TRUE);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid MAI_Firebat(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_FIREBOLT, FALSE);\r\n}\r\n\r\nvoid MAI_Torchant(int i)\r\n{\r\n\tMAI_Ranged(i, MIS_FIREBALL, FALSE);\r\n}\r\n#endif\r\n\r\nvoid MAI_Scav(int i)\r\n{\r\n\tBOOL done;\r\n\tint x, y;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Scav: Invalid monster %d\", i);\r\n#endif\r\n\tMonst = &monster[i];\r\n\tdone = FALSE;\r\n\tif (monster[i]._mmode != MM_STAND)\r\n\t\treturn;\r\n\tif (Monst->_mhitpoints < (Monst->_mmaxhp >> 1) && Monst->_mgoal != MGOAL_HEALING) {\r\n\t\tif (Monst->leaderflag != 0) {\r\n\t\t\tmonster[Monst->leader].packsize--; // BUGFIX Check Monst->leaderflag == 1, to not underflow packsize\r\n\t\t\tMonst->leaderflag = 0;\r\n\t\t}\r\n\t\tMonst->_mgoal = MGOAL_HEALING;\r\n\t\tMonst->_mgoalvar3 = 10;\r\n\t}\r\n\tif (Monst->_mgoal == MGOAL_HEALING && Monst->_mgoalvar3 != 0) {\r\n\t\tMonst->_mgoalvar3--;\r\n\t\tif (dDead[Monst->_mx][Monst->_my] != 0) {\r\n\t\t\tM_StartEat(i);\r\n\t\t\tif (!(Monst->_mFlags & MFLAG_NOHEAL)) {\r\n#ifdef HELLFIRE\r\n\t\t\t\tint mMaxHP = Monst->MType->mMaxHP << 6; // BUGFIX use _mmaxhp or we loose health when difficulty isn't normal\r\n\t\t\t\tif (gbMaxPlayers == 1)\r\n\t\t\t\t\tmMaxHP >>= 1;\r\n\t\t\t\tMonst->_mhitpoints += mMaxHP >> 3;\r\n\t\t\t\tif (Monst->_mhitpoints > mMaxHP)\r\n\t\t\t\t\tMonst->_mhitpoints = mMaxHP;\r\n\t\t\t\tif (Monst->_mmaxhp < Monst->_mhitpoints)\r\n\t\t\t\t\tMonst->_mmaxhp = Monst->_mhitpoints;\r\n\t\t\t\tif (Monst->_mgoalvar3 <= 0 || Monst->_mhitpoints == mMaxHP)\r\n\t\t\t\t\tdDead[Monst->_mx][Monst->_my] = 0;\r\n\t\t\t}\r\n\t\t\tif (Monst->_mhitpoints == Monst->_mmaxhp) {\r\n#else\r\n\t\t\t\tMonst->_mhitpoints += 64;\r\n\t\t\t}\r\n\t\t\tif (Monst->_mhitpoints >= (Monst->_mmaxhp >> 1) + (Monst->_mmaxhp >> 2)) {\r\n#endif\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\tMonst->_mgoalvar2 = 0;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (Monst->_mgoalvar1 == 0) {\r\n\t\t\t\tif (random_(120, 2) != 0) {\r\n\t\t\t\t\tfor (y = -4; y <= 4 && !done; y++) {\r\n\t\t\t\t\t\tfor (x = -4; x <= 4 && !done; x++) {\r\n\t\t\t\t\t\t\t// BUGFIX: incorrect check of offset against limits of the dungeon\r\n\t\t\t\t\t\t\tif (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX)\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\tdone = dDead[Monst->_mx + x][Monst->_my + y] != 0\r\n\t\t\t\t\t\t\t    && LineClearF(\r\n\t\t\t\t\t\t\t        CheckNoSolid,\r\n\t\t\t\t\t\t\t        Monst->_mx,\r\n\t\t\t\t\t\t\t        Monst->_my,\r\n\t\t\t\t\t\t\t        Monst->_mx + x,\r\n\t\t\t\t\t\t\t        Monst->_my + y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tx--;\r\n\t\t\t\t\ty--;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (y = 4; y >= -4 && !done; y--) {\r\n\t\t\t\t\t\tfor (x = 4; x >= -4 && !done; x--) {\r\n\t\t\t\t\t\t\t// BUGFIX: incorrect check of offset against limits of the dungeon\r\n\t\t\t\t\t\t\tif (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX)\r\n\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\tdone = dDead[Monst->_mx + x][Monst->_my + y] != 0\r\n\t\t\t\t\t\t\t    && LineClearF(\r\n\t\t\t\t\t\t\t        CheckNoSolid,\r\n\t\t\t\t\t\t\t        Monst->_mx,\r\n\t\t\t\t\t\t\t        Monst->_my,\r\n\t\t\t\t\t\t\t        Monst->_mx + x,\r\n\t\t\t\t\t\t\t        Monst->_my + y);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tx++;\r\n\t\t\t\t\ty++;\r\n\t\t\t\t}\r\n\t\t\t\tif (done) {\r\n\t\t\t\t\tMonst->_mgoalvar1 = x + Monst->_mx + 1;\r\n\t\t\t\t\tMonst->_mgoalvar2 = y + Monst->_my + 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (Monst->_mgoalvar1) {\r\n\t\t\t\tx = Monst->_mgoalvar1 - 1;\r\n\t\t\t\ty = Monst->_mgoalvar2 - 1;\r\n\t\t\t\tMonst->_mdir = GetDirection(Monst->_mx, Monst->_my, x, y);\r\n\t\t\t\tM_CallWalk(i, Monst->_mdir);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse\r\n#else\r\n\tif (Monst->_mmode == MM_STAND)\r\n#endif\r\n\t\tMAI_SkelSd(i);\r\n}\r\n\r\nvoid MAI_Garg(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, dx, dy, md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Garg: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tdx = Monst->_mx - Monst->_lastx;\r\n\tdy = Monst->_my - Monst->_lasty;\r\n\tmd = M_GetDir(i);\r\n\tif (Monst->_msquelch != 0 && Monst->_mFlags & MFLAG_ALLOW_SPECIAL) {\r\n\t\tM_Enemy(i);\r\n\t\tmx = Monst->_mx - Monst->_menemyx;\r\n\t\tmy = Monst->_my - Monst->_menemyy;\r\n\t\tif (abs(mx) < Monst->_mint + 2 && abs(my) < Monst->_mint + 2) {\r\n\t\t\tMonst->_mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (Monst->_mhitpoints < (Monst->_mmaxhp >> 1))\r\n#ifndef HELLFIRE\r\n\t\tif (!(Monst->_mFlags & MFLAG_NOHEAL))\r\n#endif\r\n\t\t\tMonst->_mgoal = MGOAL_RETREAT;\r\n\tif (Monst->_mgoal == MGOAL_RETREAT) {\r\n\t\tif (abs(dx) >= Monst->_mint + 2 || abs(dy) >= Monst->_mint + 2) {\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\tM_StartHeal(i);\r\n\t\t} else if (!M_CallWalk(i, opposite[md])) {\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t}\r\n\t}\r\n\tMAI_Round(i, FALSE);\r\n}\r\n\r\nvoid MAI_RoundRanged(int i, int missile_type, BOOL checkdoors, int dam, int lessmissiles)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my;\r\n\tint fx, fy;\r\n\tint md, dist, v;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_RoundRanged: Invalid monster %d\", i);\r\n#endif\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) {\r\n\t\tfx = Monst->_menemyx;\r\n\t\tfy = Monst->_menemyy;\r\n\t\tmx = Monst->_mx - fx;\r\n\t\tmy = Monst->_my - fy;\r\n\t\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\t\tif (checkdoors && Monst->_msquelch < UCHAR_MAX)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tv = random_(121, 10000);\r\n\t\tif ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) {\r\n\t\t\tif (Monst->_mgoal == MGOAL_MOVE || ((abs(mx) >= 3 || abs(my) >= 3) && random_(122, 4 << lessmissiles) == 0)) {\r\n\t\t\t\tif (Monst->_mgoal != MGOAL_MOVE) {\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t\tMonst->_mgoalvar2 = random_(123, 2);\r\n\t\t\t\t}\r\n\t\t\t\tMonst->_mgoal = MGOAL_MOVE;\r\n\t\t\t\tif (abs(mx) > abs(my)) {\r\n\t\t\t\t\tdist = abs(mx);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdist = abs(my);\r\n\t\t\t\t}\r\n\t\t\t\tif (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md)) {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\t} else if (v < (500 * (Monst->_mint + 1) >> lessmissiles)\r\n\t\t\t\t    && (LineClear(Monst->_mx, Monst->_my, fx, fy))) {\r\n\t\t\t\t\tM_StartRSpAttack(i, missile_type, dam);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tM_RoundWalk(i, md, Monst->_mgoalvar2);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t}\r\n\t\tif (Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\t\tif (((abs(mx) >= 3 || abs(my) >= 3) && v < ((500 * (Monst->_mint + 2)) >> lessmissiles)\r\n\t\t\t        || v < ((500 * (Monst->_mint + 1)) >> lessmissiles))\r\n\t\t\t    && LineClear(Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\t\t\tM_StartRSpAttack(i, missile_type, dam);\r\n\t\t\t} else if (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\t\t\tv = random_(124, 100);\r\n\t\t\t\tif (v < 1000 * (Monst->_mint + 5)\r\n\t\t\t\t    || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3) && Monst->_mVar2 == 0 && v < 1000 * (Monst->_mint + 8)) {\r\n\t\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t\t}\r\n\t\t\t} else if (v < 1000 * (Monst->_mint + 6)) {\r\n\t\t\t\tMonst->_mdir = md;\r\n\t\t\t\tM_StartAttack(i);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Monst->_mmode == MM_STAND) {\r\n\t\t\tM_StartDelay(i, random_(125, 10) + 5);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid MAI_Magma(int i)\r\n{\r\n\tMAI_RoundRanged(i, MIS_MAGMABALL, TRUE, 4, 0);\r\n}\r\n\r\nvoid MAI_Storm(int i)\r\n{\r\n\tMAI_RoundRanged(i, MIS_LIGHTCTRL2, TRUE, 4, 0);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid MAI_BoneDemon(int i)\r\n{\r\n\tMAI_RoundRanged(i, MIS_BONEDEMON, TRUE, 4, 0);\r\n}\r\n#endif\r\n\r\nvoid MAI_Acid(int i)\r\n{\r\n\tMAI_RoundRanged(i, MIS_ACID, FALSE, 4, 1);\r\n}\r\n\r\nvoid MAI_Diablo(int i)\r\n{\r\n\tMAI_RoundRanged(i, MIS_DIABAPOCA, FALSE, 40, 0);\r\n}\r\n\r\nvoid MAI_RR2(int i, int mistype, int dam)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, fx, fy;\r\n\tint dist, v, md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_RR2: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tmx = Monst->_mx - Monst->_menemyx;\r\n\tmy = Monst->_my - Monst->_menemyy;\r\n\tif (abs(mx) >= 5 || abs(my) >= 5) {\r\n\t\tMAI_SkelSd(i);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) {\r\n\t\tfx = Monst->_menemyx;\r\n\t\tfy = Monst->_menemyy;\r\n\t\tmx = Monst->_mx - fx;\r\n\t\tmy = Monst->_my - fy;\r\n\t\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\t\tif (Monst->_msquelch < UCHAR_MAX)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tv = random_(121, 100);\r\n\t\tif ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) {\r\n\t\t\tif (Monst->_mgoal == MGOAL_MOVE || (abs(mx) >= 3 || abs(my) >= 3)) {\r\n\t\t\t\tif (Monst->_mgoal != MGOAL_MOVE) {\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t\tMonst->_mgoalvar2 = random_(123, 2);\r\n\t\t\t\t}\r\n\t\t\t\tMonst->_mgoal = MGOAL_MOVE;\r\n\t\t\t\tMonst->_mgoalvar3 = 4;\r\n\t\t\t\tif (abs(mx) > abs(my)) {\r\n\t\t\t\t\tdist = abs(mx);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdist = abs(my);\r\n\t\t\t\t}\r\n\t\t\t\tif (Monst->_mgoalvar1++ < 2 * dist || !DirOK(i, md)) {\r\n\t\t\t\t\tif (v < 5 * (Monst->_mint + 16))\r\n\t\t\t\t\t\tM_RoundWalk(i, md, Monst->_mgoalvar2);\r\n\t\t\t\t} else\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t}\r\n\t\t} else\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\tif (Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\t\tif (((abs(mx) >= 3 || abs(my) >= 3) && v < 5 * (Monst->_mint + 2) || v < 5 * (Monst->_mint + 1) || Monst->_mgoalvar3 == 4) && LineClear(Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\t\t\tM_StartRSpAttack(i, mistype, dam);\r\n\t\t\t} else if (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\t\t\tv = random_(124, 100);\r\n\t\t\t\tif (v < 2 * (5 * Monst->_mint + 25)\r\n\t\t\t\t    || (Monst->_mVar1 == MM_WALK || Monst->_mVar1 == MM_WALK2 || Monst->_mVar1 == MM_WALK3)\r\n\t\t\t\t        && Monst->_mVar2 == 0\r\n\t\t\t\t        && v < 2 * (5 * Monst->_mint + 40)) {\r\n\t\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (random_(124, 100) < 10 * (Monst->_mint + 4)) {\r\n\t\t\t\t\tMonst->_mdir = md;\r\n\t\t\t\t\tif (random_(124, 2) != 0)\r\n\t\t\t\t\t\tM_StartAttack(i);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tM_StartRSpAttack(i, mistype, dam);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tMonst->_mgoalvar3 = 1;\r\n\t\t}\r\n\t\tif (Monst->_mmode == MM_STAND) {\r\n\t\t\tM_StartDelay(i, random_(125, 10) + 5);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid MAI_Mega(int i)\r\n{\r\n\tMAI_RR2(i, MIS_FLAMEC, 0);\r\n}\r\n\r\nvoid MAI_Golum(int i)\r\n{\r\n\tint mx, my, _mex, _mey;\r\n\tint md, j, k, _menemy;\r\n\tMonsterStruct *Monst;\r\n\tBOOL have_enemy, ok;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Golum: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mx == 1 && Monst->_my == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (Monst->_mmode == MM_DEATH\r\n\t    || Monst->_mmode == MM_SPSTAND\r\n\t    || (Monst->_mmode >= MM_WALK && Monst->_mmode <= MM_WALK3)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!(Monst->_mFlags & MFLAG_TARGETS_MONSTER))\r\n\t\tM_Enemy(i);\r\n\r\n\thave_enemy = !(monster[i]._mFlags & MFLAG_NO_ENEMY);\r\n\r\n\tif (Monst->_mmode == MM_ATTACK) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t_menemy = monster[i]._menemy;\r\n\r\n\tmx = monster[i]._mx;\r\n\tmy = monster[i]._my;\r\n\t_mex = mx - monster[_menemy]._mfutx;\r\n\t_mey = my - monster[_menemy]._mfuty;\r\n\tmd = GetDirection(mx, my, monster[_menemy]._mx, monster[_menemy]._my);\r\n\tmonster[i]._mdir = md;\r\n\tif (abs(_mex) < 2 && abs(_mey) < 2 && have_enemy) {\r\n\t\t_menemy = monster[i]._menemy;\r\n\t\tmonster[i]._menemyx = monster[_menemy]._mx;\r\n\t\tmonster[i]._menemyy = monster[_menemy]._my;\r\n\t\tif (monster[_menemy]._msquelch == 0) {\r\n\t\t\tmonster[_menemy]._msquelch = UCHAR_MAX;\r\n\t\t\tmonster[monster[i]._menemy]._lastx = monster[i]._mx;\r\n\t\t\tmonster[monster[i]._menemy]._lasty = monster[i]._my;\r\n\t\t\tfor (j = 0; j < 5; j++) {\r\n\t\t\t\tfor (k = 0; k < 5; k++) {\r\n\t\t\t\t\t_menemy = dMonster[monster[i]._mx + k - 2][monster[i]._my + j - 2]; // BUGFIX: Check if indexes are between 0 and 112\r\n\t\t\t\t\tif (_menemy > 0)\r\n\t\t\t\t\t\tmonster[_menemy]._msquelch = UCHAR_MAX; // BUGFIX: should be `monster[_menemy-1]`, not monster[_menemy].\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tM_StartAttack(i);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (have_enemy && MAI_Path(i))\r\n\t\treturn;\r\n\r\n\tmonster[i]._pathcount++;\r\n\tif (monster[i]._pathcount > 8)\r\n\t\tmonster[i]._pathcount = 5;\r\n\r\n\tok = M_CallWalk(i, plr[i]._pdir);\r\n\tif (ok)\r\n\t\treturn;\r\n\r\n\tmd = (md - 1) & 7;\r\n\tfor (j = 0; j < 8 && !ok; j++) {\r\n\t\tmd = (md + 1) & 7;\r\n\t\tok = DirOK(i, md);\r\n\t}\r\n\tif (ok)\r\n\t\tM_WalkDir(i, md);\r\n}\r\n\r\nvoid MAI_SkelKing(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, fx, fy, nx, ny;\r\n\tint dist, v, md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_SkelKing: Invalid monster %d\", i);\r\n#endif\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) {\r\n\t\tfx = Monst->_menemyx;\r\n\t\tfy = Monst->_menemyy;\r\n\t\tmx = Monst->_mx - fx;\r\n\t\tmy = Monst->_my - fy;\r\n\t\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\t\tif (Monst->_msquelch < UCHAR_MAX)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tv = random_(126, 100);\r\n\t\tif ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) {\r\n\t\t\tif (Monst->_mgoal == MGOAL_MOVE || (abs(mx) >= 3 || abs(my) >= 3) && random_(127, 4) == 0) {\r\n\t\t\t\tif (Monst->_mgoal != MGOAL_MOVE) {\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t\tMonst->_mgoalvar2 = random_(128, 2);\r\n\t\t\t\t}\r\n\t\t\t\tMonst->_mgoal = MGOAL_MOVE;\r\n\t\t\t\tif (abs(mx) > abs(my)) {\r\n\t\t\t\t\tdist = abs(mx);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdist = abs(my);\r\n\t\t\t\t}\r\n\t\t\t\tif (Monst->_mgoalvar1++ >= 2 * dist && DirOK(i, md) || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\t} else if (!M_RoundWalk(i, md, Monst->_mgoalvar2)) {\r\n\t\t\t\t\tM_StartDelay(i, random_(125, 10) + 10);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\tif (Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\t\tif (gbMaxPlayers == 1\r\n\t\t\t    && ((abs(mx) >= 3 || abs(my) >= 3) && v < 4 * Monst->_mint + 35 || v < 6)\r\n\t\t\t    && LineClear(Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\t\t\tnx = Monst->_mx + offset_x[md];\r\n\t\t\t\tny = Monst->_my + offset_y[md];\r\n\t\t\t\tif (PosOkMonst(i, nx, ny) && nummonsters < MAXMONSTERS) {\r\n\t\t\t\t\tM_SpawnSkel(nx, ny, md);\r\n\t\t\t\t\tM_StartSpStand(i, md);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\t\t\t\tv = random_(129, 100);\r\n\t\t\t\t\tif (v >= Monst->_mint + 25\r\n\t\t\t\t\t    && (Monst->_mVar1 != MM_WALK && Monst->_mVar1 != MM_WALK2 && Monst->_mVar1 != MM_WALK3 || Monst->_mVar2 != 0 || (v >= Monst->_mint + 75))) {\r\n\t\t\t\t\t\tM_StartDelay(i, random_(130, 10) + 10);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (v < Monst->_mint + 20) {\r\n\t\t\t\t\tMonst->_mdir = md;\r\n\t\t\t\t\tM_StartAttack(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Monst->_mmode == MM_STAND)\r\n\t\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n\t}\r\n}\r\n\r\nvoid MAI_Rhino(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, fx, fy;\r\n\tint v, dist, md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Rhino: Invalid monster %d\", i);\r\n#endif\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode == MM_STAND && Monst->_msquelch != 0) {\r\n\t\tfx = Monst->_menemyx;\r\n\t\tfy = Monst->_menemyy;\r\n\t\tmx = Monst->_mx - fx;\r\n\t\tmy = Monst->_my - fy;\r\n\t\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\t\tif (Monst->_msquelch < UCHAR_MAX)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tv = random_(131, 100);\r\n\t\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\t\tif (Monst->_mgoal == MGOAL_MOVE || (abs(mx) >= 5 || abs(my) >= 5) && random_(132, 4) != 0) {\r\n\t\t\t\tif (Monst->_mgoal != MGOAL_MOVE) {\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t\tMonst->_mgoalvar2 = random_(133, 2);\r\n\t\t\t\t}\r\n\t\t\t\tMonst->_mgoal = MGOAL_MOVE;\r\n\t\t\t\tif (abs(mx) > abs(my)) {\r\n\t\t\t\t\tdist = abs(mx);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdist = abs(my);\r\n\t\t\t\t}\r\n\t\t\t\tif (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\t} else if (!M_RoundWalk(i, md, Monst->_mgoalvar2)) {\r\n\t\t\t\t\tM_StartDelay(i, random_(125, 10) + 10);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\tif (Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\t\tif ((abs(mx) >= 5 || abs(my) >= 5)\r\n\t\t\t    && v < 2 * Monst->_mint + 43\r\n\t\t\t    && LineClearF1(PosOkMonst, i, Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\t\t\tif (AddMissile(Monst->_mx, Monst->_my, fx, fy, md, MIS_RHINO, Monst->_menemy, i, 0, 0) != -1) {\r\n\t\t\t\t\tif (Monst->MData->snd_special)\r\n\t\t\t\t\t\tPlayEffect(i, 3);\r\n\t\t\t\t\tdMonster[Monst->_mx][Monst->_my] = -1 - i;\r\n\t\t\t\t\tMonst->_mmode = MM_CHARGE;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\t\t\t\tv = random_(134, 100);\r\n\t\t\t\t\tif (v >= 2 * Monst->_mint + 33\r\n\t\t\t\t\t    && (Monst->_mVar1 != MM_WALK && Monst->_mVar1 != MM_WALK2 && Monst->_mVar1 != MM_WALK3\r\n\t\t\t\t\t        || Monst->_mVar2\r\n\t\t\t\t\t        || v >= 2 * Monst->_mint + 83)) {\r\n\t\t\t\t\t\tM_StartDelay(i, random_(135, 10) + 10);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (v < 2 * Monst->_mint + 28) {\r\n\t\t\t\t\tMonst->_mdir = md;\r\n\t\t\t\t\tM_StartAttack(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Monst->_mmode == MM_STAND)\r\n\t\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid MAI_HorkDemon(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint fx, fy, mx, my, md, v, dist;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode != MM_STAND || Monst->_msquelch == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfx = Monst->_menemyx;\r\n\tfy = Monst->_menemyy;\r\n\tmx = Monst->_mx - fx;\r\n\tmy = Monst->_my - fy;\r\n\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\r\n\tif (Monst->_msquelch < 255) {\r\n\t\tMonstCheckDoors(i);\r\n\t}\r\n\r\n\tv = random_(131, 100);\r\n\r\n\tif (abs(mx) < 2 && abs(my) < 2) {\r\n\t\tMonst->_mgoal = 1;\r\n\t} else if (Monst->_mgoal == 4 || (abs(mx) >= 5 || abs(my) >= 5) && random_(132, 4) != 0) {\r\n\t\tif (Monst->_mgoal != 4) {\r\n\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\tMonst->_mgoalvar2 = random_(133, 2);\r\n\t\t}\r\n\t\tMonst->_mgoal = 4;\r\n\t\tif (abs(mx) > abs(my)) {\r\n\t\t\tdist = abs(mx);\r\n\t\t} else {\r\n\t\t\tdist = abs(my);\r\n\t\t}\r\n\t\tif (Monst->_mgoalvar1++ >= 2 * dist || dTransVal[Monst->_mx][Monst->_my] != dTransVal[fx][fy]) {\r\n\t\t\tMonst->_mgoal = 1;\r\n\t\t} else if (!M_RoundWalk(i, md, Monst->_mgoalvar2)) {\r\n\t\t\tM_StartDelay(i, random_(125, 10) + 10);\r\n\t\t}\r\n\t}\r\n\r\n\tif (Monst->_mgoal == 1) {\r\n\t\tif ((abs(mx) >= 3 || abs(my) >= 3) && v < 2 * Monst->_mint + 43) {\r\n\t\t\tif (PosOkMonst(i, Monst->_mx + HorkXAdd[Monst->_mdir], Monst->_my + HorkYAdd[Monst->_mdir]) && nummonsters < MAXMONSTERS) {\r\n\t\t\t\tM_StartRSpAttack(i, MIS_HORKDMN, 0);\r\n\t\t\t}\r\n\t\t} else if (abs(mx) < 2 && abs(my) < 2) {\r\n\t\t\tif (v < 2 * Monst->_mint + 28) {\r\n\t\t\t\tMonst->_mdir = md;\r\n\t\t\t\tM_StartAttack(i);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tv = random_(134, 100);\r\n\t\t\tif (v < 2 * Monst->_mint + 33\r\n\t\t\t    || (Monst->_mVar1 == 1 || Monst->_mVar1 == 2 || Monst->_mVar1 == 3) && Monst->_mVar2 == 0 && v < 2 * Monst->_mint + 83) {\r\n\t\t\t\tM_CallWalk(i, md);\r\n\t\t\t} else {\r\n\t\t\t\tM_StartDelay(i, random_(135, 10) + 10);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (Monst->_mmode == MM_STAND) {\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid MAI_Counselor(int i)\r\n{\r\n\tint mx, my, fx, fy;\r\n\tint dist, md, v;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Counselor: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i]._mmode == MM_STAND && monster[i]._msquelch != 0) {\r\n\t\tMonst = &monster[i];\r\n\t\tfx = Monst->_menemyx;\r\n\t\tfy = Monst->_menemyy;\r\n\t\tmx = Monst->_mx - fx;\r\n\t\tmy = Monst->_my - fy;\r\n\t\tmd = GetDirection(Monst->_mx, Monst->_my, Monst->_lastx, Monst->_lasty);\r\n\t\tif (Monst->_msquelch < UCHAR_MAX)\r\n\t\t\tMonstCheckDoors(i);\r\n\t\tv = random_(121, 100);\r\n\t\tif (Monst->_mgoal == MGOAL_RETREAT) {\r\n\t\t\tif (Monst->_mgoalvar1++ <= 3)\r\n\t\t\t\tM_CallWalk(i, opposite[md]);\r\n\t\t\telse {\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\tM_StartFadein(i, md, TRUE);\r\n\t\t\t}\r\n\t\t} else if (Monst->_mgoal == MGOAL_MOVE) {\r\n\t\t\tif (abs(mx) > abs(my))\r\n\t\t\t\tdist = abs(mx);\r\n\t\t\telse\r\n\t\t\t\tdist = abs(my);\r\n\t\t\tif ((abs(mx) >= 2 || abs(my) >= 2) && Monst->_msquelch == UCHAR_MAX && dTransVal[Monst->_mx][Monst->_my] == dTransVal[fx][fy]) {\r\n\t\t\t\tif (Monst->_mgoalvar1++ < 2 * dist || !DirOK(i, md)) {\r\n\t\t\t\t\tM_RoundWalk(i, md, Monst->_mgoalvar2);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\t\tM_StartFadein(i, md, TRUE);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\tM_StartFadein(i, md, TRUE);\r\n\t\t\t}\r\n\t\t} else if (Monst->_mgoal == MGOAL_NORMAL) {\r\n\t\t\tif (abs(mx) >= 2 || abs(my) >= 2) {\r\n\t\t\t\tif (v < 5 * (Monst->_mint + 10) && LineClear(Monst->_mx, Monst->_my, fx, fy)) {\r\n\t\t\t\t\tM_StartRAttack(i, counsmiss[Monst->_mint], Monst->mMinDamage + random_(77, Monst->mMaxDamage - Monst->mMinDamage + 1));\r\n\t\t\t\t} else if (random_(124, 100) < 30) {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_MOVE;\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t\tM_StartFadeout(i, md, FALSE);\r\n\t\t\t\t} else\r\n\t\t\t\t\tM_StartDelay(i, random_(105, 10) + 2 * (5 - Monst->_mint));\r\n\t\t\t} else {\r\n\t\t\t\tMonst->_mdir = md;\r\n\t\t\t\tif (Monst->_mhitpoints < (Monst->_mmaxhp >> 1)) {\r\n\t\t\t\t\tMonst->_mgoal = MGOAL_RETREAT;\r\n\t\t\t\t\tMonst->_mgoalvar1 = 0;\r\n\t\t\t\t\tM_StartFadeout(i, md, FALSE);\r\n\t\t\t\t} else if (Monst->_mVar1 == MM_DELAY\r\n\t\t\t\t    || random_(105, 100) < 2 * Monst->_mint + 20) {\r\n\t\t\t\t\tM_StartRAttack(i, -1, 0);\r\n\t\t\t\t\tAddMissile(Monst->_mx, Monst->_my, 0, 0, Monst->_mdir, MIS_FLASH, TARGET_PLAYERS, i, 4, 0);\r\n\t\t\t\t\tAddMissile(Monst->_mx, Monst->_my, 0, 0, Monst->_mdir, MIS_FLASH2, TARGET_PLAYERS, i, 4, 0);\r\n\t\t\t\t} else\r\n\t\t\t\t\tM_StartDelay(i, random_(105, 10) + 2 * (5 - Monst->_mint));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Monst->_mmode == MM_STAND) {\r\n\t\t\tM_StartDelay(i, random_(125, 10) + 5);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid MAI_Garbud(int i)\r\n{\r\n\tint _mx, _my, md;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Garbud: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (Monst->_mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t_mx = Monst->_mx;\r\n\t_my = Monst->_my;\r\n\tmd = M_GetDir(i);\r\n\r\n\tif (Monst->mtalkmsg < TEXT_GARBUD4\r\n\t    && Monst->mtalkmsg > TEXT_DOOM10\r\n\t    && !(dFlags[_mx][_my] & BFLAG_VISIBLE)\r\n\t    && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\t\tMonst->mtalkmsg++;\r\n\t}\r\n\r\n\tif (dFlags[_mx][_my] & BFLAG_VISIBLE) {\r\n#ifndef SPAWN\r\n\t\tif (Monst->mtalkmsg == TEXT_GARBUD4) {\r\n\t\t\tif (!effect_is_playing(USFX_GARBUD4) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\tMonst->_msquelch = UCHAR_MAX;\r\n\t\t\t\tMonst->mtalkmsg = 0;\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\tif (Monst->_mgoal == MGOAL_NORMAL || Monst->_mgoal == MGOAL_MOVE)\r\n\t\tMAI_Round(i, TRUE);\r\n\r\n\tmonster[i]._mdir = md;\r\n\r\n\tif (Monst->_mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Zhar(int i)\r\n{\r\n\tint mx, my, md;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Zhar: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (monster[i]._mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx;\r\n\tmy = Monst->_my;\r\n\tmd = M_GetDir(i);\r\n\tif (Monst->mtalkmsg == TEXT_ZHAR1 && !(dFlags[mx][my] & BFLAG_VISIBLE) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\tMonst->mtalkmsg = TEXT_ZHAR2;\r\n\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\t}\r\n\r\n\tif (dFlags[mx][my] & BFLAG_VISIBLE) {\r\n\t\tmx = Monst->_mx - Monst->_menemyx;\r\n\t\tmy = Monst->_my - Monst->_menemyy;\r\n\t\tif (abs(mx) > abs(my))\r\n\t\t\tabs(mx);\r\n\t\telse\r\n\t\t\tabs(my);\r\n#ifndef SPAWN\r\n\t\tif (Monst->mtalkmsg == TEXT_ZHAR2) {\r\n\t\t\tif (!effect_is_playing(USFX_ZHAR2) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\t\t\tMonst->_msquelch = UCHAR_MAX;\r\n\t\t\t\tMonst->mtalkmsg = 0;\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\tif (Monst->_mgoal == MGOAL_NORMAL || Monst->_mgoal == MGOAL_RETREAT || Monst->_mgoal == MGOAL_MOVE)\r\n\t\tMAI_Counselor(i);\r\n\r\n\tMonst->_mdir = md;\r\n\r\n\tif (monster[i]._mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_SnotSpil(int i)\r\n{\r\n\tint mx, my, md;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_SnotSpil: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (monster[i]._mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx;\r\n\tmy = Monst->_my;\r\n\tmd = M_GetDir(i);\r\n\r\n\tif (Monst->mtalkmsg == TEXT_BANNER10 && !(dFlags[mx][my] & BFLAG_VISIBLE) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\tMonst->mtalkmsg = TEXT_BANNER11;\r\n\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\t}\r\n\r\n\tif (Monst->mtalkmsg == TEXT_BANNER11 && quests[Q_LTBANNER]._qvar1 == 3) {\r\n\t\tMonst->mtalkmsg = 0;\r\n\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t}\r\n\r\n\tif (dFlags[mx][my] & BFLAG_VISIBLE) {\r\n#ifndef SPAWN\r\n\t\tif (Monst->mtalkmsg == TEXT_BANNER12) {\r\n\t\t\tif (!effect_is_playing(USFX_SNOT3) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\t\t\tObjChangeMap(setpc_x, setpc_y, setpc_x + setpc_w + 1, setpc_y + setpc_h + 1);\r\n\t\t\t\tquests[Q_LTBANNER]._qvar1 = 3;\r\n\t\t\t\tRedoPlayerVision();\r\n\t\t\t\tMonst->_msquelch = UCHAR_MAX;\r\n\t\t\t\tMonst->mtalkmsg = 0;\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\t\tif (quests[Q_LTBANNER]._qvar1 == 3) {\r\n\t\t\tif (Monst->_mgoal == MGOAL_NORMAL || Monst->_mgoal == MGOAL_ATTACK2)\r\n\t\t\t\tMAI_Fallen(i);\r\n\t\t}\r\n\t}\r\n\r\n\tMonst->_mdir = md;\r\n\r\n\tif (monster[i]._mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Lazurus(int i)\r\n{\r\n\tint mx, my, md;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Lazurus: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (monster[i]._mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx;\r\n\tmy = Monst->_my;\r\n\tmd = M_GetDir(i);\r\n\tif (dFlags[mx][my] & BFLAG_VISIBLE) {\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tif (Monst->mtalkmsg == TEXT_VILE13 && Monst->_mgoal == MGOAL_INQUIRING && plr[myplr]._px == 35 && plr[myplr]._py == 46) {\r\n\t\t\t\tPlayInGameMovie(\"gendata\\\\fprst3.smk\");\r\n\t\t\t\tMonst->_mmode = MM_TALK;\r\n\t\t\t\tquests[Q_BETRAYER]._qvar1 = 5;\r\n\t\t\t}\r\n\r\n#ifndef SPAWN\r\n\t\t\tif (Monst->mtalkmsg == TEXT_VILE13 && !effect_is_playing(USFX_LAZ1) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\t\t\tObjChangeMapResync(1, 18, 20, 24);\r\n\t\t\t\tRedoPlayerVision();\r\n\t\t\t\tquests[Q_BETRAYER]._qvar1 = 6;\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\tMonst->_msquelch = UCHAR_MAX;\r\n\t\t\t\tMonst->mtalkmsg = 0;\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\r\n\t\tif (gbMaxPlayers != 1 && Monst->mtalkmsg == TEXT_VILE13 && Monst->_mgoal == MGOAL_INQUIRING && quests[Q_BETRAYER]._qvar1 <= 3) {\r\n\t\t\tMonst->_mmode = MM_TALK;\r\n\t\t}\r\n\t}\r\n\r\n\tif (Monst->_mgoal == MGOAL_NORMAL || Monst->_mgoal == MGOAL_RETREAT || Monst->_mgoal == MGOAL_MOVE) {\r\n#ifndef HELLFIRE\r\n\t\tMonst->mtalkmsg = 0;\r\n#endif\r\n\t\tMAI_Counselor(i);\r\n\t}\r\n\r\n\tMonst->_mdir = md;\r\n\r\n\tif (monster[i]._mmode == MM_STAND || monster[i]._mmode == MM_TALK)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Lazhelp(int i)\r\n{\r\n\tint _mx, _my;\r\n\tvolatile int md; // BUGFIX: very questionable volatile\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Lazhelp: Invalid monster %d\", i);\r\n#endif\r\n\tif (monster[i]._mmode != MM_STAND)\r\n\t\treturn;\r\n\r\n\tMonst = &monster[i];\r\n\t_mx = Monst->_mx;\r\n\t_my = Monst->_my;\r\n\tmd = M_GetDir(i);\r\n\r\n\tif (dFlags[_mx][_my] & BFLAG_VISIBLE) {\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tif (quests[Q_BETRAYER]._qvar1 <= 5) {\r\n\t\t\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\t\t\t} else {\r\n\t\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t\t\tMonst->mtalkmsg = 0;\r\n\t\t\t}\r\n\t\t} else\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t}\r\n\tif (Monst->_mgoal == MGOAL_NORMAL)\r\n\t\tMAI_Succ(i);\r\n\tMonst->_mdir = md;\r\n\tif (monster[i]._mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Lachdanan(int i)\r\n{\r\n\tint _mx, _my, md;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Lachdanan: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (monster[i]._mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t_mx = Monst->_mx;\r\n\t_my = Monst->_my;\r\n\tmd = M_GetDir(i);\r\n#ifndef SPAWN\r\n\tif (Monst->mtalkmsg == TEXT_VEIL9 && !(dFlags[_mx][_my] & BFLAG_VISIBLE) && monster[i]._mgoal == MGOAL_TALKING) {\r\n\t\tMonst->mtalkmsg = TEXT_VEIL10;\r\n\t\tmonster[i]._mgoal = MGOAL_INQUIRING;\r\n\t}\r\n\r\n\tif (dFlags[_mx][_my] & BFLAG_VISIBLE) {\r\n\t\tif (Monst->mtalkmsg == TEXT_VEIL11) {\r\n\t\t\tif (!effect_is_playing(USFX_LACH3) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\t\t\tMonst->mtalkmsg = 0;\r\n\t\t\t\tquests[Q_VEIL]._qactive = QUEST_DONE;\r\n\t\t\t\tM_StartKill(i, -1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tMonst->_mdir = md;\r\n\r\n\tif (monster[i]._mmode == MM_STAND)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[md];\r\n}\r\n\r\nvoid MAI_Warlord(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint mx, my, md;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MAI_Warlord: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tif (monster[i]._mmode != MM_STAND) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = Monst->_mx;\r\n\tmy = Monst->_my;\r\n\tmd = M_GetDir(i);\r\n\tif (dFlags[mx][my] & BFLAG_VISIBLE) {\r\n\t\tif (Monst->mtalkmsg == TEXT_WARLRD9 && Monst->_mgoal == MGOAL_INQUIRING)\r\n\t\t\tMonst->_mmode = MM_TALK;\r\n#ifndef SPAWN\r\n\t\tif (Monst->mtalkmsg == TEXT_WARLRD9 && !effect_is_playing(USFX_WARLRD1) && Monst->_mgoal == MGOAL_TALKING) {\r\n\t\t\tMonst->_msquelch = UCHAR_MAX;\r\n\t\t\tMonst->mtalkmsg = 0;\r\n\t\t\tMonst->_mgoal = MGOAL_NORMAL;\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\tif (Monst->_mgoal == MGOAL_NORMAL)\r\n\t\tMAI_SkelSd(i);\r\n\r\n\tMonst->_mdir = md;\r\n\r\n\tif (monster[i]._mmode == MM_STAND || monster[i]._mmode == MM_TALK)\r\n\t\tMonst->_mAnimData = Monst->MType->Anims[MA_STAND].Data[Monst->_mdir];\r\n}\r\n\r\nvoid DeleteMonsterList()\r\n{\r\n\tint i;\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (monster[i]._mDelFlag) {\r\n\t\t\tmonster[i]._mx = 1;\r\n\t\t\tmonster[i]._my = 0;\r\n\t\t\tmonster[i]._mfutx = 0;\r\n\t\t\tmonster[i]._mfuty = 0;\r\n\t\t\tmonster[i]._moldx = 0;\r\n\t\t\tmonster[i]._moldy = 0;\r\n\t\t\tmonster[i]._mDelFlag = FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\ti = MAX_PLRS;\r\n\twhile (i < nummonsters) {\r\n\t\tif (monster[monstactive[i]]._mDelFlag) {\r\n\t\t\tDeleteMonster(i);\r\n\t\t\ti = 0; // BUGFIX: should be `i = MAX_PLRS`, was 0 (only pseudo delete golems, their monster array indices are special and should not appear in the available monster index list).\r\n\t\t} else {\r\n\t\t\ti++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ProcessMonsters()\r\n{\r\n\tint i, mi, mx, my, _menemy;\r\n\tBOOL raflag;\r\n\tMonsterStruct *Monst;\r\n\r\n\tDeleteMonsterList();\r\n\r\n\t/// ASSERT: assert((DWORD)nummonsters <= MAXMONSTERS);\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\tmi = monstactive[i];\r\n\t\tMonst = &monster[mi];\r\n\t\traflag = FALSE;\r\n\t\tif (gbMaxPlayers > 1) {\r\n\t\t\tSetRndSeed(Monst->_mAISeed);\r\n\t\t\tMonst->_mAISeed = GetRndSeed();\r\n\t\t}\r\n\t\tif (!(monster[mi]._mFlags & MFLAG_NOHEAL) && Monst->_mhitpoints < Monst->_mmaxhp && Monst->_mhitpoints >> 6 > 0) {\r\n\t\t\tif (Monst->mLevel > 1) {\r\n\t\t\t\tMonst->_mhitpoints += Monst->mLevel >> 1;\r\n\t\t\t} else {\r\n\t\t\t\tMonst->_mhitpoints += Monst->mLevel;\r\n\t\t\t}\r\n\t\t}\r\n\t\tmx = Monst->_mx;\r\n\t\tmy = Monst->_my;\r\n#ifndef SPAWN\r\n\t\tif (dFlags[mx][my] & BFLAG_VISIBLE && Monst->_msquelch == 0) {\r\n\t\t\tif (Monst->MType->mtype == MT_CLEAVER) {\r\n\t\t\t\tPlaySFX(USFX_CLEAVER);\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\tif (Monst->MType->mtype == MT_NAKRUL) {\r\n\t\t\t\tif (UseCowFarmer) {\r\n\t\t\t\t\tPlaySFX(USFX_NAKRUL6);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (IsUberRoomOpened)\r\n\t\t\t\t\t\tPlaySFX(USFX_NAKRUL4);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tPlaySFX(USFX_NAKRUL5);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (Monst->MType->mtype == MT_DEFILER)\r\n\t\t\t\tPlaySFX(USFX_DEFILER8);\r\n\t\t\tM_Enemy(mi);\r\n#endif\r\n\t\t}\r\n#endif\r\n\t\tif (Monst->_mFlags & MFLAG_TARGETS_MONSTER) {\r\n\t\t\t_menemy = Monst->_menemy;\r\n\t\t\tif ((DWORD)_menemy >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\t\t\treturn;\r\n#else\r\n\t\t\t\tapp_fatal(\"Illegal enemy monster %d for monster \\\"%s\\\"\", _menemy, Monst->mName);\r\n#endif\r\n\t\t\t}\r\n\t\t\t// BUGFIX: enemy target may be dead at time of access, thus reading garbage data from `monster[Monst->_menemy]._mfutx`.\r\n\t\t\tMonst->_lastx = monster[Monst->_menemy]._mfutx;\r\n\t\t\tMonst->_menemyx = Monst->_lastx;\r\n\t\t\tMonst->_lasty = monster[Monst->_menemy]._mfuty;\r\n\t\t\tMonst->_menemyy = Monst->_lasty;\r\n\t\t} else {\r\n\t\t\t_menemy = Monst->_menemy;\r\n\t\t\tif ((DWORD)_menemy >= MAX_PLRS) {\r\n#ifdef HELLFIRE\r\n\t\t\t\treturn;\r\n#else\r\n\t\t\t\tapp_fatal(\"Illegal enemy player %d for monster \\\"%s\\\"\", _menemy, Monst->mName);\r\n#endif\r\n\t\t\t}\r\n\t\t\tMonst->_menemyx = plr[Monst->_menemy]._pfutx;\r\n\t\t\tMonst->_menemyy = plr[Monst->_menemy]._pfuty;\r\n\t\t\tif (dFlags[mx][my] & BFLAG_VISIBLE) {\r\n\t\t\t\tMonst->_msquelch = UCHAR_MAX;\r\n\t\t\t\tMonst->_lastx = plr[Monst->_menemy]._pfutx;\r\n\t\t\t\tMonst->_lasty = plr[Monst->_menemy]._pfuty;\r\n\t\t\t} else if (Monst->_msquelch != 0 && Monst->_mAi != MT_DIABLO) { /// BUGFIX: change '_mAi' to 'MType->mtype'\r\n\t\t\t\tMonst->_msquelch--;\r\n\t\t\t}\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tif (!(Monst->_mFlags & MFLAG_SEARCH)) {\r\n\t\t\t\tAiProc[Monst->_mAi](mi);\r\n\t\t\t} else if (!MAI_Path(mi)) {\r\n\t\t\t\tAiProc[Monst->_mAi](mi);\r\n\t\t\t}\r\n\t\t\tswitch (Monst->_mmode) {\r\n\t\t\tcase MM_STAND:\r\n\t\t\t\traflag = M_DoStand(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_WALK:\r\n\t\t\t\traflag = M_DoWalk(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_WALK2:\r\n\t\t\t\traflag = M_DoWalk2(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_WALK3:\r\n\t\t\t\traflag = M_DoWalk3(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_ATTACK:\r\n\t\t\t\traflag = M_DoAttack(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_GOTHIT:\r\n\t\t\t\traflag = M_DoGotHit(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_DEATH:\r\n\t\t\t\traflag = M_DoDeath(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_SATTACK:\r\n\t\t\t\traflag = M_DoSAttack(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_FADEIN:\r\n\t\t\t\traflag = M_DoFadein(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_FADEOUT:\r\n\t\t\t\traflag = M_DoFadeout(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_RATTACK:\r\n\t\t\t\traflag = M_DoRAttack(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_SPSTAND:\r\n\t\t\t\traflag = M_DoSpStand(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_RSPATTACK:\r\n\t\t\t\traflag = M_DoRSpAttack(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_DELAY:\r\n\t\t\t\traflag = M_DoDelay(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_CHARGE:\r\n\t\t\t\traflag = FALSE;\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_STONE:\r\n\t\t\t\traflag = M_DoStone(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_HEAL:\r\n\t\t\t\traflag = M_DoHeal(mi);\r\n\t\t\t\tbreak;\r\n\t\t\tcase MM_TALK:\r\n\t\t\t\traflag = M_DoTalk(mi);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (raflag) {\r\n\t\t\t\tGroupUnity(mi);\r\n\t\t\t}\r\n\t\t} while (raflag);\r\n\t\tif (Monst->_mmode != MM_STONE) {\r\n\t\t\tMonst->_mAnimCnt++;\r\n\t\t\tif (!(Monst->_mFlags & MFLAG_ALLOW_SPECIAL) && Monst->_mAnimCnt >= Monst->_mAnimDelay) {\r\n\t\t\t\tMonst->_mAnimCnt = 0;\r\n\t\t\t\tif (Monst->_mFlags & MFLAG_LOCK_ANIMATION) {\r\n\t\t\t\t\tMonst->_mAnimFrame--;\r\n\t\t\t\t\tif (Monst->_mAnimFrame == 0) {\r\n\t\t\t\t\t\tMonst->_mAnimFrame = Monst->_mAnimLen;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tMonst->_mAnimFrame++;\r\n\t\t\t\t\tif (Monst->_mAnimFrame > Monst->_mAnimLen) {\r\n\t\t\t\t\t\tMonst->_mAnimFrame = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tDeleteMonsterList();\r\n}\r\n\r\nvoid FreeMonsters()\r\n{\r\n\tint mtype;\r\n\tint i, j;\r\n\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tmtype = Monsters[i].mtype;\r\n\t\tfor (j = 0; j < 6; j++) {\r\n\t\t\tif (animletter[j] != 's' || monsterdata[mtype].has_special) {\r\n\t\t\t\tMemFreeDbg(Monsters[i].Anims[j].CMem);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tFreeMissiles2();\r\n}\r\n\r\nBOOL DirOK(int i, int mdir)\r\n{\r\n\tint fx, fy;\r\n\tint x, y;\r\n\tint mcount, mi;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"DirOK: Invalid monster %d\", i);\r\n#endif\r\n\tfx = monster[i]._mx + offset_x[mdir];\r\n\tfy = monster[i]._my + offset_y[mdir];\r\n\tif (fy < 0 || fy >= MAXDUNY || fx < 0 || fx >= MAXDUNX || !PosOkMonst(i, fx, fy))\r\n\t\treturn FALSE;\r\n\tif (mdir == DIR_E) {\r\n\t\tif (SolidLoc(fx, fy + 1) || dFlags[fx][fy + 1] & BFLAG_MONSTLR)\r\n\t\t\treturn FALSE;\r\n\t} else if (mdir == DIR_W) {\r\n\t\tif (SolidLoc(fx + 1, fy) || dFlags[fx + 1][fy] & BFLAG_MONSTLR)\r\n\t\t\treturn FALSE;\r\n\t} else if (mdir == DIR_N) {\r\n\t\tif (SolidLoc(fx + 1, fy) || SolidLoc(fx, fy + 1))\r\n\t\t\treturn FALSE;\r\n\t} else if (mdir == DIR_S)\r\n\t\tif (SolidLoc(fx - 1, fy) || SolidLoc(fx, fy - 1))\r\n\t\t\treturn FALSE;\r\n\tif (monster[i].leaderflag == 1) {\r\n\t\tif (abs(fx - monster[monster[i].leader]._mfutx) >= 4\r\n\t\t    || abs(fy - monster[monster[i].leader]._mfuty) >= 4) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (monster[i]._uniqtype == 0 || !(UniqMonst[monster[i]._uniqtype - 1].mUnqAttr & 2))\r\n\t\treturn TRUE;\r\n\tmcount = 0;\r\n\tfor (x = fx - 3; x <= fx + 3; x++) {\r\n\t\tfor (y = fy - 3; y <= fy + 3; y++) {\r\n\t\t\tif (y < 0 || y >= MAXDUNY || x < 0 || x >= MAXDUNX)\r\n\t\t\t\tcontinue;\r\n\t\t\tmi = dMonster[x][y];\r\n\t\t\tif (mi < 0)\r\n\t\t\t\tmi = -mi;\r\n\t\t\tif (mi != 0)\r\n\t\t\t\tmi--;\r\n\t\t\t// BUGFIX: should only run pack member check if mi was non-zero prior to executing the body of the above if-statement.\r\n\t\t\tif (monster[mi].leaderflag == 1\r\n\t\t\t    && monster[mi].leader == i\r\n\t\t\t    && monster[mi]._mfutx == x\r\n\t\t\t    && monster[mi]._mfuty == y) {\r\n\t\t\t\tmcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn mcount == monster[i].packsize;\r\n}\r\n\r\nBOOL PosOkMissile(int x, int y)\r\n{\r\n\treturn !nMissileTable[dPiece[x][y]] && !(dFlags[x][y] & BFLAG_MONSTLR);\r\n}\r\n\r\nBOOL CheckNoSolid(int x, int y)\r\n{\r\n\treturn nSolidTable[dPiece[x][y]] == FALSE;\r\n}\r\n\r\nBOOL LineClearF(BOOL (*Clear)(int, int), int x1, int y1, int x2, int y2)\r\n{\r\n\tint xorg, yorg;\r\n\tint dx, dy;\r\n\tint d;\r\n\tint xincD, yincD, dincD, dincH;\r\n\tint tmp;\r\n\tBOOL done = FALSE;\r\n\r\n\txorg = x1;\r\n\tyorg = y1;\r\n\tdx = x2 - x1;\r\n\tdy = y2 - y1;\r\n\tif (abs(dx) > abs(dy)) {\r\n\t\tif (dx < 0) {\r\n\t\t\ttmp = x1;\r\n\t\t\tx1 = x2;\r\n\t\t\tx2 = tmp;\r\n\t\t\ttmp = y1;\r\n\t\t\ty1 = y2;\r\n\t\t\ty2 = tmp;\r\n\t\t\tdx = -dx;\r\n\t\t\tdy = -dy;\r\n\t\t}\r\n\t\tif (dy > 0) {\r\n\t\t\td = 2 * dy - dx;\r\n\t\t\tdincD = 2 * dy;\r\n\t\t\tdincH = 2 * (dy - dx);\r\n\t\t\tyincD = 1;\r\n\t\t} else {\r\n\t\t\td = 2 * dy + dx;\r\n\t\t\tdincD = 2 * dy;\r\n\t\t\tdincH = 2 * (dx + dy);\r\n\t\t\tyincD = -1;\r\n\t\t}\r\n\t\twhile (!done && (x1 != x2 || y1 != y2)) {\r\n\t\t\tif ((d <= 0) ^ (yincD < 0)) {\r\n\t\t\t\td += dincD;\r\n\t\t\t} else {\r\n\t\t\t\td += dincH;\r\n\t\t\t\ty1 += yincD;\r\n\t\t\t}\r\n\t\t\tx1++;\r\n\t\t\tdone = ((x1 != xorg || y1 != yorg) && !Clear(x1, y1));\r\n\t\t}\r\n\t} else {\r\n\t\tif (dy < 0) {\r\n\t\t\ttmp = y1;\r\n\t\t\ty1 = y2;\r\n\t\t\ty2 = tmp;\r\n\t\t\ttmp = x1;\r\n\t\t\tx1 = x2;\r\n\t\t\tx2 = tmp;\r\n\t\t\tdy = -dy;\r\n\t\t\tdx = -dx;\r\n\t\t}\r\n\t\tif (dx > 0) {\r\n\t\t\td = 2 * dx - dy;\r\n\t\t\tdincD = 2 * dx;\r\n\t\t\tdincH = 2 * (dx - dy);\r\n\t\t\txincD = 1;\r\n\t\t} else {\r\n\t\t\td = 2 * dx + dy;\r\n\t\t\tdincD = 2 * dx;\r\n\t\t\tdincH = 2 * (dy + dx);\r\n\t\t\txincD = -1;\r\n\t\t}\r\n\t\twhile (!done && (y1 != y2 || x1 != x2)) {\r\n\t\t\tif ((d <= 0) ^ (xincD < 0)) {\r\n\t\t\t\td += dincD;\r\n\t\t\t} else {\r\n\t\t\t\td += dincH;\r\n\t\t\t\tx1 += xincD;\r\n\t\t\t}\r\n\t\t\ty1++;\r\n\t\t\tdone = ((y1 != yorg || x1 != xorg) && !Clear(x1, y1));\r\n\t\t}\r\n\t}\r\n\treturn x1 == x2 && y1 == y2;\r\n}\r\n\r\nBOOL LineClear(int x1, int y1, int x2, int y2)\r\n{\r\n\treturn LineClearF(PosOkMissile, x1, y1, x2, y2);\r\n}\r\n\r\nBOOL LineClearF1(BOOL (*Clear)(int, int, int), int monst, int x1, int y1, int x2, int y2)\r\n{\r\n\tint dx, dy;\r\n\tint d;\r\n\tint xorg, yorg;\r\n\tint xincD, yincD, dincD, dincH;\r\n\tint tmp;\r\n\tBOOL done = FALSE;\r\n\r\n\txorg = x1;\r\n\tyorg = y1;\r\n\tdx = x2 - x1;\r\n\tdy = y2 - y1;\r\n\tif (abs(dx) > abs(dy)) {\r\n\t\tif (dx < 0) {\r\n\t\t\ttmp = x1;\r\n\t\t\tx1 = x2;\r\n\t\t\tx2 = tmp;\r\n\t\t\ttmp = y1;\r\n\t\t\ty1 = y2;\r\n\t\t\ty2 = tmp;\r\n\t\t\tdx = -dx;\r\n\t\t\tdy = -dy;\r\n\t\t}\r\n\t\tif (dy > 0) {\r\n\t\t\td = 2 * dy - dx;\r\n\t\t\tdincD = 2 * dy;\r\n\t\t\tdincH = 2 * (dy - dx);\r\n\t\t\tyincD = 1;\r\n\t\t} else {\r\n\t\t\td = 2 * dy + dx;\r\n\t\t\tdincD = 2 * dy;\r\n\t\t\tdincH = 2 * (dx + dy);\r\n\t\t\tyincD = -1;\r\n\t\t}\r\n\t\twhile (!done && (x1 != x2 || y1 != y2)) {\r\n\t\t\tif ((d <= 0) ^ (yincD < 0)) {\r\n\t\t\t\td += dincD;\r\n\t\t\t} else {\r\n\t\t\t\td += dincH;\r\n\t\t\t\ty1 += yincD;\r\n\t\t\t}\r\n\t\t\tx1++;\r\n\t\t\tdone = ((x1 != xorg || y1 != yorg) && !Clear(monst, x1, y1));\r\n\t\t}\r\n\t} else {\r\n\t\tif (dy < 0) {\r\n\t\t\ttmp = y1;\r\n\t\t\ty1 = y2;\r\n\t\t\ty2 = tmp;\r\n\t\t\ttmp = x1;\r\n\t\t\tx1 = x2;\r\n\t\t\tx2 = tmp;\r\n\t\t\tdy = -dy;\r\n\t\t\tdx = -dx;\r\n\t\t}\r\n\t\tif (dx > 0) {\r\n\t\t\td = 2 * dx - dy;\r\n\t\t\tdincD = 2 * dx;\r\n\t\t\tdincH = 2 * (dx - dy);\r\n\t\t\txincD = 1;\r\n\t\t} else {\r\n\t\t\td = 2 * dx + dy;\r\n\t\t\tdincD = 2 * dx;\r\n\t\t\tdincH = 2 * (dy + dx);\r\n\t\t\txincD = -1;\r\n\t\t}\r\n\t\twhile (!done && (y1 != y2 || x1 != x2)) {\r\n\t\t\tif ((d <= 0) ^ (xincD < 0)) {\r\n\t\t\t\td += dincD;\r\n\t\t\t} else {\r\n\t\t\t\td += dincH;\r\n\t\t\t\tx1 += xincD;\r\n\t\t\t}\r\n\t\t\ty1++;\r\n\t\t\tdone = ((y1 != yorg || x1 != xorg) && !Clear(monst, x1, y1));\r\n\t\t}\r\n\t}\r\n\treturn x1 == x2 && y1 == y2;\r\n}\r\n\r\nvoid SyncMonsterAnim(int i)\r\n{\r\n\tint _mdir;\r\n\r\n#ifdef HELLFIRE\r\n\tif ((DWORD)i >= MAXMONSTERS || i < 0)\r\n\t\treturn;\r\n#else\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n\t\tapp_fatal(\"SyncMonsterAnim: Invalid monster %d\", i);\r\n#endif\r\n\tmonster[i].MType = &Monsters[monster[i]._mMTidx];\r\n\tmonster[i].MData = Monsters[monster[i]._mMTidx].MData;\r\n\tif (monster[i]._uniqtype != 0)\r\n\t\tmonster[i].mName = UniqMonst[monster[i]._uniqtype - 1].mName;\r\n\telse\r\n\t\tmonster[i].mName = monster[i].MData->mName;\r\n\t_mdir = monster[i]._mdir;\r\n\r\n\tswitch (monster[i]._mmode) {\r\n\tcase MM_STAND:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_STAND].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_WALK:\r\n\tcase MM_WALK2:\r\n\tcase MM_WALK3:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_WALK].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_ATTACK:\r\n\tcase MM_RATTACK:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_ATTACK].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_GOTHIT:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_GOTHIT].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_DEATH:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_DEATH].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_SATTACK:\r\n\tcase MM_FADEIN:\r\n\tcase MM_FADEOUT:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_SPECIAL].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_SPSTAND:\r\n\tcase MM_RSPATTACK:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_SPECIAL].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_HEAL:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_SPECIAL].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_DELAY:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_STAND].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_TALK:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_STAND].Data[_mdir];\r\n\t\tbreak;\r\n\tcase MM_CHARGE:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_ATTACK].Data[_mdir];\r\n\t\tmonster[i]._mAnimFrame = 1;\r\n\t\tmonster[i]._mAnimLen = monster[i].MType->Anims[MA_ATTACK].Frames;\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tmonster[i]._mAnimData = monster[i].MType->Anims[MA_STAND].Data[_mdir];\r\n\t\tmonster[i]._mAnimFrame = 1;\r\n\t\tmonster[i]._mAnimLen = monster[i].MType->Anims[MA_STAND].Frames;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid M_FallenFear(int x, int y)\r\n{\r\n\tint i, mi, rundist, aitype;\r\n\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\trundist = 0;\r\n\t\tmi = monstactive[i];\r\n\r\n\t\tswitch (monster[mi].MType->mtype) {\r\n\t\tcase MT_RFALLSP:\r\n\t\tcase MT_RFALLSD:\r\n\t\t\trundist = 7;\r\n\t\t\tbreak;\r\n\t\tcase MT_DFALLSP:\r\n\t\tcase MT_DFALLSD:\r\n\t\t\trundist = 5;\r\n\t\t\tbreak;\r\n\t\tcase MT_YFALLSP:\r\n\t\tcase MT_YFALLSD:\r\n\t\t\trundist = 3;\r\n\t\t\tbreak;\r\n\t\tcase MT_BFALLSP:\r\n\t\tcase MT_BFALLSD:\r\n\t\t\trundist = 2;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\taitype = monster[mi]._mAi;\r\n\t\tif (aitype == AI_FALLEN\r\n\t\t    && rundist\r\n\t\t    && abs(x - monster[mi]._mx) < 5\r\n\t\t    && abs(y - monster[mi]._my) < 5\r\n\t\t    && monster[mi]._mhitpoints >> 6 > 0) {\r\n\t\t\tmonster[mi]._mgoal = MGOAL_RETREAT;\r\n\t\t\tmonster[mi]._mgoalvar1 = rundist;\r\n\t\t\t// BUGFIX: should be `monster[mi]`, was `monster[i]`.\r\n\t\t\tmonster[mi]._mdir = GetDirection(x, y, monster[i]._mx, monster[i]._my);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid PrintMonstHistory(int mt)\r\n{\r\n\tint minHP, maxHP, res;\r\n\r\n\tsprintf(tempstr, \"Total kills : %i\", monstkills[mt]);\r\n\tAddPanelString(tempstr, TRUE);\r\n\tif (monstkills[mt] >= 30) {\r\n\t\tminHP = monsterdata[mt].mMinHP;\r\n\t\tmaxHP = monsterdata[mt].mMaxHP;\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tminHP = monsterdata[mt].mMinHP >> 1;\r\n\t\t\tmaxHP = monsterdata[mt].mMaxHP >> 1;\r\n\t\t}\r\n\t\tif (minHP < 1)\r\n\t\t\tminHP = 1;\r\n\t\tif (maxHP < 1)\r\n\t\t\tmaxHP = 1;\r\n#ifdef HELLFIRE\r\n\t\tif (gnDifficulty == DIFF_NIGHTMARE) {\r\n\t\t\tminHP = 3 * minHP + (gbMaxPlayers == 1 ? 50 : 100);\r\n\t\t\tmaxHP = 3 * maxHP + (gbMaxPlayers == 1 ? 50 : 100);\r\n\t\t} else if (gnDifficulty == DIFF_HELL) {\r\n\t\t\tminHP = 4 * minHP + (gbMaxPlayers == 1 ? 100 : 200);\r\n\t\t\tmaxHP = 4 * maxHP + (gbMaxPlayers == 1 ? 100 : 200);\r\n\t\t}\r\n#else\r\n\t\tif (gnDifficulty == DIFF_NIGHTMARE) {\r\n\t\t\tminHP = 3 * minHP + 1;\r\n\t\t\tmaxHP = 3 * maxHP + 1;\r\n\t\t}\r\n\t\tif (gnDifficulty == DIFF_HELL) {\r\n\t\t\tminHP = 4 * minHP + 3;\r\n\t\t\tmaxHP = 4 * maxHP + 3;\r\n\t\t}\r\n#endif\r\n\t\tsprintf(tempstr, \"Hit Points : %i-%i\", minHP, maxHP);\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t}\r\n\tif (monstkills[mt] >= 15) {\r\n\t\tif (gnDifficulty != DIFF_HELL)\r\n\t\t\tres = monsterdata[mt].mMagicRes;\r\n\t\telse\r\n\t\t\tres = monsterdata[mt].mMagicRes2;\r\n\t\tres = res & (RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING);\r\n\t\tif (!res) {\r\n\t\t\tstrcpy(tempstr, \"No magic resistance\");\r\n\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t} else {\r\n\t\t\tif (res & (RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING)) {\r\n\t\t\t\tstrcpy(tempstr, \"Resists : \");\r\n\t\t\t\tif (res & RESIST_MAGIC)\r\n\t\t\t\t\tstrcat(tempstr, \"Magic \");\r\n\t\t\t\tif (res & RESIST_FIRE)\r\n\t\t\t\t\tstrcat(tempstr, \"Fire \");\r\n\t\t\t\tif (res & RESIST_LIGHTNING)\r\n\t\t\t\t\tstrcat(tempstr, \"Lightning \");\r\n\t\t\t\ttempstr[strlen(tempstr) - 1] = '\\0';\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t}\r\n\t\t\tif (res & (IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING)) {\r\n\t\t\t\tstrcpy(tempstr, \"Immune : \");\r\n\t\t\t\tif (res & IMMUNE_MAGIC)\r\n\t\t\t\t\tstrcat(tempstr, \"Magic \");\r\n\t\t\t\tif (res & IMMUNE_FIRE)\r\n\t\t\t\t\tstrcat(tempstr, \"Fire \");\r\n\t\t\t\tif (res & IMMUNE_LIGHTNING)\r\n\t\t\t\t\tstrcat(tempstr, \"Lightning \");\r\n\t\t\t\ttempstr[strlen(tempstr) - 1] = '\\0';\r\n\t\t\t\tAddPanelString(tempstr, TRUE);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tpinfoflag = TRUE;\r\n}\r\n\r\nvoid PrintUniqueHistory()\r\n{\r\n\tint res;\r\n\r\n\tres = monster[pcursmonst].mMagicRes & (RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING | IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING);\r\n\tif (!res) {\r\n\t\tstrcpy(tempstr, \"No resistances\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tstrcpy(tempstr, \"No Immunities\");\r\n\t} else {\r\n\t\tif (res & (RESIST_MAGIC | RESIST_FIRE | RESIST_LIGHTNING))\r\n\t\t\tstrcpy(tempstr, \"Some Magic Resistances\");\r\n\t\telse\r\n\t\t\tstrcpy(tempstr, \"No resistances\");\r\n\t\tAddPanelString(tempstr, TRUE);\r\n\t\tif (res & (IMMUNE_MAGIC | IMMUNE_FIRE | IMMUNE_LIGHTNING)) {\r\n\t\t\tstrcpy(tempstr, \"Some Magic Immunities\");\r\n\t\t} else {\r\n\t\t\tstrcpy(tempstr, \"No Immunities\");\r\n\t\t}\r\n\t}\r\n\tAddPanelString(tempstr, TRUE);\r\n\tpinfoflag = TRUE;\r\n}\r\n\r\nvoid MissToMonst(int i, int x, int y)\r\n{\r\n\tint oldx, oldy;\r\n\tint newx, newy;\r\n\tint m, pnum;\r\n\tMissileStruct *Miss;\r\n\tMonsterStruct *Monst;\r\n\r\n\tif ((DWORD)i >= MAXMISSILES)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MissToMonst: Invalid missile %d\", i);\r\n#endif\r\n\r\n\tMiss = &missile[i];\r\n\tm = Miss->_misource;\r\n\r\n\tif ((DWORD)m >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"MissToMonst: Invalid monster %d\", m);\r\n#endif\r\n\r\n\tMonst = &monster[m];\r\n\toldx = Miss->_mix;\r\n\toldy = Miss->_miy;\r\n\tdMonster[x][y] = m + 1;\r\n\tMonst->_mdir = Miss->_mimfnum;\r\n\tMonst->_mx = x;\r\n\tMonst->_my = y;\r\n\tM_StartStand(m, Monst->_mdir);\r\n\tif (Monst->MType->mtype < MT_INCIN || Monst->MType->mtype > MT_HELLBURN) {\r\n\t\tif (!(Monst->_mFlags & MFLAG_TARGETS_MONSTER))\r\n\t\t\tM_StartHit(m, -1, 0);\r\n\t\telse\r\n\t\t\tM2MStartHit(m, -1, 0);\r\n\t} else {\r\n\t\tM_StartFadein(m, Monst->_mdir, FALSE);\r\n\t}\r\n\r\n\tif (!(Monst->_mFlags & MFLAG_TARGETS_MONSTER)) {\r\n\t\tpnum = dPlayer[oldx][oldy] - 1;\r\n\t\tif (dPlayer[oldx][oldy] > 0) {\r\n\t\t\tif (Monst->MType->mtype != MT_GLOOM && (Monst->MType->mtype < MT_INCIN || Monst->MType->mtype > MT_HELLBURN)) {\r\n\t\t\t\tM_TryH2HHit(m, dPlayer[oldx][oldy] - 1, 500, Monst->mMinDamage2, Monst->mMaxDamage2);\r\n\t\t\t\tif (pnum == dPlayer[oldx][oldy] - 1 && (Monst->MType->mtype < MT_NSNAKE || Monst->MType->mtype > MT_GSNAKE)) {\r\n\t\t\t\t\tif (plr[pnum]._pmode != PM_GOTHIT && plr[pnum]._pmode != PM_DEATH)\r\n\t\t\t\t\t\tStartPlrHit(pnum, 0, TRUE);\r\n\t\t\t\t\tnewx = oldx + offset_x[Monst->_mdir];\r\n\t\t\t\t\tnewy = oldy + offset_y[Monst->_mdir];\r\n\t\t\t\t\tif (PosOkPlayer(pnum, newx, newy)) {\r\n\t\t\t\t\t\tplr[pnum]._px = newx;\r\n\t\t\t\t\t\tplr[pnum]._py = newy;\r\n\t\t\t\t\t\tFixPlayerLocation(pnum, plr[pnum]._pdir);\r\n\t\t\t\t\t\tFixPlrWalkTags(pnum);\r\n\t\t\t\t\t\tdPlayer[newx][newy] = pnum + 1;\r\n\t\t\t\t\t\tSetPlayerOld(pnum);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tif (dMonster[oldx][oldy] > 0) {\r\n\t\t\tif (Monst->MType->mtype != MT_GLOOM && (Monst->MType->mtype < MT_INCIN || Monst->MType->mtype > MT_HELLBURN)) {\r\n\t\t\t\tM_TryM2MHit(m, dMonster[oldx][oldy] - 1, 500, Monst->mMinDamage2, Monst->mMaxDamage2);\r\n\t\t\t\tif (Monst->MType->mtype < MT_NSNAKE || Monst->MType->mtype > MT_GSNAKE) {\r\n\t\t\t\t\tnewx = oldx + offset_x[Monst->_mdir];\r\n\t\t\t\t\tnewy = oldy + offset_y[Monst->_mdir];\r\n\t\t\t\t\tif (PosOkMonst(dMonster[oldx][oldy] - 1, newx, newy)) {\r\n\t\t\t\t\t\tm = dMonster[oldx][oldy];\r\n\t\t\t\t\t\tdMonster[newx][newy] = m;\r\n\t\t\t\t\t\tdMonster[oldx][oldy] = 0;\r\n\t\t\t\t\t\tm--;\r\n\t\t\t\t\t\tmonster[m]._mx = newx;\r\n\t\t\t\t\t\tmonster[m]._mfutx = newx;\r\n\t\t\t\t\t\tmonster[m]._my = newy;\r\n\t\t\t\t\t\tmonster[m]._mfuty = newy;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL PosOkMonst(int i, int x, int y)\r\n{\r\n#ifdef HELLFIRE\r\n\tint oi;\r\n\tBOOL ret;\r\n\r\n\tret = !SolidLoc(x, y) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;\r\n\toi = dObject[x][y];\r\n\tif (ret && oi != 0) {\r\n\t\toi = oi > 0 ? oi - 1 : -(oi + 1);\r\n\t\tif (object[oi]._oSolidFlag)\r\n\t\t\tret = FALSE;\r\n\t}\r\n\r\n\tif (ret)\r\n\t\tret = monster_posok(i, x, y);\r\n#else\r\n\tint oi, mi, j;\r\n\tBOOL ret, fire;\r\n\r\n\tfire = FALSE;\r\n\tret = !SolidLoc(x, y) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;\r\n\tif (ret && dObject[x][y] != 0) {\r\n\t\toi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);\r\n\t\tif (object[oi]._oSolidFlag)\r\n\t\t\tret = FALSE;\r\n\t}\r\n\r\n\tif (ret && dMissile[x][y] != 0 && i >= 0) {\r\n\t\t// BUGFIX: case with multiple missiles being present on (x, y)-coordinate not handled.\r\n\t\tmi = dMissile[x][y];\r\n\t\tif (mi > 0) {\r\n\t\t\tif (missile[mi]._mitype == MIS_FIREWALL) { // BUGFIX: Change 'mi' to 'mi - 1'\r\n\t\t\t\tfire = TRUE;\r\n\t\t\t} else {\r\n\t\t\t\tfor (j = 0; j < nummissiles; j++) {\r\n\t\t\t\t\tif (missile[missileactive[j]]._mitype == MIS_FIREWALL) // BUGFIX: Check missile x/y\r\n\t\t\t\t\t\tfire = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (fire && (!(monster[i].mMagicRes & IMMUNE_FIRE) || monster[i].MType->mtype == MT_DIABLO))\r\n\t\t\tret = FALSE;\r\n\t}\r\n#endif\r\n\r\n\treturn ret;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nBOOLEAN monster_posok(int i, int x, int y)\r\n{\r\n\tint mi, j;\r\n\tBOOLEAN ret, fire, lightning;\r\n\r\n\tret = TRUE;\r\n\tmi = dMissile[x][y];\r\n\tif (mi && i >= 0) {\r\n\t\tfire = FALSE;\r\n\t\tlightning = FALSE;\r\n\t\tif (mi > 0) {\r\n\t\t\tif (missile[mi]._mitype == MIS_FIREWALL) { // BUGFIX: Change 'mi' to 'mi - 1'\r\n\t\t\t\tfire = TRUE;\r\n\t\t\t} else if (missile[mi]._mitype == MIS_LIGHTWALL) { // BUGFIX: Change 'mi' to 'mi - 1'\r\n\t\t\t\tlightning = TRUE;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (j = 0; j < nummissiles; j++) {\r\n\t\t\t\tmi = missileactive[j];\r\n\t\t\t\tif (missile[mi]._mix == x && missile[mi]._miy == y) {\r\n\t\t\t\t\tif (missile[mi]._mitype == MIS_FIREWALL) {\r\n\t\t\t\t\t\tfire = TRUE;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (missile[mi]._mitype == MIS_LIGHTWALL) {\r\n\t\t\t\t\t\tlightning = TRUE;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif ((fire && !(monster[i].mMagicRes & IMMUNE_FIRE)) || (fire && monster[i].MType->mtype == MT_DIABLO))\r\n\t\t\tret = FALSE;\r\n\t\tif ((lightning && !(monster[i].mMagicRes & IMMUNE_LIGHTNING)) || (lightning && monster[i].MType->mtype == MT_DIABLO))\r\n\t\t\tret = FALSE;\r\n\t}\r\n\treturn ret;\r\n}\r\n#endif\r\n\r\nBOOL PosOkMonst2(int i, int x, int y)\r\n{\r\n\tint oi, mi, j;\r\n#ifdef HELLFIRE\r\n\tBOOL ret;\r\n\r\n\toi = dObject[x][y];\r\n\tret = !SolidLoc(x, y);\r\n\tif (ret && oi != 0) {\r\n\t\toi = oi > 0 ? oi - 1 : -(oi + 1);\r\n\t\tif (object[oi]._oSolidFlag)\r\n\t\t\tret = FALSE;\r\n\t}\r\n\r\n\tif (ret)\r\n\t\tret = monster_posok(i, x, y);\r\n#else\r\n\tBOOL ret, fire;\r\n\r\n\tfire = FALSE;\r\n\tret = !SolidLoc(x, y);\r\n\tif (ret && dObject[x][y] != 0) {\r\n\t\toi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);\r\n\t\tif (object[oi]._oSolidFlag)\r\n\t\t\tret = FALSE;\r\n\t}\r\n\r\n\tif (ret && dMissile[x][y] != 0 && i >= 0) {\r\n\t\tmi = dMissile[x][y];\r\n\t\t// BUGFIX: case with multiple missiles being present on (x, y)-coordinate not handled.\r\n\t\tif (mi > 0) {\r\n\t\t\tif (missile[mi]._mitype == MIS_FIREWALL) { // BUGFIX: Change 'mi' to 'mi - 1'\r\n\t\t\t\tfire = TRUE;\r\n\t\t\t} else {\r\n\t\t\t\tfor (j = 0; j < nummissiles; j++) {\r\n\t\t\t\t\tif (missile[missileactive[j]]._mitype == MIS_FIREWALL) // BUGFIX: Check missile x/y\r\n\t\t\t\t\t\tfire = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (fire && (!(monster[i].mMagicRes & IMMUNE_FIRE) || monster[i].MType->mtype == MT_DIABLO))\r\n\t\t\tret = FALSE;\r\n\t}\r\n#endif\r\n\r\n\treturn ret;\r\n}\r\n\r\nBOOL PosOkMonst3(int i, int x, int y)\r\n{\r\n\tint j, oi, objtype, mi;\r\n#ifdef HELLFIRE\r\n\tBOOL ret;\r\n\tDIABOOL isdoor;\r\n\r\n\tret = TRUE;\r\n\tisdoor = FALSE;\r\n\r\n\toi = dObject[x][y];\r\n\tif (ret && oi != 0) {\r\n\t\toi = oi > 0 ? oi - 1 : -(oi + 1);\r\n\t\tobjtype = object[oi]._otype;\r\n\t\tisdoor = objtype == OBJ_L1LDOOR || objtype == OBJ_L1RDOOR\r\n\t\t    || objtype == OBJ_L2LDOOR || objtype == OBJ_L2RDOOR\r\n\t\t    || objtype == OBJ_L3LDOOR || objtype == OBJ_L3RDOOR;\r\n\t\tif (object[oi]._oSolidFlag && !isdoor) {\r\n\t\t\tret = FALSE;\r\n\t\t}\r\n\t}\r\n\tif (ret) {\r\n\t\tret = (!SolidLoc(x, y) || isdoor) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;\r\n\t}\r\n\tif (ret)\r\n\t\tret = monster_posok(i, x, y);\r\n#else\r\n\tBOOL ret, fire, isdoor;\r\n\r\n\tfire = FALSE;\r\n\tret = TRUE;\r\n\tisdoor = FALSE;\r\n\r\n\tif (ret && dObject[x][y] != 0) {\r\n\t\toi = dObject[x][y] > 0 ? dObject[x][y] - 1 : -(dObject[x][y] + 1);\r\n\t\tobjtype = object[oi]._otype;\r\n\t\tisdoor = objtype == OBJ_L1LDOOR || objtype == OBJ_L1RDOOR\r\n\t\t    || objtype == OBJ_L2LDOOR || objtype == OBJ_L2RDOOR\r\n\t\t    || objtype == OBJ_L3LDOOR || objtype == OBJ_L3RDOOR;\r\n\t\tif (object[oi]._oSolidFlag && !isdoor) {\r\n\t\t\tret = FALSE;\r\n\t\t}\r\n\t}\r\n\tif (ret) {\r\n\t\tret = (!SolidLoc(x, y) || isdoor) && dPlayer[x][y] == 0 && dMonster[x][y] == 0;\r\n\t}\r\n\tif (ret && dMissile[x][y] != 0 && i >= 0) {\r\n\t\tmi = dMissile[x][y];\r\n\t\t// BUGFIX: case with multiple missiles being present on (x, y)-coordinate not handled.\r\n\t\tif (mi > 0) {\r\n\t\t\tif (missile[mi]._mitype == MIS_FIREWALL) { // BUGFIX: Change 'mi' to 'mi - 1'\r\n\t\t\t\tfire = TRUE;\r\n\t\t\t} else {\r\n\t\t\t\tfor (j = 0; j < nummissiles; j++) {\r\n\t\t\t\t\tif (missile[missileactive[j]]._mitype == MIS_FIREWALL) // BUGFIX: Check missile x/y\r\n\t\t\t\t\t\tfire = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (fire && (!(monster[i].mMagicRes & IMMUNE_FIRE) || monster[i].MType->mtype == MT_DIABLO))\r\n\t\t\tret = FALSE;\r\n\t}\r\n#endif\r\n\r\n\treturn ret;\r\n}\r\n\r\nBOOL IsSkel(int mt)\r\n{\r\n\treturn mt >= MT_WSKELAX && mt <= MT_XSKELAX\r\n\t    || mt >= MT_WSKELBW && mt <= MT_XSKELBW\r\n\t    || mt >= MT_WSKELSD && mt <= MT_XSKELSD;\r\n}\r\n\r\nBOOL IsGoat(int mt)\r\n{\r\n\treturn mt >= MT_NGOATMC && mt <= MT_GGOATMC\r\n\t    || mt >= MT_NGOATBW && mt <= MT_GGOATBW;\r\n}\r\n\r\nint M_SpawnSkel(int x, int y, int dir)\r\n{\r\n\tint i, j, skeltypes, skel;\r\n\r\n\tj = 0;\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tif (IsSkel(Monsters[i].mtype))\r\n\t\t\tj++;\r\n\t}\r\n\r\n\tif (j) {\r\n\t\tskeltypes = random_(136, j);\r\n\t\tj = 0;\r\n\t\tfor (i = 0; i < nummtypes && j <= skeltypes; i++) {\r\n\t\t\tif (IsSkel(Monsters[i].mtype))\r\n\t\t\t\tj++;\r\n\t\t}\r\n\t\tskel = AddMonster(x, y, dir, i - 1, TRUE);\r\n\t\tif (skel != -1)\r\n\t\t\tM_StartSpStand(skel, dir);\r\n\r\n\t\treturn skel;\r\n\t}\r\n\r\n\treturn -1;\r\n}\r\n\r\nvoid ActivateSpawn(int i, int x, int y, int dir)\r\n{\r\n\tdMonster[x][y] = i + 1;\r\n\tmonster[i]._mx = x;\r\n\tmonster[i]._my = y;\r\n\tmonster[i]._mfutx = x;\r\n\tmonster[i]._mfuty = y;\r\n\tmonster[i]._moldx = x;\r\n\tmonster[i]._moldy = y;\r\n\tM_StartSpStand(i, dir);\r\n}\r\n\r\nBOOL SpawnSkeleton(int ii, int x, int y)\r\n{\r\n\tint dx, dy, xx, yy, dir, j, k, rs;\r\n\tBOOL savail;\r\n\tint monstok[3][3];\r\n\r\n\tif (ii == -1)\r\n\t\treturn FALSE;\r\n\r\n\tif (PosOkMonst(-1, x, y)) {\r\n\t\tdir = GetDirection(x, y, x, y);\r\n\t\tActivateSpawn(ii, x, y, dir);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tsavail = FALSE;\r\n\tyy = 0;\r\n\tfor (j = y - 1; j <= y + 1; j++) {\r\n\t\txx = 0;\r\n\t\tfor (k = x - 1; k <= x + 1; k++) {\r\n\t\t\tmonstok[xx][yy] = PosOkMonst(-1, k, j);\r\n\t\t\tsavail |= monstok[xx][yy];\r\n\t\t\txx++;\r\n\t\t}\r\n\t\tyy++;\r\n\t}\r\n\tif (!savail) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\trs = random_(137, 15) + 1;\r\n\txx = 0;\r\n\tyy = 0;\r\n\twhile (rs > 0) {\r\n\t\tif (monstok[xx][yy])\r\n\t\t\trs--;\r\n\t\tif (rs > 0) {\r\n\t\t\txx++;\r\n\t\t\tif (xx == 3) {\r\n\t\t\t\txx = 0;\r\n\t\t\t\tyy++;\r\n\t\t\t\tif (yy == 3)\r\n\t\t\t\t\tyy = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdx = x - 1 + xx;\r\n\tdy = y - 1 + yy;\r\n\tdir = GetDirection(dx, dy, x, y);\r\n\tActivateSpawn(ii, dx, dy, dir);\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nint PreSpawnSkeleton()\r\n{\r\n\tint i, j, skeltypes, skel;\r\n\r\n\tj = 0;\r\n\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tif (IsSkel(Monsters[i].mtype))\r\n\t\t\tj++;\r\n\t}\r\n\r\n\tif (j) {\r\n\t\tskeltypes = random_(136, j);\r\n\t\tj = 0;\r\n\t\tfor (i = 0; i < nummtypes && j <= skeltypes; i++) {\r\n\t\t\tif (IsSkel(Monsters[i].mtype))\r\n\t\t\t\tj++;\r\n\t\t}\r\n\t\tskel = AddMonster(0, 0, 0, i - 1, FALSE);\r\n\t\tif (skel != -1)\r\n\t\t\tM_StartStand(skel, 0);\r\n\r\n\t\treturn skel;\r\n\t}\r\n\r\n\treturn -1;\r\n}\r\n\r\nvoid TalktoMonster(int i)\r\n{\r\n\tMonsterStruct *Monst;\r\n\tint pnum, itm;\r\n\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"TalktoMonster: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tMonst = &monster[i];\r\n\tpnum = Monst->_menemy;\r\n\tMonst->_mmode = MM_TALK;\r\n\tif (Monst->_mAi == AI_SNOTSPIL || Monst->_mAi == AI_LACHDAN) {\r\n\t\tif (QuestStatus(Q_LTBANNER) && quests[Q_LTBANNER]._qvar1 == 2 && PlrHasItem(pnum, IDI_BANNER, itm)) {\r\n\t\t\tRemoveInvItem(pnum, itm);\r\n\t\t\tquests[Q_LTBANNER]._qactive = QUEST_DONE;\r\n\t\t\tMonst->mtalkmsg = TEXT_BANNER12;\r\n\t\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\t\t}\r\n\t\tif (QuestStatus(Q_VEIL) && Monst->mtalkmsg >= TEXT_VEIL9) {\r\n\t\t\tif (PlrHasItem(pnum, IDI_GLDNELIX, itm)) {\r\n\t\t\t\tRemoveInvItem(pnum, itm);\r\n\t\t\t\tMonst->mtalkmsg = TEXT_VEIL11;\r\n\t\t\t\tMonst->_mgoal = MGOAL_INQUIRING;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SpawnGolum(int i, int x, int y, int mi)\r\n{\r\n\tif ((DWORD)i >= MAXMONSTERS)\r\n#ifdef HELLFIRE\r\n\t\treturn;\r\n#else\r\n\t\tapp_fatal(\"SpawnGolum: Invalid monster %d\", i);\r\n#endif\r\n\r\n\tdMonster[x][y] = i + 1;\r\n\tmonster[i]._mx = x;\r\n\tmonster[i]._my = y;\r\n\tmonster[i]._mfutx = x;\r\n\tmonster[i]._mfuty = y;\r\n\tmonster[i]._moldx = x;\r\n\tmonster[i]._moldy = y;\r\n\tmonster[i]._pathcount = 0;\r\n\tmonster[i]._mmaxhp = 2 * (320 * missile[mi]._mispllvl + plr[i]._pMaxMana / 3);\r\n\tmonster[i]._mhitpoints = monster[i]._mmaxhp;\r\n\tmonster[i].mArmorClass = 25;\r\n\tmonster[i].mHit = 5 * (missile[mi]._mispllvl + 8) + 2 * plr[i]._pLevel;\r\n\tmonster[i].mMinDamage = 2 * (missile[mi]._mispllvl + 4);\r\n\tmonster[i].mMaxDamage = 2 * (missile[mi]._mispllvl + 8);\r\n\tmonster[i]._mFlags |= MFLAG_GOLEM;\r\n\tM_StartSpStand(i, 0);\r\n\tM_Enemy(i);\r\n\tif (i == myplr) {\r\n\t\tNetSendCmdGolem(\r\n\t\t    monster[i]._mx,\r\n\t\t    monster[i]._my,\r\n\t\t    monster[i]._mdir,\r\n\t\t    monster[i]._menemy,\r\n\t\t    monster[i]._mhitpoints,\r\n\t\t    currlevel);\r\n\t}\r\n}\r\n\r\nBOOL CanTalkToMonst(int m)\r\n{\r\n\tif ((DWORD)m >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"CanTalkToMonst: Invalid monster %d\", m);\r\n#endif\r\n\t}\r\n\r\n\tif (monster[m]._mgoal == MGOAL_INQUIRING) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn monster[m]._mgoal == MGOAL_TALKING;\r\n}\r\n\r\nBOOL CheckMonsterHit(int m, BOOL &ret)\r\n{\r\n\tif ((DWORD)m >= MAXMONSTERS) {\r\n#ifdef HELLFIRE\r\n\t\treturn FALSE;\r\n#else\r\n\t\tapp_fatal(\"CheckMonsterHit: Invalid monster %d\", m);\r\n#endif\r\n\t}\r\n\r\n\tif (monster[m]._mAi == AI_GARG && monster[m]._mFlags & MFLAG_ALLOW_SPECIAL) {\r\n\t\tmonster[m]._mFlags &= ~MFLAG_ALLOW_SPECIAL;\r\n\t\tmonster[m]._mmode = MM_SATTACK;\r\n\t\tret = TRUE;\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif (monster[m].MType->mtype >= MT_COUNSLR && monster[m].MType->mtype <= MT_ADVOCATE) {\r\n\t\tif (monster[m]._mgoal != MGOAL_NORMAL) {\r\n\t\t\tret = FALSE;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nint encode_enemy(int m)\r\n{\r\n\tif (monster[m]._mFlags & MFLAG_TARGETS_MONSTER)\r\n\t\treturn monster[m]._menemy + MAX_PLRS;\r\n\telse\r\n\t\treturn monster[m]._menemy;\r\n}\r\n\r\nvoid decode_enemy(int m, int enemy)\r\n{\r\n\tif (enemy < MAX_PLRS) {\r\n\t\tmonster[m]._mFlags &= ~MFLAG_TARGETS_MONSTER;\r\n\t\tmonster[m]._menemy = enemy;\r\n\t\tmonster[m]._menemyx = plr[enemy]._pfutx;\r\n\t\tmonster[m]._menemyy = plr[enemy]._pfuty;\r\n\t} else {\r\n\t\tmonster[m]._mFlags |= MFLAG_TARGETS_MONSTER;\r\n\t\tenemy -= MAX_PLRS;\r\n\t\tmonster[m]._menemy = enemy;\r\n\t\tmonster[m]._menemyx = monster[enemy]._mfutx;\r\n\t\tmonster[m]._menemyy = monster[enemy]._mfuty;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/monster.h",
    "content": "/**\r\n * @file monster.h\r\n *\r\n * Interface of monster functionality, AI, actions, spawning, loading, etc.\r\n */\r\n#ifndef __MONSTER_H__\r\n#define __MONSTER_H__\r\n\r\nextern int monstkills[MAXMONSTERS];\r\nextern int monstactive[MAXMONSTERS];\r\nextern int nummonsters;\r\nextern MonsterStruct monster[MAXMONSTERS];\r\nextern CMonster Monsters[MAX_LVLMTYPES];\r\nextern int nummtypes;\r\n\r\nvoid InitLevelMonsters();\r\nvoid GetLevelMTypes();\r\nvoid InitMonsterGFX(int monst);\r\nvoid InitMonster(int i, int rd, int mtype, int x, int y);\r\nvoid ClrAllMonsters();\r\n#ifdef HELLFIRE\r\nvoid monster_some_crypt();\r\n#endif\r\nvoid PlaceGroup(int mtype, int num, int leaderf, int leader);\r\nvoid InitMonsters();\r\nvoid SetMapMonsters(BYTE *pMap, int startx, int starty);\r\nvoid DeleteMonster(int i);\r\nint AddMonster(int x, int y, int dir, int mtype, BOOL InMap);\r\n#ifdef HELLFIRE\r\nvoid AddDoppelganger(int i);\r\n#endif\r\nBOOL M_Talker(int i);\r\nvoid M_StartStand(int i, int md);\r\nvoid M_ClearSquares(int i);\r\nvoid M_GetKnockback(int i);\r\nvoid M_StartHit(int i, int pnum, int dam);\r\nvoid M_StartKill(int i, int pnum);\r\nvoid M_SyncStartKill(int i, int x, int y, int pnum);\r\nBOOL M_DoStand(int i);\r\nBOOL M_DoWalk(int i);\r\nBOOL M_DoWalk2(int i);\r\nBOOL M_DoWalk3(int i);\r\nBOOL M_DoAttack(int i);\r\nvoid M_Teleport(int i);\r\nBOOL M_DoGotHit(int i);\r\nvoid M_UpdateLeader(int i);\r\nvoid DoEnding();\r\nvoid PrepDoEnding();\r\nvoid M_WalkDir(int i, int md);\r\nvoid MAI_Zombie(int i);\r\nvoid MAI_SkelSd(int i);\r\nvoid MAI_Snake(int i);\r\nvoid MAI_Bat(int i);\r\nvoid MAI_SkelBow(int i);\r\nvoid MAI_Fat(int i);\r\nvoid MAI_Sneak(int i);\r\nvoid MAI_Fireman(int i);\r\nvoid MAI_Fallen(int i);\r\nvoid MAI_Cleaver(int i);\r\nvoid MAI_Round(int i, BOOL special);\r\nvoid MAI_GoatMc(int i);\r\nvoid MAI_Ranged(int i, int missile_type, BOOL special);\r\nvoid MAI_GoatBow(int i);\r\nvoid MAI_Succ(int i);\r\n#ifdef HELLFIRE\r\nvoid MAI_Lich(int i);\r\nvoid MAI_ArchLich(int i);\r\nvoid MAI_Psychorb(int i);\r\nvoid MAI_Necromorb(int i);\r\n#endif\r\nvoid MAI_AcidUniq(int i);\r\n#ifdef HELLFIRE\r\nvoid MAI_Firebat(int i);\r\nvoid MAI_Torchant(int i);\r\n#endif\r\nvoid MAI_Scav(int i);\r\nvoid MAI_Garg(int i);\r\nvoid MAI_RoundRanged(int i, int missile_type, BOOL checkdoors, int dam, int lessmissiles);\r\nvoid MAI_Magma(int i);\r\nvoid MAI_Storm(int i);\r\n#ifdef HELLFIRE\r\nvoid MAI_BoneDemon(int i);\r\n#endif\r\nvoid MAI_Acid(int i);\r\nvoid MAI_Diablo(int i);\r\nvoid MAI_Mega(int i);\r\nvoid MAI_Golum(int i);\r\nvoid MAI_SkelKing(int i);\r\nvoid MAI_Rhino(int i);\r\n#ifdef HELLFIRE\r\nvoid MAI_HorkDemon(int i);\r\n#endif\r\nvoid MAI_Counselor(int i);\r\nvoid MAI_Garbud(int i);\r\nvoid MAI_Zhar(int i);\r\nvoid MAI_SnotSpil(int i);\r\nvoid MAI_Lazurus(int i);\r\nvoid MAI_Lazhelp(int i);\r\nvoid MAI_Lachdanan(int i);\r\nvoid MAI_Warlord(int i);\r\nvoid DeleteMonsterList();\r\nvoid ProcessMonsters();\r\nvoid FreeMonsters();\r\nBOOL DirOK(int i, int mdir);\r\nBOOL PosOkMissile(int x, int y);\r\nBOOL CheckNoSolid(int x, int y);\r\nBOOL LineClearF(BOOL (*Clear)(int, int), int x1, int y1, int x2, int y2);\r\nBOOL LineClear(int x1, int y1, int x2, int y2);\r\nBOOL LineClearF1(BOOL (*Clear)(int, int, int), int monst, int x1, int y1, int x2, int y2);\r\nvoid SyncMonsterAnim(int i);\r\nvoid M_FallenFear(int x, int y);\r\nvoid PrintMonstHistory(int mt);\r\nvoid PrintUniqueHistory();\r\nvoid MissToMonst(int i, int x, int y);\r\nBOOL PosOkMonst(int i, int x, int y);\r\n#ifdef HELLFIRE\r\nBOOLEAN monster_posok(int i, int x, int y);\r\n#endif\r\nBOOL PosOkMonst2(int i, int x, int y);\r\nBOOL PosOkMonst3(int i, int x, int y);\r\nBOOL IsSkel(int mt);\r\nBOOL IsGoat(int mt);\r\nint M_SpawnSkel(int x, int y, int dir);\r\nBOOL SpawnSkeleton(int ii, int x, int y);\r\nint PreSpawnSkeleton();\r\nvoid TalktoMonster(int i);\r\nvoid SpawnGolum(int i, int x, int y, int mi);\r\nBOOL CanTalkToMonst(int m);\r\nBOOL CheckMonsterHit(int m, BOOL &ret);\r\nint encode_enemy(int m);\r\nvoid decode_enemy(int m, int enemy);\r\n\r\n/* data */\r\n\r\nextern int opposite[8];\r\nextern int offset_x[8];\r\nextern int offset_y[8];\r\n\r\n#endif /* __MONSTER_H__ */\r\n"
  },
  {
    "path": "Source/movie.cpp",
    "content": "/**\r\n * @file movie.cpp\r\n *\r\n * Implementation of video playback.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n/** Should the movie continue playing. */\r\nBYTE movie_playing;\r\n/** Should the movie play in a loop. */\r\nBOOL loop_movie;\r\n\r\n/**\r\n * @brief Start playback of a given video.\r\n * @param pszMovie The file name of the video\r\n * @param user_can_close Set to false to make the video unskippable.\r\n */\r\nvoid play_movie(const char *pszMovie, BOOL user_can_close)\r\n{\r\n\tWNDPROC saveProc;\r\n\tHANDLE video_stream;\r\n\r\n\tif (!gbActive) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tsaveProc = SetWindowProc(MovieWndProc);\r\n\tInvalidateRect(ghMainWnd, NULL, 0);\r\n\tUpdateWindow(ghMainWnd);\r\n\tmovie_playing = TRUE;\r\n\tsound_disable_music(TRUE);\r\n\tstream_stop();\r\n\teffects_play_sound(\"Sfx\\\\Misc\\\\blank.wav\");\r\n\r\n\tSVidPlayBegin(pszMovie, 0, 0, 0, 0, loop_movie ? 0x100C0808 : 0x10280808, &video_stream);\r\n\tif (video_stream) {\r\n\t\tMSG Msg;\r\n\t\twhile (video_stream) {\r\n\t\t\tif (!gbActive || user_can_close && !movie_playing)\r\n\t\t\t\tbreak;\r\n\t\t\twhile (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) {\r\n\t\t\t\tif (Msg.message != WM_QUIT) {\r\n\t\t\t\t\tTranslateMessage(&Msg);\r\n\t\t\t\t\tDispatchMessage(&Msg);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!SVidPlayContinue())\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (video_stream)\r\n\t\t\tSVidPlayEnd(video_stream);\r\n\t}\r\n\tSetWindowProc(saveProc);\r\n\tsound_disable_music(FALSE);\r\n}\r\n\r\n/**\r\n * @brief Input handler for use during video playback.\r\n * @see WNDPROC\r\n */\r\nLRESULT __stdcall MovieWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)\r\n{\r\n\tswitch (Msg) {\r\n\tcase WM_KEYDOWN:\r\n\tcase WM_CHAR:\r\n\tcase WM_LBUTTONDOWN:\r\n\tcase WM_RBUTTONDOWN:\r\n\t\tmovie_playing = FALSE;\r\n\t\tbreak;\r\n\tcase WM_SYSCOMMAND:\r\n\t\tif (wParam == SC_CLOSE) {\r\n\t\t\tmovie_playing = FALSE;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\r\n\treturn MainWndProc(hWnd, Msg, wParam, lParam);\r\n}\r\n"
  },
  {
    "path": "Source/movie.h",
    "content": "/**\r\n * @file movie.h\r\n *\r\n * Interface of video playback.\r\n */\r\n#ifndef __MOVIE_H__\r\n#define __MOVIE_H__\r\n\r\nextern BOOL loop_movie;\r\n\r\nvoid play_movie(const char *pszMovie, BOOL user_can_close);\r\nLRESULT __stdcall MovieWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);\r\n\r\n#endif /* __MOVIE_H__ */\r\n"
  },
  {
    "path": "Source/mpqapi.cpp",
    "content": "/**\r\n * @file mpqapi.cpp\r\n *\r\n * Implementation of functions for creating and editing MPQ files.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nDWORD sgdwMpqOffset;\r\nBYTE mpq_buf[4096];\r\n_HASHENTRY *sgpHashTbl;\r\n/** Has the savegame-file been modified in memory. */\r\nBOOL save_archive_modified;\r\n_BLOCKENTRY *sgpBlockTbl;\r\n/** Is the savegame-file currently open. */\r\nBOOLEAN save_archive_open;\r\n\r\n#define INDEX_ENTRIES 2048\r\n#define BLOCK_TABLE_SIZE (INDEX_ENTRIES * sizeof(_BLOCKENTRY))\r\n#define HASH_TABLE_SIZE (INDEX_ENTRIES * sizeof(_HASHENTRY))\r\n\r\n//note: 32872 = 32768 + 104 (sizeof(_FILEHEADER))\r\n\r\n/* data */\r\n\r\nHANDLE sghArchive = INVALID_HANDLE_VALUE;\r\n\r\nstatic void mpqapi_xor_buf(char *pbData)\r\n{\r\n\tDWORD mask;\r\n\tchar *pbCurrentData;\r\n\tint i;\r\n\r\n\tmask = 0xF0761AB;\r\n\tpbCurrentData = pbData;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\t*pbCurrentData ^= mask;\r\n\t\tpbCurrentData++;\r\n\t\tmask = _rotl(mask, 1);\r\n\t}\r\n}\r\n\r\nstatic BOOL mpqapi_reg_load_modification_time(char *dst, int size)\r\n{\r\n\tchar *pszDst;\r\n\tchar *pbData;\r\n\tDWORD nbytes_read;\r\n\r\n\tpszDst = dst;\r\n\tmemset(dst, 0, size);\r\n#ifdef SPAWN\r\n\tif (!SRegLoadData(APP_NAME, \"Audio Playback \", 0, (BYTE *)pszDst, size, &nbytes_read)) {\r\n#else\r\n\tif (!SRegLoadData(APP_NAME, \"Video Player \", 0, (BYTE *)pszDst, size, &nbytes_read)) {\r\n#endif\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (nbytes_read != size)\r\n\t\treturn FALSE;\r\n\r\n\tfor (; size >= 8u; size -= 8) {\r\n\t\tpbData = pszDst;\r\n\t\tpszDst += 8;\r\n\t\tmpqapi_xor_buf(pbData);\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic BOOLEAN mpqapi_reg_store_modification_time(char *pbData, DWORD dwLen)\r\n{\r\n\tchar *pbCurrentData, *pbDataToXor;\r\n\tDWORD i;\r\n\r\n\tpbCurrentData = pbData;\r\n\tif (dwLen >= 8) {\r\n\t\ti = dwLen >> 3;\r\n\t\tdo {\r\n\t\t\tpbDataToXor = pbCurrentData;\r\n\t\t\tpbCurrentData += 8;\r\n\t\t\tmpqapi_xor_buf(pbDataToXor);\r\n\t\t\ti--;\r\n\t\t} while (i);\r\n\t}\r\n\r\n#ifdef SPAWN\r\n\treturn SRegSaveData(APP_NAME, \"Audio Playback \", 0, (BYTE *)pbData, dwLen);\r\n#else\r\n\treturn SRegSaveData(APP_NAME, \"Video Player \", 0, (BYTE *)pbData, dwLen);\r\n#endif\r\n}\r\n\r\nBOOL mpqapi_set_hidden(const char *pszArchive, BOOL hidden)\r\n{\r\n\tDWORD dwFileAttributes;\r\n\tDWORD dwFileAttributesToSet;\r\n\r\n\tdwFileAttributes = GetFileAttributes(pszArchive);\r\n\tif (dwFileAttributes == INVALID_FILE_ATTRIBUTES)\r\n\t\treturn GetLastError() == ERROR_FILE_NOT_FOUND;\r\n\tdwFileAttributesToSet = hidden ? FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN : 0;\r\n\tif (dwFileAttributes == dwFileAttributesToSet)\r\n\t\treturn TRUE;\r\n\telse\r\n\t\treturn SetFileAttributes(pszArchive, dwFileAttributesToSet);\r\n}\r\n\r\nvoid mpqapi_store_default_time(DWORD dwChar)\r\n{\r\n\t/*\r\n\tDWORD idx;\r\n\tchar dst[160];\r\n\r\n\tif(gbMaxPlayers == 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t/// ASSERT: assert(dwChar < MAX_CHARACTERS);\r\n\tidx = 16 * dwChar;\r\n\tmpqapi_reg_load_modification_time(dst, sizeof(dst));\r\n\t*(DWORD *)&dst[idx + 4] = 0x78341348; // dwHighDateTime\r\n\tmpqapi_reg_store_modification_time(dst, sizeof(dst));\r\n*/\r\n}\r\n\r\nstatic void mpqapi_store_modified_time(const char *pszArchive, DWORD dwChar)\r\n{\r\n\tHANDLE handle;\r\n\tstruct _WIN32_FIND_DATAA FindFileData;\r\n\tchar dst[160];\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tmpqapi_reg_load_modification_time(dst, 160);\r\n\t\thandle = FindFirstFile(pszArchive, &FindFileData);\r\n\t\tif (handle != INVALID_HANDLE_VALUE) {\r\n\t\t\tFindClose(handle);\r\n\t\t\t*((FILETIME *)(dst) + dwChar * 2 + 1) = FindFileData.ftLastWriteTime;\r\n\t\t\tmpqapi_reg_store_modification_time(dst, 160);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid mpqapi_store_creation_time(const char *pszArchive, DWORD dwChar)\r\n{\r\n\tHANDLE handle;\r\n\tstruct _WIN32_FIND_DATAA FindFileData;\r\n\tchar dst[160];\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tmpqapi_reg_load_modification_time(dst, 160);\r\n\t\thandle = FindFirstFile(pszArchive, &FindFileData);\r\n\t\tif (handle != INVALID_HANDLE_VALUE) {\r\n\t\t\tFindClose(handle);\r\n\t\t\t*((FILETIME *)(dst) + dwChar * 2) = FindFileData.ftCreationTime;\r\n\t\t\tmpqapi_reg_store_modification_time(dst, 160);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic _BLOCKENTRY *mpqapi_new_block(int *block_index)\r\n{\r\n\t_BLOCKENTRY *blockEntry = sgpBlockTbl;\r\n\r\n\tfor (DWORD i = 0; i < INDEX_ENTRIES; i++, blockEntry++) {\r\n\t\tif (blockEntry->offset != 0)\r\n\t\t\tcontinue;\r\n\t\tif (blockEntry->sizealloc != 0)\r\n\t\t\tcontinue;\r\n\t\tif (blockEntry->flags != 0)\r\n\t\t\tcontinue;\r\n\t\tif (blockEntry->sizefile != 0)\r\n\t\t\tcontinue;\r\n\r\n\t\tif (block_index)\r\n\t\t\t*block_index = i;\r\n\r\n\t\treturn blockEntry;\r\n\t}\r\n\r\n\tapp_fatal(\"Out of free block entries\");\r\n\treturn NULL;\r\n}\r\n\r\nstatic void mpqapi_alloc_block(int block_offset, int block_size)\r\n{\r\n\t_BLOCKENTRY *block;\r\n\tint i;\r\n\r\n\tblock = sgpBlockTbl;\r\n\ti = INDEX_ENTRIES;\r\n\twhile (i-- != 0) {\r\n\t\tif (block->offset && !block->flags && !block->sizefile) {\r\n\t\t\tif (block->offset + block->sizealloc == block_offset) {\r\n\t\t\t\tblock_offset = block->offset;\r\n\t\t\t\tblock_size += block->sizealloc;\r\n\t\t\t\tmemset(block, 0, sizeof(_BLOCKENTRY));\r\n\t\t\t\tmpqapi_alloc_block(block_offset, block_size);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (block_offset + block_size == block->offset) {\r\n\t\t\t\tblock_size += block->sizealloc;\r\n\t\t\t\tmemset(block, 0, sizeof(_BLOCKENTRY));\r\n\t\t\t\tmpqapi_alloc_block(block_offset, block_size);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tblock++;\r\n\t}\r\n\tif (block_offset + block_size > sgdwMpqOffset) {\r\n\t\tapp_fatal(\"MPQ free list error\");\r\n\t}\r\n\tif (block_offset + block_size == sgdwMpqOffset) {\r\n\t\tsgdwMpqOffset = block_offset;\r\n\t} else {\r\n\t\tblock = mpqapi_new_block(NULL);\r\n\t\tblock->offset = block_offset;\r\n\t\tblock->sizealloc = block_size;\r\n\t\tblock->sizefile = 0;\r\n\t\tblock->flags = 0;\r\n\t}\r\n}\r\n\r\nstatic int mpqapi_find_free_block(int size, int *block_size)\r\n{\r\n\tint result;\r\n\r\n\t_BLOCKENTRY *pBlockTbl = sgpBlockTbl;\r\n\tfor (int i = INDEX_ENTRIES; i--; pBlockTbl++) {\r\n\t\tif (pBlockTbl->offset == 0)\r\n\t\t\tcontinue;\r\n\t\tif (pBlockTbl->flags != 0)\r\n\t\t\tcontinue;\r\n\t\tif (pBlockTbl->sizefile != 0)\r\n\t\t\tcontinue;\r\n\t\tif ((DWORD)pBlockTbl->sizealloc < size)\r\n\t\t\tcontinue;\r\n\r\n\t\tresult = pBlockTbl->offset;\r\n\t\t*block_size = size;\r\n\t\tpBlockTbl->offset += size;\r\n\t\tpBlockTbl->sizealloc -= size;\r\n\r\n\t\tif (pBlockTbl->sizealloc == 0)\r\n\t\t\tmemset(pBlockTbl, 0, sizeof(*pBlockTbl));\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t*block_size = size;\r\n\tresult = sgdwMpqOffset;\r\n\tsgdwMpqOffset += size;\r\n\treturn result;\r\n}\r\n\r\nstatic int mpqapi_get_hash_index(int index, int hash_a, int hash_b, int locale)\r\n{\r\n\tDWORD idx, i;\r\n\r\n\ti = INDEX_ENTRIES;\r\n\tfor (idx = index & 0x7FF; sgpHashTbl[idx].block != -1; idx = (idx + 1) & 0x7FF) {\r\n\t\tif (i-- == 0)\r\n\t\t\tbreak;\r\n\t\tif (sgpHashTbl[idx].hashcheck[0] != hash_a)\r\n\t\t\tcontinue;\r\n\t\tif (sgpHashTbl[idx].hashcheck[1] != hash_b)\r\n\t\t\tcontinue;\r\n\t\tif (sgpHashTbl[idx].lcid != locale)\r\n\t\t\tcontinue;\r\n\t\tif (sgpHashTbl[idx].block == -2)\r\n\t\t\tcontinue;\r\n\r\n\t\treturn idx;\r\n\t}\r\n\r\n\treturn -1;\r\n}\r\n\r\nstatic BOOL WriteMPQHeader()\r\n{\r\n\t_FILEHEADER fhdr;\r\n\tDWORD NumberOfBytesWritten;\r\n\r\n\tmemset(&fhdr, 0, sizeof(fhdr));\r\n\tfhdr.signature = '\\x1AQPM';\r\n\tfhdr.headersize = 32;\r\n\tfhdr.filesize = GetFileSize(sghArchive, 0);\r\n\tfhdr.version = 0;\r\n\tfhdr.sectorsizeid = 3;\r\n\tfhdr.hashoffset = 32872;\r\n\tfhdr.blockoffset = 104;\r\n\tfhdr.hashcount = INDEX_ENTRIES;\r\n\tfhdr.blockcount = INDEX_ENTRIES;\r\n\r\n\tif (SetFilePointer(sghArchive, 0, NULL, FILE_BEGIN) == -1)\r\n\t\treturn FALSE;\r\n\tif (!WriteFile(sghArchive, &fhdr, sizeof(fhdr), &NumberOfBytesWritten, 0))\r\n\t\treturn FALSE;\r\n\r\n\treturn NumberOfBytesWritten == 104;\r\n}\r\n\r\nstatic BOOL mpqapi_write_block_table()\r\n{\r\n\tBOOL success;\r\n\tDWORD NumberOfBytesWritten;\r\n\r\n\tif (SetFilePointer(sghArchive, 104, NULL, FILE_BEGIN) == -1)\r\n\t\treturn FALSE;\r\n\r\n\tEncrypt((DWORD *)sgpBlockTbl, BLOCK_TABLE_SIZE, Hash(\"(block table)\", 3));\r\n\tsuccess = WriteFile(sghArchive, sgpBlockTbl, BLOCK_TABLE_SIZE, &NumberOfBytesWritten, 0);\r\n\tDecrypt((DWORD *)sgpBlockTbl, BLOCK_TABLE_SIZE, Hash(\"(block table)\", 3));\r\n\treturn success && NumberOfBytesWritten == BLOCK_TABLE_SIZE;\r\n}\r\n\r\nstatic BOOL mpqapi_write_hash_table()\r\n{\r\n\tBOOL success;\r\n\tDWORD NumberOfBytesWritten;\r\n\r\n\tif (SetFilePointer(sghArchive, 32872, NULL, FILE_BEGIN) == -1)\r\n\t\treturn FALSE;\r\n\r\n\tEncrypt((DWORD *)sgpHashTbl, HASH_TABLE_SIZE, Hash(\"(hash table)\", 3));\r\n\tsuccess = WriteFile(sghArchive, sgpHashTbl, HASH_TABLE_SIZE, &NumberOfBytesWritten, 0);\r\n\tDecrypt((DWORD *)sgpHashTbl, HASH_TABLE_SIZE, Hash(\"(hash table)\", 3));\r\n\treturn success && NumberOfBytesWritten == HASH_TABLE_SIZE;\r\n}\r\n\r\nstatic BOOL mpqapi_can_seek()\r\n{\r\n\tif (SetFilePointer(sghArchive, sgdwMpqOffset, NULL, FILE_BEGIN) == -1)\r\n\t\treturn FALSE;\r\n\treturn SetEndOfFile(sghArchive);\r\n}\r\n\r\nstatic BOOL ParseMPQHeader(_FILEHEADER *pHdr, DWORD *pdwNextFileStart)\r\n{\r\n\tDWORD size;\r\n\tDWORD NumberOfBytesRead;\r\n\r\n\tsize = GetFileSize(sghArchive, 0);\r\n\t*pdwNextFileStart = size;\r\n\r\n\tif (size == -1\r\n\t    || size < sizeof(*pHdr)\r\n\t    || !ReadFile(sghArchive, pHdr, sizeof(*pHdr), &NumberOfBytesRead, NULL)\r\n\t    || NumberOfBytesRead != 104\r\n\t    || pHdr->signature != '\\x1AQPM'\r\n\t    || pHdr->headersize != 32\r\n\t    || pHdr->version > 0\r\n\t    || pHdr->sectorsizeid != 3\r\n\t    || pHdr->filesize != size\r\n\t    || pHdr->hashoffset != 32872\r\n\t    || pHdr->blockoffset != 104\r\n\t    || pHdr->hashcount != INDEX_ENTRIES\r\n\t    || pHdr->blockcount != INDEX_ENTRIES) {\r\n\r\n\t\tif (SetFilePointer(sghArchive, 0, NULL, FILE_BEGIN) == -1)\r\n\t\t\treturn FALSE;\r\n\t\tif (!SetEndOfFile(sghArchive))\r\n\t\t\treturn FALSE;\r\n\r\n\t\tmemset(pHdr, 0, sizeof(*pHdr));\r\n\t\tpHdr->signature = '\\x1AQPM';\r\n\t\tpHdr->headersize = 32;\r\n\t\tpHdr->sectorsizeid = 3;\r\n\t\tpHdr->version = 0;\r\n\t\t*pdwNextFileStart = 0x10068;\r\n\t\tsave_archive_modified = TRUE;\r\n\t\tsave_archive_open = TRUE;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic int FetchHandle(const char *pszName)\r\n{\r\n\treturn mpqapi_get_hash_index(Hash(pszName, 0), Hash(pszName, 1), Hash(pszName, 2), 0);\r\n}\r\n\r\nvoid mpqapi_remove_hash_entry(const char *pszName)\r\n{\r\n\t_HASHENTRY *pHashTbl;\r\n\t_BLOCKENTRY *blockEntry;\r\n\tint hIdx, block_offset, block_size;\r\n\r\n\thIdx = FetchHandle(pszName);\r\n\tif (hIdx != -1) {\r\n\t\tpHashTbl = &sgpHashTbl[hIdx];\r\n\t\tblockEntry = &sgpBlockTbl[pHashTbl->block];\r\n\t\tpHashTbl->block = -2;\r\n\t\tblock_offset = blockEntry->offset;\r\n\t\tblock_size = blockEntry->sizealloc;\r\n\t\tmemset(blockEntry, 0, sizeof(*blockEntry));\r\n\t\tmpqapi_alloc_block(block_offset, block_size);\r\n\t\tsave_archive_modified = TRUE;\r\n\t}\r\n}\r\n\r\nvoid mpqapi_remove_hash_entries(BOOL(__stdcall *fnGetName)(DWORD, char *))\r\n{\r\n\tDWORD dwIndex, i;\r\n\tchar pszFileName[MAX_PATH];\r\n\r\n\tdwIndex = 1;\r\n\tfor (i = fnGetName(0, pszFileName); i; i = fnGetName(dwIndex++, pszFileName)) {\r\n\t\tmpqapi_remove_hash_entry(pszFileName);\r\n\t}\r\n}\r\n\r\nstatic _BLOCKENTRY *mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, int block_index)\r\n{\r\n\tDWORD h1, h2, h3;\r\n\tint i, hIdx;\r\n\r\n\th1 = Hash(pszName, 0);\r\n\th2 = Hash(pszName, 1);\r\n\th3 = Hash(pszName, 2);\r\n\tif (mpqapi_get_hash_index(h1, h2, h3, 0) != -1)\r\n\t\tapp_fatal(\"Hash collision between \\\"%s\\\" and existing file\\n\", pszName);\r\n\thIdx = h1 & 0x7FF;\r\n\ti = INDEX_ENTRIES;\r\n\twhile (i--) {\r\n\t\tif (sgpHashTbl[hIdx].block == -1 || sgpHashTbl[hIdx].block == -2)\r\n\t\t\tbreak;\r\n\t\thIdx = (hIdx + 1) & 0x7FF;\r\n\t}\r\n\tif (i < 0)\r\n\t\tapp_fatal(\"Out of hash space\");\r\n\tif (!pBlk)\r\n\t\tpBlk = mpqapi_new_block(&block_index);\r\n\r\n\tsgpHashTbl[hIdx].hashcheck[0] = h2;\r\n\tsgpHashTbl[hIdx].hashcheck[1] = h3;\r\n\tsgpHashTbl[hIdx].lcid = 0;\r\n\tsgpHashTbl[hIdx].block = block_index;\r\n\r\n\treturn pBlk;\r\n}\r\n\r\nstatic BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, DWORD dwLen, _BLOCKENTRY *pBlk)\r\n{\r\n\tDWORD *sectoroffsettable;\r\n\tDWORD destsize, num_bytes, block_size, nNumberOfBytesToWrite;\r\n\tconst char *tmp;\r\n\tint i, j;\r\n\r\n\twhile ((tmp = strchr(pszName, ':'))) {\r\n\t\tpszName = tmp + 1;\r\n\t}\r\n\twhile ((tmp = strchr(pszName, '\\\\'))) {\r\n\t\tpszName = tmp + 1;\r\n\t}\r\n\tHash(pszName, 3);\r\n\tnum_bytes = (dwLen + 4095) >> 12;\r\n\tnNumberOfBytesToWrite = 4 * num_bytes + 4;\r\n\tpBlk->offset = mpqapi_find_free_block(dwLen + nNumberOfBytesToWrite, &pBlk->sizealloc);\r\n\tpBlk->sizefile = dwLen;\r\n\tpBlk->flags = 0x80000100;\r\n\tif (SetFilePointer(sghArchive, pBlk->offset, NULL, FILE_BEGIN) == (DWORD)-1)\r\n\t\treturn FALSE;\r\n\tj = 0;\r\n\tdestsize = 0;\r\n\tsectoroffsettable = NULL;\r\n\twhile (dwLen != 0) {\r\n\t\tDWORD len;\r\n\t\tfor (i = 0; i < 4096; i++)\r\n\t\t\tmpq_buf[i] -= 86;\r\n\t\tlen = dwLen;\r\n\t\tif (dwLen >= 4096)\r\n\t\t\tlen = 4096;\r\n\t\tmemcpy(mpq_buf, pbData, len);\r\n\t\tpbData += len;\r\n\t\tlen = PkwareCompress(mpq_buf, len);\r\n\t\tif (j == 0) {\r\n\t\t\tnNumberOfBytesToWrite = 4 * num_bytes + 4;\r\n\t\t\tsectoroffsettable = (DWORD *)DiabloAllocPtr(nNumberOfBytesToWrite);\r\n\t\t\tmemset(sectoroffsettable, 0, nNumberOfBytesToWrite);\r\n\t\t\tif (!WriteFile(sghArchive, sectoroffsettable, nNumberOfBytesToWrite, &nNumberOfBytesToWrite, 0)) {\r\n\t\t\t\tgoto on_error;\r\n\t\t\t}\r\n\t\t\tdestsize += nNumberOfBytesToWrite;\r\n\t\t}\r\n\t\tsectoroffsettable[j] = destsize;\r\n\t\tif (!WriteFile(sghArchive, mpq_buf, len, &len, NULL)) {\r\n\t\t\tgoto on_error;\r\n\t\t}\r\n\t\tj++;\r\n\t\tif (dwLen > 4096)\r\n\t\t\tdwLen -= 4096;\r\n\t\telse\r\n\t\t\tdwLen = 0;\r\n\t\tdestsize += len;\r\n\t}\r\n\r\n\tsectoroffsettable[j] = destsize;\r\n\tif (SetFilePointer(sghArchive, -destsize, NULL, FILE_CURRENT) == (DWORD)-1) {\r\n\t\tgoto on_error;\r\n\t}\r\n\r\n\tif (!WriteFile(sghArchive, sectoroffsettable, nNumberOfBytesToWrite, &nNumberOfBytesToWrite, 0)) {\r\n\t\tgoto on_error;\r\n\t}\r\n\r\n\tif (SetFilePointer(sghArchive, destsize - nNumberOfBytesToWrite, NULL, FILE_CURRENT) == (DWORD)-1) {\r\n\t\tgoto on_error;\r\n\t}\r\n\r\n\tmem_free_dbg(sectoroffsettable);\r\n\tif (destsize < pBlk->sizealloc) {\r\n\t\tblock_size = pBlk->sizealloc - destsize;\r\n\t\tif (block_size >= 1024) {\r\n\t\t\tpBlk->sizealloc = destsize;\r\n\t\t\tmpqapi_alloc_block(pBlk->sizealloc + pBlk->offset, block_size);\r\n\t\t}\r\n\t}\r\n\treturn TRUE;\r\non_error:\r\n\tif (sectoroffsettable)\r\n\t\tmem_free_dbg(sectoroffsettable);\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen)\r\n{\r\n\t_BLOCKENTRY *blockEntry;\r\n\r\n\tsave_archive_modified = TRUE;\r\n\tmpqapi_remove_hash_entry(pszName);\r\n\tblockEntry = mpqapi_add_file(pszName, 0, 0);\r\n\tif (!mpqapi_write_file_contents(pszName, pbData, dwLen, blockEntry)) {\r\n\t\tmpqapi_remove_hash_entry(pszName);\r\n\t\treturn FALSE;\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nvoid mpqapi_rename(char *pszOld, char *pszNew)\r\n{\r\n\tint index, block;\r\n\t_HASHENTRY *hashEntry;\r\n\t_BLOCKENTRY *blockEntry;\r\n\r\n\tindex = FetchHandle(pszOld);\r\n\tif (index != -1) {\r\n\t\thashEntry = &sgpHashTbl[index];\r\n\t\tblock = hashEntry->block;\r\n\t\tblockEntry = &sgpBlockTbl[block];\r\n\t\thashEntry->block = -2;\r\n\t\tmpqapi_add_file(pszNew, blockEntry, block);\r\n\t\tsave_archive_modified = TRUE;\r\n\t}\r\n}\r\n\r\nBOOL mpqapi_has_file(const char *pszName)\r\n{\r\n\treturn FetchHandle(pszName) != -1;\r\n}\r\n\r\nstatic void CloseMPQ(const char *pszArchive, BOOL bFree, DWORD dwChar)\r\n{\r\n\tif (bFree) {\r\n\t\tMemFreeDbg(sgpBlockTbl);\r\n\t\tMemFreeDbg(sgpHashTbl);\r\n\t}\r\n\tif (sghArchive != INVALID_HANDLE_VALUE) {\r\n\t\tCloseHandle(sghArchive);\r\n\t\tsghArchive = INVALID_HANDLE_VALUE;\r\n\t}\r\n\tif (save_archive_modified) {\r\n\t\tsave_archive_modified = FALSE;\r\n\t\tmpqapi_store_modified_time(pszArchive, dwChar);\r\n\t}\r\n\tif (save_archive_open) {\r\n\t\tsave_archive_open = FALSE;\r\n\t\tmpqapi_store_creation_time(pszArchive, dwChar);\r\n\t}\r\n}\r\n\r\nBOOL OpenMPQ(const char *pszArchive, BOOL hidden, DWORD dwChar)\r\n{\r\n\tDWORD dwFlagsAndAttributes;\r\n\tDWORD key;\r\n\tDWORD dwTemp;\r\n\t_FILEHEADER fhdr;\r\n\r\n\tInitHash();\r\n\tif (!mpqapi_set_hidden(pszArchive, hidden)) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tdwFlagsAndAttributes = gbMaxPlayers > 1 ? FILE_FLAG_WRITE_THROUGH : 0;\r\n\tsave_archive_open = FALSE;\r\n\tsghArchive = CreateFile(pszArchive, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL);\r\n\tif (sghArchive == INVALID_HANDLE_VALUE) {\r\n\t\tsghArchive = CreateFile(pszArchive, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, dwFlagsAndAttributes | (hidden ? FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN : 0), NULL);\r\n\t\tif (sghArchive == INVALID_HANDLE_VALUE)\r\n\t\t\treturn FALSE;\r\n\t\tsave_archive_open = TRUE;\r\n\t\tsave_archive_modified = TRUE;\r\n\t}\r\n\tif (sgpBlockTbl == NULL || sgpHashTbl == NULL) {\r\n\t\tmemset(&fhdr, 0, sizeof(fhdr));\r\n\t\tif (ParseMPQHeader(&fhdr, &sgdwMpqOffset) == FALSE) {\r\n\t\t\tgoto on_error;\r\n\t\t}\r\n\t\tsgpBlockTbl = (_BLOCKENTRY *)DiabloAllocPtr(BLOCK_TABLE_SIZE);\r\n\t\tmemset(sgpBlockTbl, 0, BLOCK_TABLE_SIZE);\r\n\t\tif (fhdr.blockcount) {\r\n\t\t\tif (SetFilePointer(sghArchive, 104, NULL, FILE_BEGIN) == -1)\r\n\t\t\t\tgoto on_error;\r\n\t\t\tif (!ReadFile(sghArchive, sgpBlockTbl, BLOCK_TABLE_SIZE, &dwTemp, NULL))\r\n\t\t\t\tgoto on_error;\r\n\t\t\tkey = Hash(\"(block table)\", 3);\r\n\t\t\tDecrypt((DWORD *)sgpBlockTbl, BLOCK_TABLE_SIZE, key);\r\n\t\t}\r\n\t\tsgpHashTbl = (_HASHENTRY *)DiabloAllocPtr(HASH_TABLE_SIZE);\r\n\t\tmemset(sgpHashTbl, 255, HASH_TABLE_SIZE);\r\n\t\tif (fhdr.hashcount) {\r\n\t\t\tif (SetFilePointer(sghArchive, 32872, NULL, FILE_BEGIN) == -1)\r\n\t\t\t\tgoto on_error;\r\n\t\t\tif (!ReadFile(sghArchive, sgpHashTbl, HASH_TABLE_SIZE, &dwTemp, NULL))\r\n\t\t\t\tgoto on_error;\r\n\t\t\tkey = Hash(\"(hash table)\", 3);\r\n\t\t\tDecrypt((DWORD *)sgpHashTbl, HASH_TABLE_SIZE, key);\r\n\t\t}\r\n\t\treturn TRUE;\r\n\t}\r\n\treturn TRUE;\r\non_error:\r\n\tCloseMPQ(pszArchive, TRUE, dwChar);\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL mpqapi_flush_and_close(const char *pszArchive, BOOL bFree, DWORD dwChar)\r\n{\r\n\tBOOL ret = FALSE;\r\n\tif (sghArchive == INVALID_HANDLE_VALUE)\r\n\t\tret = TRUE;\r\n\telse {\r\n\t\tret = FALSE;\r\n\t\tif (!save_archive_modified)\r\n\t\t\tret = TRUE;\r\n\t\telse if (mpqapi_can_seek() && WriteMPQHeader() && mpqapi_write_block_table()) {\r\n\t\t\tif (mpqapi_write_hash_table())\r\n\t\t\t\tret = TRUE;\r\n\t\t\telse\r\n\t\t\t\tret = FALSE;\r\n\t\t}\r\n\t}\r\n\tCloseMPQ(pszArchive, bFree, dwChar);\r\n\treturn ret;\r\n}\r\n"
  },
  {
    "path": "Source/mpqapi.h",
    "content": "/**\r\n * @file mpqapi.h\r\n *\r\n * Interface of functions for creating and editing MPQ files.\r\n */\r\n#ifndef __MPQAPI_H__\r\n#define __MPQAPI_H__\r\n\r\nvoid mpqapi_store_default_time(DWORD dwChar);\r\nvoid mpqapi_remove_hash_entry(const char *pszName);\r\nvoid mpqapi_remove_hash_entries(BOOL(__stdcall *fnGetName)(DWORD, char *));\r\nBOOL mpqapi_write_file(const char *pszName, const BYTE *pbData, DWORD dwLen);\r\nvoid mpqapi_rename(char *pszOld, char *pszNew);\r\nBOOL mpqapi_has_file(const char *pszName);\r\nBOOL OpenMPQ(const char *pszArchive, BOOL hidden, DWORD dwChar);\r\nBOOL mpqapi_flush_and_close(const char *pszArchive, BOOL bFree, DWORD dwChar);\r\n\r\n#endif /* __MPQAPI_H__ */\r\n"
  },
  {
    "path": "Source/msg.cpp",
    "content": "/**\r\n * @file msg.cpp\r\n *\r\n * Implementation of function for sending and reciving network messages.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n#include \"../DiabloUI/diabloui.h\"\r\n\r\nstatic DWORD sgdwOwnerWait;\r\nstatic DWORD sgdwRecvOffset;\r\nstatic int sgnCurrMegaPlayer;\r\nstatic DLevel sgLevels[NUMLEVELS];\r\nstatic BYTE sbLastCmd;\r\nstatic TMegaPkt *sgpCurrPkt;\r\nstatic BYTE sgRecvBuf[sizeof(DLevel) + 1];\r\nstatic BYTE sgbRecvCmd;\r\nstatic LocalLevel sgLocals[NUMLEVELS];\r\nstatic DJunk sgJunk;\r\nstatic TMegaPkt *sgpMegaPkt;\r\nstatic BOOLEAN sgbDeltaChanged;\r\nstatic BYTE sgbDeltaChunks;\r\nBOOL deltaload;\r\nBYTE gbBufferMsgs;\r\nint dwRecCount;\r\n\r\nstatic void msg_get_next_packet()\r\n{\r\n\tTMegaPkt *result;\r\n\r\n\tsgpCurrPkt = (TMegaPkt *)DiabloAllocPtr(sizeof(TMegaPkt));\r\n\tsgpCurrPkt->pNext = NULL;\r\n\tsgpCurrPkt->dwSpaceLeft = sizeof(result->data);\r\n\r\n\tresult = (TMegaPkt *)&sgpMegaPkt;\r\n\twhile (result->pNext)\r\n\t\tresult = result->pNext;\r\n\r\n\tresult->pNext = sgpCurrPkt;\r\n}\r\n\r\nstatic void msg_free_packets()\r\n{\r\n\twhile (sgpMegaPkt) {\r\n\t\tsgpCurrPkt = sgpMegaPkt->pNext;\r\n\t\tMemFreeDbg(sgpMegaPkt);\r\n\t\tsgpMegaPkt = sgpCurrPkt;\r\n\t}\r\n}\r\n\r\nstatic void msg_pre_packet()\r\n{\r\n\tint i;\r\n\r\n\ti = -1;\r\n\tfor (TMegaPkt *pkt = sgpMegaPkt; pkt != NULL; pkt = pkt->pNext) {\r\n\t\tBYTE *data = pkt->data;\r\n\t\tint spaceLeft = sizeof(pkt->data);\r\n\t\twhile (spaceLeft != pkt->dwSpaceLeft) {\r\n\t\t\tif (*data == FAKE_CMD_SETID) {\r\n\t\t\t\tTFakeCmdPlr *cmd = (TFakeCmdPlr *)data;\r\n\t\t\t\tdata += sizeof(*cmd);\r\n\t\t\t\tspaceLeft -= sizeof(*cmd);\r\n\t\t\t\ti = cmd->bPlr;\r\n\t\t\t} else if (*data == FAKE_CMD_DROPID) {\r\n\t\t\t\tTFakeDropPlr *cmd = (TFakeDropPlr *)data;\r\n\t\t\t\tdata += sizeof(*cmd);\r\n\t\t\t\tspaceLeft -= sizeof(*cmd);\r\n\t\t\t\tmulti_player_left(cmd->bPlr, cmd->dwReason);\r\n\t\t\t} else {\r\n\t\t\t\tint pktSize = ParseCmd(i, (TCmd *)data);\r\n\t\t\t\tdata += pktSize;\r\n\t\t\t\tspaceLeft -= pktSize;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void msg_send_packet(int pnum, const void *packet, DWORD dwSize)\r\n{\r\n\tTFakeCmdPlr cmd;\r\n\r\n\tif (pnum != sgnCurrMegaPlayer) {\r\n\t\tsgnCurrMegaPlayer = pnum;\r\n\t\tcmd.bCmd = FAKE_CMD_SETID;\r\n\t\tcmd.bPlr = pnum;\r\n\t\tmsg_send_packet(pnum, &cmd, sizeof(cmd));\r\n\t}\r\n\tif (sgpCurrPkt->dwSpaceLeft < dwSize)\r\n\t\tmsg_get_next_packet();\r\n\r\n\tmemcpy(sgpCurrPkt->data + sizeof(sgpCurrPkt->data) - sgpCurrPkt->dwSpaceLeft, packet, dwSize);\r\n\tsgpCurrPkt->dwSpaceLeft -= dwSize;\r\n}\r\n\r\nvoid msg_send_drop_pkt(int pnum, int reason)\r\n{\r\n\tTFakeDropPlr cmd;\r\n\r\n\tcmd.dwReason = reason;\r\n\tcmd.bCmd = FAKE_CMD_DROPID;\r\n\tcmd.bPlr = pnum;\r\n\tmsg_send_packet(pnum, &cmd, sizeof(cmd));\r\n}\r\n\r\nstatic int msg_wait_for_turns()\r\n{\r\n\tBOOL received;\r\n\tDWORD turns;\r\n\r\n\tif (sgbDeltaChunks == 0) {\r\n\t\tnthread_send_and_recv_turn(0, 0);\r\n\t\tif (!SNetGetOwnerTurnsWaiting(&turns) && DERROR() == STORM_ERROR_NOT_IN_GAME)\r\n\t\t\treturn 100;\r\n\t\tif (GetTickCount() - sgdwOwnerWait <= 2000 && turns < gdwTurnsInTransit)\r\n\t\t\treturn 0;\r\n\t\tsgbDeltaChunks++;\r\n\t}\r\n\tmulti_process_network_packets();\r\n\tnthread_send_and_recv_turn(0, 0);\r\n\tif (nthread_has_500ms_passed(FALSE))\r\n\t\tnthread_recv_turns(&received);\r\n\r\n\tif (gbGameDestroyed)\r\n\t\treturn 100;\r\n\tif (gbDeltaSender >= MAX_PLRS) {\r\n\t\tsgbDeltaChunks = 0;\r\n\t\tsgbRecvCmd = CMD_DLEVEL_END;\r\n\t\tgbDeltaSender = myplr;\r\n\t\tnthread_set_turn_upper_bit();\r\n\t}\r\n\tif (sgbDeltaChunks == MAX_CHUNKS - 1) {\r\n\t\tsgbDeltaChunks = MAX_CHUNKS;\r\n\t\treturn 99;\r\n\t}\r\n\treturn 100 * sgbDeltaChunks / MAX_CHUNKS;\r\n}\r\n\r\nBOOL msg_wait_resync()\r\n{\r\n\tBOOL success;\r\n\r\n\tmsg_get_next_packet();\r\n\tsgbDeltaChunks = 0;\r\n\tsgnCurrMegaPlayer = -1;\r\n\tsgbRecvCmd = CMD_DLEVEL_END;\r\n\tgbBufferMsgs = 1;\r\n\tsgdwOwnerWait = GetTickCount();\r\n\tsuccess = UiProgressDialog(ghMainWnd, \"Waiting for game data...\", 1, msg_wait_for_turns, 20);\r\n\tgbBufferMsgs = 0;\r\n\tif (!success) {\r\n\t\tmsg_free_packets();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (gbGameDestroyed) {\r\n\t\tDrawDlg(\"The game ended\");\r\n\t\tmsg_free_packets();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (sgbDeltaChunks != MAX_CHUNKS) {\r\n\t\tDrawDlg(\"Unable to get level data\");\r\n\t\tmsg_free_packets();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid run_delta_info()\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tgbBufferMsgs = 2;\r\n\tmsg_pre_packet();\r\n\tgbBufferMsgs = 0;\r\n\tmsg_free_packets();\r\n}\r\n\r\nstatic BYTE *DeltaExportItem(BYTE *dst, TCmdPItem *src)\r\n{\r\n\tfor (int i = 0; i < MAXITEMS; i++, src++) {\r\n\t\tif (src->bCmd == 0xFF)\r\n\t\t\t*dst++ = 0xFF;\r\n\t\telse {\r\n#ifdef HELLFIRE\r\n\t\t\t*reinterpret_cast<TCmdPItem *>(dst) = *src;\r\n#else\r\n\t\t\tmemcpy(dst, src, sizeof(TCmdPItem));\r\n#endif\r\n\t\t\tdst += sizeof(TCmdPItem);\r\n\t\t}\r\n\t}\r\n\r\n\treturn dst;\r\n}\r\n\r\nstatic BYTE *DeltaImportItem(BYTE *src, TCmdPItem *dst)\r\n{\r\n\tfor (int i = 0; i < MAXITEMS; i++, dst++) {\r\n\t\tif (*src == 0xFF) {\r\n\t\t\tmemset(dst, 0xFF, sizeof(TCmdPItem));\r\n\t\t\tsrc++;\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\t*dst = *reinterpret_cast<TCmdPItem *>(src);\r\n#else\r\n\t\t\tmemcpy(dst, src, sizeof(TCmdPItem));\r\n#endif\r\n\t\t\tsrc += sizeof(TCmdPItem);\r\n\t\t}\r\n\t}\r\n\r\n\treturn src;\r\n}\r\n\r\nstatic BYTE *DeltaExportObject(BYTE *dst, DObjectStr *src)\r\n{\r\n\tmemcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS);\r\n\treturn dst + sizeof(DObjectStr) * MAXOBJECTS;\r\n}\r\n\r\nstatic BYTE *DeltaImportObject(BYTE *src, DObjectStr *dst)\r\n{\r\n\tmemcpy(dst, src, sizeof(DObjectStr) * MAXOBJECTS);\r\n\treturn src + sizeof(DObjectStr) * MAXOBJECTS;\r\n}\r\n\r\nstatic BYTE *DeltaExportMonster(BYTE *dst, DMonsterStr *src)\r\n{\r\n\tfor (int i = 0; i < MAXMONSTERS; i++, src++) {\r\n\t\tif (src->_mx == 0xFF)\r\n\t\t\t*dst++ = 0xFF;\r\n\t\telse {\r\n#ifdef HELLFIRE\r\n\t\t\t*reinterpret_cast<DMonsterStr *>(dst) = *src;\r\n#else\r\n\t\t\tmemcpy(dst, src, sizeof(DMonsterStr));\r\n#endif\r\n\t\t\tdst += sizeof(DMonsterStr);\r\n\t\t}\r\n\t}\r\n\r\n\treturn dst;\r\n}\r\n\r\nstatic BYTE *DeltaImportMonster(BYTE *src, DMonsterStr *dst)\r\n{\r\n\tfor (int i = 0; i < MAXMONSTERS; i++, dst++) {\r\n\t\tif (*src == 0xFF) {\r\n\t\t\tmemset(dst, 0xFF, sizeof(DMonsterStr));\r\n\t\t\tsrc++;\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\t*dst = *reinterpret_cast<DMonsterStr *>(src);\r\n#else\r\n\t\t\tmemcpy(dst, src, sizeof(DMonsterStr));\r\n#endif\r\n\t\t\tsrc += sizeof(DMonsterStr);\r\n\t\t}\r\n\t}\r\n\r\n\treturn src;\r\n}\r\n\r\nstatic BYTE *DeltaExportJunk(BYTE *dst)\r\n{\r\n\tint i, q;\r\n\r\n\tfor (i = 0; i < MAXPORTAL; i++) {\r\n\t\tif (sgJunk.portal[i].x == 0xFF) {\r\n\t\t\t*dst++ = 0xFF;\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\t*reinterpret_cast<DPortal *>(dst) = sgJunk.portal[i];\r\n#else\r\n\t\t\tmemcpy(dst, &sgJunk.portal[i], sizeof(DPortal));\r\n#endif\r\n\t\t\tdst += sizeof(DPortal);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0, q = 0; i < MAXQUESTS; i++) {\r\n\t\tif (questlist[i]._qflags & QUEST_ANY) {\r\n\t\t\tsgJunk.quests[q].qlog = quests[i]._qlog;\r\n\t\t\tsgJunk.quests[q].qstate = quests[i]._qactive;\r\n\t\t\tsgJunk.quests[q].qvar1 = quests[i]._qvar1;\r\n#ifdef HELLFIRE\r\n\t\t\t*reinterpret_cast<MultiQuests *>(dst) = sgJunk.quests[q];\r\n#else\r\n\t\t\tmemcpy(dst, &sgJunk.quests[q], sizeof(MultiQuests));\r\n#endif\r\n\t\t\tdst += sizeof(MultiQuests);\r\n\t\t\tq++;\r\n\t\t}\r\n\t}\r\n\r\n\treturn dst;\r\n}\r\n\r\nstatic void DeltaImportJunk(BYTE *src)\r\n{\r\n\tint i, q;\r\n\r\n\tfor (i = 0; i < MAXPORTAL; i++) {\r\n\t\tif (*src == 0xFF) {\r\n\t\t\tmemset(&sgJunk.portal[i], 0xFF, sizeof(DPortal));\r\n\t\t\tsrc++;\r\n\t\t\tSetPortalStats(i, FALSE, 0, 0, 0, DTYPE_TOWN);\r\n\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\tsgJunk.portal[i] = *reinterpret_cast<DPortal *>(src);\r\n#else\r\n\t\t\tmemcpy(&sgJunk.portal[i], src, sizeof(DPortal));\r\n#endif\r\n\t\t\tsrc += sizeof(DPortal);\r\n\t\t\tSetPortalStats(\r\n\t\t\t    i,\r\n\t\t\t    TRUE,\r\n\t\t\t    sgJunk.portal[i].x,\r\n\t\t\t    sgJunk.portal[i].y,\r\n\t\t\t    sgJunk.portal[i].level,\r\n\t\t\t    sgJunk.portal[i].ltype);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0, q = 0; i < MAXQUESTS; i++) {\r\n\t\tif (questlist[i]._qflags & QUEST_ANY) {\r\n#ifdef HELLFIRE\r\n\t\t\tsgJunk.quests[q] = *reinterpret_cast<MultiQuests *>(src);\r\n#else\r\n\t\t\tmemcpy(&sgJunk.quests[q], src, sizeof(MultiQuests));\r\n#endif\r\n\t\t\tsrc += sizeof(MultiQuests);\r\n\t\t\tquests[i]._qlog = sgJunk.quests[q].qlog;\r\n\t\t\tquests[i]._qactive = sgJunk.quests[q].qstate;\r\n\t\t\tquests[i]._qvar1 = sgJunk.quests[q].qvar1;\r\n\t\t\tq++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic int msg_comp_level(BYTE *buffer, BYTE *end)\r\n{\r\n\tint size = end - buffer - 1;\r\n\tint pkSize = PkwareCompress(buffer + 1, size);\r\n\t*buffer = size != pkSize;\r\n\r\n\treturn pkSize + 1;\r\n}\r\n\r\n// DeltaSendAllLevels\r\nvoid DeltaExportData(int pnum)\r\n{\r\n\tif (sgbDeltaChanged) {\r\n\t\tint size;\r\n\t\tBYTE *dstEnd, *dst = (BYTE *)DiabloAllocPtr(sizeof(DLevel) + 1);\r\n\t\tfor (int i = 0; i < NUMLEVELS; i++) {\r\n\t\t\tdstEnd = dst + 1;\r\n\t\t\tdstEnd = DeltaExportItem(dstEnd, sgLevels[i].item);\r\n\t\t\tdstEnd = DeltaExportObject(dstEnd, sgLevels[i].object);\r\n\t\t\tdstEnd = DeltaExportMonster(dstEnd, sgLevels[i].monster);\r\n\t\t\tsize = msg_comp_level(dst, dstEnd);\r\n\t\t\tdthread_send_delta(pnum, i + CMD_DLEVEL_0, dst, size);\r\n\t\t}\r\n\t\tdstEnd = dst + 1;\r\n\t\tdstEnd = DeltaExportJunk(dstEnd);\r\n\t\tsize = msg_comp_level(dst, dstEnd);\r\n\t\tdthread_send_delta(pnum, CMD_DLEVEL_JUNK, dst, size);\r\n\t\tmem_free_dbg(dst);\r\n\t}\r\n\tchar src = 0;\r\n\tdthread_send_delta(pnum, CMD_DLEVEL_END, &src, 1);\r\n}\r\n\r\nstatic void DeltaImportData(BYTE cmd, DWORD recv_offset)\r\n{\r\n\tif (sgRecvBuf[0] != 0)\r\n\t\tPkwareDecompress(&sgRecvBuf[1], recv_offset, sizeof(sgRecvBuf) - 1);\r\n\r\n\tBYTE *src = &sgRecvBuf[1];\r\n\tif (cmd == CMD_DLEVEL_JUNK) {\r\n\t\tDeltaImportJunk(src);\r\n#ifdef HELLFIRE\r\n\t} else if (cmd >= CMD_DLEVEL_0 && cmd <= CMD_DLEVEL_24) {\r\n#else\r\n\t} else if (cmd >= CMD_DLEVEL_0 && cmd <= CMD_DLEVEL_16) {\r\n#endif\r\n\t\tBYTE i = cmd - CMD_DLEVEL_0;\r\n\t\tsrc = DeltaImportItem(src, sgLevels[i].item);\r\n\t\tsrc = DeltaImportObject(src, sgLevels[i].object);\r\n\t\tDeltaImportMonster(src, sgLevels[i].monster);\r\n\t} else {\r\n\t\tapp_fatal(\"msg:1\");\r\n\t}\r\n\r\n\tsgbDeltaChunks++;\r\n\tsgbDeltaChanged = TRUE;\r\n}\r\n\r\nstatic DWORD On_DLEVEL(int pnum, TCmd *pCmd)\r\n{\r\n\tTCmdPlrInfoHdr *p = (TCmdPlrInfoHdr *)pCmd;\r\n\r\n\tif (gbDeltaSender != pnum) {\r\n\t\tif (p->bCmd == CMD_DLEVEL_END) {\r\n\t\t\tgbDeltaSender = pnum;\r\n\t\t\tsgbRecvCmd = CMD_DLEVEL_END;\r\n\t\t} else if (p->bCmd == CMD_DLEVEL_0 && p->wOffset == 0) {\r\n\t\t\tgbDeltaSender = pnum;\r\n\t\t\tsgbRecvCmd = CMD_DLEVEL_END;\r\n\t\t} else {\r\n\t\t\treturn p->wBytes + sizeof(*p);\r\n\t\t}\r\n\t}\r\n\tif (sgbRecvCmd == CMD_DLEVEL_END) {\r\n\t\tif (p->bCmd == CMD_DLEVEL_END) {\r\n\t\t\tsgbDeltaChunks = MAX_CHUNKS - 1;\r\n\t\t\treturn p->wBytes + sizeof(*p);\r\n\t\t} else if (p->bCmd == CMD_DLEVEL_0 && p->wOffset == 0) {\r\n\t\t\tsgdwRecvOffset = 0;\r\n\t\t\tsgbRecvCmd = p->bCmd;\r\n\t\t} else {\r\n\t\t\treturn p->wBytes + sizeof(*p);\r\n\t\t}\r\n\t} else if (sgbRecvCmd != p->bCmd) {\r\n\t\tDeltaImportData(sgbRecvCmd, sgdwRecvOffset);\r\n\t\tif (p->bCmd == CMD_DLEVEL_END) {\r\n\t\t\tsgbDeltaChunks = MAX_CHUNKS - 1;\r\n\t\t\tsgbRecvCmd = CMD_DLEVEL_END;\r\n\t\t\treturn p->wBytes + sizeof(*p);\r\n\t\t} else {\r\n\t\t\tsgdwRecvOffset = 0;\r\n\t\t\tsgbRecvCmd = p->bCmd;\r\n\t\t}\r\n\t}\r\n\r\n\t/// ASSERT: assert(p->wOffset == sgdwRecvOffset);\r\n\tmemcpy(&sgRecvBuf[p->wOffset], &p[1], p->wBytes);\r\n\tsgdwRecvOffset += p->wBytes;\r\n\treturn p->wBytes + sizeof(*p);\r\n}\r\n\r\nvoid delta_init()\r\n{\r\n\tsgbDeltaChanged = FALSE;\r\n\tmemset(&sgJunk, 0xFF, sizeof(sgJunk));\r\n\tmemset(sgLevels, 0xFF, sizeof(sgLevels));\r\n\tmemset(sgLocals, 0, sizeof(sgLocals));\r\n\tdeltaload = FALSE;\r\n}\r\n\r\nvoid delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel)\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tsgbDeltaChanged = TRUE;\r\n\tDMonsterStr *pD = &sgLevels[bLevel].monster[mi];\r\n\tpD->_mx = x;\r\n\tpD->_my = y;\r\n\t// BUGFIX: should only sync monster direction if bLevel is same as currlevel.\r\n\tpD->_mdir = monster[mi]._mdir;\r\n\tpD->_mhitpoints = 0;\r\n}\r\n\r\nvoid delta_monster_hp(int mi, int hp, BYTE bLevel)\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tsgbDeltaChanged = TRUE;\r\n\tDMonsterStr *pD = &sgLevels[bLevel].monster[mi];\r\n\tif (pD->_mhitpoints > hp)\r\n\t\tpD->_mhitpoints = hp;\r\n}\r\n\r\nvoid delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel)\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\t/// ASSERT: assert(pSync != NULL);\r\n\t/// ASSERT: assert(bLevel < NUMLEVELS);\r\n\tsgbDeltaChanged = TRUE;\r\n\r\n\tDMonsterStr *pD = &sgLevels[bLevel].monster[pSync->_mndx];\r\n\tif (pD->_mhitpoints == 0)\r\n\t\treturn;\r\n\r\n\tpD->_mx = pSync->_mx;\r\n\tpD->_my = pSync->_my;\r\n\tpD->_mactive = UCHAR_MAX;\r\n\tpD->_menemy = pSync->_menemy;\r\n}\r\n\r\nvoid delta_sync_golem(TCmdGolem *pG, int pnum, BYTE bLevel)\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tsgbDeltaChanged = TRUE;\r\n\tDMonsterStr *pD = &sgLevels[bLevel].monster[pnum];\r\n\tpD->_mx = pG->_mx;\r\n\tpD->_my = pG->_my;\r\n\tpD->_mactive = UCHAR_MAX;\r\n\tpD->_menemy = pG->_menemy;\r\n\tpD->_mdir = pG->_mdir;\r\n\tpD->_mhitpoints = pG->_mhitpoints;\r\n}\r\n\r\nvoid delta_leave_sync(BYTE bLevel)\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\tif (currlevel == 0)\r\n\t\tglSeedTbl[0] = GetRndSeed();\r\n\tif (currlevel <= 0)\r\n\t\treturn;\r\n\r\n\tfor (int i = 0; i < nummonsters; i++) {\r\n\t\tint ma = monstactive[i];\r\n\t\tif (monster[ma]._mhitpoints == 0)\r\n\t\t\tcontinue;\r\n\t\tsgbDeltaChanged = TRUE;\r\n\t\tDMonsterStr *pD = &sgLevels[bLevel].monster[ma];\r\n\t\tpD->_mx = monster[ma]._mx;\r\n\t\tpD->_my = monster[ma]._my;\r\n\t\tpD->_mdir = monster[ma]._mdir;\r\n\t\tpD->_menemy = encode_enemy(ma);\r\n\t\tpD->_mhitpoints = monster[ma]._mhitpoints;\r\n\t\tpD->_mactive = monster[ma]._msquelch;\r\n\t}\r\n\tmemcpy(&sgLocals[bLevel].automapsv, automapview, sizeof(automapview));\r\n}\r\n\r\nstatic void delta_sync_object(int oi, BYTE bCmd, BYTE bLevel)\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tsgbDeltaChanged = TRUE;\r\n\tsgLevels[bLevel].object[oi].bCmd = bCmd;\r\n}\r\n\r\nstatic BOOL delta_get_item(TCmdGItem *pI, BYTE bLevel)\r\n{\r\n\tint i;\r\n\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn TRUE;\r\n\r\n\tTCmdPItem *pD = sgLevels[bLevel].item;\r\n\tfor (i = 0; i < MAXITEMS; i++, pD++) {\r\n\t\tif (pD->bCmd == 0xFF || pD->wIndx != pI->wIndx || pD->wCI != pI->wCI || pD->dwSeed != pI->dwSeed)\r\n\t\t\tcontinue;\r\n\r\n\t\tif (pD->bCmd == CMD_WALKXY) {\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (pD->bCmd == CMD_STAND) {\r\n\t\t\tsgbDeltaChanged = TRUE;\r\n\t\t\tpD->bCmd = CMD_WALKXY;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tif (pD->bCmd == CMD_ACK_PLRINFO) {\r\n\t\t\tsgbDeltaChanged = TRUE;\r\n\t\t\tpD->bCmd = 0xFF;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\r\n\t\tapp_fatal(\"delta:1\");\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif ((pI->wCI & CF_PREGEN) == 0)\r\n\t\treturn FALSE;\r\n\r\n\tpD = sgLevels[bLevel].item;\r\n\tfor (i = 0; i < MAXITEMS; i++, pD++) {\r\n\t\tif (pD->bCmd == 0xFF) {\r\n\t\t\tsgbDeltaChanged = TRUE;\r\n\t\t\tpD->bCmd = CMD_WALKXY;\r\n\t\t\tpD->x = pI->x;\r\n\t\t\tpD->y = pI->y;\r\n\t\t\tpD->wIndx = pI->wIndx;\r\n\t\t\tpD->wCI = pI->wCI;\r\n\t\t\tpD->dwSeed = pI->dwSeed;\r\n\t\t\tpD->bId = pI->bId;\r\n\t\t\tpD->bDur = pI->bDur;\r\n\t\t\tpD->bMDur = pI->bMDur;\r\n\t\t\tpD->bCh = pI->bCh;\r\n\t\t\tpD->bMCh = pI->bMCh;\r\n\t\t\tpD->wValue = pI->wValue;\r\n\t\t\tpD->dwBuff = pI->dwBuff;\r\n#ifdef HELLFIRE\r\n\t\t\tpD->wToHit = pI->wToHit;\r\n\t\t\tpD->wMaxDam = pI->wMaxDam;\r\n\t\t\tpD->bMinStr = pI->bMinStr;\r\n\t\t\tpD->bMinMag = pI->bMinMag;\r\n\t\t\tpD->bMinDex = pI->bMinDex;\r\n\t\t\tpD->bAC = pI->bAC;\r\n#endif\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void delta_put_item(TCmdPItem *pI, int x, int y, BYTE bLevel)\r\n{\r\n\tint i;\r\n\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tTCmdPItem *pD = sgLevels[bLevel].item;\r\n\tfor (i = 0; i < MAXITEMS; i++, pD++) {\r\n\t\tif (pD->bCmd != CMD_WALKXY\r\n\t\t    && pD->bCmd != 0xFF\r\n\t\t    && pD->wIndx == pI->wIndx\r\n\t\t    && pD->wCI == pI->wCI\r\n\t\t    && pD->dwSeed == pI->dwSeed) {\r\n\t\t\tif (pD->bCmd == CMD_ACK_PLRINFO)\r\n\t\t\t\treturn;\r\n\t\t\tapp_fatal(\"Trying to drop a floor item?\");\r\n\t\t}\r\n\t}\r\n\r\n\tpD = sgLevels[bLevel].item;\r\n\tfor (i = 0; i < MAXITEMS; i++, pD++) {\r\n\t\tif (pD->bCmd == 0xFF) {\r\n\t\t\tsgbDeltaChanged = TRUE;\r\n#ifdef HELLFIRE\r\n\t\t\t*pD = *pI;\r\n#else\r\n\t\t\tmemcpy(pD, pI, sizeof(TCmdPItem));\r\n#endif\r\n\t\t\tpD->bCmd = CMD_ACK_PLRINFO;\r\n\t\t\tpD->x = x;\r\n\t\t\tpD->y = y;\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL delta_portal_inited(int i)\r\n{\r\n\treturn sgJunk.portal[i].x == 0xFF;\r\n}\r\n\r\nBOOL delta_quest_inited(int i)\r\n{\r\n\treturn sgJunk.quests[i].qstate != 0xFF;\r\n}\r\n\r\nvoid DeltaAddItem(int ii)\r\n{\r\n\tint i;\r\n\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tTCmdPItem *pD = sgLevels[currlevel].item;\r\n\tfor (i = 0; i < MAXITEMS; i++, pD++) {\r\n\t\tif (pD->bCmd != 0xFF\r\n\t\t    && pD->wIndx == item[ii].IDidx\r\n\t\t    && pD->wCI == item[ii]._iCreateInfo\r\n\t\t    && pD->dwSeed == item[ii]._iSeed\r\n\t\t    && (pD->bCmd == CMD_WALKXY || pD->bCmd == CMD_STAND)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tpD = sgLevels[currlevel].item;\r\n\tfor (i = 0; i < MAXITEMS; i++, pD++) {\r\n\t\tif (pD->bCmd == 0xFF) {\r\n\t\t\tsgbDeltaChanged = TRUE;\r\n\t\t\tpD->bCmd = CMD_STAND;\r\n\t\t\tpD->x = item[ii]._ix;\r\n\t\t\tpD->y = item[ii]._iy;\r\n\t\t\tpD->wIndx = item[ii].IDidx;\r\n\t\t\tpD->wCI = item[ii]._iCreateInfo;\r\n\t\t\tpD->dwSeed = item[ii]._iSeed;\r\n\t\t\tpD->bId = item[ii]._iIdentified;\r\n\t\t\tpD->bDur = item[ii]._iDurability;\r\n\t\t\tpD->bMDur = item[ii]._iMaxDur;\r\n\t\t\tpD->bCh = item[ii]._iCharges;\r\n\t\t\tpD->bMCh = item[ii]._iMaxCharges;\r\n\t\t\tpD->wValue = item[ii]._ivalue;\r\n#ifdef HELLFIRE\r\n\t\t\tpD->wToHit = item[ii]._iPLToHit;\r\n\t\t\tpD->wMaxDam = item[ii]._iMaxDam;\r\n\t\t\tpD->bMinStr = item[ii]._iMinStr;\r\n\t\t\tpD->bMinMag = item[ii]._iMinMag;\r\n\t\t\tpD->bMinDex = item[ii]._iMinDex;\r\n\t\t\tpD->bAC = item[ii]._iAC;\r\n#endif\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DeltaSaveLevel()\r\n{\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tfor (int i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (i != myplr)\r\n\t\t\tplr[i]._pGFXLoad = 0;\r\n\t}\r\n\tplr[myplr]._pLvlVisited[currlevel] = TRUE;\r\n\tdelta_leave_sync(currlevel);\r\n}\r\n\r\nvoid DeltaLoadLevel()\r\n{\r\n\tint ii, ot;\r\n\tint i, j, k, l;\r\n\tint x, y, xx, yy;\r\n\tBOOL done;\r\n\r\n\tif (gbMaxPlayers == 1)\r\n\t\treturn;\r\n\r\n\tdeltaload = TRUE;\r\n\tif (currlevel != 0) {\r\n\t\tfor (i = 0; i < nummonsters; i++) {\r\n\t\t\tif (sgLevels[currlevel].monster[i]._mx != 0xFF) {\r\n\t\t\t\tM_ClearSquares(i);\r\n\t\t\t\t// BUGFIX: should use `monster[monstactive[i]]`, `not monster[i]`.\r\n\t\t\t\tmonster[i]._mx = sgLevels[currlevel].monster[i]._mx;\r\n\t\t\t\tmonster[i]._my = sgLevels[currlevel].monster[i]._my;\r\n\t\t\t\tmonster[i]._moldx = monster[i]._mx;\r\n\t\t\t\tmonster[i]._moldy = monster[i]._my;\r\n\t\t\t\tmonster[i]._mfutx = monster[i]._mx;\r\n\t\t\t\tmonster[i]._mfuty = monster[i]._my;\r\n\t\t\t\tif (sgLevels[currlevel].monster[i]._mhitpoints != -1)\r\n\t\t\t\t\tmonster[i]._mhitpoints = sgLevels[currlevel].monster[i]._mhitpoints;\r\n\t\t\t\tif (sgLevels[currlevel].monster[i]._mhitpoints == 0) {\r\n\t\t\t\t\tmonster[i]._moldx = sgLevels[currlevel].monster[i]._mx; // CODEFIX: useless assignment\r\n\t\t\t\t\tmonster[i]._moldy = sgLevels[currlevel].monster[i]._my; // CODEFIX: useless assignment\r\n\t\t\t\t\tM_ClearSquares(i);\r\n\t\t\t\t\tif (monster[i]._mAi != AI_DIABLO) {\r\n\t\t\t\t\t\tif (monster[i]._uniqtype == 0)\r\n\t\t\t\t\t\t\t/// ASSERT: assert(monster[i].MType != NULL);\r\n\t\t\t\t\t\t\tAddDead(monster[i]._mx, monster[i]._my, monster[i].MType->mdeadval, (direction)monster[i]._mdir);\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tAddDead(monster[i]._mx, monster[i]._my, monster[i]._udeadval, (direction)monster[i]._mdir);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmonster[i]._mDelFlag = TRUE;\r\n\t\t\t\t\tM_UpdateLeader(i);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdecode_enemy(i, sgLevels[currlevel].monster[i]._menemy);\r\n\t\t\t\t\tif (monster[i]._mx && monster[i]._mx != 1 || monster[i]._my)\r\n\t\t\t\t\t\tdMonster[monster[i]._mx][monster[i]._my] = i + 1;\r\n\t\t\t\t\tif (i < MAX_PLRS) {\r\n\t\t\t\t\t\tMAI_Golum(i);\r\n\t\t\t\t\t\tmonster[i]._mFlags |= (MFLAG_TARGETS_MONSTER | MFLAG_GOLEM);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tM_StartStand(i, monster[i]._mdir);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmonster[i]._msquelch = sgLevels[currlevel].monster[i]._mactive;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tmemcpy(automapview, &sgLocals[currlevel], sizeof(automapview));\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXITEMS; i++) {\r\n\t\tif (sgLevels[currlevel].item[i].bCmd != 0xFF) {\r\n\t\t\tif (sgLevels[currlevel].item[i].bCmd == CMD_WALKXY) {\r\n\t\t\t\tii = FindGetItem(\r\n\t\t\t\t    sgLevels[currlevel].item[i].wIndx,\r\n\t\t\t\t    sgLevels[currlevel].item[i].wCI,\r\n\t\t\t\t    sgLevels[currlevel].item[i].dwSeed);\r\n\t\t\t\tif (ii != -1) {\r\n\t\t\t\t\tif (dItem[item[ii]._ix][item[ii]._iy] == ii + 1)\r\n\t\t\t\t\t\tdItem[item[ii]._ix][item[ii]._iy] = 0;\r\n\t\t\t\t\tDeleteItem(ii, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (sgLevels[currlevel].item[i].bCmd == CMD_ACK_PLRINFO) {\r\n\t\t\t\tii = itemavail[0];\r\n\t\t\t\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\t\t\t\titemactive[numitems] = ii;\r\n\t\t\t\tif (sgLevels[currlevel].item[i].wIndx == IDI_EAR) {\r\n\t\t\t\t\tRecreateEar(\r\n\t\t\t\t\t    ii,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].wCI,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].dwSeed,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].bId,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].bDur,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].bMDur,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].bCh,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].bMCh,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].wValue,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].dwBuff);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tRecreateItem(\r\n\t\t\t\t\t    ii,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].wIndx,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].wCI,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].dwSeed,\r\n\t\t\t\t\t    sgLevels[currlevel].item[i].wValue);\r\n\t\t\t\t\tif (sgLevels[currlevel].item[i].bId)\r\n\t\t\t\t\t\titem[ii]._iIdentified = TRUE;\r\n\t\t\t\t\titem[ii]._iDurability = sgLevels[currlevel].item[i].bDur;\r\n\t\t\t\t\titem[ii]._iMaxDur = sgLevels[currlevel].item[i].bMDur;\r\n\t\t\t\t\titem[ii]._iCharges = sgLevels[currlevel].item[i].bCh;\r\n\t\t\t\t\titem[ii]._iMaxCharges = sgLevels[currlevel].item[i].bMCh;\r\n#ifdef HELLFIRE\r\n\t\t\t\t\titem[ii]._iPLToHit = sgLevels[currlevel].item[i].wToHit;\r\n\t\t\t\t\titem[ii]._iMaxDam = sgLevels[currlevel].item[i].wMaxDam;\r\n\t\t\t\t\titem[ii]._iMinStr = sgLevels[currlevel].item[i].bMinStr;\r\n\t\t\t\t\titem[ii]._iMinMag = sgLevels[currlevel].item[i].bMinMag;\r\n\t\t\t\t\titem[ii]._iMinDex = sgLevels[currlevel].item[i].bMinDex;\r\n\t\t\t\t\titem[ii]._iAC = sgLevels[currlevel].item[i].bAC;\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t\tx = sgLevels[currlevel].item[i].x;\r\n\t\t\t\ty = sgLevels[currlevel].item[i].y;\r\n\t\t\t\tif (!CanPut(x, y)) {\r\n\t\t\t\t\tdone = FALSE;\r\n\t\t\t\t\tfor (k = 1; k < 50 && !done; k++) {\r\n\t\t\t\t\t\tfor (j = -k; j <= k && !done; j++) {\r\n\t\t\t\t\t\t\tyy = y + j;\r\n\t\t\t\t\t\t\tfor (l = -k; l <= k && !done; l++) {\r\n\t\t\t\t\t\t\t\txx = x + l;\r\n\t\t\t\t\t\t\t\tif (CanPut(xx, yy)) {\r\n\t\t\t\t\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\t\t\t\t\tx = xx;\r\n\t\t\t\t\t\t\t\t\ty = yy;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\titem[ii]._ix = x;\r\n\t\t\t\titem[ii]._iy = y;\r\n\t\t\t\tdItem[item[ii]._ix][item[ii]._iy] = ii + 1;\r\n\t\t\t\tRespawnItem(ii, FALSE);\r\n\t\t\t\tnumitems++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (currlevel != 0) {\r\n\t\tfor (i = 0; i < MAXOBJECTS; i++) {\r\n\t\t\tswitch (sgLevels[currlevel].object[i].bCmd) {\r\n\t\t\tcase CMD_OPENDOOR:\r\n\t\t\tcase CMD_CLOSEDOOR:\r\n\t\t\tcase CMD_OPERATEOBJ:\r\n\t\t\tcase CMD_PLROPOBJ:\r\n\t\t\t\tSyncOpObject(-1, sgLevels[currlevel].object[i].bCmd, i);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CMD_BREAKOBJ:\r\n\t\t\t\tSyncBreakObj(-1, i);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < nobjects; i++) {\r\n\t\t\tot = object[objectactive[i]]._otype;\r\n\t\t\tif (ot == OBJ_TRAPL || ot == OBJ_TRAPR)\r\n\t\t\t\tObj_Trap(objectactive[i]);\r\n\t\t}\r\n\t}\r\n\tdeltaload = FALSE;\r\n}\r\n\r\nvoid NetSendCmd(BOOL bHiPri, BYTE bCmd)\r\n{\r\n\tTCmd cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdGolem(BYTE mx, BYTE my, BYTE dir, BYTE menemy, int hp, BYTE cl)\r\n{\r\n\tTCmdGolem cmd;\r\n\r\n\tcmd.bCmd = CMD_AWAKEGOLEM;\r\n\tcmd._mx = mx;\r\n\tcmd._my = my;\r\n\tcmd._mdir = dir;\r\n\tcmd._menemy = menemy;\r\n\tcmd._mhitpoints = hp;\r\n\tcmd._currlevel = cl;\r\n\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdLoc(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)\r\n{\r\n\tALIGN_BY_1 TCmdLoc cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.x = x;\r\n\tcmd.y = y;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1)\r\n{\r\n\tTCmdLocParam1 cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.x = x;\r\n\tcmd.y = y;\r\n\tcmd.wParam1 = wParam1;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdLocParam2(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2)\r\n{\r\n\tTCmdLocParam2 cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.x = x;\r\n\tcmd.y = y;\r\n\tcmd.wParam1 = wParam1;\r\n\tcmd.wParam2 = wParam2;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdLocParam3(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2, WORD wParam3)\r\n{\r\n\tTCmdLocParam3 cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.x = x;\r\n\tcmd.y = y;\r\n\tcmd.wParam1 = wParam1;\r\n\tcmd.wParam2 = wParam2;\r\n\tcmd.wParam3 = wParam3;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1)\r\n{\r\n\tALIGN_BY_1 TCmdParam1 cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.wParam1 = wParam1;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdParam2(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2)\r\n{\r\n\tTCmdParam2 cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.wParam1 = wParam1;\r\n\tcmd.wParam2 = wParam2;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdParam3(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2, WORD wParam3)\r\n{\r\n\tTCmdParam3 cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.wParam1 = wParam1;\r\n\tcmd.wParam2 = wParam2;\r\n\tcmd.wParam3 = wParam3;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdQuest(BOOL bHiPri, BYTE q)\r\n{\r\n\tTCmdQuest cmd;\r\n\r\n\tcmd.q = q;\r\n\tcmd.bCmd = CMD_SYNCQUEST;\r\n\tcmd.qstate = quests[q]._qactive;\r\n\tcmd.qlog = quests[q]._qlog;\r\n\tcmd.qvar1 = quests[q]._qvar1;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdGItem(BOOL bHiPri, BYTE bCmd, BYTE mast, BYTE pnum, BYTE ii)\r\n{\r\n\tTCmdGItem cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.bPnum = pnum;\r\n\tcmd.bMaster = mast;\r\n\tcmd.bLevel = currlevel;\r\n\tcmd.bCursitem = ii;\r\n\tcmd.dwTime = 0;\r\n\tcmd.x = item[ii]._ix;\r\n\tcmd.y = item[ii]._iy;\r\n\tcmd.wIndx = item[ii].IDidx;\r\n\r\n\tif (item[ii].IDidx == IDI_EAR) {\r\n\t\tcmd.wCI = item[ii]._iName[8] | (item[ii]._iName[7] << 8);\r\n\t\tcmd.dwSeed = item[ii]._iName[12] | ((item[ii]._iName[11] | ((item[ii]._iName[10] | (item[ii]._iName[9] << 8)) << 8)) << 8);\r\n\t\tcmd.bId = item[ii]._iName[13];\r\n\t\tcmd.bDur = item[ii]._iName[14];\r\n\t\tcmd.bMDur = item[ii]._iName[15];\r\n\t\tcmd.bCh = item[ii]._iName[16];\r\n\t\tcmd.bMCh = item[ii]._iName[17];\r\n\t\tcmd.wValue = item[ii]._ivalue | (item[ii]._iName[18] << 8) | ((item[ii]._iCurs - ICURS_EAR_SORCEROR) << 6);\r\n\t\tcmd.dwBuff = item[ii]._iName[22] | ((item[ii]._iName[21] | ((item[ii]._iName[20] | (item[ii]._iName[19] << 8)) << 8)) << 8);\r\n\t} else {\r\n\t\tcmd.wCI = item[ii]._iCreateInfo;\r\n\t\tcmd.dwSeed = item[ii]._iSeed;\r\n\t\tcmd.bId = item[ii]._iIdentified;\r\n\t\tcmd.bDur = item[ii]._iDurability;\r\n\t\tcmd.bMDur = item[ii]._iMaxDur;\r\n\t\tcmd.bCh = item[ii]._iCharges;\r\n\t\tcmd.bMCh = item[ii]._iMaxCharges;\r\n\t\tcmd.wValue = item[ii]._ivalue;\r\n#ifdef HELLFIRE\r\n\t\tcmd.wToHit = item[ii]._iPLToHit;\r\n\t\tcmd.wMaxDam = item[ii]._iMaxDam;\r\n\t\tcmd.bMinStr = item[ii]._iMinStr;\r\n\t\tcmd.bMinMag = item[ii]._iMinMag;\r\n\t\tcmd.bMinDex = item[ii]._iMinDex;\r\n\t\tcmd.bAC = item[ii]._iAC;\r\n#endif\r\n\t}\r\n\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdGItem2(BOOL usonly, BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)\r\n{\r\n\tTCmdGItem cmd;\r\n\r\n#ifdef HELLFIRE\r\n\tcmd = *p;\r\n#else\r\n\tmemcpy(&cmd, p, sizeof(cmd));\r\n#endif\r\n\tcmd.bPnum = pnum;\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.bMaster = mast;\r\n\r\n\tif (!usonly) {\r\n\t\tcmd.dwTime = 0;\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\t\treturn;\r\n\t}\r\n\r\n\tint ticks = GetTickCount();\r\n\tif (cmd.dwTime == 0) {\r\n\t\tcmd.dwTime = ticks;\r\n\t} else if (ticks - cmd.dwTime > 5000) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmulti_msg_add((BYTE *)&cmd.bCmd, sizeof(cmd));\r\n}\r\n\r\nBOOL NetSendCmdReq2(BYTE bCmd, BYTE mast, BYTE pnum, TCmdGItem *p)\r\n{\r\n\tTCmdGItem cmd;\r\n\r\n#ifdef HELLFIRE\r\n\tcmd = *p;\r\n#else\r\n\tmemcpy(&cmd, p, sizeof(cmd));\r\n#endif\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.bPnum = pnum;\r\n\tcmd.bMaster = mast;\r\n\r\n\tint ticks = GetTickCount();\r\n\tif (cmd.dwTime == 0)\r\n\t\tcmd.dwTime = ticks;\r\n\telse if (ticks - cmd.dwTime > 5000)\r\n\t\treturn FALSE;\r\n\r\n\tmulti_msg_add((BYTE *)&cmd.bCmd, sizeof(cmd));\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid NetSendCmdExtra(TCmdGItem *p)\r\n{\r\n\tTCmdGItem cmd;\r\n\r\n#ifdef HELLFIRE\r\n\tcmd = *p;\r\n#else\r\n\tmemcpy(&cmd, p, sizeof(cmd));\r\n#endif\r\n\tcmd.dwTime = 0;\r\n\tcmd.bCmd = CMD_ITEMEXTRA;\r\n\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y)\r\n{\r\n\tTCmdPItem cmd;\r\n\r\n\tcmd.bCmd = bCmd;\r\n\tcmd.x = x;\r\n\tcmd.y = y;\r\n\tcmd.wIndx = plr[myplr].HoldItem.IDidx;\r\n\r\n\tif (plr[myplr].HoldItem.IDidx == IDI_EAR) {\r\n\t\tcmd.wCI = plr[myplr].HoldItem._iName[8] | (plr[myplr].HoldItem._iName[7] << 8);\r\n\t\tcmd.dwSeed = plr[myplr].HoldItem._iName[12] | ((plr[myplr].HoldItem._iName[11] | ((plr[myplr].HoldItem._iName[10] | (plr[myplr].HoldItem._iName[9] << 8)) << 8)) << 8);\r\n\t\tcmd.bId = plr[myplr].HoldItem._iName[13];\r\n\t\tcmd.bDur = plr[myplr].HoldItem._iName[14];\r\n\t\tcmd.bMDur = plr[myplr].HoldItem._iName[15];\r\n\t\tcmd.bCh = plr[myplr].HoldItem._iName[16];\r\n\t\tcmd.bMCh = plr[myplr].HoldItem._iName[17];\r\n\t\tcmd.wValue = plr[myplr].HoldItem._ivalue | (plr[myplr].HoldItem._iName[18] << 8) | ((plr[myplr].HoldItem._iCurs - ICURS_EAR_SORCEROR) << 6);\r\n\t\tcmd.dwBuff = plr[myplr].HoldItem._iName[22] | ((plr[myplr].HoldItem._iName[21] | ((plr[myplr].HoldItem._iName[20] | (plr[myplr].HoldItem._iName[19] << 8)) << 8)) << 8);\r\n\t} else {\r\n\t\tcmd.wCI = plr[myplr].HoldItem._iCreateInfo;\r\n\t\tcmd.dwSeed = plr[myplr].HoldItem._iSeed;\r\n\t\tcmd.bId = plr[myplr].HoldItem._iIdentified;\r\n\t\tcmd.bDur = plr[myplr].HoldItem._iDurability;\r\n\t\tcmd.bMDur = plr[myplr].HoldItem._iMaxDur;\r\n\t\tcmd.bCh = plr[myplr].HoldItem._iCharges;\r\n\t\tcmd.bMCh = plr[myplr].HoldItem._iMaxCharges;\r\n\t\tcmd.wValue = plr[myplr].HoldItem._ivalue;\r\n#ifdef HELLFIRE\r\n\t\tcmd.wToHit = plr[myplr].HoldItem._iPLToHit;\r\n\t\tcmd.wMaxDam = plr[myplr].HoldItem._iMaxDam;\r\n\t\tcmd.bMinStr = plr[myplr].HoldItem._iMinStr;\r\n\t\tcmd.bMinMag = plr[myplr].HoldItem._iMinMag;\r\n\t\tcmd.bMinDex = plr[myplr].HoldItem._iMinDex;\r\n\t\tcmd.bAC = plr[myplr].HoldItem._iAC;\r\n#endif\r\n\t}\r\n\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdChItem(BOOL bHiPri, BYTE bLoc)\r\n{\r\n\tTCmdChItem cmd;\r\n\r\n\tcmd.bCmd = CMD_CHANGEPLRITEMS;\r\n\tcmd.bLoc = bLoc;\r\n\tcmd.wIndx = plr[myplr].HoldItem.IDidx;\r\n\tcmd.wCI = plr[myplr].HoldItem._iCreateInfo;\r\n\tcmd.dwSeed = plr[myplr].HoldItem._iSeed;\r\n\tcmd.bId = plr[myplr].HoldItem._iIdentified;\r\n\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdDelItem(BOOL bHiPri, BYTE bLoc)\r\n{\r\n\tTCmdDelItem cmd;\r\n\r\n\tcmd.bLoc = bLoc;\r\n\tcmd.bCmd = CMD_DELPLRITEMS;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nvoid NetSendCmdDItem(BOOL bHiPri, int ii)\r\n{\r\n\tTCmdPItem cmd;\r\n\r\n\tcmd.bCmd = CMD_DROPITEM;\r\n\tcmd.x = item[ii]._ix;\r\n\tcmd.y = item[ii]._iy;\r\n\tcmd.wIndx = item[ii].IDidx;\r\n\r\n\tif (item[ii].IDidx == IDI_EAR) {\r\n\t\tcmd.wCI = item[ii]._iName[8] | (item[ii]._iName[7] << 8);\r\n\t\tcmd.dwSeed = item[ii]._iName[12] | ((item[ii]._iName[11] | ((item[ii]._iName[10] | (item[ii]._iName[9] << 8)) << 8)) << 8);\r\n\t\tcmd.bId = item[ii]._iName[13];\r\n\t\tcmd.bDur = item[ii]._iName[14];\r\n\t\tcmd.bMDur = item[ii]._iName[15];\r\n\t\tcmd.bCh = item[ii]._iName[16];\r\n\t\tcmd.bMCh = item[ii]._iName[17];\r\n\t\tcmd.wValue = item[ii]._ivalue | (item[ii]._iName[18] << 8) | ((item[ii]._iCurs - ICURS_EAR_SORCEROR) << 6);\r\n\t\tcmd.dwBuff = item[ii]._iName[22] | ((item[ii]._iName[21] | ((item[ii]._iName[20] | (item[ii]._iName[19] << 8)) << 8)) << 8);\r\n\t} else {\r\n\t\tcmd.wCI = item[ii]._iCreateInfo;\r\n\t\tcmd.dwSeed = item[ii]._iSeed;\r\n\t\tcmd.bId = item[ii]._iIdentified;\r\n\t\tcmd.bDur = item[ii]._iDurability;\r\n\t\tcmd.bMDur = item[ii]._iMaxDur;\r\n\t\tcmd.bCh = item[ii]._iCharges;\r\n\t\tcmd.bMCh = item[ii]._iMaxCharges;\r\n\t\tcmd.wValue = item[ii]._ivalue;\r\n#ifdef HELLFIRE\r\n\t\tcmd.wToHit = item[ii]._iPLToHit;\r\n\t\tcmd.wMaxDam = item[ii]._iMaxDam;\r\n\t\tcmd.bMinStr = item[ii]._iMinStr;\r\n\t\tcmd.bMinMag = item[ii]._iMinMag;\r\n\t\tcmd.bMinDex = item[ii]._iMinDex;\r\n\t\tcmd.bAC = item[ii]._iAC;\r\n#endif\r\n\t}\r\n\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\nstatic BOOL i_own_level(int nReqLevel)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (!plr[i].plractive)\r\n\t\t\tcontinue;\r\n\t\tif (plr[i]._pLvlChanging)\r\n\t\t\tcontinue;\r\n\t\tif (plr[i].plrlevel != nReqLevel)\r\n\t\t\tcontinue;\r\n\t\tif (i == myplr && gbBufferMsgs != 0)\r\n\t\t\tcontinue;\r\n\t\tbreak;\r\n\t}\r\n\treturn i == myplr;\r\n}\r\n\r\nvoid NetSendCmdDamage(BOOL bHiPri, BYTE bPlr, DWORD dwDam)\r\n{\r\n\tTCmdDamage cmd;\r\n\r\n\tcmd.bCmd = CMD_PLRDAMAGE;\r\n\tcmd.bPlr = bPlr;\r\n\tcmd.dwDam = dwDam;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid NetSendCmdMonDmg(BOOL bHiPri, WORD wMon, DWORD dwDam)\r\n{\r\n\tTCmdMonDamage cmd;\r\n\r\n\tcmd.bCmd = CMD_MONSTDAMAGE;\r\n\tcmd.wMon = wMon;\r\n\tcmd.dwDam = dwDam;\r\n\tif (bHiPri)\r\n\t\tNetSendHiPri((BYTE *)&cmd, sizeof(cmd));\r\n\telse\r\n\t\tNetSendLoPri((BYTE *)&cmd, sizeof(cmd));\r\n}\r\n#endif\r\n\r\nvoid NetSendCmdString(int pmask, const char *pszStr)\r\n{\r\n\tint dwStrLen;\r\n\tTCmdString cmd;\r\n\r\n\tdwStrLen = strlen(pszStr);\r\n\tcmd.bCmd = CMD_STRING;\r\n\tstrcpy(cmd.str, pszStr);\r\n\tmulti_send_msg_packet(pmask, (BYTE *)&cmd.bCmd, dwStrLen + 2);\r\n}\r\n\r\nstatic DWORD On_STRING2(int pnum, TCmd *pCmd)\r\n{\r\n\tTCmdString *p = (TCmdString *)pCmd;\r\n\r\n\tint len = strlen(p->str);\r\n\tif (!gbBufferMsgs)\r\n\t\tSendPlrMsg(pnum, p->str);\r\n\r\n\treturn len + 2; // length of string + nul terminator + sizeof(p->bCmd)\r\n}\r\n\r\nstatic void delta_open_portal(int pnum, BYTE x, BYTE y, BYTE bLevel, BYTE bLType, BYTE bSetLvl)\r\n{\r\n\tsgbDeltaChanged = TRUE;\r\n\tsgJunk.portal[pnum].x = x;\r\n\tsgJunk.portal[pnum].y = y;\r\n\tsgJunk.portal[pnum].level = bLevel;\r\n\tsgJunk.portal[pnum].ltype = bLType;\r\n\tsgJunk.portal[pnum].setlvl = bSetLvl;\r\n}\r\n\r\nvoid delta_close_portal(int pnum)\r\n{\r\n\tmemset(&sgJunk.portal[pnum], 0xFF, sizeof(sgJunk.portal[pnum]));\r\n\tsgbDeltaChanged = TRUE;\r\n}\r\n\r\nstatic void check_update_plr(int pnum)\r\n{\r\n\tif (gbMaxPlayers != 1 && pnum == myplr)\r\n\t\tpfile_update(TRUE);\r\n}\r\n\r\nstatic void __cdecl msg_errorf(const char *pszFmt, ...)\r\n{\r\n\tstatic DWORD msg_err_timer;\r\n\tDWORD ticks;\r\n\tchar msg[256];\r\n\tva_list va;\r\n\r\n\tva_start(va, pszFmt);\r\n\tticks = GetTickCount();\r\n\tif (ticks - msg_err_timer >= 5000) {\r\n\t\tmsg_err_timer = ticks;\r\n\t\tvsprintf(msg, pszFmt, va);\r\n\t\tErrorPlrMsg(msg);\r\n\t}\r\n\tva_end(va);\r\n}\r\n\r\nstatic DWORD On_SYNCDATA(TCmd *pCmd, int pnum)\r\n{\r\n\treturn sync_update(pnum, (const BYTE *)pCmd);\r\n}\r\n\r\nstatic DWORD On_WALKXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLoc *p = (TCmdLoc *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tClrPlrPath(pnum);\r\n\t\tMakePlrPath(pnum, p->x, p->y, TRUE);\r\n\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ADDSTR(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 256)\r\n\t\tModifyPlrStr(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ADDMAG(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 256)\r\n\t\tModifyPlrMag(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ADDDEX(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 256)\r\n\t\tModifyPlrDex(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ADDVIT(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 256)\r\n\t\tModifyPlrVit(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SBSPELL(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1) {\r\n\t\tint spell = p->wParam1;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tplr[pnum]._pSpell = p->wParam1;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pSBkSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 1;\r\n\t\t\tplr[pnum].destAction = ACTION_SPELL;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_GOTOGETITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tMakePlrPath(pnum, p->x, p->y, FALSE);\r\n\t\tplr[pnum].destAction = ACTION_PICKUPITEM;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_REQUESTGITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdGItem *p = (TCmdGItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) {\r\n\t\tif (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {\r\n\t\t\tint ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);\r\n\t\t\tif (ii != -1) {\r\n\t\t\t\tNetSendCmdGItem2(FALSE, CMD_GETITEM, myplr, p->bPnum, p);\r\n\t\t\t\tif (p->bPnum != myplr)\r\n\t\t\t\t\tSyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);\r\n\t\t\t\telse\r\n\t\t\t\t\tInvGetItem(myplr, ii);\r\n\t\t\t\tSetItemRecord(p->dwSeed, p->wCI, p->wIndx);\r\n\t\t\t} else if (!NetSendCmdReq2(CMD_REQUESTGITEM, myplr, p->bPnum, p))\r\n\t\t\t\tNetSendCmdExtra(p);\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_GETITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdGItem *p = (TCmdGItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tint ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);\r\n\t\tif (delta_get_item(p, p->bLevel)) {\r\n\t\t\tif ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) {\r\n\t\t\t\tif (p->bPnum == myplr) {\r\n\t\t\t\t\tif (currlevel != p->bLevel) {\r\n\t\t\t\t\t\tii = SyncPutItem(myplr, plr[myplr]._px, plr[myplr]._py, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff\r\n#ifdef HELLFIRE\r\n\t\t\t\t\t\t    ,\r\n\t\t\t\t\t\t    p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC\r\n#endif\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tif (ii != -1)\r\n\t\t\t\t\t\t\tInvGetItem(myplr, ii);\r\n\t\t\t\t\t} else\r\n\t\t\t\t\t\tInvGetItem(myplr, ii);\r\n\t\t\t\t} else\r\n\t\t\t\t\tSyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);\r\n\t\t\t}\r\n\t\t} else\r\n\t\t\tNetSendCmdGItem2(TRUE, CMD_GETITEM, p->bMaster, p->bPnum, p);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_GOTOAGETITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tMakePlrPath(pnum, p->x, p->y, FALSE);\r\n\t\tplr[pnum].destAction = ACTION_PICKUPAITEM;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_REQUESTAGITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdGItem *p = (TCmdGItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && i_own_level(plr[pnum].plrlevel)) {\r\n\t\tif (GetItemRecord(p->dwSeed, p->wCI, p->wIndx)) {\r\n\t\t\tint ii = FindGetItem(p->wIndx, p->wCI, p->dwSeed);\r\n\t\t\tif (ii != -1) {\r\n\t\t\t\tNetSendCmdGItem2(FALSE, CMD_AGETITEM, myplr, p->bPnum, p);\r\n\t\t\t\tif (p->bPnum != myplr)\r\n\t\t\t\t\tSyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);\r\n\t\t\t\telse\r\n\t\t\t\t\tAutoGetItem(myplr, p->bCursitem);\r\n\t\t\t\tSetItemRecord(p->dwSeed, p->wCI, p->wIndx);\r\n\t\t\t} else if (!NetSendCmdReq2(CMD_REQUESTAGITEM, myplr, p->bPnum, p))\r\n\t\t\t\tNetSendCmdExtra(p);\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_AGETITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdGItem *p = (TCmdGItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tFindGetItem(p->wIndx, p->wCI, p->dwSeed);\r\n\t\tif (delta_get_item(p, p->bLevel)) {\r\n\t\t\tif ((currlevel == p->bLevel || p->bPnum == myplr) && p->bMaster != myplr) {\r\n\t\t\t\tif (p->bPnum == myplr) {\r\n\t\t\t\t\tif (currlevel != p->bLevel) {\r\n\t\t\t\t\t\tint ii = SyncPutItem(myplr, plr[myplr]._px, plr[myplr]._py, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff\r\n#ifdef HELLFIRE\r\n\t\t\t\t\t\t    ,\r\n\t\t\t\t\t\t    p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC\r\n#endif\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tif (ii != -1)\r\n\t\t\t\t\t\t\tAutoGetItem(myplr, ii);\r\n\t\t\t\t\t} else\r\n\t\t\t\t\t\tAutoGetItem(myplr, p->bCursitem);\r\n\t\t\t\t} else\r\n\t\t\t\t\tSyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);\r\n\t\t\t}\r\n\t\t} else\r\n\t\t\tNetSendCmdGItem2(TRUE, CMD_AGETITEM, p->bMaster, p->bPnum, p);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ITEMEXTRA(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdGItem *p = (TCmdGItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tdelta_get_item(p, p->bLevel);\r\n\t\tif (currlevel == plr[pnum].plrlevel)\r\n\t\t\tSyncGetItem(p->x, p->y, p->wIndx, p->wCI, p->dwSeed);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_PUTITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdPItem *p = (TCmdPItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (currlevel == plr[pnum].plrlevel) {\r\n\t\tint ii;\r\n\t\tif (pnum == myplr)\r\n\t\t\tii = InvPutItem(pnum, p->x, p->y);\r\n\t\telse\r\n\t\t\tii = SyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff\r\n#ifdef HELLFIRE\r\n\t\t\t    ,\r\n\t\t\t    p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC\r\n#endif\r\n\t\t\t);\r\n\t\tif (ii != -1) {\r\n\t\t\tPutItemRecord(p->dwSeed, p->wCI, p->wIndx);\r\n\t\t\tdelta_put_item(p, item[ii]._ix, item[ii]._iy, plr[pnum].plrlevel);\r\n\t\t\tcheck_update_plr(pnum);\r\n\t\t}\r\n\t\treturn sizeof(*p);\r\n\t} else {\r\n\t\tPutItemRecord(p->dwSeed, p->wCI, p->wIndx);\r\n\t\tdelta_put_item(p, p->x, p->y, plr[pnum].plrlevel);\r\n\t\tcheck_update_plr(pnum);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SYNCPUTITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdPItem *p = (TCmdPItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (currlevel == plr[pnum].plrlevel) {\r\n\t\tint ii = SyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff\r\n#ifdef HELLFIRE\r\n\t\t    ,\r\n\t\t    p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC\r\n#endif\r\n\t\t);\r\n\t\tif (ii != -1) {\r\n\t\t\tPutItemRecord(p->dwSeed, p->wCI, p->wIndx);\r\n\t\t\tdelta_put_item(p, item[ii]._ix, item[ii]._iy, plr[pnum].plrlevel);\r\n\t\t\tcheck_update_plr(pnum);\r\n\t\t}\r\n\t\treturn sizeof(*p);\r\n\t} else {\r\n\t\tPutItemRecord(p->dwSeed, p->wCI, p->wIndx);\r\n\t\tdelta_put_item(p, p->x, p->y, plr[pnum].plrlevel);\r\n\t\tcheck_update_plr(pnum);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_RESPAWNITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdPItem *p = (TCmdPItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tif (currlevel == plr[pnum].plrlevel && pnum != myplr) {\r\n\t\t\tSyncPutItem(pnum, p->x, p->y, p->wIndx, p->wCI, p->dwSeed, p->bId, p->bDur, p->bMDur, p->bCh, p->bMCh, p->wValue, p->dwBuff\r\n#ifdef HELLFIRE\r\n\t\t\t    ,\r\n\t\t\t    p->wToHit, p->wMaxDam, p->bMinStr, p->bMinMag, p->bMinDex, p->bAC\r\n#endif\r\n\t\t\t);\r\n\t\t}\r\n\t\tPutItemRecord(p->dwSeed, p->wCI, p->wIndx);\r\n\t\tdelta_put_item(p, p->x, p->y, plr[pnum].plrlevel);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ATTACKXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLoc *p = (TCmdLoc *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tMakePlrPath(pnum, p->x, p->y, FALSE);\r\n\t\tplr[pnum].destAction = ACTION_ATTACK;\r\n\t\tplr[pnum].destParam1 = p->x;\r\n\t\tplr[pnum].destParam2 = p->y;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SATTACKXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLoc *p = (TCmdLoc *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tClrPlrPath(pnum);\r\n\t\tplr[pnum].destAction = ACTION_ATTACK;\r\n\t\tplr[pnum].destParam1 = p->x;\r\n\t\tplr[pnum].destParam2 = p->y;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_RATTACKXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLoc *p = (TCmdLoc *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tClrPlrPath(pnum);\r\n\t\tplr[pnum].destAction = ACTION_RATTACK;\r\n\t\tplr[pnum].destParam1 = p->x;\r\n\t\tplr[pnum].destParam2 = p->y;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SPELLXYD(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam3 *p = (TCmdLocParam3 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint spell = p->wParam1;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tClrPlrPath(pnum);\r\n\t\t\tplr[pnum].destAction = ACTION_SPELLWALL;\r\n\t\t\tplr[pnum].destParam1 = p->x;\r\n\t\t\tplr[pnum].destParam2 = p->y;\r\n\t\t\tplr[pnum].destParam3 = p->wParam2;\r\n\t\t\tplr[pnum].destParam4 = p->wParam3;\r\n\t\t\tplr[pnum]._pSpell = p->wParam1;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pRSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 0;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SPELLXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam2 *p = (TCmdLocParam2 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint spell = p->wParam1;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tClrPlrPath(pnum);\r\n\t\t\tplr[pnum].destAction = ACTION_SPELL;\r\n\t\t\tplr[pnum].destParam1 = p->x;\r\n\t\t\tplr[pnum].destParam2 = p->y;\r\n\t\t\tplr[pnum].destParam3 = p->wParam2;\r\n\t\t\tplr[pnum]._pSpell = p->wParam1;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pRSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 0;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_TSPELLXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam2 *p = (TCmdLocParam2 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint spell = p->wParam1;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tClrPlrPath(pnum);\r\n\t\t\tplr[pnum].destAction = ACTION_SPELL;\r\n\t\t\tplr[pnum].destParam1 = p->x;\r\n\t\t\tplr[pnum].destParam2 = p->y;\r\n\t\t\tplr[pnum].destParam3 = p->wParam2;\r\n\t\t\tplr[pnum]._pSpell = p->wParam1;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pTSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 2;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_OPOBJXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tif (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag)\r\n\t\t\tMakePlrPath(pnum, p->x, p->y, FALSE);\r\n\t\telse\r\n\t\t\tMakePlrPath(pnum, p->x, p->y, TRUE);\r\n\t\tplr[pnum].destAction = ACTION_OPERATE;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_DISARMXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tif (object[p->wParam1]._oSolidFlag || object[p->wParam1]._oDoorFlag)\r\n\t\t\tMakePlrPath(pnum, p->x, p->y, FALSE);\r\n\t\telse\r\n\t\t\tMakePlrPath(pnum, p->x, p->y, TRUE);\r\n\t\tplr[pnum].destAction = ACTION_DISARM;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_OPOBJT(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tplr[pnum].destAction = ACTION_OPERATETK;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ATTACKID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint distx = abs(plr[pnum]._px - monster[p->wParam1]._mfutx);\r\n\t\tint disty = abs(plr[pnum]._py - monster[p->wParam1]._mfuty);\r\n\t\tif (distx > 1 || disty > 1)\r\n\t\t\tMakePlrPath(pnum, monster[p->wParam1]._mfutx, monster[p->wParam1]._mfuty, FALSE);\r\n\t\tplr[pnum].destAction = ACTION_ATTACKMON;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ATTACKPID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tMakePlrPath(pnum, plr[p->wParam1]._pfutx, plr[p->wParam1]._pfuty, FALSE);\r\n\t\tplr[pnum].destAction = ACTION_ATTACKPLR;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_RATTACKID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tClrPlrPath(pnum);\r\n\t\tplr[pnum].destAction = ACTION_RATTACKMON;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_RATTACKPID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tClrPlrPath(pnum);\r\n\t\tplr[pnum].destAction = ACTION_RATTACKPLR;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SPELLID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam3 *p = (TCmdParam3 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint spell = p->wParam2;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tClrPlrPath(pnum);\r\n\t\t\tplr[pnum].destAction = ACTION_SPELLMON;\r\n\t\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t\t\tplr[pnum].destParam2 = p->wParam3;\r\n\t\t\tplr[pnum]._pSpell = p->wParam2;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pRSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 0;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SPELLPID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam3 *p = (TCmdParam3 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint spell = p->wParam2;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tClrPlrPath(pnum);\r\n\t\t\tplr[pnum].destAction = ACTION_SPELLPLR;\r\n\t\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t\t\tplr[pnum].destParam2 = p->wParam3;\r\n\t\t\tplr[pnum]._pSpell = p->wParam2;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pRSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 0;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_TSPELLID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam3 *p = (TCmdParam3 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint spell = p->wParam2;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tClrPlrPath(pnum);\r\n\t\t\tplr[pnum].destAction = ACTION_SPELLMON;\r\n\t\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t\t\tplr[pnum].destParam2 = p->wParam3;\r\n\t\t\tplr[pnum]._pSpell = p->wParam2;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pTSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 2;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_TSPELLPID(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam3 *p = (TCmdParam3 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tint spell = p->wParam2;\r\n\t\tif (currlevel != 0 || spelldata[spell].sTownSpell) {\r\n\t\t\tClrPlrPath(pnum);\r\n\t\t\tplr[pnum].destAction = ACTION_SPELLPLR;\r\n\t\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t\t\tplr[pnum].destParam2 = p->wParam3;\r\n\t\t\tplr[pnum]._pSpell = p->wParam2;\r\n\t\t\tplr[pnum]._pSplType = plr[pnum]._pTSplType;\r\n\t\t\tplr[pnum]._pSplFrom = 2;\r\n\t\t} else\r\n\t\t\tmsg_errorf(\"%s has cast an illegal spell.\", plr[pnum]._pName);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_KNOCKBACK(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tM_GetKnockback(p->wParam1);\r\n\t\tM_StartHit(p->wParam1, pnum, 0);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_RESURRECT(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tDoResurrect(pnum, p->wParam1);\r\n\t\tcheck_update_plr(pnum);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_HEALOTHER(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel)\r\n\t\tDoHealOther(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_TALKXY(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel) {\r\n\t\tMakePlrPath(pnum, p->x, p->y, FALSE);\r\n\t\tplr[pnum].destAction = ACTION_TALK;\r\n\t\tplr[pnum].destParam1 = p->wParam1;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_NEWLVL(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam2 *p = (TCmdParam2 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (pnum != myplr)\r\n\t\tStartNewLvl(pnum, p->wParam1, p->wParam2);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_WARP(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tStartWarpLvl(pnum, p->wParam1);\r\n\t\tif (pnum == myplr && pcurs >= CURSOR_FIRSTITEM) {\r\n\t\t\titem[MAXITEMS] = plr[myplr].HoldItem;\r\n\t\t\tAutoGetItem(myplr, MAXITEMS);\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_MONSTDEATH(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (pnum != myplr) {\r\n\t\tif (currlevel == plr[pnum].plrlevel)\r\n\t\t\tM_SyncStartKill(p->wParam1, p->x, p->y, pnum);\r\n\t\tdelta_kill_monster(p->wParam1, p->x, p->y, plr[pnum].plrlevel);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_KILLGOLEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (pnum != myplr) {\r\n\t\tif (currlevel == p->wParam1)\r\n\t\t\tM_SyncStartKill(pnum, p->x, p->y, pnum);\r\n\t\tdelta_kill_monster(pnum, p->x, p->y, plr[pnum].plrlevel); // BUGFIX: should be p->wParam1, plrlevel will be incorrect if golem is killed because player changed levels\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_AWAKEGOLEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdGolem *p = (TCmdGolem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (currlevel != plr[pnum].plrlevel)\r\n\t\tdelta_sync_golem(p, pnum, p->_currlevel);\r\n\telse if (pnum != myplr) {\r\n\t\tint i;\r\n\t\t// check if this player already has an active golem\r\n\t\tBOOL addGolem = TRUE;\r\n\t\tfor (i = 0; i < nummissiles; i++) {\r\n\t\t\tint mi = missileactive[i];\r\n\t\t\tif (missile[mi]._mitype == MIS_GOLEM && missile[mi]._misource == pnum) {\r\n\t\t\t\taddGolem = FALSE;\r\n\t\t\t\t// CODEFIX: break, don't need to check the rest\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (addGolem)\r\n\t\t\tAddMissile(plr[pnum]._px, plr[pnum]._py, p->_mx, p->_my, p->_mdir, MIS_GOLEM, TARGET_MONSTERS, pnum, 0, 1);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_MONSTDAMAGE(TCmd *pCmd, int pnum)\r\n{\r\n#ifdef HELLFIRE\r\n\tTCmdMonDamage *p = (TCmdMonDamage *)pCmd;\r\n#else\r\n\tTCmdParam2 *p = (TCmdParam2 *)pCmd;\r\n#endif\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(TCmdParam2)); // BUGFIX: change to sizeof(*p) or it still uses TCmdParam2 size for hellfire\r\n\telse if (pnum != myplr) {\r\n\t\tif (currlevel == plr[pnum].plrlevel) {\r\n#ifdef HELLFIRE\r\n\t\t\tmonster[p->wMon].mWhoHit |= 1 << pnum;\r\n\t\t\tif (monster[p->wMon]._mhitpoints >= 0) {\r\n\t\t\t\tmonster[p->wMon]._mhitpoints -= p->dwDam;\r\n\t\t\t\tif ((monster[p->wMon]._mhitpoints >> 6) < 1)\r\n\t\t\t\t\tmonster[p->wMon]._mhitpoints = 1 << 6;\r\n\t\t\t\tdelta_monster_hp(p->wMon, monster[p->wMon]._mhitpoints, plr[pnum].plrlevel);\r\n\t\t\t}\r\n#else\r\n\t\t\tmonster[p->wParam1].mWhoHit |= 1 << pnum;\r\n\t\t\tif (monster[p->wParam1]._mhitpoints != 0) {\r\n\t\t\t\tmonster[p->wParam1]._mhitpoints -= p->wParam2;\r\n\t\t\t\tif ((monster[p->wParam1]._mhitpoints >> 6) < 1)\r\n\t\t\t\t\tmonster[p->wParam1]._mhitpoints = 1 << 6;\r\n\t\t\t\tdelta_monster_hp(p->wParam1, monster[p->wParam1]._mhitpoints, plr[pnum].plrlevel);\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_PLRDEAD(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (pnum != myplr)\r\n\t\tStartPlayerKill(pnum, p->wParam1);\r\n\telse\r\n\t\tcheck_update_plr(pnum);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_PLRDAMAGE(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdDamage *p = (TCmdDamage *)pCmd;\r\n\r\n\tif (p->bPlr == myplr && currlevel != 0 && gbBufferMsgs != 1) {\r\n\t\tif (currlevel == plr[pnum].plrlevel && p->dwDam <= 192000 && plr[myplr]._pHitPoints >> 6 > 0) {\r\n\t\t\tdrawhpflag = TRUE;\r\n\t\t\tplr[myplr]._pHitPoints -= p->dwDam;\r\n\t\t\tplr[myplr]._pHPBase -= p->dwDam;\r\n\t\t\tif (plr[myplr]._pHitPoints > plr[myplr]._pMaxHP) {\r\n\t\t\t\tplr[myplr]._pHitPoints = plr[myplr]._pMaxHP;\r\n\t\t\t\tplr[myplr]._pHPBase = plr[myplr]._pMaxHPBase;\r\n\t\t\t}\r\n\t\t\tif (plr[myplr]._pHitPoints >> 6 <= 0) {\r\n\t\t\t\tSyncPlrKill(myplr, 1);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_OPENDOOR(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tif (currlevel == plr[pnum].plrlevel)\r\n\t\t\tSyncOpObject(pnum, CMD_OPENDOOR, p->wParam1);\r\n\t\tdelta_sync_object(p->wParam1, CMD_OPENDOOR, plr[pnum].plrlevel);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_CLOSEDOOR(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tif (currlevel == plr[pnum].plrlevel)\r\n\t\t\tSyncOpObject(pnum, CMD_CLOSEDOOR, p->wParam1);\r\n\t\tdelta_sync_object(p->wParam1, CMD_CLOSEDOOR, plr[pnum].plrlevel);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_OPERATEOBJ(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tif (currlevel == plr[pnum].plrlevel)\r\n\t\t\tSyncOpObject(pnum, CMD_OPERATEOBJ, p->wParam1);\r\n\t\tdelta_sync_object(p->wParam1, CMD_OPERATEOBJ, plr[pnum].plrlevel);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_PLROPOBJ(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam2 *p = (TCmdParam2 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tif (currlevel == plr[pnum].plrlevel)\r\n\t\t\tSyncOpObject(p->wParam1, CMD_PLROPOBJ, p->wParam2);\r\n\t\tdelta_sync_object(p->wParam2, CMD_PLROPOBJ, plr[pnum].plrlevel);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_BREAKOBJ(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam2 *p = (TCmdParam2 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tif (currlevel == plr[pnum].plrlevel)\r\n\t\t\tSyncBreakObj(p->wParam1, p->wParam2);\r\n\t\tdelta_sync_object(p->wParam2, CMD_BREAKOBJ, plr[pnum].plrlevel);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_CHANGEPLRITEMS(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdChItem *p = (TCmdChItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (pnum != myplr)\r\n\t\tCheckInvSwap(pnum, p->bLoc, p->wIndx, p->wCI, p->dwSeed, p->bId);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_DELPLRITEMS(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdDelItem *p = (TCmdDelItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (pnum != myplr)\r\n\t\tinv_update_rem_item(pnum, p->bLoc);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_PLRLEVEL(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= MAXCHARLEVEL && pnum != myplr)\r\n\t\tplr[pnum]._pLevel = p->wParam1;\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_DROPITEM(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdPItem *p = (TCmdPItem *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse\r\n\t\tdelta_put_item(p, p->x, p->y, plr[pnum].plrlevel);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SEND_PLRINFO(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdPlrInfoHdr *p = (TCmdPlrInfoHdr *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, p->wBytes + sizeof(*p));\r\n\telse\r\n\t\trecv_plrinfo(pnum, p, p->bCmd == CMD_ACK_PLRINFO);\r\n\r\n\treturn p->wBytes + sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ACK_PLRINFO(TCmd *pCmd, int pnum)\r\n{\r\n\treturn On_SEND_PLRINFO(pCmd, pnum);\r\n}\r\n\r\nstatic DWORD On_PLAYER_JOINLEVEL(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam1 *p = (TCmdLocParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tplr[pnum]._pLvlChanging = FALSE;\r\n\t\tif (plr[pnum]._pName[0] != 0 && !plr[pnum].plractive) {\r\n\t\t\tplr[pnum].plractive = TRUE;\r\n\t\t\tgbActivePlayers++;\r\n\t\t\tEventPlrMsg(\"Player '%s' (level %d) just joined the game\", plr[pnum]._pName, plr[pnum]._pLevel);\r\n\t\t}\r\n\r\n\t\tif (plr[pnum].plractive && myplr != pnum) {\r\n\t\t\tplr[pnum]._px = p->x;\r\n\t\t\tplr[pnum]._py = p->y;\r\n\t\t\tplr[pnum].plrlevel = p->wParam1;\r\n\t\t\tplr[pnum]._pGFXLoad = 0;\r\n\t\t\tif (currlevel == plr[pnum].plrlevel) {\r\n\t\t\t\tLoadPlrGFX(pnum, PFILE_STAND);\r\n\t\t\t\tSyncInitPlr(pnum);\r\n\t\t\t\tif ((plr[pnum]._pHitPoints >> 6) > 0)\r\n\t\t\t\t\tStartStand(pnum, 0);\r\n\t\t\t\telse {\r\n\t\t\t\t\tplr[pnum]._pgfxnum = 0;\r\n\t\t\t\t\tLoadPlrGFX(pnum, PFILE_DEATH);\r\n\t\t\t\t\tplr[pnum]._pmode = PM_DEATH;\r\n\t\t\t\t\tNewPlrAnim(pnum, plr[pnum]._pDAnim[DIR_S], plr[pnum]._pDFrames, 1, plr[pnum]._pDWidth);\r\n\t\t\t\t\tplr[pnum]._pAnimFrame = plr[pnum]._pAnimLen - 1;\r\n\t\t\t\t\tplr[pnum]._pVar8 = plr[pnum]._pAnimLen << 1;\r\n\t\t\t\t\tdFlags[plr[pnum]._px][plr[pnum]._py] |= BFLAG_DEAD_PLAYER;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tplr[pnum]._pvid = AddVision(plr[pnum]._px, plr[pnum]._py, plr[pnum]._pLightRad, pnum == myplr);\r\n\t\t\t\tplr[pnum]._plid = -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_ACTIVATEPORTAL(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam3 *p = (TCmdLocParam3 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tActivatePortal(pnum, p->x, p->y, p->wParam1, p->wParam2, p->wParam3);\r\n\t\tif (pnum != myplr) {\r\n\t\t\tif (currlevel == 0)\r\n\t\t\t\tAddInTownPortal(pnum);\r\n\t\t\telse if (currlevel == plr[pnum].plrlevel) {\r\n\t\t\t\tBOOL addPortal = TRUE;\r\n\t\t\t\tfor (int i = 0; i < nummissiles; i++) {\r\n\t\t\t\t\tint mi = missileactive[i];\r\n\t\t\t\t\tif (missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == pnum) {\r\n\t\t\t\t\t\taddPortal = FALSE;\r\n\t\t\t\t\t\t// CODEFIX: break\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (addPortal)\r\n\t\t\t\t\tAddWarpMissile(pnum, p->x, p->y);\r\n\t\t\t} else\r\n\t\t\t\tRemovePortalMissile(pnum);\r\n\t\t}\r\n\t\tdelta_open_portal(pnum, p->x, p->y, p->wParam1, p->wParam2, p->wParam3);\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_DEACTIVATEPORTAL(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, pCmd, sizeof(*pCmd));\r\n\telse {\r\n\t\tif (PortalOnLevel(pnum))\r\n\t\t\tRemovePortalMissile(pnum);\r\n\t\tDeactivatePortal(pnum);\r\n\t\tdelta_close_portal(pnum);\r\n\t}\r\n\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_RETOWN(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, pCmd, sizeof(*pCmd));\r\n\telse {\r\n\t\tif (pnum == myplr) {\r\n\t\t\tdeathflag = FALSE;\r\n\t\t\tgamemenu_off();\r\n\t\t}\r\n\t\tRestartTownLvl(pnum);\r\n\t}\r\n\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_SETSTR(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 750 && pnum != myplr)\r\n\t\tSetPlrStr(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SETDEX(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 750 && pnum != myplr)\r\n\t\tSetPlrDex(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SETMAG(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 750 && pnum != myplr)\r\n\t\tSetPlrMag(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SETVIT(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdParam1 *p = (TCmdParam1 *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse if (p->wParam1 <= 750 && pnum != myplr)\r\n\t\tSetPlrVit(pnum, p->wParam1);\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_STRING(TCmd *pCmd, int pnum)\r\n{\r\n\treturn On_STRING2(pnum, pCmd);\r\n}\r\n\r\nstatic DWORD On_SYNCQUEST(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdQuest *p = (TCmdQuest *)pCmd;\r\n\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, p, sizeof(*p));\r\n\telse {\r\n\t\tif (pnum != myplr)\r\n\t\t\tSetMultiQuest(p->q, p->qstate, p->qlog, p->qvar1);\r\n\t\tsgbDeltaChanged = TRUE;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic DWORD On_ENDREFLECT(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) {\r\n\t\tfor (int i = 0; i < nummissiles; i++) {\r\n\t\t\tint mi = missileactive[i];\r\n\t\t\tif (missile[mi]._mitype == MIS_REFLECT && missile[mi]._misource == pnum) {\r\n\t\t\t\tClearMissileSpot(mi);\r\n\t\t\t\tDeleteMissile(mi, i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*pCmd);\r\n}\r\n#endif\r\n\r\nstatic DWORD On_ENDSHIELD(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) {\r\n\t\tfor (int i = 0; i < nummissiles; i++) {\r\n\t\t\tint mi = missileactive[i];\r\n\t\t\tif (missile[mi]._mitype == MIS_MANASHIELD && missile[mi]._misource == pnum) {\r\n\t\t\t\tClearMissileSpot(mi);\r\n\t\t\t\tDeleteMissile(mi, i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_CHEAT_EXPERIENCE(TCmd *pCmd, int pnum)\r\n{\r\n#ifdef _DEBUG\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, pCmd, sizeof(*pCmd));\r\n\telse if (plr[pnum]._pLevel < MAXCHARLEVEL - 1) {\r\n\t\tplr[pnum]._pExperience = plr[pnum]._pNextExper;\r\n\t\tNextPlrLevel(pnum);\r\n\t}\r\n#endif\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_CHEAT_SPELL_LEVEL(TCmd *pCmd, int pnum)\r\n{\r\n#ifdef _DEBUG\r\n\tif (gbBufferMsgs == 1)\r\n\t\tmsg_send_packet(pnum, pCmd, sizeof(*pCmd));\r\n\telse\r\n\t\tplr[pnum]._pSplLvl[plr[pnum]._pRSpell]++;\r\n#endif\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_DEBUG(TCmd *pCmd, int pnum)\r\n{\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\n#ifndef HELLFIRE\r\nstatic DWORD On_NOVA(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLoc *p = (TCmdLoc *)pCmd;\r\n\r\n\tif (gbBufferMsgs != 1 && currlevel == plr[pnum].plrlevel && pnum != myplr) {\r\n\t\tClrPlrPath(pnum);\r\n\t\tplr[pnum]._pSpell = SPL_NOVA;\r\n\t\tplr[pnum]._pSplType = RSPLTYPE_INVALID;\r\n\t\tplr[pnum]._pSplFrom = 3;\r\n\t\tplr[pnum].destAction = ACTION_SPELL;\r\n\t\tplr[pnum].destParam1 = p->x;\r\n\t\tplr[pnum].destParam2 = p->y;\r\n\t}\r\n\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_SETSHIELD(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs != 1)\r\n\t\tplr[pnum].pManaShield = TRUE;\r\n\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_REMSHIELD(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs != 1)\r\n\t\tplr[pnum].pManaShield = FALSE;\r\n\r\n\treturn sizeof(*pCmd);\r\n}\r\n#else\r\nstatic DWORD On_REFLECT(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs != 1 && pnum != myplr && currlevel == plr[pnum].plrlevel) {\r\n\t\tfor (int i = 0; i < nummissiles; i++) {\r\n\t\t\tint mx = missileactive[i];\r\n\t\t\tif (missile[mx]._mitype == MIS_REFLECT && missile[mx]._misource == pnum) {\r\n\t\t\t\tClearMissileSpot(mx);\r\n\t\t\t\tDeleteMissile(mx, i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_NAKRUL(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs != 1) {\r\n\t\tOperateNakrulLever();\r\n\t\tIsUberRoomOpened = 1;\r\n\t\tquests[Q_NAKRUL]._qactive = QUEST_DONE;\r\n\t\tmonster_some_crypt();\r\n\t}\r\n\treturn sizeof(*pCmd);\r\n}\r\n\r\nstatic DWORD On_OPENHIVE(TCmd *pCmd, int pnum)\r\n{\r\n\tTCmdLocParam2 *p = (TCmdLocParam2 *)pCmd;\r\n\tif (gbBufferMsgs != 1) {\r\n\t\tAddMissile(p->x, p->y, p->wParam1, p->wParam2, 0, MIS_HIVEEXP2, TARGET_MONSTERS, pnum, 0, 0);\r\n\t\tTownOpenHive();\r\n\t}\r\n\treturn sizeof(*p);\r\n}\r\n\r\nstatic DWORD On_OPENCRYPT(TCmd *pCmd, int pnum)\r\n{\r\n\tif (gbBufferMsgs != 1) {\r\n\t\tTownOpenGrave();\r\n\t\tInitTownTriggers();\r\n\t\tif (currlevel == 0)\r\n\t\t\tPlaySFX(IS_SARC);\r\n\t}\r\n\treturn sizeof(*pCmd);\r\n}\r\n#endif\r\n\r\nDWORD ParseCmd(int pnum, TCmd *pCmd)\r\n{\r\n\tsbLastCmd = pCmd->bCmd;\r\n\tif (sgwPackPlrOffsetTbl[pnum] != 0 && sbLastCmd != CMD_ACK_PLRINFO && sbLastCmd != CMD_SEND_PLRINFO)\r\n\t\treturn 0;\r\n\r\n\tswitch (pCmd->bCmd) {\r\n\tcase CMD_SYNCDATA:\r\n\t\treturn On_SYNCDATA(pCmd, pnum);\r\n\tcase CMD_WALKXY:\r\n\t\treturn On_WALKXY(pCmd, pnum);\r\n\tcase CMD_ADDSTR:\r\n\t\treturn On_ADDSTR(pCmd, pnum);\r\n\tcase CMD_ADDDEX:\r\n\t\treturn On_ADDDEX(pCmd, pnum);\r\n\tcase CMD_ADDMAG:\r\n\t\treturn On_ADDMAG(pCmd, pnum);\r\n\tcase CMD_ADDVIT:\r\n\t\treturn On_ADDVIT(pCmd, pnum);\r\n\tcase CMD_SBSPELL:\r\n\t\treturn On_SBSPELL(pCmd, pnum);\r\n\tcase CMD_GOTOGETITEM:\r\n\t\treturn On_GOTOGETITEM(pCmd, pnum);\r\n\tcase CMD_REQUESTGITEM:\r\n\t\treturn On_REQUESTGITEM(pCmd, pnum);\r\n\tcase CMD_GETITEM:\r\n\t\treturn On_GETITEM(pCmd, pnum);\r\n\tcase CMD_GOTOAGETITEM:\r\n\t\treturn On_GOTOAGETITEM(pCmd, pnum);\r\n\tcase CMD_REQUESTAGITEM:\r\n\t\treturn On_REQUESTAGITEM(pCmd, pnum);\r\n\tcase CMD_AGETITEM:\r\n\t\treturn On_AGETITEM(pCmd, pnum);\r\n\tcase CMD_ITEMEXTRA:\r\n\t\treturn On_ITEMEXTRA(pCmd, pnum);\r\n\tcase CMD_PUTITEM:\r\n\t\treturn On_PUTITEM(pCmd, pnum);\r\n\tcase CMD_SYNCPUTITEM:\r\n\t\treturn On_SYNCPUTITEM(pCmd, pnum);\r\n\tcase CMD_RESPAWNITEM:\r\n\t\treturn On_RESPAWNITEM(pCmd, pnum);\r\n\tcase CMD_ATTACKXY:\r\n\t\treturn On_ATTACKXY(pCmd, pnum);\r\n\tcase CMD_SATTACKXY:\r\n\t\treturn On_SATTACKXY(pCmd, pnum);\r\n\tcase CMD_RATTACKXY:\r\n\t\treturn On_RATTACKXY(pCmd, pnum);\r\n\tcase CMD_SPELLXYD:\r\n\t\treturn On_SPELLXYD(pCmd, pnum);\r\n\tcase CMD_SPELLXY:\r\n\t\treturn On_SPELLXY(pCmd, pnum);\r\n\tcase CMD_TSPELLXY:\r\n\t\treturn On_TSPELLXY(pCmd, pnum);\r\n\tcase CMD_OPOBJXY:\r\n\t\treturn On_OPOBJXY(pCmd, pnum);\r\n\tcase CMD_DISARMXY:\r\n\t\treturn On_DISARMXY(pCmd, pnum);\r\n\tcase CMD_OPOBJT:\r\n\t\treturn On_OPOBJT(pCmd, pnum);\r\n\tcase CMD_ATTACKID:\r\n\t\treturn On_ATTACKID(pCmd, pnum);\r\n\tcase CMD_ATTACKPID:\r\n\t\treturn On_ATTACKPID(pCmd, pnum);\r\n\tcase CMD_RATTACKID:\r\n\t\treturn On_RATTACKID(pCmd, pnum);\r\n\tcase CMD_RATTACKPID:\r\n\t\treturn On_RATTACKPID(pCmd, pnum);\r\n\tcase CMD_SPELLID:\r\n\t\treturn On_SPELLID(pCmd, pnum);\r\n\tcase CMD_SPELLPID:\r\n\t\treturn On_SPELLPID(pCmd, pnum);\r\n\tcase CMD_TSPELLID:\r\n\t\treturn On_TSPELLID(pCmd, pnum);\r\n\tcase CMD_TSPELLPID:\r\n\t\treturn On_TSPELLPID(pCmd, pnum);\r\n\tcase CMD_KNOCKBACK:\r\n\t\treturn On_KNOCKBACK(pCmd, pnum);\r\n\tcase CMD_RESURRECT:\r\n\t\treturn On_RESURRECT(pCmd, pnum);\r\n\tcase CMD_HEALOTHER:\r\n\t\treturn On_HEALOTHER(pCmd, pnum);\r\n\tcase CMD_TALKXY:\r\n\t\treturn On_TALKXY(pCmd, pnum);\r\n\tcase CMD_DEBUG:\r\n\t\treturn On_DEBUG(pCmd, pnum);\r\n\tcase CMD_NEWLVL:\r\n\t\treturn On_NEWLVL(pCmd, pnum);\r\n\tcase CMD_WARP:\r\n\t\treturn On_WARP(pCmd, pnum);\r\n\tcase CMD_MONSTDEATH:\r\n\t\treturn On_MONSTDEATH(pCmd, pnum);\r\n\tcase CMD_KILLGOLEM:\r\n\t\treturn On_KILLGOLEM(pCmd, pnum);\r\n\tcase CMD_AWAKEGOLEM:\r\n\t\treturn On_AWAKEGOLEM(pCmd, pnum);\r\n\tcase CMD_MONSTDAMAGE:\r\n\t\treturn On_MONSTDAMAGE(pCmd, pnum);\r\n\tcase CMD_PLRDEAD:\r\n\t\treturn On_PLRDEAD(pCmd, pnum);\r\n\tcase CMD_PLRDAMAGE:\r\n\t\treturn On_PLRDAMAGE(pCmd, pnum);\r\n\tcase CMD_OPENDOOR:\r\n\t\treturn On_OPENDOOR(pCmd, pnum);\r\n\tcase CMD_CLOSEDOOR:\r\n\t\treturn On_CLOSEDOOR(pCmd, pnum);\r\n\tcase CMD_OPERATEOBJ:\r\n\t\treturn On_OPERATEOBJ(pCmd, pnum);\r\n\tcase CMD_PLROPOBJ:\r\n\t\treturn On_PLROPOBJ(pCmd, pnum);\r\n\tcase CMD_BREAKOBJ:\r\n\t\treturn On_BREAKOBJ(pCmd, pnum);\r\n\tcase CMD_CHANGEPLRITEMS:\r\n\t\treturn On_CHANGEPLRITEMS(pCmd, pnum);\r\n\tcase CMD_DELPLRITEMS:\r\n\t\treturn On_DELPLRITEMS(pCmd, pnum);\r\n\tcase CMD_PLRLEVEL:\r\n\t\treturn On_PLRLEVEL(pCmd, pnum);\r\n\tcase CMD_DROPITEM:\r\n\t\treturn On_DROPITEM(pCmd, pnum);\r\n\tcase CMD_ACK_PLRINFO:\r\n\t\treturn On_ACK_PLRINFO(pCmd, pnum);\r\n\tcase CMD_SEND_PLRINFO:\r\n\t\treturn On_SEND_PLRINFO(pCmd, pnum);\r\n\tcase CMD_PLAYER_JOINLEVEL:\r\n\t\treturn On_PLAYER_JOINLEVEL(pCmd, pnum);\r\n\tcase CMD_ACTIVATEPORTAL:\r\n\t\treturn On_ACTIVATEPORTAL(pCmd, pnum);\r\n\tcase CMD_DEACTIVATEPORTAL:\r\n\t\treturn On_DEACTIVATEPORTAL(pCmd, pnum);\r\n\tcase CMD_RETOWN:\r\n\t\treturn On_RETOWN(pCmd, pnum);\r\n\tcase CMD_SETSTR:\r\n\t\treturn On_SETSTR(pCmd, pnum);\r\n\tcase CMD_SETMAG:\r\n\t\treturn On_SETMAG(pCmd, pnum);\r\n\tcase CMD_SETDEX:\r\n\t\treturn On_SETDEX(pCmd, pnum);\r\n\tcase CMD_SETVIT:\r\n\t\treturn On_SETVIT(pCmd, pnum);\r\n\tcase CMD_STRING:\r\n\t\treturn On_STRING(pCmd, pnum);\r\n\tcase CMD_SYNCQUEST:\r\n\t\treturn On_SYNCQUEST(pCmd, pnum);\r\n\tcase CMD_ENDSHIELD:\r\n\t\treturn On_ENDSHIELD(pCmd, pnum);\r\n\tcase CMD_CHEAT_EXPERIENCE:\r\n\t\treturn On_CHEAT_EXPERIENCE(pCmd, pnum);\r\n\tcase CMD_CHEAT_SPELL_LEVEL:\r\n\t\treturn On_CHEAT_SPELL_LEVEL(pCmd, pnum);\r\n#ifndef HELLFIRE\r\n\tcase CMD_NOVA:\r\n\t\treturn On_NOVA(pCmd, pnum);\r\n\tcase CMD_SETSHIELD:\r\n\t\treturn On_SETSHIELD(pCmd, pnum);\r\n\tcase CMD_REMSHIELD:\r\n\t\treturn On_REMSHIELD(pCmd, pnum);\r\n#else\r\n\tcase CMD_REFLECT:\r\n\t\treturn On_REFLECT(pCmd, pnum);\r\n\tcase CMD_NAKRUL:\r\n\t\treturn On_NAKRUL(pCmd, pnum);\r\n\tcase CMD_OPENHIVE:\r\n\t\treturn On_OPENHIVE(pCmd, pnum);\r\n\tcase CMD_OPENCRYPT:\r\n\t\treturn On_OPENCRYPT(pCmd, pnum);\r\n#endif\r\n\t}\r\n\r\n\tif (pCmd->bCmd < CMD_DLEVEL_0 || pCmd->bCmd > CMD_DLEVEL_END) {\r\n\t\tSNetDropPlayer(pnum, LEAVE_DROP);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\treturn On_DLEVEL(pnum, pCmd);\r\n}\r\n"
  },
  {
    "path": "Source/msg.h",
    "content": "/**\r\n * @file msg.h\r\n *\r\n * Interface of function for sending and reciving network messages.\r\n */\r\n#ifndef __MSG_H__\r\n#define __MSG_H__\r\n\r\nextern BOOL deltaload;\r\nextern BYTE gbBufferMsgs;\r\nextern int dwRecCount;\r\n\r\nvoid msg_send_drop_pkt(int pnum, int reason);\r\nBOOL msg_wait_resync();\r\nvoid run_delta_info();\r\nvoid DeltaExportData(int pnum);\r\nvoid delta_init();\r\nvoid delta_kill_monster(int mi, BYTE x, BYTE y, BYTE bLevel);\r\nvoid delta_monster_hp(int mi, int hp, BYTE bLevel);\r\nvoid delta_sync_monster(const TSyncMonster *pSync, BYTE bLevel);\r\nBOOL delta_portal_inited(int i);\r\nBOOL delta_quest_inited(int i);\r\nvoid DeltaAddItem(int ii);\r\nvoid DeltaSaveLevel();\r\nvoid DeltaLoadLevel();\r\nvoid NetSendCmd(BOOL bHiPri, BYTE bCmd);\r\nvoid NetSendCmdGolem(BYTE mx, BYTE my, BYTE dir, BYTE menemy, int hp, BYTE cl);\r\nvoid NetSendCmdLoc(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y);\r\nvoid NetSendCmdLocParam1(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1);\r\nvoid NetSendCmdLocParam2(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2);\r\nvoid NetSendCmdLocParam3(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y, WORD wParam1, WORD wParam2, WORD wParam3);\r\nvoid NetSendCmdParam1(BOOL bHiPri, BYTE bCmd, WORD wParam1);\r\nvoid NetSendCmdParam2(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2);\r\nvoid NetSendCmdParam3(BOOL bHiPri, BYTE bCmd, WORD wParam1, WORD wParam2, WORD wParam3);\r\nvoid NetSendCmdQuest(BOOL bHiPri, BYTE q);\r\nvoid NetSendCmdGItem(BOOL bHiPri, BYTE bCmd, BYTE mast, BYTE pnum, BYTE ii);\r\nvoid NetSendCmdPItem(BOOL bHiPri, BYTE bCmd, BYTE x, BYTE y);\r\nvoid NetSendCmdChItem(BOOL bHiPri, BYTE bLoc);\r\nvoid NetSendCmdDelItem(BOOL bHiPri, BYTE bLoc);\r\nvoid NetSendCmdDItem(BOOL bHiPri, int ii);\r\nvoid NetSendCmdDamage(BOOL bHiPri, BYTE bPlr, DWORD dwDam);\r\n#ifdef HELLFIRE\r\nvoid NetSendCmdMonDmg(BOOL bHiPri, WORD bMon, DWORD dwDam);\r\n#endif\r\nvoid NetSendCmdString(int pmask, const char *pszStr);\r\nvoid delta_close_portal(int pnum);\r\nDWORD ParseCmd(int pnum, TCmd *pCmd);\r\n\r\n#endif /* __MSG_H__ */\r\n"
  },
  {
    "path": "Source/msgcmd.cpp",
    "content": "/**\r\n * @file msgcmd.cpp\r\n *\r\n * Functions for sending commands to Battle.net.\r\n *\r\n * See http://classic.battle.net/info/commands.shtml for a list of commands.\r\n */\r\n#ifndef HELLFIRE\r\n#include <new>      // for placement new\r\n#include <stddef.h> // for offsetof\r\n#include <typeinfo> // for typeid\r\n\r\n#include \"all.h\"\r\n#include \"list.h\"\r\n\r\n#define COMMAND_LEN 128\r\n\r\n// static float msgcmd_init_cpp_value = 0x7F800000;\r\n\r\nstruct EXTERNMESSAGE {\r\n\tLIST_LINK(EXTERNMESSAGE)\r\n\tm_Link;\r\n\tchar command[COMMAND_LEN];\r\n\tvoid *operator new(size_t n, DWORD extralen, int flags)\r\n\t{\r\n\t\treturn SMemAlloc(n + extralen, (char *)OBJECT_NAME(EXTERNMESSAGE), SLOG_OBJECT, flags | (1 << 3));\r\n\t}\r\n\tvoid operator delete(void *address, DWORD extralen, int flags)\r\n\t{\r\n\t}\r\n\tvoid operator delete(void *address)\r\n\t{\r\n\t}\r\n\tvoid *Delete(DWORD flags);\r\n};\r\n\r\nvoid *EXTERNMESSAGE::Delete(DWORD flags)\r\n{\r\n\t// BUGFIX: this is already called by m_Link's destructor\r\n\tm_Link.Unlink();\r\n\tthis->~EXTERNMESSAGE();\r\n\tif ((flags & 0x1) && this) {\r\n\t\tSMemFree(this, \"delete\", SLOG_FUNCTION, 0);\r\n\t}\r\n\treturn this;\r\n}\r\n\r\nstatic TList<EXTERNMESSAGE> sgChat_Cmd;\r\n\r\nvoid msgcmd_cmd_cleanup()\r\n{\r\n\tsgChat_Cmd.DeleteAll();\r\n}\r\n\r\nvoid msgcmd_send_chat()\r\n{\r\n\tDWORD tick;\r\n\tstruct EXTERNMESSAGE *msg = sgChat_Cmd.Head();\r\n\r\n\tif (msg) {\r\n\t\tstatic DWORD sgdwMsgCmdTimer;\r\n\t\ttick = GetTickCount();\r\n\t\tif (tick - sgdwMsgCmdTimer >= 2000) {\r\n\t\t\tsgdwMsgCmdTimer = tick;\r\n\t\t\tSNetSendServerChatCommand(msg->command);\r\n\t\t\tsgChat_Cmd.Remove(msg);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL msgcmd_add_server_cmd_W(const char *chat_message)\r\n{\r\n\tif (chat_message[0] != '/')\r\n\t\treturn FALSE;\r\n\tmsgcmd_add_server_cmd(chat_message);\r\n\treturn TRUE;\r\n}\r\n\r\nvoid msgcmd_add_server_cmd(const char *command)\r\n{\r\n\tsize_t len = strlen(command);\r\n\tif (len && ++len <= COMMAND_LEN) {\r\n\t\tstruct EXTERNMESSAGE *msg = sgChat_Cmd.Create();\r\n\t\tmemcpy(msg->command, command, len);\r\n\t}\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/msgcmd.h",
    "content": "/**\r\n * @file msgcmd.h\r\n *\r\n * Interface for sending commands to Battle.net.\r\n *\r\n * See http://classic.battle.net/info/commands.shtml for a list of commands.\r\n */\r\n#ifndef __MSGCMD_H__\r\n#define __MSGCMD_H__\r\n\r\nvoid msgcmd_cmd_cleanup();\r\nvoid msgcmd_send_chat();\r\nBOOL msgcmd_add_server_cmd_W(const char *chat_message);\r\nvoid msgcmd_add_server_cmd(const char *command);\r\n\r\n#endif /* __MSGCMD_H__ */\r\n"
  },
  {
    "path": "Source/multi.cpp",
    "content": "/**\r\n * @file multi.cpp\r\n *\r\n * Implementation of functions for keeping multiplaye games in sync.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n#include \"../DiabloUI/diabloui.h\"\r\n\r\nBOOLEAN gbSomebodyWonGameKludge;\r\n#ifdef _DEBUG\r\nDWORD gdwHistTicks;\r\n#endif\r\nTBuffer sgHiPriBuf;\r\nchar szPlayerDescript[128];\r\nWORD sgwPackPlrOffsetTbl[MAX_PLRS];\r\nPkPlayerStruct netplr[MAX_PLRS];\r\nBOOLEAN sgbPlayerTurnBitTbl[MAX_PLRS];\r\nBOOLEAN sgbPlayerLeftGameTbl[MAX_PLRS];\r\nint sgbSentThisCycle;\r\nBOOL gbShouldValidatePackage;\r\nBYTE gbActivePlayers;\r\nBOOLEAN gbGameDestroyed;\r\nBOOLEAN sgbSendDeltaTbl[MAX_PLRS];\r\n_gamedata sgGameInitInfo;\r\nBOOLEAN gbSelectProvider;\r\nint sglTimeoutStart;\r\nint sgdwPlayerLeftReasonTbl[MAX_PLRS];\r\nTBuffer sgLoPriBuf;\r\nDWORD sgdwGameLoops;\r\n/**\r\n * Specifies the maximum number of players in a game, where 1\r\n * represents a single player game and 4 represents a multi player game.\r\n */\r\nBYTE gbMaxPlayers;\r\nBOOLEAN sgbTimeout;\r\nchar szPlayerName[128];\r\nBYTE gbDeltaSender;\r\nBOOL sgbNetInited;\r\nint player_state[MAX_PLRS];\r\n\r\n/**\r\n * Contains the set of supported event types supported by the multiplayer\r\n * event handler.\r\n */\r\nconst int event_types[3] = {\r\n\tEVENT_TYPE_PLAYER_LEAVE_GAME,\r\n\tEVENT_TYPE_PLAYER_CREATE_GAME,\r\n\tEVENT_TYPE_PLAYER_MESSAGE\r\n};\r\n\r\n#ifdef _DEBUG\r\nvoid __cdecl dumphist(const char *pszFmt, ...)\r\n{\r\n\tstatic FILE *sgpHistFile = NULL;\r\n\tDWORD dwTicks;\r\n\tva_list va;\r\n\r\n\tva_start(va, pszFmt);\r\n\r\n\tif (sgpHistFile == NULL) {\r\n\t\tsgpHistFile = fopen(\"c:\\\\dumphist.txt\", \"wb\");\r\n\t\tif (sgpHistFile == NULL) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tdwTicks = GetTickCount();\r\n\tfprintf(sgpHistFile, \"%4u.%02u  \", (dwTicks - gdwHistTicks) / 1000, (dwTicks - gdwHistTicks) % 1000 / 10);\r\n\tvfprintf(sgpHistFile, pszFmt, va);\r\n\tfprintf(\r\n\t    sgpHistFile,\r\n\t    \"\\r\\n          (%d,%d)(%d,%d)(%d,%d)(%d,%d)\\r\\n\",\r\n\t    plr[0].plractive,\r\n\t    player_state[0],\r\n\t    plr[1].plractive,\r\n\t    player_state[1],\r\n\t    plr[2].plractive,\r\n\t    player_state[2],\r\n\t    plr[3].plractive,\r\n\t    player_state[3]);\r\n\tfflush(sgpHistFile);\r\n}\r\n#endif\r\n\r\nstatic void buffer_init(TBuffer *pBuf)\r\n{\r\n\tpBuf->dwNextWriteOffset = 0;\r\n\tpBuf->bData[0] = 0;\r\n}\r\n\r\n// Microsoft VisualC 2-11/net runtime\r\nstatic int multi_check_pkt_valid(TBuffer *pBuf)\r\n{\r\n\treturn pBuf->dwNextWriteOffset == 0;\r\n}\r\n\r\nstatic void multi_copy_packet(TBuffer *buf, void *packet, BYTE size)\r\n{\r\n\tBYTE *p;\r\n\r\n\tif (buf->dwNextWriteOffset + size + 2 > 0x1000) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tp = &buf->bData[buf->dwNextWriteOffset];\r\n\tbuf->dwNextWriteOffset += size + 1;\r\n\t*p = size;\r\n\tp++;\r\n\tmemcpy(p, packet, size);\r\n\tp[size] = 0;\r\n}\r\n\r\nstatic BYTE *multi_recv_packet(TBuffer *pBuf, BYTE *body, int *size)\r\n{\r\n\tBYTE *src_ptr;\r\n\tsize_t chunk_size;\r\n\r\n\tif (pBuf->dwNextWriteOffset != 0) {\r\n\t\tsrc_ptr = pBuf->bData;\r\n\t\twhile (TRUE) {\r\n\t\t\tif (*src_ptr == 0)\r\n\t\t\t\tbreak;\r\n\t\t\tchunk_size = *src_ptr;\r\n\t\t\tif (chunk_size > *size)\r\n\t\t\t\tbreak;\r\n\t\t\tsrc_ptr++;\r\n\t\t\tmemcpy(body, src_ptr, chunk_size);\r\n\t\t\tbody += chunk_size;\r\n\t\t\tsrc_ptr += chunk_size;\r\n\t\t\t*size -= chunk_size;\r\n\t\t}\r\n\t\tmemcpy(pBuf->bData, src_ptr, (pBuf->bData - src_ptr) + pBuf->dwNextWriteOffset + 1);\r\n\t\tpBuf->dwNextWriteOffset += (pBuf->bData - src_ptr);\r\n\t\treturn body;\r\n\t}\r\n\treturn body;\r\n}\r\n\r\nstatic void NetRecvPlrData(TPkt *pkt)\r\n{\r\n\tpkt->hdr.wCheck = 'ip';\r\n\tpkt->hdr.px = plr[myplr]._px;\r\n\tpkt->hdr.py = plr[myplr]._py;\r\n\tpkt->hdr.targx = plr[myplr]._ptargx;\r\n\tpkt->hdr.targy = plr[myplr]._ptargy;\r\n\tpkt->hdr.php = plr[myplr]._pHitPoints;\r\n\tpkt->hdr.pmhp = plr[myplr]._pMaxHP;\r\n\tpkt->hdr.bstr = plr[myplr]._pBaseStr;\r\n\tpkt->hdr.bmag = plr[myplr]._pBaseMag;\r\n\tpkt->hdr.bdex = plr[myplr]._pBaseDex;\r\n}\r\n\r\nvoid multi_msg_add(BYTE *pbMsg, BYTE bLen)\r\n{\r\n\tif (pbMsg && bLen) {\r\n\t\ttmsg_add(pbMsg, bLen);\r\n\t}\r\n}\r\n\r\nstatic void multi_send_packet(void *packet, BYTE dwSize)\r\n{\r\n\tTPkt pkt;\r\n\r\n\tNetRecvPlrData(&pkt);\r\n\tpkt.hdr.wLen = dwSize + sizeof(pkt.hdr);\r\n\tmemcpy(pkt.body, packet, dwSize);\r\n\tif (!SNetSendMessage(myplr, &pkt.hdr, pkt.hdr.wLen))\r\n\t\tnthread_terminate_game(\"SNetSendMessage0\");\r\n}\r\n\r\nvoid NetSendLoPri(BYTE *pbMsg, BYTE bLen)\r\n{\r\n\tif (pbMsg && bLen) {\r\n\t\tmulti_copy_packet(&sgLoPriBuf, pbMsg, bLen);\r\n\t\tmulti_send_packet(pbMsg, bLen);\r\n\t}\r\n}\r\n\r\nvoid NetSendHiPri(BYTE *pbMsg, BYTE bLen)\r\n{\r\n\tBYTE *hipri_body;\r\n\tBYTE *lowpri_body;\r\n\tDWORD len;\r\n\tTPkt pkt;\r\n\tint size;\r\n\r\n\tif (pbMsg && bLen) {\r\n\t\tmulti_copy_packet(&sgHiPriBuf, pbMsg, bLen);\r\n\t\tmulti_send_packet(pbMsg, bLen);\r\n\t}\r\n\tif (!gbShouldValidatePackage) {\r\n\t\tgbShouldValidatePackage = TRUE;\r\n\t\tNetRecvPlrData(&pkt);\r\n\t\tsize = gdwNormalMsgSize - sizeof(TPktHdr);\r\n\t\thipri_body = multi_recv_packet(&sgHiPriBuf, pkt.body, &size);\r\n\t\tlowpri_body = multi_recv_packet(&sgLoPriBuf, hipri_body, &size);\r\n\t\tsize = sync_all_monsters(lowpri_body, size);\r\n\t\tlen = gdwNormalMsgSize - size;\r\n\t\tpkt.hdr.wLen = len;\r\n\t\tif (!SNetSendMessage(-2, &pkt.hdr, len))\r\n\t\t\tnthread_terminate_game(\"SNetSendMessage\");\r\n\t}\r\n}\r\n\r\nvoid multi_send_msg_packet(int pmask, BYTE *src, BYTE len)\r\n{\r\n\tDWORD v, p, t;\r\n\tTPkt pkt;\r\n\r\n\tNetRecvPlrData(&pkt);\r\n\tt = len + sizeof(pkt.hdr);\r\n\tpkt.hdr.wLen = t;\r\n\tmemcpy(pkt.body, src, len);\r\n\tfor (v = 1, p = 0; p < MAX_PLRS; p++, v <<= 1) {\r\n\t\tif (v & pmask) {\r\n\t\t\tif (!SNetSendMessage(p, &pkt.hdr, t) && DERROR() != STORM_ERROR_INVALID_PLAYER) {\r\n\t\t\t\tnthread_terminate_game(\"SNetSendMessage\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void multi_mon_seeds()\r\n{\r\n\tint i;\r\n\tDWORD l;\r\n\r\n\tsgdwGameLoops++;\r\n\tl = _rotr(sgdwGameLoops, 8);\r\n\t// BUGFIX: the monster AI seed is updated each logic tick for all monsters, even dead or non-existent ones.\r\n\tfor (i = 0; i < MAXMONSTERS; i++)\r\n\t\tmonster[i]._mAISeed = l + i;\r\n}\r\n\r\nstatic void multi_handle_turn_upper_bit(int pnum)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (player_state[i] & PS_CONNECTED && i != pnum)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tif (myplr == i) {\r\n\t\tsgbSendDeltaTbl[pnum] = TRUE;\r\n\t} else if (myplr == pnum) {\r\n\t\tgbDeltaSender = i;\r\n\t}\r\n}\r\n\r\nstatic void multi_parse_turn(int pnum, int turn)\r\n{\r\n\tDWORD absTurns;\r\n\r\n\tif (turn >> 31)\r\n\t\tmulti_handle_turn_upper_bit(pnum);\r\n\tabsTurns = turn & 0x7FFFFFFF;\r\n\tif (sgbSentThisCycle < gdwTurnsInTransit + absTurns) {\r\n\t\tif (absTurns >= 0x7FFFFFFF)\r\n\t\t\tabsTurns &= 0xFFFF;\r\n\t\tsgbSentThisCycle = absTurns + gdwTurnsInTransit;\r\n\t\tsgdwGameLoops = 4 * absTurns * sgbNetUpdateRate;\r\n\t}\r\n}\r\n\r\nvoid multi_msg_countdown()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (player_state[i] & PS_TURN_ARRIVED) {\r\n\t\t\tif (gdwMsgLenTbl[i] == 4)\r\n\t\t\t\tmulti_parse_turn(i, *(DWORD *)glpMsgTbl[i]);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void multi_player_left_msg(int pnum, int left)\r\n{\r\n\tconst char *pszFmt;\r\n\r\n\tif (plr[pnum].plractive) {\r\n\t\tRemovePlrFromMap(pnum);\r\n\t\tRemovePortalMissile(pnum);\r\n\t\tDeactivatePortal(pnum);\r\n\t\tdelta_close_portal(pnum);\r\n\t\tRemovePlrMissiles(pnum);\r\n\t\tif (left) {\r\n\t\t\tpszFmt = \"Player '%s' just left the game\";\r\n\t\t\tswitch (sgdwPlayerLeftReasonTbl[pnum]) {\r\n\t\t\tcase LEAVE_ENDING:\r\n\t\t\t\tpszFmt = \"Player '%s' killed Diablo and left the game!\";\r\n\t\t\t\tgbSomebodyWonGameKludge = TRUE;\r\n\t\t\t\tbreak;\r\n\t\t\tcase LEAVE_DROP:\r\n\t\t\t\tpszFmt = \"Player '%s' dropped due to timeout\";\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tEventPlrMsg(pszFmt, plr[pnum]._pName);\r\n\t\t}\r\n\t\tplr[pnum].plractive = FALSE;\r\n\t\tplr[pnum]._pName[0] = '\\0';\r\n\t\tgbActivePlayers--;\r\n\t}\r\n}\r\n\r\nstatic void multi_clear_left_tbl()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (sgbPlayerLeftGameTbl[i]) {\r\n\t\t\tif (gbBufferMsgs == 1)\r\n\t\t\t\tmsg_send_drop_pkt(i, sgdwPlayerLeftReasonTbl[i]);\r\n\t\t\telse\r\n\t\t\t\tmulti_player_left_msg(i, 1);\r\n\r\n\t\t\tsgbPlayerLeftGameTbl[i] = FALSE;\r\n\t\t\tsgdwPlayerLeftReasonTbl[i] = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid multi_player_left(int pnum, int reason)\r\n{\r\n\tsgbPlayerLeftGameTbl[pnum] = TRUE;\r\n\tsgdwPlayerLeftReasonTbl[pnum] = reason;\r\n\tmulti_clear_left_tbl();\r\n}\r\n\r\nvoid multi_net_ping()\r\n{\r\n\tsgbTimeout = TRUE;\r\n\tsglTimeoutStart = GetTickCount();\r\n}\r\n\r\nstatic void multi_check_drop_player()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (!(player_state[i] & PS_ACTIVE) && player_state[i] & PS_CONNECTED) {\r\n\t\t\tSNetDropPlayer(i, LEAVE_DROP);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void multi_begin_timeout()\r\n{\r\n\tint i, nTicks, nState, nLowestActive, nLowestPlayer;\r\n\tBYTE bGroupPlayers, bGroupCount;\r\n\r\n\tif (!sgbTimeout) {\r\n\t\treturn;\r\n\t}\r\n#ifdef _DEBUG\r\n\tif (debug_mode_key_i) {\r\n\t\treturn;\r\n\t}\r\n#endif\r\n\r\n\tnTicks = GetTickCount() - sglTimeoutStart;\r\n\tif (nTicks > 20000) {\r\n\t\tgbRunGame = FALSE;\r\n\t\treturn;\r\n\t}\r\n\tif (nTicks < 10000) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tnLowestActive = -1;\r\n\tnLowestPlayer = -1;\r\n\tbGroupPlayers = 0;\r\n\tbGroupCount = 0;\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tnState = player_state[i];\r\n\t\tif (nState & PS_CONNECTED) {\r\n\t\t\tif (nLowestPlayer == -1) {\r\n\t\t\t\tnLowestPlayer = i;\r\n\t\t\t}\r\n\t\t\tif (nState & PS_ACTIVE) {\r\n\t\t\t\tbGroupPlayers++;\r\n\t\t\t\tif (nLowestActive == -1) {\r\n\t\t\t\t\tnLowestActive = i;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tbGroupCount++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/// ASSERT: assert(bGroupPlayers);\r\n\t/// ASSERT: assert(nLowestActive != -1);\r\n\t/// ASSERT: assert(nLowestPlayer != -1);\r\n\r\n#ifdef _DEBUG\r\n\tdumphist(\r\n\t    \"(%d) grp:%d ngrp:%d lowp:%d lowa:%d\",\r\n\t    myplr,\r\n\t    bGroupPlayers,\r\n\t    bGroupCount,\r\n\t    nLowestPlayer,\r\n\t    nLowestActive);\r\n#endif\r\n\r\n\tif (bGroupPlayers < bGroupCount) {\r\n\t\tgbGameDestroyed = TRUE;\r\n\t} else if (bGroupPlayers == bGroupCount) {\r\n\t\tif (nLowestPlayer != nLowestActive) {\r\n\t\t\tgbGameDestroyed = TRUE;\r\n\t\t} else if (nLowestActive == myplr) {\r\n\t\t\tmulti_check_drop_player();\r\n\t\t}\r\n\t} else if (nLowestActive == myplr) {\r\n\t\tmulti_check_drop_player();\r\n\t}\r\n}\r\n\r\n/**\r\n * @return Always true for singleplayer\r\n */\r\nint multi_handle_delta()\r\n{\r\n\tint i;\r\n\tBOOL received;\r\n\r\n\tif (gbGameDestroyed) {\r\n\t\tgbRunGame = FALSE;\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif (sgbSendDeltaTbl[i]) {\r\n\t\t\tsgbSendDeltaTbl[i] = FALSE;\r\n\t\t\tDeltaExportData(i);\r\n\t\t}\r\n\t}\r\n\r\n\tsgbSentThisCycle = nthread_send_and_recv_turn(sgbSentThisCycle, 1);\r\n\tif (!nthread_recv_turns(&received)) {\r\n\t\tmulti_begin_timeout();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tsgbTimeout = FALSE;\r\n\tif (received) {\r\n\t\tif (!gbShouldValidatePackage) {\r\n\t\t\tNetSendHiPri(0, 0);\r\n\t\t\tgbShouldValidatePackage = FALSE;\r\n\t\t} else {\r\n\t\t\tgbShouldValidatePackage = FALSE;\r\n\t\t\tif (!multi_check_pkt_valid(&sgHiPriBuf))\r\n\t\t\t\tNetSendHiPri(0, 0);\r\n\t\t}\r\n\t}\r\n\tmulti_mon_seeds();\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void multi_handle_all_packets(int pnum, BYTE *pData, int nSize)\r\n{\r\n\tint nLen;\r\n\r\n\twhile (nSize != 0) {\r\n\t\tnLen = ParseCmd(pnum, (TCmd *)pData);\r\n\t\tif (nLen == 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tpData += nLen;\r\n\t\tnSize -= nLen;\r\n\t}\r\n}\r\n\r\nstatic void multi_process_tmsgs()\r\n{\r\n\tint cnt;\r\n\tTPkt pkt;\r\n\r\n\twhile (cnt = tmsg_get((BYTE *)&pkt, 512)) {\r\n\t\tmulti_handle_all_packets(myplr, (BYTE *)&pkt, cnt);\r\n\t}\r\n}\r\n\r\nvoid multi_process_network_packets()\r\n{\r\n\tint dx, dy;\r\n\tTPktHdr *pkt;\r\n\tDWORD dwMsgSize;\r\n\tDWORD dwID;\r\n\tBOOL cond;\r\n\tchar *data;\r\n\r\n\tmulti_clear_left_tbl();\r\n\tmulti_process_tmsgs();\r\n\twhile (SNetReceiveMessage((int *)&dwID, &data, (int *)&dwMsgSize)) {\r\n\t\tdwRecCount++;\r\n\t\tmulti_clear_left_tbl();\r\n\t\tpkt = (TPktHdr *)data;\r\n\t\tif (dwMsgSize < sizeof(TPktHdr))\r\n\t\t\tcontinue;\r\n\t\tif (dwID >= MAX_PLRS)\r\n\t\t\tcontinue;\r\n\t\tif (pkt->wCheck != 'ip')\r\n\t\t\tcontinue;\r\n\t\tif (pkt->wLen != dwMsgSize)\r\n\t\t\tcontinue;\r\n\t\tplr[dwID]._pownerx = pkt->px;\r\n\t\tplr[dwID]._pownery = pkt->py;\r\n\t\tif (dwID != myplr) {\r\n\t\t\t// ASSERT: gbBufferMsgs != BUFFER_PROCESS (2)\r\n\t\t\tplr[dwID]._pHitPoints = pkt->php;\r\n\t\t\tplr[dwID]._pMaxHP = pkt->pmhp;\r\n\t\t\tcond = gbBufferMsgs == 1;\r\n\t\t\tplr[dwID]._pBaseStr = pkt->bstr;\r\n\t\t\tplr[dwID]._pBaseMag = pkt->bmag;\r\n\t\t\tplr[dwID]._pBaseDex = pkt->bdex;\r\n\t\t\tif (!cond && plr[dwID].plractive && plr[dwID]._pHitPoints != 0) {\r\n\t\t\t\tif (currlevel == plr[dwID].plrlevel && !plr[dwID]._pLvlChanging) {\r\n\t\t\t\t\tdx = abs(plr[dwID]._px - pkt->px);\r\n\t\t\t\t\tdy = abs(plr[dwID]._py - pkt->py);\r\n\t\t\t\t\tif ((dx > 3 || dy > 3) && dPlayer[pkt->px][pkt->py] == 0) {\r\n\t\t\t\t\t\tFixPlrWalkTags(dwID);\r\n\t\t\t\t\t\tplr[dwID]._poldx = plr[dwID]._px;\r\n\t\t\t\t\t\tplr[dwID]._poldy = plr[dwID]._py;\r\n\t\t\t\t\t\tFixPlrWalkTags(dwID);\r\n\t\t\t\t\t\tplr[dwID]._px = pkt->px;\r\n\t\t\t\t\t\tplr[dwID]._py = pkt->py;\r\n\t\t\t\t\t\tplr[dwID]._pfutx = pkt->px;\r\n\t\t\t\t\t\tplr[dwID]._pfuty = pkt->py;\r\n\t\t\t\t\t\tdPlayer[plr[dwID]._px][plr[dwID]._py] = dwID + 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdx = abs(plr[dwID]._pfutx - plr[dwID]._px);\r\n\t\t\t\t\tdy = abs(plr[dwID]._pfuty - plr[dwID]._py);\r\n\t\t\t\t\tif (dx > 1 || dy > 1) {\r\n\t\t\t\t\t\tplr[dwID]._pfutx = plr[dwID]._px;\r\n\t\t\t\t\t\tplr[dwID]._pfuty = plr[dwID]._py;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tMakePlrPath(dwID, pkt->targx, pkt->targy, TRUE);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplr[dwID]._px = pkt->px;\r\n\t\t\t\t\tplr[dwID]._py = pkt->py;\r\n\t\t\t\t\tplr[dwID]._pfutx = pkt->px;\r\n\t\t\t\t\tplr[dwID]._pfuty = pkt->py;\r\n\t\t\t\t\tplr[dwID]._ptargx = pkt->targx;\r\n\t\t\t\t\tplr[dwID]._ptargy = pkt->targy;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tmulti_handle_all_packets(dwID, (BYTE *)(pkt + 1), dwMsgSize - sizeof(TPktHdr));\r\n\t}\r\n\tif (DERROR() != STORM_ERROR_NO_MESSAGES_WAITING)\r\n\t\tnthread_terminate_game(\"SNetReceiveMsg\");\r\n}\r\n\r\nvoid multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen)\r\n{\r\n\tDWORD dwOffset, dwBody, dwMsg;\r\n\tTPkt pkt;\r\n\tTCmdPlrInfoHdr *p;\r\n\r\n\t/// ASSERT: assert(pnum != myplr);\r\n\t/// ASSERT: assert(pbSrc);\r\n\t/// ASSERT: assert(dwLen <= 0x0ffff);\r\n\r\n\tdwOffset = 0;\r\n\r\n\twhile (dwLen != 0) {\r\n\t\tpkt.hdr.wCheck = 'ip';\r\n\t\tpkt.hdr.px = 0;\r\n\t\tpkt.hdr.py = 0;\r\n\t\tpkt.hdr.targx = 0;\r\n\t\tpkt.hdr.targy = 0;\r\n\t\tpkt.hdr.php = 0;\r\n\t\tpkt.hdr.pmhp = 0;\r\n\t\tpkt.hdr.bstr = 0;\r\n\t\tpkt.hdr.bmag = 0;\r\n\t\tpkt.hdr.bdex = 0;\r\n\t\tp = (TCmdPlrInfoHdr *)pkt.body;\r\n\t\tp->bCmd = bCmd;\r\n\t\tp->wOffset = dwOffset;\r\n\t\tdwBody = gdwLargestMsgSize - sizeof(pkt.hdr) - sizeof(*p);\r\n\t\tif (dwLen < dwBody) {\r\n\t\t\tdwBody = dwLen;\r\n\t\t}\r\n\t\t/// ASSERT: assert(dwBody <= 0x0ffff);\r\n\t\tp->wBytes = dwBody;\r\n\t\tmemcpy(&pkt.body[sizeof(*p)], pbSrc, p->wBytes);\r\n\t\tdwMsg = sizeof(pkt.hdr);\r\n\t\tdwMsg += sizeof(*p);\r\n\t\tdwMsg += p->wBytes;\r\n\t\tpkt.hdr.wLen = dwMsg;\r\n\t\tif (!SNetSendMessage(pnum, &pkt, dwMsg)) {\r\n\t\t\tnthread_terminate_game(\"SNetSendMessage2\");\r\n\t\t\treturn;\r\n\t\t}\r\n#if 0\r\n\t\tif((DWORD)pnum >= MAX_PLRS) {\r\n\t\t\tif(myplr != 0) {\r\n\t\t\t\tdebug_plr_tbl[0]++;\r\n\t\t\t}\r\n\t\t\tif(myplr != 1) {\r\n\t\t\t\tdebug_plr_tbl[1]++;\r\n\t\t\t}\r\n\t\t\tif(myplr != 2) {\r\n\t\t\t\tdebug_plr_tbl[2]++;\r\n\t\t\t}\r\n\t\t\tif(myplr != 3) {\r\n\t\t\t\tdebug_plr_tbl[3]++;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdebug_plr_tbl[pnum]++;\r\n\t\t}\r\n#endif\r\n\t\tpbSrc += p->wBytes;\r\n\t\tdwLen -= p->wBytes;\r\n\t\tdwOffset += p->wBytes;\r\n\t}\r\n}\r\n\r\nstatic void multi_send_pinfo(int pnum, char cmd)\r\n{\r\n\tPkPlayerStruct pkplr;\r\n\r\n#ifdef HELLFIRE\r\n\tPackPlayer(&pkplr, myplr);\r\n#else\r\n\tPackPlayer(&pkplr, myplr, TRUE);\r\n#endif\r\n\tdthread_send_delta(pnum, cmd, &pkplr, sizeof(pkplr));\r\n}\r\n\r\nstatic int InitLevelType(int l)\r\n{\r\n\tif (l == 0)\r\n\t\treturn DTYPE_TOWN;\r\n\tif (l >= 1 && l <= 4)\r\n\t\treturn DTYPE_CATHEDRAL;\r\n\tif (l >= 5 && l <= 8)\r\n\t\treturn DTYPE_CATACOMBS;\r\n\tif (l >= 9 && l <= 12)\r\n\t\treturn DTYPE_CAVES;\r\n\r\n#ifdef HELLFIRE\r\n\tif (l >= 13 && l <= 16)\r\n\t\treturn DTYPE_HELL;\r\n\tif (l >= 21 && l <= 24)\r\n\t\treturn DTYPE_CATHEDRAL; // Crypt\r\n\tif (l >= 17 && l <= 20)\r\n\t\treturn DTYPE_CAVES; // Hive\r\n\r\n\treturn DTYPE_CATHEDRAL;\r\n#else\r\n\treturn DTYPE_HELL;\r\n#endif\r\n}\r\n\r\nstatic void SetupLocalCoords()\r\n{\r\n\tint x, y;\r\n\r\n\tif (!leveldebug || gbMaxPlayers > 1) {\r\n\t\tcurrlevel = 0;\r\n\t\tleveltype = DTYPE_TOWN;\r\n\t\tsetlevel = FALSE;\r\n\t}\r\n\tx = 75;\r\n\ty = 68;\r\n#ifdef _DEBUG\r\n\tif (debug_mode_key_inverted_v || debug_mode_key_d) {\r\n\t\tx = 49;\r\n\t\ty = 23;\r\n\t}\r\n#endif\r\n\tx += plrxoff[myplr];\r\n\ty += plryoff[myplr];\r\n\tplr[myplr]._px = x;\r\n\tplr[myplr]._py = y;\r\n\tplr[myplr]._pfutx = x;\r\n\tplr[myplr]._pfuty = y;\r\n\tplr[myplr]._ptargx = x;\r\n\tplr[myplr]._ptargy = y;\r\n\tplr[myplr].plrlevel = currlevel;\r\n\tplr[myplr]._pLvlChanging = TRUE;\r\n\tplr[myplr].pLvlLoad = 0;\r\n\tplr[myplr]._pmode = PM_NEWLVL;\r\n\tplr[myplr].destAction = ACTION_NONE;\r\n}\r\n\r\nstatic BOOL multi_upgrade(BOOL *pfExitProgram)\r\n{\r\n\tBOOL result;\r\n\tint status;\r\n\r\n\tSNetPerformUpgrade((LPDWORD)&status);\r\n\tresult = TRUE;\r\n\tif (status && status != 1) {\r\n\t\tif (status != 2) {\r\n\t\t\tif (status == -1) {\r\n\t\t\t\tDrawDlg(\"Network upgrade failed\");\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t*pfExitProgram = 1;\r\n\t\t}\r\n\r\n\t\tresult = FALSE;\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nstatic void __stdcall multi_handle_events(_SNETEVENT *pEvt)\r\n{\r\n\tDWORD LeftReason;\r\n\t_gamedata *gameData;\r\n\r\n\tswitch (pEvt->eventid) {\r\n\tcase EVENT_TYPE_PLAYER_CREATE_GAME:\r\n\t\tgameData = (_gamedata *)pEvt->data;\r\n\t\tsgGameInitInfo.dwSeed = gameData->dwSeed;\r\n\t\tsgGameInitInfo.bDiff = gameData->bDiff;\r\n\t\tsgbPlayerTurnBitTbl[pEvt->playerid] = TRUE;\r\n\t\tbreak;\r\n\tcase EVENT_TYPE_PLAYER_LEAVE_GAME:\r\n\t\tsgbPlayerLeftGameTbl[pEvt->playerid] = TRUE;\r\n\t\tsgbPlayerTurnBitTbl[pEvt->playerid] = FALSE;\r\n\r\n\t\tLeftReason = 0;\r\n\t\tif (pEvt->data && pEvt->databytes >= sizeof(DWORD))\r\n\t\t\tLeftReason = *(DWORD *)pEvt->data;\r\n\t\tsgdwPlayerLeftReasonTbl[pEvt->playerid] = LeftReason;\r\n\t\tif (LeftReason == LEAVE_ENDING)\r\n\t\t\tgbSomebodyWonGameKludge = TRUE;\r\n\r\n\t\tsgbSendDeltaTbl[pEvt->playerid] = FALSE;\r\n\t\tdthread_remove_player(pEvt->playerid);\r\n\r\n\t\tif (gbDeltaSender == pEvt->playerid)\r\n\t\t\tgbDeltaSender = MAX_PLRS;\r\n\t\tbreak;\r\n\tcase EVENT_TYPE_PLAYER_MESSAGE:\r\n\t\tErrorPlrMsg((char *)pEvt->data);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nstatic void multi_event_handler(BOOL add)\r\n{\r\n\tDWORD i;\r\n\tBOOL(STORMAPI * fn)\r\n\t(int, SEVTHANDLER);\r\n\r\n\tif (add)\r\n\t\tfn = SNetRegisterEventHandler;\r\n\telse\r\n\t\tfn = SNetUnregisterEventHandler;\r\n\r\n\tfor (i = 0; i < 3; i++) {\r\n\t\tif (!fn(event_types[i], multi_handle_events) && add) {\r\n\t\t\tapp_fatal(\"SNetRegisterEventHandler:\\n%s\", TraceLastError());\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid NetClose()\r\n{\r\n\tif (!sgbNetInited) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tsgbNetInited = FALSE;\r\n\tnthread_cleanup();\r\n\tdthread_cleanup();\r\n\ttmsg_cleanup();\r\n\tmulti_event_handler(FALSE);\r\n\tSNetLeaveGame(3);\r\n#ifndef HELLFIRE\r\n\tmsgcmd_cmd_cleanup();\r\n#endif\r\n\tif (gbMaxPlayers > 1)\r\n\t\tSleep(2000);\r\n}\r\n\r\nBOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram)\r\n{\r\n\tint i;\r\n\t_SNETPROGRAMDATA ProgramData;\r\n\t_SNETUIDATA UiData;\r\n\t_SNETPLAYERDATA plrdata;\r\n\tunsigned int len;\r\n\r\n\twhile (1) {\r\n\t\t*pfExitProgram = FALSE;\r\n#ifdef HELLFIRE\r\n\t\tpfile_create_player_description(NULL, 0);\r\n#endif\r\n\t\tSetRndSeed(0);\r\n\t\tsgGameInitInfo.dwSeed = time(NULL);\r\n\t\tsgGameInitInfo.bDiff = gnDifficulty;\r\n\t\tmemset(&ProgramData, 0, sizeof(ProgramData));\r\n\t\tProgramData.size = sizeof(ProgramData);\r\n#ifdef SPAWN\r\n\t\tProgramData.programname = \"Diablo Shareware\";\r\n#else\r\n\t\tProgramData.programname = PROGRAM_NAME;\r\n#endif\r\n\t\tProgramData.programdescription = gszVersionNumber;\r\n\t\tProgramData.programid = GAME_ID;\r\n\t\tProgramData.versionid = GAME_VERSION;\r\n\t\tProgramData.maxplayers = MAX_PLRS;\r\n\t\tProgramData.initdata = &sgGameInitInfo;\r\n\t\tProgramData.initdatabytes = sizeof(sgGameInitInfo);\r\n\t\tProgramData.optcategorybits = 15;\r\n#ifndef HELLFIRE\r\n\t\tProgramData.lcid = 1033; /* LANG_ENGLISH */\r\n#endif\r\n\t\tmemset(&plrdata, 0, sizeof(plrdata));\r\n\t\tplrdata.size = sizeof(plrdata);\r\n\t\tmemset(&UiData, 0, sizeof(UiData));\r\n\t\tUiData.size = sizeof(UiData);\r\n\t\tUiData.parentwindow = SDrawGetFrameWindow(NULL);\r\n\t\tUiData.artcallback = (void (*)())UiArtCallback;\r\n\t\tUiData.createcallback = (void (*)())UiCreateGameCallback;\r\n\t\tUiData.drawdesccallback = (void (*)())UiDrawDescCallback;\r\n\t\tUiData.messageboxcallback = (void (*)())UiMessageBoxCallback;\r\n\t\tUiData.soundcallback = (void (*)())UiSoundCallback;\r\n\t\tUiData.authcallback = (void (*)())UiAuthCallback;\r\n\t\tUiData.getdatacallback = (void (*)())UiGetDataCallback;\r\n\t\tUiData.categorycallback = (void (*)())UiCategoryCallback;\r\n\t\tUiData.selectnamecallback = mainmenu_select_hero_dialog;\r\n\t\tUiData.changenamecallback = (void (*)())mainmenu_change_name;\r\n\t\tUiData.profilebitmapcallback = (void (*)())UiProfileDraw;\r\n\t\tUiData.profilecallback = (void (*)())UiProfileCallback;\r\n\t\tUiData.profilefields = UiProfileGetString();\r\n\t\tmemset(sgbPlayerTurnBitTbl, 0, sizeof(sgbPlayerTurnBitTbl));\r\n\t\tgbGameDestroyed = FALSE;\r\n\t\tmemset(sgbPlayerLeftGameTbl, 0, sizeof(sgbPlayerLeftGameTbl));\r\n\t\tmemset(sgdwPlayerLeftReasonTbl, 0, sizeof(sgdwPlayerLeftReasonTbl));\r\n\t\tmemset(sgbSendDeltaTbl, 0, sizeof(sgbSendDeltaTbl));\r\n\t\tmemset(plr, 0, sizeof(plr));\r\n\t\tmemset(sgwPackPlrOffsetTbl, 0, sizeof(sgwPackPlrOffsetTbl));\r\n\t\tSNetSetBasePlayer(0);\r\n\t\tif (bSinglePlayer) {\r\n\t\t\tif (!multi_init_single(&ProgramData, &plrdata, &UiData))\r\n\t\t\t\treturn FALSE;\r\n\t\t} else {\r\n\t\t\tif (!multi_init_multi(&ProgramData, &plrdata, &UiData, pfExitProgram))\r\n\t\t\t\treturn FALSE;\r\n\t\t}\r\n#ifdef _DEBUG\r\n\t\tgdwHistTicks = GetTickCount();\r\n\t\tdumphist(\"(%d) new game started\", myplr);\r\n#endif\r\n\t\tsgbNetInited = TRUE;\r\n\t\tsgbTimeout = FALSE;\r\n\t\tdelta_init();\r\n\t\tInitPlrMsg();\r\n\t\tbuffer_init(&sgHiPriBuf);\r\n\t\tbuffer_init(&sgLoPriBuf);\r\n\t\tgbShouldValidatePackage = FALSE;\r\n\t\tsync_init();\r\n\t\tnthread_start(sgbPlayerTurnBitTbl[myplr]);\r\n\t\tdthread_start();\r\n\t\ttmsg_start();\r\n\t\tsgdwGameLoops = 0;\r\n\t\tsgbSentThisCycle = 0;\r\n\t\tgbDeltaSender = myplr;\r\n\t\tgbSomebodyWonGameKludge = FALSE;\r\n\t\tnthread_send_and_recv_turn(0, 0);\r\n\t\tSetupLocalCoords();\r\n\t\tmulti_send_pinfo(-2, CMD_SEND_PLRINFO);\r\n\t\tplr[myplr].plractive = TRUE;\r\n\t\tgbActivePlayers = 1;\r\n\t\tif (sgbPlayerTurnBitTbl[myplr] == FALSE || msg_wait_resync())\r\n\t\t\tbreak;\r\n\t\tNetClose();\r\n\t\tgbSelectProvider = FALSE;\r\n\t}\r\n\tgnDifficulty = sgGameInitInfo.bDiff;\r\n\tSetRndSeed(sgGameInitInfo.dwSeed);\r\n\r\n\tfor (i = 0; i < NUMLEVELS; i++) {\r\n\t\tglSeedTbl[i] = GetRndSeed();\r\n\t\tgnLevelTypeTbl[i] = InitLevelType(i);\r\n\t}\r\n\tif (!SNetGetGameInfo(GAMEINFO_NAME, szPlayerName, 128, &len))\r\n\t\tnthread_terminate_game(\"SNetGetGameInfo1\");\r\n\tif (!SNetGetGameInfo(GAMEINFO_PASSWORD, szPlayerDescript, 128, &len))\r\n\t\tnthread_terminate_game(\"SNetGetGameInfo2\");\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL multi_init_single(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info)\r\n{\r\n\tint unused;\r\n\r\n\tif (!SNetInitializeProvider(0, client_info, user_info, ui_info, &fileinfo)) {\r\n\t\tDERROR();\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tunused = 0;\r\n\tif (!SNetCreateGame(\"local\", \"local\", \"local\", 0, (char *)&sgGameInitInfo, sizeof(sgGameInitInfo), 1, \"local\", \"local\", &unused)) {\r\n\t\tapp_fatal(\"SNetCreateGame1:\\n%s\", TraceLastError());\r\n\t}\r\n\r\n\tmyplr = 0;\r\n\tgbMaxPlayers = 1;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL multi_init_multi(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, BOOL *pfExitProgram)\r\n{\r\n\tBOOL first;\r\n\tint playerId;\r\n\tint type;\r\n\r\n\tfor (first = TRUE;; first = FALSE) {\r\n\t\ttype = 0x00;\r\n\t\tif (gbSelectProvider) {\r\n\t\t\tif (!UiSelectProvider(0, client_info, user_info, ui_info, &fileinfo, &type)\r\n\t\t\t    && (!first || DERROR() != STORM_ERROR_REQUIRES_UPGRADE || !multi_upgrade(pfExitProgram))) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n#ifndef HELLFIRE\r\n\t\t\tif (type == 'BNET')\r\n\t\t\t\tplr[0].pBattleNet = 1;\r\n#endif\r\n\t\t}\r\n\r\n\t\tmulti_event_handler(TRUE);\r\n\t\tif (UiSelectGame(1, client_info, user_info, ui_info, &fileinfo, &playerId))\r\n\t\t\tbreak;\r\n\r\n\t\tgbSelectProvider = TRUE;\r\n\t}\r\n\r\n\tif ((DWORD)playerId >= MAX_PLRS) {\r\n\t\treturn FALSE;\r\n\t} else {\r\n\t\tmyplr = playerId;\r\n\t\tgbMaxPlayers = MAX_PLRS;\r\n\r\n\t\tpfile_read_player_from_save();\r\n\r\n#ifndef HELLFIRE\r\n\t\tif (type == 'BNET')\r\n\t\t\tplr[myplr].pBattleNet = 1;\r\n#endif\r\n\r\n\t\treturn TRUE;\r\n\t}\r\n}\r\n\r\nvoid recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv)\r\n{\r\n\tconst char *szEvent;\r\n\r\n\tif (myplr == pnum) {\r\n\t\treturn;\r\n\t}\r\n\t/// ASSERT: assert((DWORD)pnum < MAX_PLRS);\r\n\r\n\tif (sgwPackPlrOffsetTbl[pnum] != p->wOffset) {\r\n\t\tsgwPackPlrOffsetTbl[pnum] = 0;\r\n\t\tif (p->wOffset != 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tif (!recv && sgwPackPlrOffsetTbl[pnum] == 0) {\r\n\t\tmulti_send_pinfo(pnum, CMD_ACK_PLRINFO);\r\n\t}\r\n\r\n\tmemcpy((char *)&netplr[pnum] + p->wOffset, &p[1], p->wBytes); /* todo: cast? */\r\n\tsgwPackPlrOffsetTbl[pnum] += p->wBytes;\r\n\tif (sgwPackPlrOffsetTbl[pnum] != sizeof(*netplr)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tsgwPackPlrOffsetTbl[pnum] = 0;\r\n\tmulti_player_left_msg(pnum, 0);\r\n\tplr[pnum]._pGFXLoad = 0;\r\n\tUnPackPlayer(&netplr[pnum], pnum, TRUE);\r\n\r\n\tif (!recv) {\r\n#ifdef _DEBUG\r\n\t\tdumphist(\"(%d) received all %d plrinfo\", myplr, pnum);\r\n#endif\r\n\t\treturn;\r\n\t}\r\n\r\n\tplr[pnum].plractive = TRUE;\r\n\tgbActivePlayers++;\r\n\r\n\tif (sgbPlayerTurnBitTbl[pnum] != FALSE) {\r\n\t\tszEvent = \"Player '%s' (level %d) just joined the game\";\r\n\t} else {\r\n\t\tszEvent = \"Player '%s' (level %d) is already in the game\";\r\n\t}\r\n\tEventPlrMsg(szEvent, plr[pnum]._pName, plr[pnum]._pLevel);\r\n\r\n\tLoadPlrGFX(pnum, PFILE_STAND);\r\n\tSyncInitPlr(pnum);\r\n\r\n\tif (plr[pnum].plrlevel == currlevel) {\r\n\t\tif (plr[pnum]._pHitPoints >> 6 > 0) {\r\n\t\t\tStartStand(pnum, 0);\r\n\t\t} else {\r\n\t\t\tplr[pnum]._pgfxnum = 0;\r\n\t\t\tLoadPlrGFX(pnum, PFILE_DEATH);\r\n\t\t\tplr[pnum]._pmode = PM_DEATH;\r\n\t\t\tNewPlrAnim(pnum, plr[pnum]._pDAnim[DIR_S], plr[pnum]._pDFrames, 1, plr[pnum]._pDWidth);\r\n\t\t\tplr[pnum]._pAnimFrame = plr[pnum]._pAnimLen - 1;\r\n\t\t\tplr[pnum]._pVar8 = 2 * plr[pnum]._pAnimLen;\r\n\t\t\tdFlags[plr[pnum]._px][plr[pnum]._py] |= BFLAG_DEAD_PLAYER;\r\n\t\t}\r\n\t}\r\n#ifdef _DEBUG\r\n\tdumphist(\"(%d) making %d active -- recv_plrinfo\", myplr, pnum);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "Source/multi.h",
    "content": "/**\r\n * @file multi.h\r\n *\r\n * Interface of functions for keeping multiplayer games in sync.\r\n */\r\n#ifndef __MULTI_H__\r\n#define __MULTI_H__\r\n\r\nextern BOOLEAN gbSomebodyWonGameKludge;\r\nextern char szPlayerDescript[128];\r\nextern WORD sgwPackPlrOffsetTbl[MAX_PLRS];\r\nextern BYTE gbActivePlayers;\r\nextern BOOLEAN gbGameDestroyed;\r\nextern BOOLEAN gbSelectProvider;\r\nextern BYTE gbMaxPlayers;\r\nextern char szPlayerName[128];\r\nextern BYTE gbDeltaSender;\r\nextern int player_state[MAX_PLRS];\r\n\r\nvoid multi_msg_add(BYTE *pbMsg, BYTE bLen);\r\nvoid NetSendLoPri(BYTE *pbMsg, BYTE bLen);\r\nvoid NetSendHiPri(BYTE *pbMsg, BYTE bLen);\r\nvoid multi_send_msg_packet(int pmask, BYTE *src, BYTE len);\r\nvoid multi_msg_countdown();\r\nvoid multi_player_left(int pnum, int reason);\r\nvoid multi_net_ping();\r\nint multi_handle_delta();\r\nvoid multi_process_network_packets();\r\nvoid multi_send_zero_packet(int pnum, BYTE bCmd, BYTE *pbSrc, DWORD dwLen);\r\nvoid NetClose();\r\nBOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram);\r\nBOOL multi_init_single(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info);\r\nBOOL multi_init_multi(_SNETPROGRAMDATA *client_info, _SNETPLAYERDATA *user_info, _SNETUIDATA *ui_info, BOOL *pfExitProgram);\r\nvoid recv_plrinfo(int pnum, TCmdPlrInfoHdr *p, BOOL recv);\r\n\r\n#endif /* __MULTI_H__ */\r\n"
  },
  {
    "path": "Source/nthread.cpp",
    "content": "/**\r\n * @file nthread.cpp\r\n *\r\n * Implementation of functions for managing game ticks.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nBYTE sgbNetUpdateRate;\r\nDWORD gdwMsgLenTbl[MAX_PLRS];\r\nstatic CCritSect sgMemCrit;\r\nDWORD gdwDeltaBytesSec;\r\nBOOLEAN nthread_should_run;\r\nDWORD gdwTurnsInTransit;\r\nint glpMsgTbl[MAX_PLRS];\r\nunsigned int glpNThreadId;\r\nchar sgbSyncCountdown;\r\nint turn_upper_bit;\r\nBOOLEAN sgbTicsOutOfSync;\r\nchar sgbPacketCountdown;\r\nBOOLEAN sgbThreadIsRunning;\r\nDWORD gdwLargestMsgSize;\r\nDWORD gdwNormalMsgSize;\r\nint last_tick;\r\n\r\n/* data */\r\nstatic HANDLE sghThread = INVALID_HANDLE_VALUE;\r\n\r\nvoid nthread_terminate_game(const char *pszFcn)\r\n{\r\n\tDWORD sErr;\r\n\r\n\tsErr = DERROR();\r\n\tif (sErr == STORM_ERROR_INVALID_PLAYER) {\r\n\t\treturn;\r\n\t} else if (sErr == STORM_ERROR_GAME_TERMINATED) {\r\n\t\tgbGameDestroyed = TRUE;\r\n\t} else if (sErr == STORM_ERROR_NOT_IN_GAME) {\r\n\t\tgbGameDestroyed = TRUE;\r\n\t} else {\r\n\t\tapp_fatal(\"%s:\\n%s\", pszFcn, TraceLastError());\r\n\t}\r\n}\r\n\r\nDWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta)\r\n{\r\n\tDWORD new_cur_turn;\r\n\tint turn, turn_tmp;\r\n\tint curTurnsInTransit;\r\n\r\n\tnew_cur_turn = cur_turn;\r\n\tif (!SNetGetTurnsInTransit(&curTurnsInTransit)) {\r\n\t\tnthread_terminate_game(\"SNetGetTurnsInTransit\");\r\n\t\treturn 0;\r\n\t}\r\n\twhile (curTurnsInTransit++ < gdwTurnsInTransit) {\r\n\r\n\t\tturn_tmp = turn_upper_bit | new_cur_turn & 0x7FFFFFFF;\r\n\t\tturn_upper_bit = 0;\r\n\t\tturn = turn_tmp;\r\n\r\n\t\tif (!SNetSendTurn((char *)&turn, sizeof(turn))) {\r\n\t\t\tnthread_terminate_game(\"SNetSendTurn\");\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tnew_cur_turn += turn_delta;\r\n\t\tif (new_cur_turn >= 0x7FFFFFFF)\r\n\t\t\tnew_cur_turn &= 0xFFFF;\r\n\t}\r\n\treturn new_cur_turn;\r\n}\r\n\r\nBOOL nthread_recv_turns(BOOL *pfSendAsync)\r\n{\r\n\t*pfSendAsync = FALSE;\r\n\tsgbPacketCountdown--;\r\n\tif (sgbPacketCountdown) {\r\n\t\tlast_tick += 50;\r\n\t\treturn TRUE;\r\n\t}\r\n\tsgbSyncCountdown--;\r\n\tsgbPacketCountdown = sgbNetUpdateRate;\r\n\tif (sgbSyncCountdown != 0) {\r\n\r\n\t\t*pfSendAsync = TRUE;\r\n\t\tlast_tick += 50;\r\n\t\treturn TRUE;\r\n\t}\r\n\tif (!SNetReceiveTurns(0, MAX_PLRS, (char **)glpMsgTbl, gdwMsgLenTbl, (LPDWORD)player_state)) {\r\n\t\tif (DERROR() != STORM_ERROR_NO_MESSAGES_WAITING)\r\n\t\t\tnthread_terminate_game(\"SNetReceiveTurns\");\r\n\t\tsgbTicsOutOfSync = FALSE;\r\n\t\tsgbSyncCountdown = 1;\r\n\t\tsgbPacketCountdown = 1;\r\n\t\treturn FALSE;\r\n\t} else {\r\n\t\tif (!sgbTicsOutOfSync) {\r\n\t\t\tsgbTicsOutOfSync = TRUE;\r\n\t\t\tlast_tick = GetTickCount();\r\n\t\t}\r\n\t\tsgbSyncCountdown = 4;\r\n\t\tmulti_msg_countdown();\r\n\t\t*pfSendAsync = TRUE;\r\n\t\tlast_tick += 50;\r\n\t\treturn TRUE;\r\n\t}\r\n}\r\n\r\nstatic unsigned int __stdcall nthread_handler(void *data)\r\n{\r\n\tint delta;\r\n\tBOOL received;\r\n\r\n\tif (nthread_should_run) {\r\n\t\twhile (1) {\r\n\t\t\tsgMemCrit.Enter();\r\n\t\t\tif (!nthread_should_run)\r\n\t\t\t\tbreak;\r\n\t\t\tnthread_send_and_recv_turn(0, 0);\r\n\t\t\tif (nthread_recv_turns(&received))\r\n\t\t\t\tdelta = last_tick - GetTickCount();\r\n\t\t\telse\r\n\t\t\t\tdelta = 50;\r\n\t\t\tsgMemCrit.Leave();\r\n\t\t\tif (delta > 0)\r\n\t\t\t\tSleep(delta);\r\n\t\t\tif (!nthread_should_run)\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t\tsgMemCrit.Leave();\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nvoid nthread_set_turn_upper_bit()\r\n{\r\n\tturn_upper_bit = 0x80000000;\r\n}\r\n\r\nvoid nthread_start(BOOL set_turn_upper_bit)\r\n{\r\n\tconst char *err, *err2;\r\n\tDWORD largestMsgSize;\r\n\t_SNETCAPS caps;\r\n\r\n\tlast_tick = GetTickCount();\r\n\tsgbPacketCountdown = 1;\r\n\tsgbSyncCountdown = 1;\r\n\tsgbTicsOutOfSync = TRUE;\r\n\tif (set_turn_upper_bit)\r\n\t\tnthread_set_turn_upper_bit();\r\n\telse\r\n\t\tturn_upper_bit = 0;\r\n\tcaps.size = 36;\r\n\tif (!SNetGetProviderCaps(&caps)) {\r\n\t\terr = TraceLastError();\r\n\t\tapp_fatal(\"SNetGetProviderCaps:\\n%s\", err);\r\n\t}\r\n\tgdwTurnsInTransit = caps.defaultturnsintransit;\r\n\tif (!caps.defaultturnsintransit)\r\n\t\tgdwTurnsInTransit = 1;\r\n\tif (caps.defaultturnssec <= 20 && caps.defaultturnssec)\r\n\t\tsgbNetUpdateRate = 20 / caps.defaultturnssec;\r\n\telse\r\n\t\tsgbNetUpdateRate = 1;\r\n\tlargestMsgSize = 512;\r\n\tif (caps.maxmessagesize < 0x200)\r\n\t\tlargestMsgSize = caps.maxmessagesize;\r\n\tgdwDeltaBytesSec = caps.bytessec >> 2;\r\n\tgdwLargestMsgSize = largestMsgSize;\r\n\tgdwNormalMsgSize = caps.bytessec * sgbNetUpdateRate / 20;\r\n\tgdwNormalMsgSize *= 3;\r\n\tgdwNormalMsgSize >>= 2;\r\n\tif (caps.maxplayers > MAX_PLRS)\r\n\t\tcaps.maxplayers = MAX_PLRS;\r\n\tgdwNormalMsgSize /= caps.maxplayers;\r\n\twhile (gdwNormalMsgSize < 0x80) {\r\n\t\tgdwNormalMsgSize *= 2;\r\n\t\tsgbNetUpdateRate *= 2;\r\n\t}\r\n\tif (gdwNormalMsgSize > largestMsgSize)\r\n\t\tgdwNormalMsgSize = largestMsgSize;\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tsgbThreadIsRunning = FALSE;\r\n\t\tsgMemCrit.Enter();\r\n\t\tnthread_should_run = TRUE;\r\n\t\tsghThread = (HANDLE)_beginthreadex(NULL, 0, nthread_handler, NULL, 0, &glpNThreadId);\r\n\t\tif (sghThread == INVALID_HANDLE_VALUE) {\r\n\t\t\terr2 = TraceLastError();\r\n\t\t\tapp_fatal(\"nthread2:\\n%s\", err2);\r\n\t\t}\r\n\t\tSetThreadPriority(sghThread, THREAD_PRIORITY_HIGHEST);\r\n\t}\r\n}\r\n\r\nvoid nthread_cleanup()\r\n{\r\n\tnthread_should_run = FALSE;\r\n\tgdwTurnsInTransit = 0;\r\n\tgdwNormalMsgSize = 0;\r\n\tgdwLargestMsgSize = 0;\r\n\tif (sghThread != INVALID_HANDLE_VALUE && glpNThreadId != GetCurrentThreadId()) {\r\n\t\tif (!sgbThreadIsRunning)\r\n\t\t\tsgMemCrit.Leave();\r\n\t\tif (WaitForSingleObject(sghThread, INFINITE) == -1) {\r\n\t\t\tapp_fatal(\"nthread3:\\n(%s)\", TraceLastError());\r\n\t\t}\r\n\t\tCloseHandle(sghThread);\r\n\t\tsghThread = INVALID_HANDLE_VALUE;\r\n\t}\r\n}\r\n\r\nvoid nthread_ignore_mutex(BOOL bStart)\r\n{\r\n\tif (sghThread != INVALID_HANDLE_VALUE) {\r\n\t\tif (bStart)\r\n\t\t\tsgMemCrit.Leave();\r\n\t\telse\r\n\t\t\tsgMemCrit.Enter();\r\n\t\tsgbThreadIsRunning = bStart;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Checks if it's time for the logic to advance\r\n * @param unused\r\n * @return True if the engine should tick\r\n\r\n */\r\nBOOL nthread_has_500ms_passed(BOOL unused)\r\n{\r\n\tDWORD currentTickCount;\r\n\tint ticksElapsed;\r\n\r\n\tcurrentTickCount = GetTickCount();\r\n\tticksElapsed = currentTickCount - last_tick;\r\n\tif (gbMaxPlayers == 1 && ticksElapsed > 500) {\r\n\t\tlast_tick = currentTickCount;\r\n\t\tticksElapsed = 0;\r\n\t}\r\n\treturn ticksElapsed >= 0;\r\n}\r\n"
  },
  {
    "path": "Source/nthread.h",
    "content": "/**\r\n * @file nthread.h\r\n *\r\n * Interface of functions for managing game ticks.\r\n */\r\n#ifndef __NTHREAD_H__\r\n#define __NTHREAD_H__\r\n\r\nextern BYTE sgbNetUpdateRate;\r\nextern DWORD gdwMsgLenTbl[MAX_PLRS];\r\nextern DWORD gdwDeltaBytesSec;\r\nextern DWORD gdwTurnsInTransit;\r\nextern int glpMsgTbl[MAX_PLRS];\r\nextern int turn_upper_bit;\r\nextern DWORD gdwLargestMsgSize;\r\nextern DWORD gdwNormalMsgSize;\r\n\r\nvoid nthread_terminate_game(const char *pszFcn);\r\nDWORD nthread_send_and_recv_turn(DWORD cur_turn, int turn_delta);\r\nBOOL nthread_recv_turns(BOOL *pfSendAsync);\r\nvoid nthread_set_turn_upper_bit();\r\nvoid nthread_start(BOOL set_turn_upper_bit);\r\nvoid nthread_cleanup();\r\nvoid nthread_ignore_mutex(BOOL bStart);\r\nBOOL nthread_has_500ms_passed(BOOL unused);\r\n\r\n#endif /* __NTHREAD_H__ */\r\n"
  },
  {
    "path": "Source/objdat.cpp",
    "content": "/**\r\n * @file objdat.cpp\r\n *\r\n * Implementation of all object data.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Maps from dun_object_id to object_id. */\r\nint ObjTypeConv[] = {\r\n\t0,\r\n\tOBJ_LEVER,\r\n\tOBJ_CRUX1,\r\n\tOBJ_CRUX2,\r\n\tOBJ_CRUX3,\r\n\tOBJ_ANGEL,\r\n\tOBJ_BANNERL,\r\n\tOBJ_BANNERM,\r\n\tOBJ_BANNERR,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_BOOK2L,\r\n\tOBJ_BOOK2R,\r\n\tOBJ_BCROSS,\r\n\t0,\r\n\tOBJ_CANDLE1,\r\n\tOBJ_CANDLE2,\r\n\tOBJ_CANDLEO,\r\n\tOBJ_CAULDRON,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_FLAMEHOLE,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_MCIRCLE1,\r\n\tOBJ_MCIRCLE2,\r\n\tOBJ_SKFIRE,\r\n\tOBJ_SKPILE,\r\n\tOBJ_SKSTICK1,\r\n\tOBJ_SKSTICK2,\r\n\tOBJ_SKSTICK3,\r\n\tOBJ_SKSTICK4,\r\n\tOBJ_SKSTICK5,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_SWITCHSKL,\r\n\t0,\r\n\tOBJ_TRAPL,\r\n\tOBJ_TRAPR,\r\n\tOBJ_TORTURE1,\r\n\tOBJ_TORTURE2,\r\n\tOBJ_TORTURE3,\r\n\tOBJ_TORTURE4,\r\n\tOBJ_TORTURE5,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_NUDEW2R,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_TNUDEM1,\r\n\tOBJ_TNUDEM2,\r\n\tOBJ_TNUDEM3,\r\n\tOBJ_TNUDEM4,\r\n\tOBJ_TNUDEW1,\r\n\tOBJ_TNUDEW2,\r\n\tOBJ_TNUDEW3,\r\n\tOBJ_CHEST1,\r\n\tOBJ_CHEST1,\r\n\tOBJ_CHEST1,\r\n\tOBJ_CHEST2,\r\n\tOBJ_CHEST2,\r\n\tOBJ_CHEST2,\r\n\tOBJ_CHEST3,\r\n\tOBJ_CHEST3,\r\n\tOBJ_CHEST3,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_PEDISTAL,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\t0,\r\n\tOBJ_ALTBOY,\r\n\t0,\r\n\t0,\r\n\tOBJ_WARARMOR,\r\n\tOBJ_WARWEAP,\r\n\tOBJ_TORCHR2,\r\n\tOBJ_TORCHL2,\r\n\tOBJ_MUSHPATCH,\r\n};\r\n\r\n/** Contains the data related to each object ID. */\r\nObjDataStruct AllObjects[] = {\r\n\t// clang-format off\r\n\t// oload, ofindex,   ominlvl, omaxlvl, olvltype,        otheme,                  oquest,     oAnimFlag, oAnimDelay, oAnimLen, oAnimWidth, oSolidFlag, oMissFlag, oLightFlag, oBreak, oSelFlag, oTrapFlag\r\n\t{      1, OFILE_L1BRAZ,    1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 1,          1,       26,         64, TRUE,       TRUE,      FALSE,           0,        0, FALSE     },\r\n\t{      1, OFILE_L1DOORS,   1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 0,          1,        0,         64, FALSE,      FALSE,     TRUE,            0,        3, TRUE      },\r\n\t{      1, OFILE_L1DOORS,   1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 0,          2,        0,         64, FALSE,      FALSE,     TRUE,            0,        3, TRUE      },\r\n\t{      3, OFILE_SKULFIRE,  0,       0, 0,               THEME_SKELROOM,          -1,                 1,          2,       11,         96, TRUE,       TRUE,      FALSE,           0,        0, FALSE     },\r\n\t{      1, OFILE_LEVER,     1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 0,          1,        1,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      1, OFILE_CHEST1,    1,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      1, OFILE_CHEST2,    1,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      1, OFILE_CHEST3,    1,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      2, OFILE_L1BRAZ,    0,       0, 0,               THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      3, OFILE_CANDLE2,   0,       0, 0,               THEME_SHRINE,            -1,                 1,          2,        4,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_L1BRAZ,    0,       0, 0,               THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      3, OFILE_BANNER,    0,       0, 0,               THEME_SKELROOM,          -1,                 0,          2,        0,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      3, OFILE_BANNER,    0,       0, 0,               THEME_SKELROOM,          -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      3, OFILE_BANNER,    0,       0, 0,               THEME_SKELROOM,          -1,                 0,          3,        0,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_SKULPILE,  1,       4, 0,               THEME_NONE,              -1,                 0,          0,        1,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_L1BRAZ,    0,       0, 0,               THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      2, OFILE_L1BRAZ,    0,       0, 0,               THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      2, OFILE_L1BRAZ,    0,       0, 0,               THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      2, OFILE_L1BRAZ,    0,       0, 0,               THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      2, OFILE_L1BRAZ,    0,       0, 0,               THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      2, OFILE_CRUXSK1,   0,       0, 0,               THEME_NONE,              -1,                 0,          1,       15,         96, TRUE,       FALSE,     TRUE,            1,        3, FALSE     },\r\n\t{      2, OFILE_CRUXSK2,   0,       0, 0,               THEME_NONE,              -1,                 0,          1,       15,         96, TRUE,       FALSE,     TRUE,            1,        3, FALSE     },\r\n\t{      2, OFILE_CRUXSK3,   0,       0, 0,               THEME_NONE,              -1,                 0,          1,       15,         96, TRUE,       FALSE,     TRUE,            1,        3, FALSE     },\r\n\t{      1, OFILE_ROCKSTAN,  5,       5, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_ANGEL,     0,       0, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_BOOK2,     0,       0, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      2, OFILE_BURNCROS,  0,       0, 0,               THEME_NONE,              -1,                 1,          0,       10,        160, TRUE,       FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      2, OFILE_NUDE2,     0,       0, 0,               THEME_NONE,              -1,                 1,          3,        6,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_SWITCH4,  16,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      1, OFILE_TNUDEM,   13,      16, 0,               THEME_NONE,              Q_BUTCHER,          0,          1,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TNUDEM,   13,      16, 0,               THEME_TORTURE,           Q_BUTCHER,          0,          2,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TNUDEM,   13,      16, 0,               THEME_TORTURE,           Q_BUTCHER,          0,          3,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TNUDEM,   13,      16, 0,               THEME_TORTURE,           Q_BUTCHER,          0,          4,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TNUDEW,   13,      16, 0,               THEME_TORTURE,           Q_BUTCHER,          0,          1,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TNUDEW,   13,      16, 0,               THEME_TORTURE,           Q_BUTCHER,          0,          2,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TNUDEW,   13,      16, 0,               THEME_TORTURE,           Q_BUTCHER,          0,          3,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TSOUL,    13,      16, 0,               THEME_NONE,              Q_BUTCHER,          0,          1,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TSOUL,    13,      16, 0,               THEME_NONE,              Q_BUTCHER,          0,          2,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TSOUL,    13,      16, 0,               THEME_NONE,              Q_BUTCHER,          0,          3,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TSOUL,    13,      16, 0,               THEME_NONE,              Q_BUTCHER,          0,          4,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TSOUL,    13,      16, 0,               THEME_NONE,              Q_BUTCHER,          0,          5,        0,        128, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_BOOK2,     6,       6, 0,               THEME_NONE,              -1,                 0,          4,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_L2DOORS,   5,       8, DTYPE_CATACOMBS, THEME_NONE,              -1,                 0,          1,        0,         64, FALSE,      FALSE,     TRUE,            0,        3, TRUE      },\r\n\t{      1, OFILE_L2DOORS,   5,       8, DTYPE_CATACOMBS, THEME_NONE,              -1,                 0,          2,        0,         64, FALSE,      FALSE,     TRUE,            0,        3, TRUE      },\r\n\t{      1, OFILE_WTORCH4,   5,       8, DTYPE_CATACOMBS, THEME_NONE,              -1,                 1,          1,        9,         96, FALSE,      TRUE,      FALSE,           0,        0, FALSE     },\r\n\t{      1, OFILE_WTORCH3,   5,       8, DTYPE_CATACOMBS, THEME_NONE,              -1,                 1,          1,        9,         96, FALSE,      TRUE,      FALSE,           0,        0, FALSE     },\r\n\t{      1, OFILE_WTORCH1,   5,       8, DTYPE_CATACOMBS, THEME_NONE,              -1,                 1,          1,        9,         96, FALSE,      TRUE,      FALSE,           0,        0, FALSE     },\r\n\t{      1, OFILE_WTORCH2,   5,       8, DTYPE_CATACOMBS, THEME_NONE,              -1,                 1,          1,        9,         96, FALSE,      TRUE,      FALSE,           0,        0, FALSE     },\r\n\t{      1, OFILE_SARC,      1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 0,          1,        5,        128, TRUE,       TRUE,      TRUE,            0,        3, TRUE      },\r\n\t{      2, OFILE_FLAME1,    1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 0,          1,       20,         96, FALSE,      TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_LEVER,     1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 0,          1,        2,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      2, OFILE_MINIWATR,  1,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 1,          1,       10,         64, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_BOOK1,     3,       4, DTYPE_CATHEDRAL, THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_TRAPHOLE,  1,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         64, FALSE,      TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_TRAPHOLE,  1,      16, 0,               THEME_NONE,              -1,                 0,          2,        0,         64, FALSE,      TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_BCASE,     0,       0, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_WEAPSTND,  0,       0, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_BARREL,    1,      16, 0,               THEME_NONE,              -1,                 0,          1,        9,         96, TRUE,       TRUE,      TRUE,            1,        3, FALSE     },\r\n\t{      1, OFILE_BARRELEX,  1,      16, 0,               THEME_NONE,              -1,                 0,          1,       10,         96, TRUE,       TRUE,      TRUE,            1,        3, FALSE     },\r\n\t{      3, OFILE_LSHRINEG,  0,       0, 0,               THEME_SHRINE,            -1,                 0,          1,       11,        128, FALSE,      FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_RSHRINEG,  0,       0, 0,               THEME_SHRINE,            -1,                 0,          1,       11,        128, FALSE,      FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_BOOK2,     0,       0, 0,               THEME_SKELROOM,          -1,                 0,          4,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_BCASE,     0,       0, 0,               THEME_LIBRARY,           -1,                 0,          3,        0,         96, FALSE,      FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_BCASE,     0,       0, 0,               THEME_LIBRARY,           -1,                 0,          4,        0,         96, FALSE,      FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_BOOK2,     0,       0, 0,               THEME_LIBRARY,           -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_CANDLE2,   0,       0, 0,               THEME_LIBRARY,           -1,                 1,          2,        4,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      3, OFILE_BLOODFNT,  0,       0, 0,               THEME_BLOODFOUNTAIN,     -1,                 1,          2,       10,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_DECAP,    13,      16, 0,               THEME_DECAPITATED,       -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, FALSE     },\r\n\t{      1, OFILE_CHEST1,    1,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      1, OFILE_CHEST2,    1,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      1, OFILE_CHEST3,    1,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{      1, OFILE_BOOK1,     7,       7, DTYPE_CATACOMBS, THEME_NONE,              Q_BLIND,            0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_BOOK1,     5,       5, DTYPE_CATACOMBS, THEME_NONE,              Q_BLOOD,            0,          4,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_PEDISTL,   5,       5, DTYPE_CATACOMBS, THEME_NONE,              Q_BLOOD,            0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_L3DOORS,   9,      12, DTYPE_CAVES,     THEME_NONE,              -1,                 0,          1,        0,         64, FALSE,      FALSE,     TRUE,            0,        3, TRUE      },\r\n\t{      1, OFILE_L3DOORS,   9,      12, DTYPE_CAVES,     THEME_NONE,              -1,                 0,          2,        0,         64, FALSE,      FALSE,     TRUE,            0,        3, TRUE      },\r\n\t{      3, OFILE_PFOUNTN,   0,       0, 0,               THEME_PURIFYINGFOUNTAIN, -1,                 1,          2,       10,        128, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_ARMSTAND,  0,       0, 0,               THEME_ARMORSTAND,        -1,                 0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_ARMSTAND,  0,       0, 0,               THEME_ARMORSTAND,        -1,                 0,          2,        0,         96, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      3, OFILE_GOATSHRN,  0,       0, 0,               THEME_GOATSHRINE,        -1,                 1,          2,       10,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_CAULDREN, 13,      16, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_MFOUNTN,   0,       0, 0,               THEME_MURKYFOUNTAIN,     -1,                 1,          2,       10,        128, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      3, OFILE_TFOUNTN,   0,       0, 0,               THEME_TEARFOUNTAIN,      -1,                 1,          2,        4,        128, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_ALTBOY,    0,       0, DTYPE_CATHEDRAL, THEME_NONE,              Q_BETRAYER,         0,          1,        0,        128, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_MCIRL,     0,       0, DTYPE_CATHEDRAL, THEME_NONE,              Q_BETRAYER,         0,          1,        0,         96, FALSE,      TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_MCIRL,     0,       0, DTYPE_CATHEDRAL, THEME_NONE,              Q_BETRAYER,         0,          1,        0,         96, FALSE,      TRUE,      TRUE,            0,        0, FALSE     },\r\n#ifdef HELLFIRE\r\n\t{      1, OFILE_BKSLBRNT,  1,      24, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     }, // BUGFIX should only be loaded on level 1-12 (crypt masks as 1-4)\r\n#else\r\n\t{      1, OFILE_BKSLBRNT,  4,      12, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n#endif\r\n\t{      1, OFILE_CANDLE2,   2,      12, 0,               THEME_NONE,              Q_BETRAYER,         1,          2,        4,         96, TRUE,       TRUE,      TRUE,            0,        0, FALSE     },\r\n\t{      1, OFILE_BOOK1,    13,      13, DTYPE_HELL,      THEME_NONE,              Q_WARLORD,          0,          4,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_ARMSTAND, 13,      13, 0,               THEME_NONE,              Q_WARLORD,          0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      2, OFILE_WEAPSTND, 13,      13, 0,               THEME_NONE,              Q_WARLORD,          0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      2, OFILE_BURNCROS,  0,       0, 0,               THEME_BRNCROSS,          -1,                 1,          0,       10,        160, TRUE,       FALSE,     FALSE,           0,        0, FALSE     },\r\n\t{      2, OFILE_WEAPSTND,  0,       0, 0,               THEME_WEAPONRACK,        -1,                 0,          1,        0,         96, TRUE,       FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      2, OFILE_WEAPSTND,  0,       0, 0,               THEME_WEAPONRACK,        -1,                 0,          2,        0,         96, TRUE,       FALSE,     TRUE,            0,        0, FALSE     },\r\n\t{      2, OFILE_MUSHPTCH,  0,       0, 0,               THEME_NONE,              Q_MUSHROOM,         0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        3, TRUE      },\r\n\t{      2, OFILE_LZSTAND,   0,       0, 0,               THEME_NONE,              Q_BETRAYER,         0,          1,        0,        128, TRUE,       FALSE,     TRUE,            0,        3, FALSE     },\r\n\t{      1, OFILE_DECAP,     9,       9, DTYPE_CAVES,     THEME_NONE,              -1,                 0,          2,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, FALSE     },\r\n\t{      2, OFILE_CHEST3,    0,       0, 0,               THEME_NONE,              -1,                 0,          1,        0,         96, TRUE,       TRUE,      TRUE,            0,        1, TRUE      },\r\n\t{     -1, 0,               0,       0, -1,              THEME_NONE,              -1,                 0,          0,        0,          0, FALSE,      FALSE,     FALSE,           0,        0, FALSE     }\r\n\t// clang-format on\r\n};\r\n\r\n/** Maps from object_graphic_id to object CEL name. */\r\nconst char *const ObjMasterLoadList[] = {\r\n\t\"L1Braz\",\r\n\t\"L1Doors\",\r\n\t\"Lever\",\r\n\t\"Chest1\",\r\n\t\"Chest2\",\r\n\t\"Banner\",\r\n\t\"SkulPile\",\r\n\t\"SkulFire\",\r\n\t\"SkulStik\",\r\n\t\"CruxSk1\",\r\n\t\"CruxSk2\",\r\n\t\"CruxSk3\",\r\n\t\"Book1\",\r\n\t\"Book2\",\r\n\t\"Rockstan\",\r\n\t\"Angel\",\r\n\t\"Chest3\",\r\n\t\"Burncros\",\r\n\t\"Candle2\",\r\n\t\"Nude2\",\r\n\t\"Switch4\",\r\n\t\"TNudeM\",\r\n\t\"TNudeW\",\r\n\t\"TSoul\",\r\n\t\"L2Doors\",\r\n\t\"WTorch4\",\r\n\t\"WTorch3\",\r\n\t\"Sarc\",\r\n\t\"Flame1\",\r\n\t\"Prsrplt1\",\r\n\t\"Traphole\",\r\n\t\"MiniWatr\",\r\n\t\"WTorch2\",\r\n\t\"WTorch1\",\r\n\t\"BCase\",\r\n\t\"BShelf\",\r\n\t\"WeapStnd\",\r\n\t\"Barrel\",\r\n\t\"Barrelex\",\r\n\t\"LShrineG\",\r\n\t\"RShrineG\",\r\n\t\"Bloodfnt\",\r\n\t\"Decap\",\r\n\t\"Pedistl\",\r\n\t\"L3Doors\",\r\n\t\"PFountn\",\r\n\t\"Armstand\",\r\n\t\"Goatshrn\",\r\n\t\"Cauldren\",\r\n\t\"MFountn\",\r\n\t\"TFountn\",\r\n\t\"Altboy\",\r\n\t\"Mcirl\",\r\n\t\"Bkslbrnt\",\r\n\t\"Mushptch\",\r\n\t\"LzStand\"\r\n};\r\n#ifdef HELLFIRE\r\n/** Maps from object_graphic_id to object CEL name (Hellfire Crypt overwrite). */\r\nchar *ObjCryptLoadList[] = {\r\n\t\"L1Braz\",\r\n\t\"L5Door\",\r\n\t\"L5Lever\",\r\n\t\"Chest1\",\r\n\t\"Chest2\",\r\n\t\"Banner\",\r\n\t\"SkulPile\",\r\n\t\"SkulFire\",\r\n\t\"SkulStik\",\r\n\t\"CruxSk1\",\r\n\t\"CruxSk2\",\r\n\t\"CruxSk3\",\r\n\t\"Book1\",\r\n\t\"Book2\",\r\n\t\"Rockstan\",\r\n\t\"Angel\",\r\n\t\"Chest3\",\r\n\t\"Burncros\",\r\n\t\"L5Light\",\r\n\t\"Nude2\",\r\n\t\"Switch4\",\r\n\t\"TNudeM\",\r\n\t\"TNudeW\",\r\n\t\"TSoul\",\r\n\t\"L2Doors\",\r\n\t\"WTorch4\",\r\n\t\"WTorch3\",\r\n\t\"L5Sarco\",\r\n\t\"Flame1\",\r\n\t\"Prsrplt1\",\r\n\t\"Traphole\",\r\n\t\"MiniWatr\",\r\n\t\"WTorch2\",\r\n\t\"WTorch1\",\r\n\t\"BCase\",\r\n\t\"BShelf\",\r\n\t\"WeapStnd\",\r\n\t\"Urn\",\r\n\t\"Urnexpld\",\r\n\t\"LShrineG\",\r\n\t\"RShrineG\",\r\n\t\"Bloodfnt\",\r\n\t\"Decap\",\r\n\t\"Pedistl\",\r\n\t\"L3Doors\",\r\n\t\"PFountn\",\r\n\t\"Armstand\",\r\n\t\"Goatshrn\",\r\n\t\"Cauldren\",\r\n\t\"MFountn\",\r\n\t\"TFountn\",\r\n\t\"Altboy\",\r\n\t\"Mcirl\",\r\n\t\"L5Books\",\r\n\t\"Mushptch\",\r\n\t\"LzStand\",\r\n};\r\n/** Maps from object_graphic_id to object CEL name (Hellfire Hive overwrite). */\r\nchar *ObjHiveLoadList[] = {\r\n\t\"L1Braz\",\r\n\t\"L1Doors\",\r\n\t\"Lever\",\r\n\t\"Chest1\",\r\n\t\"Chest2\",\r\n\t\"Banner\",\r\n\t\"SkulPile\",\r\n\t\"SkulFire\",\r\n\t\"SkulStik\",\r\n\t\"CruxSk1\",\r\n\t\"CruxSk2\",\r\n\t\"CruxSk3\",\r\n\t\"Book1\",\r\n\t\"Book2\",\r\n\t\"Rockstan\",\r\n\t\"Angel\",\r\n\t\"Chest3\",\r\n\t\"Burncros\",\r\n\t\"Candle2\",\r\n\t\"Nude2\",\r\n\t\"Switch4\",\r\n\t\"TNudeM\",\r\n\t\"TNudeW\",\r\n\t\"TSoul\",\r\n\t\"L2Doors\",\r\n\t\"WTorch4\",\r\n\t\"WTorch3\",\r\n\t\"Sarc\",\r\n\t\"Flame1\",\r\n\t\"Prsrplt1\",\r\n\t\"Traphole\",\r\n\t\"MiniWatr\",\r\n\t\"WTorch2\",\r\n\t\"WTorch1\",\r\n\t\"BCase\",\r\n\t\"BShelf\",\r\n\t\"WeapStnd\",\r\n\t\"L6Pod1\",\r\n\t\"L6Pod2\",\r\n\t\"LShrineG\",\r\n\t\"RShrineG\",\r\n\t\"Bloodfnt\",\r\n\t\"Decap\",\r\n\t\"Pedistl\",\r\n\t\"L3Doors\",\r\n\t\"PFountn\",\r\n\t\"Armstand\",\r\n\t\"Goatshrn\",\r\n\t\"Cauldren\",\r\n\t\"MFountn\",\r\n\t\"TFountn\",\r\n\t\"Altboy\",\r\n\t\"Mcirl\",\r\n\t\"Bkslbrnt\",\r\n\t\"Mushptch\",\r\n\t\"LzStand\",\r\n};\r\n#endif\r\n"
  },
  {
    "path": "Source/objdat.h",
    "content": "/**\r\n * @file objdat.h\r\n *\r\n * Interface of all object data.\r\n */\r\n#ifndef __OBJDAT_H__\r\n#define __OBJDAT_H__\r\n\r\nextern int ObjTypeConv[];\r\nextern ObjDataStruct AllObjects[];\r\nextern const char *const ObjMasterLoadList[];\r\n#ifdef HELLFIRE\r\nextern char *ObjCryptLoadList[];\r\nextern char *ObjHiveLoadList[];\r\n#endif\r\n\r\n#endif /* __OBJDAT_H__ */\r\n"
  },
  {
    "path": "Source/objects.cpp",
    "content": "/**\r\n * @file objects.cpp\r\n *\r\n * Implementation of object functionality, interaction, spawning, loading, etc.\r\n */\r\n#include \"all.h\"\r\n\r\nint trapid;\r\nint trapdir;\r\nBYTE *pObjCels[40];\r\nchar ObjFileList[40];\r\nint objectactive[MAXOBJECTS];\r\n/** Specifies the number of active objects. */\r\nint nobjects;\r\nint leverid;\r\nint objectavail[MAXOBJECTS];\r\nObjectStruct object[MAXOBJECTS];\r\nBOOL InitObjFlag;\r\nint numobjfiles;\r\n#ifdef HELLFIRE\r\nint dword_6DE0E0;\r\n#endif\r\n\r\n/** Specifies the X-coordinate delta between barrels. */\r\nint bxadd[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };\r\n/** Specifies the Y-coordinate delta between barrels. */\r\nint byadd[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };\r\n/** Maps from shrine_id to shrine name. */\r\nconst char *const shrinestrs[NUM_SHRINETYPE] = {\r\n\t\"Mysterious\",\r\n\t\"Hidden\",\r\n\t\"Gloomy\",\r\n\t\"Weird\",\r\n\t\"Magical\",\r\n\t\"Stone\",\r\n\t\"Religious\",\r\n\t\"Enchanted\",\r\n\t\"Thaumaturgic\",\r\n\t\"Fascinating\",\r\n\t\"Cryptic\",\r\n\t\"Magical\",\r\n\t\"Eldritch\",\r\n\t\"Eerie\",\r\n\t\"Divine\",\r\n\t\"Holy\",\r\n\t\"Sacred\",\r\n\t\"Spiritual\",\r\n\t\"Spooky\",\r\n\t\"Abandoned\",\r\n\t\"Creepy\",\r\n\t\"Quiet\",\r\n\t\"Secluded\",\r\n\t\"Ornate\",\r\n\t\"Glimmering\",\r\n\t\"Tainted\",\r\n#ifdef HELLFIRE\r\n\t\"Oily\",\r\n\t\"Glowing\",\r\n\t\"Mendicant's\",\r\n\t\"Sparkling\",\r\n\t\"Town\",\r\n\t\"Shimmering\",\r\n\t\"Solar\",\r\n\t\"Murphy's\",\r\n#endif\r\n};\r\n/** Specifies the minimum dungeon level on which each shrine will appear. */\r\nchar shrinemin[NUM_SHRINETYPE] = {\r\n\t1, // Mysterious\r\n\t1, // Hidden\r\n\t1, // Gloomy\r\n\t1, // Weird\r\n\t1, // Magical\r\n\t1, // Stone\r\n\t1, // Religious\r\n\t1, // Enchanted\r\n\t1, // Thaumaturgic\r\n\t1, // Fascinating\r\n\t1, // Cryptic\r\n\t1, // Magical\r\n\t1, // Eldritch\r\n\t1, // Eerie\r\n\t1, // Divine\r\n\t1, // Holy\r\n\t1, // Sacred\r\n\t1, // Spiritual\r\n\t1, // Spooky\r\n\t1, // Abandoned\r\n\t1, // Creepy\r\n\t1, // Quiet\r\n\t1, // Secluded\r\n\t1, // Ornate\r\n\t1, // Glimmering\r\n\t1, // Tainted\r\n#ifdef HELLFIRE\r\n\t1, // Oily\r\n\t1, // Glowing\r\n\t1, // Mendicant's\r\n\t1, // Sparkling\r\n\t1, // Town\r\n\t1, // Shimmering\r\n\t1, // Solar,\r\n\t1, // Murphy's\r\n#endif\r\n};\r\n/** Specifies the maximum dungeon level on which each shrine will appear. */\r\nchar shrinemax[NUM_SHRINETYPE] = {\r\n\tMAX_LVLS, // Mysterious\r\n\tMAX_LVLS, // Hidden\r\n\tMAX_LVLS, // Gloomy\r\n\tMAX_LVLS, // Weird\r\n\tMAX_LVLS, // Magical\r\n\tMAX_LVLS, // Stone\r\n\tMAX_LVLS, // Religious\r\n\t8,        // Enchanted\r\n\tMAX_LVLS, // Thaumaturgic\r\n\tMAX_LVLS, // Fascinating\r\n\tMAX_LVLS, // Cryptic\r\n\tMAX_LVLS, // Magical\r\n\tMAX_LVLS, // Eldritch\r\n\tMAX_LVLS, // Eerie\r\n\tMAX_LVLS, // Divine\r\n\tMAX_LVLS, // Holy\r\n\tMAX_LVLS, // Sacred\r\n\tMAX_LVLS, // Spiritual\r\n\tMAX_LVLS, // Spooky\r\n\tMAX_LVLS, // Abandoned\r\n\tMAX_LVLS, // Creepy\r\n\tMAX_LVLS, // Quiet\r\n\tMAX_LVLS, // Secluded\r\n\tMAX_LVLS, // Ornate\r\n\tMAX_LVLS, // Glimmering\r\n\tMAX_LVLS, // Tainted\r\n#ifdef HELLFIRE\r\n\tMAX_LVLS, // Oily\r\n\tMAX_LVLS, // Glowing\r\n\tMAX_LVLS, // Mendicant's\r\n\tMAX_LVLS, // Sparkling\r\n\tMAX_LVLS, // Town\r\n\tMAX_LVLS, // Shimmering\r\n\tMAX_LVLS, // Solar,\r\n\tMAX_LVLS, // Murphy's\r\n#endif\r\n};\r\n/**\r\n * Specifies the game type for which each shrine may appear.\r\n * SHRINETYPE_ANY - 0 - sp & mp\r\n * SHRINETYPE_SINGLE - 1 - sp only\r\n * SHRINETYPE_MULTI - 2 - mp only\r\n */\r\n\r\nBYTE shrineavail[NUM_SHRINETYPE] = {\r\n\tSHRINETYPE_ANY,    // SHRINE_MYSTERIOUS\r\n\tSHRINETYPE_ANY,    // SHRINE_HIDDEN\r\n\tSHRINETYPE_SINGLE, // SHRINE_GLOOMY\r\n\tSHRINETYPE_SINGLE, // SHRINE_WEIRD\r\n\tSHRINETYPE_ANY,    // SHRINE_MAGICAL\r\n\tSHRINETYPE_ANY,    // SHRINE_STONE\r\n\tSHRINETYPE_ANY,    // SHRINE_RELIGIOUS\r\n\tSHRINETYPE_ANY,    // SHRINE_ENCHANTED\r\n\tSHRINETYPE_SINGLE, // SHRINE_THAUMATURGIC\r\n\tSHRINETYPE_ANY,    // SHRINE_FASCINATING\r\n\tSHRINETYPE_ANY,    // SHRINE_CRYPTIC\r\n\tSHRINETYPE_ANY,    // SHRINE_MAGICAL2\r\n\tSHRINETYPE_ANY,    // SHRINE_ELDRITCH\r\n\tSHRINETYPE_ANY,    // SHRINE_EERIE\r\n\tSHRINETYPE_ANY,    // SHRINE_DIVINE\r\n\tSHRINETYPE_ANY,    // SHRINE_HOLY\r\n\tSHRINETYPE_ANY,    // SHRINE_SACRED\r\n\tSHRINETYPE_ANY,    // SHRINE_SPIRITUAL\r\n\tSHRINETYPE_MULTI,  // SHRINE_SPOOKY\r\n\tSHRINETYPE_ANY,    // SHRINE_ABANDONED\r\n\tSHRINETYPE_ANY,    // SHRINE_CREEPY\r\n\tSHRINETYPE_ANY,    // SHRINE_QUIET\r\n\tSHRINETYPE_ANY,    // SHRINE_SECLUDED\r\n\tSHRINETYPE_ANY,    // SHRINE_ORNATE\r\n\tSHRINETYPE_ANY,    // SHRINE_GLIMMERING\r\n\tSHRINETYPE_MULTI,  // SHRINE_TAINTED\r\n#ifdef HELLFIRE\r\n\tSHRINETYPE_ANY,    // SHRINE_OILY\r\n\tSHRINETYPE_ANY,    // SHRINE_GLOWING\r\n\tSHRINETYPE_ANY,    // SHRINE_MENDICANT\r\n\tSHRINETYPE_ANY,    // SHRINE_SPARKLING\r\n\tSHRINETYPE_ANY,    // SHRINE_TOWN\r\n\tSHRINETYPE_ANY,    // SHRINE_SHIMMERING\r\n\tSHRINETYPE_SINGLE, // SHRINE_SOLAR\r\n\tSHRINETYPE_ANY,    // SHRINE_MURPHYS\r\n#endif\r\n};\r\n/** Maps from book_id to book name. */\r\nconst char *const StoryBookName[] = {\r\n\t\"The Great Conflict\",\r\n\t\"The Wages of Sin are War\",\r\n\t\"The Tale of the Horadrim\",\r\n\t\"The Dark Exile\",\r\n\t\"The Sin War\",\r\n\t\"The Binding of the Three\",\r\n\t\"The Realms Beyond\",\r\n\t\"Tale of the Three\",\r\n\t\"The Black King\",\r\n#ifdef HELLFIRE\r\n\t\"Journal: The Ensorcellment\",\r\n\t\"Journal: The Meeting\",\r\n\t\"Journal: The Tirade\",\r\n\t\"Journal: His Power Grows\",\r\n\t\"Journal: NA-KRUL\",\r\n\t\"Journal: The End\",\r\n\t\"A Spellbook\",\r\n#endif\r\n};\r\n/** Specifies the speech IDs of each dungeon type narrator book, for each player class. */\r\nint StoryText[3][3] = {\r\n\t{ TEXT_BOOK11, TEXT_BOOK12, TEXT_BOOK13 },\r\n\t{ TEXT_BOOK21, TEXT_BOOK22, TEXT_BOOK23 },\r\n\t{ TEXT_BOOK31, TEXT_BOOK32, TEXT_BOOK33 }\r\n};\r\n\r\nvoid InitObjectGFX()\r\n{\r\n\tBOOLEAN fileload[56];\r\n\tchar filestr[32];\r\n\tint i, j;\r\n\r\n\tmemset(fileload, FALSE, sizeof(fileload));\r\n\r\n#ifdef HELLFIRE\r\n\tint lvl = currlevel;\r\n\tif (currlevel >= 21 && currlevel <= 24)\r\n\t\tlvl -= 20;\r\n\telse if (currlevel >= 17 && currlevel <= 20)\r\n\t\tlvl -= 8;\r\n#endif\r\n\tfor (i = 0; AllObjects[i].oload != -1; i++) {\r\n\t\tif (AllObjects[i].oload == 1\r\n#ifdef HELLFIRE\r\n\t\t    && (int)lvl >= AllObjects[i].ominlvl\r\n\t\t    && (int)lvl <= AllObjects[i].omaxlvl) {\r\n#else\r\n\t\t    && (int)currlevel >= AllObjects[i].ominlvl\r\n\t\t    && (int)currlevel <= AllObjects[i].omaxlvl) {\r\n#endif\r\n\t\t\tfileload[AllObjects[i].ofindex] = TRUE;\r\n\t\t}\r\n\t\tif (AllObjects[i].otheme != THEME_NONE) {\r\n\t\t\tfor (j = 0; j < numthemes; j++) {\r\n\t\t\t\tif (themes[j].ttype == AllObjects[i].otheme)\r\n\t\t\t\t\tfileload[AllObjects[i].ofindex] = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (AllObjects[i].oquest != -1) {\r\n\t\t\tif (QuestStatus(AllObjects[i].oquest))\r\n\t\t\t\tfileload[AllObjects[i].ofindex] = TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; i < 56; i++) {\r\n\t\tif (fileload[i]) {\r\n\t\t\tObjFileList[numobjfiles] = i;\r\n\t\t\tsprintf(filestr, \"Objects\\\\%s.CEL\", ObjMasterLoadList[i]);\r\n#ifdef HELLFIRE\r\n\t\t\tif (currlevel >= 17 && currlevel < 21)\r\n\t\t\t\tsprintf(filestr, \"Objects\\\\%s.CEL\", ObjHiveLoadList[i]);\r\n\t\t\telse if (currlevel >= 21)\r\n\t\t\t\tsprintf(filestr, \"Objects\\\\%s.CEL\", ObjCryptLoadList[i]);\r\n#endif\r\n\t\t\tpObjCels[numobjfiles] = LoadFileInMem(filestr, NULL);\r\n\t\t\tnumobjfiles++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid FreeObjectGFX()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < numobjfiles; i++) {\r\n\t\tMemFreeDbg(pObjCels[i]);\r\n\t}\r\n\tnumobjfiles = 0;\r\n}\r\n\r\nDIABOOL RndLocOk(int xp, int yp)\r\n{\r\n\tif (dMonster[xp][yp] != 0)\r\n\t\treturn FALSE;\r\n\tif (dPlayer[xp][yp] != 0)\r\n\t\treturn FALSE;\r\n\tif (dObject[xp][yp] != 0)\r\n\t\treturn FALSE;\r\n\tif (dFlags[xp][yp] & BFLAG_POPULATED)\r\n\t\treturn FALSE;\r\n\tif (nSolidTable[dPiece[xp][yp]])\r\n\t\treturn FALSE;\r\n\tif (leveltype != DTYPE_CATHEDRAL || dPiece[xp][yp] <= 126 || dPiece[xp][yp] >= 144)\r\n\t\treturn TRUE;\r\n\treturn FALSE;\r\n}\r\n\r\nstatic DIABOOL WallTrapLocOkK(int xp, int yp)\r\n{\r\n\tif (dFlags[xp][yp] & BFLAG_POPULATED)\r\n\t\treturn FALSE;\r\n\r\n\tif (nTrapTable[dPiece[xp][yp]] != FALSE)\r\n\t\treturn TRUE;\r\n\telse\r\n\t\treturn FALSE;\r\n}\r\n\r\nvoid InitRndLocObj(int min, int max, int objtype)\r\n{\r\n\tint i, xp, yp, numobjs;\r\n\r\n\tnumobjs = random_(139, max - min) + min;\r\n\r\n\tfor (i = 0; i < numobjs; i++) {\r\n\t\twhile (1) {\r\n\t\t\txp = random_(139, 80) + 16;\r\n\t\t\typ = random_(139, 80) + 16;\r\n\t\t\tif (RndLocOk(xp - 1, yp - 1)\r\n\t\t\t    && RndLocOk(xp, yp - 1)\r\n\t\t\t    && RndLocOk(xp + 1, yp - 1)\r\n\t\t\t    && RndLocOk(xp - 1, yp)\r\n\t\t\t    && RndLocOk(xp, yp)\r\n\t\t\t    && RndLocOk(xp + 1, yp)\r\n\t\t\t    && RndLocOk(xp - 1, yp + 1)\r\n\t\t\t    && RndLocOk(xp, yp + 1)\r\n\t\t\t    && RndLocOk(xp + 1, yp + 1)) {\r\n\t\t\t\tAddObject(objtype, xp, yp);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid InitRndLocBigObj(int min, int max, int objtype)\r\n{\r\n\tint i, xp, yp, numobjs;\r\n\r\n\tnumobjs = random_(140, max - min) + min;\r\n\tfor (i = 0; i < numobjs; i++) {\r\n\t\twhile (1) {\r\n\t\t\txp = random_(140, 80) + 16;\r\n\t\t\typ = random_(140, 80) + 16;\r\n\t\t\tif (RndLocOk(xp - 1, yp - 2)\r\n\t\t\t    && RndLocOk(xp, yp - 2)\r\n\t\t\t    && RndLocOk(xp + 1, yp - 2)\r\n\t\t\t    && RndLocOk(xp - 1, yp - 1)\r\n\t\t\t    && RndLocOk(xp, yp - 1)\r\n\t\t\t    && RndLocOk(xp + 1, yp - 1)\r\n\t\t\t    && RndLocOk(xp - 1, yp)\r\n\t\t\t    && RndLocOk(xp, yp)\r\n\t\t\t    && RndLocOk(xp + 1, yp)\r\n\t\t\t    && RndLocOk(xp - 1, yp + 1)\r\n\t\t\t    && RndLocOk(xp, yp + 1)\r\n\t\t\t    && RndLocOk(xp + 1, yp + 1)) {\r\n\t\t\t\tAddObject(objtype, xp, yp);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid InitRndLocObj5x5(int min, int max, int objtype)\r\n{\r\n\tDIABOOL exit;\r\n\tint xp, yp, numobjs, i, cnt, m, n;\r\n\r\n\tnumobjs = min + random_(139, max - min);\r\n\tfor (i = 0; i < numobjs; i++) {\r\n\t\tcnt = 0;\r\n\t\texit = FALSE;\r\n\t\twhile (!exit) {\r\n\t\t\texit = TRUE;\r\n\t\t\txp = random_(139, 80) + 16;\r\n\t\t\typ = random_(139, 80) + 16;\r\n\t\t\tfor (n = -2; n <= 2; n++) {\r\n\t\t\t\tfor (m = -2; m <= 2; m++) {\r\n\t\t\t\t\tif (!RndLocOk(xp + m, yp + n))\r\n\t\t\t\t\t\texit = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!exit) {\r\n\t\t\t\tcnt++;\r\n\t\t\t\tif (cnt > 20000)\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tAddObject(objtype, xp, yp);\r\n\t}\r\n}\r\n\r\nvoid ClrAllObjects()\r\n{\r\n\tint i;\r\n\r\n#ifdef HELLFIRE\r\n\tmemset(object, 0, sizeof(object));\r\n#else\r\n\tfor (i = 0; i < MAXOBJECTS; i++) {\r\n\t\tobject[i]._ox = 0;\r\n\t\tobject[i]._oy = 0;\r\n\t\tobject[i]._oAnimData = 0;\r\n\t\tobject[i]._oAnimDelay = 0;\r\n\t\tobject[i]._oAnimCnt = 0;\r\n\t\tobject[i]._oAnimLen = 0;\r\n\t\tobject[i]._oAnimFrame = 0;\r\n\t\tobject[i]._oDelFlag = FALSE;\r\n\t\tobject[i]._oVar1 = 0;\r\n\t\tobject[i]._oVar2 = 0;\r\n\t\tobject[i]._oVar3 = 0;\r\n\t\tobject[i]._oVar4 = 0;\r\n\t}\r\n#endif\r\n\tnobjects = 0;\r\n\tfor (i = 0; i < MAXOBJECTS; i++) {\r\n\t\tobjectavail[i] = i;\r\n#ifndef HELLFIRE\r\n\t\tobjectactive[i] = 0;\r\n#endif\r\n\t}\r\n#ifdef HELLFIRE\r\n\tmemset(objectactive, 0, sizeof(objectactive));\r\n#endif\r\n\ttrapdir = 0;\r\n\ttrapid = 1;\r\n\tleverid = 1;\r\n}\r\n\r\nvoid AddTortures()\r\n{\r\n\tint ox, oy;\r\n\r\n\tfor (oy = 0; oy < MAXDUNY; oy++) {\r\n\t\tfor (ox = 0; ox < MAXDUNX; ox++) {\r\n\t\t\tif (dPiece[ox][oy] == 367) {\r\n\t\t\t\tAddObject(OBJ_TORTURE1, ox, oy + 1);\r\n\t\t\t\tAddObject(OBJ_TORTURE3, ox + 2, oy - 1);\r\n\t\t\t\tAddObject(OBJ_TORTURE2, ox, oy + 3);\r\n\t\t\t\tAddObject(OBJ_TORTURE4, ox + 4, oy - 1);\r\n\t\t\t\tAddObject(OBJ_TORTURE5, ox, oy + 5);\r\n\t\t\t\tAddObject(OBJ_TNUDEM1, ox + 1, oy + 3);\r\n\t\t\t\tAddObject(OBJ_TNUDEM2, ox + 4, oy + 5);\r\n\t\t\t\tAddObject(OBJ_TNUDEM3, ox + 2, oy);\r\n\t\t\t\tAddObject(OBJ_TNUDEM4, ox + 3, oy + 2);\r\n\t\t\t\tAddObject(OBJ_TNUDEW1, ox + 2, oy + 4);\r\n\t\t\t\tAddObject(OBJ_TNUDEW2, ox + 2, oy + 1);\r\n\t\t\t\tAddObject(OBJ_TNUDEW3, ox + 4, oy + 2);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\nvoid AddCandles()\r\n{\r\n\tint tx, ty;\r\n\r\n\ttx = quests[Q_PWATER]._qtx;\r\n\tty = quests[Q_PWATER]._qty;\r\n\tAddObject(OBJ_STORYCANDLE, tx - 2, ty + 1);\r\n\tAddObject(OBJ_STORYCANDLE, tx + 3, ty + 1);\r\n\tAddObject(OBJ_STORYCANDLE, tx - 1, ty + 2);\r\n\tAddObject(OBJ_STORYCANDLE, tx + 2, ty + 2);\r\n}\r\n\r\nvoid AddBookLever(int lx1, int ly1, int lx2, int ly2, int x1, int y1, int x2, int y2, int msg)\r\n{\r\n\tDIABOOL exit;\r\n\tint xp, yp, ob, cnt, m, n;\r\n\r\n\tcnt = 0;\r\n\texit = FALSE;\r\n\twhile (!exit) {\r\n\t\texit = TRUE;\r\n\t\txp = random_(139, 80) + 16;\r\n\t\typ = random_(139, 80) + 16;\r\n\t\tfor (n = -2; n <= 2; n++) {\r\n\t\t\tfor (m = -2; m <= 2; m++) {\r\n\t\t\t\tif (!RndLocOk(xp + m, yp + n))\r\n\t\t\t\t\texit = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!exit) {\r\n\t\t\tcnt++;\r\n\t\t\tif (cnt > 20000)\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tif (QuestStatus(Q_BLIND))\r\n\t\tAddObject(OBJ_BLINDBOOK, xp, yp);\r\n\tif (QuestStatus(Q_WARLORD))\r\n\t\tAddObject(OBJ_STEELTOME, xp, yp);\r\n\tif (QuestStatus(Q_BLOOD)) {\r\n\t\txp = 2 * setpc_x + 25;\r\n\t\typ = 2 * setpc_y + 40;\r\n\t\tAddObject(OBJ_BLOODBOOK, xp, yp);\r\n\t}\r\n\tob = dObject[xp][yp] - 1;\r\n\tSetObjMapRange(ob, x1, y1, x2, y2, leverid);\r\n\tSetBookMsg(ob, msg);\r\n\tleverid++;\r\n\tobject[ob]._oVar6 = object[ob]._oAnimFrame + 1;\r\n}\r\n\r\nvoid InitRndBarrels()\r\n{\r\n\tint numobjs; // number of groups of barrels to generate\r\n\tint xp, yp;\r\n\t_object_id o;\r\n\tDIABOOL found;\r\n\tint p; // regulates chance to stop placing barrels in current group\r\n\tint dir;\r\n\tint t; // number of tries of placing next barrel in current group\r\n\tint c; // number of barrels in current group\r\n\tint i;\r\n\r\n\tnumobjs = random_(143, 5) + 3;\r\n\tfor (i = 0; i < numobjs; i++) {\r\n\t\tdo {\r\n\t\t\txp = random_(143, 80) + 16;\r\n\t\t\typ = random_(143, 80) + 16;\r\n\t\t} while (!RndLocOk(xp, yp));\r\n\t\to = (random_(143, 4) != 0) ? OBJ_BARREL : OBJ_BARRELEX;\r\n\t\tAddObject(o, xp, yp);\r\n\t\tfound = TRUE;\r\n\t\tp = 0;\r\n\t\tc = 1;\r\n\t\twhile (random_(143, p) == 0 && found) {\r\n\t\t\tt = 0;\r\n\t\t\tfound = FALSE;\r\n\t\t\twhile (TRUE) {\r\n\t\t\t\tif (t >= 3)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdir = random_(143, 8);\r\n\t\t\t\txp += bxadd[dir];\r\n\t\t\t\typ += byadd[dir];\r\n\t\t\t\tfound = RndLocOk(xp, yp);\r\n\t\t\t\tt++;\r\n\t\t\t\tif (found)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (found) {\r\n\t\t\t\to = (random_(143, 5) != 0) ? OBJ_BARREL : OBJ_BARRELEX;\r\n\t\t\t\tAddObject(o, xp, yp);\r\n\t\t\t\tc++;\r\n\t\t\t}\r\n\t\t\tp = c >> 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddL1Objs(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j, pn;\r\n\r\n\tfor (j = y1; j < y2; j++) {\r\n\t\tfor (i = x1; i < x2; i++) {\r\n\t\t\tpn = dPiece[i][j];\r\n\t\t\tif (pn == 270)\r\n\t\t\t\tAddObject(OBJ_L1LIGHT, i, j);\r\n\t\t\tif (pn == 44 || pn == 51 || pn == 214)\r\n\t\t\t\tAddObject(OBJ_L1LDOOR, i, j);\r\n\t\t\tif (pn == 46 || pn == 56)\r\n\t\t\t\tAddObject(OBJ_L1RDOOR, i, j);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid add_crypt_objs(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j, pn;\r\n\r\n\tfor (j = y1; j < y2; j++) {\r\n\t\tfor (i = x1; i < x2; i++) {\r\n\t\t\tpn = dPiece[i][j];\r\n\t\t\tif (pn == 77)\r\n\t\t\t\tAddObject(OBJ_L1LDOOR, i, j);\r\n\t\t\tif (pn == 80)\r\n\t\t\t\tAddObject(OBJ_L1RDOOR, i, j);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#endif\r\nvoid AddL2Objs(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j, pn;\r\n\r\n\tfor (j = y1; j < y2; j++) {\r\n\t\tfor (i = x1; i < x2; i++) {\r\n\t\t\tpn = dPiece[i][j];\r\n\t\t\tif (pn == 13 || pn == 541)\r\n\t\t\t\tAddObject(OBJ_L2LDOOR, i, j);\r\n\t\t\tif (pn == 17 || pn == 542)\r\n\t\t\t\tAddObject(OBJ_L2RDOOR, i, j);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddL3Objs(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j, pn;\r\n\r\n\tfor (j = y1; j < y2; j++) {\r\n\t\tfor (i = x1; i < x2; i++) {\r\n\t\t\tpn = dPiece[i][j];\r\n\t\t\tif (pn == 531)\r\n\t\t\t\tAddObject(OBJ_L3LDOOR, i, j);\r\n\t\t\tif (pn == 534)\r\n\t\t\t\tAddObject(OBJ_L3RDOOR, i, j);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nDIABOOL TorchLocOK(int xp, int yp)\r\n{\r\n\tif (dFlags[xp][yp] & BFLAG_POPULATED)\r\n\t\treturn FALSE;\r\n\treturn TRUE;\r\n}\r\n\r\nvoid AddL2Torches()\r\n{\r\n\tint i, j, pn;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (!TorchLocOK(i, j))\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tpn = dPiece[i][j];\r\n\t\t\tif (pn == 1 && random_(145, 3) == 0)\r\n\t\t\t\tAddObject(OBJ_TORCHL2, i, j);\r\n\r\n\t\t\tif (pn == 5 && random_(145, 3) == 0)\r\n\t\t\t\tAddObject(OBJ_TORCHR2, i, j);\r\n\r\n\t\t\tif (pn == 37 && random_(145, 10) == 0 && dObject[i - 1][j] == 0)\r\n\t\t\t\tAddObject(OBJ_TORCHL, i - 1, j);\r\n\r\n\t\t\tif (pn == 41 && random_(145, 10) == 0 && dObject[i][j - 1] == 0)\r\n\t\t\t\tAddObject(OBJ_TORCHR, i, j - 1);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddObjTraps()\r\n{\r\n\tchar oi_trap, oi;\r\n\tint i, j;\r\n\tint xp, yp;\r\n\tint rndv;\r\n\r\n\tif (currlevel == 1)\r\n\t\trndv = 10;\r\n\tif (currlevel >= 2)\r\n\t\trndv = 15;\r\n\tif (currlevel >= 5)\r\n\t\trndv = 20;\r\n\tif (currlevel >= 7)\r\n\t\trndv = 25;\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dObject[i][j] <= 0 || random_(144, 100) >= rndv)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\toi = dObject[i][j] - 1;\r\n\t\t\tif (!AllObjects[object[oi]._otype].oTrapFlag)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tif (random_(144, 2) == 0) {\r\n\t\t\t\txp = i - 1;\r\n\t\t\t\twhile (!nSolidTable[dPiece[xp][j]])\r\n\t\t\t\t\txp--;\r\n\r\n\t\t\t\tif (!WallTrapLocOkK(xp, j) || i - xp <= 1)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\tAddObject(OBJ_TRAPL, xp, j);\r\n\t\t\t\toi_trap = dObject[xp][j] - 1;\r\n\t\t\t\tobject[oi_trap]._oVar1 = i;\r\n\t\t\t\tobject[oi_trap]._oVar2 = j;\r\n\t\t\t\tobject[oi]._oTrapFlag = TRUE;\r\n\t\t\t} else {\r\n\t\t\t\typ = j - 1;\r\n\t\t\t\twhile (!nSolidTable[dPiece[i][yp]])\r\n\t\t\t\t\typ--;\r\n\r\n\t\t\t\tif (!WallTrapLocOkK(i, yp) || j - yp <= 1)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\tAddObject(OBJ_TRAPR, i, yp);\r\n\t\t\t\toi_trap = dObject[i][yp] - 1;\r\n\t\t\t\tobject[oi_trap]._oVar1 = i;\r\n\t\t\t\tobject[oi_trap]._oVar2 = j;\r\n\t\t\t\tobject[oi]._oTrapFlag = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddChestTraps()\r\n{\r\n\tint i, j;\r\n\tchar oi;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dObject[i][j] > 0) {\r\n\t\t\t\toi = dObject[i][j] - 1;\r\n\t\t\t\tif (object[oi]._otype >= OBJ_CHEST1 && object[oi]._otype <= OBJ_CHEST3 && !object[oi]._oTrapFlag && random_(0, 100) < 10) {\r\n\t\t\t\t\tobject[oi]._otype += OBJ_TCHEST1 - OBJ_CHEST1;\r\n\t\t\t\t\tobject[oi]._oTrapFlag = TRUE;\r\n\t\t\t\t\tif (leveltype == DTYPE_CATACOMBS) {\r\n\t\t\t\t\t\tobject[oi]._oVar4 = random_(0, 2);\r\n\t\t\t\t\t} else {\r\n#ifdef HELLFIRE\r\n\t\t\t\t\t\tobject[oi]._oVar4 = random_(0, 6);\r\n#else\r\n\t\t\t\t\t\tobject[oi]._oVar4 = random_(0, 3);\r\n#endif\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid LoadMapObjects(BYTE *pMap, int startx, int starty, int x1, int y1, int w, int h, int leveridx)\r\n{\r\n\tint rw, rh, i, j, oi, type;\r\n\tBYTE *lm;\r\n\tlong mapoff;\r\n\r\n\tInitObjFlag = TRUE;\r\n\r\n\tlm = pMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tmapoff = (rw * rh + 1) * 2;\r\n\trw <<= 1;\r\n\trh <<= 1;\r\n\tmapoff += rw * 2 * rh * 2;\r\n\tlm += mapoff;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm) {\r\n\t\t\t\ttype = *lm;\r\n\t\t\t\tAddObject(ObjTypeConv[type], startx + 16 + i, starty + 16 + j);\r\n\t\t\t\toi = ObjIndex(startx + 16 + i, starty + 16 + j);\r\n\t\t\t\tSetObjMapRange(oi, x1, y1, x1 + w, y1 + h, leveridx);\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\tInitObjFlag = FALSE;\r\n}\r\n\r\nvoid LoadMapObjs(BYTE *pMap, int startx, int starty)\r\n{\r\n\tint rw, rh;\r\n\tint i, j;\r\n\tBYTE *lm;\r\n\tlong mapoff;\r\n\r\n\tInitObjFlag = TRUE;\r\n\tlm = pMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tmapoff = (rw * rh + 1) * 2;\r\n\trw <<= 1;\r\n\trh <<= 1;\r\n\tmapoff += 2 * rw * rh * 2;\r\n\tlm += mapoff;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm) {\r\n\t\t\t\tAddObject(ObjTypeConv[*lm], startx + 16 + i, starty + 16 + j);\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\tInitObjFlag = FALSE;\r\n}\r\n\r\nvoid AddDiabObjs()\r\n{\r\n\tBYTE *lpSetPiece;\r\n\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab1.DUN\", NULL);\r\n\tLoadMapObjects(lpSetPiece, 2 * diabquad1x, 2 * diabquad1y, diabquad2x, diabquad2y, 11, 12, 1);\r\n\tmem_free_dbg(lpSetPiece);\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab2a.DUN\", NULL);\r\n\tLoadMapObjects(lpSetPiece, 2 * diabquad2x, 2 * diabquad2y, diabquad3x, diabquad3y, 11, 11, 2);\r\n\tmem_free_dbg(lpSetPiece);\r\n\tlpSetPiece = LoadFileInMem(\"Levels\\\\L4Data\\\\diab3a.DUN\", NULL);\r\n\tLoadMapObjects(lpSetPiece, 2 * diabquad3x, 2 * diabquad3y, diabquad4x, diabquad4y, 9, 9, 3);\r\n\tmem_free_dbg(lpSetPiece);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid AddCryptStoryBook(int s)\r\n{\r\n\tDIABOOL exit;\r\n\tint xp, yp, cnt, m, n;\r\n\r\n\tcnt = 0;\r\n\texit = FALSE;\r\n\twhile (!exit) {\r\n\t\texit = TRUE;\r\n\t\txp = random_(139, 80) + 16;\r\n\t\typ = random_(139, 80) + 16;\r\n\t\tfor (n = -2; n <= 2; n++) {\r\n\t\t\tfor (m = -3; m <= 3; m++) {\r\n\t\t\t\tif (!RndLocOk(xp + m, yp + n))\r\n\t\t\t\t\texit = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!exit) {\r\n\t\t\tcnt++;\r\n\t\t\tif (cnt > 20000)\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tAddCryptBook(OBJ_STORYBOOK, s, xp, yp);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 2, yp + 1);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 2, yp);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 1, yp - 1);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 1, yp - 1);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 2, yp);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 2, yp + 1);\r\n}\r\n\r\nvoid AddNakrulGate()\r\n{\r\n\tAddNakrulLeaver();\r\n\tswitch (random_(0, 6)) {\r\n\tcase 0:\r\n\t\tAddNakrulBook(6, UberRow + 3, UberCol);\r\n\t\tAddNakrulBook(7, UberRow + 2, UberCol - 3);\r\n\t\tAddNakrulBook(8, UberRow + 2, UberCol + 2);\r\n\t\tbreak;\r\n\tcase 1:\r\n\t\tAddNakrulBook(6, UberRow + 3, UberCol);\r\n\t\tAddNakrulBook(8, UberRow + 2, UberCol - 3);\r\n\t\tAddNakrulBook(7, UberRow + 2, UberCol + 2);\r\n\t\tbreak;\r\n\tcase 2:\r\n\t\tAddNakrulBook(7, UberRow + 3, UberCol);\r\n\t\tAddNakrulBook(6, UberRow + 2, UberCol - 3);\r\n\t\tAddNakrulBook(8, UberRow + 2, UberCol + 2);\r\n\t\tbreak;\r\n\tcase 3:\r\n\t\tAddNakrulBook(7, UberRow + 3, UberCol);\r\n\t\tAddNakrulBook(8, UberRow + 2, UberCol - 3);\r\n\t\tAddNakrulBook(6, UberRow + 2, UberCol + 2);\r\n\t\tbreak;\r\n\tcase 4:\r\n\t\tAddNakrulBook(8, UberRow + 3, UberCol);\r\n\t\tAddNakrulBook(7, UberRow + 2, UberCol - 3);\r\n\t\tAddNakrulBook(6, UberRow + 2, UberCol + 2);\r\n\t\tbreak;\r\n\tcase 5:\r\n\t\tAddNakrulBook(8, UberRow + 3, UberCol);\r\n\t\tAddNakrulBook(6, UberRow + 2, UberCol - 3);\r\n\t\tAddNakrulBook(7, UberRow + 2, UberCol + 2);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid AddNakrulBook(int a1, int a2, int a3)\r\n{\r\n\tAddCryptBook(OBJ_STORYBOOK, a1, a2, a3);\r\n}\r\n#endif\r\n\r\nvoid AddStoryBooks()\r\n{\r\n\tint xp, yp, xx, yy;\r\n\tint cnt;\r\n\tDIABOOL done;\r\n\r\n\tcnt = 0;\r\n\tdone = FALSE;\r\n\twhile (!done) {\r\n\t\tdone = TRUE;\r\n\t\txp = random_(139, 80) + 16;\r\n\t\typ = random_(139, 80) + 16;\r\n\t\tfor (yy = -2; yy <= 2; yy++) {\r\n\t\t\tfor (xx = -3; xx <= 3; xx++) {\r\n\t\t\t\tif (!RndLocOk(xx + xp, yy + yp))\r\n\t\t\t\t\tdone = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!done) {\r\n\t\t\tcnt++;\r\n\t\t\tif (cnt > 20000)\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tAddObject(OBJ_STORYBOOK, xp, yp);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 2, yp + 1);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 2, yp);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 1, yp - 1);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 1, yp - 1);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 2, yp);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 2, yp + 1);\r\n}\r\n\r\nvoid AddHookedBodies(int freq)\r\n{\r\n\tint i, j, ii, jj;\r\n\r\n\tfor (j = 0; j < DMAXY; j++) {\r\n\t\tjj = 16 + j * 2;\r\n\t\tfor (i = 0; i < DMAXX; i++) {\r\n\t\t\tii = 16 + i * 2;\r\n\t\t\tif (dungeon[i][j] != 1 && dungeon[i][j] != 2)\r\n\t\t\t\tcontinue;\r\n\t\t\tif (random_(0, freq) != 0)\r\n\t\t\t\tcontinue;\r\n\t\t\tif (!SkipThemeRoom(i, j))\r\n\t\t\t\tcontinue;\r\n\t\t\tif (dungeon[i][j] == 1 && dungeon[i + 1][j] == 6) {\r\n\t\t\t\tswitch (random_(0, 3)) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tAddObject(OBJ_TORTURE1, ii + 1, jj);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tAddObject(OBJ_TORTURE2, ii + 1, jj);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tAddObject(OBJ_TORTURE5, ii + 1, jj);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (dungeon[i][j] == 2 && dungeon[i][j + 1] == 6) {\r\n\t\t\t\tswitch (random_(0, 2)) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tAddObject(OBJ_TORTURE3, ii, jj);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tAddObject(OBJ_TORTURE4, ii, jj);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddL4Goodies()\r\n{\r\n\tAddHookedBodies(6);\r\n\tInitRndLocObj(2, 6, OBJ_TNUDEM1);\r\n\tInitRndLocObj(2, 6, OBJ_TNUDEM2);\r\n\tInitRndLocObj(2, 6, OBJ_TNUDEM3);\r\n\tInitRndLocObj(2, 6, OBJ_TNUDEM4);\r\n\tInitRndLocObj(2, 6, OBJ_TNUDEW1);\r\n\tInitRndLocObj(2, 6, OBJ_TNUDEW2);\r\n\tInitRndLocObj(2, 6, OBJ_TNUDEW3);\r\n\tInitRndLocObj(2, 6, OBJ_DECAP);\r\n\tInitRndLocObj(1, 3, OBJ_CAULDRON);\r\n}\r\n\r\nvoid AddLazStand()\r\n{\r\n\tint xp, yp, xx, yy;\r\n\tint cnt;\r\n\tDIABOOL found;\r\n\r\n\tcnt = 0;\r\n\tfound = FALSE;\r\n\twhile (!found) {\r\n\t\tfound = TRUE;\r\n\t\txp = random_(139, 80) + 16;\r\n\t\typ = random_(139, 80) + 16;\r\n\t\tfor (yy = -3; yy <= 3; yy++) {\r\n\t\t\tfor (xx = -2; xx <= 3; xx++) {\r\n\t\t\t\tif (!RndLocOk(xp + xx, yp + yy))\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!found) {\r\n\t\t\tcnt++;\r\n\t\t\tif (cnt > 10000) {\r\n\t\t\t\tInitRndLocObj(1, 1, OBJ_LAZSTAND);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tAddObject(OBJ_LAZSTAND, xp, yp);\r\n\tAddObject(OBJ_TNUDEM2, xp, yp + 2);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 1, yp + 2);\r\n\tAddObject(OBJ_TNUDEM3, xp + 2, yp + 2);\r\n\tAddObject(OBJ_TNUDEW1, xp, yp - 2);\r\n\tAddObject(OBJ_STORYCANDLE, xp + 1, yp - 2);\r\n\tAddObject(OBJ_TNUDEW2, xp + 2, yp - 2);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 1, yp - 1);\r\n\tAddObject(OBJ_TNUDEW3, xp - 1, yp);\r\n\tAddObject(OBJ_STORYCANDLE, xp - 1, yp + 1);\r\n}\r\n\r\nvoid InitObjects()\r\n{\r\n\tint sp_id;\r\n\tBYTE *mem;\r\n\r\n\tClrAllObjects();\r\n#ifdef HELLFIRE\r\n\tdword_6DE0E0 = 0;\r\n#endif\r\n\tif (currlevel == 16) {\r\n\t\tAddDiabObjs();\r\n\t} else {\r\n\t\tInitObjFlag = TRUE;\r\n\t\tGetRndSeed();\r\n\t\tif (currlevel == 9 && gbMaxPlayers == 1)\r\n\t\t\tAddSlainHero();\r\n\t\tif (currlevel == quests[Q_MUSHROOM]._qlevel && quests[Q_MUSHROOM]._qactive == QUEST_INIT)\r\n\t\t\tAddMushPatch();\r\n\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel == 4 || currlevel == 8 || currlevel == 12)\r\n\t\t\tAddStoryBooks();\r\n\t\tif (currlevel == 21) {\r\n\t\t\tAddCryptStoryBook(1);\r\n\t\t} else if (currlevel == 22) {\r\n\t\t\tAddCryptStoryBook(2);\r\n\t\t\tAddCryptStoryBook(3);\r\n\t\t} else if (currlevel == 23) {\r\n\t\t\tAddCryptStoryBook(4);\r\n\t\t\tAddCryptStoryBook(5);\r\n\t\t}\r\n\t\tif (currlevel == 24) {\r\n\t\t\tAddNakrulGate();\r\n\t\t}\r\n#else\r\n\t\tif (currlevel == 4)\r\n\t\t\tAddStoryBooks();\r\n\t\tif (currlevel == 8)\r\n\t\t\tAddStoryBooks();\r\n\t\tif (currlevel == 12)\r\n\t\t\tAddStoryBooks();\r\n#endif\r\n\t\tif (leveltype == DTYPE_CATHEDRAL) {\r\n\t\t\tif (QuestStatus(Q_BUTCHER))\r\n\t\t\t\tAddTortures();\r\n\t\t\tif (QuestStatus(Q_PWATER))\r\n\t\t\t\tAddCandles();\r\n\t\t\tif (QuestStatus(Q_LTBANNER))\r\n\t\t\t\tAddObject(OBJ_SIGNCHEST, 2 * setpc_x + 26, 2 * setpc_y + 19);\r\n\t\t\tInitRndLocBigObj(10, 15, OBJ_SARC);\r\n#ifdef HELLFIRE\r\n\t\t\tif (currlevel >= 21)\r\n\t\t\t\tadd_crypt_objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\t\telse\r\n#endif\r\n\t\t\t\tAddL1Objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\t\tInitRndBarrels();\r\n\t\t}\r\n\t\tif (leveltype == DTYPE_CATACOMBS) {\r\n\t\t\tif (QuestStatus(Q_ROCK))\r\n\t\t\t\tInitRndLocObj5x5(1, 1, OBJ_STAND);\r\n\t\t\tif (QuestStatus(Q_SCHAMB))\r\n\t\t\t\tInitRndLocObj5x5(1, 1, OBJ_BOOK2R);\r\n\t\t\tAddL2Objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\t\tAddL2Torches();\r\n\t\t\tif (QuestStatus(Q_BLIND)) {\r\n\t\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\t\tsp_id = TEXT_BLINDING;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\t\tsp_id = TEXT_RBLINDING;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\t\tsp_id = TEXT_MBLINDING;\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\t\tsp_id = TEXT_HBLINDING;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\t\tsp_id = TEXT_BBLINDING;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\t\tsp_id = TEXT_BLINDING;\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t\tquests[Q_BLIND]._qmsg = sp_id;\r\n\t\t\t\tAddBookLever(0, 0, MAXDUNX, MAXDUNY, setpc_x, setpc_y, setpc_w + setpc_x + 1, setpc_h + setpc_y + 1, sp_id);\r\n\t\t\t\tmem = LoadFileInMem(\"Levels\\\\L2Data\\\\Blind2.DUN\", NULL);\r\n\t\t\t\t// BUGFIX: should not invoke LoadMapObjs for Blind2.DUN, as Blind2.DUN is missing an objects layer.\r\n\t\t\t\tLoadMapObjs(mem, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\t\tmem_free_dbg(mem);\r\n\t\t\t}\r\n\t\t\tif (QuestStatus(Q_BLOOD)) {\r\n\t\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\t\tsp_id = TEXT_BLOODY;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\t\tsp_id = TEXT_RBLOODY;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\t\tsp_id = TEXT_MBLOODY;\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\t\tsp_id = TEXT_HBLOODY;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\t\tsp_id = TEXT_BBLOODY;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\t\tsp_id = TEXT_BLOODY;\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t\tquests[Q_BLOOD]._qmsg = sp_id;\r\n\t\t\t\tAddBookLever(0, 0, MAXDUNX, MAXDUNY, setpc_x, setpc_y + 3, setpc_x + 2, setpc_y + 7, sp_id);\r\n\t\t\t\tAddObject(OBJ_PEDISTAL, 2 * setpc_x + 25, 2 * setpc_y + 32);\r\n\t\t\t}\r\n\t\t\tInitRndBarrels();\r\n\t\t}\r\n\t\tif (leveltype == DTYPE_CAVES) {\r\n\t\t\tAddL3Objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\t\tInitRndBarrels();\r\n\t\t}\r\n\t\tif (leveltype == DTYPE_HELL) {\r\n\t\t\tif (QuestStatus(Q_WARLORD)) {\r\n\t\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\t\tsp_id = TEXT_BLOODWAR;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\t\tsp_id = TEXT_RBLOODWAR;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\t\tsp_id = TEXT_MBLOODWAR;\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\t\tsp_id = TEXT_HBLOODWAR;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\t\tsp_id = TEXT_BBLOODWAR;\r\n\t\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\t\tsp_id = TEXT_BLOODWAR;\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t\tquests[Q_WARLORD]._qmsg = sp_id;\r\n\t\t\t\tAddBookLever(0, 0, MAXDUNX, MAXDUNY, setpc_x, setpc_y, setpc_x + setpc_w, setpc_y + setpc_h, sp_id);\r\n\t\t\t\tmem = LoadFileInMem(\"Levels\\\\L4Data\\\\Warlord.DUN\", NULL);\r\n\t\t\t\tLoadMapObjs(mem, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\t\tmem_free_dbg(mem);\r\n\t\t\t}\r\n\t\t\tif (QuestStatus(Q_BETRAYER) && gbMaxPlayers == 1)\r\n\t\t\t\tAddLazStand();\r\n\t\t\tInitRndBarrels();\r\n\t\t\tAddL4Goodies();\r\n\t\t}\r\n\t\tInitRndLocObj(5, 10, OBJ_CHEST1);\r\n\t\tInitRndLocObj(3, 6, OBJ_CHEST2);\r\n\t\tInitRndLocObj(1, 5, OBJ_CHEST3);\r\n\t\tif (leveltype != DTYPE_HELL)\r\n\t\t\tAddObjTraps();\r\n\t\tif (leveltype > DTYPE_CATHEDRAL)\r\n\t\t\tAddChestTraps();\r\n\t\tInitObjFlag = FALSE;\r\n\t}\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid SetMapObjects(BYTE *pMap, int startx, int starty)\r\n{\r\n\tint rw, rh;\r\n\tint i, j;\r\n\tBYTE *lm, *h;\r\n\tlong mapoff;\r\n\tint fileload[56];\r\n\tchar filestr[32];\r\n\r\n\tClrAllObjects();\r\n\tfor (i = 0; i < 56; i++)\r\n\t\tfileload[i] = FALSE;\r\n\tInitObjFlag = TRUE;\r\n\r\n\tfor (i = 0; AllObjects[i].oload != -1; i++) {\r\n\t\tif (AllObjects[i].oload == 1 && leveltype == AllObjects[i].olvltype)\r\n\t\t\tfileload[AllObjects[i].ofindex] = TRUE;\r\n\t}\r\n\r\n\tlm = pMap;\r\n\trw = *lm;\r\n\tlm += 2;\r\n\trh = *lm;\r\n\tmapoff = (rw * rh + 1) * 2;\r\n\trw <<= 1;\r\n\trh <<= 1;\r\n\tmapoff += 2 * rw * rh * 2;\r\n\tlm += mapoff;\r\n\th = lm;\r\n\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm) {\r\n\t\t\t\tfileload[AllObjects[ObjTypeConv[*lm]].ofindex] = TRUE;\r\n\t\t\t}\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; i < 56; i++) {\r\n\t\tif (!fileload[i])\r\n\t\t\tcontinue;\r\n\r\n\t\tObjFileList[numobjfiles] = i;\r\n\t\tsprintf(filestr, \"Objects\\\\%s.CEL\", ObjMasterLoadList[i]);\r\n\t\tpObjCels[numobjfiles] = LoadFileInMem(filestr, NULL);\r\n\t\tnumobjfiles++;\r\n\t}\r\n\r\n\tlm = h;\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*lm)\r\n\t\t\t\tAddObject(ObjTypeConv[*lm], startx + 16 + i, starty + 16 + j);\r\n\t\t\tlm += 2;\r\n\t\t}\r\n\t}\r\n\tInitObjFlag = FALSE;\r\n}\r\n#endif\r\n\r\nvoid DeleteObject_(int oi, int i)\r\n{\r\n\tint ox, oy;\r\n\r\n\tox = object[oi]._ox;\r\n\toy = object[oi]._oy;\r\n\tdObject[ox][oy] = 0;\r\n\tobjectavail[-nobjects + MAXOBJECTS] = oi;\r\n\tnobjects--;\r\n\tif (nobjects > 0 && i != nobjects)\r\n\t\tobjectactive[i] = objectactive[nobjects];\r\n}\r\n\r\nvoid SetupObject(int i, int x, int y, int ot)\r\n{\r\n\tint ofi;\r\n\tint j;\r\n\r\n\tobject[i]._otype = ot;\r\n\tofi = AllObjects[ot].ofindex;\r\n\tobject[i]._ox = x;\r\n\tobject[i]._oy = y;\r\n\tj = 0;\r\n\twhile (ObjFileList[j] != ofi) {\r\n\t\tj++;\r\n\t}\r\n\tobject[i]._oAnimData = pObjCels[j];\r\n\tobject[i]._oAnimFlag = AllObjects[ot].oAnimFlag;\r\n\tif (AllObjects[ot].oAnimFlag) {\r\n\t\tobject[i]._oAnimDelay = AllObjects[ot].oAnimDelay;\r\n\t\tobject[i]._oAnimCnt = random_(146, AllObjects[ot].oAnimDelay);\r\n\t\tobject[i]._oAnimLen = AllObjects[ot].oAnimLen;\r\n\t\tobject[i]._oAnimFrame = random_(146, AllObjects[ot].oAnimLen - 1) + 1;\r\n\t} else {\r\n\t\tobject[i]._oAnimDelay = 1000;\r\n\t\tobject[i]._oAnimCnt = 0;\r\n\t\tobject[i]._oAnimLen = AllObjects[ot].oAnimLen;\r\n\t\tobject[i]._oAnimFrame = AllObjects[ot].oAnimDelay;\r\n\t}\r\n\tobject[i]._oAnimWidth = AllObjects[ot].oAnimWidth;\r\n\tobject[i]._oSolidFlag = AllObjects[ot].oSolidFlag;\r\n\tobject[i]._oMissFlag = AllObjects[ot].oMissFlag;\r\n\tobject[i]._oLight = AllObjects[ot].oLightFlag;\r\n\tobject[i]._oDelFlag = FALSE;\r\n\tobject[i]._oBreak = AllObjects[ot].oBreak;\r\n\tobject[i]._oSelFlag = AllObjects[ot].oSelFlag;\r\n\tobject[i]._oPreFlag = FALSE;\r\n\tobject[i]._oTrapFlag = FALSE;\r\n\tobject[i]._oDoorFlag = FALSE;\r\n}\r\n\r\nvoid SetObjMapRange(int i, int x1, int y1, int x2, int y2, int v)\r\n{\r\n\tobject[i]._oVar1 = x1;\r\n\tobject[i]._oVar2 = y1;\r\n\tobject[i]._oVar3 = x2;\r\n\tobject[i]._oVar4 = y2;\r\n\tobject[i]._oVar8 = v;\r\n}\r\n\r\nvoid SetBookMsg(int i, int msg)\r\n{\r\n\tobject[i]._oVar7 = msg;\r\n}\r\n\r\nvoid AddL1Door(int i, int x, int y, int ot)\r\n{\r\n\tobject[i]._oDoorFlag = TRUE;\r\n\tif (ot == 1) {\r\n\t\tobject[i]._oVar1 = dPiece[x][y];\r\n\t\tobject[i]._oVar2 = dPiece[x][y - 1];\r\n\t} else {\r\n\t\tobject[i]._oVar1 = dPiece[x][y];\r\n\t\tobject[i]._oVar2 = dPiece[x - 1][y];\r\n\t}\r\n\tobject[i]._oVar4 = 0;\r\n}\r\n\r\nvoid AddSCambBook(int i)\r\n{\r\n\tobject[i]._oVar1 = setpc_x;\r\n\tobject[i]._oVar2 = setpc_y;\r\n\tobject[i]._oVar3 = setpc_w + setpc_x + 1;\r\n\tobject[i]._oVar4 = setpc_h + setpc_y + 1;\r\n\tobject[i]._oVar6 = object[i]._oAnimFrame + 1;\r\n}\r\n\r\nvoid AddChest(int i, int t)\r\n{\r\n\tif (random_(147, 2) == 0)\r\n\t\tobject[i]._oAnimFrame += 3;\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n\tswitch (t) {\r\n\tcase OBJ_CHEST1:\r\n\tcase OBJ_TCHEST1:\r\n\t\tif (setlevel) {\r\n\t\t\tobject[i]._oVar1 = 1;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tobject[i]._oVar1 = random_(147, 2);\r\n\t\tbreak;\r\n\tcase OBJ_TCHEST2:\r\n\tcase OBJ_CHEST2:\r\n\t\tif (setlevel) {\r\n\t\t\tobject[i]._oVar1 = 2;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tobject[i]._oVar1 = random_(147, 3);\r\n\t\tbreak;\r\n\tcase OBJ_TCHEST3:\r\n\tcase OBJ_CHEST3:\r\n\t\tif (setlevel) {\r\n\t\t\tobject[i]._oVar1 = 3;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tobject[i]._oVar1 = random_(147, 4);\r\n\t\tbreak;\r\n\t}\r\n\tobject[i]._oVar2 = random_(147, 8);\r\n}\r\n\r\nvoid AddL2Door(int i, int x, int y, int ot)\r\n{\r\n\tobject[i]._oDoorFlag = TRUE;\r\n\tif (ot == OBJ_L2LDOOR)\r\n\t\tObjSetMicro(x, y, 538);\r\n\telse\r\n\t\tObjSetMicro(x, y, 540);\r\n\tobject[i]._oVar4 = 0;\r\n}\r\n\r\nvoid AddL3Door(int i, int x, int y, int ot)\r\n{\r\n\tobject[i]._oDoorFlag = TRUE;\r\n\tif (ot == OBJ_L3LDOOR)\r\n\t\tObjSetMicro(x, y, 531);\r\n\telse\r\n\t\tObjSetMicro(x, y, 534);\r\n\tobject[i]._oVar4 = 0;\r\n}\r\n\r\nvoid AddSarc(int i)\r\n{\r\n\tdObject[object[i]._ox][object[i]._oy - 1] = -(i + 1);\r\n\tobject[i]._oVar1 = random_(153, 10);\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n\tif (object[i]._oVar1 >= 8)\r\n\t\tobject[i]._oVar2 = PreSpawnSkeleton();\r\n}\r\n\r\nvoid AddFlameTrap(int i)\r\n{\r\n\tobject[i]._oVar1 = trapid;\r\n\tobject[i]._oVar2 = 0;\r\n\tobject[i]._oVar3 = trapdir;\r\n\tobject[i]._oVar4 = 0;\r\n}\r\n\r\nvoid AddFlameLvr(int i)\r\n{\r\n\tobject[i]._oVar1 = trapid;\r\n\tobject[i]._oVar2 = MIS_FLAMEC;\r\n}\r\n\r\nvoid AddTrap(int i, int ot)\r\n{\r\n\tint mt;\r\n\r\n\tmt = currlevel / 3 + 1;\r\n#ifdef HELLFIRE\r\n\tif (currlevel > 16) {\r\n\t\tmt = (currlevel - 4) / 3 + 1;\r\n\t}\r\n\tif (currlevel > 20) {\r\n\t\tmt = (currlevel - 8) / 3 + 1;\r\n\t}\r\n#endif\r\n\tmt = random_(148, mt);\r\n\tif (mt == 0)\r\n\t\tobject[i]._oVar3 = MIS_ARROW;\r\n\tif (mt == 1)\r\n\t\tobject[i]._oVar3 = MIS_FIREBOLT;\r\n\tif (mt == 2)\r\n\t\tobject[i]._oVar3 = MIS_LIGHTCTRL;\r\n\tobject[i]._oVar4 = 0;\r\n}\r\n\r\nvoid AddObjLight(int i, int r)\r\n{\r\n\tif (InitObjFlag) {\r\n\t\tDoLighting(object[i]._ox, object[i]._oy, r, -1);\r\n\t\tobject[i]._oVar1 = -1;\r\n\t} else {\r\n\t\tobject[i]._oVar1 = 0;\r\n\t}\r\n}\r\n\r\nvoid AddBarrel(int i, int t)\r\n{\r\n\tobject[i]._oVar1 = 0;\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n\tobject[i]._oVar2 = random_(149, 10);\r\n\tobject[i]._oVar3 = random_(149, 3);\r\n\r\n\tif (object[i]._oVar2 >= 8)\r\n\t\tobject[i]._oVar4 = PreSpawnSkeleton();\r\n}\r\n\r\nvoid AddShrine(int i)\r\n{\r\n\tint val;\r\n\tDIABOOL slist[NUM_SHRINETYPE];\r\n#ifdef HELLFIRE\r\n\tunsigned int j;\r\n#else\r\n\tint j;\r\n#endif\r\n\r\n\t// BUGFIX: the seed of shrine objects (object[i]._oRndSeed) was never\r\n\t// initialized. This lead to undefined behaviour, as the shrine object would\r\n\t// use whatever value was present in memory (often the seed of an object with\r\n\t// the same object index of a previous dungeon level).\r\n\r\n\tobject[i]._oPreFlag = TRUE;\r\n\tfor (j = 0; j < NUM_SHRINETYPE; j++) {\r\n\t\tif (currlevel < shrinemin[j] || currlevel > shrinemax[j]) {\r\n\t\t\tslist[j] = 0;\r\n\t\t} else {\r\n\t\t\tslist[j] = 1;\r\n\t\t}\r\n\t\tif (gbMaxPlayers != 1 && shrineavail[j] == 1) {\r\n\t\t\tslist[j] = 0;\r\n\t\t}\r\n\t\tif (gbMaxPlayers == 1 && shrineavail[j] == 2) {\r\n\t\t\tslist[j] = 0;\r\n\t\t}\r\n\t}\r\n\tdo {\r\n\t\tval = random_(150, NUM_SHRINETYPE);\r\n\t} while (!slist[val]);\r\n\r\n\tobject[i]._oVar1 = val;\r\n\tif (random_(150, 2) != 0) {\r\n\t\tobject[i]._oAnimFrame = 12;\r\n\t\tobject[i]._oAnimLen = 22;\r\n\t}\r\n}\r\n\r\nvoid AddBookcase(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n\tobject[i]._oPreFlag = TRUE;\r\n}\r\n\r\nvoid AddBookstand(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddBloodFtn(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddPurifyingFountain(int i)\r\n{\r\n\tint ox, oy;\r\n\r\n\tox = object[i]._ox;\r\n\toy = object[i]._oy;\r\n\tdObject[ox][oy - 1] = -1 - i;\r\n\tdObject[ox - 1][oy] = -1 - i;\r\n\tdObject[ox - 1][oy - 1] = -1 - i;\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddArmorStand(int i)\r\n{\r\n\tif (!armorFlag) {\r\n\t\tobject[i]._oAnimFlag = 2;\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t}\r\n\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddGoatShrine(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddCauldron(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddMurkyFountain(int i)\r\n{\r\n\tint ox, oy;\r\n\r\n\tox = object[i]._ox;\r\n\toy = object[i]._oy;\r\n\tdObject[ox][oy - 1] = -1 - i;\r\n\tdObject[ox - 1][oy] = -1 - i;\r\n\tdObject[ox - 1][oy - 1] = -1 - i;\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddTearFountain(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddDecap(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n\tobject[i]._oAnimFrame = random_(151, 8) + 1;\r\n\tobject[i]._oPreFlag = TRUE;\r\n}\r\n\r\nvoid AddVilebook(int i)\r\n{\r\n\tif (setlevel && setlvlnum == SL_VILEBETRAYER) {\r\n\t\tobject[i]._oAnimFrame = 4;\r\n\t}\r\n}\r\n\r\nvoid AddMagicCircle(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n\tobject[i]._oPreFlag = TRUE;\r\n\tobject[i]._oVar6 = 0;\r\n\tobject[i]._oVar5 = 1;\r\n}\r\n\r\nvoid AddBrnCross(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddPedistal(int i)\r\n{\r\n\tobject[i]._oVar1 = setpc_x;\r\n\tobject[i]._oVar2 = setpc_y;\r\n\tobject[i]._oVar3 = setpc_x + setpc_w;\r\n\tobject[i]._oVar4 = setpc_y + setpc_h;\r\n}\r\n\r\nvoid AddStoryBook(int i)\r\n{\r\n\tSetRndSeed(glSeedTbl[16]);\r\n\r\n\tobject[i]._oVar1 = random_(0, 3);\r\n\tif (currlevel == 4)\r\n\t\tobject[i]._oVar2 = StoryText[object[i]._oVar1][0];\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 8)\r\n#else\r\n\telse if (currlevel == 8)\r\n#endif\r\n\t\tobject[i]._oVar2 = StoryText[object[i]._oVar1][1];\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 12)\r\n#else\r\n\telse if (currlevel == 12)\r\n#endif\r\n\t\tobject[i]._oVar2 = StoryText[object[i]._oVar1][2];\r\n\tobject[i]._oVar3 = (currlevel >> 2) + 3 * object[i]._oVar1 - 1;\r\n\tobject[i]._oAnimFrame = 5 - 2 * object[i]._oVar1;\r\n\tobject[i]._oVar4 = object[i]._oAnimFrame + 1;\r\n}\r\n\r\nvoid AddWeaponRack(int i)\r\n{\r\n\tif (!weaponFlag) {\r\n\t\tobject[i]._oAnimFlag = 2;\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t}\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n}\r\n\r\nvoid AddTorturedBody(int i)\r\n{\r\n\tobject[i]._oRndSeed = GetRndSeed();\r\n\tobject[i]._oAnimFrame = random_(0, 4) + 1;\r\n\tobject[i]._oPreFlag = TRUE;\r\n}\r\n\r\nvoid GetRndObjLoc(int randarea, int &xx, int &yy)\r\n{\r\n\tDIABOOL failed;\r\n\tint i, j, tries;\r\n\r\n\tif (randarea == 0)\r\n\t\treturn;\r\n\r\n\ttries = 0;\r\n\twhile (1) {\r\n\t\ttries++;\r\n\t\tif (tries > 1000 && randarea > 1)\r\n\t\t\trandarea--;\r\n\t\txx = random_(0, MAXDUNX);\r\n\t\tyy = random_(0, MAXDUNY);\r\n\t\tfailed = FALSE;\r\n\t\tfor (i = 0; i < randarea && !failed; i++) {\r\n\t\t\tfor (j = 0; j < randarea && !failed; j++) {\r\n\t\t\t\tfailed = !RndLocOk(i + xx, j + yy);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!failed)\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid AddMushPatch()\r\n{\r\n\tint i;\r\n\tint y, x;\r\n\r\n\tif (nobjects < MAXOBJECTS) {\r\n\t\ti = objectavail[0];\r\n\t\tGetRndObjLoc(5, x, y);\r\n\t\tdObject[x + 1][y + 1] = -1 - i;\r\n\t\tdObject[x + 2][y + 1] = -1 - i;\r\n\t\tdObject[x + 1][y + 2] = -1 - i;\r\n\t\tAddObject(OBJ_MUSHPATCH, x + 2, y + 2);\r\n\t}\r\n}\r\n\r\nvoid AddSlainHero()\r\n{\r\n\tint x, y;\r\n\r\n\tGetRndObjLoc(5, x, y);\r\n\tAddObject(OBJ_SLAINHERO, x + 2, y + 2);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid AddCryptBook(int ot, int v2, int ox, int oy)\r\n{\r\n\tint oi;\r\n\r\n\tif (nobjects >= MAXOBJECTS)\r\n\t\treturn;\r\n\r\n\toi = objectavail[0];\r\n\tobjectavail[0] = objectavail[MAXOBJECTS - 1 - nobjects];\r\n\tobjectactive[nobjects] = oi;\r\n\tdObject[ox][oy] = oi + 1;\r\n\tSetupObject(oi, ox, oy, ot);\r\n\tAddCryptObject(oi, v2);\r\n\tobject[oi]._oAnimWidth2 = (object[oi]._oAnimWidth - 64) >> 1;\r\n\tnobjects++;\r\n}\r\n\r\nvoid AddCryptObject(int i, int a2)\r\n{\r\n\tint v8, v9;\r\n\tif (a2 > 5) {\r\n\t\tobject[i]._oVar8 = a2;\r\n\t\tswitch (a2) {\r\n\t\tcase 6:\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tobject[i]._oVar2 = 323;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tobject[i]._oVar2 = 332;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tobject[i]._oVar2 = 329;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tobject[i]._oVar2 = 326;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tobject[i]._oVar2 = 335;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tobject[i]._oVar2 = 323;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 7:\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tobject[i]._oVar2 = 324;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tobject[i]._oVar2 = 333;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tobject[i]._oVar2 = 330;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tobject[i]._oVar2 = 327;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tobject[i]._oVar2 = 336;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tobject[i]._oVar2 = 324;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 8:\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tobject[i]._oVar2 = 325;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tobject[i]._oVar2 = 334;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tobject[i]._oVar2 = 331;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tobject[i]._oVar2 = 328;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tobject[i]._oVar2 = 337;\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tobject[i]._oVar2 = 325;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tobject[i]._oVar1 = 1;\r\n\t\tobject[i]._oVar3 = 15;\r\n\t\tv8 = 2 * object[i]._oVar1;\r\n\t\tobject[i]._oAnimFrame = 5 - v8;\r\n\t\tobject[i]._oVar4 = object[i]._oAnimFrame + 1;\r\n\t} else {\r\n\r\n\t\tobject[i]._oVar1 = 1;\r\n\t\tobject[i]._oVar2 = a2 + 316;\r\n\t\tobject[i]._oVar3 = a2 + 9;\r\n\t\tv9 = 2 * object[i]._oVar1;\r\n\t\tobject[i]._oAnimFrame = 5 - v9;\r\n\t\tobject[i]._oVar4 = object[i]._oAnimFrame + 1;\r\n\t\tobject[i]._oVar8 = 0;\r\n\t}\r\n}\r\n#endif\r\n\r\nvoid AddObject(int ot, int ox, int oy)\r\n{\r\n\tint oi;\r\n\r\n\tif (nobjects >= MAXOBJECTS)\r\n\t\treturn;\r\n\r\n\toi = objectavail[0];\r\n\tobjectavail[0] = objectavail[MAXOBJECTS - 1 - nobjects];\r\n\tobjectactive[nobjects] = oi;\r\n\tdObject[ox][oy] = oi + 1;\r\n\tSetupObject(oi, ox, oy, ot);\r\n\tswitch (ot) {\r\n\tcase OBJ_L1LIGHT:\r\n\t\tAddObjLight(oi, 5);\r\n\t\tbreak;\r\n\tcase OBJ_SKFIRE:\r\n\tcase OBJ_CANDLE1:\r\n\tcase OBJ_CANDLE2:\r\n\tcase OBJ_BOOKCANDLE:\r\n\t\tAddObjLight(oi, 5);\r\n\t\tbreak;\r\n\tcase OBJ_STORYCANDLE:\r\n\t\tAddObjLight(oi, 3);\r\n\t\tbreak;\r\n\tcase OBJ_TORCHL:\r\n\tcase OBJ_TORCHR:\r\n\tcase OBJ_TORCHL2:\r\n\tcase OBJ_TORCHR2:\r\n\t\tAddObjLight(oi, 8);\r\n\t\tbreak;\r\n\tcase OBJ_L1LDOOR:\r\n\tcase OBJ_L1RDOOR:\r\n\t\tAddL1Door(oi, ox, oy, ot);\r\n\t\tbreak;\r\n\tcase OBJ_L2LDOOR:\r\n\tcase OBJ_L2RDOOR:\r\n\t\tAddL2Door(oi, ox, oy, ot);\r\n\t\tbreak;\r\n\tcase OBJ_L3LDOOR:\r\n\tcase OBJ_L3RDOOR:\r\n\t\tAddL3Door(oi, ox, oy, ot);\r\n\t\tbreak;\r\n\tcase OBJ_BOOK2R:\r\n\t\tAddSCambBook(oi);\r\n\t\tbreak;\r\n\tcase OBJ_CHEST1:\r\n\tcase OBJ_CHEST2:\r\n\tcase OBJ_CHEST3:\r\n\tcase OBJ_TCHEST1:\r\n\tcase OBJ_TCHEST2:\r\n\tcase OBJ_TCHEST3:\r\n\t\tAddChest(oi, ot);\r\n\t\tbreak;\r\n\tcase OBJ_SARC:\r\n\t\tAddSarc(oi);\r\n\t\tbreak;\r\n\tcase OBJ_FLAMEHOLE:\r\n\t\tAddFlameTrap(oi);\r\n\t\tbreak;\r\n\tcase OBJ_FLAMELVR:\r\n\t\tAddFlameLvr(oi);\r\n\t\tbreak;\r\n\tcase OBJ_WATER:\r\n\t\tobject[oi]._oAnimFrame = 1;\r\n\t\tbreak;\r\n\tcase OBJ_TRAPL:\r\n\tcase OBJ_TRAPR:\r\n\t\tAddTrap(oi, ot);\r\n\t\tbreak;\r\n\tcase OBJ_BARREL:\r\n\tcase OBJ_BARRELEX:\r\n\t\tAddBarrel(oi, ot);\r\n\t\tbreak;\r\n\tcase OBJ_SHRINEL:\r\n\tcase OBJ_SHRINER:\r\n\t\tAddShrine(oi);\r\n\t\tbreak;\r\n\tcase OBJ_BOOKCASEL:\r\n\tcase OBJ_BOOKCASER:\r\n\t\tAddBookcase(oi);\r\n\t\tbreak;\r\n\tcase OBJ_SKELBOOK:\r\n\tcase OBJ_BOOKSTAND:\r\n\t\tAddBookstand(oi);\r\n\t\tbreak;\r\n\tcase OBJ_BLOODFTN:\r\n\t\tAddBloodFtn(oi);\r\n\t\tbreak;\r\n\tcase OBJ_DECAP:\r\n\t\tAddDecap(oi);\r\n\t\tbreak;\r\n\tcase OBJ_PURIFYINGFTN:\r\n\t\tAddPurifyingFountain(oi);\r\n\t\tbreak;\r\n\tcase OBJ_ARMORSTAND:\r\n\tcase OBJ_WARARMOR:\r\n\t\tAddArmorStand(oi);\r\n\t\tbreak;\r\n\tcase OBJ_GOATSHRINE:\r\n\t\tAddGoatShrine(oi);\r\n\t\tbreak;\r\n\tcase OBJ_CAULDRON:\r\n\t\tAddCauldron(oi);\r\n\t\tbreak;\r\n\tcase OBJ_MURKYFTN:\r\n\t\tAddMurkyFountain(oi);\r\n\t\tbreak;\r\n\tcase OBJ_TEARFTN:\r\n\t\tAddTearFountain(oi);\r\n\t\tbreak;\r\n\tcase OBJ_BOOK2L:\r\n\t\tAddVilebook(oi);\r\n\t\tbreak;\r\n\tcase OBJ_MCIRCLE1:\r\n\tcase OBJ_MCIRCLE2:\r\n\t\tAddMagicCircle(oi);\r\n\t\tbreak;\r\n\tcase OBJ_STORYBOOK:\r\n\t\tAddStoryBook(oi);\r\n\t\tbreak;\r\n\tcase OBJ_BCROSS:\r\n\tcase OBJ_TBCROSS:\r\n\t\tAddBrnCross(oi);\r\n\t\tAddObjLight(oi, 5);\r\n\t\tbreak;\r\n\tcase OBJ_PEDISTAL:\r\n\t\tAddPedistal(oi);\r\n\t\tbreak;\r\n\tcase OBJ_WARWEAP:\r\n\tcase OBJ_WEAPONRACK:\r\n\t\tAddWeaponRack(oi);\r\n\t\tbreak;\r\n\tcase OBJ_TNUDEM2:\r\n\t\tAddTorturedBody(oi);\r\n\t\tbreak;\r\n\t}\r\n\tobject[oi]._oAnimWidth2 = (object[oi]._oAnimWidth - 64) >> 1;\r\n\tnobjects++;\r\n}\r\n\r\nvoid Obj_Light(int i, int lr)\r\n{\r\n\tint ox, oy, dx, dy, p, tr;\r\n\tDIABOOL turnon;\r\n\r\n\tturnon = FALSE;\r\n\tif (object[i]._oVar1 != -1) {\r\n\t\tox = object[i]._ox;\r\n\t\toy = object[i]._oy;\r\n\t\ttr = lr + 10;\r\n#ifndef HELLFIRE\r\n\t\tturnon = FALSE;\r\n#endif\r\n\t\tif (!lightflag) {\r\n\t\t\tfor (p = 0; p < MAX_PLRS && !turnon; p++) {\r\n\t\t\t\tif (plr[p].plractive) {\r\n\t\t\t\t\tif (currlevel == plr[p].plrlevel) {\r\n\t\t\t\t\t\tdx = abs(plr[p]._px - ox);\r\n\t\t\t\t\t\tdy = abs(plr[p]._py - oy);\r\n\t\t\t\t\t\tif (dx < tr && dy < tr)\r\n\t\t\t\t\t\t\tturnon = TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (turnon) {\r\n\t\t\tif (object[i]._oVar1 == 0)\r\n\t\t\t\tobject[i]._olid = AddLight(ox, oy, lr);\r\n\t\t\tobject[i]._oVar1 = 1;\r\n\t\t} else {\r\n\t\t\tif (object[i]._oVar1 == 1)\r\n\t\t\t\tAddUnLight(object[i]._olid);\r\n\t\t\tobject[i]._oVar1 = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid Obj_Circle(int i)\r\n{\r\n\tint ox, oy, wx, wy;\r\n\r\n\tox = object[i]._ox;\r\n\toy = object[i]._oy;\r\n\twx = plr[myplr]._px;\r\n\twy = plr[myplr]._py;\r\n\tif (wx == ox && wy == oy) {\r\n\t\tif (object[i]._otype == OBJ_MCIRCLE1)\r\n\t\t\tobject[i]._oAnimFrame = 2;\r\n\t\tif (object[i]._otype == OBJ_MCIRCLE2)\r\n\t\t\tobject[i]._oAnimFrame = 4;\r\n\t\tif (ox == 45 && oy == 47) {\r\n\t\t\tobject[i]._oVar6 = 2;\r\n\t\t} else if (ox == 26 && oy == 46) {\r\n\t\t\tobject[i]._oVar6 = 1;\r\n\t\t} else {\r\n\t\t\tobject[i]._oVar6 = 0;\r\n\t\t}\r\n\t\tif (ox == 35 && oy == 36 && object[i]._oVar5 == 3) {\r\n\t\t\tobject[i]._oVar6 = 4;\r\n\t\t\tObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\t\tif (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE) // BUGFIX stepping on the circle again will break the quest state\r\n\t\t\t\tquests[Q_BETRAYER]._qvar1 = 4;\r\n\t\t\tAddMissile(plr[myplr]._px, plr[myplr]._py, 35, 46, plr[myplr]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, myplr, 0, 0);\r\n\t\t\ttrack_repeat_walk(FALSE);\r\n\t\t\tsgbMouseDown = CLICK_NONE;\r\n\t\t\tReleaseCapture();\r\n\t\t\tClrPlrPath(myplr);\r\n\t\t\tStartStand(myplr, 0);\r\n\t\t}\r\n\t} else {\r\n\t\tif (object[i]._otype == OBJ_MCIRCLE1)\r\n\t\t\tobject[i]._oAnimFrame = 1;\r\n\t\tif (object[i]._otype == OBJ_MCIRCLE2)\r\n\t\t\tobject[i]._oAnimFrame = 3;\r\n\t\tobject[i]._oVar6 = 0;\r\n\t}\r\n}\r\n\r\nvoid Obj_StopAnim(int i)\r\n{\r\n\tif (object[i]._oAnimFrame == object[i]._oAnimLen) {\r\n\t\tobject[i]._oAnimCnt = 0;\r\n\t\tobject[i]._oAnimDelay = 1000;\r\n\t}\r\n}\r\n\r\nvoid Obj_Door(int i)\r\n{\r\n\tint dx, dy;\r\n\tDIABOOL dok;\r\n\r\n\tif (object[i]._oVar4 == 0) {\r\n\t\tobject[i]._oSelFlag = 3;\r\n\t\tobject[i]._oMissFlag = FALSE;\r\n\t} else {\r\n\t\tdx = object[i]._ox;\r\n\t\tdy = object[i]._oy;\r\n\t\tdok = dMonster[dx][dy] == 0;\r\n\t\tdok = dok HFAND(dItem[dx][dy] == 0);\r\n\t\tdok = dok HFAND(dDead[dx][dy] == 0);\r\n\t\tdok = dok HFAND(dPlayer[dx][dy] == 0);\r\n\t\tobject[i]._oSelFlag = 2;\r\n\t\tobject[i]._oVar4 = dok ? 1 : 2;\r\n\t\tobject[i]._oMissFlag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid Obj_Sarc(int i)\r\n{\r\n\tif (object[i]._oAnimFrame == object[i]._oAnimLen)\r\n\t\tobject[i]._oAnimFlag = 0;\r\n}\r\n\r\nvoid ActivateTrapLine(int ttype, int tid)\r\n{\r\n\tint i, oi;\r\n\r\n\tfor (i = 0; i < nobjects; i++) {\r\n\t\toi = objectactive[i];\r\n\t\tif (object[oi]._otype == ttype && object[oi]._oVar1 == tid) {\r\n\t\t\tobject[oi]._oVar4 = 1;\r\n\t\t\tobject[oi]._oAnimFlag = 1;\r\n\t\t\tobject[oi]._oAnimDelay = 1;\r\n\t\t\tobject[oi]._olid = AddLight(object[oi]._ox, object[oi]._oy, 1);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid Obj_FlameTrap(int i)\r\n{\r\n\tint x, y;\r\n\tint j, k;\r\n\r\n\tif (object[i]._oVar2 != 0) {\r\n\t\tif (object[i]._oVar4 != 0) {\r\n\t\t\tobject[i]._oAnimFrame--;\r\n\t\t\tif (object[i]._oAnimFrame == 1) {\r\n\t\t\t\tobject[i]._oVar4 = 0;\r\n\t\t\t\tAddUnLight(object[i]._olid);\r\n\t\t\t} else if (object[i]._oAnimFrame <= 4) {\r\n\t\t\t\tChangeLightRadius(object[i]._olid, object[i]._oAnimFrame);\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (object[i]._oVar4 == 0) {\r\n\t\tif (object[i]._oVar3 == 2) {\r\n\t\t\tx = object[i]._ox - 2;\r\n\t\t\ty = object[i]._oy;\r\n\t\t\tfor (j = 0; j < 5; j++) {\r\n\t\t\t\tif (dPlayer[x][y] != 0 || dMonster[x][y] != 0)\r\n\t\t\t\t\tobject[i]._oVar4 = 1;\r\n\t\t\t\tx++;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tx = object[i]._ox;\r\n\t\t\ty = object[i]._oy - 2;\r\n\t\t\tfor (k = 0; k < 5; k++) {\r\n\t\t\t\tif (dPlayer[x][y] != 0 || dMonster[x][y] != 0)\r\n\t\t\t\t\tobject[i]._oVar4 = 1;\r\n\t\t\t\ty++;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (object[i]._oVar4 != 0)\r\n\t\t\tActivateTrapLine(object[i]._otype, object[i]._oVar1);\r\n\t} else {\r\n\t\tif (object[i]._oAnimFrame == object[i]._oAnimLen)\r\n\t\t\tobject[i]._oAnimFrame = 11;\r\n\t\tif (object[i]._oAnimFrame <= 5)\r\n\t\t\tChangeLightRadius(object[i]._olid, object[i]._oAnimFrame);\r\n\t}\r\n}\r\n\r\nvoid Obj_Trap(int i)\r\n{\r\n\tint oti, dir;\r\n\tBOOLEAN otrig;\r\n\tint sx, sy, dx, dy, x, y;\r\n\r\n\totrig = FALSE;\r\n\tif (object[i]._oVar4 == 0) {\r\n\t\toti = dObject[object[i]._oVar1][object[i]._oVar2] - 1;\r\n\t\tswitch (object[oti]._otype) {\r\n\t\tcase OBJ_L1LDOOR:\r\n\t\tcase OBJ_L1RDOOR:\r\n\t\tcase OBJ_L2LDOOR:\r\n\t\tcase OBJ_L2RDOOR:\r\n\t\tcase OBJ_L3LDOOR:\r\n\t\tcase OBJ_L3RDOOR:\r\n\t\t\tif (object[oti]._oVar4 != 0)\r\n\t\t\t\totrig = TRUE;\r\n\t\t\tbreak;\r\n\t\tcase OBJ_LEVER:\r\n\t\tcase OBJ_CHEST1:\r\n\t\tcase OBJ_CHEST2:\r\n\t\tcase OBJ_CHEST3:\r\n\t\tcase OBJ_SWITCHSKL:\r\n\t\tcase OBJ_SARC:\r\n\t\t\tif (object[oti]._oSelFlag == 0)\r\n\t\t\t\totrig = TRUE;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (otrig) {\r\n\t\t\tobject[i]._oVar4 = 1;\r\n\t\t\tsx = object[i]._ox;\r\n\t\t\tsy = object[i]._oy;\r\n\t\t\tdx = object[oti]._ox;\r\n\t\t\tdy = object[oti]._oy;\r\n\t\t\tfor (y = dy - 1; y <= object[oti]._oy + 1; y++) {\r\n\t\t\t\tfor (x = object[oti]._ox - 1; x <= object[oti]._ox + 1; x++) {\r\n\t\t\t\t\tif (dPlayer[x][y] != 0) {\r\n\t\t\t\t\t\tdx = x;\r\n\t\t\t\t\t\tdy = y;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!deltaload) {\r\n\t\t\t\tdir = GetDirection(sx, sy, dx, dy);\r\n\t\t\t\tAddMissile(sx, sy, dx, dy, dir, object[i]._oVar3, TARGET_PLAYERS, -1, 0, 0);\r\n\t\t\t\tPlaySfxLoc(IS_TRAP, object[oti]._ox, object[oti]._oy);\r\n\t\t\t}\r\n\t\t\tobject[oti]._oTrapFlag = FALSE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid Obj_BCrossDamage(int i)\r\n{\r\n\tint fire_resist;\r\n\tint damage[4] = { 6, 8, 10, 12 };\r\n\r\n\tif (plr[myplr]._pmode == PM_DEATH)\r\n\t\treturn;\r\n\r\n\tfire_resist = plr[myplr]._pFireResist;\r\n\tif (fire_resist > 0)\r\n\t\tdamage[leveltype - 1] -= fire_resist * damage[leveltype - 1] / 100;\r\n\r\n\tif (plr[myplr]._px != object[i]._ox || plr[myplr]._py != object[i]._oy - 1)\r\n\t\treturn;\r\n\r\n\tplr[myplr]._pHitPoints -= damage[leveltype - 1];\r\n\tplr[myplr]._pHPBase -= damage[leveltype - 1];\r\n\tif (plr[myplr]._pHitPoints >> 6 <= 0) {\r\n\t\tSyncPlrKill(myplr, 0);\r\n\t} else {\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tPlaySfxLoc(PS_WARR68, plr[myplr]._px, plr[myplr]._py); // CODEFIX: isn't using PlaySfxLoc on myplr equal to just using PlaySFX?\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tPlaySfxLoc(PS_ROGUE68, plr[myplr]._px, plr[myplr]._py); // CODEFIX: isn't using PlaySfxLoc on myplr equal to just using PlaySFX?\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tPlaySfxLoc(PS_MAGE68, plr[myplr]._px, plr[myplr]._py); // CODEFIX: isn't using PlaySfxLoc on myplr equal to just using PlaySFX?\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tPlaySfxLoc(PS_MONK68, plr[myplr]._px, plr[myplr]._py); // CODEFIX: isn't using PlaySfxLoc on myplr equal to just using PlaySFX?\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tPlaySfxLoc(PS_ROGUE68, plr[myplr]._px, plr[myplr]._py); // CODEFIX: isn't using PlaySfxLoc on myplr equal to just using PlaySFX?\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tPlaySfxLoc(PS_WARR68, plr[myplr]._px, plr[myplr]._py); // CODEFIX: isn't using PlaySfxLoc on myplr equal to just using PlaySFX?\r\n#endif\r\n#endif\r\n\t\t}\r\n\t}\r\n\tdrawhpflag = TRUE;\r\n}\r\n\r\nvoid ProcessObjects()\r\n{\r\n\tint oi;\r\n\tint i;\r\n\r\n\tfor (i = 0; i < nobjects; ++i) {\r\n\t\toi = objectactive[i];\r\n\t\tswitch (object[oi]._otype) {\r\n\t\tcase OBJ_L1LIGHT:\r\n\t\t\tObj_Light(oi, 10);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_SKFIRE:\r\n\t\tcase OBJ_CANDLE2:\r\n\t\tcase OBJ_BOOKCANDLE:\r\n\t\t\tObj_Light(oi, 5);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_STORYCANDLE:\r\n\t\t\tObj_Light(oi, 3);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_CRUX1:\r\n\t\tcase OBJ_CRUX2:\r\n\t\tcase OBJ_CRUX3:\r\n\t\tcase OBJ_BARREL:\r\n\t\tcase OBJ_BARRELEX:\r\n\t\tcase OBJ_SHRINEL:\r\n\t\tcase OBJ_SHRINER:\r\n\t\t\tObj_StopAnim(oi);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_L1LDOOR:\r\n\t\tcase OBJ_L1RDOOR:\r\n\t\tcase OBJ_L2LDOOR:\r\n\t\tcase OBJ_L2RDOOR:\r\n\t\tcase OBJ_L3LDOOR:\r\n\t\tcase OBJ_L3RDOOR:\r\n\t\t\tObj_Door(oi);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_TORCHL:\r\n\t\tcase OBJ_TORCHR:\r\n\t\tcase OBJ_TORCHL2:\r\n\t\tcase OBJ_TORCHR2:\r\n\t\t\tObj_Light(oi, 8);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_SARC:\r\n\t\t\tObj_Sarc(oi);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_FLAMEHOLE:\r\n\t\t\tObj_FlameTrap(oi);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_TRAPL:\r\n\t\tcase OBJ_TRAPR:\r\n\t\t\tObj_Trap(oi);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_MCIRCLE1:\r\n\t\tcase OBJ_MCIRCLE2:\r\n\t\t\tObj_Circle(oi);\r\n\t\t\tbreak;\r\n\t\tcase OBJ_BCROSS:\r\n\t\tcase OBJ_TBCROSS:\r\n\t\t\tObj_Light(oi, 10);\r\n\t\t\tObj_BCrossDamage(oi);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (object[oi]._oAnimFlag == 0)\r\n\t\t\tcontinue;\r\n\r\n\t\tobject[oi]._oAnimCnt++;\r\n\r\n\t\tif (object[oi]._oAnimCnt < object[oi]._oAnimDelay)\r\n\t\t\tcontinue;\r\n\r\n\t\tobject[oi]._oAnimCnt = 0;\r\n\t\tobject[oi]._oAnimFrame++;\r\n\t\tif (object[oi]._oAnimFrame > object[oi]._oAnimLen)\r\n\t\t\tobject[oi]._oAnimFrame = 1;\r\n\t}\r\n\ti = 0;\r\n\twhile (i < nobjects) {\r\n\t\toi = objectactive[i];\r\n\t\tif (object[oi]._oDelFlag) {\r\n\t\t\tDeleteObject_(oi, i);\r\n\t\t\ti = 0;\r\n\t\t} else {\r\n\t\t\ti++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ObjSetMicro(int dx, int dy, int pn)\r\n{\r\n\tWORD *v;\r\n\tMICROS *defs;\r\n\tint i;\r\n\r\n\tdPiece[dx][dy] = pn;\r\n\tpn--;\r\n\tdefs = &dpiece_defs_map_1[IsometricCoord(dx, dy)];\r\n\tif (leveltype != DTYPE_HELL) {\r\n\t\tv = (WORD *)pLevelPieces + 10 * pn;\r\n\t\tfor (i = 0; i < 10; i++) {\r\n\t\t\tdefs->mt[i] = v[(i & 1) - (i & 0xE) + 8];\r\n\t\t}\r\n\t} else {\r\n\t\tv = (WORD *)pLevelPieces + 16 * pn;\r\n\t\tfor (i = 0; i < 16; i++) {\r\n\t\t\tdefs->mt[i] = v[(i & 1) - (i & 0xE) + 14];\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid objects_set_door_piece(int x, int y)\r\n{\r\n\tint pn;\r\n\tlong v1, v2;\r\n\r\n\tpn = dPiece[x][y] - 1;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\tmov\t\tesi, pLevelPieces\r\n\txor\t\teax, eax\r\n\tmov\t\tax, word ptr pn\r\n\tmov\t\tebx, 20\r\n\tmul\t\tebx\r\n\tadd\t\tesi, eax\r\n\tadd\t\tesi, 16\r\n\txor\t\teax, eax\r\n\tlodsw\r\n\tmov\t\tword ptr v1, ax\r\n\tlodsw\r\n\tmov\t\tword ptr v2, ax\r\n\t}\r\n#else\r\n\tv1 = *((WORD *)pLevelPieces + 10 * pn + 8);\r\n\tv2 = *((WORD *)pLevelPieces + 10 * pn + 9);\r\n#endif\r\n\tdpiece_defs_map_1[IsometricCoord(x, y)].mt[0] = v1;\r\n\tdpiece_defs_map_1[IsometricCoord(x, y)].mt[1] = v2;\r\n}\r\n\r\nvoid ObjSetMini(int x, int y, int v)\r\n{\r\n\tint xx, yy;\r\n\tlong v1, v2, v3, v4;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, pMegaTiles\r\n\t\txor\t\teax, eax\r\n\t\tmov\t\tax, word ptr v\r\n\t\tdec\t\teax\r\n\t\tshl\t\teax, 3\r\n\t\tadd\t\tesi, eax\r\n\t\txor\t\teax, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv1, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv2, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv3, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv4, eax\r\n\t}\r\n#else\r\n\tv1 = *((WORD *)&pMegaTiles[((WORD)v - 1) * 8]) + 1;\r\n\tv2 = *((WORD *)&pMegaTiles[((WORD)v - 1) * 8] + 1) + 1;\r\n\tv3 = *((WORD *)&pMegaTiles[((WORD)v - 1) * 8] + 2) + 1;\r\n\tv4 = *((WORD *)&pMegaTiles[((WORD)v - 1) * 8] + 3) + 1;\r\n#endif\r\n\r\n\txx = 2 * x + 16;\r\n\tyy = 2 * y + 16;\r\n\tObjSetMicro(xx, yy, v1);\r\n\tObjSetMicro(xx + 1, yy, v2);\r\n\tObjSetMicro(xx, yy + 1, v3);\r\n\tObjSetMicro(xx + 1, yy + 1, v4);\r\n}\r\n\r\nvoid ObjL1Special(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (i = y1; i <= y2; ++i) {\r\n\t\tfor (j = x1; j <= x2; ++j) {\r\n\t\t\tdSpecial[j][i] = 0;\r\n\t\t\tif (dPiece[j][i] == 12)\r\n\t\t\t\tdSpecial[j][i] = 1;\r\n\t\t\tif (dPiece[j][i] == 11)\r\n\t\t\t\tdSpecial[j][i] = 2;\r\n\t\t\tif (dPiece[j][i] == 71)\r\n\t\t\t\tdSpecial[j][i] = 1;\r\n\t\t\tif (dPiece[j][i] == 259)\r\n\t\t\t\tdSpecial[j][i] = 5;\r\n\t\t\tif (dPiece[j][i] == 249)\r\n\t\t\t\tdSpecial[j][i] = 2;\r\n\t\t\tif (dPiece[j][i] == 325)\r\n\t\t\t\tdSpecial[j][i] = 2;\r\n\t\t\tif (dPiece[j][i] == 321)\r\n\t\t\t\tdSpecial[j][i] = 1;\r\n\t\t\tif (dPiece[j][i] == 255)\r\n\t\t\t\tdSpecial[j][i] = 4;\r\n\t\t\tif (dPiece[j][i] == 211)\r\n\t\t\t\tdSpecial[j][i] = 1;\r\n\t\t\tif (dPiece[j][i] == 344)\r\n\t\t\t\tdSpecial[j][i] = 2;\r\n\t\t\tif (dPiece[j][i] == 341)\r\n\t\t\t\tdSpecial[j][i] = 1;\r\n\t\t\tif (dPiece[j][i] == 331)\r\n\t\t\t\tdSpecial[j][i] = 2;\r\n\t\t\tif (dPiece[j][i] == 418)\r\n\t\t\t\tdSpecial[j][i] = 1;\r\n\t\t\tif (dPiece[j][i] == 421)\r\n\t\t\t\tdSpecial[j][i] = 2;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ObjL2Special(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tdSpecial[i][j] = 0;\r\n\t\t\tif (dPiece[i][j] == 541)\r\n\t\t\t\tdSpecial[i][j] = 5;\r\n\t\t\tif (dPiece[i][j] == 178)\r\n\t\t\t\tdSpecial[i][j] = 5;\r\n\t\t\tif (dPiece[i][j] == 551)\r\n\t\t\t\tdSpecial[i][j] = 5;\r\n\t\t\tif (dPiece[i][j] == 542)\r\n\t\t\t\tdSpecial[i][j] = 6;\r\n\t\t\tif (dPiece[i][j] == 553)\r\n\t\t\t\tdSpecial[i][j] = 6;\r\n\t\t\tif (dPiece[i][j] == 13)\r\n\t\t\t\tdSpecial[i][j] = 5;\r\n\t\t\tif (dPiece[i][j] == 17)\r\n\t\t\t\tdSpecial[i][j] = 6;\r\n\t\t}\r\n\t}\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tif (dPiece[i][j] == 132) {\r\n\t\t\t\tdSpecial[i][j + 1] = 2;\r\n\t\t\t\tdSpecial[i][j + 2] = 1;\r\n\t\t\t}\r\n\t\t\tif (dPiece[i][j] == 135 || dPiece[i][j] == 139) {\r\n\t\t\t\tdSpecial[i + 1][j] = 3;\r\n\t\t\t\tdSpecial[i + 2][j] = 4;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DoorSet(int oi, int dx, int dy)\r\n{\r\n\tint pn;\r\n\r\n\tpn = dPiece[dx][dy];\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tif (pn == 43)\r\n\t\t\tObjSetMicro(dx, dy, 392);\r\n\t\tif (pn == 45)\r\n\t\t\tObjSetMicro(dx, dy, 394);\r\n\t\tif (pn == 50 && object[oi]._otype == OBJ_L1LDOOR)\r\n\t\t\tObjSetMicro(dx, dy, 411);\r\n\t\tif (pn == 50 && object[oi]._otype == OBJ_L1RDOOR)\r\n\t\t\tObjSetMicro(dx, dy, 412);\r\n\t\tif (pn == 54)\r\n\t\t\tObjSetMicro(dx, dy, 397);\r\n\t\tif (pn == 55)\r\n\t\t\tObjSetMicro(dx, dy, 398);\r\n\t\tif (pn == 61)\r\n\t\t\tObjSetMicro(dx, dy, 399);\r\n\t\tif (pn == 67)\r\n\t\t\tObjSetMicro(dx, dy, 400);\r\n\t\tif (pn == 68)\r\n\t\t\tObjSetMicro(dx, dy, 401);\r\n\t\tif (pn == 69)\r\n\t\t\tObjSetMicro(dx, dy, 403);\r\n\t\tif (pn == 70)\r\n\t\t\tObjSetMicro(dx, dy, 404);\r\n\t\tif (pn == 72)\r\n\t\t\tObjSetMicro(dx, dy, 406);\r\n\t\tif (pn == 212)\r\n\t\t\tObjSetMicro(dx, dy, 407);\r\n\t\tif (pn == 354)\r\n\t\t\tObjSetMicro(dx, dy, 409);\r\n\t\tif (pn == 355)\r\n\t\t\tObjSetMicro(dx, dy, 410);\r\n\t\tif (pn == 411)\r\n\t\t\tObjSetMicro(dx, dy, 396);\r\n\t\tif (pn == 412)\r\n\t\t\tObjSetMicro(dx, dy, 396);\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tif (pn == 75)\r\n\t\t\tObjSetMicro(dx, dy, 204);\r\n\t\tif (pn == 79)\r\n\t\t\tObjSetMicro(dx, dy, 208);\r\n\t\tif (pn == 86 && object[oi]._otype == OBJ_L1LDOOR) {\r\n\t\t\tObjSetMicro(dx, dy, 232);\r\n\t\t}\r\n\t\tif (pn == 86 && object[oi]._otype == OBJ_L1RDOOR) {\r\n\t\t\tObjSetMicro(dx, dy, 234);\r\n\t\t}\r\n\t\tif (pn == 91)\r\n\t\t\tObjSetMicro(dx, dy, 215);\r\n\t\tif (pn == 93)\r\n\t\t\tObjSetMicro(dx, dy, 218);\r\n\t\tif (pn == 99)\r\n\t\t\tObjSetMicro(dx, dy, 220);\r\n\t\tif (pn == 111)\r\n\t\t\tObjSetMicro(dx, dy, 222);\r\n\t\tif (pn == 113)\r\n\t\t\tObjSetMicro(dx, dy, 224);\r\n\t\tif (pn == 115)\r\n\t\t\tObjSetMicro(dx, dy, 226);\r\n\t\tif (pn == 117)\r\n\t\t\tObjSetMicro(dx, dy, 228);\r\n\t\tif (pn == 119)\r\n\t\t\tObjSetMicro(dx, dy, 230);\r\n\t\tif (pn == 232)\r\n\t\t\tObjSetMicro(dx, dy, 212);\r\n\t\tif (pn == 234)\r\n\t\t\tObjSetMicro(dx, dy, 212);\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid RedoPlayerVision()\r\n{\r\n\tint p;\r\n\r\n\tfor (p = 0; p < MAX_PLRS; p++) {\r\n\t\tif (plr[p].plractive && currlevel == plr[p].plrlevel) {\r\n\t\t\tChangeVisionXY(plr[p]._pvid, plr[p]._px, plr[p]._py);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateL1RDoor(int pnum, int oi, DIABOOL sendflag)\r\n{\r\n\tint xp, yp;\r\n\r\n\tif (object[oi]._oVar4 == 2) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);\r\n\t\treturn;\r\n\t}\r\n\r\n\txp = object[oi]._ox;\r\n\typ = object[oi]._oy;\r\n\tif (object[oi]._oVar4 == 0) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 21) {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\t} else {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(IS_CROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\t}\r\n\t\tif (currlevel < 21) {\r\n\t\t\tObjSetMicro(xp, yp, 395);\r\n\t\t} else {\r\n\t\t\tObjSetMicro(xp, yp, 209);\r\n\t\t}\r\n\t\tif (currlevel < 17) {\r\n\t\t\tdSpecial[xp][yp] = 8;\r\n\t\t} else {\r\n\t\t\tdSpecial[xp][yp] = 2;\r\n\t\t}\r\n#else\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\tObjSetMicro(xp, yp, 395);\r\n\t\tdSpecial[xp][yp] = 8;\r\n#endif\r\n\t\tobjects_set_door_piece(xp, yp - 1);\r\n\t\tobject[oi]._oAnimFrame += 2;\r\n\t\tobject[oi]._oPreFlag = TRUE;\r\n\t\tDoorSet(oi, xp - 1, yp);\r\n\t\tobject[oi]._oVar4 = 1;\r\n\t\tobject[oi]._oSelFlag = 2;\r\n\t\tRedoPlayerVision();\r\n\t\treturn;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 21) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy);\r\n\t} else {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_CRCLOS, xp, object[oi]._oy);\r\n\t}\r\n\tBOOLEAN dok = dMonster[xp][yp] == 0;\r\n\tdok = dok && dItem[xp][yp] == 0;\r\n\tdok = dok && dDead[xp][yp] == 0;\r\n\tif (dok) {\r\n#else\r\n\tif (!deltaload)\r\n\t\tPlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy);\r\n\tif (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {\r\n#endif\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);\r\n\t\tobject[oi]._oVar4 = 0;\r\n\t\tobject[oi]._oSelFlag = 3;\r\n\t\tObjSetMicro(xp, yp, object[oi]._oVar1);\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\tif (object[oi]._oVar2 != 50) {\r\n\t\t\t\tObjSetMicro(xp - 1, yp, object[oi]._oVar2);\r\n\t\t\t} else {\r\n\t\t\t\tif (dPiece[xp - 1][yp] == 396)\r\n\t\t\t\t\tObjSetMicro(xp - 1, yp, 411);\r\n\t\t\t\telse\r\n\t\t\t\t\tObjSetMicro(xp - 1, yp, 50);\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t} else {\r\n\t\t\tif (object[oi]._oVar2 != 86) {\r\n\t\t\t\tObjSetMicro(xp - 1, yp, object[oi]._oVar2);\r\n\t\t\t} else {\r\n\t\t\t\tif (dPiece[xp - 1][yp] == 210)\r\n\t\t\t\t\tObjSetMicro(xp - 1, yp, 232);\r\n\t\t\t\telse\r\n\t\t\t\t\tObjSetMicro(xp - 1, yp, 86);\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\t\tobject[oi]._oAnimFrame -= 2;\r\n\t\tobject[oi]._oPreFlag = FALSE;\r\n\t\tRedoPlayerVision();\r\n\t} else {\r\n\t\tobject[oi]._oVar4 = 2;\r\n\t}\r\n}\r\n\r\nvoid OperateL1LDoor(int pnum, int oi, DIABOOL sendflag)\r\n{\r\n\tint xp, yp;\r\n\r\n\tif (object[oi]._oVar4 == 2) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);\r\n\t\treturn;\r\n\t}\r\n\r\n\txp = object[oi]._ox;\r\n\typ = object[oi]._oy;\r\n\tif (object[oi]._oVar4 == 0) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 21) {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\t} else {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(IS_CROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\t}\r\n\t\tif (currlevel < 21) {\r\n\t\t\tif (object[oi]._oVar1 == 214)\r\n\t\t\t\tObjSetMicro(xp, yp, 408);\r\n\t\t\telse\r\n\t\t\t\tObjSetMicro(xp, yp, 393);\r\n\t\t} else {\r\n\t\t\tObjSetMicro(xp, yp, 206);\r\n\t\t}\r\n\t\tif (currlevel < 17) {\r\n\t\t\tdSpecial[xp][yp] = 7;\r\n\t\t} else {\r\n\t\t\tdSpecial[xp][yp] = 1;\r\n\t\t}\r\n#else\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\tif (object[oi]._oVar1 == 214)\r\n\t\t\tObjSetMicro(xp, yp, 408);\r\n\t\telse\r\n\t\t\tObjSetMicro(xp, yp, 393);\r\n\t\tdSpecial[xp][yp] = 7;\r\n#endif\r\n\t\tobjects_set_door_piece(xp - 1, yp);\r\n\t\tobject[oi]._oAnimFrame += 2;\r\n\t\tobject[oi]._oPreFlag = TRUE;\r\n\t\tDoorSet(oi, xp, yp - 1);\r\n\t\tobject[oi]._oVar4 = 1;\r\n\t\tobject[oi]._oSelFlag = 2;\r\n\t\tRedoPlayerVision();\r\n\t\treturn;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 21) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy);\r\n\t} else {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_CRCLOS, xp, object[oi]._oy);\r\n\t}\r\n\tBOOLEAN dok = dMonster[xp][yp] == 0;\r\n\tdok = dok && dItem[xp][yp] == 0;\r\n\tdok = dok && dDead[xp][yp] == 0;\r\n\tif (dok) {\r\n#else\r\n\tif (!deltaload)\r\n\t\tPlaySfxLoc(IS_DOORCLOS, xp, object[oi]._oy);\r\n\tif (((dDead[xp][yp] != 0 ? 0 : 1) & (dMonster[xp][yp] != 0 ? 0 : 1) & (dItem[xp][yp] != 0 ? 0 : 1)) != 0) {\r\n#endif\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);\r\n\t\tobject[oi]._oVar4 = 0;\r\n\t\tobject[oi]._oSelFlag = 3;\r\n\t\tObjSetMicro(xp, yp, object[oi]._oVar1);\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel < 17) {\r\n#endif\r\n\t\t\tif (object[oi]._oVar2 != 50) {\r\n\t\t\t\tObjSetMicro(xp, yp - 1, object[oi]._oVar2);\r\n\t\t\t} else {\r\n\t\t\t\tif (dPiece[xp][yp - 1] == 396)\r\n\t\t\t\t\tObjSetMicro(xp, yp - 1, 412);\r\n\t\t\t\telse\r\n\t\t\t\t\tObjSetMicro(xp, yp - 1, 50);\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t} else {\r\n\t\t\tif (object[oi]._oVar2 != 86) {\r\n\t\t\t\tObjSetMicro(xp, yp - 1, object[oi]._oVar2);\r\n\t\t\t} else {\r\n\t\t\t\tif (dPiece[xp][yp - 1] == 210)\r\n\t\t\t\t\tObjSetMicro(xp, yp - 1, 234);\r\n\t\t\t\telse\r\n\t\t\t\t\tObjSetMicro(xp, yp - 1, 86);\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\t\tobject[oi]._oAnimFrame -= 2;\r\n\t\tobject[oi]._oPreFlag = FALSE;\r\n\t\tRedoPlayerVision();\r\n\t} else {\r\n\t\tobject[oi]._oVar4 = 2;\r\n\t}\r\n}\r\n\r\nvoid OperateL2RDoor(int pnum, int oi, DIABOOL sendflag)\r\n{\r\n\tint xp, yp;\r\n\tDIABOOL dok;\r\n\r\n\tif (object[oi]._oVar4 == 2) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);\r\n\t\treturn;\r\n\t}\r\n\txp = object[oi]._ox;\r\n\typ = object[oi]._oy;\r\n\tif (object[oi]._oVar4 == 0) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\tObjSetMicro(xp, yp, 17);\r\n\t\tobject[oi]._oAnimFrame += 2;\r\n\t\tobject[oi]._oPreFlag = TRUE;\r\n\t\tobject[oi]._oVar4 = 1;\r\n\t\tobject[oi]._oSelFlag = 2;\r\n\t\tRedoPlayerVision();\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!deltaload)\r\n\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);\r\n\tdok = dMonster[xp][yp] == 0;\r\n\tdok = dok HFAND(dItem[xp][yp] == 0);\r\n\tdok = dok HFAND(dDead[xp][yp] == 0);\r\n\tif (dok) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);\r\n\t\tobject[oi]._oVar4 = 0;\r\n\t\tobject[oi]._oSelFlag = 3;\r\n\t\tObjSetMicro(xp, yp, 540);\r\n\t\tobject[oi]._oAnimFrame -= 2;\r\n\t\tobject[oi]._oPreFlag = FALSE;\r\n\t\tRedoPlayerVision();\r\n\t} else {\r\n\t\tobject[oi]._oVar4 = 2;\r\n\t}\r\n}\r\n\r\nvoid OperateL2LDoor(int pnum, int oi, BOOL sendflag)\r\n{\r\n\tint xp, yp;\r\n\tDIABOOL dok;\r\n\r\n\tif (object[oi]._oVar4 == 2) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);\r\n\t\treturn;\r\n\t}\r\n\txp = object[oi]._ox;\r\n\typ = object[oi]._oy;\r\n\tif (object[oi]._oVar4 == 0) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\tObjSetMicro(xp, yp, 13);\r\n\t\tobject[oi]._oAnimFrame += 2;\r\n\t\tobject[oi]._oPreFlag = TRUE;\r\n\t\tobject[oi]._oVar4 = 1;\r\n\t\tobject[oi]._oSelFlag = 2;\r\n\t\tRedoPlayerVision();\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!deltaload)\r\n\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);\r\n\tdok = dMonster[xp][yp] == 0;\r\n\tdok = dok HFAND(dItem[xp][yp] == 0);\r\n\tdok = dok HFAND(dDead[xp][yp] == 0);\r\n\tif (dok) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);\r\n\t\tobject[oi]._oVar4 = 0;\r\n\t\tobject[oi]._oSelFlag = 3;\r\n\t\tObjSetMicro(xp, yp, 538);\r\n\t\tobject[oi]._oAnimFrame -= 2;\r\n\t\tobject[oi]._oPreFlag = FALSE;\r\n\t\tRedoPlayerVision();\r\n\t} else {\r\n\t\tobject[oi]._oVar4 = 2;\r\n\t}\r\n}\r\n\r\nvoid OperateL3RDoor(int pnum, int oi, DIABOOL sendflag)\r\n{\r\n\tint xp, yp;\r\n\tDIABOOL dok;\r\n\r\n\tif (object[oi]._oVar4 == 2) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);\r\n\t\treturn;\r\n\t}\r\n\r\n\txp = object[oi]._ox;\r\n\typ = object[oi]._oy;\r\n\tif (object[oi]._oVar4 == 0) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\tObjSetMicro(xp, yp, 541);\r\n\t\tobject[oi]._oAnimFrame += 2;\r\n\t\tobject[oi]._oPreFlag = TRUE;\r\n\t\tobject[oi]._oVar4 = 1;\r\n\t\tobject[oi]._oSelFlag = 2;\r\n\t\tRedoPlayerVision();\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!deltaload)\r\n\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);\r\n\tdok = dMonster[xp][yp] == 0;\r\n\tdok = dok HFAND(dItem[xp][yp] == 0);\r\n\tdok = dok HFAND(dDead[xp][yp] == 0);\r\n\tif (dok) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);\r\n\t\tobject[oi]._oVar4 = 0;\r\n\t\tobject[oi]._oSelFlag = 3;\r\n\t\tObjSetMicro(xp, yp, 534);\r\n\t\tobject[oi]._oAnimFrame -= 2;\r\n\t\tobject[oi]._oPreFlag = FALSE;\r\n\t\tRedoPlayerVision();\r\n\t} else {\r\n\t\tobject[oi]._oVar4 = 2;\r\n\t}\r\n}\r\n\r\nvoid OperateL3LDoor(int pnum, int oi, DIABOOL sendflag)\r\n{\r\n\tint xp, yp;\r\n\tDIABOOL dok;\r\n\r\n\tif (object[oi]._oVar4 == 2) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, object[oi]._oy);\r\n\t\treturn;\r\n\t}\r\n\r\n\txp = object[oi]._ox;\r\n\typ = object[oi]._oy;\r\n\tif (object[oi]._oVar4 == 0) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_OPENDOOR, oi);\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_DOOROPEN, object[oi]._ox, object[oi]._oy);\r\n\t\tObjSetMicro(xp, yp, 538);\r\n\t\tobject[oi]._oAnimFrame += 2;\r\n\t\tobject[oi]._oPreFlag = TRUE;\r\n\t\tobject[oi]._oVar4 = 1;\r\n\t\tobject[oi]._oSelFlag = 2;\r\n\t\tRedoPlayerVision();\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!deltaload)\r\n\t\tPlaySfxLoc(IS_DOORCLOS, object[oi]._ox, yp);\r\n\tdok = dMonster[xp][yp] == 0;\r\n\tdok = dok HFAND(dItem[xp][yp] == 0);\r\n\tdok = dok HFAND(dDead[xp][yp] == 0);\r\n\tif (dok) {\r\n\t\tif (pnum == myplr && sendflag)\r\n\t\t\tNetSendCmdParam1(TRUE, CMD_CLOSEDOOR, oi);\r\n\t\tobject[oi]._oVar4 = 0;\r\n\t\tobject[oi]._oSelFlag = 3;\r\n\t\tObjSetMicro(xp, yp, 531);\r\n\t\tobject[oi]._oAnimFrame -= 2;\r\n\t\tobject[oi]._oPreFlag = FALSE;\r\n\t\tRedoPlayerVision();\r\n\t} else {\r\n\t\tobject[oi]._oVar4 = 2;\r\n\t}\r\n}\r\n\r\nvoid MonstCheckDoors(int m)\r\n{\r\n\tint i, oi;\r\n\tint dpx, dpy, mx, my;\r\n\r\n\tmx = monster[m]._mx;\r\n\tmy = monster[m]._my;\r\n\tif (dObject[mx - 1][my - 1] != 0\r\n\t    || dObject[mx][my - 1] != 0\r\n\t    || dObject[mx + 1][my - 1] != 0\r\n\t    || dObject[mx - 1][my] != 0\r\n\t    || dObject[mx + 1][my] != 0\r\n\t    || dObject[mx - 1][my + 1] != 0\r\n\t    || dObject[mx][my + 1] != 0\r\n\t    || dObject[mx + 1][my + 1] != 0) {\r\n\t\tfor (i = 0; i < nobjects; ++i) {\r\n\t\t\toi = objectactive[i];\r\n\t\t\tif ((object[oi]._otype == OBJ_L1LDOOR || object[oi]._otype == OBJ_L1RDOOR) && object[oi]._oVar4 == 0) {\r\n\t\t\t\tdpx = abs(object[oi]._ox - mx);\r\n\t\t\t\tdpy = abs(object[oi]._oy - my);\r\n\t\t\t\tif (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L1LDOOR)\r\n\t\t\t\t\tOperateL1LDoor(myplr, oi, TRUE);\r\n\t\t\t\tif (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L1RDOOR)\r\n\t\t\t\t\tOperateL1RDoor(myplr, oi, TRUE);\r\n\t\t\t}\r\n\t\t\tif ((object[oi]._otype == OBJ_L2LDOOR || object[oi]._otype == OBJ_L2RDOOR) && object[oi]._oVar4 == 0) {\r\n\t\t\t\tdpx = abs(object[oi]._ox - mx);\r\n\t\t\t\tdpy = abs(object[oi]._oy - my);\r\n\t\t\t\tif (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L2LDOOR)\r\n\t\t\t\t\tOperateL2LDoor(myplr, oi, TRUE);\r\n\t\t\t\tif (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L2RDOOR)\r\n\t\t\t\t\tOperateL2RDoor(myplr, oi, TRUE);\r\n\t\t\t}\r\n\t\t\tif ((object[oi]._otype == OBJ_L3LDOOR || object[oi]._otype == OBJ_L3RDOOR) && object[oi]._oVar4 == 0) {\r\n\t\t\t\tdpx = abs(object[oi]._ox - mx);\r\n\t\t\t\tdpy = abs(object[oi]._oy - my);\r\n\t\t\t\tif (dpx == 1 && dpy <= 1 && object[oi]._otype == OBJ_L3RDOOR)\r\n\t\t\t\t\tOperateL3RDoor(myplr, oi, TRUE);\r\n\t\t\t\tif (dpx <= 1 && dpy == 1 && object[oi]._otype == OBJ_L3LDOOR)\r\n\t\t\t\t\tOperateL3LDoor(myplr, oi, TRUE);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ObjChangeMap(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tObjSetMini(i, j, pdungeon[i][j]);\r\n\t\t\tdungeon[i][j] = pdungeon[i][j];\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (leveltype == DTYPE_CATHEDRAL && currlevel < 17) {\r\n#else\r\n\tif (leveltype == DTYPE_CATHEDRAL) {\r\n#endif\r\n\t\tObjL1Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);\r\n\t\tAddL1Objs(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);\r\n\t}\r\n\tif (leveltype == DTYPE_CATACOMBS) {\r\n\t\tObjL2Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);\r\n\t\tAddL2Objs(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);\r\n\t}\r\n}\r\n\r\nvoid ObjChangeMapResync(int x1, int y1, int x2, int y2)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = y1; j <= y2; j++) {\r\n\t\tfor (i = x1; i <= x2; i++) {\r\n\t\t\tObjSetMini(i, j, pdungeon[i][j]);\r\n\t\t\tdungeon[i][j] = pdungeon[i][j];\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (leveltype == DTYPE_CATHEDRAL && currlevel < 17) {\r\n#else\r\n\tif (leveltype == DTYPE_CATHEDRAL) {\r\n#endif\r\n\t\tObjL1Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);\r\n\t}\r\n\tif (leveltype == DTYPE_CATACOMBS) {\r\n\t\tObjL2Special(2 * x1 + 16, 2 * y1 + 16, 2 * x2 + 17, 2 * y2 + 17);\r\n\t}\r\n}\r\n\r\nvoid OperateL1Door(int pnum, int i, DIABOOL sendflag)\r\n{\r\n\tint dpx, dpy;\r\n\r\n\tdpx = abs(object[i]._ox - plr[pnum]._px);\r\n\tdpy = abs(object[i]._oy - plr[pnum]._py);\r\n\tif (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L1LDOOR)\r\n\t\tOperateL1LDoor(pnum, i, sendflag);\r\n\tif (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L1RDOOR)\r\n\t\tOperateL1RDoor(pnum, i, sendflag);\r\n}\r\n\r\nvoid OperateLever(int pnum, int i)\r\n{\r\n\tint j, oi;\r\n\tDIABOOL mapflag;\r\n\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_LEVER, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tobject[i]._oAnimFrame++;\r\n\t\tmapflag = TRUE;\r\n\t\tif (currlevel == 16) {\r\n\t\t\tfor (j = 0; j < nobjects; j++) {\r\n\t\t\t\toi = objectactive[j];\r\n\t\t\t\tif (object[oi]._otype == OBJ_SWITCHSKL\r\n\t\t\t\t    && object[i]._oVar8 == object[oi]._oVar8\r\n\t\t\t\t    && object[oi]._oSelFlag != 0) {\r\n\t\t\t\t\tmapflag = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel == 24) {\r\n\t\t\tOperateNakrulLever();\r\n\t\t\tIsUberLeverActivated = 1;\r\n\t\t\tmapflag = FALSE;\r\n\t\t\tquests[Q_NAKRUL]._qactive = QUEST_DONE;\r\n\t\t}\r\n#endif\r\n\t\tif (mapflag)\r\n\t\t\tObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\tif (pnum == myplr)\r\n\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t}\r\n}\r\n\r\nvoid OperateBook(int pnum, int i)\r\n{\r\n\tint j, oi;\r\n\tint dx, dy;\r\n\tint otype;\r\n\tDIABOOL do_add_missile, missile_added;\r\n\r\n\tif (object[i]._oSelFlag == 0)\r\n\t\treturn;\r\n\tif (setlevel && setlvlnum == SL_VILEBETRAYER) {\r\n\t\tdo_add_missile = FALSE;\r\n\t\tmissile_added = FALSE;\r\n\t\tfor (j = 0; j < nobjects; j++) {\r\n\t\t\toi = objectactive[j];\r\n\t\t\totype = object[oi]._otype;\r\n\t\t\tif (otype == OBJ_MCIRCLE2 && object[oi]._oVar6 == 1) {\r\n\t\t\t\tdx = 27;\r\n\t\t\t\tdy = 29;\r\n\t\t\t\tobject[oi]._oVar6 = 4;\r\n\t\t\t\tdo_add_missile = TRUE;\r\n\t\t\t}\r\n\t\t\tif (otype == OBJ_MCIRCLE2 && object[oi]._oVar6 == 2) {\r\n\t\t\t\tdx = 43;\r\n\t\t\t\tdy = 29;\r\n\t\t\t\tobject[oi]._oVar6 = 4;\r\n\t\t\t\tdo_add_missile = TRUE;\r\n\t\t\t}\r\n\t\t\tif (do_add_missile) {\r\n\t\t\t\tobject[dObject[35][36] - 1]._oVar5++;\r\n\t\t\t\tAddMissile(plr[pnum]._px, plr[pnum]._py, dx, dy, plr[pnum]._pdir, MIS_RNDTELEPORT, TARGET_MONSTERS, pnum, 0, 0);\r\n\t\t\t\tmissile_added = TRUE;\r\n\t\t\t\tdo_add_missile = FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!missile_added)\r\n\t\t\treturn;\r\n\t}\r\n\tobject[i]._oSelFlag = 0;\r\n\tobject[i]._oAnimFrame++;\r\n\tif (!setlevel)\r\n\t\treturn;\r\n\r\n\tif (setlvlnum == SL_BONECHAMB) {\r\n\t\tplr[myplr]._pMemSpells |= SPELLBIT(SPL_GUARDIAN);\r\n\t\tif (plr[pnum]._pSplLvl[SPL_GUARDIAN] < MAX_SPELL_LEVEL) // BUGFIX: should use plr[myplr] or plr[pnum] consistently, not mix and match. If another connected peer interacts with the Ancient Tome (then pnum!=myplr), and they have Guardian spell level < 15, while the local player has Guardian spell level = 15; then the sanity check is skipped, and the local player gets Guardian spell level 16.\r\n\t\t\tplr[myplr]._pSplLvl[SPL_GUARDIAN]++;\r\n\t\tquests[Q_SCHAMB]._qactive = QUEST_DONE;\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_QUESTDN, object[i]._ox, object[i]._oy);\r\n\t\tInitDiabloMsg(EMSG_BONECHAMB);\r\n\t\tAddMissile(\r\n\t\t    plr[myplr]._px,\r\n\t\t    plr[myplr]._py,\r\n\t\t    object[i]._ox - 2,\r\n\t\t    object[i]._oy - 4,\r\n\t\t    plr[myplr]._pdir,\r\n\t\t    MIS_GUARDIAN,\r\n\t\t    TARGET_MONSTERS,\r\n\t\t    myplr,\r\n\t\t    0,\r\n\t\t    0);\r\n\t}\r\n\tif (setlevel && setlvlnum == SL_VILEBETRAYER) {\r\n\t\tObjChangeMapResync(\r\n\t\t    object[i]._oVar1,\r\n\t\t    object[i]._oVar2,\r\n\t\t    object[i]._oVar3,\r\n\t\t    object[i]._oVar4);\r\n\t\tfor (j = 0; j < nobjects; j++)\r\n\t\t\tSyncObjectAnim(objectactive[j]);\r\n\t}\r\n}\r\n\r\nvoid OperateBookLever(int pnum, int i)\r\n{\r\n\tint x, y, tren;\r\n\r\n\tx = 2 * setpc_x + 16;\r\n\ty = 2 * setpc_y + 16;\r\n\tif (object[i]._oSelFlag != 0 && !qtextflag) {\r\n\t\tif (object[i]._otype == OBJ_BLINDBOOK && quests[Q_BLIND]._qvar1 == 0) {\r\n\t\t\tquests[Q_BLIND]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_BLIND]._qlog = TRUE;\r\n\t\t\tquests[Q_BLIND]._qvar1 = 1;\r\n\t\t}\r\n\t\tif (object[i]._otype == OBJ_BLOODBOOK && quests[Q_BLOOD]._qvar1 == 0) {\r\n\t\t\tquests[Q_BLOOD]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_BLOOD]._qlog = TRUE;\r\n\t\t\tquests[Q_BLOOD]._qvar1 = 1;\r\n\t\t\tSpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 19, 2 * setpc_y + 26, 0, 1);\r\n\t\t\tSpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 31, 2 * setpc_y + 26, 0, 1);\r\n\t\t\tSpawnQuestItem(IDI_BLDSTONE, 2 * setpc_x + 25, 2 * setpc_y + 33, 0, 1);\r\n\t\t}\r\n\t\tobject[i]._otype = object[i]._otype;\r\n\t\tif (object[i]._otype == OBJ_STEELTOME && quests[Q_WARLORD]._qvar1 == 0) {\r\n\t\t\tquests[Q_WARLORD]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_WARLORD]._qlog = TRUE;\r\n\t\t\tquests[Q_WARLORD]._qvar1 = 1;\r\n\t\t}\r\n\t\tif (object[i]._oAnimFrame != object[i]._oVar6) {\r\n\t\t\tif (object[i]._otype != OBJ_BLOODBOOK)\r\n\t\t\t\tObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\t\tif (object[i]._otype == OBJ_BLINDBOOK) {\r\n\t\t\t\tCreateItem(UITEM_OPTAMULET, x + 5, y + 5);\r\n\t\t\t\ttren = TransVal;\r\n\t\t\t\tTransVal = 9;\r\n\t\t\t\tDRLG_MRectTrans(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\t\t\tTransVal = tren;\r\n\t\t\t}\r\n\t\t}\r\n\t\tobject[i]._oAnimFrame = object[i]._oVar6;\r\n\t\tInitQTextMsg(object[i]._oVar7);\r\n\t\tif (pnum == myplr)\r\n\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t}\r\n}\r\n\r\nvoid OperateSChambBk(int pnum, int i)\r\n{\r\n\tint j, textdef;\r\n\r\n\tif (object[i]._oSelFlag != 0 && !qtextflag) {\r\n\t\tif (object[i]._oAnimFrame != object[i]._oVar6) {\r\n\t\t\tObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\t\tfor (j = 0; j < nobjects; j++)\r\n\t\t\t\tSyncObjectAnim(objectactive[j]);\r\n\t\t}\r\n\t\tobject[i]._oAnimFrame = object[i]._oVar6;\r\n\t\tif (quests[Q_SCHAMB]._qactive == QUEST_INIT) {\r\n\t\t\tquests[Q_SCHAMB]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_SCHAMB]._qlog = TRUE;\r\n\t\t}\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\ttextdef = TEXT_BONER;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\ttextdef = TEXT_RBONER;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\ttextdef = TEXT_MBONER;\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\ttextdef = TEXT_HBONER;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\ttextdef = TEXT_BBONER;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\ttextdef = TEXT_BONER;\r\n#endif\r\n\t\t}\r\n\t\tquests[Q_SCHAMB]._qmsg = textdef;\r\n\t\tInitQTextMsg(textdef);\r\n\t}\r\n}\r\n\r\nvoid OperateChest(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tint j, mdir, mtype;\r\n\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tobject[i]._oAnimFrame += 2;\r\n\t\tif (!deltaload) {\r\n\t\t\tSetRndSeed(object[i]._oRndSeed);\r\n\t\t\tif (setlevel) {\r\n\t\t\t\tfor (j = 0; j < object[i]._oVar1; j++) {\r\n\t\t\t\t\tCreateRndItem(object[i]._ox, object[i]._oy, TRUE, sendmsg, FALSE);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (j = 0; j < object[i]._oVar1; j++) {\r\n\t\t\t\t\tif (object[i]._oVar2 != 0)\r\n\t\t\t\t\t\tCreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tCreateRndUseful(pnum, object[i]._ox, object[i]._oy, sendmsg);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (object[i]._oTrapFlag && object[i]._otype >= OBJ_TCHEST1 && object[i]._otype <= OBJ_TCHEST3) {\r\n\t\t\t\tmdir = GetDirection(object[i]._ox, object[i]._oy, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\t\tswitch (object[i]._oVar4) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tmtype = MIS_ARROW;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tmtype = MIS_FARROW;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tmtype = MIS_NOVA;\r\n\t\t\t\t\tbreak;\r\n#ifdef HELLFIRE\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tmtype = MIS_FIRERING;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 4:\r\n\t\t\t\t\tmtype = MIS_STEALPOTS;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 5:\r\n\t\t\t\t\tmtype = MIS_MANATRAP;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tmtype = MIS_ARROW;\r\n#endif\r\n\t\t\t\t}\r\n\t\t\t\tAddMissile(object[i]._ox, object[i]._oy, plr[pnum]._px, plr[pnum]._py, mdir, mtype, TARGET_PLAYERS, -1, 0, 0);\r\n\t\t\t\tobject[i]._oTrapFlag = FALSE;\r\n\t\t\t}\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdParam2(FALSE, CMD_PLROPOBJ, pnum, i);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateMushPatch(int pnum, int i)\r\n{\r\n\tint x, y;\r\n\r\n\tif (quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE || quests[Q_MUSHROOM]._qvar1 < QS_TOMEGIVEN) {\r\n\t\tif (!deltaload && pnum == myplr) {\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tPlaySFX(PS_WARR13);\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tPlaySFX(PS_ROGUE13);\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tPlaySFX(PS_MAGE13);\r\n#ifdef HELLFIRE\r\n\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tPlaySFX(PS_MONK13);\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tPlaySFX(PS_ROGUE13);\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tPlaySFX(PS_WARR13);\r\n#endif\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tif (object[i]._oSelFlag != 0) {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);\r\n\t\t\tobject[i]._oSelFlag = 0;\r\n\t\t\tobject[i]._oAnimFrame++;\r\n\t\t\tif (!deltaload) {\r\n\t\t\t\tGetSuperItemLoc(object[i]._ox, object[i]._oy, x, y);\r\n\t\t\t\tSpawnQuestItem(IDI_MUSHROOM, x, y, 0, 0);\r\n\t\t\t\tquests[Q_MUSHROOM]._qvar1 = QS_MUSHSPAWNED;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateInnSignChest(int pnum, int i)\r\n{\r\n\tint x, y;\r\n\r\n\tif (quests[Q_LTBANNER]._qvar1 != 2) {\r\n\t\tif (!deltaload && pnum == myplr) {\r\n\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\tPlaySFX(PS_WARR24);\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\tPlaySFX(PS_ROGUE24);\r\n\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\tPlaySFX(PS_MAGE24);\r\n#ifdef HELLFIRE\r\n\t\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\tPlaySFX(PS_MONK24);\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\tPlaySFX(PS_ROGUE24);\r\n\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tPlaySFX(PS_WARR24);\r\n#endif\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tif (object[i]._oSelFlag != 0) {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(IS_CHEST, object[i]._ox, object[i]._oy);\r\n\t\t\tobject[i]._oSelFlag = 0;\r\n\t\t\tobject[i]._oAnimFrame += 2;\r\n\t\t\tif (!deltaload) {\r\n\t\t\t\tGetSuperItemLoc(object[i]._ox, object[i]._oy, x, y);\r\n\t\t\t\tSpawnQuestItem(IDI_BANNER, x, y, 0, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateSlainHero(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tif (!deltaload) {\r\n\t\t\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\t\tCreateMagicArmor(object[i]._ox, object[i]._oy, ITYPE_HARMOR, ICURS_BREAST_PLATE, FALSE, TRUE);\r\n#ifndef SPAWN\r\n\t\t\t\tPlaySfxLoc(PS_WARR9, plr[myplr]._px, plr[myplr]._py); // CODEFIX: use pnum instead of myplr or use PlaySFX\r\n#endif\r\n\t\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\t\tCreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_BOW, ICURS_LONG_WAR_BOW, FALSE, TRUE);\r\n#ifndef SPAWN\r\n\t\t\t\tPlaySfxLoc(PS_ROGUE9, plr[myplr]._px, plr[myplr]._py); // CODEFIX: use pnum instead of myplr or use PlaySFX\r\n#endif\r\n\t\t\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\t\tCreateSpellBook(object[i]._ox, object[i]._oy, SPL_LIGHTNING, FALSE, TRUE);\r\n#ifndef SPAWN\r\n\t\t\t\tPlaySfxLoc(PS_MAGE9, plr[myplr]._px, plr[myplr]._py); // CODEFIX: use pnum instead of myplr or use PlaySFX\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\t\tCreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_STAFF, ICURS_WAR_STAFF, FALSE, TRUE);\r\n\t\t\t\tPlaySfxLoc(PS_MONK9, plr[myplr]._px, plr[myplr]._py); // CODEFIX: use pnum instead of myplr or use PlaySFX\r\n#ifndef SPAWN\r\n\t\t\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\t\t\tCreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_SWORD, ICURS_BASTARD_SWORD, FALSE, TRUE);\r\n\t\t\t\tPlaySfxLoc(PS_ROGUE9, plr[myplr]._px, plr[myplr]._py); // CODEFIX: use pnum instead of myplr or use PlaySFX\r\n#endif\r\n\t\t\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\t\tCreateMagicWeapon(object[i]._ox, object[i]._oy, ITYPE_AXE, ICURS_BATTLE_AXE, FALSE, TRUE);\r\n#ifndef SPAWN\r\n\t\t\t\tPlaySfxLoc(PS_WARR9, plr[myplr]._px, plr[myplr]._py); // CODEFIX: use pnum instead of myplr or use PlaySFX\r\n#endif\r\n#endif\r\n\t\t\t}\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateTrapLvr(int i)\r\n{\r\n\tint frame, j, oi;\r\n\r\n\tframe = object[i]._oAnimFrame;\r\n\tj = 0;\r\n\r\n\tif (frame == 1) {\r\n\t\tobject[i]._oAnimFrame = 2;\r\n\t\tfor (; j < nobjects; j++) {\r\n\t\t\toi = objectactive[j];\r\n\t\t\tif (object[oi]._otype == object[i]._oVar2 && object[oi]._oVar1 == object[i]._oVar1) {\r\n\t\t\t\tobject[oi]._oVar2 = 1;\r\n\t\t\t\tobject[oi]._oAnimFlag = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tobject[i]._oAnimFrame = frame - 1;\r\n\tfor (; j < nobjects; j++) {\r\n\t\toi = objectactive[j];\r\n\t\tif (object[oi]._otype == object[i]._oVar2 && object[oi]._oVar1 == object[i]._oVar1) {\r\n\t\t\tobject[oi]._oVar2 = 0;\r\n\t\t\tif (object[oi]._oVar4 != 0)\r\n\t\t\t\tobject[oi]._oAnimFlag = 1;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateSarc(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_SARC, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tif (deltaload) {\r\n\t\t\tobject[i]._oAnimFrame = object[i]._oAnimLen;\r\n\t\t} else {\r\n\t\t\tobject[i]._oAnimFlag = 1;\r\n\t\t\tobject[i]._oAnimDelay = 3;\r\n\t\t\tSetRndSeed(object[i]._oRndSeed);\r\n\t\t\tif (object[i]._oVar1 <= 2)\r\n\t\t\t\tCreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);\r\n\t\t\tif (object[i]._oVar1 >= 8)\r\n\t\t\t\tSpawnSkeleton(object[i]._oVar2, object[i]._ox, object[i]._oy);\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateL2Door(int pnum, int i, DIABOOL sendflag)\r\n{\r\n\tint dpx, dpy;\r\n\r\n\tdpx = abs(object[i]._ox - plr[pnum]._px);\r\n\tdpy = abs(object[i]._oy - plr[pnum]._py);\r\n\tif (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L2LDOOR)\r\n\t\tOperateL2LDoor(pnum, i, sendflag);\r\n\tif (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L2RDOOR)\r\n\t\tOperateL2RDoor(pnum, i, sendflag);\r\n}\r\n\r\nvoid OperateL3Door(int pnum, int i, DIABOOL sendflag)\r\n{\r\n\tint dpx, dpy;\r\n\r\n\tdpx = abs(object[i]._ox - plr[pnum]._px);\r\n\tdpy = abs(object[i]._oy - plr[pnum]._py);\r\n\tif (dpx == 1 && dpy <= 1 && object[i]._otype == OBJ_L3RDOOR)\r\n\t\tOperateL3RDoor(pnum, i, sendflag);\r\n\tif (dpx <= 1 && dpy == 1 && object[i]._otype == OBJ_L3LDOOR)\r\n\t\tOperateL3LDoor(pnum, i, sendflag);\r\n}\r\n\r\nvoid OperatePedistal(int pnum, int i)\r\n{\r\n\tBYTE *mem;\r\n\tint iv;\r\n\r\n\tif (object[i]._oVar6 != 3) {\r\n\t\tif (PlrHasItem(pnum, IDI_BLDSTONE, iv)) {\r\n\t\t\tRemoveInvItem(pnum, iv);\r\n\t\t\tobject[i]._oAnimFrame++;\r\n\t\t\tobject[i]._oVar6++;\r\n\t\t}\r\n\t\tif (object[i]._oVar6 == 1) {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(LS_PUDDLE, object[i]._ox, object[i]._oy);\r\n\t\t\tObjChangeMap(setpc_x, setpc_y + 3, setpc_x + 2, setpc_y + 7);\r\n\t\t}\r\n\t\tif (object[i]._oVar6 == 2) {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(LS_PUDDLE, object[i]._ox, object[i]._oy);\r\n\t\t\tObjChangeMap(setpc_x + 6, setpc_y + 3, setpc_x + setpc_w, setpc_y + 7);\r\n\t\t}\r\n\t\tif (object[i]._oVar6 == 3) {\r\n\t\t\tif (!deltaload)\r\n\t\t\t\tPlaySfxLoc(LS_BLODSTAR, object[i]._ox, object[i]._oy);\r\n\t\t\tObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\t\tmem = LoadFileInMem(\"Levels\\\\L2Data\\\\Blood2.DUN\", NULL);\r\n\t\t\tLoadMapObjs(mem, 2 * setpc_x, 2 * setpc_y);\r\n\t\t\tmem_free_dbg(mem);\r\n\t\t\tCreateItem(UITEM_ARMOFVAL, 2 * setpc_x + 25, 2 * setpc_y + 19);\r\n\t\t\tobject[i]._oSelFlag = 0;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid TryDisarm(int pnum, int i)\r\n{\r\n\tint j, oi, oti, trapdisper;\r\n\tDIABOOL checkflag;\r\n\r\n\tif (pnum == myplr)\r\n\t\tSetCursor_(CURSOR_HAND);\r\n\tif (object[i]._oTrapFlag) {\r\n\t\ttrapdisper = 2 * plr[pnum]._pDexterity - 5 * currlevel;\r\n\t\tif (random_(154, 100) <= trapdisper) {\r\n\t\t\tfor (j = 0; j < nobjects; j++) {\r\n\t\t\t\tcheckflag = FALSE;\r\n\t\t\t\toi = objectactive[j];\r\n\t\t\t\toti = object[oi]._otype;\r\n\t\t\t\tif (oti == OBJ_TRAPL)\r\n\t\t\t\t\tcheckflag = TRUE;\r\n\t\t\t\tif (oti == OBJ_TRAPR)\r\n\t\t\t\t\tcheckflag = TRUE;\r\n\t\t\t\tif (checkflag && dObject[object[oi]._oVar1][object[oi]._oVar2] - 1 == i) {\r\n\t\t\t\t\tobject[oi]._oVar4 = 1;\r\n\t\t\t\t\tobject[i]._oTrapFlag = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n#ifndef HELLFIRE\r\n\t\t\toti = object[i]._otype;\r\n\t\t\tif (oti >= OBJ_TCHEST1 && oti <= OBJ_TCHEST3)\r\n\t\t\t\tobject[i]._oTrapFlag = FALSE;\r\n#endif\r\n\t\t}\r\n\t}\r\n}\r\n\r\nint ItemMiscIdIdx(int imiscid)\r\n{\r\n\tint i;\r\n\r\n\ti = 0;\r\n\twhile (AllItemsList[i].iRnd == IDROP_NEVER || AllItemsList[i].iMiscId != imiscid) {\r\n\t\ti++;\r\n\t}\r\n\r\n\treturn i;\r\n}\r\n\r\nvoid OperateShrine(int pnum, int i, int sType)\r\n{\r\n\tint cnt;\r\n\tint r, j;\r\n\tDWORD lv, t;\r\n\tint xx, yy;\r\n\tint v1, v2, v3, v4;\r\n\tunsigned __int64 spell, spells;\r\n\r\n\tif (dropGoldFlag) {\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tdropGoldValue = 0;\r\n\t}\r\n\r\n\t/// ASSERT: assert((DWORD)i < MAXOBJECTS);\r\n\r\n\tif (object[i]._oSelFlag == 0)\r\n\t\treturn;\r\n\r\n\tSetRndSeed(object[i]._oRndSeed);\r\n\tobject[i]._oSelFlag = 0;\r\n\r\n\tif (!deltaload) {\r\n\t\tPlaySfxLoc(sType, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oAnimFlag = 1;\r\n\t\tobject[i]._oAnimDelay = 1;\r\n\t} else {\r\n\t\tobject[i]._oAnimFrame = object[i]._oAnimLen;\r\n\t\tobject[i]._oAnimFlag = 0;\r\n\t}\r\n\tswitch (object[i]._oVar1) {\r\n\tcase SHRINE_MYSTERIOUS:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tModifyPlrStr(pnum, -1);\r\n\t\tModifyPlrMag(pnum, -1);\r\n\t\tModifyPlrDex(pnum, -1);\r\n\t\tModifyPlrVit(pnum, -1);\r\n\t\tswitch (random_(0, 4)) {\r\n\t\tcase 0:\r\n\t\t\tModifyPlrStr(pnum, 6);\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tModifyPlrMag(pnum, 6);\r\n\t\t\tbreak;\r\n\t\tcase 2:\r\n\t\t\tModifyPlrDex(pnum, 6);\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tModifyPlrVit(pnum, 6);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tCheckStats(pnum);\r\n\t\tInitDiabloMsg(EMSG_SHRINE_MYSTERIOUS);\r\n\t\tbreak;\r\n\tcase SHRINE_HIDDEN:\r\n\t\tcnt = 0;\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\t\tif (plr[pnum].InvBody[j]._itype != ITYPE_NONE)\r\n\t\t\t\tcnt++;\r\n\t\t}\r\n\t\tif (cnt > 0) {\r\n\t\t\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\t\t\tif (plr[pnum].InvBody[j]._itype != ITYPE_NONE\r\n\t\t\t\t    && plr[pnum].InvBody[j]._iMaxDur != DUR_INDESTRUCTIBLE\r\n\t\t\t\t    && plr[pnum].InvBody[j]._iMaxDur != 0) {\r\n\t\t\t\t\tplr[pnum].InvBody[j]._iDurability += 10;\r\n\t\t\t\t\tplr[pnum].InvBody[j]._iMaxDur += 10;\r\n\t\t\t\t\tif (plr[pnum].InvBody[j]._iDurability > plr[pnum].InvBody[j]._iMaxDur)\r\n\t\t\t\t\t\tplr[pnum].InvBody[j]._iDurability = plr[pnum].InvBody[j]._iMaxDur;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\twhile (TRUE) {\r\n\t\t\t\tcnt = 0;\r\n\t\t\t\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\t\t\t\tif (plr[pnum].InvBody[j]._itype != ITYPE_NONE)\r\n#ifndef HELLFIRE\r\n\t\t\t\t\t\tif (plr[pnum].InvBody[j]._iMaxDur != DUR_INDESTRUCTIBLE\r\n\t\t\t\t\t\t    && plr[pnum].InvBody[j]._iMaxDur != 0)\r\n#endif\r\n\t\t\t\t\t\t\tcnt++;\r\n\t\t\t\t}\r\n\t\t\t\tif (cnt == 0)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tr = random_(0, NUM_INVLOC);\r\n\t\t\t\tif (plr[pnum].InvBody[r]._itype == ITYPE_NONE || plr[pnum].InvBody[r]._iMaxDur == DUR_INDESTRUCTIBLE || plr[pnum].InvBody[r]._iMaxDur == 0)\r\n\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\tplr[pnum].InvBody[r]._iDurability -= 20;\r\n\t\t\t\tplr[pnum].InvBody[r]._iMaxDur -= 20;\r\n\t\t\t\tif (plr[pnum].InvBody[r]._iDurability <= 0)\r\n\t\t\t\t\tplr[pnum].InvBody[r]._iDurability = 1;\r\n\t\t\t\tif (plr[pnum].InvBody[r]._iMaxDur <= 0)\r\n\t\t\t\t\tplr[pnum].InvBody[r]._iMaxDur = 1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_HIDDEN);\r\n\t\tbreak;\r\n\tcase SHRINE_GLOOMY:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\tbreak;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE)\r\n\t\t\tplr[pnum].InvBody[INVLOC_HEAD]._iAC += 2;\r\n\t\tif (plr[pnum].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE)\r\n\t\t\tplr[pnum].InvBody[INVLOC_CHEST]._iAC += 2;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE) {\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iAC += 2;\r\n\t\t\t} else {\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam--;\r\n\t\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam)\r\n\t\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam = plr[pnum].InvBody[INVLOC_HAND_LEFT]._iMinDam;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE) {\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iAC += 2;\r\n\t\t\t} else {\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam--;\r\n\t\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam < plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam)\r\n\t\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam = plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMinDam;\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (j = 0; j < plr[pnum]._pNumInv; j++) {\r\n\t\t\tswitch (plr[pnum].InvList[j]._itype) {\r\n\t\t\tcase ITYPE_SWORD:\r\n\t\t\tcase ITYPE_AXE:\r\n\t\t\tcase ITYPE_BOW:\r\n\t\t\tcase ITYPE_MACE:\r\n\t\t\tcase ITYPE_STAFF:\r\n\t\t\t\tplr[pnum].InvList[j]._iMaxDam--;\r\n\t\t\t\tif (plr[pnum].InvList[j]._iMaxDam < plr[pnum].InvList[j]._iMinDam)\r\n\t\t\t\t\tplr[pnum].InvList[j]._iMaxDam = plr[pnum].InvList[j]._iMinDam;\r\n\t\t\t\tbreak;\r\n\t\t\tcase ITYPE_SHIELD:\r\n\t\t\tcase ITYPE_HELM:\r\n\t\t\tcase ITYPE_LARMOR:\r\n\t\t\tcase ITYPE_MARMOR:\r\n\t\t\tcase ITYPE_HARMOR:\r\n\t\t\t\tplr[pnum].InvList[j]._iAC += 2;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_GLOOMY);\r\n\t\tbreak;\r\n\tcase SHRINE_WEIRD:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\tbreak;\r\n\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_SHIELD)\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iMaxDam++;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_SHIELD)\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iMaxDam++;\r\n\t\tfor (j = 0; j < plr[pnum]._pNumInv; j++) {\r\n\t\t\tswitch (plr[pnum].InvList[j]._itype) {\r\n\t\t\tcase ITYPE_SWORD:\r\n\t\t\tcase ITYPE_AXE:\r\n\t\t\tcase ITYPE_BOW:\r\n\t\t\tcase ITYPE_MACE:\r\n\t\t\tcase ITYPE_STAFF:\r\n\t\t\t\tplr[pnum].InvList[j]._iMaxDam++;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_WEIRD);\r\n\t\tbreak;\r\n\tcase SHRINE_MAGICAL:\r\n\r\n\tcase SHRINE_MAGICAL2:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tAddMissile(\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._pdir,\r\n\t\t    MIS_MANASHIELD,\r\n\t\t    -1,\r\n\t\t    pnum,\r\n\t\t    0,\r\n\t\t    2 * leveltype);\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_MAGICAL);\r\n\t\tbreak;\r\n\tcase SHRINE_STONE:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\tbreak;\r\n\r\n\t\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\t\tif (plr[pnum].InvBody[j]._itype == ITYPE_STAFF)\r\n\t\t\t\tplr[pnum].InvBody[j]._iCharges = plr[pnum].InvBody[j]._iMaxCharges;\r\n\t\t}\r\n\t\tfor (j = 0; j < plr[pnum]._pNumInv; j++) {\r\n\t\t\tif (plr[pnum].InvList[j]._itype == ITYPE_STAFF)\r\n\t\t\t\tplr[pnum].InvList[j]._iCharges = plr[pnum].InvList[j]._iMaxCharges;\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXBELTITEMS; j++) {\r\n\t\t\tif (plr[pnum].SpdList[j]._itype == ITYPE_STAFF)\r\n\t\t\t\tplr[pnum].SpdList[j]._iCharges = plr[pnum].SpdList[j]._iMaxCharges; // belt items don't have charges?\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_STONE);\r\n\t\tbreak;\r\n\tcase SHRINE_RELIGIOUS:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\tbreak;\r\n\r\n\t\tfor (j = 0; j < NUM_INVLOC; j++)\r\n\t\t\tplr[pnum].InvBody[j]._iDurability = plr[pnum].InvBody[j]._iMaxDur;\r\n\t\tfor (j = 0; j < plr[pnum]._pNumInv; j++)\r\n\t\t\tplr[pnum].InvList[j]._iDurability = plr[pnum].InvList[j]._iMaxDur;\r\n\t\tfor (j = 0; j < MAXBELTITEMS; j++)\r\n\t\t\tplr[pnum].SpdList[j]._iDurability = plr[pnum].SpdList[j]._iMaxDur; // belt items don't have durability?\r\n\t\tInitDiabloMsg(EMSG_SHRINE_RELIGIOUS);\r\n\t\tbreak;\r\n\tcase SHRINE_ENCHANTED:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tcnt = 0;\r\n\t\tspell = 1;\r\n\t\tspells = plr[pnum]._pMemSpells;\r\n\t\tfor (j = 0; j < MAX_SPELLS; j++) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (spell & plr[pnum]._pMemSpells)\r\n#else\r\n\t\t\tif (spell & spells)\r\n#endif\r\n\t\t\t\tcnt++;\r\n\t\t\tspell <<= 1;\r\n\t\t}\r\n\t\tif (cnt > 1) {\r\n\t\t\tspell = 1;\r\n\t\t\tfor (j = SPL_FIREBOLT; j <= MAX_SPELLS; j++) { // BUGFIX: < MAX_SPELLS, there is no spell with MAX_SPELLS index\r\n\t\t\t\tif (plr[pnum]._pMemSpells & spell) {\r\n\t\t\t\t\tif (plr[pnum]._pSplLvl[j] < MAX_SPELL_LEVEL)\r\n\t\t\t\t\t\tplr[pnum]._pSplLvl[j]++;\r\n\t\t\t\t}\r\n\t\t\t\tspell <<= 1;\r\n\t\t\t}\r\n\t\t\tdo {\r\n\t\t\t\tr = random_(0, MAX_SPELLS);\r\n\t\t\t} while (!(plr[pnum]._pMemSpells & SPELLBIT(r + 1)));\r\n\t\t\tif (plr[pnum]._pSplLvl[r + 1] >= 2)\r\n\t\t\t\tplr[pnum]._pSplLvl[r + 1] -= 2;\r\n\t\t\telse\r\n\t\t\t\tplr[pnum]._pSplLvl[r + 1] = 0;\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_ENCHANTED);\r\n\t\tbreak;\r\n\tcase SHRINE_THAUMATURGIC:\r\n\t\tfor (j = 0; j < nobjects; j++) {\r\n\t\t\tv1 = objectactive[j];\r\n\t\t\t/// ASSERT: assert((DWORD)v1 < MAXOBJECTS);\r\n\t\t\tif ((object[v1]._otype == OBJ_CHEST1\r\n\t\t\t        || object[v1]._otype == OBJ_CHEST2\r\n\t\t\t        || object[v1]._otype == OBJ_CHEST3)\r\n\t\t\t    && object[v1]._oSelFlag == 0) {\r\n\t\t\t\tobject[v1]._oRndSeed = GetRndSeed();\r\n\t\t\t\tobject[v1]._oSelFlag = 1;\r\n\t\t\t\tobject[v1]._oAnimFrame -= 2;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum == myplr)\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_THAUMATURGIC);\r\n\t\tbreak;\r\n\tcase SHRINE_FASCINATING:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tplr[pnum]._pMemSpells |= SPELLBIT(SPL_FIREBOLT);\r\n\t\tif (plr[pnum]._pSplLvl[SPL_FIREBOLT] < MAX_SPELL_LEVEL)\r\n\t\t\tplr[pnum]._pSplLvl[SPL_FIREBOLT]++;\r\n\t\tif (plr[pnum]._pSplLvl[SPL_FIREBOLT] < MAX_SPELL_LEVEL)\r\n\t\t\tplr[pnum]._pSplLvl[SPL_FIREBOLT]++;\r\n\t\tt = plr[pnum]._pMaxManaBase / 10;\r\n\t\tv1 = plr[pnum]._pMana - plr[pnum]._pManaBase;\r\n\t\tv2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;\r\n\r\n\t\tplr[pnum]._pManaBase -= t;\r\n\t\tplr[pnum]._pMana -= t;\r\n\t\tplr[pnum]._pMaxMana -= t;\r\n\t\tplr[pnum]._pMaxManaBase -= t;\r\n\t\tif (plr[pnum]._pMana >> 6 <= 0) {\r\n\t\t\tplr[pnum]._pMana = v1;\r\n\t\t\tplr[pnum]._pManaBase = 0;\r\n\t\t}\r\n\t\tif (plr[pnum]._pMaxMana >> 6 <= 0) {\r\n\t\t\tplr[pnum]._pMaxMana = v2;\r\n\t\t\tplr[pnum]._pMaxManaBase = 0;\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_FASCINATING);\r\n\t\tbreak;\r\n\tcase SHRINE_CRYPTIC:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tAddMissile(\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._pdir,\r\n\t\t    MIS_NOVA,\r\n\t\t    -1,\r\n\t\t    pnum,\r\n\t\t    0,\r\n\t\t    2 * leveltype);\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tplr[pnum]._pMana = plr[pnum]._pMaxMana;\r\n\t\tplr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_CRYPTIC);\r\n\t\tbreak;\r\n\tcase SHRINE_ELDRITCH: /// BUGFIX: change `plr[pnum].HoldItem` to use a temporary buffer to prevent deleting item in hand\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\tbreak;\r\n\t\tfor (j = 0; j < plr[pnum]._pNumInv; j++) {\r\n\t\t\tif (plr[pnum].InvList[j]._itype == ITYPE_MISC) {\r\n\t\t\t\tif (plr[pnum].InvList[j]._iMiscId == IMISC_HEAL\r\n\t\t\t\t    || plr[pnum].InvList[j]._iMiscId == IMISC_MANA) {\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));\r\n\t\t\t\t\tGetPlrHandSeed(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._iStatFlag = TRUE;\r\n\t\t\t\t\tplr[pnum].InvList[j] = plr[pnum].HoldItem;\r\n\t\t\t\t}\r\n\t\t\t\tif (plr[pnum].InvList[j]._iMiscId == IMISC_FULLHEAL\r\n\t\t\t\t    || plr[pnum].InvList[j]._iMiscId == IMISC_FULLMANA) {\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));\r\n\t\t\t\t\tGetPlrHandSeed(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._iStatFlag = TRUE;\r\n\t\t\t\t\tplr[pnum].InvList[j] = plr[pnum].HoldItem;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXBELTITEMS; j++) {\r\n\t\t\tif (plr[pnum].SpdList[j]._itype == ITYPE_MISC) {\r\n\t\t\t\tif (plr[pnum].SpdList[j]._iMiscId == IMISC_HEAL\r\n\t\t\t\t    || plr[pnum].SpdList[j]._iMiscId == IMISC_MANA) {\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_REJUV));\r\n\t\t\t\t\tGetPlrHandSeed(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._iStatFlag = TRUE;\r\n\t\t\t\t\tplr[pnum].SpdList[j] = plr[pnum].HoldItem;\r\n\t\t\t\t}\r\n\t\t\t\tif (plr[pnum].SpdList[j]._iMiscId == IMISC_FULLHEAL\r\n\t\t\t\t    || plr[pnum].SpdList[j]._iMiscId == IMISC_FULLMANA) {\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, ItemMiscIdIdx(IMISC_FULLREJUV));\r\n\t\t\t\t\tGetPlrHandSeed(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._iStatFlag = TRUE;\r\n\t\t\t\t\tplr[pnum].SpdList[j] = plr[pnum].HoldItem;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_ELDRITCH);\r\n\t\tbreak;\r\n\tcase SHRINE_EERIE:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tModifyPlrMag(pnum, 2);\r\n\t\tCheckStats(pnum);\r\n\t\tInitDiabloMsg(EMSG_SHRINE_EERIE);\r\n\t\tbreak;\r\n\tcase SHRINE_DIVINE:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tif (2 * currlevel < 7) {\r\n\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLMANA, FALSE, TRUE);\r\n\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLHEAL, FALSE, TRUE);\r\n\t\t} else {\r\n\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLREJUV, FALSE, TRUE);\r\n\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_FULLREJUV, FALSE, TRUE);\r\n\t\t}\r\n\t\tplr[pnum]._pMana = plr[pnum]._pMaxMana;\r\n\t\tplr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;\r\n\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_DIVINE);\r\n\t\tbreak;\r\n\tcase SHRINE_HOLY:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tj = 0;\r\n\t\tdo {\r\n\t\t\txx = random_(159, MAXDUNX);\r\n\t\t\tyy = random_(159, MAXDUNY);\r\n\t\t\tlv = dPiece[xx][yy];\r\n\t\t\tj++;\r\n\t\t\t// BUGFIX: should not cast phasing if still on bad tile after max amount of tries.\r\n\t\t\tif (j > MAXDUNX * MAXDUNY)\r\n\t\t\t\tbreak;\r\n\t\t} while (nSolidTable[lv] || dObject[xx][yy] != 0 || dMonster[xx][yy] != 0);\r\n\t\tAddMissile(plr[pnum]._px, plr[pnum]._py, xx, yy, plr[pnum]._pdir, MIS_RNDTELEPORT, -1, pnum, 0, 2 * leveltype);\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_HOLY);\r\n\t\tbreak;\r\n\tcase SHRINE_SACRED:\r\n\t\tif (deltaload || pnum != myplr)\r\n\t\t\treturn;\r\n\t\tplr[pnum]._pMemSpells |= SPELLBIT(SPL_CBOLT);\r\n\t\tif (plr[pnum]._pSplLvl[SPL_CBOLT] < MAX_SPELL_LEVEL)\r\n\t\t\tplr[pnum]._pSplLvl[SPL_CBOLT]++;\r\n\t\tif (plr[pnum]._pSplLvl[SPL_CBOLT] < MAX_SPELL_LEVEL)\r\n\t\t\tplr[pnum]._pSplLvl[SPL_CBOLT]++;\r\n\t\tt = plr[pnum]._pMaxManaBase / 10;\r\n\t\tv1 = plr[pnum]._pMana - plr[pnum]._pManaBase;\r\n\t\tv2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;\r\n\t\tplr[pnum]._pManaBase -= t;\r\n\t\tplr[pnum]._pMana -= t;\r\n\t\tplr[pnum]._pMaxMana -= t;\r\n\t\tplr[pnum]._pMaxManaBase -= t;\r\n\t\tif (plr[pnum]._pMana >> 6 <= 0) {\r\n\t\t\tplr[pnum]._pMana = v1;\r\n\t\t\tplr[pnum]._pManaBase = 0;\r\n\t\t}\r\n\t\tif (plr[pnum]._pMaxMana >> 6 <= 0) {\r\n\t\t\tplr[pnum]._pMaxMana = v2;\r\n\t\t\tplr[pnum]._pMaxManaBase = 0;\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_SACRED);\r\n\t\tbreak;\r\n\tcase SHRINE_SPIRITUAL:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tfor (j = 0; j < NUM_INV_GRID_ELEM; j++) {\r\n\t\t\tif (plr[pnum].InvGrid[j] == 0) {\r\n\t\t\t\tr = 5 * leveltype + random_(160, 10 * leveltype);\r\n\t\t\t\tt = plr[pnum]._pNumInv; // check\r\n\t\t\t\tplr[pnum].InvList[t] = golditem;\r\n\t\t\t\tplr[pnum].InvList[t]._iSeed = GetRndSeed();\r\n\t\t\t\tplr[pnum]._pNumInv++;\r\n\t\t\t\tplr[pnum].InvGrid[j] = plr[pnum]._pNumInv;\r\n\t\t\t\tplr[pnum].InvList[t]._ivalue = r;\r\n\t\t\t\tplr[pnum]._pGold += r;\r\n\t\t\t\tSetGoldCurs(pnum, t);\r\n\t\t\t}\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_SPIRITUAL);\r\n\t\tbreak;\r\n\tcase SHRINE_SPOOKY:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum == myplr) {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_SPOOKY1);\r\n\t\t} else {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_SPOOKY2);\r\n\t\t\tplr[myplr]._pHitPoints = plr[myplr]._pMaxHP;\r\n\t\t\tplr[myplr]._pHPBase = plr[myplr]._pMaxHPBase;\r\n\t\t\tplr[myplr]._pMana = plr[myplr]._pMaxMana;\r\n\t\t\tplr[myplr]._pManaBase = plr[myplr]._pMaxManaBase;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase SHRINE_ABANDONED:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tModifyPlrDex(pnum, 2);\r\n\t\tCheckStats(pnum);\r\n\t\tif (pnum == myplr)\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_ABANDONED);\r\n\t\tbreak;\r\n\tcase SHRINE_CREEPY:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tModifyPlrStr(pnum, 2);\r\n\t\tCheckStats(pnum);\r\n\t\tif (pnum == myplr)\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_CREEPY);\r\n\t\tbreak;\r\n\tcase SHRINE_QUIET:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tModifyPlrVit(pnum, 2);\r\n\t\tCheckStats(pnum);\r\n\t\tif (pnum == myplr)\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_QUIET);\r\n\t\tbreak;\r\n\tcase SHRINE_SECLUDED:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\tbreak;\r\n\r\n\t\tfor (yy = 0; yy < DMAXY; yy++) {\r\n\t\t\tfor (xx = 0; xx < DMAXX; xx++) {\r\n\t\t\t\tautomapview[xx][yy] = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_SECLUDED);\r\n\t\tbreak;\r\n\tcase SHRINE_ORNATE:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tplr[pnum]._pMemSpells |= SPELLBIT(SPL_HBOLT);\r\n\t\tif (plr[pnum]._pSplLvl[SPL_HBOLT] < MAX_SPELL_LEVEL)\r\n\t\t\tplr[pnum]._pSplLvl[SPL_HBOLT]++;\r\n\t\tif (plr[pnum]._pSplLvl[SPL_HBOLT] < MAX_SPELL_LEVEL)\r\n\t\t\tplr[pnum]._pSplLvl[SPL_HBOLT]++;\r\n\t\tt = plr[pnum]._pMaxManaBase / 10;\r\n\t\tv1 = plr[pnum]._pMana - plr[pnum]._pManaBase;\r\n\t\tv2 = plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase;\r\n\t\tplr[pnum]._pManaBase -= t;\r\n\t\tplr[pnum]._pMana -= t;\r\n\t\tplr[pnum]._pMaxMana -= t;\r\n\t\tplr[pnum]._pMaxManaBase -= t;\r\n\t\tif (plr[pnum]._pMana >> 6 <= 0) {\r\n\t\t\tplr[pnum]._pMana = v1;\r\n\t\t\tplr[pnum]._pManaBase = 0;\r\n\t\t}\r\n\t\tif (plr[pnum]._pMaxMana >> 6 <= 0) {\r\n\t\t\tplr[pnum]._pMaxMana = v2;\r\n\t\t\tplr[pnum]._pMaxManaBase = 0;\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_ORNATE);\r\n\t\tbreak;\r\n\tcase SHRINE_GLIMMERING:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tfor (j = 0; j < NUM_INVLOC; j++) {\r\n\t\t\tif (plr[pnum].InvBody[j]._iMagical && !plr[pnum].InvBody[j]._iIdentified)\r\n\t\t\t\tplr[pnum].InvBody[j]._iIdentified = TRUE;\r\n\t\t}\r\n\t\tfor (j = 0; j < plr[pnum]._pNumInv; j++) {\r\n\t\t\tif (plr[pnum].InvList[j]._iMagical && !plr[pnum].InvList[j]._iIdentified)\r\n\t\t\t\tplr[pnum].InvList[j]._iIdentified = TRUE;\r\n\t\t}\r\n\t\tfor (j = 0; j < MAXBELTITEMS; j++) {\r\n\t\t\tif (plr[pnum].SpdList[j]._iMagical && !plr[pnum].SpdList[j]._iIdentified)\r\n\t\t\t\tplr[pnum].SpdList[j]._iIdentified = TRUE; // belt items can't be magical?\r\n\t\t}\r\n\t\tInitDiabloMsg(EMSG_SHRINE_GLIMMERING);\r\n\t\tbreak;\r\n\tcase SHRINE_TAINTED:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum == myplr) {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_TAINTED1);\r\n\t\t} else {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_TAINTED2);\r\n\t\t\tr = random_(155, 4);\r\n\r\n\t\t\tif (r != 0)\r\n\t\t\t\tv1 = -1;\r\n\t\t\telse\r\n\t\t\t\tv1 = 1;\r\n\t\t\tif (r != 1)\r\n\t\t\t\tv2 = -1;\r\n\t\t\telse\r\n\t\t\t\tv2 = 1;\r\n\t\t\tif (r == 2)\r\n\t\t\t\tv3 = 1;\r\n\t\t\telse\r\n\t\t\t\tv3 = -1;\r\n\t\t\tif (r == 3)\r\n\t\t\t\tv4 = 1;\r\n\t\t\telse\r\n\t\t\t\tv4 = -1;\r\n\r\n\t\t\tModifyPlrStr(myplr, v1);\r\n\t\t\tModifyPlrMag(myplr, v2);\r\n\t\t\tModifyPlrDex(myplr, v3);\r\n\t\t\tModifyPlrVit(myplr, v4);\r\n\r\n\t\t\tCheckStats(myplr);\r\n\t\t}\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase SHRINE_OILY:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_OILY);\r\n\r\n\t\tswitch (plr[myplr]._pClass) {\r\n\t\tcase PC_WARRIOR:\r\n\t\t\tModifyPlrStr(myplr, 2);\r\n\t\t\tbreak;\r\n\t\tcase PC_ROGUE:\r\n\t\t\tModifyPlrDex(myplr, 2);\r\n\t\t\tbreak;\r\n\t\tcase PC_SORCERER:\r\n\t\t\tModifyPlrMag(myplr, 2);\r\n\t\t\tbreak;\r\n\t\tcase PC_BARBARIAN:\r\n\t\t\tModifyPlrVit(myplr, 2);\r\n\t\t\tbreak;\r\n\t\tcase PC_MONK:\r\n\t\t\tModifyPlrStr(myplr, 1);\r\n\t\t\tModifyPlrDex(myplr, 1);\r\n\t\t\tbreak;\r\n\t\tcase PC_BARD:\r\n\t\t\tModifyPlrDex(myplr, 1);\r\n\t\t\tModifyPlrMag(myplr, 1);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tCheckStats(pnum);\r\n\t\tAddMissile(\r\n\t\t    object[i]._ox,\r\n\t\t    object[i]._oy,\r\n\t\t    plr[myplr]._px,\r\n\t\t    plr[myplr]._py,\r\n\t\t    plr[myplr]._pdir,\r\n\t\t    MIS_FIREWALL,\r\n\t\t    TARGET_PLAYERS,\r\n\t\t    0,\r\n\t\t    2 * currlevel + 2,\r\n\t\t    0);\r\n\t\tbreak;\r\n\r\n\tcase SHRINE_GLOWING: {\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_GLOWING);\r\n\t\tint playerXP = plr[myplr]._pExperience;\r\n\t\tint xpLoss, magicGain;\r\n\t\tif (playerXP > 5000) {\r\n\t\t\tmagicGain = 5;\r\n\t\t\txpLoss = (signed __int64)((double)playerXP * 0.95);\r\n\t\t} else {\r\n\t\t\tmagicGain = playerXP / 1000;\r\n\t\t\txpLoss = 0;\r\n\t\t}\r\n\t\tModifyPlrMag(myplr, magicGain);\r\n\t\tplr[myplr]._pExperience = xpLoss;\r\n\t\tCheckStats(pnum);\r\n\t} break;\r\n\r\n\tcase SHRINE_MENDICANT: {\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_MENDICANT);\r\n\t\tint gold = plr[myplr]._pGold / 2;\r\n\t\tAddPlrExperience(myplr, plr[myplr]._pLevel, gold);\r\n\t\tTakePlrsMoney(gold);\r\n\t\tCheckStats(pnum);\r\n\t} break;\r\n\tcase SHRINE_SPARKLING:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_SPARKLING);\r\n\t\tAddPlrExperience(myplr, plr[myplr]._pLevel, 1000 * currlevel);\r\n\t\tAddMissile(\r\n\t\t    object[i]._ox,\r\n\t\t    object[i]._oy,\r\n\t\t    plr[myplr]._px,\r\n\t\t    plr[myplr]._py,\r\n\t\t    plr[myplr]._pdir,\r\n\t\t    MIS_FLASH,\r\n\t\t    TARGET_PLAYERS,\r\n\t\t    0,\r\n\t\t    3 * currlevel + 2,\r\n\t\t    0);\r\n\t\tCheckStats(pnum);\r\n\t\tbreak;\r\n\tcase SHRINE_TOWN:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_TOWN);\r\n\t\tAddMissile(\r\n\t\t    object[i]._ox,\r\n\t\t    object[i]._oy,\r\n\t\t    plr[myplr]._px,\r\n\t\t    plr[myplr]._py,\r\n\t\t    plr[myplr]._pdir,\r\n\t\t    MIS_TOWN,\r\n\t\t    TARGET_PLAYERS,\r\n\t\t    0,\r\n\t\t    0,\r\n\t\t    0);\r\n\t\tbreak;\r\n\tcase SHRINE_SHIMMERING:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_SHIMMERING);\r\n\t\tplr[pnum]._pMana = plr[pnum]._pMaxMana;\r\n\t\tplr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;\r\n\t\tbreak;\r\n\r\n\tcase SHRINE_SOLAR: {\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\ttime_t tm = time(0);\r\n\t\tint hour = localtime(&tm)->tm_hour;\r\n\t\tif (hour > 20 || hour < 4) {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_SOLAR4);\r\n\t\t\tModifyPlrVit(myplr, 2);\r\n\t\t} else if (hour > 18) {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_SOLAR3);\r\n\t\t\tModifyPlrMag(myplr, 2);\r\n\t\t} else if (hour > 12) {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_SOLAR2);\r\n\t\t\tModifyPlrStr(myplr, 2);\r\n\t\t} else if (hour > 4) {\r\n\t\t\tInitDiabloMsg(EMSG_SHRINE_SOLAR1);\r\n\t\t\tModifyPlrDex(myplr, 2);\r\n\t\t}\r\n\t\tCheckStats(pnum);\r\n\t} break;\r\n\r\n\tcase SHRINE_MURPHYS:\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn;\r\n\t\tInitDiabloMsg(EMSG_SHRINE_MURPHYS);\r\n\t\tBOOL broke = FALSE;\r\n\t\tfor (int j = 0; j < NUM_INVLOC; j++) {\r\n\t\t\tItemStruct *item = &plr[myplr].InvBody[j];\r\n\t\t\tif (item->_itype != ITYPE_NONE && random_(0, 3) == 0) {\r\n\t\t\t\tif (item->_iDurability != DUR_INDESTRUCTIBLE) {\r\n\t\t\t\t\tif (item->_iDurability) {\r\n\t\t\t\t\t\titem->_iDurability /= 2;\r\n\t\t\t\t\t\tbroke = TRUE;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!broke) {\r\n\t\t\tTakePlrsMoney(plr[myplr]._pGold / 3);\r\n\t\t}\r\n\t\tbreak;\r\n#endif\r\n\t}\r\n\r\n\tCalcPlrInv(pnum, TRUE);\r\n\tforce_redraw = 255;\r\n\r\n\tif (pnum == myplr)\r\n\t\tNetSendCmdParam2(FALSE, CMD_PLROPOBJ, pnum, i);\r\n}\r\n\r\nvoid OperateSkelBook(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tobject[i]._oAnimFrame += 2;\r\n\t\tif (!deltaload) {\r\n\t\t\tSetRndSeed(object[i]._oRndSeed);\r\n\t\t\tif (random_(161, 5) != 0)\r\n\t\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_SCROLL, sendmsg, FALSE);\r\n\t\t\telse\r\n\t\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_BOOK, sendmsg, FALSE);\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateBookCase(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tobject[i]._oAnimFrame -= 2;\r\n\t\tif (!deltaload) {\r\n\t\t\tSetRndSeed(object[i]._oRndSeed);\r\n\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_MISC, IMISC_BOOK, sendmsg, FALSE);\r\n\t\t\tif (QuestStatus(Q_ZHAR)\r\n\t\t\t    && monster[MAX_PLRS].mName == UniqMonst[UMT_ZHAR].mName\r\n\t\t\t    && monster[MAX_PLRS]._msquelch == UCHAR_MAX\r\n\t\t\t    && monster[MAX_PLRS]._mhitpoints != 0) {\r\n\t\t\t\tmonster[MAX_PLRS].mtalkmsg = TEXT_ZHAR2;\r\n\t\t\t\tM_StartStand(0, monster[MAX_PLRS]._mdir); // BUGFIX: first parameter in call to M_StartStand should be MAX_PLRS, not 0.\r\n\t\t\t\tmonster[MAX_PLRS]._mgoal = MGOAL_ATTACK2;\r\n\t\t\t\tmonster[MAX_PLRS]._mmode = MM_TALK;\r\n\t\t\t}\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateDecap(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tif (!deltaload) {\r\n\t\t\tSetRndSeed(object[i]._oRndSeed);\r\n\t\t\tCreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid OperateArmorStand(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tBOOL uniqueRnd;\r\n\r\n\tif (object[i]._oSelFlag != 0) {\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tobject[i]._oAnimFrame++;\r\n\t\tif (!deltaload) {\r\n\t\t\tSetRndSeed(object[i]._oRndSeed);\r\n\t\t\tuniqueRnd = random_(0, 2);\r\n\t\t\tif (currlevel <= 5) {\r\n\t\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, TRUE, ITYPE_LARMOR, IMISC_NONE, sendmsg, FALSE);\r\n\t\t\t} else if (currlevel >= 6 && currlevel <= 9) {\r\n\t\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, uniqueRnd, ITYPE_MARMOR, IMISC_NONE, sendmsg, FALSE);\r\n\t\t\t} else if (currlevel >= 10 && currlevel <= 12) {\r\n\t\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, ITYPE_HARMOR, IMISC_NONE, sendmsg, FALSE);\r\n\t\t\t} else if (currlevel >= 13 && currlevel <= 16) {\r\n\t\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, TRUE, ITYPE_HARMOR, IMISC_NONE, sendmsg, FALSE);\r\n#ifdef HELLFIRE\r\n\t\t\t} else if (currlevel >= 17) {\r\n\t\t\t\tCreateTypeItem(object[i]._ox, object[i]._oy, TRUE, ITYPE_HARMOR, IMISC_NONE, sendmsg, FALSE);\r\n#endif\r\n\t\t\t}\r\n\t\t\tif (pnum == myplr)\r\n\t\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nint FindValidShrine(int i)\r\n{\r\n\tint rv;\r\n\tDIABOOL done;\r\n\r\n\tdone = FALSE;\r\n\tdo {\r\n\t\trv = random_(0, NUM_SHRINETYPE);\r\n\t\tif (currlevel >= shrinemin[rv] && currlevel <= shrinemax[rv] && rv != SHRINE_THAUMATURGIC) {\r\n\t\t\tdone = TRUE;\r\n\t\t}\r\n\t\tif (done) {\r\n\t\t\tif (gbMaxPlayers != 1) {\r\n\t\t\t\tif (shrineavail[rv] == 1) {\r\n\t\t\t\t\tdone = FALSE;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (gbMaxPlayers == 1) {\r\n\t\t\t\tif (shrineavail[rv] == 2) {\r\n\t\t\t\t\tdone = FALSE;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdone = TRUE;\r\n\t\t}\r\n\t} while (!done);\r\n\treturn rv;\r\n}\r\n\r\nvoid OperateGoatShrine(int pnum, int i, int sType)\r\n{\r\n\tSetRndSeed(object[i]._oRndSeed);\r\n\tobject[i]._oVar1 = FindValidShrine(i);\r\n\tOperateShrine(pnum, i, sType);\r\n\tobject[i]._oAnimDelay = 2;\r\n\tforce_redraw = 255;\r\n}\r\n\r\nvoid OperateCauldron(int pnum, int i, int sType)\r\n{\r\n\tSetRndSeed(object[i]._oRndSeed);\r\n\tobject[i]._oVar1 = FindValidShrine(i);\r\n\tOperateShrine(pnum, i, sType);\r\n\tobject[i]._oAnimFrame = 3;\r\n\tobject[i]._oAnimFlag = 0;\r\n\tforce_redraw = 255;\r\n}\r\n\r\nDIABOOL OperateFountains(int pnum, int i)\r\n{\r\n\tint prev, add, rnd, cnt;\r\n\tDIABOOL applied;\r\n\tBOOL done;\r\n\r\n\tapplied = FALSE;\r\n\tSetRndSeed(object[i]._oRndSeed);\r\n\tswitch (object[i]._otype) {\r\n\tcase OBJ_BLOODFTN:\r\n\t\tif (deltaload)\r\n\t\t\treturn FALSE;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn FALSE;\r\n\r\n\t\tif (plr[pnum]._pHitPoints < plr[pnum]._pMaxHP) {\r\n\t\t\tPlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);\r\n\t\t\tplr[pnum]._pHitPoints += 64;\r\n\t\t\tplr[pnum]._pHPBase += 64;\r\n\t\t\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\t\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\t\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\t\t}\r\n\t\t\tapplied = TRUE;\r\n\t\t} else\r\n\t\t\tPlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);\r\n\t\tbreak;\r\n\tcase OBJ_PURIFYINGFTN:\r\n\t\tif (deltaload)\r\n\t\t\treturn FALSE;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn FALSE;\r\n\r\n\t\tif (plr[pnum]._pMana < plr[pnum]._pMaxMana) {\r\n\t\t\tPlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);\r\n\r\n\t\t\tplr[pnum]._pMana += 64;\r\n\t\t\tplr[pnum]._pManaBase += 64;\r\n\t\t\tif (plr[pnum]._pMana > plr[pnum]._pMaxMana) {\r\n\t\t\t\tplr[pnum]._pMana = plr[pnum]._pMaxMana;\r\n\t\t\t\tplr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;\r\n\t\t\t}\r\n\r\n\t\t\tapplied = TRUE;\r\n\t\t} else\r\n\t\t\tPlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);\r\n\t\tbreak;\r\n\tcase OBJ_MURKYFTN:\r\n\t\tif (object[i]._oSelFlag == 0)\r\n\t\t\tbreak;\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tif (deltaload)\r\n\t\t\treturn FALSE;\r\n\t\tAddMissile(\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._pdir,\r\n\t\t    MIS_INFRA,\r\n\t\t    -1,\r\n\t\t    pnum,\r\n\t\t    0,\r\n\t\t    2 * leveltype);\r\n\t\tapplied = TRUE;\r\n\t\tif (pnum == myplr)\r\n\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\tbreak;\r\n\tcase OBJ_TEARFTN:\r\n\t\tif (object[i]._oSelFlag == 0)\r\n\t\t\tbreak;\r\n\t\tprev = -1;\r\n\t\tadd = -1;\r\n\t\tdone = FALSE;\r\n\t\tcnt = 0;\r\n\t\tif (!deltaload)\r\n\t\t\tPlaySfxLoc(LS_FOUNTAIN, object[i]._ox, object[i]._oy);\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tif (deltaload)\r\n\t\t\treturn FALSE;\r\n\t\tif (pnum != myplr)\r\n\t\t\treturn FALSE;\r\n\t\twhile (!done) {\r\n\t\t\trnd = random_(0, 4);\r\n\t\t\tif (rnd != prev) {\r\n\t\t\t\tswitch (rnd) {\r\n\t\t\t\tcase 0:\r\n\t\t\t\t\tModifyPlrStr(pnum, add);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 1:\r\n\t\t\t\t\tModifyPlrMag(pnum, add);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 2:\r\n\t\t\t\t\tModifyPlrDex(pnum, add);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 3:\r\n\t\t\t\t\tModifyPlrVit(pnum, add);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tprev = rnd;\r\n\t\t\t\tadd = 1;\r\n\t\t\t\tcnt++;\r\n\t\t\t}\r\n\t\t\tif (cnt <= 1)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\tdone = TRUE;\r\n\t\t}\r\n\t\tCheckStats(pnum);\r\n\t\tapplied = TRUE;\r\n\t\tif (pnum == myplr)\r\n\t\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t\tbreak;\r\n\t}\r\n\tforce_redraw = 255;\r\n\treturn applied;\r\n}\r\n\r\nvoid OperateWeaponRack(int pnum, int i, DIABOOL sendmsg)\r\n{\r\n\tint weaponType;\r\n\r\n\tif (object[i]._oSelFlag == 0)\r\n\t\treturn;\r\n\tSetRndSeed(object[i]._oRndSeed);\r\n\r\n\tswitch (random_(0, 4) + ITYPE_SWORD) {\r\n\tcase ITYPE_SWORD:\r\n\t\tweaponType = ITYPE_SWORD;\r\n\t\tbreak;\r\n\tcase ITYPE_AXE:\r\n\t\tweaponType = ITYPE_AXE;\r\n\t\tbreak;\r\n\tcase ITYPE_BOW:\r\n\t\tweaponType = ITYPE_BOW;\r\n\t\tbreak;\r\n\tcase ITYPE_MACE:\r\n\t\tweaponType = ITYPE_MACE;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tobject[i]._oSelFlag = 0;\r\n\tobject[i]._oAnimFrame++;\r\n\tif (deltaload)\r\n\t\treturn;\r\n\r\n\tif (leveltype > 1)\r\n\t\tCreateTypeItem(object[i]._ox, object[i]._oy, TRUE, weaponType, IMISC_NONE, sendmsg, FALSE);\r\n\telse\r\n\t\tCreateTypeItem(object[i]._ox, object[i]._oy, FALSE, weaponType, IMISC_NONE, sendmsg, FALSE);\r\n\tif (pnum == myplr)\r\n\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n}\r\n\r\nvoid OperateStoryBook(int pnum, int i)\r\n{\r\n\tif (object[i]._oSelFlag != 0 && !deltaload && !qtextflag && pnum == myplr) {\r\n\t\tobject[i]._oAnimFrame = object[i]._oVar4;\r\n\t\tPlaySfxLoc(IS_ISCROL, object[i]._ox, object[i]._oy);\r\n#ifdef HELLFIRE\r\n\t\tif (object[i]._oVar8 != 0 && currlevel == 24) {\r\n\t\t\tif (IsUberLeverActivated != 1 && quests[Q_NAKRUL]._qactive != QUEST_DONE && OperateNakrulBook(object[i]._oVar8)) {\r\n\t\t\t\tNetSendCmd(FALSE, CMD_NAKRUL);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t} else if (currlevel >= 21) {\r\n\t\t\tquests[Q_NAKRUL]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_NAKRUL]._qlog = TRUE;\r\n\t\t\tquests[Q_NAKRUL]._qmsg = object[i]._oVar2;\r\n\t\t}\r\n#endif\r\n\t\tInitQTextMsg(object[i]._oVar2);\r\n\t\tNetSendCmdParam1(FALSE, CMD_OPERATEOBJ, i);\r\n\t}\r\n}\r\n\r\nvoid OperateLazStand(int pnum, int i)\r\n{\r\n\tint xx, yy;\r\n\r\n\tif (object[i]._oSelFlag != 0 && !deltaload && !qtextflag && pnum == myplr) {\r\n\t\tobject[i]._oAnimFrame++;\r\n\t\tobject[i]._oSelFlag = 0;\r\n\t\tGetSuperItemLoc(object[i]._ox, object[i]._oy, xx, yy);\r\n\t\tSpawnQuestItem(IDI_LAZSTAFF, xx, yy, 0, 0);\r\n\t}\r\n}\r\n\r\nvoid OperateObject(int pnum, int i, BOOL TeleFlag)\r\n{\r\n\tBOOL sendmsg;\r\n\r\n\tsendmsg = (pnum == myplr);\r\n\tswitch (object[i]._otype) {\r\n\tcase OBJ_L1LDOOR:\r\n\tcase OBJ_L1RDOOR:\r\n\t\tif (TeleFlag) {\r\n\t\t\tif (object[i]._otype == OBJ_L1LDOOR)\r\n\t\t\t\tOperateL1LDoor(pnum, i, TRUE);\r\n\t\t\tif (object[i]._otype == OBJ_L1RDOOR)\r\n\t\t\t\tOperateL1RDoor(pnum, i, TRUE);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (pnum == myplr)\r\n\t\t\tOperateL1Door(pnum, i, TRUE);\r\n\t\tbreak;\r\n\tcase OBJ_L2LDOOR:\r\n\tcase OBJ_L2RDOOR:\r\n\t\tif (TeleFlag) {\r\n\t\t\tif (object[i]._otype == OBJ_L2LDOOR)\r\n\t\t\t\tOperateL2LDoor(pnum, i, TRUE);\r\n\t\t\tif (object[i]._otype == OBJ_L2RDOOR)\r\n\t\t\t\tOperateL2RDoor(pnum, i, TRUE);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (pnum == myplr)\r\n\t\t\tOperateL2Door(pnum, i, TRUE);\r\n\t\tbreak;\r\n\tcase OBJ_L3LDOOR:\r\n\tcase OBJ_L3RDOOR:\r\n\t\tif (TeleFlag) {\r\n\t\t\tif (object[i]._otype == OBJ_L3LDOOR)\r\n\t\t\t\tOperateL3LDoor(pnum, i, TRUE);\r\n\t\t\tif (object[i]._otype == OBJ_L3RDOOR)\r\n\t\t\t\tOperateL3RDoor(pnum, i, TRUE);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (pnum == myplr)\r\n\t\t\tOperateL3Door(pnum, i, TRUE);\r\n\t\tbreak;\r\n\tcase OBJ_LEVER:\r\n\tcase OBJ_SWITCHSKL:\r\n\t\tOperateLever(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_BOOK2L:\r\n\t\tOperateBook(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_BOOK2R:\r\n\t\tOperateSChambBk(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_CHEST1:\r\n\tcase OBJ_CHEST2:\r\n\tcase OBJ_CHEST3:\r\n\tcase OBJ_TCHEST1:\r\n\tcase OBJ_TCHEST2:\r\n\tcase OBJ_TCHEST3:\r\n\t\tOperateChest(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_SARC:\r\n\t\tOperateSarc(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_FLAMELVR:\r\n\t\tOperateTrapLvr(i);\r\n\t\tbreak;\r\n\tcase OBJ_BLINDBOOK:\r\n\tcase OBJ_BLOODBOOK:\r\n\tcase OBJ_STEELTOME:\r\n\t\tOperateBookLever(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_SHRINEL:\r\n\tcase OBJ_SHRINER:\r\n\t\tOperateShrine(pnum, i, IS_MAGIC);\r\n\t\tbreak;\r\n\tcase OBJ_SKELBOOK:\r\n\tcase OBJ_BOOKSTAND:\r\n\t\tOperateSkelBook(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_BOOKCASEL:\r\n\tcase OBJ_BOOKCASER:\r\n\t\tOperateBookCase(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_DECAP:\r\n\t\tOperateDecap(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_ARMORSTAND:\r\n\tcase OBJ_WARARMOR:\r\n\t\tOperateArmorStand(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_GOATSHRINE:\r\n\t\tOperateGoatShrine(pnum, i, LS_GSHRINE);\r\n\t\tbreak;\r\n\tcase OBJ_CAULDRON:\r\n\t\tOperateCauldron(pnum, i, LS_CALDRON);\r\n\t\tbreak;\r\n\tcase OBJ_BLOODFTN:\r\n\tcase OBJ_PURIFYINGFTN:\r\n\tcase OBJ_MURKYFTN:\r\n\tcase OBJ_TEARFTN:\r\n\t\tOperateFountains(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_STORYBOOK:\r\n\t\tOperateStoryBook(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_PEDISTAL:\r\n\t\tOperatePedistal(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_WARWEAP:\r\n\tcase OBJ_WEAPONRACK:\r\n\t\tOperateWeaponRack(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_MUSHPATCH:\r\n\t\tOperateMushPatch(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_LAZSTAND:\r\n\t\tOperateLazStand(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_SLAINHERO:\r\n\t\tOperateSlainHero(pnum, i, sendmsg);\r\n\t\tbreak;\r\n\tcase OBJ_SIGNCHEST:\r\n\t\tOperateInnSignChest(pnum, i);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid SyncOpL1Door(int pnum, int cmd, int i)\r\n{\r\n\tDIABOOL do_sync;\r\n\r\n\tif (pnum == myplr)\r\n\t\treturn;\r\n\r\n\tdo_sync = FALSE;\r\n\tif (cmd == CMD_OPENDOOR && object[i]._oVar4 == 0) {\r\n\t\tdo_sync = TRUE;\r\n\t}\r\n\tif (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)\r\n\t\tdo_sync = TRUE;\r\n\tif (do_sync) {\r\n\t\tif (object[i]._otype == OBJ_L1LDOOR)\r\n\t\t\tOperateL1LDoor(-1, i, FALSE);\r\n\t\tif (object[i]._otype == OBJ_L1RDOOR)\r\n\t\t\tOperateL1RDoor(-1, i, FALSE);\r\n\t}\r\n}\r\n\r\nvoid SyncOpL2Door(int pnum, int cmd, int i)\r\n{\r\n\tDIABOOL do_sync;\r\n\r\n\tif (pnum == myplr)\r\n\t\treturn;\r\n\r\n\tdo_sync = FALSE;\r\n\tif (cmd == CMD_OPENDOOR && object[i]._oVar4 == 0) {\r\n\t\tdo_sync = TRUE;\r\n\t}\r\n\tif (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)\r\n\t\tdo_sync = TRUE;\r\n\tif (do_sync) {\r\n\t\tif (object[i]._otype == OBJ_L2LDOOR)\r\n\t\t\tOperateL2LDoor(-1, i, FALSE);\r\n\t\tif (object[i]._otype == OBJ_L2RDOOR)\r\n\t\t\tOperateL2RDoor(-1, i, FALSE);\r\n\t}\r\n}\r\n\r\nvoid SyncOpL3Door(int pnum, int cmd, int i)\r\n{\r\n\tDIABOOL do_sync;\r\n\r\n\tif (pnum == myplr)\r\n\t\treturn;\r\n\r\n\tdo_sync = FALSE;\r\n\tif (cmd == CMD_OPENDOOR && object[i]._oVar4 == 0) {\r\n\t\tdo_sync = TRUE;\r\n\t}\r\n\tif (cmd == CMD_CLOSEDOOR && object[i]._oVar4 == 1)\r\n\t\tdo_sync = TRUE;\r\n\tif (do_sync) {\r\n\t\tif (object[i]._otype == OBJ_L3LDOOR)\r\n\t\t\tOperateL3LDoor(-1, i, FALSE);\r\n\t\tif (object[i]._otype == OBJ_L3RDOOR)\r\n\t\t\tOperateL3RDoor(-1, i, FALSE);\r\n\t}\r\n}\r\n\r\nvoid SyncOpObject(int pnum, int cmd, int i)\r\n{\r\n\tswitch (object[i]._otype) {\r\n\tcase OBJ_L1LDOOR:\r\n\tcase OBJ_L1RDOOR:\r\n\t\tSyncOpL1Door(pnum, cmd, i);\r\n\t\tbreak;\r\n\tcase OBJ_L2LDOOR:\r\n\tcase OBJ_L2RDOOR:\r\n\t\tSyncOpL2Door(pnum, cmd, i);\r\n\t\tbreak;\r\n\tcase OBJ_L3LDOOR:\r\n\tcase OBJ_L3RDOOR:\r\n\t\tSyncOpL3Door(pnum, cmd, i);\r\n\t\tbreak;\r\n\tcase OBJ_LEVER:\r\n\tcase OBJ_SWITCHSKL:\r\n\t\tOperateLever(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_CHEST1:\r\n\tcase OBJ_CHEST2:\r\n\tcase OBJ_CHEST3:\r\n\tcase OBJ_TCHEST1:\r\n\tcase OBJ_TCHEST2:\r\n\tcase OBJ_TCHEST3:\r\n\t\tOperateChest(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_SARC:\r\n\t\tOperateSarc(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_BLINDBOOK:\r\n\tcase OBJ_BLOODBOOK:\r\n\tcase OBJ_STEELTOME:\r\n\t\tOperateBookLever(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_SHRINEL:\r\n\tcase OBJ_SHRINER:\r\n\t\tOperateShrine(pnum, i, IS_MAGIC);\r\n\t\tbreak;\r\n\tcase OBJ_SKELBOOK:\r\n\tcase OBJ_BOOKSTAND:\r\n\t\tOperateSkelBook(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_BOOKCASEL:\r\n\tcase OBJ_BOOKCASER:\r\n\t\tOperateBookCase(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_DECAP:\r\n\t\tOperateDecap(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_ARMORSTAND:\r\n\tcase OBJ_WARARMOR:\r\n\t\tOperateArmorStand(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_GOATSHRINE:\r\n\t\tOperateGoatShrine(pnum, i, LS_GSHRINE);\r\n\t\tbreak;\r\n\tcase OBJ_CAULDRON:\r\n\t\tOperateCauldron(pnum, i, LS_CALDRON);\r\n\t\tbreak;\r\n\tcase OBJ_MURKYFTN:\r\n\tcase OBJ_TEARFTN:\r\n\t\tOperateFountains(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_STORYBOOK:\r\n\t\tOperateStoryBook(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_PEDISTAL:\r\n\t\tOperatePedistal(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_WARWEAP:\r\n\tcase OBJ_WEAPONRACK:\r\n\t\tOperateWeaponRack(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_MUSHPATCH:\r\n\t\tOperateMushPatch(pnum, i);\r\n\t\tbreak;\r\n\tcase OBJ_SLAINHERO:\r\n\t\tOperateSlainHero(pnum, i, FALSE);\r\n\t\tbreak;\r\n\tcase OBJ_SIGNCHEST:\r\n\t\tOperateInnSignChest(pnum, i);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid BreakCrux(int i)\r\n{\r\n\tint j, oi;\r\n\tDIABOOL triggered;\r\n\r\n\tobject[i]._oAnimFlag = 1;\r\n\tobject[i]._oAnimFrame = 1;\r\n\tobject[i]._oAnimDelay = 1;\r\n\tobject[i]._oSolidFlag = TRUE;\r\n\tobject[i]._oMissFlag = TRUE;\r\n\tobject[i]._oBreak = -1;\r\n\tobject[i]._oSelFlag = 0;\r\n\ttriggered = TRUE;\r\n\tfor (j = 0; j < nobjects; j++) {\r\n\t\toi = objectactive[j];\r\n\t\tif (object[oi]._otype != OBJ_CRUX1 && object[oi]._otype != OBJ_CRUX2 && object[oi]._otype != OBJ_CRUX3)\r\n\t\t\tcontinue;\r\n\t\tif (object[i]._oVar8 != object[oi]._oVar8 || object[oi]._oBreak == -1)\r\n\t\t\tcontinue;\r\n\t\ttriggered = FALSE;\r\n\t}\r\n\tif (!triggered)\r\n\t\treturn;\r\n\tif (!deltaload)\r\n\t\tPlaySfxLoc(IS_LEVER, object[i]._ox, object[i]._oy);\r\n\tObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n}\r\n\r\nvoid BreakBarrel(int pnum, int i, int dam, BOOL forcebreak, BOOL sendmsg)\r\n{\r\n\tint oi;\r\n\tint xp, yp;\r\n\r\n\tif (object[i]._oSelFlag == 0)\r\n\t\treturn;\r\n\tif (forcebreak) {\r\n\t\tobject[i]._oVar1 = 0;\r\n\t} else {\r\n\t\tobject[i]._oVar1 -= dam;\r\n\t\tif (pnum != myplr && object[i]._oVar1 <= 0)\r\n\t\t\tobject[i]._oVar1 = 1;\r\n\t}\r\n\tif (object[i]._oVar1 > 0) {\r\n\t\tif (deltaload)\r\n\t\t\treturn;\r\n\r\n\t\tPlaySfxLoc(IS_IBOW, object[i]._ox, object[i]._oy);\r\n\t\treturn;\r\n\t}\r\n\r\n\tobject[i]._oVar1 = 0;\r\n\tobject[i]._oAnimFlag = 1;\r\n\tobject[i]._oAnimFrame = 1;\r\n\tobject[i]._oAnimDelay = 1;\r\n\tobject[i]._oSolidFlag = FALSE;\r\n\tobject[i]._oMissFlag = TRUE;\r\n\tobject[i]._oBreak = -1;\r\n\tobject[i]._oSelFlag = 0;\r\n\tobject[i]._oPreFlag = TRUE;\r\n\tif (deltaload) {\r\n\t\tobject[i]._oAnimFrame = object[i]._oAnimLen;\r\n\t\tobject[i]._oAnimCnt = 0;\r\n\t\tobject[i]._oAnimDelay = 1000;\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (object[i]._otype == OBJ_BARRELEX) {\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel >= 21 && currlevel <= 24)\r\n\t\t\tPlaySfxLoc(IS_POPPOP3, object[i]._ox, object[i]._oy);\r\n\t\telse if (currlevel >= 17 && currlevel <= 20)\r\n\t\t\tPlaySfxLoc(IS_POPPOP8, object[i]._ox, object[i]._oy);\r\n\t\telse\r\n#endif\r\n\t\t\tPlaySfxLoc(IS_BARLFIRE, object[i]._ox, object[i]._oy);\r\n\t\tfor (yp = object[i]._oy - 1; yp <= object[i]._oy + 1; yp++) {\r\n\t\t\tfor (xp = object[i]._ox - 1; xp <= object[i]._ox + 1; xp++) {\r\n\t\t\t\tif (dMonster[xp][yp] > 0)\r\n\t\t\t\t\tMonsterTrapHit(dMonster[xp][yp] - 1, 1, 4, 0, MIS_FIREBOLT, FALSE);\r\n#ifdef HELLFIRE\r\n\t\t\t\tBOOLEAN unused;\r\n\t\t\t\tif (dPlayer[xp][yp] > 0)\r\n\t\t\t\t\tPlayerMHit(dPlayer[xp][yp] - 1, -1, 0, 8, 16, MIS_FIREBOLT, FALSE, 0, &unused);\r\n#else\r\n\t\t\t\tif (dPlayer[xp][yp] > 0)\r\n\t\t\t\t\tPlayerMHit(dPlayer[xp][yp] - 1, -1, 0, 8, 16, MIS_FIREBOLT, FALSE, 0);\r\n#endif\r\n\t\t\t\tif (dObject[xp][yp] > 0) {\r\n\t\t\t\t\toi = dObject[xp][yp] - 1;\r\n\t\t\t\t\tif (object[oi]._otype == OBJ_BARRELEX && object[oi]._oBreak != -1)\r\n\t\t\t\t\t\tBreakBarrel(pnum, oi, dam, TRUE, sendmsg);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel >= 21 && currlevel <= 24)\r\n\t\t\tPlaySfxLoc(IS_POPPOP2, object[i]._ox, object[i]._oy);\r\n\t\telse if (currlevel >= 17 && currlevel <= 20)\r\n\t\t\tPlaySfxLoc(IS_POPPOP5, object[i]._ox, object[i]._oy);\r\n\t\telse\r\n#endif\r\n\t\t\tPlaySfxLoc(IS_BARREL, object[i]._ox, object[i]._oy);\r\n\t\tSetRndSeed(object[i]._oRndSeed);\r\n\t\tif (object[i]._oVar2 <= 1) {\r\n\t\t\tif (object[i]._oVar3 == 0)\r\n\t\t\t\tCreateRndUseful(pnum, object[i]._ox, object[i]._oy, sendmsg);\r\n\t\t\telse\r\n\t\t\t\tCreateRndItem(object[i]._ox, object[i]._oy, FALSE, sendmsg, FALSE);\r\n\t\t}\r\n\t\tif (object[i]._oVar2 >= 8)\r\n\t\t\tSpawnSkeleton(object[i]._oVar4, object[i]._ox, object[i]._oy);\r\n\t}\r\n\tif (pnum == myplr)\r\n\t\tNetSendCmdParam2(FALSE, CMD_BREAKOBJ, pnum, i);\r\n}\r\n\r\nvoid BreakObject(int pnum, int oi)\r\n{\r\n\tint objdam, mind, maxd;\r\n\r\n\tif (pnum != -1) {\r\n\t\tmind = plr[pnum]._pIMinDam;\r\n\t\tmaxd = plr[pnum]._pIMaxDam;\r\n\t\tobjdam = random_(163, maxd - mind + 1) + mind;\r\n\t\tobjdam += plr[pnum]._pDamageMod + plr[pnum]._pIBonusDamMod + objdam * plr[pnum]._pIBonusDam / 100;\r\n\t} else {\r\n\t\tobjdam = 10;\r\n\t}\r\n\tswitch (object[oi]._otype) {\r\n\tcase OBJ_CRUX1:\r\n\tcase OBJ_CRUX2:\r\n\tcase OBJ_CRUX3:\r\n\t\tBreakCrux(oi);\r\n\t\tbreak;\r\n\tcase OBJ_BARREL:\r\n\tcase OBJ_BARRELEX:\r\n\t\tBreakBarrel(pnum, oi, objdam, FALSE, TRUE);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid SyncBreakObj(int pnum, int oi)\r\n{\r\n\tif (object[oi]._otype >= OBJ_BARREL && object[oi]._otype <= OBJ_BARRELEX)\r\n\t\tBreakBarrel(pnum, oi, 0, TRUE, FALSE);\r\n}\r\n\r\nvoid SyncL1Doors(int i)\r\n{\r\n\tint x, y;\r\n\r\n\tif (object[i]._oVar4 == 0) {\r\n\t\tobject[i]._oMissFlag = FALSE;\r\n\t\treturn;\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse\r\n#endif\r\n\t\tobject[i]._oMissFlag = TRUE;\r\n\r\n\tx = object[i]._ox;\r\n\ty = object[i]._oy;\r\n\tobject[i]._oSelFlag = 2;\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tif (object[i]._otype == OBJ_L1LDOOR) {\r\n\t\t\tif (object[i]._oVar1 == 214)\r\n\t\t\t\tObjSetMicro(x, y, 408);\r\n\t\t\telse\r\n\t\t\t\tObjSetMicro(x, y, 393);\r\n\t\t\tdSpecial[x][y] = 7;\r\n\t\t\tobjects_set_door_piece(x - 1, y);\r\n\t\t\ty--;\r\n\t\t} else {\r\n\t\t\tObjSetMicro(x, y, 395);\r\n#ifdef HELLFIRE\r\n\t\t\tif (currlevel < 17)\r\n#endif\r\n\t\t\t\tdSpecial[x][y] = 8;\r\n\t\t\tobjects_set_door_piece(x, y - 1);\r\n\t\t\tx--;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tif (object[i]._otype == OBJ_L1LDOOR) {\r\n\t\t\tObjSetMicro(x, y, 206);\r\n\t\t\tdSpecial[x][y] = 1;\r\n\t\t\tobjects_set_door_piece(x - 1, y);\r\n\t\t\ty--;\r\n\t\t} else {\r\n\t\t\tObjSetMicro(x, y, 209);\r\n\t\t\tdSpecial[x][y] = 2;\r\n\t\t\tobjects_set_door_piece(x, y - 1);\r\n\t\t\tx--;\r\n\t\t}\r\n\t}\r\n#endif\r\n\tDoorSet(i, x, y);\r\n}\r\n\r\nvoid SyncCrux(int i)\r\n{\r\n\tDIABOOL found;\r\n\tint j, oi, type;\r\n\r\n\tfound = TRUE;\r\n\tfor (j = 0; j < nobjects; j++) {\r\n\t\toi = objectactive[j];\r\n\t\ttype = object[oi]._otype;\r\n\t\tif (type != OBJ_CRUX1 && type != OBJ_CRUX2 && type != OBJ_CRUX3)\r\n\t\t\tcontinue;\r\n\t\tif (object[i]._oVar8 != object[oi]._oVar8 || object[oi]._oBreak == -1)\r\n\t\t\tcontinue;\r\n\t\tfound = FALSE;\r\n\t}\r\n\tif (found)\r\n\t\tObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n}\r\n\r\nvoid SyncLever(int i)\r\n{\r\n\tif (object[i]._oSelFlag == 0)\r\n\t\tObjChangeMap(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n}\r\n\r\nvoid SyncQSTLever(int i)\r\n{\r\n\tint tren;\r\n\r\n\tif (object[i]._oAnimFrame == object[i]._oVar6) {\r\n\t\tObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\tif (object[i]._otype == OBJ_BLINDBOOK) {\r\n\t\t\ttren = TransVal;\r\n\t\t\tTransVal = 9;\r\n\t\t\tDRLG_MRectTrans(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\t\tTransVal = tren;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SyncPedistal(int i)\r\n{\r\n\tBYTE *setp;\r\n\r\n\tif (object[i]._oVar6 == 1)\r\n\t\tObjChangeMapResync(setpc_x, setpc_y + 3, setpc_x + 2, setpc_y + 7);\r\n\tif (object[i]._oVar6 == 2) {\r\n\t\tObjChangeMapResync(setpc_x, setpc_y + 3, setpc_x + 2, setpc_y + 7);\r\n\t\tObjChangeMapResync(setpc_x + 6, setpc_y + 3, setpc_x + setpc_w, setpc_y + 7);\r\n\t}\r\n\tif (object[i]._oVar6 == 3) {\r\n\t\tObjChangeMapResync(object[i]._oVar1, object[i]._oVar2, object[i]._oVar3, object[i]._oVar4);\r\n\t\tsetp = LoadFileInMem(\"Levels\\\\L2Data\\\\Blood2.DUN\", NULL);\r\n\t\tLoadMapObjs(setp, 2 * setpc_x, 2 * setpc_y);\r\n\t\tmem_free_dbg(setp);\r\n\t}\r\n}\r\n\r\nvoid SyncL2Doors(int i)\r\n{\r\n\tint x, y;\r\n\r\n\tif (object[i]._oVar4 == 0)\r\n\t\tobject[i]._oMissFlag = FALSE;\r\n\telse\r\n\t\tobject[i]._oMissFlag = TRUE;\r\n\tx = object[i]._ox;\r\n\ty = object[i]._oy;\r\n\tobject[i]._oSelFlag = 2;\r\n\tif (object[i]._otype == OBJ_L2LDOOR && object[i]._oVar4 == 0) {\r\n\t\tObjSetMicro(x, y, 538);\r\n\t} else if (object[i]._otype == OBJ_L2LDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {\r\n\t\tObjSetMicro(x, y, 13);\r\n\t} else if (object[i]._otype == OBJ_L2RDOOR && object[i]._oVar4 == 0) {\r\n\t\tObjSetMicro(x, y, 540);\r\n\t} else if (object[i]._otype == OBJ_L2RDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {\r\n\t\tObjSetMicro(x, y, 17);\r\n\t}\r\n}\r\n\r\nvoid SyncL3Doors(int i)\r\n{\r\n\tint x, y;\r\n\r\n\tobject[i]._oMissFlag = TRUE;\r\n\tx = object[i]._ox;\r\n\ty = object[i]._oy;\r\n\tobject[i]._oSelFlag = 2;\r\n\tif (object[i]._otype == OBJ_L3LDOOR && object[i]._oVar4 == 0) {\r\n\t\tObjSetMicro(x, y, 531);\r\n\t} else if (object[i]._otype == OBJ_L3LDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {\r\n\t\tObjSetMicro(x, y, 538);\r\n\t} else if (object[i]._otype == OBJ_L3RDOOR && object[i]._oVar4 == 0) {\r\n\t\tObjSetMicro(x, y, 534);\r\n\t} else if (object[i]._otype == OBJ_L3RDOOR && (object[i]._oVar4 == 1 || object[i]._oVar4 == 2)) {\r\n\t\tObjSetMicro(x, y, 541);\r\n\t}\r\n}\r\n\r\nvoid SyncObjectAnim(int o)\r\n{\r\n\tint i, index;\r\n\r\n\tindex = AllObjects[object[o]._otype].ofindex;\r\n\ti = 0;\r\n\twhile (ObjFileList[i] != index) {\r\n\t\ti++;\r\n\t}\r\n\r\n\tobject[o]._oAnimData = pObjCels[i];\r\n\tswitch (object[o]._otype) {\r\n\tcase OBJ_L1LDOOR:\r\n\tcase OBJ_L1RDOOR:\r\n\t\tSyncL1Doors(o);\r\n\t\tbreak;\r\n\tcase OBJ_L2LDOOR:\r\n\tcase OBJ_L2RDOOR:\r\n\t\tSyncL2Doors(o);\r\n\t\tbreak;\r\n\tcase OBJ_L3LDOOR:\r\n\tcase OBJ_L3RDOOR:\r\n\t\tSyncL3Doors(o);\r\n\t\tbreak;\r\n\tcase OBJ_CRUX1:\r\n\tcase OBJ_CRUX2:\r\n\tcase OBJ_CRUX3:\r\n\t\tSyncCrux(o);\r\n\t\tbreak;\r\n\tcase OBJ_LEVER:\r\n\tcase OBJ_BOOK2L:\r\n\tcase OBJ_SWITCHSKL:\r\n\t\tSyncLever(o);\r\n\t\tbreak;\r\n\tcase OBJ_BOOK2R:\r\n\tcase OBJ_BLINDBOOK:\r\n\tcase OBJ_STEELTOME:\r\n\t\tSyncQSTLever(o);\r\n\t\tbreak;\r\n\tcase OBJ_PEDISTAL:\r\n\t\tSyncPedistal(o);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid GetObjectStr(int i)\r\n{\r\n\tswitch (object[i]._otype) {\r\n\tcase OBJ_CRUX1:\r\n\tcase OBJ_CRUX2:\r\n\tcase OBJ_CRUX3:\r\n\t\tstrcpy(infostr, \"Crucified Skeleton\");\r\n\t\tbreak;\r\n\tcase OBJ_LEVER:\r\n\tcase OBJ_FLAMELVR:\r\n\t\tstrcpy(infostr, \"Lever\");\r\n\t\tbreak;\r\n\tcase OBJ_L1LDOOR:\r\n\tcase OBJ_L1RDOOR:\r\n\tcase OBJ_L2LDOOR:\r\n\tcase OBJ_L2RDOOR:\r\n\tcase OBJ_L3LDOOR:\r\n\tcase OBJ_L3RDOOR:\r\n\t\tif (object[i]._oVar4 == 1)\r\n\t\t\tstrcpy(infostr, \"Open Door\");\r\n\t\tif (object[i]._oVar4 == 0)\r\n\t\t\tstrcpy(infostr, \"Closed Door\");\r\n\t\tif (object[i]._oVar4 == 2)\r\n\t\t\tstrcpy(infostr, \"Blocked Door\");\r\n\t\tbreak;\r\n\tcase OBJ_BOOK2L:\r\n\t\tif (setlevel) {\r\n\t\t\tif (setlvlnum == SL_BONECHAMB) {\r\n\t\t\t\tstrcpy(infostr, \"Ancient Tome\");\r\n\t\t\t} else if (setlvlnum == SL_VILEBETRAYER) {\r\n\t\t\t\tstrcpy(infostr, \"Book of Vileness\");\r\n\t\t\t}\r\n\t\t}\r\n\t\tbreak;\r\n\tcase OBJ_SWITCHSKL:\r\n\t\tstrcpy(infostr, \"Skull Lever\");\r\n\t\tbreak;\r\n\tcase OBJ_BOOK2R:\r\n\t\tstrcpy(infostr, \"Mythical Book\");\r\n\t\tbreak;\r\n\tcase OBJ_CHEST1:\r\n\tcase OBJ_TCHEST1:\r\n\t\tstrcpy(infostr, \"Small Chest\");\r\n\t\tbreak;\r\n\tcase OBJ_CHEST2:\r\n\tcase OBJ_TCHEST2:\r\n\t\tstrcpy(infostr, \"Chest\");\r\n\t\tbreak;\r\n\tcase OBJ_CHEST3:\r\n\tcase OBJ_TCHEST3:\r\n\tcase OBJ_SIGNCHEST:\r\n\t\tstrcpy(infostr, \"Large Chest\");\r\n\t\tbreak;\r\n\tcase OBJ_SARC:\r\n\t\tstrcpy(infostr, \"Sarcophagus\");\r\n\t\tbreak;\r\n\tcase OBJ_BOOKSHELF:\r\n\t\tstrcpy(infostr, \"Bookshelf\");\r\n\t\tbreak;\r\n\tcase OBJ_BOOKCASEL:\r\n\tcase OBJ_BOOKCASER:\r\n\t\tstrcpy(infostr, \"Bookcase\");\r\n\t\tbreak;\r\n\tcase OBJ_BARREL:\r\n\tcase OBJ_BARRELEX:\r\n#ifdef HELLFIRE\r\n\t\tif (currlevel >= 17 && currlevel <= 20)      // for hive levels\r\n\t\t\tstrcpy(infostr, \"Pod\");                  //Then a barrel is called a pod\r\n\t\telse if (currlevel >= 21 && currlevel <= 24) // for crypt levels\r\n\t\t\tstrcpy(infostr, \"Urn\");                  //Then a barrel is called an urn\r\n\t\telse\r\n#endif\r\n\t\t\tstrcpy(infostr, \"Barrel\");\r\n\t\tbreak;\r\n\tcase OBJ_SHRINEL:\r\n\tcase OBJ_SHRINER:\r\n\t\tsprintf(tempstr, \"%s Shrine\", shrinestrs[object[i]._oVar1]);\r\n\t\tstrcpy(infostr, tempstr);\r\n\t\tbreak;\r\n\tcase OBJ_SKELBOOK:\r\n\t\tstrcpy(infostr, \"Skeleton Tome\");\r\n\t\tbreak;\r\n\tcase OBJ_BOOKSTAND:\r\n\t\tstrcpy(infostr, \"Library Book\");\r\n\t\tbreak;\r\n\tcase OBJ_BLOODFTN:\r\n\t\tstrcpy(infostr, \"Blood Fountain\");\r\n\t\tbreak;\r\n\tcase OBJ_DECAP:\r\n\t\tstrcpy(infostr, \"Decapitated Body\");\r\n\t\tbreak;\r\n\tcase OBJ_BLINDBOOK:\r\n\t\tstrcpy(infostr, \"Book of the Blind\");\r\n\t\tbreak;\r\n\tcase OBJ_BLOODBOOK:\r\n\t\tstrcpy(infostr, \"Book of Blood\");\r\n\t\tbreak;\r\n\tcase OBJ_PURIFYINGFTN:\r\n\t\tstrcpy(infostr, \"Purifying Spring\");\r\n\t\tbreak;\r\n\tcase OBJ_ARMORSTAND:\r\n\tcase OBJ_WARARMOR:\r\n\t\tstrcpy(infostr, \"Armor\");\r\n\t\tbreak;\r\n\tcase OBJ_WARWEAP:\r\n\t\tstrcpy(infostr, \"Weapon Rack\");\r\n\t\tbreak;\r\n\tcase OBJ_GOATSHRINE:\r\n\t\tstrcpy(infostr, \"Goat Shrine\");\r\n\t\tbreak;\r\n\tcase OBJ_CAULDRON:\r\n\t\tstrcpy(infostr, \"Cauldron\");\r\n\t\tbreak;\r\n\tcase OBJ_MURKYFTN:\r\n\t\tstrcpy(infostr, \"Murky Pool\");\r\n\t\tbreak;\r\n\tcase OBJ_TEARFTN:\r\n\t\tstrcpy(infostr, \"Fountain of Tears\");\r\n\t\tbreak;\r\n\tcase OBJ_STEELTOME:\r\n\t\tstrcpy(infostr, \"Steel Tome\");\r\n\t\tbreak;\r\n\tcase OBJ_PEDISTAL:\r\n\t\tstrcpy(infostr, \"Pedestal of Blood\");\r\n\t\tbreak;\r\n\tcase OBJ_STORYBOOK:\r\n\t\tstrcpy(infostr, StoryBookName[object[i]._oVar3]);\r\n\t\tbreak;\r\n\tcase OBJ_WEAPONRACK:\r\n\t\tstrcpy(infostr, \"Weapon Rack\");\r\n\t\tbreak;\r\n\tcase OBJ_MUSHPATCH:\r\n\t\tstrcpy(infostr, \"Mushroom Patch\");\r\n\t\tbreak;\r\n\tcase OBJ_LAZSTAND:\r\n\t\tstrcpy(infostr, \"Vile Stand\");\r\n\t\tbreak;\r\n\tcase OBJ_SLAINHERO:\r\n\t\tstrcpy(infostr, \"Slain Hero\");\r\n\t\tbreak;\r\n\t}\r\n\tif (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\tif (object[i]._oTrapFlag) {\r\n\t\t\tsprintf(tempstr, \"Trapped %s\", infostr);\r\n\t\t\tstrcpy(infostr, tempstr);\r\n\t\t\tinfoclr = COL_RED;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid OperateNakrulLever()\r\n{\r\n\tif (currlevel == 24) {\r\n\t\tPlaySfxLoc(IS_CROPEN, UberRow, UberCol);\r\n\t\t//the part below is the same as SyncNakrulRoom\r\n\t\tdPiece[UberRow][UberCol] = 298;\r\n\t\tdPiece[UberRow][UberCol - 1] = 301;\r\n\t\tdPiece[UberRow][UberCol - 2] = 300;\r\n\t\tdPiece[UberRow][UberCol + 1] = 299;\r\n\t\tSetDungeonMicros();\r\n\t}\r\n}\r\n\r\nvoid SyncNakrulRoom()\r\n{\r\n\tdPiece[UberRow][UberCol] = 298;\r\n\tdPiece[UberRow][UberCol - 1] = 301;\r\n\tdPiece[UberRow][UberCol - 2] = 300;\r\n\tdPiece[UberRow][UberCol + 1] = 299;\r\n\r\n\tSetDungeonMicros();\r\n}\r\n\r\nvoid AddNakrulLeaver()\r\n{\r\n\tint xp, yp;\r\n\r\n\twhile (1) {\r\n\t\txp = random_(141, 80) + 16;\r\n\t\typ = random_(141, 80) + 16;\r\n\t\tif (RndLocOk(xp - 1, yp - 1)\r\n\t\t    && RndLocOk(xp, yp - 1)\r\n\t\t    && RndLocOk(xp + 1, yp - 1)\r\n\t\t    && RndLocOk(xp - 1, yp)\r\n\t\t    && RndLocOk(xp, yp)\r\n\t\t    && RndLocOk(xp + 1, yp)\r\n\t\t    && RndLocOk(xp - 1, yp + 1)\r\n\t\t    && RndLocOk(xp, yp + 1)\r\n\t\t    && RndLocOk(xp + 1, yp + 1)) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tUberLeverRow = UberRow + 3;\r\n\tUberLeverCol = UberCol - 1;\r\n\tAddObject(OBJ_LEVER, UberRow + 3, UberCol - 1);\r\n}\r\n\r\nDIABOOL OperateNakrulBook(int s)\r\n{\r\n\tswitch (s) {\r\n\tcase 6:\r\n\t\tdword_6DE0E0 = 1;\r\n\t\tbreak;\r\n\tcase 7:\r\n\t\tif (dword_6DE0E0 == 1) {\r\n\t\t\tdword_6DE0E0 = 2;\r\n\t\t} else {\r\n\t\t\tdword_6DE0E0 = 0;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 8:\r\n\t\tif (dword_6DE0E0 == 2)\r\n\t\t\treturn TRUE;\r\n\t\tdword_6DE0E0 = 0;\r\n\t\tbreak;\r\n\t}\r\n\treturn FALSE;\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/objects.h",
    "content": "/**\r\n * @file objects.h\r\n *\r\n * Interface of object functionality, interaction, spawning, loading, etc.\r\n */\r\n#ifndef __OBJECTS_H__\r\n#define __OBJECTS_H__\r\n\r\nextern int objectactive[MAXOBJECTS];\r\nextern int nobjects;\r\nextern int objectavail[MAXOBJECTS];\r\nextern ObjectStruct object[MAXOBJECTS];\r\nextern BOOL InitObjFlag;\r\n\r\nvoid InitObjectGFX();\r\nvoid FreeObjectGFX();\r\nvoid AddL1Objs(int x1, int y1, int x2, int y2);\r\nvoid AddL2Objs(int x1, int y1, int x2, int y2);\r\nvoid InitObjects();\r\nvoid SetMapObjects(BYTE *pMap, int startx, int starty);\r\nvoid SetObjMapRange(int i, int x1, int y1, int x2, int y2, int v);\r\nvoid SetBookMsg(int i, int msg);\r\nvoid GetRndObjLoc(int randarea, int &xx, int &yy);\r\nvoid AddMushPatch();\r\nvoid AddSlainHero();\r\n#ifdef HELLFIRE\r\nvoid AddCryptBook(int ot, int v2, int ox, int oy);\r\nvoid AddCryptObject(int a1, int a2);\r\nvoid AddNakrulBook(int a1, int a2, int a3);\r\n#endif\r\nvoid AddObject(int ot, int ox, int oy);\r\nvoid Obj_Trap(int i);\r\nvoid ProcessObjects();\r\nvoid ObjSetMicro(int dx, int dy, int pn);\r\nvoid RedoPlayerVision();\r\nvoid MonstCheckDoors(int m);\r\nvoid ObjChangeMap(int x1, int y1, int x2, int y2);\r\nvoid ObjChangeMapResync(int x1, int y1, int x2, int y2);\r\nvoid TryDisarm(int pnum, int i);\r\nint ItemMiscIdIdx(int imiscid);\r\nvoid OperateObject(int pnum, int i, BOOL TeleFlag);\r\nvoid SyncOpObject(int pnum, int cmd, int i);\r\nvoid BreakObject(int pnum, int oi);\r\nvoid SyncBreakObj(int pnum, int oi);\r\nvoid SyncObjectAnim(int o);\r\nvoid GetObjectStr(int i);\r\n#ifdef HELLFIRE\r\nvoid OperateNakrulLever();\r\nvoid SyncNakrulRoom();\r\nvoid AddNakrulLeaver();\r\nDIABOOL OperateNakrulBook(int s);\r\n#endif\r\n\r\n#endif /* __OBJECTS_H__ */\r\n"
  },
  {
    "path": "Source/pack.cpp",
    "content": "/**\r\n * @file pack.cpp\r\n *\r\n * Implementation of functions for minifying player data structure.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n#ifndef HELLFIRE\r\nstatic\r\n#endif\r\n    void\r\n    PackItem(PkItemStruct *id, ItemStruct *is)\r\n{\r\n\tif (is->_itype == ITYPE_NONE) {\r\n\t\tid->idx = 0xFFFF;\r\n\t} else {\r\n\t\tid->idx = is->IDidx;\r\n\t\tif (is->IDidx == IDI_EAR) {\r\n\t\t\tid->iCreateInfo = is->_iName[8] | (is->_iName[7] << 8);\r\n\t\t\tid->iSeed = is->_iName[12] | ((is->_iName[11] | ((is->_iName[10] | (is->_iName[9] << 8)) << 8)) << 8);\r\n\t\t\tid->bId = is->_iName[13];\r\n\t\t\tid->bDur = is->_iName[14];\r\n\t\t\tid->bMDur = is->_iName[15];\r\n\t\t\tid->bCh = is->_iName[16];\r\n\t\t\tid->bMCh = is->_iName[17];\r\n\t\t\tid->wValue = is->_ivalue | (is->_iName[18] << 8) | ((is->_iCurs - ICURS_EAR_SORCEROR) << 6);\r\n\t\t\tid->dwBuff = is->_iName[22] | ((is->_iName[21] | ((is->_iName[20] | (is->_iName[19] << 8)) << 8)) << 8);\r\n\t\t} else {\r\n\t\t\tid->iSeed = is->_iSeed;\r\n\t\t\tid->iCreateInfo = is->_iCreateInfo;\r\n\t\t\tid->bId = is->_iIdentified + 2 * is->_iMagical;\r\n\t\t\tid->bDur = is->_iDurability;\r\n\t\t\tid->bMDur = is->_iMaxDur;\r\n\t\t\tid->bCh = is->_iCharges;\r\n\t\t\tid->bMCh = is->_iMaxCharges;\r\n\t\t\tif (is->IDidx == IDI_GOLD)\r\n\t\t\t\tid->wValue = is->_ivalue;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid PackPlayer(PkPlayerStruct *pPack, int pnum)\r\n#else\r\nvoid PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield)\r\n#endif\r\n{\r\n\tPlayerStruct *pPlayer;\r\n\tint i;\r\n\tItemStruct *pi;\r\n\tPkItemStruct *pki;\r\n\r\n\tmemset(pPack, 0, sizeof(*pPack));\r\n\tpPlayer = &plr[pnum];\r\n\tpPack->destAction = pPlayer->destAction;\r\n\tpPack->destParam1 = pPlayer->destParam1;\r\n\tpPack->destParam2 = pPlayer->destParam2;\r\n\tpPack->plrlevel = pPlayer->plrlevel;\r\n\tpPack->px = pPlayer->_px;\r\n\tpPack->py = pPlayer->_py;\r\n\tpPack->targx = pPlayer->_ptargx;\r\n\tpPack->targy = pPlayer->_ptargy;\r\n\tstrcpy(pPack->pName, pPlayer->_pName);\r\n\tpPack->pClass = pPlayer->_pClass;\r\n\tpPack->pBaseStr = pPlayer->_pBaseStr;\r\n\tpPack->pBaseMag = pPlayer->_pBaseMag;\r\n\tpPack->pBaseDex = pPlayer->_pBaseDex;\r\n\tpPack->pBaseVit = pPlayer->_pBaseVit;\r\n\tpPack->pLevel = pPlayer->_pLevel;\r\n\tpPack->pStatPts = pPlayer->_pStatPts;\r\n\tpPack->pExperience = pPlayer->_pExperience;\r\n\tpPack->pGold = pPlayer->_pGold;\r\n\tpPack->pHPBase = pPlayer->_pHPBase;\r\n\tpPack->pMaxHPBase = pPlayer->_pMaxHPBase;\r\n\tpPack->pManaBase = pPlayer->_pManaBase;\r\n\tpPack->pMaxManaBase = pPlayer->_pMaxManaBase;\r\n\tpPack->pMemSpells = pPlayer->_pMemSpells;\r\n\r\n#ifdef HELLFIRE\r\n\tfor (i = 0; i <= 36; i++) // Should be MAX_SPELLS-1 but set to 36 to make save games compatible\r\n\t\tpPack->pSplLvl[i] = pPlayer->_pSplLvl[i];\r\n\tchar *p = pPack->pSplLvl2;\r\n\tfor (i = 37; i < 47; i++)\r\n\t\tp[i - 37] = pPlayer->_pSplLvl[i];\r\n#else\r\n\tfor (i = 0; i < MAX_SPELLS; i++)\r\n\t\tpPack->pSplLvl[i] = pPlayer->_pSplLvl[i];\r\n#endif\r\n\r\n\tpki = &pPack->InvBody[0];\r\n\tpi = &pPlayer->InvBody[0];\r\n\r\n\tfor (i = 0; i < NUM_INVLOC; i++) {\r\n\t\tPackItem(pki, pi);\r\n\t\tpki++;\r\n\t\tpi++;\r\n\t}\r\n\r\n\tpki = &pPack->InvList[0];\r\n\tpi = &pPlayer->InvList[0];\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\tPackItem(pki, pi);\r\n\t\tpki++;\r\n\t\tpi++;\r\n\t}\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++)\r\n\t\tpPack->InvGrid[i] = pPlayer->InvGrid[i];\r\n\r\n\tpPack->_pNumInv = pPlayer->_pNumInv;\r\n\tpki = &pPack->SpdList[0];\r\n\tpi = &pPlayer->SpdList[0];\r\n\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tPackItem(pki, pi);\r\n\t\tpki++;\r\n\t\tpi++;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tpPack->wReflections = pPlayer->wReflections;\r\n\tpPack->pDiabloKillLevel = pPlayer->pDiabloKillLevel;\r\n\tpPack->pDifficulty = pPlayer->pDifficulty;\r\n\tpPack->pDamAcFlags = pPlayer->pDamAcFlags;\r\n#else\r\n\tpPack->pDiabloKillLevel = pPlayer->pDiabloKillLevel;\r\n\r\n\tif (gbMaxPlayers == 1 || manashield)\r\n\t\tpPack->pManaShield = pPlayer->pManaShield;\r\n\telse\r\n\t\tpPack->pManaShield = FALSE;\r\n#endif\r\n}\r\n\r\n/**\r\n * Expand a PkItemStruct into an ItemStruct\r\n *\r\n * Note: last slot of item[MAXITEMS+1] used as temporary buffer\r\n * find real name reference below, possibly [sizeof(item[])/sizeof(ItemStruct)]\r\n * @param is The source packed item\r\n * @param id The destination item\r\n */\r\n#ifndef HELLFIRE\r\nstatic\r\n#endif\r\n    void\r\n    UnPackItem(PkItemStruct *is, ItemStruct *id)\r\n{\r\n\tif (is->idx == 0xFFFF) {\r\n\t\tid->_itype = ITYPE_NONE;\r\n\t} else {\r\n\t\tif (is->idx == IDI_EAR) {\r\n\t\t\tRecreateEar(\r\n\t\t\t    MAXITEMS,\r\n\t\t\t    is->iCreateInfo,\r\n\t\t\t    is->iSeed,\r\n\t\t\t    is->bId,\r\n\t\t\t    is->bDur,\r\n\t\t\t    is->bMDur,\r\n\t\t\t    is->bCh,\r\n\t\t\t    is->bMCh,\r\n\t\t\t    is->wValue,\r\n\t\t\t    is->dwBuff);\r\n\t\t} else {\r\n\t\t\tRecreateItem(MAXITEMS, is->idx, is->iCreateInfo, is->iSeed, is->wValue);\r\n\t\t\titem[MAXITEMS]._iMagical = is->bId >> 1;\r\n\t\t\titem[MAXITEMS]._iIdentified = is->bId & 1;\r\n\t\t\titem[MAXITEMS]._iDurability = is->bDur;\r\n\t\t\titem[MAXITEMS]._iMaxDur = is->bMDur;\r\n\t\t\titem[MAXITEMS]._iCharges = is->bCh;\r\n\t\t\titem[MAXITEMS]._iMaxCharges = is->bMCh;\r\n\t\t}\r\n\t\t*id = item[MAXITEMS];\r\n\t}\r\n}\r\n\r\nvoid VerifyGoldSeeds(PlayerStruct *pPlayer)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (i = 0; i < pPlayer->_pNumInv; i++) {\r\n\t\tif (pPlayer->InvList[i].IDidx == IDI_GOLD) {\r\n\t\t\tfor (j = 0; j < pPlayer->_pNumInv; j++) {\r\n\t\t\t\tif (i != j) {\r\n\t\t\t\t\tif (pPlayer->InvList[j].IDidx == IDI_GOLD && pPlayer->InvList[i]._iSeed == pPlayer->InvList[j]._iSeed) {\r\n\t\t\t\t\t\tpPlayer->InvList[i]._iSeed = GetRndSeed();\r\n\t\t\t\t\t\tj = -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok)\r\n{\r\n\tPlayerStruct *pPlayer;\r\n\tint i;\r\n\tItemStruct *pi;\r\n\tPkItemStruct *pki;\r\n\r\n\tpPlayer = &plr[pnum];\r\n\tClearPlrRVars(pPlayer);\r\n\tpPlayer->_px = pPack->px;\r\n\tpPlayer->_py = pPack->py;\r\n\tpPlayer->_pfutx = pPack->px;\r\n\tpPlayer->_pfuty = pPack->py;\r\n\tpPlayer->_ptargx = pPack->targx;\r\n\tpPlayer->_ptargy = pPack->targy;\r\n\tpPlayer->plrlevel = pPack->plrlevel;\r\n\tClrPlrPath(pnum);\r\n\tpPlayer->destAction = ACTION_NONE;\r\n\tstrcpy(pPlayer->_pName, pPack->pName);\r\n\tpPlayer->_pClass = pPack->pClass;\r\n\tInitPlayer(pnum, TRUE);\r\n\tpPlayer->_pBaseStr = pPack->pBaseStr;\r\n\tpPlayer->_pStrength = pPack->pBaseStr;\r\n\tpPlayer->_pBaseMag = pPack->pBaseMag;\r\n\tpPlayer->_pMagic = pPack->pBaseMag;\r\n\tpPlayer->_pBaseDex = pPack->pBaseDex;\r\n\tpPlayer->_pDexterity = pPack->pBaseDex;\r\n\tpPlayer->_pBaseVit = pPack->pBaseVit;\r\n\tpPlayer->_pVitality = pPack->pBaseVit;\r\n\tpPlayer->_pLevel = pPack->pLevel;\r\n\tpPlayer->_pStatPts = pPack->pStatPts;\r\n\tpPlayer->_pExperience = pPack->pExperience;\r\n\tpPlayer->_pGold = pPack->pGold;\r\n\tpPlayer->_pMaxHPBase = pPack->pMaxHPBase;\r\n\tpPlayer->_pHPBase = pPack->pHPBase;\r\n\tif (!killok)\r\n\t\tif ((int)(pPlayer->_pHPBase & 0xFFFFFFC0) < 64)\r\n\t\t\tpPlayer->_pHPBase = 64;\r\n\r\n\tpPlayer->_pMaxManaBase = pPack->pMaxManaBase;\r\n\tpPlayer->_pManaBase = pPack->pManaBase;\r\n\tpPlayer->_pMemSpells = pPack->pMemSpells;\r\n\r\n#ifdef HELLFIRE\r\n\tfor (i = 0; i <= 36; i++) // Should be MAX_SPELLS-1 but set to 36 to make save games compatible\r\n\t\tpPlayer->_pSplLvl[i] = pPack->pSplLvl[i];\r\n\tchar *p = pPack->pSplLvl2;\r\n\tfor (i = 37; i < 47; i++)\r\n\t\tpPlayer->_pSplLvl[i] = p[i - 37];\r\n#else\r\n\tfor (i = 0; i < MAX_SPELLS; i++)\r\n\t\tpPlayer->_pSplLvl[i] = pPack->pSplLvl[i];\r\n#endif\r\n\r\n\tpki = &pPack->InvBody[0];\r\n\tpi = &pPlayer->InvBody[0];\r\n\r\n\tfor (i = 0; i < NUM_INVLOC; i++) {\r\n\t\tUnPackItem(pki, pi);\r\n\t\tpki++;\r\n\t\tpi++;\r\n\t}\r\n\r\n\tpki = &pPack->InvList[0];\r\n\tpi = &pPlayer->InvList[0];\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\tUnPackItem(pki, pi);\r\n\t\tpki++;\r\n\t\tpi++;\r\n\t}\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++)\r\n\t\tpPlayer->InvGrid[i] = pPack->InvGrid[i];\r\n\r\n\tpPlayer->_pNumInv = pPack->_pNumInv;\r\n\tVerifyGoldSeeds(pPlayer);\r\n\r\n\tpki = &pPack->SpdList[0];\r\n\tpi = &pPlayer->SpdList[0];\r\n\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tUnPackItem(pki, pi);\r\n\t\tpki++;\r\n\t\tpi++;\r\n\t}\r\n\r\n\tif (pnum == myplr) {\r\n\t\tfor (i = 0; i < 20; i++)\r\n\t\t\twitchitem[i]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n\tCalcPlrInv(pnum, FALSE);\r\n#ifdef HELLFIRE\r\n\tpPlayer->wReflections = pPack->wReflections;\r\n#endif\r\n\tpPlayer->pTownWarps = 0;\r\n\tpPlayer->pDungMsgs = 0;\r\n#ifdef HELLFIRE\r\n\tpPlayer->pDungMsgs2 = 0;\r\n#endif\r\n\tpPlayer->pLvlLoad = 0;\r\n\tpPlayer->pDiabloKillLevel = pPack->pDiabloKillLevel;\r\n#ifdef HELLFIRE\r\n\tpPlayer->pDifficulty = pPack->pDifficulty;\r\n\tpPlayer->pDamAcFlags = pPack->pDamAcFlags;\r\n#else\r\n\tpPlayer->pBattleNet = pPack->pBattleNet;\r\n\tpPlayer->pManaShield = pPack->pManaShield;\r\n#endif\r\n}\r\n"
  },
  {
    "path": "Source/pack.h",
    "content": "/**\r\n * @file pack.h\r\n *\r\n * Interface of functions for minifying player data structure.\r\n */\r\n#ifndef __PACK_H__\r\n#define __PACK_H__\r\n\r\nvoid UnPackPlayer(PkPlayerStruct *pPack, int pnum, BOOL killok);\r\n#ifdef HELLFIRE\r\nvoid PackPlayer(PkPlayerStruct *pPack, int pnum);\r\nvoid PackItem(PkItemStruct *id, ItemStruct *is);\r\nvoid UnPackItem(PkItemStruct *is, ItemStruct *id);\r\n#else\r\nvoid PackPlayer(PkPlayerStruct *pPack, int pnum, BOOL manashield);\r\n#endif\r\n\r\n/* rdata */\r\n\r\n#endif /* __PACK_H__ */\r\n"
  },
  {
    "path": "Source/palette.cpp",
    "content": "/**\r\n * @file palette.cpp\r\n *\r\n * Implementation of functions for handling the engines color palette.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n/** In-memory palette to which gamma corrections are applied. */\r\nPALETTEENTRY logical_palette[256];\r\n/** The active palette of the system. */\r\nPALETTEENTRY system_palette[256];\r\n/** The original palette as loaded from file. */\r\nPALETTEENTRY orig_palette[256];\r\nint gdwPalEntries;\r\n\r\n/* data */\r\n\r\n/** Specifies the gamma correction level. */\r\nint gamma_correction = 100;\r\n#ifndef HELLFIRE\r\n/** Specifies whether colour cycling is enabled. */\r\nBOOL color_cycling_enabled = TRUE;\r\n#endif\r\n/** Specifies whether the palette has max brightness. */\r\nBOOLEAN sgbFadedIn = TRUE;\r\n\r\nstatic void palette_update()\r\n{\r\n\tint nentries;\r\n\tint max_entries;\r\n\r\n\tif (lpDDPalette) {\r\n\t\tnentries = 0;\r\n\t\tmax_entries = 256;\r\n\t\tif (!fullscreen) {\r\n\t\t\tnentries = gdwPalEntries;\r\n\t\t\tmax_entries = 2 * (128 - gdwPalEntries);\r\n\t\t}\r\n\t\tSDrawUpdatePalette(nentries, max_entries, &system_palette[nentries], 0);\r\n\t}\r\n}\r\n\r\nstatic void ApplyGamma(PALETTEENTRY *dst, PALETTEENTRY *src, int n)\r\n{\r\n\tint i;\r\n\tdouble g;\r\n\r\n\tg = gamma_correction / 100.0;\r\n\r\n\tfor (i = 0; i < n; i++) {\r\n\t\tdst->peRed = pow(src->peRed / 256.0, g) * 256.0;\r\n\t\tdst->peGreen = pow(src->peGreen / 256.0, g) * 256.0;\r\n\t\tdst->peBlue = pow(src->peBlue / 256.0, g) * 256.0;\r\n\t\tdst++;\r\n\t\tsrc++;\r\n\t}\r\n}\r\n\r\nvoid SaveGamma()\r\n{\r\n\tSRegSaveValue(APP_NAME, \"Gamma Correction\", 0, gamma_correction);\r\n#ifndef HELLFIRE\r\n\tSRegSaveValue(APP_NAME, \"Color Cycling\", FALSE, color_cycling_enabled);\r\n#endif\r\n}\r\n\r\nstatic void LoadGamma()\r\n{\r\n\tint gamma_value;\r\n\tint value;\r\n\r\n\tvalue = gamma_correction;\r\n\tif (!SRegLoadValue(APP_NAME, \"Gamma Correction\", 0, &value))\r\n\t\tvalue = 100;\r\n\tgamma_value = value;\r\n\tif (value < 30) {\r\n\t\tgamma_value = 30;\r\n\t} else if (value > 100) {\r\n\t\tgamma_value = 100;\r\n\t}\r\n\tgamma_correction = gamma_value - gamma_value % 5;\r\n#ifndef HELLFIRE\r\n\tif (!SRegLoadValue(APP_NAME, \"Color Cycling\", 0, &value))\r\n\t\tvalue = 1;\r\n\tcolor_cycling_enabled = value;\r\n#endif\r\n}\r\n\r\nstatic void LoadSysPal()\r\n{\r\n\tHDC hDC;\r\n\tint i, iStartIndex;\r\n\r\n\tfor (i = 0; i < 256; i++)\r\n\t\tsystem_palette[i].peFlags = PC_NOCOLLAPSE | PC_RESERVED;\r\n\r\n\tif (!fullscreen) {\r\n\t\thDC = GetDC(NULL);\r\n\r\n\t\tgdwPalEntries = GetDeviceCaps(hDC, NUMRESERVED) / 2;\r\n\t\tGetSystemPaletteEntries(hDC, 0, gdwPalEntries, system_palette);\r\n\t\tfor (i = 0; i < gdwPalEntries; i++)\r\n\t\t\tsystem_palette[i].peFlags = 0;\r\n\r\n\t\tiStartIndex = 256 - gdwPalEntries;\r\n\t\tGetSystemPaletteEntries(hDC, iStartIndex, gdwPalEntries, &system_palette[iStartIndex]);\r\n\t\tif (iStartIndex < 256) {\r\n\t\t\tfor (i = iStartIndex; i < 256; i++)\r\n\t\t\t\tsystem_palette[i].peFlags = 0;\r\n\t\t}\r\n\r\n\t\tReleaseDC(NULL, hDC);\r\n\t}\r\n}\r\n\r\nvoid palette_init()\r\n{\r\n\tDWORD error_code;\r\n\r\n\tLoadGamma();\r\n\tmemcpy(system_palette, orig_palette, sizeof(orig_palette));\r\n\tLoadSysPal();\r\n#ifdef HELLFIRE\r\n\terror_code = lpDDInterface->CreatePalette(DDPCAPS_ALLOW256 | DDPCAPS_INITIALIZE | DDPCAPS_8BIT, system_palette, &lpDDPalette, NULL);\r\n#else\r\n\terror_code = lpDDInterface->CreatePalette(DDPCAPS_ALLOW256 | DDPCAPS_8BIT, system_palette, &lpDDPalette, NULL);\r\n#endif\r\n\tif (error_code)\r\n\t\tErrDlg(IDD_DIALOG8, error_code, \"C:\\\\Src\\\\Diablo\\\\Source\\\\PALETTE.CPP\", 143);\r\n\terror_code = lpDDSPrimary->SetPalette(lpDDPalette);\r\n#ifndef RGBMODE\r\n\tif (error_code)\r\n\t\tErrDlg(IDD_DIALOG8, error_code, \"C:\\\\Src\\\\Diablo\\\\Source\\\\PALETTE.CPP\", 146);\r\n#endif\r\n}\r\n\r\nvoid LoadPalette(const char *pszFileName)\r\n{\r\n\tint i;\r\n\tvoid *pBuf;\r\n\tBYTE PalData[256][3];\r\n\r\n\t/// ASSERT: assert(pszFileName);\r\n\r\n\tWOpenFile(pszFileName, &pBuf, FALSE);\r\n\tWReadFile(pBuf, (char *)PalData, sizeof(PalData));\r\n\tWCloseFile(pBuf);\r\n\r\n\tfor (i = 0; i < 256; i++) {\r\n\t\torig_palette[i].peRed = PalData[i][0];\r\n\t\torig_palette[i].peGreen = PalData[i][1];\r\n\t\torig_palette[i].peBlue = PalData[i][2];\r\n\t\torig_palette[i].peFlags = 0;\r\n\t}\r\n}\r\n\r\nvoid LoadRndLvlPal(int l)\r\n{\r\n\tint rv;\r\n\tchar szFileName[MAX_PATH];\r\n\r\n\tif (l == DTYPE_TOWN) {\r\n\t\tLoadPalette(\"Levels\\\\TownData\\\\Town.pal\");\r\n\t} else {\r\n\t\trv = random_(0, 4) + 1;\r\n\t\tsprintf(szFileName, \"Levels\\\\L%iData\\\\L%i_%i.PAL\", l, l, rv);\r\n#ifdef HELLFIRE\r\n\t\tif (l == 5) {\r\n\t\t\tsprintf(szFileName, \"NLevels\\\\L5Data\\\\L5Base.PAL\");\r\n\t\t}\r\n\t\tif (l == 6) {\r\n\t\t\tif (!UseNestArt) {\r\n\t\t\t\trv++;\r\n\t\t\t}\r\n\t\t\tsprintf(szFileName, \"NLevels\\\\L%iData\\\\L%iBase%i.PAL\", 6, 6, rv);\r\n\t\t}\r\n#endif\r\n\t\tLoadPalette(szFileName);\r\n\t}\r\n}\r\n\r\nvoid ResetPal()\r\n{\r\n\tif (!lpDDSPrimary\r\n\t    || lpDDSPrimary->IsLost() != DDERR_SURFACELOST\r\n\t    || !lpDDSPrimary->Restore()) {\r\n\t\tSDrawRealizePalette();\r\n\t}\r\n}\r\n\r\nvoid IncreaseGamma()\r\n{\r\n\tif (gamma_correction < 100) {\r\n\t\tgamma_correction += 5;\r\n\t\tif (gamma_correction > 100)\r\n\t\t\tgamma_correction = 100;\r\n\t\tApplyGamma(system_palette, logical_palette, 256);\r\n\t\tpalette_update();\r\n\t}\r\n}\r\n\r\nvoid DecreaseGamma()\r\n{\r\n\tif (gamma_correction > 30) {\r\n\t\tgamma_correction -= 5;\r\n\t\tif (gamma_correction < 30)\r\n\t\t\tgamma_correction = 30;\r\n\t\tApplyGamma(system_palette, logical_palette, 256);\r\n\t\tpalette_update();\r\n\t}\r\n}\r\n\r\nint UpdateGamma(int gamma)\r\n{\r\n\tif (gamma) {\r\n\t\tgamma_correction = 130 - gamma;\r\n\t\tApplyGamma(system_palette, logical_palette, 256);\r\n\t\tpalette_update();\r\n\t}\r\n\treturn 130 - gamma_correction;\r\n}\r\n\r\nstatic void SetFadeLevel(DWORD fadeval)\r\n{\r\n\tint i;\r\n\r\n\tif (lpDDInterface) {\r\n\t\tfor (i = 0; i < 255; i++) { // BUGFIX: should be 256\r\n\t\t\tsystem_palette[i].peRed = (fadeval * logical_palette[i].peRed) >> 8;\r\n\t\t\tsystem_palette[i].peGreen = (fadeval * logical_palette[i].peGreen) >> 8;\r\n\t\t\tsystem_palette[i].peBlue = (fadeval * logical_palette[i].peBlue) >> 8;\r\n\t\t}\r\n\t\tSleep(3);\r\n\t\tlpDDInterface->WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, NULL);\r\n\t\tpalette_update();\r\n\t}\r\n}\r\n\r\nvoid BlackPalette()\r\n{\r\n\tSetFadeLevel(0);\r\n}\r\n\r\nvoid PaletteFadeIn(int fr)\r\n{\r\n\tint i;\r\n\r\n\tApplyGamma(logical_palette, orig_palette, 256);\r\n\tfor (i = 0; i < 256; i += fr) {\r\n\t\tSetFadeLevel(i);\r\n\t}\r\n\tSetFadeLevel(256);\r\n\tmemcpy(logical_palette, orig_palette, sizeof(orig_palette));\r\n\tsgbFadedIn = TRUE;\r\n}\r\n\r\nvoid PaletteFadeOut(int fr)\r\n{\r\n\tint i;\r\n\r\n\tif (sgbFadedIn) {\r\n\t\tfor (i = 256; i > 0; i -= fr) {\r\n\t\t\tSetFadeLevel(i);\r\n\t\t}\r\n\t\tSetFadeLevel(0);\r\n\t\tsgbFadedIn = FALSE;\r\n\t}\r\n}\r\n\r\nvoid palette_update_caves()\r\n{\r\n\tint i;\r\n\tPALETTEENTRY col;\r\n\r\n\tcol = system_palette[1];\r\n\tfor (i = 1; i < 31; i++) {\r\n\t\tsystem_palette[i].peRed = system_palette[i + 1].peRed;\r\n\t\tsystem_palette[i].peGreen = system_palette[i + 1].peGreen;\r\n\t\tsystem_palette[i].peBlue = system_palette[i + 1].peBlue;\r\n\t}\r\n\tsystem_palette[i].peRed = col.peRed;\r\n\tsystem_palette[i].peGreen = col.peGreen;\r\n\tsystem_palette[i].peBlue = col.peBlue;\r\n\r\n\tpalette_update();\r\n}\r\n\r\n#ifdef HELLFIRE\r\nint dword_6E2D58;\r\nint dword_6E2D54;\r\nvoid palette_update_crypt()\r\n{\r\n\tint i;\r\n\tPALETTEENTRY col;\r\n\r\n\tif (dword_6E2D58 > 1) {\r\n\t\tcol = system_palette[15];\r\n\t\tfor (i = 15; i > 1; i--) {\r\n\t\t\tsystem_palette[i].peRed = system_palette[i - 1].peRed;\r\n\t\t\tsystem_palette[i].peGreen = system_palette[i - 1].peGreen;\r\n\t\t\tsystem_palette[i].peBlue = system_palette[i - 1].peBlue;\r\n\t\t}\r\n\t\tsystem_palette[i].peRed = col.peRed;\r\n\t\tsystem_palette[i].peGreen = col.peGreen;\r\n\t\tsystem_palette[i].peBlue = col.peBlue;\r\n\r\n\t\tdword_6E2D58 = 0;\r\n\t} else {\r\n\t\tdword_6E2D58++;\r\n\t}\r\n\tif (dword_6E2D54 > 0) {\r\n\t\tcol = system_palette[31];\r\n\t\tfor (i = 31; i > 16; i--) {\r\n\t\t\tsystem_palette[i].peRed = system_palette[i - 1].peRed;\r\n\t\t\tsystem_palette[i].peGreen = system_palette[i - 1].peGreen;\r\n\t\t\tsystem_palette[i].peBlue = system_palette[i - 1].peBlue;\r\n\t\t}\r\n\t\tsystem_palette[i].peRed = col.peRed;\r\n\t\tsystem_palette[i].peGreen = col.peGreen;\r\n\t\tsystem_palette[i].peBlue = col.peBlue;\r\n\t\tpalette_update();\r\n\t\tdword_6E2D54++;\r\n\t} else {\r\n\t\tdword_6E2D54 = 1;\r\n\t}\r\n}\r\n\r\nint dword_6E2D5C;\r\nint dword_6E2D60;\r\nvoid palette_update_hive()\r\n{\r\n\tint i;\r\n\tPALETTEENTRY col;\r\n\r\n\tif (dword_6E2D60 == 2) {\r\n\t\tcol = system_palette[8];\r\n\t\tfor (i = 8; i > 1; i--) {\r\n\t\t\tsystem_palette[i].peRed = system_palette[i - 1].peRed;\r\n\t\t\tsystem_palette[i].peGreen = system_palette[i - 1].peGreen;\r\n\t\t\tsystem_palette[i].peBlue = system_palette[i - 1].peBlue;\r\n\t\t}\r\n\t\tsystem_palette[i].peRed = col.peRed;\r\n\t\tsystem_palette[i].peGreen = col.peGreen;\r\n\t\tsystem_palette[i].peBlue = col.peBlue;\r\n\t\tdword_6E2D60 = 0;\r\n\t} else {\r\n\t\tdword_6E2D60++;\r\n\t}\r\n\tif (dword_6E2D5C == 2) {\r\n\t\tcol = system_palette[15];\r\n\t\tfor (i = 15; i > 9; i--) {\r\n\t\t\tsystem_palette[i].peRed = system_palette[i - 1].peRed;\r\n\t\t\tsystem_palette[i].peGreen = system_palette[i - 1].peGreen;\r\n\t\t\tsystem_palette[i].peBlue = system_palette[i - 1].peBlue;\r\n\t\t}\r\n\t\tsystem_palette[i].peRed = col.peRed;\r\n\t\tsystem_palette[i].peGreen = col.peGreen;\r\n\t\tsystem_palette[i].peBlue = col.peBlue;\r\n\t\tpalette_update();\r\n\t\tdword_6E2D5C = 0;\r\n\t} else {\r\n\t\tdword_6E2D5C++;\r\n\t}\r\n}\r\n\r\n#endif\r\n#ifndef SPAWN\r\nvoid palette_update_quest_palette(int n)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 32 - n; i >= 0; i--) {\r\n\t\tlogical_palette[i] = orig_palette[i];\r\n\t}\r\n\tApplyGamma(system_palette, logical_palette, 32);\r\n\tpalette_update();\r\n}\r\n#endif\r\n\r\n#ifndef HELLFIRE\r\nBOOL palette_get_color_cycling()\r\n{\r\n\treturn color_cycling_enabled;\r\n}\r\n\r\nBOOL palette_set_color_cycling(BOOL enabled)\r\n{\r\n\tcolor_cycling_enabled = enabled;\r\n\treturn enabled;\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/palette.h",
    "content": "/**\r\n * @file palette.h\r\n *\r\n * Interface of functions for handling the engines color palette.\r\n */\r\n#ifndef __PALETTE_H__\r\n#define __PALETTE_H__\r\n\r\nextern PALETTEENTRY system_palette[256];\r\n\r\nvoid SaveGamma();\r\nvoid palette_init();\r\nvoid LoadPalette(const char *pszFileName);\r\nvoid LoadRndLvlPal(int l);\r\nvoid ResetPal();\r\nvoid IncreaseGamma();\r\nvoid DecreaseGamma();\r\nint UpdateGamma(int gamma);\r\nvoid BlackPalette();\r\nvoid PaletteFadeIn(int fr);\r\nvoid PaletteFadeOut(int fr);\r\nvoid palette_update_caves();\r\n#ifdef HELLFIRE\r\nvoid palette_update_crypt();\r\nvoid palette_update_hive();\r\n#endif\r\nvoid palette_update_quest_palette(int n);\r\n#ifndef HELLFIRE\r\nBOOL palette_get_color_cycling();\r\nBOOL palette_set_color_cycling(BOOL enabled);\r\n#endif\r\n\r\n#endif /* __PALETTE_H__ */\r\n"
  },
  {
    "path": "Source/path.cpp",
    "content": "/**\r\n * @file path.cpp\r\n *\r\n * Implementation of the path finding algorithms.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Notes visisted by the path finding algorithm. */\r\nPATHNODE path_nodes[MAXPATHNODES];\r\n/** size of the pnode_tblptr stack */\r\nint gdwCurPathStep;\r\n/** the number of in-use nodes in path_nodes */\r\nint gdwCurNodes;\r\n/**\r\n * for reconstructing the path after the A* search is done. The longest\r\n * possible path is actually 24 steps, even though we can fit 25\r\n */\r\nint pnode_vals[MAX_PATH_LENGTH];\r\n/** A linked list of all visited nodes */\r\nPATHNODE *pnode_ptr;\r\n/** A stack for recursively searching nodes */\r\nPATHNODE *pnode_tblptr[MAXPATHNODES];\r\n/** A linked list of the A* frontier, sorted by distance */\r\nPATHNODE *path_2_nodes;\r\nPATHNODE path_unusednodes[MAXPATHNODES];\r\n\r\n/** For iterating over the 8 possible movement directions */\r\nconst char pathxdir[8] = { -1, -1, 1, 1, -1, 0, 1, 0 };\r\nconst char pathydir[8] = { -1, 1, -1, 1, 0, -1, 0, 1 };\r\n\r\n/* data */\r\n\r\n/**\r\n * each step direction is assigned a number like this:\r\n *       dx\r\n *     -1 0 1\r\n *     +-----\r\n *   -1|5 1 6\r\n * dy 0|2 0 3\r\n *    1|8 4 7\r\n */\r\nchar path_directions[9] = { 5, 1, 6, 2, 0, 3, 8, 4, 7 };\r\n\r\n/**\r\n * find the shortest path from (sx,sy) to (dx,dy), using PosOk(PosOkArg,x,y) to\r\n * check that each step is a valid position. Store the step directions (see\r\n * path_directions) in path, which must have room for 24 steps\r\n */\r\nint FindPath(BOOL (*PosOk)(int, int, int), int PosOkArg, int sx, int sy, int dx, int dy, char *path)\r\n{\r\n\tPATHNODE *path_start, *next_node, *current;\r\n\tint path_length, i;\r\n\r\n\t// clear all nodes, create root nodes for the visited/frontier linked lists\r\n\tgdwCurNodes = 0;\r\n\tpath_2_nodes = path_new_step();\r\n\tpnode_ptr = path_new_step();\r\n\tgdwCurPathStep = 0;\r\n\tpath_start = path_new_step();\r\n\tpath_start->g = 0;\r\n\tpath_start->h = path_get_h_cost(sx, sy, dx, dy);\r\n\tpath_start->x = sx;\r\n\tpath_start->f = path_start->h + path_start->g;\r\n\tpath_start->y = sy;\r\n\tpath_2_nodes->NextNode = path_start;\r\n\t// A* search until we find (dx,dy) or fail\r\n\twhile ((next_node = GetNextPath())) {\r\n\t\t// reached the end, success!\r\n\t\tif (next_node->x == dx && next_node->y == dy) {\r\n\t\t\tcurrent = next_node;\r\n\t\t\tpath_length = 0;\r\n\t\t\twhile (current->Parent) {\r\n\t\t\t\tif (path_length >= MAX_PATH_LENGTH)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpnode_vals[path_length++] = path_directions[3 * (current->y - current->Parent->y) - current->Parent->x + 4 + current->x];\r\n\t\t\t\tcurrent = current->Parent;\r\n\t\t\t}\r\n\t\t\tif (path_length != MAX_PATH_LENGTH) {\r\n\t\t\t\tfor (i = 0; i < path_length; i++)\r\n\t\t\t\t\tpath[i] = pnode_vals[path_length - i - 1];\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\t// ran out of nodes, abort!\r\n\t\tif (!path_get_path(PosOk, PosOkArg, next_node, dx, dy))\r\n\t\t\treturn 0;\r\n\t}\r\n\t// frontier is empty, no path!\r\n\treturn 0;\r\n}\r\n\r\n/**\r\n * @brief heuristic, estimated cost from (sx,sy) to (dx,dy)\r\n */\r\nint path_get_h_cost(int sx, int sy, int dx, int dy)\r\n{\r\n\tint delta_x = abs(sx - dx);\r\n\tint delta_y = abs(sy - dy);\r\n\r\n\tint min = delta_x < delta_y ? delta_x : delta_y;\r\n\tint max = delta_x > delta_y ? delta_x : delta_y;\r\n\r\n\t// see path_check_equal for why this is times 2\r\n#if VERSION == 108\r\n\treturn min + (2 * max);\r\n#else\r\n\treturn 2 * (min + max);\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief return 2 if pPath is horizontally/vertically aligned with (dx,dy), else 3\r\n *\r\n * This approximates that diagonal movement on a square grid should have a cost\r\n * of sqrt(2). That's approximately 1.5, so they multiply all step costs by 2,\r\n * except diagonal steps which are times 3\r\n */\r\nint path_check_equal(PATHNODE *pPath, int dx, int dy)\r\n{\r\n\tif (pPath->x == dx || pPath->y == dy)\r\n\t\treturn 2;\r\n\r\n\treturn 3;\r\n}\r\n\r\n/**\r\n * @brief get the next node on the A* frontier to explore (estimated to be closest to the goal), mark it as visited, and return it\r\n */\r\nPATHNODE *GetNextPath()\r\n{\r\n\tPATHNODE *result;\r\n\r\n\tresult = path_2_nodes->NextNode;\r\n\tif (result == NULL) {\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpath_2_nodes->NextNode = result->NextNode;\r\n\tresult->NextNode = pnode_ptr->NextNode;\r\n\tpnode_ptr->NextNode = result;\r\n\treturn result;\r\n}\r\n\r\n/**\r\n * @brief check if stepping from pPath to (dx,dy) cuts a corner.\r\n *\r\n * If you step from A to B, both Xs need to be clear:\r\n *\r\n *  AX\r\n *  XB\r\n *\r\n *  @return true if step is allowed\r\n */\r\nBOOL path_solid_pieces(PATHNODE *pPath, int dx, int dy)\r\n{\r\n\tBOOL rv = TRUE;\r\n\tswitch (path_directions[3 * (dy - pPath->y) + 3 - pPath->x + 1 + dx]) {\r\n\tcase 5:\r\n\t\trv = !nSolidTable[dPiece[dx][dy + 1]] && !nSolidTable[dPiece[dx + 1][dy]];\r\n\t\tbreak;\r\n\tcase 6:\r\n\t\trv = !nSolidTable[dPiece[dx][dy + 1]] && !nSolidTable[dPiece[dx - 1][dy]];\r\n\t\tbreak;\r\n\tcase 7:\r\n\t\trv = !nSolidTable[dPiece[dx][dy - 1]] && !nSolidTable[dPiece[dx - 1][dy]];\r\n\t\tbreak;\r\n\tcase 8:\r\n\t\trv = !nSolidTable[dPiece[dx + 1][dy]] && !nSolidTable[dPiece[dx][dy - 1]];\r\n\t\tbreak;\r\n\t}\r\n\treturn rv;\r\n}\r\n\r\n/**\r\n * @brief perform a single step of A* bread-first search by trying to step in every possible direction from pPath with goal (x,y). Check each step with PosOk\r\n *\r\n * @return FALSE if we ran out of preallocated nodes to use, else TRUE\r\n */\r\nBOOL path_get_path(BOOL (*PosOk)(int, int, int), int PosOkArg, PATHNODE *pPath, int x, int y)\r\n{\r\n\tint dx, dy;\r\n\tint i;\r\n\tBOOL ok;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tdx = pPath->x + pathxdir[i];\r\n\t\tdy = pPath->y + pathydir[i];\r\n\t\tok = PosOk(PosOkArg, dx, dy);\r\n\t\tif (ok && path_solid_pieces(pPath, dx, dy) || !ok && dx == x && dy == y) {\r\n\t\t\tif (!path_parent_path(pPath, dx, dy, x, y))\r\n\t\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\n/**\r\n * @brief add a step from pPath to (dx,dy), return 1 if successful, and update the frontier/visited nodes accordingly\r\n *\r\n * @return TRUE if step successfully added, FALSE if we ran out of nodes to use\r\n */\r\nBOOL path_parent_path(PATHNODE *pPath, int dx, int dy, int sx, int sy)\r\n{\r\n\tint next_g;\r\n\tPATHNODE *dxdy;\r\n\tint i;\r\n\r\n\tnext_g = pPath->g + path_check_equal(pPath, dx, dy);\r\n\r\n\t// 3 cases to consider\r\n\t// case 1: (dx,dy) is already on the frontier\r\n\tdxdy = path_get_node1(dx, dy);\r\n\tif (dxdy != NULL) {\r\n\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\tif (pPath->Child[i] == NULL)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tpPath->Child[i] = dxdy;\r\n\t\tif (next_g < dxdy->g) {\r\n\t\t\tif (path_solid_pieces(pPath, dx, dy)) {\r\n\t\t\t\t// we'll explore it later, just update\r\n\t\t\t\tdxdy->Parent = pPath;\r\n\t\t\t\tdxdy->g = next_g;\r\n\t\t\t\tdxdy->f = next_g + dxdy->h;\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\t// case 2: (dx,dy) was already visited\r\n\t\tdxdy = path_get_node2(dx, dy);\r\n\t\tif (dxdy != NULL) {\r\n\t\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\t\tif (pPath->Child[i] == NULL)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPath->Child[i] = dxdy;\r\n\t\t\tif (next_g < dxdy->g && path_solid_pieces(pPath, dx, dy)) {\r\n\t\t\t\t// update the node\r\n\t\t\t\tdxdy->Parent = pPath;\r\n\t\t\t\tdxdy->g = next_g;\r\n\t\t\t\tdxdy->f = next_g + dxdy->h;\r\n\t\t\t\t// already explored, so re-update others starting from that node\r\n\t\t\t\tpath_set_coords(dxdy);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// case 3: (dx,dy) is totally new\r\n\t\t\tdxdy = path_new_step();\r\n\t\t\tif (dxdy == NULL)\r\n\t\t\t\treturn FALSE;\r\n\t\t\tdxdy->Parent = pPath;\r\n\t\t\tdxdy->g = next_g;\r\n\t\t\tdxdy->h = path_get_h_cost(dx, dy, sx, sy);\r\n\t\t\tdxdy->f = next_g + dxdy->h;\r\n\t\t\tdxdy->x = dx;\r\n\t\t\tdxdy->y = dy;\r\n\t\t\t// add it to the frontier\r\n\t\t\tpath_next_node(dxdy);\r\n\r\n\t\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\t\tif (pPath->Child[i] == NULL)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPath->Child[i] = dxdy;\r\n\t\t}\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\n/**\r\n * @brief return a node for (dx,dy) on the frontier, or NULL if not found\r\n */\r\nPATHNODE *path_get_node1(int dx, int dy)\r\n{\r\n\tPATHNODE *result = path_2_nodes->NextNode;\r\n\twhile (result != NULL) {\r\n\t\tif (result->x == dx && result->y == dy)\r\n\t\t\treturn result;\r\n\t\tresult = result->NextNode;\r\n\t}\r\n\treturn NULL;\r\n}\r\n\r\n/**\r\n * @brief return a node for (dx,dy) if it was visited, or NULL if not found\r\n */\r\nPATHNODE *path_get_node2(int dx, int dy)\r\n{\r\n\tPATHNODE *result = pnode_ptr->NextNode;\r\n\twhile (result != NULL) {\r\n\t\tif (result->x == dx && result->y == dy)\r\n\t\t\treturn result;\r\n\t\tresult = result->NextNode;\r\n\t}\r\n\treturn NULL;\r\n}\r\n\r\n/**\r\n * @brief insert pPath into the frontier (keeping the frontier sorted by total distance)\r\n */\r\nvoid path_next_node(PATHNODE *pPath)\r\n{\r\n\tPATHNODE *next, *current;\r\n\tint f;\r\n\r\n\tnext = path_2_nodes;\r\n\tif (!path_2_nodes->NextNode) {\r\n\t\tpath_2_nodes->NextNode = pPath;\r\n\t} else {\r\n\t\tcurrent = path_2_nodes;\r\n\t\tnext = path_2_nodes->NextNode;\r\n\t\tf = pPath->f;\r\n\t\twhile (next && next->f < f) {\r\n\t\t\tcurrent = next;\r\n\t\t\tnext = next->NextNode;\r\n\t\t}\r\n\t\tpPath->NextNode = next;\r\n\t\tcurrent->NextNode = pPath;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief update all path costs using depth-first search starting at pPath\r\n */\r\nvoid path_set_coords(PATHNODE *pPath)\r\n{\r\n\tPATHNODE *PathOld;\r\n\tPATHNODE *PathAct;\r\n\tint i;\r\n\r\n\tpath_push_active_step(pPath);\r\n\twhile (gdwCurPathStep) {\r\n\t\tPathOld = path_pop_active_step();\r\n\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\tPathAct = PathOld->Child[i];\r\n\t\t\tif (PathAct == NULL)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tif (PathOld->g + path_check_equal(PathOld, PathAct->x, PathAct->y) < PathAct->g) {\r\n\t\t\t\tif (path_solid_pieces(PathOld, PathAct->x, PathAct->y)) {\r\n\t\t\t\t\tPathAct->Parent = PathOld;\r\n\t\t\t\t\tPathAct->g = PathOld->g + path_check_equal(PathOld, PathAct->x, PathAct->y);\r\n\t\t\t\t\tPathAct->f = PathAct->g + PathAct->h;\r\n\t\t\t\t\tpath_push_active_step(PathAct);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief push pPath onto the pnode_tblptr stack\r\n */\r\nvoid path_push_active_step(PATHNODE *pPath)\r\n{\r\n\tint stack_index = gdwCurPathStep;\r\n\tgdwCurPathStep++;\r\n\tpnode_tblptr[stack_index] = pPath;\r\n}\r\n\r\n/**\r\n * @brief pop and return a node from the pnode_tblptr stack\r\n */\r\nPATHNODE *path_pop_active_step()\r\n{\r\n\tgdwCurPathStep--;\r\n\treturn pnode_tblptr[gdwCurPathStep];\r\n}\r\n\r\n/**\r\n * @brief zero one of the preallocated nodes and return a pointer to it, or NULL if none are available\r\n */\r\nPATHNODE *path_new_step()\r\n{\r\n\tPATHNODE *new_node;\r\n\r\n\tif (gdwCurNodes == MAXPATHNODES)\r\n\t\treturn NULL;\r\n\r\n\tnew_node = &path_nodes[gdwCurNodes];\r\n\tgdwCurNodes++;\r\n\tmemset(new_node, 0, sizeof(PATHNODE));\r\n\treturn new_node;\r\n}\r\n"
  },
  {
    "path": "Source/path.h",
    "content": "/**\r\n * @file path.h\r\n *\r\n * Interface of the path finding algorithms.\r\n */\r\n#ifndef __PATH_H__\r\n#define __PATH_H__\r\n\r\nint FindPath(BOOL (*PosOk)(int, int, int), int PosOkArg, int sx, int sy, int dx, int dy, char *path);\r\nint path_get_h_cost(int sx, int sy, int dx, int dy);\r\nPATHNODE *GetNextPath();\r\nBOOL path_get_path(BOOL (*PosOk)(int, int, int), int PosOkArg, PATHNODE *pPath, int x, int y);\r\nBOOL path_parent_path(PATHNODE *pPath, int dx, int dy, int sx, int sy);\r\nPATHNODE *path_get_node1(int dx, int dy);\r\nPATHNODE *path_get_node2(int dx, int dy);\r\nvoid path_next_node(PATHNODE *pPath);\r\nvoid path_set_coords(PATHNODE *pPath);\r\nvoid path_push_active_step(PATHNODE *pPath);\r\nPATHNODE *path_pop_active_step();\r\nPATHNODE *path_new_step();\r\n\r\n#endif /* __PATH_H__ */\r\n"
  },
  {
    "path": "Source/pfile.cpp",
    "content": "/**\r\n * @file pfile.cpp\r\n *\r\n * Implementation of the save game encoding functionality.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n#include \"../DiabloUI/diabloui.h\"\r\n\r\n#ifdef SPAWN\r\n#define PASSWORD_SINGLE \"adslhfb1\"\r\n#define PASSWORD_MULTI \"lshbkfg1\"\r\n#else\r\n#define PASSWORD_SINGLE \"xrgyrkj1\"\r\n#define PASSWORD_MULTI \"szqnlsk1\"\r\n#endif\r\n\r\n/** List of character names for the character selection screen. */\r\n#ifdef HELLFIRE\r\nstatic char hero_names[MAX_CHARACTERS + 1][PLR_NAME_LEN];\r\n#else\r\nstatic char hero_names[MAX_CHARACTERS][PLR_NAME_LEN];\r\n#endif\r\nBOOL gbValidSaveFile;\r\n\r\nstatic void pfile_check_available_space(char *pszDir)\r\n{\r\n\tchar *s;\r\n\tBOOL hasSpace;\r\n\tDWORD TotalNumberOfClusters;\r\n\tDWORD NumberOfFreeClusters;\r\n\tDWORD BytesPerSector;\r\n\tDWORD SectorsPerCluster;\r\n\r\n\ts = pszDir;\r\n\twhile (*s) {\r\n\t\tif (*s++ != '\\\\')\r\n\t\t\tcontinue;\r\n\t\t*s = '\\0';\r\n\t\tbreak;\r\n\t}\r\n\r\n\thasSpace = GetDiskFreeSpace(pszDir, &SectorsPerCluster, &BytesPerSector, &NumberOfFreeClusters, &TotalNumberOfClusters);\r\n\tif (hasSpace) {\r\n\t\t// 10MB is the amount hardcoded in the error dialog\r\n\t\tif ((__int64)SectorsPerCluster * BytesPerSector * NumberOfFreeClusters < (__int64)(10 << 20))\r\n\t\t\thasSpace = FALSE;\r\n\t}\r\n\r\n\tif (!hasSpace)\r\n\t\tDiskFreeDlg(pszDir);\r\n}\r\n\r\nvoid pfile_init_save_directory()\r\n{\r\n\tDWORD len;\r\n\tchar Buffer[MAX_PATH];\r\n\r\n\tlen = GetWindowsDirectory(Buffer, sizeof(Buffer));\r\n\tif (len) {\r\n\t\tpfile_check_available_space(Buffer);\r\n\t\tlen = GetModuleFileName(ghInst, Buffer, sizeof(Buffer));\r\n\t}\r\n\r\n\tif (!len)\r\n\t\tapp_fatal(\"Unable to initialize save directory\");\r\n\telse\r\n\t\tpfile_check_available_space(Buffer);\r\n}\r\n\r\nstatic char *GetSaveDirectory(char *dst, int dst_size, DWORD save_num)\r\n{\r\n\tDWORD dirLen;\r\n\tchar FileName[MAX_PATH];\r\n\tconst char *savename;\r\n\r\n\t// BUGFIX: ignores dst_size and uses MAX_PATH instead\r\n\tif (gbMaxPlayers > 1) {\r\n#ifdef SPAWN\r\n\t\tsavename = \"\\\\slinfo_%d.drv\";\r\n#else\r\n\t\tsavename = \"\\\\dlinfo_%d.drv\";\r\n#endif\r\n\t\tdirLen = GetWindowsDirectory(dst, MAX_PATH);\r\n\t} else {\r\n\t\tchar *s;\r\n#ifdef SPAWN\r\n\t\tsavename = \"\\\\spawn_%d.sv\";\r\n#else\r\n\t\tsavename = \"\\\\single_%d.sv\";\r\n#endif\r\n\t\tdirLen = GetModuleFileName(ghInst, dst, MAX_PATH);\r\n\t\ts = strrchr(dst, '\\\\');\r\n\t\tif (s)\r\n\t\t\t*s = '\\0';\r\n\t}\r\n\r\n\tif (!dirLen)\r\n\t\tapp_fatal(\"Unable to get save directory\");\r\n\r\n\tsprintf(FileName, savename, save_num);\r\n\tstrcat(dst, FileName);\r\n\treturn _strlwr(dst);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nstatic void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num, BOOL hellfire)\r\n#else\r\nstatic void pfile_get_save_path(char *pszBuf, DWORD dwBufSize, DWORD save_num)\r\n#endif\r\n{\r\n\tconst char *fmt;\r\n\tDWORD plen;\r\n\tchar *s;\r\n\tchar path[MAX_PATH];\r\n\r\n#ifdef HELLFIRE\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tif (!hellfire)\r\n\t\t\tfmt = \"\\\\dlinfo_%d.drv\";\r\n\t\telse\r\n\t\t\tfmt = \"\\\\hrinfo_%d.drv\";\r\n\r\n\t\tplen = GetWindowsDirectory(pszBuf, MAX_PATH);\r\n\t} else {\r\n\t\tif (!hellfire)\r\n\t\t\tfmt = \"\\\\single_%d.sv\";\r\n\t\telse\r\n\t\t\tfmt = \"\\\\single_%d.hsv\";\r\n#else\r\n#ifdef SPAWN\r\n\tfmt = \"\\\\share_%d.sv\";\r\n\r\n\tif (gbMaxPlayers <= 1)\r\n\t\tfmt = \"\\\\spawn%d.sv\";\r\n#else\r\n\tfmt = \"\\\\multi_%d.sv\";\r\n\r\n\tif (gbMaxPlayers <= 1)\r\n\t\tfmt = \"\\\\single_%d.sv\";\r\n#endif\r\n#endif\r\n\r\n\t\t// BUGFIX: ignores dwBufSize and uses MAX_PATH instead\r\n\t\tplen = GetModuleFileName(ghInst, pszBuf, MAX_PATH);\r\n\t\ts = strrchr(pszBuf, '\\\\');\r\n\t\tif (s)\r\n\t\t\t*s = '\\0';\r\n#ifdef HELLFIRE\r\n\t}\r\n#endif\r\n\r\n\tif (!plen)\r\n\t\tapp_fatal(\"Unable to get save directory\");\r\n\r\n\tsprintf(path, fmt, save_num);\r\n\tstrcat(pszBuf, path);\r\n\t_strlwr(pszBuf);\r\n}\r\n\r\nstatic DWORD pfile_get_save_num_from_name(const char *name)\r\n{\r\n\tDWORD i;\r\n\r\n\tfor (i = 0; i < MAX_CHARACTERS; i++) {\r\n\t\tif (!_strcmpi(hero_names[i], name))\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\treturn i;\r\n}\r\n\r\nstatic BOOL pfile_read_hero(HANDLE archive, PkPlayerStruct *pPack)\r\n{\r\n\tHANDLE file;\r\n\tBOOL decoded;\r\n\tDWORD dwlen, nSize;\r\n\tBYTE *buf;\r\n\r\n\tif (!SFileOpenFileEx(archive, \"hero\", 0, &file)) {\r\n\t\treturn FALSE;\r\n\t} else {\r\n\t\tbuf = NULL;\r\n\t\tBOOL ret = FALSE;\r\n\t\tchar password[16] = PASSWORD_SINGLE;\r\n\t\tnSize = 16;\r\n\r\n\t\tif (gbMaxPlayers > 1)\r\n#ifdef HELLFIRE\r\n\t\t\tGetComputerName(password, &nSize);\r\n#else\r\n\t\t\tstrcpy(password, PASSWORD_MULTI);\r\n#endif\r\n\r\n\t\tdwlen = SFileGetFileSize(file, NULL);\r\n\t\tif (dwlen) {\r\n\t\t\tDWORD read;\r\n\t\t\tbuf = DiabloAllocPtr(dwlen);\r\n\t\t\tif (SFileReadFile(file, buf, dwlen, &read, NULL)) {\r\n\t\t\t\tdecoded = TRUE;\r\n\t\t\t\tread = codec_decode(buf, dwlen, password);\r\n#ifndef HELLFIRE\r\n\t\t\t\tif (!read && gbMaxPlayers > 1) {\r\n\t\t\t\t\tGetComputerName(password, &nSize);\r\n\t\t\t\t\tif (SFileSetFilePointer(file, 0, NULL, FILE_BEGIN) || !SFileReadFile(file, buf, dwlen, &read, NULL))\r\n\t\t\t\t\t\tdecoded = FALSE;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tread = codec_decode(buf, dwlen, password);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tif (decoded && read == sizeof(*pPack)) {\r\n\t\t\t\t\tmemcpy(pPack, buf, sizeof(*pPack));\r\n\t\t\t\t\tret = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (buf)\r\n\t\t\tmem_free_dbg(buf);\r\n\t\tSFileCloseFile(file);\r\n\t\treturn ret;\r\n\t}\r\n}\r\n\r\nstatic void pfile_encode_hero(const PkPlayerStruct *pPack)\r\n{\r\n\tBYTE *packed;\r\n\tDWORD packed_len;\r\n\tchar password[16] = PASSWORD_SINGLE;\r\n\r\n#ifdef HELLFIRE\r\n\tDWORD size = 161;\r\n\tif (gbMaxPlayers > 1)\r\n\t\tGetComputerName(password, &size);\r\n#else\r\n\tif (gbMaxPlayers > 1)\r\n\t\tstrcpy(password, PASSWORD_MULTI);\r\n#endif\r\n\r\n\tpacked_len = codec_get_encoded_len(sizeof(*pPack));\r\n\tpacked = (BYTE *)DiabloAllocPtr(packed_len);\r\n\tmemcpy(packed, pPack, sizeof(*pPack));\r\n\tcodec_encode(packed, sizeof(*pPack), packed_len, password);\r\n\tmpqapi_write_file(\"hero\", packed, packed_len);\r\n\tmem_free_dbg(packed);\r\n}\r\n\r\nstatic BOOL pfile_open_archive(BOOL update, DWORD save_num)\r\n{\r\n\tchar FileName[MAX_PATH];\r\n\r\n#ifdef HELLFIRE\r\n\tpfile_get_save_path(FileName, sizeof(FileName), save_num, TRUE);\r\n\tif (OpenMPQ(FileName, gbMaxPlayers > 1, save_num))\r\n#else\r\n\tpfile_get_save_path(FileName, sizeof(FileName), save_num);\r\n\tif (OpenMPQ(FileName, FALSE, save_num))\r\n#endif\r\n\t\treturn TRUE;\r\n\r\n\tif (update && gbMaxPlayers > 1)\r\n\t\tmpqapi_store_default_time(save_num);\r\n\treturn FALSE;\r\n}\r\n\r\nstatic void pfile_flush(BOOL is_single_player, DWORD save_num)\r\n{\r\n\tchar FileName[MAX_PATH];\r\n\r\n#ifdef HELLFIRE\r\n\tpfile_get_save_path(FileName, sizeof(FileName), save_num, TRUE);\r\n#else\r\n\tpfile_get_save_path(FileName, sizeof(FileName), save_num);\r\n#endif\r\n\r\n\tmpqapi_flush_and_close(FileName, is_single_player, save_num);\r\n}\r\n\r\n/**\r\n * @param showFixedMsg Display a dialog if a save file was corrected (deprecated)\r\n */\r\nstatic HANDLE pfile_open_save_archive(BOOL *showFixedMsg, DWORD save_num)\r\n{\r\n\tchar SrcStr[MAX_PATH];\r\n\tHANDLE archive;\r\n\r\n#ifdef HELLFIRE\r\n\tpfile_get_save_path(SrcStr, sizeof(SrcStr), save_num, TRUE);\r\n#else\r\n\tpfile_get_save_path(SrcStr, sizeof(SrcStr), save_num);\r\n#endif\r\n\tif (SFileOpenArchive(SrcStr, 0x7000, FS_PC, &archive))\r\n\t\treturn archive;\r\n\treturn NULL;\r\n}\r\n\r\nstatic void pfile_SFileCloseArchive(HANDLE hsArchive)\r\n{\r\n\tSFileCloseArchive(hsArchive);\r\n}\r\n\r\nvoid pfile_write_hero()\r\n{\r\n\tDWORD save_num;\r\n\tPkPlayerStruct pkplr;\r\n\r\n\tsave_num = pfile_get_save_num_from_name(plr[myplr]._pName);\r\n\tif (pfile_open_archive(TRUE, save_num)) {\r\n#ifdef HELLFIRE\r\n\t\tPackPlayer(&pkplr, myplr);\r\n#else\r\n\t\tPackPlayer(&pkplr, myplr, gbMaxPlayers == 1);\r\n#endif\r\n\t\tpfile_encode_hero(&pkplr);\r\n\t\tpfile_flush(gbMaxPlayers == 1, save_num);\r\n\t}\r\n}\r\n\r\nBOOL pfile_create_player_description(char *dst, DWORD len)\r\n{\r\n\tchar desc[128];\r\n\t_uiheroinfo uihero;\r\n\r\n\tmyplr = 0;\r\n\tpfile_read_player_from_save();\r\n\tgame_2_ui_player(plr, &uihero, gbValidSaveFile);\r\n\tUiSetupPlayerInfo(gszHero, &uihero, GAME_ID);\r\n\r\n\tif (dst != NULL && len) {\r\n\t\tif (UiCreatePlayerDescription(&uihero, GAME_ID, desc) == 0)\r\n\t\t\treturn FALSE;\r\n\t\tSStrCopy(dst, desc, len);\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL pfile_rename_hero(const char *name_1, const char *name_2)\r\n{\r\n\tint i;\r\n\tDWORD save_num;\r\n\t_uiheroinfo uihero;\r\n\tBOOL found = FALSE;\r\n\r\n\tif (pfile_get_save_num_from_name(name_2) == MAX_CHARACTERS) {\r\n\t\tfor (i = 0; i != MAX_PLRS; i++) {\r\n\t\t\tif (!_strcmpi(name_1, plr[i]._pName)) {\r\n\t\t\t\tfound = TRUE;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!found)\r\n\t\treturn FALSE;\r\n\tsave_num = pfile_get_save_num_from_name(name_1);\r\n\tif (save_num == MAX_CHARACTERS)\r\n\t\treturn FALSE;\r\n\r\n\tSStrCopy(hero_names[save_num], name_2, PLR_NAME_LEN);\r\n\tSStrCopy(plr[i]._pName, name_2, PLR_NAME_LEN);\r\n\tif (!_strcmpi(gszHero, name_1))\r\n\t\tSStrCopy(gszHero, name_2, sizeof(gszHero));\r\n\tgame_2_ui_player(plr, &uihero, gbValidSaveFile);\r\n\tUiSetupPlayerInfo(gszHero, &uihero, GAME_ID);\r\n\tpfile_write_hero();\r\n\treturn TRUE;\r\n}\r\n\r\nvoid pfile_flush_W()\r\n{\r\n\tpfile_flush(TRUE, pfile_get_save_num_from_name(plr[myplr]._pName));\r\n}\r\n\r\nstatic char pfile_get_player_class(unsigned int player_class_nr)\r\n{\r\n\tchar pc_class;\r\n\r\n\tif (player_class_nr == UI_WARRIOR)\r\n\t\tpc_class = PC_WARRIOR;\r\n\telse if (player_class_nr == UI_ROGUE)\r\n\t\tpc_class = PC_ROGUE;\r\n#ifdef HELLFIRE\r\n\telse if (player_class_nr == 3)\r\n\t\tpc_class = PC_MONK;\r\n\telse if (player_class_nr == 4)\r\n\t\tpc_class = PC_BARD;\r\n\telse if (player_class_nr == 5)\r\n\t\tpc_class = PC_BARBARIAN;\r\n#endif\r\n\telse\r\n\t\tpc_class = PC_SORCERER;\r\n\treturn pc_class;\r\n}\r\n\r\nstatic BYTE game_2_ui_class(const PlayerStruct *p)\r\n{\r\n\tBYTE uiclass;\r\n\tif (p->_pClass == PC_WARRIOR)\r\n\t\tuiclass = UI_WARRIOR;\r\n\telse if (p->_pClass == PC_ROGUE)\r\n\t\tuiclass = UI_ROGUE;\r\n#ifdef HELLFIRE\r\n\telse if (p->_pClass == PC_MONK)\r\n\t\tuiclass = UI_MONK;\r\n\telse if (p->_pClass == PC_BARD)\r\n\t\tuiclass = UI_BARD;\r\n\telse if (p->_pClass == PC_BARBARIAN)\r\n\t\tuiclass = UI_BARBARIAN;\r\n#endif\r\n\telse\r\n\t\tuiclass = UI_SORCERER;\r\n\r\n\treturn uiclass;\r\n}\r\n\r\nvoid game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile)\r\n{\r\n\tmemset(heroinfo, 0, sizeof(*heroinfo));\r\n\tstrncpy(heroinfo->name, p->_pName, sizeof(heroinfo->name) - 1);\r\n\theroinfo->name[sizeof(heroinfo->name) - 1] = '\\0';\r\n\theroinfo->level = p->_pLevel;\r\n\theroinfo->heroclass = game_2_ui_class(p);\r\n\theroinfo->strength = p->_pStrength;\r\n\theroinfo->magic = p->_pMagic;\r\n\theroinfo->dexterity = p->_pDexterity;\r\n\theroinfo->vitality = p->_pVitality;\r\n\theroinfo->gold = p->_pGold;\r\n\theroinfo->hassaved = bHasSaveFile;\r\n\theroinfo->herorank = p->pDiabloKillLevel;\r\n#ifdef SPAWN\r\n\theroinfo->spawned = TRUE;\r\n#else\r\n\theroinfo->spawned = FALSE;\r\n#endif\r\n}\r\n\r\nBOOL __stdcall pfile_ui_set_hero_infos(BOOL(__stdcall *ui_add_hero_info)(_uiheroinfo *))\r\n{\r\n\tDWORD i, save_num;\r\n\tchar FileName[MAX_PATH];\r\n\tchar NewFileName[MAX_PATH];\r\n\tBOOL showFixedMsg;\r\n\r\n\tmemset(hero_names, 0, sizeof(hero_names));\r\n#ifndef HELLFIRE\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tfor (i = 0, save_num = 0; i < MAX_CHARACTERS && save_num < MAX_CHARACTERS; i++) {\r\n\t\t\tstruct _OFSTRUCT ReOpenBuff;\r\n\t\t\tconst char *s;\r\n\r\n\t\t\tGetSaveDirectory(FileName, sizeof(FileName), i);\r\n\t\t\ts = strrchr(FileName, '\\\\') + 1;\r\n\t\t\tif (s == (const char *)1)\r\n\t\t\t\tcontinue;\r\n\t\t\tif (OpenFile(FileName, &ReOpenBuff, OF_EXIST) == HFILE_ERROR)\r\n\t\t\t\tcontinue;\r\n\t\t\tif (!SRegLoadString(\"Diablo\\\\Converted\", s, 0, NewFileName, sizeof(NewFileName))) {\r\n\t\t\t\twhile (save_num < MAX_CHARACTERS) {\r\n\t\t\t\t\tpfile_get_save_path(NewFileName, sizeof(NewFileName), save_num++);\r\n\t\t\t\t\tif (OpenFile(NewFileName, &ReOpenBuff, OF_EXIST) == HFILE_ERROR) {\r\n\t\t\t\t\t\tif (CopyFile(FileName, NewFileName, TRUE)) {\r\n\t\t\t\t\t\t\tDWORD attrib;\r\n\t\t\t\t\t\t\tSRegSaveString(\"Diablo\\\\Converted\", s, 0, NewFileName);\r\n\t\t\t\t\t\t\tattrib = GetFileAttributes(NewFileName);\r\n\t\t\t\t\t\t\tif (attrib != INVALID_FILE_ATTRIBUTES) {\r\n\t\t\t\t\t\t\t\tattrib &= ~(FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);\r\n\t\t\t\t\t\t\t\tSetFileAttributes(NewFileName, attrib);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tshowFixedMsg = TRUE;\r\n\tfor (i = 0; i < MAX_CHARACTERS; i++) {\r\n\t\tPkPlayerStruct pkplr;\r\n\t\tHANDLE archive = pfile_open_save_archive(&showFixedMsg, i);\r\n\t\tif (archive) {\r\n\t\t\tif (pfile_read_hero(archive, &pkplr)) {\r\n\t\t\t\t_uiheroinfo uihero;\r\n\t\t\t\tstrcpy(hero_names[i], pkplr.pName);\r\n\t\t\t\tUnPackPlayer(&pkplr, 0, FALSE);\r\n\t\t\t\tgame_2_ui_player(plr, &uihero, pfile_archive_contains_game(archive, i));\r\n\t\t\t\tui_add_hero_info(&uihero);\r\n\t\t\t}\r\n\t\t\tpfile_SFileCloseArchive(archive);\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL pfile_archive_contains_game(HANDLE hsArchive, DWORD save_num)\r\n{\r\n\tHANDLE file;\r\n\r\n#ifdef HELLFIRE\r\n\tDWORD read, size;\r\n\tBOOL ret = FALSE;\r\n\tgbLoadGame = FALSE;\r\n#endif\r\n\r\n\tif (gbMaxPlayers != 1)\r\n\t\treturn FALSE;\r\n\r\n\tif (!SFileOpenFileEx(hsArchive, \"game\", 0, &file))\r\n\t\treturn FALSE;\r\n\r\n#ifdef HELLFIRE\r\n\tDWORD dwlen = SFileGetFileSize(file, NULL);\r\n\tif (!dwlen)\r\n\t\tapp_fatal(\"Invalid save file\");\r\n\r\n\tBYTE *ptr = DiabloAllocPtr(dwlen + 8);\r\n\tBYTE *buf = ptr + 4;\r\n\r\n\tif (SFileReadFile(file, buf, dwlen, &read, NULL)) {\r\n\t\tif (read == dwlen) {\r\n\t\t\tchar password[16] = PASSWORD_SINGLE;\r\n\t\t\tsize = 16;\r\n\t\t\tif (gbMaxPlayers > 1)\r\n\t\t\t\tGetComputerName(password, &size);\r\n\t\t\tgbLoadGame = TRUE;\r\n\t\t\tif (codec_decode(buf, dwlen, password)) {\r\n\t\t\t\tint magic = *buf << 24;\r\n\t\t\t\tbuf++;\r\n\t\t\t\tmagic |= *buf << 16;\r\n\t\t\t\tbuf++;\r\n\t\t\t\tmagic |= *buf << 8;\r\n\t\t\t\tbuf++;\r\n\t\t\t\tmagic |= *buf;\r\n\t\t\t\tif (magic == 'HELF') {\r\n\t\t\t\t\tret = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (ptr)\r\n\t\tmem_free_dbg(ptr);\r\n\tSFileCloseFile(file);\r\n\treturn ret;\r\n#else\r\n\tSFileCloseFile(file);\r\n\treturn TRUE;\r\n#endif\r\n}\r\n\r\nBOOL __stdcall pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefaultstats *class_stats)\r\n{\r\n\tint c;\r\n\r\n\tc = pfile_get_player_class(player_class_nr);\r\n\tclass_stats->strength = StrengthTbl[c];\r\n\tclass_stats->magic = MagicTbl[c];\r\n\tclass_stats->dexterity = DexterityTbl[c];\r\n\tclass_stats->vitality = VitalityTbl[c];\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL __stdcall pfile_ui_save_create(_uiheroinfo *heroinfo)\r\n{\r\n\tDWORD save_num;\r\n\tchar cl;\r\n\tPkPlayerStruct pkplr;\r\n\r\n\tsave_num = pfile_get_save_num_from_name(heroinfo->name);\r\n#ifdef HELLFIRE\r\n\tif (save_num >= MAX_CHARACTERS) {\r\n#else\r\n\tif (save_num == MAX_CHARACTERS) {\r\n#endif\r\n\t\tfor (save_num = 0; save_num < MAX_CHARACTERS; save_num++) {\r\n\t\t\tif (!hero_names[save_num][0])\r\n\t\t\t\tbreak;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (save_num >= MAX_CHARACTERS)\r\n#else\r\n\t\tif (save_num == MAX_CHARACTERS)\r\n#endif\r\n\t\t\treturn FALSE;\r\n\t}\r\n\tif (!pfile_open_archive(FALSE, save_num))\r\n\t\treturn FALSE;\r\n\tmpqapi_remove_hash_entries(pfile_get_file_name);\r\n\tstrncpy(hero_names[save_num], heroinfo->name, PLR_NAME_LEN);\r\n\thero_names[save_num][PLR_NAME_LEN - 1] = '\\0';\r\n\tcl = pfile_get_player_class(heroinfo->heroclass);\r\n\tCreatePlayer(0, cl);\r\n\tstrncpy(plr[0]._pName, heroinfo->name, PLR_NAME_LEN);\r\n\tplr[0]._pName[PLR_NAME_LEN - 1] = '\\0';\r\n#ifdef HELLFIRE\r\n\tPackPlayer(&pkplr, 0);\r\n#else\r\n\tPackPlayer(&pkplr, 0, TRUE);\r\n#endif\r\n\tpfile_encode_hero(&pkplr);\r\n\tgame_2_ui_player(&plr[0], heroinfo, FALSE);\r\n\tpfile_flush(TRUE, save_num);\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL __stdcall pfile_get_file_name(DWORD lvl, char *dst)\r\n{\r\n\tconst char *fmt;\r\n\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tif (lvl)\r\n\t\t\treturn FALSE;\r\n\t\tfmt = \"hero\";\r\n\t} else {\r\n\t\tif (lvl < NUMLEVELS)\r\n\t\t\tfmt = \"perml%02d\";\r\n\t\telse if (lvl < NUMLEVELS * 2) {\r\n\t\t\tlvl -= NUMLEVELS;\r\n\t\t\tfmt = \"perms%02d\";\r\n\t\t} else if (lvl == NUMLEVELS * 2)\r\n\t\t\tfmt = \"game\";\r\n\t\telse if (lvl == NUMLEVELS * 2 + 1)\r\n\t\t\tfmt = \"hero\";\r\n\t\telse\r\n\t\t\treturn FALSE;\r\n\t}\r\n\tsprintf(dst, fmt, lvl);\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL __stdcall pfile_delete_save(_uiheroinfo *hero_info)\r\n{\r\n\tDWORD save_num;\r\n\tchar FileName[MAX_PATH];\r\n\r\n\tsave_num = pfile_get_save_num_from_name(hero_info->name);\r\n\tif (save_num < MAX_CHARACTERS) {\r\n\t\thero_names[save_num][0] = '\\0';\r\n#ifdef HELLFIRE\r\n\t\tpfile_get_save_path(FileName, sizeof(FileName), save_num, TRUE);\r\n#else\r\n\t\tpfile_get_save_path(FileName, sizeof(FileName), save_num);\r\n#endif\r\n\t\tDeleteFile(FileName);\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nvoid pfile_read_player_from_save()\r\n{\r\n\tHANDLE archive;\r\n\tDWORD save_num;\r\n\tPkPlayerStruct pkplr;\r\n\r\n\tsave_num = pfile_get_save_num_from_name(gszHero);\r\n\tarchive = pfile_open_save_archive(NULL, save_num);\r\n\tif (archive == NULL)\r\n\t\tapp_fatal(\"Unable to open archive\");\r\n\tif (!pfile_read_hero(archive, &pkplr))\r\n\t\tapp_fatal(\"Unable to load character\");\r\n\r\n\tUnPackPlayer(&pkplr, myplr, FALSE);\r\n\tgbValidSaveFile = pfile_archive_contains_game(archive, save_num);\r\n\tpfile_SFileCloseArchive(archive);\r\n}\r\n\r\nvoid GetTempLevelNames(char *szTemp)\r\n{\r\n\t// BUGFIX: function call has no purpose\r\n\tpfile_get_save_num_from_name(plr[myplr]._pName);\r\n\tif (setlevel)\r\n\t\tsprintf(szTemp, \"temps%02d\", setlvlnum);\r\n\telse\r\n\t\tsprintf(szTemp, \"templ%02d\", currlevel);\r\n}\r\n\r\nvoid GetPermLevelNames(char *szPerm)\r\n{\r\n\tDWORD save_num;\r\n\tBOOL has_file;\r\n\r\n\tsave_num = pfile_get_save_num_from_name(plr[myplr]._pName);\r\n\tGetTempLevelNames(szPerm);\r\n\tif (!pfile_open_archive(FALSE, save_num))\r\n\t\tapp_fatal(\"Unable to read to save file archive\");\r\n\r\n\thas_file = mpqapi_has_file(szPerm);\r\n\tpfile_flush(TRUE, save_num);\r\n\tif (!has_file) {\r\n\t\tif (setlevel)\r\n\t\t\tsprintf(szPerm, \"perms%02d\", setlvlnum);\r\n\t\telse\r\n\t\t\tsprintf(szPerm, \"perml%02d\", currlevel);\r\n\t}\r\n}\r\n\r\nvoid pfile_get_game_name(char *dst)\r\n{\r\n\t// BUGFIX: function call with no purpose\r\n\tpfile_get_save_num_from_name(plr[myplr]._pName);\r\n\tstrcpy(dst, \"game\");\r\n}\r\n\r\nstatic BOOL __stdcall GetPermSaveNames(DWORD dwIndex, char *szPerm)\r\n{\r\n\tconst char *fmt;\r\n\r\n\tif (dwIndex < NUMLEVELS)\r\n\t\tfmt = \"perml%02d\";\r\n\telse if (dwIndex < NUMLEVELS * 2) {\r\n\t\tdwIndex -= NUMLEVELS;\r\n\t\tfmt = \"perms%02d\";\r\n\t} else\r\n\t\treturn FALSE;\r\n\r\n\tsprintf(szPerm, fmt, dwIndex);\r\n\treturn TRUE;\r\n}\r\n\r\nstatic BOOL __stdcall GetTempSaveNames(DWORD dwIndex, char *szTemp)\r\n{\r\n\tconst char *fmt;\r\n\r\n\tif (dwIndex < NUMLEVELS)\r\n\t\tfmt = \"templ%02d\";\r\n\telse if (dwIndex < NUMLEVELS * 2) {\r\n\t\tdwIndex -= NUMLEVELS;\r\n\t\tfmt = \"temps%02d\";\r\n\t} else\r\n\t\treturn FALSE;\r\n\r\n\tsprintf(szTemp, fmt, dwIndex);\r\n\treturn TRUE;\r\n}\r\n\r\nvoid pfile_remove_temp_files()\r\n{\r\n\tif (gbMaxPlayers <= 1) {\r\n\t\tDWORD save_num = pfile_get_save_num_from_name(plr[myplr]._pName);\r\n\t\tif (!pfile_open_archive(FALSE, save_num))\r\n\t\t\tapp_fatal(\"Unable to write to save file archive\");\r\n\t\tmpqapi_remove_hash_entries(GetTempSaveNames);\r\n\t\tpfile_flush(TRUE, save_num);\r\n\t}\r\n}\r\n\r\nvoid pfile_rename_temp_to_perm()\r\n{\r\n\tDWORD dwChar, dwIndex;\r\n\tBOOL bResult;\r\n\tchar szTemp[MAX_PATH];\r\n\tchar szPerm[MAX_PATH];\r\n\r\n\tdwChar = pfile_get_save_num_from_name(plr[myplr]._pName);\r\n\t/// ASSERT: assert(dwChar < MAX_CHARACTERS);\r\n\t/// ASSERT: assert(gbMaxPlayers == 1);\r\n\tif (!pfile_open_archive(FALSE, dwChar))\r\n\t\tapp_fatal(\"Unable to write to save file archive\");\r\n\r\n\tdwIndex = 0;\r\n\twhile (GetTempSaveNames(dwIndex, szTemp)) {\r\n\t\tbResult = GetPermSaveNames(dwIndex, szPerm);\r\n\t\t/// ASSERT: assert(bResult);\r\n\t\tdwIndex++;\r\n\t\tif (mpqapi_has_file(szTemp)) {\r\n\t\t\tif (mpqapi_has_file(szPerm))\r\n\t\t\t\tmpqapi_remove_hash_entry(szPerm);\r\n\t\t\tmpqapi_rename(szTemp, szPerm);\r\n\t\t}\r\n\t}\r\n\t/// ASSERT: assert(! GetPermSaveNames(dwIndex,szPerm));\r\n\tGetPermSaveNames(dwIndex, szPerm); // BUGFIX: function call has no purpose\r\n\tpfile_flush(TRUE, dwChar);\r\n}\r\n\r\nvoid pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen)\r\n{\r\n\tDWORD save_num;\r\n#ifndef HELLFIRE\r\n\tchar FileName[MAX_PATH];\r\n\r\n\tpfile_strcpy(FileName, pszName);\r\n#endif\r\n\tsave_num = pfile_get_save_num_from_name(plr[myplr]._pName);\r\n\t{\r\n\t\tchar password[16] = PASSWORD_SINGLE;\r\n#ifdef HELLFIRE\r\n\t\tDWORD size = 16;\r\n\t\tif (gbMaxPlayers > 1)\r\n\t\t\tGetComputerName(password, &size);\r\n#else\r\n\t\tif (gbMaxPlayers > 1)\r\n\t\t\tstrcpy(password, PASSWORD_MULTI);\r\n#endif\r\n\r\n\t\tcodec_encode(pbData, dwLen, qwLen, password);\r\n\t}\r\n\tif (!pfile_open_archive(FALSE, save_num))\r\n#ifdef HELLFIRE\r\n\t\tapp_fatal(\"Unable to write to save file archive\");\r\n\tmpqapi_write_file(pszName, pbData, qwLen);\r\n#else\r\n\t\tapp_fatal(\"Unable to write so save file archive\");\r\n\tmpqapi_write_file(FileName, pbData, qwLen);\r\n#endif\r\n\tpfile_flush(TRUE, save_num);\r\n}\r\n\r\nvoid pfile_strcpy(char *dst, const char *src)\r\n{\r\n\tstrcpy(dst, src);\r\n}\r\n\r\nBYTE *pfile_read(const char *pszName, DWORD *pdwLen)\r\n{\r\n\tDWORD save_num, nread;\r\n\tchar FileName[MAX_PATH];\r\n\tHANDLE archive, save;\r\n\tBYTE *buf;\r\n\r\n#ifndef HELLFIRE\r\n\tpfile_strcpy(FileName, pszName);\r\n#endif\r\n\tsave_num = pfile_get_save_num_from_name(plr[myplr]._pName);\r\n\tarchive = pfile_open_save_archive(NULL, save_num);\r\n\tif (archive == NULL)\r\n\t\tapp_fatal(\"Unable to open save file archive\");\r\n\r\n#ifdef HELLFIRE\r\n\tif (!SFileOpenFileEx(archive, pszName, 0, &save))\r\n#else\r\n\tif (!SFileOpenFileEx(archive, FileName, 0, &save))\r\n#endif\r\n\t\tapp_fatal(\"Unable to open save file\");\r\n\r\n\t*pdwLen = SFileGetFileSize(save, NULL);\r\n\tif (*pdwLen == 0)\r\n\t\tapp_fatal(\"Invalid save file\");\r\n\r\n\tbuf = DiabloAllocPtr(*pdwLen);\r\n\tif (!SFileReadFile(save, buf, *pdwLen, &nread, NULL))\r\n\t\tapp_fatal(\"Unable to read save file\");\r\n\tSFileCloseFile(save);\r\n\tpfile_SFileCloseArchive(archive);\r\n\r\n\tchar password[16] = PASSWORD_SINGLE;\r\n\tDWORD nSize = 16;\r\n\r\n\tif (gbMaxPlayers > 1)\r\n#ifdef HELLFIRE\r\n\t\tGetComputerName(password, &nSize);\r\n\t{\r\n\t\t{\r\n#else\r\n\t\tstrcpy(password, PASSWORD_MULTI);\r\n\r\n\t*pdwLen = codec_decode(buf, *pdwLen, password);\r\n\tif (*pdwLen == 0) {\r\n\t\t// BUGFIFX: *pdwLen has already been overwritten with zero and the savefile has been closed\r\n\t\t// there is no way this can work correctly\r\n\t\tif (gbMaxPlayers > 1) {\r\n\t\t\tGetComputerName(password, &nSize);\r\n\t\t\tif (SFileSetFilePointer(save, 0, NULL, FILE_BEGIN))\r\n\t\t\t\tapp_fatal(\"Unable to read save file\");\r\n\r\n\t\t\tif (!SFileReadFile(save, buf, *pdwLen, &nread, NULL))\r\n\t\t\t\tapp_fatal(\"Unable to read save file\");\r\n#endif\r\n\t\t\t*pdwLen = codec_decode(buf, *pdwLen, password);\r\n\t\t}\r\n\t\tif (*pdwLen == 0)\r\n\t\t\tapp_fatal(\"Invalid save file\");\r\n\t}\r\n\treturn buf;\r\n}\r\n\r\nvoid pfile_update(BOOL force_save)\r\n{\r\n\t// BUGFIX: these tick values should be treated as unsigned to handle overflows correctly\r\n\tstatic int save_prev_tc;\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tint tick = GetTickCount();\r\n\t\tif (force_save || tick - save_prev_tc > 60000) {\r\n\t\t\tsave_prev_tc = tick;\r\n\t\t\tpfile_write_hero();\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/pfile.h",
    "content": "/**\r\n * @file pfile.h\r\n *\r\n * Interface of the save game encoding functionality.\r\n */\r\n#ifndef __PFILE_H__\r\n#define __PFILE_H__\r\n\r\nextern BOOL gbValidSaveFile;\r\n\r\nvoid pfile_init_save_directory();\r\nvoid pfile_write_hero();\r\nBOOL pfile_create_player_description(char *dst, DWORD len);\r\nBOOL pfile_rename_hero(const char *name_1, const char *name_2);\r\nvoid pfile_flush_W();\r\nvoid game_2_ui_player(const PlayerStruct *p, _uiheroinfo *heroinfo, BOOL bHasSaveFile);\r\nBOOL __stdcall pfile_ui_set_hero_infos(BOOL(__stdcall *ui_add_hero_info)(_uiheroinfo *));\r\nBOOL pfile_archive_contains_game(HANDLE hsArchive, DWORD save_num);\r\nBOOL __stdcall pfile_ui_set_class_stats(unsigned int player_class_nr, _uidefaultstats *class_stats);\r\nBOOL __stdcall pfile_ui_save_create(_uiheroinfo *heroinfo);\r\nBOOL __stdcall pfile_get_file_name(DWORD lvl, char *dst);\r\nBOOL __stdcall pfile_delete_save(_uiheroinfo *hero_info);\r\nvoid pfile_read_player_from_save();\r\nvoid GetTempLevelNames(char *szTemp);\r\nvoid GetPermLevelNames(char *szPerm);\r\nvoid pfile_get_game_name(char *dst);\r\nvoid pfile_remove_temp_files();\r\nvoid pfile_rename_temp_to_perm();\r\nvoid pfile_write_save_file(const char *pszName, BYTE *pbData, DWORD dwLen, DWORD qwLen);\r\nvoid pfile_strcpy(char *dst, const char *src);\r\nBYTE *pfile_read(const char *pszName, DWORD *pdwLen);\r\nvoid pfile_update(BOOL force_save);\r\n\r\n#endif /* __PFILE_H__ */\r\n"
  },
  {
    "path": "Source/player.cpp",
    "content": "/**\r\n * @file player.cpp\r\n *\r\n * Implementation of player functionality, leveling, actions, creation, loading, etc.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nint plr_lframe_size;\r\nint plr_wframe_size;\r\nBYTE plr_gfx_flag = 0;\r\nint plr_aframe_size;\r\nint myplr;\r\n#ifdef HELLFIRE\r\nPlayerStruct *plr;\r\n#else\r\nPlayerStruct plr[MAX_PLRS];\r\n#endif\r\nint plr_fframe_size;\r\nint plr_qframe_size;\r\nBOOL deathflag;\r\nint plr_hframe_size;\r\nint plr_bframe_size;\r\nBYTE plr_gfx_bflag = 0;\r\nint plr_sframe_size;\r\nint deathdelay;\r\nint plr_dframe_size;\r\n\r\n/** Maps from armor animation to letter used in graphic files. */\r\nconst char ArmourChar[4] = { 'L', 'M', 'H', 0 };\r\n/** Maps from weapon animation to letter used in graphic files. */\r\nconst char WepChar[10] = { 'N', 'U', 'S', 'D', 'B', 'A', 'M', 'H', 'T', 0 };\r\n/** Maps from player class to letter used in graphic files. */\r\nconst char CharChar[] = {\r\n\t'W',\r\n\t'R',\r\n\t'S',\r\n#ifdef HELLFIRE\r\n\t'M',\r\n\t'R',\r\n\t'W',\r\n\t0\r\n};\r\nconst char CharCharHF[] = {\r\n\t'W',\r\n\t'R',\r\n\t'S',\r\n\t'M',\r\n\t'B',\r\n\t'C',\r\n#endif\r\n\t0\r\n};\r\n\r\n/* data */\r\n\r\n/** Specifies the X-coordinate delta from the player start location in Tristram. */\r\nint plrxoff[9] = { 0, 2, 0, 2, 1, 0, 1, 2, 1 };\r\n/** Specifies the Y-coordinate delta from the player start location in Tristram. */\r\nint plryoff[9] = { 0, 2, 2, 0, 1, 1, 0, 1, 2 };\r\n/** Specifies the X-coordinate delta from a player, used for instanced when casting resurrect. */\r\nint plrxoff2[9] = { 0, 1, 0, 1, 2, 0, 1, 2, 2 };\r\n/** Specifies the Y-coordinate delta from a player, used for instanced when casting resurrect. */\r\nint plryoff2[9] = { 0, 0, 1, 1, 0, 2, 2, 1, 2 };\r\n/** Specifies the frame of each animation for which an action is triggered, for each player class. */\r\nchar PlrGFXAnimLens[NUM_CLASSES][11] = {\r\n\t{ 10, 16, 8, 2, 20, 20, 6, 20, 8, 9, 14 },\r\n\t{ 8, 18, 8, 4, 20, 16, 7, 20, 8, 10, 12 },\r\n\t{ 8, 16, 8, 6, 20, 12, 8, 20, 8, 12, 8 },\r\n#ifdef HELLFIRE\r\n\t{ 8, 16, 8, 3, 20, 18, 6, 20, 8, 12, 13 },\r\n\t{ 8, 18, 8, 4, 20, 16, 7, 20, 8, 10, 12 },\r\n\t{ 10, 16, 8, 2, 20, 20, 6, 20, 8, 9, 14 },\r\n#endif\r\n};\r\n/** Maps from player class to player velocity. */\r\nint PWVel[NUM_CLASSES][3] = {\r\n\t{ 2048, 1024, 512 },\r\n\t{ 2048, 1024, 512 },\r\n\t{ 2048, 1024, 512 },\r\n#ifdef HELLFIRE\r\n\t{ 2048, 1024, 512 },\r\n\t{ 2048, 1024, 512 },\r\n\t{ 2048, 1024, 512 },\r\n#endif\r\n};\r\n/** Total number of frames in walk animation. */\r\nint AnimLenFromClass[NUM_CLASSES] = {\r\n\t8,\r\n\t8,\r\n\t8,\r\n#ifdef HELLFIRE\r\n\t8,\r\n\t8,\r\n\t8,\r\n#endif\r\n};\r\n/** Maps from player_class to starting stat in strength. */\r\nint StrengthTbl[NUM_CLASSES] = {\r\n\t30,\r\n\t20,\r\n\t15,\r\n#ifdef HELLFIRE\r\n\t25,\r\n\t20,\r\n\t40,\r\n#endif\r\n};\r\n/** Maps from player_class to starting stat in magic. */\r\nint MagicTbl[NUM_CLASSES] = {\r\n\t// clang-format off\r\n\t10,\r\n\t15,\r\n\t35,\r\n#ifdef HELLFIRE\r\n\t15,\r\n\t20,\r\n\t 0,\r\n#endif\r\n\t// clang-format on\r\n};\r\n/** Maps from player_class to starting stat in dexterity. */\r\nint DexterityTbl[NUM_CLASSES] = {\r\n\t20,\r\n\t30,\r\n\t15,\r\n#ifdef HELLFIRE\r\n\t25,\r\n\t25,\r\n\t20,\r\n#endif\r\n};\r\n/** Maps from player_class to starting stat in vitality. */\r\nint VitalityTbl[NUM_CLASSES] = {\r\n\t25,\r\n\t20,\r\n\t20,\r\n#ifdef HELLFIRE\r\n\t20,\r\n\t20,\r\n\t25,\r\n#endif\r\n};\r\n/** Specifies the chance to block bonus of each player class.*/\r\nint ToBlkTbl[NUM_CLASSES] = {\r\n\t30,\r\n\t20,\r\n\t10,\r\n#ifdef HELLFIRE\r\n\t25,\r\n\t25,\r\n\t30,\r\n#endif\r\n};\r\nconst char *const ClassStrTblOld[] = {\r\n\t\"Warrior\",\r\n\t\"Rogue\",\r\n\t\"Sorceror\",\r\n#ifdef HELLFIRE\r\n\t\"Monk\",\r\n\t\"Bard\",\r\n\t\"Barbarian\",\r\n#endif\r\n};\r\n/** Maps from player_class to maximum stats. */\r\nint MaxStats[NUM_CLASSES][4] = {\r\n\t// clang-format off\r\n\t{ 250,  50,  60, 100 },\r\n\t{  55,  70, 250,  80 },\r\n\t{  45, 250,  85,  80 },\r\n#ifdef HELLFIRE\r\n\t{ 150,  80, 150,  80 },\r\n\t{ 120, 120, 120, 100 },\r\n\t{ 255,   0,  55, 150 },\r\n#endif\r\n\t// clang-format on\r\n};\r\n/** Specifies the experience point limit of each level. */\r\nint ExpLvlsTbl[MAXCHARLEVEL] = {\r\n\t0,\r\n\t2000,\r\n\t4620,\r\n\t8040,\r\n\t12489,\r\n\t18258,\r\n\t25712,\r\n\t35309,\r\n\t47622,\r\n\t63364,\r\n\t83419,\r\n\t108879,\r\n\t141086,\r\n\t181683,\r\n\t231075,\r\n\t313656,\r\n\t424067,\r\n\t571190,\r\n\t766569,\r\n\t1025154,\r\n\t1366227,\r\n\t1814568,\r\n\t2401895,\r\n\t3168651,\r\n\t4166200,\r\n\t5459523,\r\n\t7130496,\r\n\t9281874,\r\n\t12042092,\r\n\t15571031,\r\n\t20066900,\r\n\t25774405,\r\n\t32994399,\r\n\t42095202,\r\n\t53525811,\r\n\t67831218,\r\n\t85670061,\r\n\t107834823,\r\n\t135274799,\r\n\t169122009,\r\n\t210720231,\r\n\t261657253,\r\n\t323800420,\r\n\t399335440,\r\n\t490808349,\r\n\t601170414,\r\n\t733825617,\r\n\t892680222,\r\n\t1082908612,\r\n\t1310707109,\r\n\t1583495809\r\n};\r\nconst char *const ClassStrTbl[NUM_CLASSES] = {\r\n\t\"Warrior\",\r\n\t\"Rogue\",\r\n\t\"Sorceror\",\r\n#ifdef HELLFIRE\r\n\t\"Monk\",\r\n\t\"Rogue\",\r\n\t\"Warrior\",\r\n#endif\r\n};\r\n/** Unused local of PM_ChangeLightOff, originally for computing light radius. */\r\nBYTE fix[9] = { 0, 0, 3, 3, 3, 6, 6, 6, 8 };\r\n\r\nvoid SetPlayerGPtrs(BYTE *pData, BYTE **pAnim)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tpAnim[i] = pData + ((DWORD *)pData)[i];\r\n\t}\r\n}\r\n\r\nvoid LoadPlrGFX(int pnum, player_graphic gfxflag)\r\n{\r\n\tchar prefix[16];\r\n\tchar pszName[256];\r\n\tconst char *szCel;\r\n\tPlayerStruct *p;\r\n\tconst char *cs;\r\n\tBYTE *pData, *pAnim;\r\n\tDWORD i;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"LoadPlrGFX: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tp = &plr[pnum];\r\n#ifdef HELLFIRE\r\n\tif ((p->_pClass != PC_BARD || hfbard_mpq == NULL) && (p->_pClass != PC_BARBARIAN || hfbarb_mpq == NULL)) {\r\n#endif\r\n\t\tsprintf(prefix, \"%c%c%c\", CharChar[p->_pClass], ArmourChar[p->_pgfxnum >> 4], WepChar[p->_pgfxnum & 0xF]);\r\n\t\tcs = ClassStrTbl[p->_pClass];\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tsprintf(prefix, \"%c%c%c\", CharCharHF[p->_pClass], ArmourChar[p->_pgfxnum >> 4], WepChar[p->_pgfxnum & 0xF]);\r\n\t\tcs = ClassStrTbl[p->_pClass];\r\n\t\tcs = ClassStrTblOld[p->_pClass];\r\n\t}\r\n#endif\r\n\r\n\tfor (i = 1; i <= PFILE_NONDEATH; i <<= 1) {\r\n\t\tif (!(i & gfxflag)) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tswitch (i) {\r\n\t\tcase PFILE_STAND:\r\n\t\t\tszCel = \"AS\";\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tszCel = \"ST\";\r\n\t\t\t}\r\n\t\t\tpData = p->_pNData;\r\n\t\t\tpAnim = (BYTE *)p->_pNAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_WALK:\r\n\t\t\tszCel = \"AW\";\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tszCel = \"WL\";\r\n\t\t\t}\r\n\t\t\tpData = p->_pWData;\r\n\t\t\tpAnim = (BYTE *)p->_pWAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_ATTACK:\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tszCel = \"AT\";\r\n\t\t\tpData = p->_pAData;\r\n\t\t\tpAnim = (BYTE *)p->_pAAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_HIT:\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tszCel = \"HT\";\r\n\t\t\tpData = p->_pHData;\r\n\t\t\tpAnim = (BYTE *)p->_pHAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_LIGHTNING:\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tszCel = \"LM\";\r\n\t\t\tpData = p->_pLData;\r\n\t\t\tpAnim = (BYTE *)p->_pLAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_FIRE:\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tszCel = \"FM\";\r\n\t\t\tpData = p->_pFData;\r\n\t\t\tpAnim = (BYTE *)p->_pFAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_MAGIC:\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tszCel = \"QM\";\r\n\t\t\tpData = p->_pTData;\r\n\t\t\tpAnim = (BYTE *)p->_pTAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_DEATH:\r\n\t\t\tif (p->_pgfxnum & 0xF) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tszCel = \"DT\";\r\n\t\t\tpData = p->_pDData;\r\n\t\t\tpAnim = (BYTE *)p->_pDAnim;\r\n\t\t\tbreak;\r\n\t\tcase PFILE_BLOCK:\r\n\t\t\tif (leveltype == DTYPE_TOWN) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (!p->_pBlockFlag) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tszCel = \"BL\";\r\n\t\t\tpData = p->_pBData;\r\n\t\t\tpAnim = (BYTE *)p->_pBAnim;\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tapp_fatal(\"PLR:2\");\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tsprintf(pszName, \"PlrGFX\\\\%s\\\\%s\\\\%s%s.CL2\", cs, prefix, prefix, szCel);\r\n\t\tLoadFileWithMem(pszName, pData);\r\n\t\tSetPlayerGPtrs((BYTE *)pData, (BYTE **)pAnim);\r\n\t\tp->_pGFXLoad |= i;\r\n\t}\r\n}\r\n\r\nvoid InitPlayerGFX(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"InitPlayerGFX: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pHitPoints >> 6 == 0) {\r\n\t\tplr[pnum]._pgfxnum = 0;\r\n\t\tLoadPlrGFX(pnum, PFILE_DEATH);\r\n\t} else {\r\n\t\tLoadPlrGFX(pnum, PFILE_NONDEATH);\r\n\t}\r\n}\r\n\r\nstatic DWORD GetPlrGFXSize(const char *szCel)\r\n{\r\n\tDWORD c;\r\n\tconst char *a, *w;\r\n\tDWORD dwSize, dwMaxSize;\r\n\tHANDLE hsFile;\r\n\tchar pszName[256];\r\n\tchar Type[16];\r\n\r\n\tdwMaxSize = 0;\r\n\r\n\tfor (c = 0; c < NUM_CLASSES; c++) {\r\n#ifdef SPAWN\r\n\t\tif (c != 0)\r\n\t\t\tcontinue;\r\n#endif\r\n\t\tfor (a = &ArmourChar[0]; *a; a++) {\r\n#ifdef SPAWN\r\n\t\t\tif (a != &ArmourChar[0])\r\n\t\t\t\tbreak;\r\n#endif\r\n\t\t\tfor (w = &WepChar[0]; *w; w++) { // BUGFIX loads non-existing animagions; DT is only for N, BT is only for U, D & H\r\n#ifdef HELLFIRE\r\n\t\t\t\tif ((c == PC_BARD && hfbard_mpq == NULL) || (c == PC_BARBARIAN && hfbarb_mpq == NULL)) {\r\n#endif\r\n\t\t\t\t\tsprintf(Type, \"%c%c%c\", CharChar[c], *a, *w);\r\n\t\t\t\t\tsprintf(pszName, \"PlrGFX\\\\%s\\\\%s\\\\%s%s.CL2\", ClassStrTbl[c], Type, Type, szCel);\r\n#ifdef HELLFIRE\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsprintf(Type, \"%c%c%c\", CharCharHF[c], *a, *w);\r\n\t\t\t\t\tsprintf(pszName, \"PlrGFX\\\\%s\\\\%s\\\\%s%s.CL2\", ClassStrTblOld[c], Type, Type, szCel);\r\n\t\t\t\t}\r\n#endif\r\n\t\t\t\tif (WOpenFile(pszName, &hsFile, TRUE)) {\r\n\t\t\t\t\t/// ASSERT: assert(hsFile);\r\n\t\t\t\t\tdwSize = WGetFileSize(hsFile, NULL);\r\n\t\t\t\t\tWCloseFile(hsFile);\r\n\t\t\t\t\tif (dwMaxSize <= dwSize) {\r\n\t\t\t\t\t\tdwMaxSize = dwSize;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn dwMaxSize;\r\n}\r\n\r\nvoid InitPlrGFXMem(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"InitPlrGFXMem: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (!(plr_gfx_flag & 0x1)) { //STAND\r\n\t\tplr_gfx_flag |= 0x1;\r\n\t\tif (GetPlrGFXSize(\"ST\") > GetPlrGFXSize(\"AS\")) {\r\n\t\t\tplr_sframe_size = GetPlrGFXSize(\"ST\"); //TOWN\r\n\t\t} else {\r\n\t\t\tplr_sframe_size = GetPlrGFXSize(\"AS\"); //DUNGEON\r\n\t\t}\r\n\t}\r\n\tplr[pnum]._pNData = DiabloAllocPtr(plr_sframe_size);\r\n\r\n\tif (!(plr_gfx_flag & 0x2)) { //WALK\r\n\t\tplr_gfx_flag |= 0x2;\r\n\t\tif (GetPlrGFXSize(\"WL\") > GetPlrGFXSize(\"AW\")) {\r\n\t\t\tplr_wframe_size = GetPlrGFXSize(\"WL\"); //TOWN\r\n\t\t} else {\r\n\t\t\tplr_wframe_size = GetPlrGFXSize(\"AW\"); //DUNGEON\r\n\t\t}\r\n\t}\r\n\tplr[pnum]._pWData = DiabloAllocPtr(plr_wframe_size);\r\n\r\n\tif (!(plr_gfx_flag & 0x4)) { //ATTACK\r\n\t\tplr_gfx_flag |= 0x4;\r\n\t\tplr_aframe_size = GetPlrGFXSize(\"AT\");\r\n\t}\r\n\tplr[pnum]._pAData = DiabloAllocPtr(plr_aframe_size);\r\n\r\n\tif (!(plr_gfx_flag & 0x8)) { //HIT\r\n\t\tplr_gfx_flag |= 0x8;\r\n\t\tplr_hframe_size = GetPlrGFXSize(\"HT\");\r\n\t}\r\n\tplr[pnum]._pHData = DiabloAllocPtr(plr_hframe_size);\r\n\r\n\tif (!(plr_gfx_flag & 0x10)) { //LIGHTNING\r\n\t\tplr_gfx_flag |= 0x10;\r\n\t\tplr_lframe_size = GetPlrGFXSize(\"LM\");\r\n\t}\r\n\tplr[pnum]._pLData = DiabloAllocPtr(plr_lframe_size);\r\n\r\n\tif (!(plr_gfx_flag & 0x20)) { //FIRE\r\n\t\tplr_gfx_flag |= 0x20;\r\n\t\tplr_fframe_size = GetPlrGFXSize(\"FM\");\r\n\t}\r\n\tplr[pnum]._pFData = DiabloAllocPtr(plr_fframe_size);\r\n\r\n\tif (!(plr_gfx_flag & 0x40)) { //MAGIC\r\n\t\tplr_gfx_flag |= 0x40;\r\n\t\tplr_qframe_size = GetPlrGFXSize(\"QM\");\r\n\t}\r\n\tplr[pnum]._pTData = DiabloAllocPtr(plr_qframe_size);\r\n\r\n\tif (!(plr_gfx_flag & 0x80)) { //DEATH\r\n\t\tplr_gfx_flag |= 0x80;\r\n\t\tplr_dframe_size = GetPlrGFXSize(\"DT\");\r\n\t}\r\n\tplr[pnum]._pDData = DiabloAllocPtr(plr_dframe_size);\r\n\r\n\tif (!(plr_gfx_bflag & 0x1)) { //BLOCK\r\n\t\tplr_gfx_bflag |= 0x1;\r\n\t\tplr_bframe_size = GetPlrGFXSize(\"BL\");\r\n\t}\r\n\tplr[pnum]._pBData = DiabloAllocPtr(plr_bframe_size);\r\n\r\n\tplr[pnum]._pGFXLoad = 0;\r\n}\r\n\r\nvoid FreePlayerGFX(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"FreePlayerGFX: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tMemFreeDbg(plr[pnum]._pNData);\r\n\tMemFreeDbg(plr[pnum]._pWData);\r\n\tMemFreeDbg(plr[pnum]._pAData);\r\n\tMemFreeDbg(plr[pnum]._pHData);\r\n\tMemFreeDbg(plr[pnum]._pLData);\r\n\tMemFreeDbg(plr[pnum]._pFData);\r\n\tMemFreeDbg(plr[pnum]._pTData);\r\n\tMemFreeDbg(plr[pnum]._pDData);\r\n\tMemFreeDbg(plr[pnum]._pBData);\r\n\tplr[pnum]._pGFXLoad = 0;\r\n}\r\n\r\nvoid NewPlrAnim(int pnum, BYTE *Peq, int numFrames, int Delay, int width)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"NewPlrAnim: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pAnimData = Peq;\r\n\tplr[pnum]._pAnimLen = numFrames;\r\n\tplr[pnum]._pAnimFrame = 1;\r\n\tplr[pnum]._pAnimCnt = 0;\r\n\tplr[pnum]._pAnimDelay = Delay;\r\n\tplr[pnum]._pAnimWidth = width;\r\n\tplr[pnum]._pAnimWidth2 = (width - 64) >> 1;\r\n}\r\n\r\nvoid ClearPlrPVars(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ClearPlrPVars: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pVar1 = 0;\r\n\tplr[pnum]._pVar2 = 0;\r\n\tplr[pnum]._pVar3 = 0;\r\n\tplr[pnum]._pVar4 = 0;\r\n\tplr[pnum]._pVar5 = 0;\r\n\tplr[pnum]._pVar6 = 0;\r\n\tplr[pnum]._pVar7 = 0;\r\n\tplr[pnum]._pVar8 = 0;\r\n}\r\n\r\nvoid SetPlrAnims(int pnum)\r\n{\r\n\tint pc, gn;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SetPlrAnims: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pNWidth = 96;\r\n\tplr[pnum]._pWWidth = 96;\r\n\tplr[pnum]._pAWidth = 128;\r\n\tplr[pnum]._pHWidth = 96;\r\n\tplr[pnum]._pSWidth = 96;\r\n\tplr[pnum]._pDWidth = 128;\r\n\tplr[pnum]._pBWidth = 96;\r\n\r\n\tpc = plr[pnum]._pClass;\r\n\r\n\tif (leveltype == DTYPE_TOWN) {\r\n\t\tplr[pnum]._pNFrames = PlrGFXAnimLens[pc][7];\r\n\t\tplr[pnum]._pWFrames = PlrGFXAnimLens[pc][8];\r\n\t\tplr[pnum]._pDFrames = PlrGFXAnimLens[pc][4];\r\n\t\tplr[pnum]._pSFrames = PlrGFXAnimLens[pc][5];\r\n\t} else {\r\n\t\tplr[pnum]._pNFrames = PlrGFXAnimLens[pc][0];\r\n\t\tplr[pnum]._pWFrames = PlrGFXAnimLens[pc][2];\r\n\t\tplr[pnum]._pAFrames = PlrGFXAnimLens[pc][1];\r\n\t\tplr[pnum]._pHFrames = PlrGFXAnimLens[pc][6];\r\n\t\tplr[pnum]._pSFrames = PlrGFXAnimLens[pc][5];\r\n\t\tplr[pnum]._pDFrames = PlrGFXAnimLens[pc][4];\r\n\t\tplr[pnum]._pBFrames = PlrGFXAnimLens[pc][3];\r\n\t\tplr[pnum]._pAFNum = PlrGFXAnimLens[pc][9];\r\n\t}\r\n\tplr[pnum]._pSFNum = PlrGFXAnimLens[pc][10];\r\n\r\n\tgn = plr[pnum]._pgfxnum & 0xF;\r\n\tif (pc == PC_WARRIOR) {\r\n\t\tif (gn == ANIM_ID_BOW) {\r\n\t\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\t\tplr[pnum]._pNFrames = 8;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._pAWidth = 96;\r\n\t\t\tplr[pnum]._pAFNum = 11;\r\n\t\t} else if (gn == ANIM_ID_AXE) {\r\n\t\t\tplr[pnum]._pAFrames = 20;\r\n\t\t\tplr[pnum]._pAFNum = 10;\r\n\t\t} else if (gn == ANIM_ID_STAFF) {\r\n\t\t\tplr[pnum]._pAFrames = 16;\r\n\t\t\tplr[pnum]._pAFNum = 11;\r\n\t\t}\r\n#ifndef SPAWN\r\n\t} else if (pc == PC_ROGUE) {\r\n\t\tif (gn == ANIM_ID_AXE) {\r\n\t\t\tplr[pnum]._pAFrames = 22;\r\n\t\t\tplr[pnum]._pAFNum = 13;\r\n\t\t} else if (gn == ANIM_ID_BOW) {\r\n\t\t\tplr[pnum]._pAFrames = 12;\r\n\t\t\tplr[pnum]._pAFNum = 7;\r\n\t\t} else if (gn == ANIM_ID_STAFF) {\r\n\t\t\tplr[pnum]._pAFrames = 16;\r\n\t\t\tplr[pnum]._pAFNum = 11;\r\n\t\t}\r\n\t} else if (pc == PC_SORCERER) {\r\n\t\tplr[pnum]._pSWidth = 128;\r\n\t\tif (gn == ANIM_ID_UNARMED) {\r\n\t\t\tplr[pnum]._pAFrames = 20;\r\n\t\t} else if (gn == ANIM_ID_UNARMED_SHIELD) {\r\n\t\t\tplr[pnum]._pAFNum = 9;\r\n\t\t} else if (gn == ANIM_ID_BOW) {\r\n\t\t\tplr[pnum]._pAFrames = 20;\r\n\t\t\tplr[pnum]._pAFNum = 16;\r\n\t\t} else if (gn == ANIM_ID_AXE) {\r\n\t\t\tplr[pnum]._pAFrames = 24;\r\n\t\t\tplr[pnum]._pAFNum = 16;\r\n\t\t}\r\n#endif\r\n#ifdef HELLFIRE\r\n\t} else if (pc == PC_MONK) {\r\n\t\tplr[pnum]._pNWidth = 112;\r\n\t\tplr[pnum]._pWWidth = 112;\r\n\t\tplr[pnum]._pAWidth = 130;\r\n\t\tplr[pnum]._pHWidth = 98;\r\n\t\tplr[pnum]._pSWidth = 114;\r\n\t\tplr[pnum]._pDWidth = 160;\r\n\t\tplr[pnum]._pBWidth = 98;\r\n\r\n\t\tswitch (gn) {\r\n\t\tcase ANIM_ID_UNARMED:\r\n\t\tcase ANIM_ID_UNARMED_SHIELD:\r\n\t\t\tplr[pnum]._pAFrames = 12;\r\n\t\t\tplr[pnum]._pAFNum = 7;\r\n\t\t\tbreak;\r\n\t\tcase ANIM_ID_BOW:\r\n\t\t\tplr[pnum]._pAFrames = 20;\r\n\t\t\tplr[pnum]._pAFNum = 14;\r\n\t\t\tbreak;\r\n\t\tcase ANIM_ID_AXE:\r\n\t\t\tplr[pnum]._pAFrames = 23;\r\n\t\t\tplr[pnum]._pAFNum = 14;\r\n\t\t\tbreak;\r\n\t\tcase ANIM_ID_STAFF:\r\n\t\t\tplr[pnum]._pAFrames = 13;\r\n\t\t\tplr[pnum]._pAFNum = 8;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t} else if (pc == PC_BARD) {\r\n\t\tif (gn == ANIM_ID_AXE) {\r\n\t\t\tplr[pnum]._pAFrames = 22;\r\n\t\t\tplr[pnum]._pAFNum = 13;\r\n\t\t} else if (gn == ANIM_ID_BOW) {\r\n\t\t\tplr[pnum]._pAFrames = 12;\r\n\t\t\tplr[pnum]._pAFNum = 11;\r\n\t\t} else if (gn == ANIM_ID_STAFF) {\r\n\t\t\tplr[pnum]._pAFrames = 16;\r\n\t\t\tplr[pnum]._pAFNum = 11;\r\n\t\t} else if (gn == ANIM_ID_SWORD_SHIELD || gn == ANIM_ID_SWORD) {\r\n\t\t\tplr[pnum]._pAFNum = 10;\r\n\t\t}\r\n\t} else if (pc == PC_BARBARIAN) {\r\n\t\tif (gn == ANIM_ID_AXE) {\r\n\t\t\tplr[pnum]._pAFrames = 20;\r\n\t\t\tplr[pnum]._pAFNum = 8;\r\n\t\t} else if (gn == ANIM_ID_BOW) {\r\n\t\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\t\tplr[pnum]._pNFrames = 8;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._pAWidth = 96;\r\n\t\t\tplr[pnum]._pAFNum = 11;\r\n\t\t} else if (gn == ANIM_ID_STAFF) {\r\n\t\t\tplr[pnum]._pAFrames = 16;\r\n\t\t\tplr[pnum]._pAFNum = 11;\r\n\t\t} else if (gn == ANIM_ID_MACE || gn == ANIM_ID_MACE_SHIELD) {\r\n\t\t\tplr[pnum]._pAFNum = 8;\r\n\t\t}\r\n#endif\r\n\t}\r\n}\r\n\r\nvoid ClearPlrRVars(PlayerStruct *p)\r\n{\r\n\t// TODO: Missing debug assert p != NULL\r\n#ifdef HELLFIRE\r\n\tp->pManaShield = 0;\r\n#endif\r\n\tp->bReserved[0] = 0;\r\n\tp->bReserved[1] = 0;\r\n\tp->bReserved[2] = 0;\r\n\r\n#ifndef HELLFIRE\r\n\tp->wReflections = 0;\r\n#endif\r\n\tp->wReserved[0] = 0;\r\n\tp->wReserved[1] = 0;\r\n\tp->wReserved[2] = 0;\r\n\tp->wReserved[3] = 0;\r\n\tp->wReserved[4] = 0;\r\n\tp->wReserved[5] = 0;\r\n\tp->wReserved[6] = 0;\r\n\r\n#ifndef HELLFIRE\r\n\tp->pDifficulty = 0;\r\n\tp->pDamAcFlags = 0;\r\n#endif\r\n\tp->dwReserved[0] = 0;\r\n\tp->dwReserved[1] = 0;\r\n\tp->dwReserved[2] = 0;\r\n\tp->dwReserved[3] = 0;\r\n\tp->dwReserved[4] = 0;\r\n}\r\n\r\n/**\r\n * @param c plr_classes value\r\n */\r\nvoid CreatePlayer(int pnum, char c)\r\n{\r\n\tchar val;\r\n\tint hp, mana;\r\n\tint i;\r\n\r\n#ifdef HELLFIRE\r\n\tmemset(&plr[pnum], 0, sizeof(PlayerStruct));\r\n#endif\r\n\tClearPlrRVars(&plr[pnum]);\r\n\tSetRndSeed(GetTickCount());\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"CreatePlayer: illegal player %d\", pnum);\r\n\t}\r\n\tplr[pnum]._pClass = c;\r\n\r\n\tval = StrengthTbl[c];\r\n\tif (val < 0) {\r\n\t\tval = 0;\r\n\t}\r\n\tplr[pnum]._pStrength = val;\r\n\tplr[pnum]._pBaseStr = val;\r\n\r\n\tval = MagicTbl[c];\r\n\tif (val < 0) {\r\n\t\tval = 0;\r\n\t}\r\n\tplr[pnum]._pMagic = val;\r\n\tplr[pnum]._pBaseMag = val;\r\n\r\n\tval = DexterityTbl[c];\r\n\tif (val < 0) {\r\n\t\tval = 0;\r\n\t}\r\n\tplr[pnum]._pDexterity = val;\r\n\tplr[pnum]._pBaseDex = val;\r\n\r\n\tval = VitalityTbl[c];\r\n\tif (val < 0) {\r\n\t\tval = 0;\r\n\t}\r\n\tplr[pnum]._pVitality = val;\r\n\tplr[pnum]._pBaseVit = val;\r\n\r\n\tplr[pnum]._pStatPts = 0;\r\n\tplr[pnum].pTownWarps = 0;\r\n\tplr[pnum].pDungMsgs = 0;\r\n#ifdef HELLFIRE\r\n\tplr[pnum].pDungMsgs2 = 0;\r\n#endif\r\n\tplr[pnum].pLvlLoad = 0;\r\n\tplr[pnum].pDiabloKillLevel = 0;\r\n#ifdef HELLFIRE\r\n\tplr[pnum].pDifficulty = DIFF_NORMAL;\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum]._pClass == PC_MONK) {\r\n\t\tplr[pnum]._pDamageMod = (plr[pnum]._pStrength + plr[pnum]._pDexterity) * plr[pnum]._pLevel / 150;\r\n\t} else if (plr[pnum]._pClass == PC_ROGUE || plr[pnum]._pClass == PC_BARD) {\r\n#else\r\n\tif (plr[pnum]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\tplr[pnum]._pDamageMod = plr[pnum]._pLevel * (plr[pnum]._pStrength + plr[pnum]._pDexterity) / 200;\r\n\t} else {\r\n\t\tplr[pnum]._pDamageMod = plr[pnum]._pStrength * plr[pnum]._pLevel / 100;\r\n\t}\r\n\r\n\tplr[pnum]._pBaseToBlk = ToBlkTbl[c]; // BUGFIX: _pBaseToBlk not set in player struct if creating a New Game using an existing save file (since CreatePlayer is never invoked in this case).\r\n\r\n\tplr[pnum]._pHitPoints = (plr[pnum]._pVitality + 10) << 6;\r\n\tif (plr[pnum]._pClass == PC_WARRIOR\r\n#ifdef HELLFIRE\r\n\t    || plr[pnum]._pClass == PC_BARBARIAN\r\n#endif\r\n\t) {\r\n\t\tplr[pnum]._pHitPoints <<= 1;\r\n#ifdef HELLFIRE\r\n\t} else if (plr[pnum]._pClass == PC_ROGUE || plr[pnum]._pClass == PC_MONK || plr[pnum]._pClass == PC_BARD) {\r\n#else\r\n\t}\r\n\tif (plr[pnum]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\tplr[pnum]._pHitPoints += plr[pnum]._pHitPoints >> 1;\r\n\t}\r\n\r\n\tplr[pnum]._pMaxHP = plr[pnum]._pHitPoints;\r\n\tplr[pnum]._pHPBase = plr[pnum]._pHitPoints;\r\n\tplr[pnum]._pMaxHPBase = plr[pnum]._pHitPoints;\r\n\r\n\tplr[pnum]._pMana = plr[pnum]._pMagic << 6;\r\n\tif (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\tplr[pnum]._pMana <<= 1;\r\n#ifdef HELLFIRE\r\n\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\tplr[pnum]._pMana += plr[pnum]._pMana * 3 / 4;\r\n\t} else if (plr[pnum]._pClass == PC_ROGUE\r\n\t    || plr[pnum]._pClass == PC_MONK) {\r\n#else\r\n\t}\r\n\tif (plr[pnum]._pClass == PC_ROGUE) {\r\n#endif\r\n\t\tplr[pnum]._pMana += plr[pnum]._pMana >> 1;\r\n\t}\r\n\r\n\tplr[pnum]._pMaxMana = plr[pnum]._pMana;\r\n\tplr[pnum]._pManaBase = plr[pnum]._pMana;\r\n\tplr[pnum]._pMaxManaBase = plr[pnum]._pMana;\r\n\r\n\tplr[pnum]._pLevel = 1;\r\n\tplr[pnum]._pMaxLvl = plr[pnum]._pLevel;\r\n\tplr[pnum]._pExperience = 0;\r\n\tplr[pnum]._pMaxExp = plr[pnum]._pExperience;\r\n\tplr[pnum]._pNextExper = ExpLvlsTbl[1];\r\n\tplr[pnum]._pArmorClass = 0;\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\tplr[pnum]._pMagResist = 1;\r\n\t\tplr[pnum]._pFireResist = 1;\r\n\t\tplr[pnum]._pLghtResist = 1;\r\n\t} else {\r\n#endif\r\n\t\tplr[pnum]._pMagResist = 0;\r\n\t\tplr[pnum]._pFireResist = 0;\r\n\t\tplr[pnum]._pLghtResist = 0;\r\n#ifdef HELLFIRE\r\n\t}\r\n#endif\r\n\tplr[pnum]._pLightRad = 10;\r\n\tplr[pnum]._pInfraFlag = FALSE;\r\n\r\n\tif (c == PC_WARRIOR) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_REPAIR);\r\n#ifndef SPAWN\r\n\t} else if (c == PC_ROGUE) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_DISARM);\r\n\t} else if (c == PC_SORCERER) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_RECHARGE);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t} else if (c == PC_MONK) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_SEARCH);\r\n\t} else if (c == PC_BARD) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_IDENTIFY);\r\n\t} else if (c == PC_BARBARIAN) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_BLODBOIL);\r\n#endif\r\n\t}\r\n\r\n\tif (c == PC_SORCERER) {\r\n\t\tplr[pnum]._pMemSpells = SPELLBIT(SPL_FIREBOLT);\r\n\t} else {\r\n\t\tplr[pnum]._pMemSpells = 0;\r\n\t}\r\n\r\n\tfor (i = 0; i < sizeof(plr[pnum]._pSplLvl) / sizeof(plr[pnum]._pSplLvl[0]); i++) {\r\n\t\tplr[pnum]._pSplLvl[i] = 0;\r\n\t}\r\n\r\n\tplr[pnum]._pSpellFlags = 0;\r\n\r\n\tif (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\tplr[pnum]._pSplLvl[SPL_FIREBOLT] = 2;\r\n\t}\r\n\r\n\t// interestingly, only the first three hotkeys are reset\r\n\t// TODO: BUGFIX: clear all 4 hotkeys instead of 3 (demo leftover)\r\n\tfor (i = 0; i < 3; i++) {\r\n\t\tplr[pnum]._pSplHotKey[i] = -1;\r\n\t}\r\n\r\n\tif (c == PC_WARRIOR) {\r\n\t\tplr[pnum]._pgfxnum = ANIM_ID_SWORD_SHIELD;\r\n#ifndef SPAWN\r\n\t} else if (c == PC_ROGUE) {\r\n\t\tplr[pnum]._pgfxnum = ANIM_ID_BOW;\r\n\t} else if (c == PC_SORCERER) {\r\n\t\tplr[pnum]._pgfxnum = ANIM_ID_STAFF;\r\n#endif\r\n#ifdef HELLFIRE\r\n\t} else if (c == PC_MONK) {\r\n\t\tplr[pnum]._pgfxnum = ANIM_ID_STAFF;\r\n\t} else if (c == PC_BARD) {\r\n\t\tplr[pnum]._pgfxnum = ANIM_ID_SWORD_SHIELD;\r\n\t} else if (c == PC_BARBARIAN) {\r\n\t\tplr[pnum]._pgfxnum = ANIM_ID_SWORD_SHIELD;\r\n#endif\r\n\t}\r\n\r\n\tfor (i = 0; i < NUMLEVELS; i++) {\r\n\t\tplr[pnum]._pLvlVisited[i] = FALSE;\r\n\t}\r\n\r\n\tfor (i = 0; i < 10; i++) {\r\n\t\tplr[pnum]._pSLvlVisited[i] = FALSE;\r\n\t}\r\n\r\n\tplr[pnum]._pLvlChanging = FALSE;\r\n\tplr[pnum].pTownWarps = 0;\r\n\tplr[pnum].pLvlLoad = 0;\r\n#ifndef HELLFIRE\r\n\tplr[pnum].pBattleNet = FALSE;\r\n\tplr[pnum].pManaShield = FALSE;\r\n#else\r\n\tplr[pnum].pDamAcFlags = 0;\r\n\tplr[pnum].wReflections = 0;\r\n#endif\r\n\r\n\tInitDungMsgs(pnum);\r\n\tCreatePlrItems(pnum);\r\n\tSetRndSeed(0);\r\n}\r\n\r\nint CalcStatDiff(int pnum)\r\n{\r\n\tint c;\r\n\r\n\tc = plr[pnum]._pClass;\r\n\treturn MaxStats[c][ATTRIB_STR]\r\n\t    - plr[pnum]._pBaseStr\r\n\t    + MaxStats[c][ATTRIB_MAG]\r\n\t    - plr[pnum]._pBaseMag\r\n\t    + MaxStats[c][ATTRIB_DEX]\r\n\t    - plr[pnum]._pBaseDex\r\n\t    + MaxStats[c][ATTRIB_VIT]\r\n\t    - plr[pnum]._pBaseVit;\r\n}\r\n\r\nvoid NextPlrLevel(int pnum)\r\n{\r\n\tint hp, mana;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"NextPlrLevel: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pLevel++;\r\n\tplr[pnum]._pMaxLvl++;\r\n\r\n#ifdef HELLFIRE\r\n\tCalcPlrInv(pnum, TRUE);\r\n#endif\r\n\r\n\tif (CalcStatDiff(pnum) < 5) {\r\n\t\tplr[pnum]._pStatPts = CalcStatDiff(pnum);\r\n\t} else {\r\n\t\tplr[pnum]._pStatPts += 5;\r\n\t}\r\n\r\n\tplr[pnum]._pNextExper = ExpLvlsTbl[plr[pnum]._pLevel];\r\n\r\n\thp = plr[pnum]._pClass == PC_SORCERER ? 64 : 128;\r\n\tif (gbMaxPlayers == 1) {\r\n\t\thp++;\r\n\t}\r\n\tplr[pnum]._pMaxHP += hp;\r\n\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\tplr[pnum]._pMaxHPBase += hp;\r\n\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tdrawhpflag = TRUE;\r\n\t}\r\n\r\n\tif (plr[pnum]._pClass == PC_WARRIOR)\r\n\t\tmana = 64;\r\n#ifdef HELLFIRE\r\n\telse if (plr[pnum]._pClass == PC_BARBARIAN)\r\n\t\tmana = 0;\r\n#endif\r\n\telse\r\n\t\tmana = 128;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tmana++;\r\n\t}\r\n\tplr[pnum]._pMaxMana += mana;\r\n\tplr[pnum]._pMaxManaBase += mana;\r\n\r\n\tif (!(plr[pnum]._pIFlags & ISPL_NOMANA)) {\r\n\t\tplr[pnum]._pMana = plr[pnum]._pMaxMana;\r\n\t\tplr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;\r\n\t}\r\n\r\n\tif (pnum == myplr) {\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum]._pMana > 0)\r\n#endif\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid AddPlrExperience(int pnum, int lvl, int exp)\r\n{\r\n\tint powerLvlCap, expCap, newLvl, i;\r\n\r\n\tif (pnum != myplr) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif ((DWORD)myplr >= MAX_PLRS) {\r\n\t\tapp_fatal(\"AddPlrExperience: illegal player %d\", myplr);\r\n\t}\r\n\r\n\tif (plr[myplr]._pHitPoints <= 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Adjust xp based on difference in level between player and monster\r\n\texp *= 1 + ((double)lvl - plr[pnum]._pLevel) / 10;\r\n\tif (exp < 0) {\r\n\t\texp = 0;\r\n\t}\r\n\r\n\t// Prevent power leveling\r\n\tif (gbMaxPlayers > 1) {\r\n\t\tpowerLvlCap = plr[pnum]._pLevel < 0 ? 0 : plr[pnum]._pLevel;\r\n\t\tif (powerLvlCap >= 50) {\r\n\t\t\tpowerLvlCap = 50;\r\n\t\t}\r\n\t\t// cap to 1/20 of current levels xp\r\n\t\tif (exp >= ExpLvlsTbl[powerLvlCap] / 20) {\r\n\t\t\texp = ExpLvlsTbl[powerLvlCap] / 20;\r\n\t\t}\r\n\t\t// cap to 200 * current level\r\n\t\texpCap = 200 * powerLvlCap;\r\n\t\tif (exp >= expCap) {\r\n\t\t\texp = expCap;\r\n\t\t}\r\n\t}\r\n\r\n\tplr[pnum]._pExperience += exp;\r\n\tif ((DWORD)plr[pnum]._pExperience > MAXEXP) {\r\n\t\tplr[pnum]._pExperience = MAXEXP;\r\n\t}\r\n\r\n\tif (plr[pnum]._pExperience >= ExpLvlsTbl[49]) {\r\n\t\tplr[pnum]._pLevel = 50;\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Increase player level if applicable\r\n\tnewLvl = 0;\r\n\twhile (plr[pnum]._pExperience >= ExpLvlsTbl[newLvl]) {\r\n\t\tnewLvl++;\r\n\t}\r\n\tif (newLvl != plr[pnum]._pLevel) {\r\n\t\tfor (i = newLvl - plr[pnum]._pLevel; i > 0; i--) {\r\n\t\t\tNextPlrLevel(pnum);\r\n\t\t}\r\n\t}\r\n\r\n\tNetSendCmdParam1(FALSE, CMD_PLRLEVEL, plr[myplr]._pLevel);\r\n}\r\n\r\nvoid AddPlrMonstExper(int lvl, int exp, char pmask)\r\n{\r\n\tint totplrs, i, e;\r\n\r\n\ttotplrs = 0;\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tif ((1 << i) & pmask) {\r\n\t\t\ttotplrs++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (totplrs) {\r\n\t\te = exp / totplrs;\r\n\t\tif (pmask & (1 << myplr))\r\n\t\t\tAddPlrExperience(myplr, lvl, e);\r\n\t}\r\n}\r\n\r\nvoid InitPlayer(int pnum, BOOL FirstTime)\r\n{\r\n\tDWORD i;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"InitPlayer: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tClearPlrRVars(&plr[pnum]);\r\n\r\n\tif (FirstTime) {\r\n\t\tplr[pnum]._pRSplType = RSPLTYPE_INVALID;\r\n\t\tplr[pnum]._pRSpell = SPL_INVALID;\r\n\t\tplr[pnum]._pSBkSpell = SPL_INVALID;\r\n\t\tplr[pnum]._pSpell = plr[pnum]._pRSpell;\r\n\t\tplr[pnum]._pSplType = plr[pnum]._pRSplType;\r\n\t\tif ((plr[pnum]._pgfxnum & 0xF) == ANIM_ID_BOW) {\r\n\t\t\tplr[pnum]._pwtype = WT_RANGED;\r\n\t\t} else {\r\n\t\t\tplr[pnum]._pwtype = WT_MELEE;\r\n\t\t}\r\n#ifndef HELLFIRE\r\n\t\tplr[pnum].pManaShield = FALSE;\r\n#endif\r\n\t}\r\n\r\n\tif (plr[pnum].plrlevel == currlevel || leveldebug) {\r\n\r\n\t\tSetPlrAnims(pnum);\r\n\r\n\t\tplr[pnum]._pxoff = 0;\r\n\t\tplr[pnum]._pyoff = 0;\r\n\t\tplr[pnum]._pxvel = 0;\r\n\t\tplr[pnum]._pyvel = 0;\r\n\r\n\t\tClearPlrPVars(pnum);\r\n\r\n\t\tif (plr[pnum]._pHitPoints >> 6 > 0) {\r\n\t\t\tplr[pnum]._pmode = PM_STAND;\r\n\t\t\tNewPlrAnim(pnum, plr[pnum]._pNAnim[DIR_S], plr[pnum]._pNFrames, 3, plr[pnum]._pNWidth);\r\n\t\t\tplr[pnum]._pAnimFrame = random_(2, plr[pnum]._pNFrames - 1) + 1;\r\n\t\t\tplr[pnum]._pAnimCnt = random_(2, 3);\r\n\t\t} else {\r\n\t\t\tplr[pnum]._pmode = PM_DEATH;\r\n\t\t\tNewPlrAnim(pnum, plr[pnum]._pDAnim[DIR_S], plr[pnum]._pDFrames, 1, plr[pnum]._pDWidth);\r\n\t\t\tplr[pnum]._pAnimFrame = plr[pnum]._pAnimLen - 1;\r\n\t\t\tplr[pnum]._pVar8 = 2 * plr[pnum]._pAnimLen;\r\n\t\t}\r\n\r\n\t\tplr[pnum]._pdir = DIR_S;\r\n\t\tplr[pnum]._peflag = 0;\r\n\r\n\t\tif (pnum == myplr) {\r\n\t\t\tif (!FirstTime || currlevel != 0) {\r\n\t\t\t\tplr[pnum]._px = ViewX;\r\n\t\t\t\tplr[pnum]._py = ViewY;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._ptargx = plr[pnum]._px;\r\n\t\t\tplr[pnum]._ptargy = plr[pnum]._py;\r\n\t\t} else {\r\n\t\t\tplr[pnum]._ptargx = plr[pnum]._px;\r\n\t\t\tplr[pnum]._ptargy = plr[pnum]._py;\r\n\t\t\tfor (i = 0; i < 8 && !PosOkPlayer(pnum, plrxoff2[i] + plr[pnum]._px, plryoff2[i] + plr[pnum]._py); i++)\r\n\t\t\t\t;\r\n\t\t\tplr[pnum]._px += plrxoff2[i];\r\n\t\t\tplr[pnum]._py += plryoff2[i];\r\n\t\t}\r\n\r\n\t\tplr[pnum]._pfutx = plr[pnum]._px;\r\n\t\tplr[pnum]._pfuty = plr[pnum]._py;\r\n\t\tplr[pnum].walkpath[0] = WALK_NONE;\r\n\t\tplr[pnum].destAction = ACTION_NONE;\r\n\r\n\t\tif (pnum == myplr) {\r\n\t\t\tplr[pnum]._plid = AddLight(plr[pnum]._px, plr[pnum]._py, plr[pnum]._pLightRad);\r\n\t\t} else {\r\n\t\t\tplr[pnum]._plid = -1;\r\n\t\t}\r\n\t\tplr[pnum]._pvid = AddVision(plr[pnum]._px, plr[pnum]._py, plr[pnum]._pLightRad, pnum == myplr);\r\n\t}\r\n\r\n\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_REPAIR);\r\n#ifndef SPAWN\r\n\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_DISARM);\r\n\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_RECHARGE);\r\n#ifdef HELLFIRE\r\n\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_SEARCH);\r\n\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_IDENTIFY);\r\n\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\tplr[pnum]._pAblSpells = SPELLBIT(SPL_BLODBOIL);\r\n#endif\r\n#endif\r\n\t}\r\n\r\n#ifdef _DEBUG\r\n\tif (debug_mode_dollar_sign && FirstTime) {\r\n\t\tplr[pnum]._pMemSpells |= 1 << (SPL_TELEPORT - 1);\r\n\t\tif (!plr[myplr]._pSplLvl[SPL_TELEPORT]) {\r\n\t\t\tplr[myplr]._pSplLvl[SPL_TELEPORT] = 1;\r\n\t\t}\r\n\t}\r\n\tif (debug_mode_key_inverted_v && FirstTime) {\r\n\t\tplr[pnum]._pMemSpells = SPL_INVALID;\r\n\t}\r\n#endif\r\n\r\n\tplr[pnum]._pNextExper = ExpLvlsTbl[plr[pnum]._pLevel];\r\n\tplr[pnum]._pInvincible = FALSE;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tdeathdelay = 0;\r\n\t\tdeathflag = FALSE;\r\n\t\tScrollInfo._sxoff = 0;\r\n\t\tScrollInfo._syoff = 0;\r\n\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t}\r\n}\r\n\r\nvoid InitMultiView()\r\n{\r\n\tif ((DWORD)myplr >= MAX_PLRS) {\r\n\t\tapp_fatal(\"InitPlayer: illegal player %d\", myplr);\r\n\t}\r\n\r\n\tViewX = plr[myplr]._px;\r\n\tViewY = plr[myplr]._py;\r\n}\r\n\r\nvoid CheckEFlag(int pnum, BOOL flag)\r\n{\r\n\tint x, y, i;\r\n\tint bitflags;\r\n\tMICROS *pieces;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"InitPlayer: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tx = plr[pnum]._px - 1;\r\n\ty = plr[pnum]._py + 1;\r\n\tbitflags = 0;\r\n\tpieces = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tfor (i = 2; i < 10; i++) {\r\n\t\tbitflags |= pieces->mt[i];\r\n\t}\r\n\r\n\tif (bitflags | nSolidTable[dPiece[x][y]] | dSpecial[x][y]) {\r\n\t\tplr[pnum]._peflag = 1;\r\n\t} else {\r\n\t\tplr[pnum]._peflag = 0;\r\n\t}\r\n\r\n\tif (flag != 1 || plr[pnum]._peflag != 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tx = plr[pnum]._px;\r\n\ty = plr[pnum]._py + 2;\r\n\tbitflags = 0;\r\n\tpieces = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tfor (i = 2; i < 10; i++) {\r\n\t\tbitflags |= pieces->mt[i];\r\n\t}\r\n\r\n\tif (bitflags | dSpecial[x][y]) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tx = plr[pnum]._px - 2;\r\n\ty = plr[pnum]._py + 1;\r\n\tbitflags = 0;\r\n\tpieces = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tfor (i = 2; i < 10; i++) {\r\n\t\tbitflags |= pieces->mt[i];\r\n\t}\r\n\r\n\tif (bitflags | dSpecial[x][y]) {\r\n\t\tplr[pnum]._peflag = 2;\r\n\t}\r\n}\r\n\r\nBOOL SolidLoc(int x, int y)\r\n{\r\n#ifndef HELLFIRE\r\n\tif (x < 0 || y < 0 || x >= MAXDUNX || y >= MAXDUNY) {\r\n\t\treturn FALSE;\r\n\t}\r\n#endif\r\n\r\n\treturn nSolidTable[dPiece[x][y]];\r\n}\r\n\r\nBOOL PlrDirOK(int pnum, int dir)\r\n{\r\n\tint px, py;\r\n\tBOOL isOk;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PlrDirOK: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tpx = plr[pnum]._px + offset_x[dir];\r\n\tpy = plr[pnum]._py + offset_y[dir];\r\n\r\n\tif (px < 0 || !dPiece[px][py] || !PosOkPlayer(pnum, px, py)) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tisOk = TRUE;\r\n\tif (dir == DIR_E) {\r\n\t\tisOk = !SolidLoc(px, py + 1) && !(dFlags[px][py + 1] & BFLAG_PLAYERLR);\r\n\t}\r\n\r\n\tif (isOk && dir == DIR_W) {\r\n\t\tisOk = !SolidLoc(px + 1, py) && !(dFlags[px + 1][py] & BFLAG_PLAYERLR);\r\n\t}\r\n\r\n\treturn isOk;\r\n}\r\n\r\nvoid PlrClrTrans(int x, int y)\r\n{\r\n\tint i, j;\r\n\r\n\tfor (i = y - 1; i <= y + 1; i++) {\r\n\t\tfor (j = x - 1; j <= x + 1; j++) {\r\n\t\t\tTransList[dTransVal[j][i]] = FALSE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid PlrDoTrans(int x, int y)\r\n{\r\n\tint i, j;\r\n\r\n\tif (leveltype != DTYPE_CATHEDRAL && leveltype != DTYPE_CATACOMBS) {\r\n\t\tTransList[1] = TRUE;\r\n\t} else {\r\n\t\tfor (i = y - 1; i <= y + 1; i++) {\r\n\t\t\tfor (j = x - 1; j <= x + 1; j++) {\r\n\t\t\t\tif (!nSolidTable[dPiece[j][i]] && dTransVal[j][i]) {\r\n\t\t\t\t\tTransList[dTransVal[j][i]] = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetPlayerOld(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SetPlayerOld: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._poldx = plr[pnum]._px;\r\n\tplr[pnum]._poldy = plr[pnum]._py;\r\n}\r\n\r\nvoid FixPlayerLocation(int pnum, int bDir)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"FixPlayerLocation: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pfutx = plr[pnum]._px;\r\n\tplr[pnum]._pfuty = plr[pnum]._py;\r\n\tplr[pnum]._ptargx = plr[pnum]._px;\r\n\tplr[pnum]._ptargy = plr[pnum]._py;\r\n\tplr[pnum]._pxoff = 0;\r\n\tplr[pnum]._pyoff = 0;\r\n\tCheckEFlag(pnum, FALSE);\r\n\tplr[pnum]._pdir = bDir;\r\n\tif (pnum == myplr) {\r\n\t\tScrollInfo._sxoff = 0;\r\n\t\tScrollInfo._syoff = 0;\r\n\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t\tViewX = plr[pnum]._px;\r\n\t\tViewY = plr[pnum]._py;\r\n\t}\r\n}\r\n\r\nvoid StartStand(int pnum, int dir)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartStand: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (!plr[pnum]._pInvincible || plr[pnum]._pHitPoints != 0 || pnum != myplr) {\r\n\t\tif (!(plr[pnum]._pGFXLoad & PFILE_STAND)) {\r\n\t\t\tLoadPlrGFX(pnum, PFILE_STAND);\r\n\t\t}\r\n\r\n\t\tNewPlrAnim(pnum, plr[pnum]._pNAnim[dir], plr[pnum]._pNFrames, 3, plr[pnum]._pNWidth);\r\n\t\tplr[pnum]._pmode = PM_STAND;\r\n\t\tFixPlayerLocation(pnum, dir);\r\n\t\tFixPlrWalkTags(pnum);\r\n\t\tdPlayer[plr[pnum]._px][plr[pnum]._py] = pnum + 1;\r\n\t\tSetPlayerOld(pnum);\r\n\t} else {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t}\r\n}\r\n\r\nvoid StartWalkStand(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartWalkStand: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pmode = PM_STAND;\r\n\tplr[pnum]._pfutx = plr[pnum]._px;\r\n\tplr[pnum]._pfuty = plr[pnum]._py;\r\n\tplr[pnum]._pxoff = 0;\r\n\tplr[pnum]._pyoff = 0;\r\n\r\n\tCheckEFlag(pnum, FALSE);\r\n\r\n\tif (pnum == myplr) {\r\n\t\tScrollInfo._sxoff = 0;\r\n\t\tScrollInfo._syoff = 0;\r\n\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t\tViewX = plr[pnum]._px;\r\n\t\tViewY = plr[pnum]._py;\r\n\t}\r\n}\r\n\r\nvoid PM_ChangeLightOff(int pnum)\r\n{\r\n\tint x, y;\r\n\tint xmul, ymul;\r\n\tint lx, ly;\r\n\tint offx, offy;\r\n\tconst LightListStruct *l;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_ChangeLightOff: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tl = &LightList[plr[pnum]._plid];\r\n\tx = 2 * plr[pnum]._pyoff + plr[pnum]._pxoff;\r\n\ty = 2 * plr[pnum]._pyoff - plr[pnum]._pxoff;\r\n\tif (x < 0) {\r\n\t\txmul = -1;\r\n\t\tx = -x;\r\n\t} else {\r\n\t\txmul = 1;\r\n\t}\r\n\tif (y < 0) {\r\n\t\tymul = -1;\r\n\t\ty = -y;\r\n\t} else {\r\n\t\tymul = 1;\r\n\t}\r\n\r\n\tx = (x >> 3) * xmul;\r\n\ty = (y >> 3) * ymul;\r\n\tlx = x + (l->_lx << 3);\r\n\tly = y + (l->_ly << 3);\r\n\toffx = l->_xoff + (l->_lx << 3);\r\n\toffy = l->_yoff + (l->_ly << 3);\r\n\r\n\tif (abs(lx - offx) < 3 && abs(ly - offy) < 3)\r\n\t\treturn;\r\n\r\n\tChangeLightOff(plr[pnum]._plid, x, y);\r\n}\r\n\r\nvoid PM_ChangeOffset(int pnum)\r\n{\r\n\tint px, py;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_ChangeOffset: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pVar8++;\r\n\tpx = plr[pnum]._pVar6 >> 8;\r\n\tpy = plr[pnum]._pVar7 >> 8;\r\n\r\n\tplr[pnum]._pVar6 += plr[pnum]._pxvel;\r\n\tplr[pnum]._pVar7 += plr[pnum]._pyvel;\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 0 && jogging_opt) {\r\n\t\tplr[pnum]._pVar6 += plr[pnum]._pxvel;\r\n\t\tplr[pnum]._pVar7 += plr[pnum]._pyvel;\r\n\t}\r\n#endif\r\n\r\n\tplr[pnum]._pxoff = plr[pnum]._pVar6 >> 8;\r\n\tplr[pnum]._pyoff = plr[pnum]._pVar7 >> 8;\r\n\r\n\tpx -= plr[pnum]._pVar6 >> 8;\r\n\tpy -= plr[pnum]._pVar7 >> 8;\r\n\r\n\tif (pnum == myplr && ScrollInfo._sdir) {\r\n\t\tScrollInfo._sxoff += px;\r\n\t\tScrollInfo._syoff += py;\r\n\t}\r\n\r\n\tPM_ChangeLightOff(pnum);\r\n}\r\n\r\n/**\r\n * @brief Starting a move action towards NW, N, or NE\r\n */\r\nvoid StartWalk(int pnum, int xvel, int yvel, int xadd, int yadd, int EndDir, int sdir)\r\n{\r\n\tint px, py;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartWalk: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tSetPlayerOld(pnum);\r\n\r\n\tpx = xadd + plr[pnum]._px;\r\n\tpy = yadd + plr[pnum]._py;\r\n\r\n\tif (!PlrDirOK(pnum, EndDir)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tplr[pnum]._pfutx = px;\r\n\tplr[pnum]._pfuty = py;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tScrollInfo._sdx = plr[pnum]._px - ViewX;\r\n\t\tScrollInfo._sdy = plr[pnum]._py - ViewY;\r\n\t}\r\n\r\n\tdPlayer[px][py] = -(pnum + 1);\r\n\tplr[pnum]._pmode = PM_WALK;\r\n\tplr[pnum]._pxvel = xvel;\r\n\tplr[pnum]._pyvel = yvel;\r\n\tplr[pnum]._pxoff = 0;\r\n\tplr[pnum]._pyoff = 0;\r\n\tplr[pnum]._pVar1 = xadd;\r\n\tplr[pnum]._pVar2 = yadd;\r\n\tplr[pnum]._pVar3 = EndDir;\r\n\r\n\tif (!(plr[pnum]._pGFXLoad & PFILE_WALK)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_WALK);\r\n\t}\r\n\r\n\tNewPlrAnim(pnum, plr[pnum]._pWAnim[EndDir], plr[pnum]._pWFrames, 0, plr[pnum]._pWWidth);\r\n\r\n\tplr[pnum]._pdir = EndDir;\r\n\tplr[pnum]._pVar6 = 0;\r\n\tplr[pnum]._pVar7 = 0;\r\n\tplr[pnum]._pVar8 = 0;\r\n\r\n\tCheckEFlag(pnum, FALSE);\r\n\r\n\tif (pnum != myplr) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (zoomflag) {\r\n\t\tif (abs(ScrollInfo._sdx) >= 3 || abs(ScrollInfo._sdy) >= 3) {\r\n\t\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t\t} else {\r\n\t\t\tScrollInfo._sdir = sdir;\r\n\t\t}\r\n\t} else if (abs(ScrollInfo._sdx) >= 2 || abs(ScrollInfo._sdy) >= 2) {\r\n\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t} else {\r\n\t\tScrollInfo._sdir = sdir;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Starting a move action towards SW, S, or SE\r\n */\r\nvoid StartWalk2(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int EndDir, int sdir)\r\n{\r\n\tint px, py;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartWalk2: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tSetPlayerOld(pnum);\r\n\tpx = xadd + plr[pnum]._px;\r\n\tpy = yadd + plr[pnum]._py;\r\n\r\n\tif (!PlrDirOK(pnum, EndDir)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tplr[pnum]._pfutx = px;\r\n\tplr[pnum]._pfuty = py;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tScrollInfo._sdx = plr[pnum]._px - ViewX;\r\n\t\tScrollInfo._sdy = plr[pnum]._py - ViewY;\r\n\t}\r\n\r\n\tdPlayer[plr[pnum]._px][plr[pnum]._py] = -1 - pnum;\r\n\tplr[pnum]._pVar1 = plr[pnum]._px;\r\n\tplr[pnum]._pVar2 = plr[pnum]._py;\r\n\tplr[pnum]._px = px; // Move player to the next tile to maintain correct render order\r\n\tplr[pnum]._py = py;\r\n\tdPlayer[plr[pnum]._px][plr[pnum]._py] = pnum + 1;\r\n\tplr[pnum]._pxoff = xoff; // Offset player sprite to align with their previous tile position\r\n\tplr[pnum]._pyoff = yoff;\r\n\r\n\t// BUGFIX: missing `if (leveltype != DTYPE_TOWN) {` for call to ChangeLightXY and PM_ChangeLightOff.\r\n\tChangeLightXY(plr[pnum]._plid, plr[pnum]._px, plr[pnum]._py);\r\n\tPM_ChangeLightOff(pnum);\r\n\r\n\tplr[pnum]._pmode = PM_WALK2;\r\n\tplr[pnum]._pxvel = xvel;\r\n\tplr[pnum]._pyvel = yvel;\r\n\tplr[pnum]._pVar6 = xoff << 8;\r\n\tplr[pnum]._pVar7 = yoff << 8;\r\n\tplr[pnum]._pVar3 = EndDir;\r\n\r\n\tif (!(plr[pnum]._pGFXLoad & PFILE_WALK)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_WALK);\r\n\t}\r\n\tNewPlrAnim(pnum, plr[pnum]._pWAnim[EndDir], plr[pnum]._pWFrames, 0, plr[pnum]._pWWidth);\r\n\r\n\tplr[pnum]._pdir = EndDir;\r\n\tplr[pnum]._pVar8 = 0;\r\n\r\n\tif (EndDir == DIR_SE) {\r\n\t\tCheckEFlag(pnum, TRUE);\r\n\t} else {\r\n\t\tCheckEFlag(pnum, FALSE);\r\n\t}\r\n\r\n\tif (pnum != myplr) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (zoomflag) {\r\n\t\tif (abs(ScrollInfo._sdx) >= 3 || abs(ScrollInfo._sdy) >= 3) {\r\n\t\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t\t} else {\r\n\t\t\tScrollInfo._sdir = sdir;\r\n\t\t}\r\n\t} else if (abs(ScrollInfo._sdx) >= 2 || abs(ScrollInfo._sdy) >= 2) {\r\n\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t} else {\r\n\t\tScrollInfo._sdir = sdir;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Starting a move action towards W or E\r\n */\r\nvoid StartWalk3(int pnum, int xvel, int yvel, int xoff, int yoff, int xadd, int yadd, int mapx, int mapy, int EndDir, int sdir)\r\n{\r\n\tint px, py, x, y;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartWalk3: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tSetPlayerOld(pnum);\r\n\tpx = xadd + plr[pnum]._px;\r\n\tpy = yadd + plr[pnum]._py;\r\n\tx = mapx + plr[pnum]._px;\r\n\ty = mapy + plr[pnum]._py;\r\n\r\n\tif (!PlrDirOK(pnum, EndDir)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tplr[pnum]._pfutx = px;\r\n\tplr[pnum]._pfuty = py;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tScrollInfo._sdx = plr[pnum]._px - ViewX;\r\n\t\tScrollInfo._sdy = plr[pnum]._py - ViewY;\r\n\t}\r\n\r\n\tdPlayer[plr[pnum]._px][plr[pnum]._py] = -1 - pnum;\r\n\tdPlayer[px][py] = -1 - pnum;\r\n\tplr[pnum]._pVar4 = x;\r\n\tplr[pnum]._pVar5 = y;\r\n\tdFlags[x][y] |= BFLAG_PLAYERLR;\r\n\tplr[pnum]._pxoff = xoff; // Offset player sprite to align with their previous tile position\r\n\tplr[pnum]._pyoff = yoff;\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tChangeLightXY(plr[pnum]._plid, x, y);\r\n\t\tPM_ChangeLightOff(pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pmode = PM_WALK3;\r\n\tplr[pnum]._pxvel = xvel;\r\n\tplr[pnum]._pyvel = yvel;\r\n\tplr[pnum]._pVar1 = px;\r\n\tplr[pnum]._pVar2 = py;\r\n\tplr[pnum]._pVar6 = xoff << 8;\r\n\tplr[pnum]._pVar7 = yoff << 8;\r\n\tplr[pnum]._pVar3 = EndDir;\r\n\r\n\tif (!(plr[pnum]._pGFXLoad & PFILE_WALK)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_WALK);\r\n\t}\r\n\tNewPlrAnim(pnum, plr[pnum]._pWAnim[EndDir], plr[pnum]._pWFrames, 0, plr[pnum]._pWWidth);\r\n\r\n\tplr[pnum]._pdir = EndDir;\r\n\tplr[pnum]._pVar8 = 0;\r\n\r\n\tCheckEFlag(pnum, FALSE);\r\n\r\n\tif (pnum != myplr) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (zoomflag) {\r\n\t\tif (abs(ScrollInfo._sdx) >= 3 || abs(ScrollInfo._sdy) >= 3) {\r\n\t\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t\t} else {\r\n\t\t\tScrollInfo._sdir = sdir;\r\n\t\t}\r\n\t} else if (abs(ScrollInfo._sdx) >= 2 || abs(ScrollInfo._sdy) >= 2) {\r\n\t\tScrollInfo._sdir = SDIR_NONE;\r\n\t} else {\r\n\t\tScrollInfo._sdir = sdir;\r\n\t}\r\n}\r\n\r\nvoid StartAttack(int pnum, int d)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartAttack: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!(plr[pnum]._pGFXLoad & PFILE_ATTACK)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_ATTACK);\r\n\t}\r\n\r\n\tNewPlrAnim(pnum, plr[pnum]._pAAnim[d], plr[pnum]._pAFrames, 0, plr[pnum]._pAWidth);\r\n\tplr[pnum]._pmode = PM_ATTACK;\r\n\tFixPlayerLocation(pnum, d);\r\n\tSetPlayerOld(pnum);\r\n}\r\n\r\nvoid StartRangeAttack(int pnum, int d, int cx, int cy)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartRangeAttack: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!(plr[pnum]._pGFXLoad & PFILE_ATTACK)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_ATTACK);\r\n\t}\r\n\tNewPlrAnim(pnum, plr[pnum]._pAAnim[d], plr[pnum]._pAFrames, 0, plr[pnum]._pAWidth);\r\n\r\n\tplr[pnum]._pmode = PM_RATTACK;\r\n\tFixPlayerLocation(pnum, d);\r\n\tSetPlayerOld(pnum);\r\n\tplr[pnum]._pVar1 = cx;\r\n\tplr[pnum]._pVar2 = cy;\r\n}\r\n\r\nvoid StartPlrBlock(int pnum, int dir)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartPlrBlock: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tPlaySfxLoc(IS_ISWORD, plr[pnum]._px, plr[pnum]._py);\r\n\r\n\tif (!(plr[pnum]._pGFXLoad & PFILE_BLOCK)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_BLOCK);\r\n\t}\r\n\tNewPlrAnim(pnum, plr[pnum]._pBAnim[dir], plr[pnum]._pBFrames, 2, plr[pnum]._pBWidth);\r\n\r\n\tplr[pnum]._pmode = PM_BLOCK;\r\n\tFixPlayerLocation(pnum, dir);\r\n\tSetPlayerOld(pnum);\r\n}\r\n\r\nvoid StartSpell(int pnum, int d, int cx, int cy)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS)\r\n\t\tapp_fatal(\"StartSpell: illegal player %d\", pnum);\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tswitch (spelldata[plr[pnum]._pSpell].sType) {\r\n\t\tcase STYPE_FIRE:\r\n\t\t\tif (!(plr[pnum]._pGFXLoad & PFILE_FIRE)) {\r\n\t\t\t\tLoadPlrGFX(pnum, PFILE_FIRE);\r\n\t\t\t}\r\n\t\t\tNewPlrAnim(pnum, plr[pnum]._pFAnim[d], plr[pnum]._pSFrames, 0, plr[pnum]._pSWidth);\r\n\t\t\tbreak;\r\n\t\tcase STYPE_LIGHTNING:\r\n\t\t\tif (!(plr[pnum]._pGFXLoad & PFILE_LIGHTNING)) {\r\n\t\t\t\tLoadPlrGFX(pnum, PFILE_LIGHTNING);\r\n\t\t\t}\r\n\t\t\tNewPlrAnim(pnum, plr[pnum]._pLAnim[d], plr[pnum]._pSFrames, 0, plr[pnum]._pSWidth);\r\n\t\t\tbreak;\r\n\t\tcase STYPE_MAGIC:\r\n\t\t\tif (!(plr[pnum]._pGFXLoad & PFILE_MAGIC)) {\r\n\t\t\t\tLoadPlrGFX(pnum, PFILE_MAGIC);\r\n\t\t\t}\r\n\t\t\tNewPlrAnim(pnum, plr[pnum]._pTAnim[d], plr[pnum]._pSFrames, 0, plr[pnum]._pSWidth);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tPlaySfxLoc(spelldata[plr[pnum]._pSpell].sSFX, plr[pnum]._px, plr[pnum]._py);\r\n\r\n\tplr[pnum]._pmode = PM_SPELL;\r\n\r\n\tFixPlayerLocation(pnum, d);\r\n\tSetPlayerOld(pnum);\r\n\r\n\tplr[pnum]._pVar1 = cx;\r\n\tplr[pnum]._pVar2 = cy;\r\n\tplr[pnum]._pVar4 = GetSpellLevel(pnum, plr[pnum]._pSpell);\r\n\tplr[pnum]._pVar8 = 1;\r\n}\r\n\r\nvoid FixPlrWalkTags(int pnum)\r\n{\r\n\tint pp, pn;\r\n\tint dx, dy, y, x;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"FixPlrWalkTags: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tpp = pnum + 1;\r\n\tpn = -(pnum + 1);\r\n\tdx = plr[pnum]._poldx;\r\n\tdy = plr[pnum]._poldy;\r\n\tfor (y = dy - 1; y <= dy + 1; y++) {\r\n\t\tfor (x = dx - 1; x <= dx + 1; x++) {\r\n\t\t\tif (x >= 0 && x < MAXDUNX && y >= 0 && y < MAXDUNY && (dPlayer[x][y] == pp || dPlayer[x][y] == pn)) {\r\n\t\t\t\tdPlayer[x][y] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (dx >= 0 && dx < MAXDUNX - 1 && dy >= 0 && dy < MAXDUNY - 1) {\r\n\t\tdFlags[dx + 1][dy] &= ~BFLAG_PLAYERLR;\r\n\t\tdFlags[dx][dy + 1] &= ~BFLAG_PLAYERLR;\r\n\t}\r\n}\r\n\r\nvoid RemovePlrFromMap(int pnum)\r\n{\r\n\tint x, y;\r\n\tint pp, pn;\r\n\r\n\tpp = pnum + 1;\r\n\tpn = -(pnum + 1);\r\n\r\n\tfor (y = 1; y < MAXDUNY; y++)\r\n\t\tfor (x = 1; x < MAXDUNX; x++)\r\n\t\t\tif (dPlayer[x][y - 1] == pn || dPlayer[x - 1][y] == pn)\r\n\t\t\t\tif (dFlags[x][y] & BFLAG_PLAYERLR)\r\n\t\t\t\t\tdFlags[x][y] &= ~BFLAG_PLAYERLR;\r\n\r\n\tfor (y = 0; y < MAXDUNY; y++)\r\n\t\tfor (x = 0; x < MAXDUNX; x++)\r\n\t\t\tif (dPlayer[x][y] == pp || dPlayer[x][y] == pn)\r\n\t\t\t\tdPlayer[x][y] = 0;\r\n}\r\n\r\nvoid StartPlrHit(int pnum, int dam, BOOL forcehit)\r\n{\r\n\tint pd;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartPlrHit: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pInvincible && plr[pnum]._pHitPoints == 0 && pnum == myplr) {\r\n\t\tSyncPlrKill(pnum, -1);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\tPlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py);\r\n#ifndef SPAWN\r\n\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\tPlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py);\r\n\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\tPlaySfxLoc(PS_MAGE69, plr[pnum]._px, plr[pnum]._py);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\tPlaySfxLoc(PS_MONK69, plr[pnum]._px, plr[pnum]._py);\r\n\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\tPlaySfxLoc(PS_ROGUE69, plr[pnum]._px, plr[pnum]._py);\r\n\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\tPlaySfxLoc(PS_WARR69, plr[pnum]._px, plr[pnum]._py);\r\n#endif\r\n\t}\r\n\r\n\tdrawhpflag = TRUE;\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\tif (dam >> 6 < plr[pnum]._pLevel + plr[pnum]._pLevel / 4 && !forcehit) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else\r\n#endif\r\n\t    if (dam >> 6 < plr[pnum]._pLevel && !forcehit) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tpd = plr[pnum]._pdir;\r\n\r\n\tif (!(plr[pnum]._pGFXLoad & PFILE_HIT)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_HIT);\r\n\t}\r\n\tNewPlrAnim(pnum, plr[pnum]._pHAnim[pd], plr[pnum]._pHFrames, 0, plr[pnum]._pHWidth);\r\n\r\n\tplr[pnum]._pmode = PM_GOTHIT;\r\n\tFixPlayerLocation(pnum, pd);\r\n\tplr[pnum]._pVar8 = 1;\r\n\tFixPlrWalkTags(pnum);\r\n\tdPlayer[plr[pnum]._px][plr[pnum]._py] = pnum + 1;\r\n\tSetPlayerOld(pnum);\r\n}\r\n\r\nvoid RespawnDeadItem(ItemStruct *itm, int x, int y)\r\n{\r\n\tint ii;\r\n\r\n\tif (numitems >= MAXITEMS) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (FindGetItem(itm->IDidx, itm->_iCreateInfo, itm->_iSeed) >= 0) {\r\n\t\tDrawInvMsg(\"A duplicate item has been detected.  Destroying duplicate...\");\r\n\t\tSyncGetItem(x, y, itm->IDidx, itm->_iCreateInfo, itm->_iSeed);\r\n\t}\r\n\r\n\tii = itemavail[0];\r\n\tdItem[x][y] = ii + 1;\r\n\titemavail[0] = itemavail[MAXITEMS - numitems - 1];\r\n\titemactive[numitems] = ii;\r\n\titem[ii] = *itm;\r\n\titem[ii]._ix = x;\r\n\titem[ii]._iy = y;\r\n\tRespawnItem(ii, TRUE);\r\n\tnumitems++;\r\n\titm->_itype = ITYPE_NONE;\r\n}\r\n\r\nstatic void PlrDeadItem(int pnum, ItemStruct *itm, int xx, int yy)\r\n{\r\n\tint x, y;\r\n\tint i, j, k;\r\n\r\n\tif (itm->_itype == ITYPE_NONE)\r\n\t\treturn;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PlrDeadItem: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tx = xx + plr[pnum]._px;\r\n\ty = yy + plr[pnum]._py;\r\n\tif ((xx || yy) && ItemSpaceOk(x, y)) {\r\n\t\tRespawnDeadItem(itm, x, y);\r\n\t\tplr[pnum].HoldItem = *itm;\r\n\t\tNetSendCmdPItem(FALSE, CMD_RESPAWNITEM, x, y);\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (k = 1; k < 50; k++) {\r\n\t\tfor (j = -k; j <= k; j++) {\r\n\t\t\ty = j + plr[pnum]._py;\r\n\t\t\tfor (i = -k; i <= k; i++) {\r\n\t\t\t\tx = i + plr[pnum]._px;\r\n\t\t\t\tif (ItemSpaceOk(x, y)) {\r\n\t\t\t\t\tRespawnDeadItem(itm, x, y);\r\n\t\t\t\t\tplr[pnum].HoldItem = *itm;\r\n\t\t\t\t\tNetSendCmdPItem(FALSE, CMD_RESPAWNITEM, x, y);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid StartPlayerKill(int pnum, int earflag)\r\n{\r\n\tBOOL diablolevel;\r\n\tint i, pdd;\r\n\tPlayerStruct *p;\r\n\tItemStruct ear;\r\n\tItemStruct *pi;\r\n\r\n\tp = &plr[pnum];\r\n\tif (p->_pHitPoints <= 0 && p->_pmode == PM_DEATH) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (myplr == pnum) {\r\n\t\tNetSendCmdParam1(TRUE, CMD_PLRDEAD, earflag);\r\n\t}\r\n\r\n\tdiablolevel = gbMaxPlayers > 1 && plr[pnum].plrlevel == 16;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartPlayerKill: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\tPlaySfxLoc(PS_DEAD, p->_px, p->_py); // BUGFIX: should use `PS_WARR71` like other classes\r\n#ifndef SPAWN\r\n\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\tPlaySfxLoc(PS_ROGUE71, p->_px, p->_py);\r\n\t} else if (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\tPlaySfxLoc(PS_MAGE71, p->_px, p->_py);\r\n#ifdef HELLFIRE\r\n\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\tPlaySfxLoc(PS_MONK71, p->_px, p->_py);\r\n\t} else if (plr[pnum]._pClass == PC_BARD) {\r\n\t\tPlaySfxLoc(PS_ROGUE71, p->_px, p->_py);\r\n\t} else if (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\tPlaySfxLoc(PS_WARR71, p->_px, p->_py);\r\n#endif\r\n#endif\r\n\t}\r\n\r\n\tif (p->_pgfxnum) {\r\n\t\tp->_pgfxnum = 0;\r\n\t\tp->_pGFXLoad = 0;\r\n\t\tSetPlrAnims(pnum);\r\n\t}\r\n\r\n\tif (!(p->_pGFXLoad & PFILE_DEATH)) {\r\n\t\tLoadPlrGFX(pnum, PFILE_DEATH);\r\n\t}\r\n\r\n\tNewPlrAnim(pnum, p->_pDAnim[p->_pdir], p->_pDFrames, 1, p->_pDWidth);\r\n\r\n\tp->_pBlockFlag = FALSE;\r\n\tp->_pmode = PM_DEATH;\r\n\tp->_pInvincible = TRUE;\r\n\tSetPlayerHitPoints(pnum, 0);\r\n\tp->_pVar8 = 1;\r\n\r\n\tif (pnum != myplr && !earflag && !diablolevel) {\r\n\t\tfor (i = 0; i < NUM_INVLOC; i++) {\r\n\t\t\tp->InvBody[i]._itype = ITYPE_NONE;\r\n\t\t}\r\n\t\tCalcPlrInv(pnum, FALSE);\r\n\t}\r\n\r\n\tif (plr[pnum].plrlevel == currlevel) {\r\n\t\tFixPlayerLocation(pnum, p->_pdir);\r\n\t\tRemovePlrFromMap(pnum);\r\n\t\tdFlags[p->_px][p->_py] |= BFLAG_DEAD_PLAYER;\r\n\t\tSetPlayerOld(pnum);\r\n\r\n\t\tif (pnum == myplr) {\r\n\t\t\tdrawhpflag = TRUE;\r\n\t\t\tdeathdelay = 30;\r\n\r\n\t\t\tif (pcurs >= CURSOR_FIRSTITEM) {\r\n\t\t\t\tPlrDeadItem(pnum, &p->HoldItem, 0, 0);\r\n\t\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t\t}\r\n\r\n\t\t\tif (!diablolevel) {\r\n\t\t\t\tDropHalfPlayersGold(pnum);\r\n\t\t\t\tif (earflag != -1) {\r\n\t\t\t\t\tif (earflag != 0) {\r\n\t\t\t\t\t\tSetPlrHandItem(&ear, IDI_EAR);\r\n\t\t\t\t\t\tsprintf(ear._iName, \"Ear of %s\", plr[pnum]._pName);\r\n\t\t\t\t\t\tif (plr[pnum]._pClass == PC_SORCERER) {\r\n\t\t\t\t\t\t\tear._iCurs = ICURS_EAR_SORCEROR;\r\n\t\t\t\t\t\t} else if (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\t\t\t\t\tear._iCurs = ICURS_EAR_WARRIOR;\r\n\t\t\t\t\t\t} else if (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\t\t\t\t\tear._iCurs = ICURS_EAR_ROGUE;\r\n#ifdef HELLFIRE\r\n\t\t\t\t\t\t} else if (plr[pnum]._pClass == PC_MONK || plr[pnum]._pClass == PC_BARD || plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\t\t\t\t\tear._iCurs = ICURS_EAR_ROGUE;\r\n#endif\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tear._iCreateInfo = plr[pnum]._pName[0] << 8 | plr[pnum]._pName[1];\r\n\t\t\t\t\t\tear._iSeed = plr[pnum]._pName[2] << 24 | plr[pnum]._pName[3] << 16 | plr[pnum]._pName[4] << 8 | plr[pnum]._pName[5];\r\n\t\t\t\t\t\tear._ivalue = plr[pnum]._pLevel;\r\n\r\n\t\t\t\t\t\tif (FindGetItem(IDI_EAR, ear._iCreateInfo, ear._iSeed) == -1) {\r\n\t\t\t\t\t\t\tPlrDeadItem(pnum, &ear, 0, 0);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tpi = &p->InvBody[0];\r\n\t\t\t\t\t\ti = NUM_INVLOC;\r\n\t\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t\tpdd = (i + p->_pdir) & 7;\r\n\t\t\t\t\t\t\tPlrDeadItem(pnum, pi, offset_x[pdd], offset_y[pdd]);\r\n\t\t\t\t\t\t\tpi++;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tCalcPlrInv(pnum, FALSE);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#ifndef HELLFIRE\r\n\tSetPlayerHitPoints(pnum, 0);\r\n#endif\r\n}\r\n\r\nvoid DropHalfPlayersGold(int pnum)\r\n{\r\n\tint i, hGold;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"DropHalfPlayersGold: illegal player %d\", pnum);\r\n\t}\r\n\r\n\thGold = plr[pnum]._pGold >> 1;\r\n\tfor (i = 0; i < MAXBELTITEMS && hGold > 0; i++) {\r\n\t\tif (plr[pnum].SpdList[i]._itype == ITYPE_GOLD &&\r\n#ifndef HELLFIRE\r\n\t\t    plr[pnum].SpdList[i]._ivalue != GOLD_MAX_LIMIT) {\r\n#else\r\n\t\t    plr[pnum].SpdList[i]._ivalue != MaxGold) {\r\n#endif\r\n\t\t\tif (hGold < plr[pnum].SpdList[i]._ivalue) {\r\n\t\t\t\tplr[pnum].SpdList[i]._ivalue -= hGold;\r\n\t\t\t\tSetSpdbarGoldCurs(pnum, i);\r\n\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\tplr[pnum].HoldItem._ivalue = hGold;\r\n\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\thGold = 0;\r\n\t\t\t} else {\r\n\t\t\t\thGold -= plr[pnum].SpdList[i]._ivalue;\r\n\t\t\t\tRemoveSpdBarItem(pnum, i);\r\n\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\tplr[pnum].HoldItem._ivalue = plr[pnum].SpdList[i]._ivalue;\r\n\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\ti = -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (hGold > 0) {\r\n\t\tfor (i = 0; i < MAXBELTITEMS && hGold > 0; i++) {\r\n\t\t\tif (plr[pnum].SpdList[i]._itype == ITYPE_GOLD) {\r\n\t\t\t\tif (hGold < plr[pnum].SpdList[i]._ivalue) {\r\n\t\t\t\t\tplr[pnum].SpdList[i]._ivalue -= hGold;\r\n\t\t\t\t\tSetSpdbarGoldCurs(pnum, i);\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = hGold;\r\n\t\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\t\thGold = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thGold -= plr[pnum].SpdList[i]._ivalue;\r\n\t\t\t\t\tRemoveSpdBarItem(pnum, i);\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = plr[pnum].SpdList[i]._ivalue;\r\n\t\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tforce_redraw = 255;\r\n\tif (hGold > 0) {\r\n\t\tfor (i = 0; i < plr[pnum]._pNumInv && hGold > 0; i++) {\r\n\t\t\tif (plr[pnum].InvList[i]._itype == ITYPE_GOLD &&\r\n#ifndef HELLFIRE\r\n\t\t\t    plr[pnum].InvList[i]._ivalue != GOLD_MAX_LIMIT) {\r\n#else\r\n\t\t\t    plr[pnum].InvList[i]._ivalue != MaxGold) {\r\n#endif\r\n\t\t\t\tif (hGold < plr[pnum].InvList[i]._ivalue) {\r\n\t\t\t\t\tplr[pnum].InvList[i]._ivalue -= hGold;\r\n\t\t\t\t\tSetGoldCurs(pnum, i);\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = hGold;\r\n\t\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\t\thGold = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thGold -= plr[pnum].InvList[i]._ivalue;\r\n\t\t\t\t\tRemoveInvItem(pnum, i);\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = plr[pnum].InvList[i]._ivalue;\r\n\t\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (hGold > 0) {\r\n\t\tfor (i = 0; i < plr[pnum]._pNumInv && hGold > 0; i++) {\r\n\t\t\tif (plr[pnum].InvList[i]._itype == ITYPE_GOLD) {\r\n\t\t\t\tif (hGold < plr[pnum].InvList[i]._ivalue) {\r\n\t\t\t\t\tplr[pnum].InvList[i]._ivalue -= hGold;\r\n\t\t\t\t\tSetGoldCurs(pnum, i);\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = hGold;\r\n\t\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\t\thGold = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thGold -= plr[pnum].InvList[i]._ivalue;\r\n\t\t\t\t\tRemoveInvItem(pnum, i);\r\n\t\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, IDI_GOLD);\r\n\t\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\t\tplr[pnum].HoldItem._ivalue = plr[pnum].InvList[i]._ivalue;\r\n\t\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tplr[pnum]._pGold = CalculateGold(pnum);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid StripTopGold(int pnum)\r\n{\r\n\tItemStruct tmpItem;\r\n\tint i, val;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StripTopGold: illegal player %d\", pnum);\r\n\t}\r\n\ttmpItem = plr[pnum].HoldItem;\r\n\r\n\tfor (i = 0; i < plr[pnum]._pNumInv; i++) {\r\n\t\tif (plr[pnum].InvList[i]._itype == ITYPE_GOLD) {\r\n\t\t\tif (plr[pnum].InvList[i]._ivalue > MaxGold) {\r\n\t\t\t\tval = plr[pnum].InvList[i]._ivalue - MaxGold;\r\n\t\t\t\tplr[pnum].InvList[i]._ivalue = MaxGold;\r\n\t\t\t\tSetGoldCurs(pnum, i);\r\n\t\t\t\tSetPlrHandItem(&plr[pnum].HoldItem, 0);\r\n\t\t\t\tGetGoldSeed(pnum, &plr[pnum].HoldItem);\r\n\t\t\t\tSetPlrHandGoldCurs(&plr[pnum].HoldItem);\r\n\t\t\t\tplr[pnum].HoldItem._ivalue = val;\r\n\t\t\t\tif (!GoldAutoPlace(pnum))\r\n\t\t\t\t\tPlrDeadItem(pnum, &plr[pnum].HoldItem, 0, 0);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tplr[pnum]._pGold = CalculateGold(pnum);\r\n\tplr[pnum].HoldItem = tmpItem;\r\n}\r\n\r\n#endif\r\nvoid SyncPlrKill(int pnum, int earflag)\r\n{\r\n\tint ma, i;\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum]._pHitPoints <= 0 && currlevel == 0) {\r\n#else\r\n\tif (plr[pnum]._pHitPoints == 0 && currlevel == 0) {\r\n#endif\r\n\t\tSetPlayerHitPoints(pnum, 64);\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tma = missileactive[i];\r\n\t\tif (missile[ma]._mitype == MIS_MANASHIELD && missile[ma]._misource == pnum && missile[ma]._miDelFlag == FALSE) {\r\n\t\t\tif (earflag != -1) {\r\n\t\t\t\tmissile[ma]._miVar8 = earflag;\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tSetPlayerHitPoints(pnum, 0);\r\n\tStartPlayerKill(pnum, earflag);\r\n}\r\n\r\nvoid RemovePlrMissiles(int pnum)\r\n{\r\n\tint i, am;\r\n\tint mx, my;\r\n\r\n\tif (currlevel != 0 && pnum == myplr && (monster[myplr]._mx != 1 || monster[myplr]._my != 0)) {\r\n\t\tM_StartKill(myplr, myplr);\r\n\t\tAddDead(monster[myplr]._mx, monster[myplr]._my, (monster[myplr].MType)->mdeadval, monster[myplr]._mdir);\r\n\t\tmx = monster[myplr]._mx;\r\n\t\tmy = monster[myplr]._my;\r\n\t\tdMonster[mx][my] = 0;\r\n\t\tmonster[myplr]._mDelFlag = TRUE;\r\n\t\tDeleteMonsterList();\r\n\t}\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tam = missileactive[i];\r\n\t\tif (missile[am]._mitype == MIS_STONE && missile[am]._misource == pnum) {\r\n\t\t\tmonster[missile[am]._miVar2]._mmode = missile[am]._miVar1;\r\n\t\t}\r\n\t\tif (missile[am]._mitype == MIS_MANASHIELD && missile[am]._misource == pnum) {\r\n\t\t\tClearMissileSpot(am);\r\n\t\t\tDeleteMissile(am, i);\r\n\t\t}\r\n\t\tif (missile[am]._mitype == MIS_ETHEREALIZE && missile[am]._misource == pnum) {\r\n\t\t\tClearMissileSpot(am);\r\n\t\t\tDeleteMissile(am, i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid InitLevelChange(int pnum)\r\n{\r\n\tRemovePlrMissiles(pnum);\r\n\tif (pnum == myplr && qtextflag) {\r\n\t\tqtextflag = FALSE;\r\n\t\tstream_stop();\r\n\t}\r\n\r\n\tRemovePlrFromMap(pnum);\r\n\tSetPlayerOld(pnum);\r\n\tif (pnum == myplr) {\r\n\t\tdPlayer[plr[myplr]._px][plr[myplr]._py] = myplr + 1;\r\n\t} else {\r\n\t\tplr[pnum]._pLvlVisited[plr[pnum].plrlevel] = TRUE;\r\n\t}\r\n\r\n\tClrPlrPath(pnum);\r\n\tplr[pnum].destAction = ACTION_NONE;\r\n\tplr[pnum]._pLvlChanging = TRUE;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tplr[pnum].pLvlLoad = 10;\r\n\t}\r\n}\r\n\r\nvoid StartNewLvl(int pnum, int fom, int lvl)\r\n{\r\n\tInitLevelChange(pnum);\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"StartNewLvl: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tswitch (fom) {\r\n\tcase WM_DIABNEXTLVL:\r\n\tcase WM_DIABPREVLVL:\r\n\t\tplr[pnum].plrlevel = lvl;\r\n\t\tbreak;\r\n\tcase WM_DIABRTNLVL:\r\n\tcase WM_DIABTOWNWARP:\r\n\t\tplr[pnum].plrlevel = lvl;\r\n\t\tbreak;\r\n\tcase WM_DIABSETLVL:\r\n\t\tsetlvlnum = lvl;\r\n\t\tbreak;\r\n\tcase WM_DIABTWARPUP:\r\n\t\tplr[myplr].pTownWarps |= 1 << (leveltype - 2);\r\n\t\tplr[pnum].plrlevel = lvl;\r\n\t\tbreak;\r\n\tcase WM_DIABRETOWN:\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tapp_fatal(\"StartNewLvl\");\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (pnum == myplr) {\r\n\t\tplr[pnum]._pmode = PM_NEWLVL;\r\n\t\tplr[pnum]._pInvincible = TRUE;\r\n\t\tPostMessage(ghMainWnd, fom, 0, 0);\r\n\t\tif (gbMaxPlayers > 1) {\r\n\t\t\tNetSendCmdParam2(TRUE, CMD_NEWLVL, fom, lvl);\r\n\t\t}\r\n\t}\r\n}\r\nvoid RestartTownLvl(int pnum)\r\n{\r\n\tInitLevelChange(pnum);\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"RestartTownLvl: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum].plrlevel = 0;\r\n\tplr[pnum]._pInvincible = FALSE;\r\n\r\n\tSetPlayerHitPoints(pnum, 64);\r\n\r\n\tplr[pnum]._pMana = 0;\r\n\tplr[pnum]._pManaBase = plr[pnum]._pMana - (plr[pnum]._pMaxMana - plr[pnum]._pMaxManaBase);\r\n\r\n\tCalcPlrInv(pnum, FALSE);\r\n\r\n\tif (pnum == myplr) {\r\n\t\tplr[pnum]._pmode = PM_NEWLVL;\r\n\t\tplr[pnum]._pInvincible = TRUE;\r\n\t\tPostMessage(ghMainWnd, WM_DIABRETOWN, 0, 0);\r\n\t}\r\n}\r\n\r\nvoid StartWarpLvl(int pnum, int pidx)\r\n{\r\n\tInitLevelChange(pnum);\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tif (plr[pnum].plrlevel != 0) {\r\n\t\t\tplr[pnum].plrlevel = 0;\r\n\t\t} else {\r\n\t\t\tplr[pnum].plrlevel = portal[pidx].level;\r\n\t\t}\r\n\t}\r\n\r\n\tif (pnum == myplr) {\r\n\t\tSetCurrentPortal(pidx);\r\n\t\tplr[pnum]._pmode = PM_NEWLVL;\r\n\t\tplr[pnum]._pInvincible = TRUE;\r\n\t\tPostMessage(ghMainWnd, WM_DIABWARPLVL, 0, 0);\r\n\t}\r\n}\r\n\r\nBOOL PM_DoStand(int pnum)\r\n{\r\n\treturn FALSE;\r\n}\r\n\r\n/**\r\n * @brief Movement towards NW, N, and NE\r\n */\r\nBOOL PM_DoWalk(int pnum)\r\n{\r\n\tint anim_len;\r\n\tBOOL rv;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoWalk: illegal player %d\", pnum);\r\n\t}\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[pnum]._pAnimFrame == 3\r\n\t    || (plr[pnum]._pWFrames == 8 && plr[pnum]._pAnimFrame == 7)\r\n\t    || (plr[pnum]._pWFrames != 8 && plr[pnum]._pAnimFrame == 4)) {\r\n\t\tPlaySfxLoc(PS_WALK1, plr[pnum]._px, plr[pnum]._py);\r\n\t}\r\n#else\r\n\tif (currlevel == 0 && jogging_opt) {\r\n\t\tif (plr[pnum]._pAnimFrame % 2 == 0) {\r\n\t\t\tplr[pnum]._pAnimFrame++;\r\n\t\t\tplr[pnum]._pVar8++;\r\n\t\t}\r\n\t\tif (plr[pnum]._pAnimFrame >= plr[pnum]._pWFrames) {\r\n\t\t\tplr[pnum]._pAnimFrame = 0;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tanim_len = 8;\r\n\tif (currlevel != 0) {\r\n\t\tanim_len = AnimLenFromClass[plr[pnum]._pClass];\r\n\t}\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[pnum]._pVar8 == anim_len) {\r\n#else\r\n\tif (plr[pnum]._pVar8 >= anim_len) {\r\n#endif\r\n\t\tdPlayer[plr[pnum]._px][plr[pnum]._py] = 0;\r\n\t\tplr[pnum]._px += plr[pnum]._pVar1;\r\n\t\tplr[pnum]._py += plr[pnum]._pVar2;\r\n\t\tdPlayer[plr[pnum]._px][plr[pnum]._py] = pnum + 1;\r\n\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tChangeLightXY(plr[pnum]._plid, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\tChangeVisionXY(plr[pnum]._pvid, plr[pnum]._px, plr[pnum]._py);\r\n\t\t}\r\n\r\n\t\tif (pnum == myplr && ScrollInfo._sdir) {\r\n\t\t\tViewX = plr[pnum]._px - ScrollInfo._sdx;\r\n\t\t\tViewY = plr[pnum]._py - ScrollInfo._sdy;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum].walkpath[0] != WALK_NONE) {\r\n\t\t\tStartWalkStand(pnum);\r\n\t\t} else {\r\n\t\t\tStartStand(pnum, plr[pnum]._pVar3);\r\n\t\t}\r\n\r\n\t\tClearPlrPVars(pnum);\r\n\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tChangeLightOff(plr[pnum]._plid, 0, 0);\r\n\t\t}\r\n\t\trv = TRUE;\r\n\t} else {\r\n\t\tPM_ChangeOffset(pnum);\r\n\t\trv = FALSE;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\n/**\r\n * @brief Movement towards SW, S, and SE\r\n */\r\nBOOL PM_DoWalk2(int pnum)\r\n{\r\n\tint anim_len;\r\n\tBOOL rv;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoWalk2: illegal player %d\", pnum);\r\n\t}\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[pnum]._pAnimFrame == 3\r\n\t    || (plr[pnum]._pWFrames == 8 && plr[pnum]._pAnimFrame == 7)\r\n\t    || (plr[pnum]._pWFrames != 8 && plr[pnum]._pAnimFrame == 4)) {\r\n\t\tPlaySfxLoc(PS_WALK1, plr[pnum]._px, plr[pnum]._py);\r\n\t}\r\n#else\r\n\tif (currlevel == 0 && jogging_opt) {\r\n\t\tif (plr[pnum]._pAnimFrame % 2 == 0) {\r\n\t\t\tplr[pnum]._pAnimFrame++;\r\n\t\t\tplr[pnum]._pVar8++;\r\n\t\t}\r\n\t\tif (plr[pnum]._pAnimFrame >= plr[pnum]._pWFrames) {\r\n\t\t\tplr[pnum]._pAnimFrame = 0;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tanim_len = 8;\r\n\tif (currlevel != 0) {\r\n\t\tanim_len = AnimLenFromClass[plr[pnum]._pClass];\r\n\t}\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[pnum]._pVar8 == anim_len) {\r\n#else\r\n\tif (plr[pnum]._pVar8 >= anim_len) {\r\n#endif\r\n\t\tdPlayer[plr[pnum]._pVar1][plr[pnum]._pVar2] = 0;\r\n\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tChangeLightXY(plr[pnum]._plid, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\tChangeVisionXY(plr[pnum]._pvid, plr[pnum]._px, plr[pnum]._py);\r\n\t\t}\r\n\r\n\t\tif (pnum == myplr && ScrollInfo._sdir) {\r\n\t\t\tViewX = plr[pnum]._px - ScrollInfo._sdx;\r\n\t\t\tViewY = plr[pnum]._py - ScrollInfo._sdy;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum].walkpath[0] != WALK_NONE) {\r\n\t\t\tStartWalkStand(pnum);\r\n\t\t} else {\r\n\t\t\tStartStand(pnum, plr[pnum]._pVar3);\r\n\t\t}\r\n\r\n\t\tClearPlrPVars(pnum);\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tChangeLightOff(plr[pnum]._plid, 0, 0);\r\n\t\t}\r\n\t\trv = TRUE;\r\n\t} else {\r\n\t\tPM_ChangeOffset(pnum);\r\n\t\trv = FALSE;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\n/**\r\n * @brief Movement towards W and E\r\n */\r\nBOOL PM_DoWalk3(int pnum)\r\n{\r\n\tint anim_len;\r\n\tBOOL rv;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoWalk3: illegal player %d\", pnum);\r\n\t}\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[pnum]._pAnimFrame == 3\r\n\t    || (plr[pnum]._pWFrames == 8 && plr[pnum]._pAnimFrame == 7)\r\n\t    || (plr[pnum]._pWFrames != 8 && plr[pnum]._pAnimFrame == 4)) {\r\n\t\tPlaySfxLoc(PS_WALK1, plr[pnum]._px, plr[pnum]._py);\r\n\t}\r\n#else\r\n\tif (currlevel == 0 && jogging_opt) {\r\n\t\tif (plr[pnum]._pAnimFrame % 2 == 0) {\r\n\t\t\tplr[pnum]._pAnimFrame++;\r\n\t\t\tplr[pnum]._pVar8++;\r\n\t\t}\r\n\t\tif (plr[pnum]._pAnimFrame >= plr[pnum]._pWFrames) {\r\n\t\t\tplr[pnum]._pAnimFrame = 0;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tanim_len = 8;\r\n\tif (currlevel != 0) {\r\n\t\tanim_len = AnimLenFromClass[plr[pnum]._pClass];\r\n\t}\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[pnum]._pVar8 == anim_len) {\r\n#else\r\n\tif (plr[pnum]._pVar8 >= anim_len) {\r\n#endif\r\n\t\tdPlayer[plr[pnum]._px][plr[pnum]._py] = 0;\r\n\t\tdFlags[plr[pnum]._pVar4][plr[pnum]._pVar5] &= ~BFLAG_PLAYERLR;\r\n\t\tplr[pnum]._px = plr[pnum]._pVar1;\r\n\t\tplr[pnum]._py = plr[pnum]._pVar2;\r\n\t\tdPlayer[plr[pnum]._px][plr[pnum]._py] = pnum + 1;\r\n\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tChangeLightXY(plr[pnum]._plid, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\tChangeVisionXY(plr[pnum]._pvid, plr[pnum]._px, plr[pnum]._py);\r\n\t\t}\r\n\r\n\t\tif (pnum == myplr && ScrollInfo._sdir) {\r\n\t\t\tViewX = plr[pnum]._px - ScrollInfo._sdx;\r\n\t\t\tViewY = plr[pnum]._py - ScrollInfo._sdy;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum].walkpath[0] != WALK_NONE) {\r\n\t\t\tStartWalkStand(pnum);\r\n\t\t} else {\r\n\t\t\tStartStand(pnum, plr[pnum]._pVar3);\r\n\t\t}\r\n\r\n\t\tClearPlrPVars(pnum);\r\n\r\n\t\tif (leveltype != DTYPE_TOWN) {\r\n\t\t\tChangeLightOff(plr[pnum]._plid, 0, 0);\r\n\t\t}\r\n\t\trv = TRUE;\r\n\t} else {\r\n\t\tPM_ChangeOffset(pnum);\r\n\t\trv = FALSE;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nBOOL WeaponDur(int pnum, int durrnd)\r\n{\r\n\tif (pnum != myplr) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDamAcFlags & ISPLHF_DECAY) {\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iPLDam -= 5;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iPLDam <= -100) {\r\n\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_LEFT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE;\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tCalcPlrInv(pnum, TRUE);\r\n\t}\r\n\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDamAcFlags & ISPLHF_DECAY) {\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iPLDam -= 5;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iPLDam <= -100) {\r\n\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_LEFT); // BUGFIX: INVLOC_HAND_RIGHT\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE;\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tCalcPlrInv(pnum, TRUE);\r\n\t}\r\n\r\n#endif\r\n\tif (random_(3, durrnd) != 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"WeaponDur: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iClass == ICLASS_WEAPON) {\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability == DUR_INDESTRUCTIBLE) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability--;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability <= 0) {\r\n#else\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability == 0) {\r\n#endif\r\n\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_LEFT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE;\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iClass == ICLASS_WEAPON) {\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability == DUR_INDESTRUCTIBLE) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability--;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability == 0) {\r\n\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_RIGHT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE;\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability == DUR_INDESTRUCTIBLE) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability--;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability == 0) {\r\n\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_RIGHT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE;\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_NONE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability == DUR_INDESTRUCTIBLE) {\r\n\t\t\treturn FALSE;\r\n\t\t}\r\n\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability--;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability == 0) {\r\n\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_LEFT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE;\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL PlrHitMonst(int pnum, int m)\r\n{\r\n\tBOOL rv, ret;\r\n\tint hit, hper, mind, maxd, ddp, dam, skdam, phanditype, tmac;\r\n\thper = 0;\r\n#ifdef HELLFIRE\r\n\tret = FALSE;\r\n\tBOOL adjacentDamage = FALSE;\r\n#endif\r\n\r\n\tif ((DWORD)m >= MAXMONSTERS) {\r\n\t\tapp_fatal(\"PlrHitMonst: illegal monster %d\", m);\r\n\t}\r\n\r\n\tif ((monster[m]._mhitpoints >> 6) <= 0) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (monster[m].MType->mtype == MT_ILLWEAV && monster[m]._mgoal == MGOAL_RETREAT) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tif (monster[m]._mmode == MM_CHARGE) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (pnum < 0) {\r\n\t\tadjacentDamage = TRUE;\r\n\t\tpnum = -pnum;\r\n\t\tif (plr[pnum]._pLevel > 20)\r\n\t\t\thper -= 30;\r\n\t\telse\r\n\t\t\thper -= (35 - plr[pnum]._pLevel) * 2;\r\n\t}\r\n#endif\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PlrHitMonst: illegal player %d\", pnum);\r\n\t}\r\n\r\n\trv = FALSE;\r\n\r\n\thit = random_(4, 100);\r\n\tif (monster[m]._mmode == MM_STONE) {\r\n\t\thit = 0;\r\n\t}\r\n\r\n\ttmac = monster[m].mArmorClass;\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum]._pIEnAc > 0) {\r\n\t\tint _pIEnAc = plr[pnum]._pIEnAc - 1;\r\n\t\tif (_pIEnAc > 0)\r\n\t\t\ttmac >>= _pIEnAc;\r\n\t\telse\r\n\t\t\ttmac -= tmac >> 2;\r\n\r\n\t\tif (plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\ttmac -= monster[m].mArmorClass / 8;\r\n\t\t}\r\n\r\n\t\tif (tmac < 0)\r\n\t\t\ttmac = 0;\r\n\t}\r\n#else\r\n\ttmac -= plr[pnum]._pIEnAc;\r\n#endif\r\n\r\n\thper += (plr[pnum]._pDexterity >> 1) + plr[pnum]._pLevel + 50 - tmac;\r\n\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\thper += 20;\r\n\t}\r\n\thper += plr[pnum]._pIBonusToHit;\r\n\tif (hper < 5) {\r\n\t\thper = 5;\r\n\t}\r\n\tif (hper > 95) {\r\n\t\thper = 95;\r\n\t}\r\n\r\n\tif (CheckMonsterHit(m, ret)) {\r\n\t\treturn ret;\r\n\t}\r\n#ifdef _DEBUG\r\n\tif (hit < hper || debug_mode_key_inverted_v || debug_mode_dollar_sign) {\r\n#else\r\n\tif (hit < hper) {\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum]._pIFlags & ISPL_FIREDAM && plr[pnum]._pIFlags & ISPL_LIGHTDAM) {\r\n\t\t\tint midam = plr[pnum]._pIFMinDam + random_(3, plr[pnum]._pIFMaxDam - plr[pnum]._pIFMinDam);\r\n\t\t\tAddMissile(plr[pnum]._px, plr[pnum]._py, plr[pnum]._pVar1, plr[pnum]._pVar2, plr[pnum]._pdir, MIS_SPECARROW, TARGET_MONSTERS, pnum, midam, 0);\r\n\t\t}\r\n#endif\r\n\t\tmind = plr[pnum]._pIMinDam;\r\n\t\tmaxd = plr[pnum]._pIMaxDam;\r\n\t\tdam = random_(5, maxd - mind + 1) + mind;\r\n\t\tdam += dam * plr[pnum]._pIBonusDam / 100;\r\n\t\tdam += plr[pnum]._pIBonusDamMod;\r\n#ifdef HELLFIRE\r\n\t\tint dam2 = dam << 6;\r\n#endif\r\n\t\tdam += plr[pnum]._pDamageMod;\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR\r\n#ifdef HELLFIRE\r\n\t\t    || plr[pnum]._pClass == PC_BARBARIAN\r\n#endif\r\n\t\t) {\r\n\t\t\tddp = plr[pnum]._pLevel;\r\n\t\t\tif (random_(6, 100) < ddp) {\r\n\t\t\t\tdam <<= 1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tphanditype = ITYPE_NONE;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SWORD) {\r\n\t\t\tphanditype = ITYPE_SWORD;\r\n\t\t}\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_MACE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_MACE) {\r\n\t\t\tphanditype = ITYPE_MACE;\r\n\t\t}\r\n\r\n\t\tswitch (monster[m].MData->mMonstClass) {\r\n\t\tcase MC_UNDEAD:\r\n\t\t\tif (phanditype == ITYPE_SWORD) {\r\n\t\t\t\tdam -= dam >> 1;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\telse\r\n#endif\r\n\t\t\t    if (phanditype == ITYPE_MACE) {\r\n\t\t\t\tdam += dam >> 1;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase MC_ANIMAL:\r\n\t\t\tif (phanditype == ITYPE_MACE) {\r\n\t\t\t\tdam -= dam >> 1;\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\telse\r\n#endif\r\n\t\t\t    if (phanditype == ITYPE_SWORD) {\r\n\t\t\t\tdam += dam >> 1;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum]._pIFlags & ISPL_3XDAMVDEM && monster[m].MData->mMonstClass == MC_DEMON) {\r\n\t\t\tdam *= 3;\r\n\t\t}\r\n\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum].pDamAcFlags & ISPLHF_DEVASTATION && random_(6, 100) < 5) {\r\n\t\t\tdam *= 3;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum].pDamAcFlags & ISPLHF_DOPPELGANGER && monster[m].MType->mtype != MT_DIABLO && monster[m]._uniqtype == 0 && random_(6, 100) < 10) {\r\n\t\t\tAddDoppelganger(m);\r\n\t\t}\r\n#endif\r\n\r\n\t\tdam <<= 6;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum].pDamAcFlags & ISPLHF_JESTERS) {\r\n\t\t\tint r = random_(6, 201);\r\n\t\t\tif (r >= 100)\r\n\t\t\t\tr = 100 + (r - 100) * 5;\r\n\t\t\tdam = dam * r / 100;\r\n\t\t}\r\n\r\n\t\tif (adjacentDamage)\r\n\t\t\tdam >>= 2;\r\n#endif\r\n\r\n\t\tif (pnum == myplr) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (plr[pnum].pDamAcFlags & ISPLHF_PERIL) {\r\n\t\t\t\tdam2 += plr[pnum]._pIGetHit << 6;\r\n\t\t\t\tif (dam2 >= 0) {\r\n\t\t\t\t\tif (plr[pnum]._pHitPoints > dam2) {\r\n\t\t\t\t\t\tplr[pnum]._pHitPoints -= dam2;\r\n\t\t\t\t\t\tplr[pnum]._pHPBase -= dam2;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdam2 = (1 << 6);\r\n\t\t\t\t\t\tplr[pnum]._pHPBase -= plr[pnum]._pHitPoints - dam2;\r\n\t\t\t\t\t\tplr[pnum]._pHitPoints = dam2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdam <<= 1;\r\n\t\t\t}\r\n#endif\r\n\t\t\tmonster[m]._mhitpoints -= dam;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE) {\r\n\t\t\tskdam = random_(7, dam >> 3);\r\n\t\t\tplr[pnum]._pHitPoints += skdam;\r\n\t\t\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\t\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._pHPBase += skdam;\r\n\t\t\tif (plr[pnum]._pHPBase > plr[pnum]._pMaxHPBase) {\r\n\t\t\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\t\t}\r\n\t\t\tdrawhpflag = TRUE;\r\n\t\t}\r\n\t\tif (plr[pnum]._pIFlags & (ISPL_STEALMANA_3 | ISPL_STEALMANA_5) && !(plr[pnum]._pIFlags & ISPL_NOMANA)) {\r\n\t\t\tif (plr[pnum]._pIFlags & ISPL_STEALMANA_3) {\r\n\t\t\t\tskdam = 3 * dam / 100;\r\n\t\t\t}\r\n\t\t\tif (plr[pnum]._pIFlags & ISPL_STEALMANA_5) {\r\n\t\t\t\tskdam = 5 * dam / 100;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._pMana += skdam;\r\n\t\t\tif (plr[pnum]._pMana > plr[pnum]._pMaxMana) {\r\n\t\t\t\tplr[pnum]._pMana = plr[pnum]._pMaxMana;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._pManaBase += skdam;\r\n\t\t\tif (plr[pnum]._pManaBase > plr[pnum]._pMaxManaBase) {\r\n\t\t\t\tplr[pnum]._pManaBase = plr[pnum]._pMaxManaBase;\r\n\t\t\t}\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t\t}\r\n\t\tif (plr[pnum]._pIFlags & (ISPL_STEALLIFE_3 | ISPL_STEALLIFE_5)) {\r\n\t\t\tif (plr[pnum]._pIFlags & ISPL_STEALLIFE_3) {\r\n\t\t\t\tskdam = 3 * dam / 100;\r\n\t\t\t}\r\n\t\t\tif (plr[pnum]._pIFlags & ISPL_STEALLIFE_5) {\r\n\t\t\t\tskdam = 5 * dam / 100;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._pHitPoints += skdam;\r\n\t\t\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\t\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\t\t}\r\n\t\t\tplr[pnum]._pHPBase += skdam;\r\n\t\t\tif (plr[pnum]._pHPBase > plr[pnum]._pMaxHPBase) {\r\n\t\t\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\t\t}\r\n\t\t\tdrawhpflag = TRUE;\r\n\t\t}\r\n\t\tif (plr[pnum]._pIFlags & ISPL_NOHEALPLR) {\r\n\t\t\tmonster[m]._mFlags |= MFLAG_NOHEAL;\r\n\t\t}\r\n#ifdef _DEBUG\r\n\t\tif (debug_mode_dollar_sign || debug_mode_key_inverted_v) {\r\n\t\t\tmonster[m]._mhitpoints = 0; /* double check */\r\n\t\t}\r\n#endif\r\n\t\tif ((monster[m]._mhitpoints >> 6) <= 0) {\r\n\t\t\tif (monster[m]._mmode == MM_STONE) {\r\n\t\t\t\tM_StartKill(m, pnum);\r\n\t\t\t\tmonster[m]._mmode = MM_STONE;\r\n\t\t\t} else {\r\n\t\t\t\tM_StartKill(m, pnum);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (monster[m]._mmode == MM_STONE) {\r\n\t\t\t\tM_StartHit(m, pnum, dam);\r\n\t\t\t\tmonster[m]._mmode = MM_STONE;\r\n\t\t\t} else {\r\n\t\t\t\tif (plr[pnum]._pIFlags & ISPL_KNOCKBACK) {\r\n\t\t\t\t\tM_GetKnockback(m);\r\n\t\t\t\t}\r\n\t\t\t\tM_StartHit(m, pnum, dam);\r\n\t\t\t}\r\n\t\t}\r\n\t\trv = TRUE;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nBOOL PlrHitPlr(int pnum, char p)\r\n{\r\n\tBOOL rv;\r\n\tint hit, hper, blk, blkper, dir, mind, maxd, dam, lvl, skdam, tac;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PlrHitPlr: illegal target player %d\", p);\r\n\t}\r\n\r\n\trv = FALSE;\r\n\r\n\tif (plr[p]._pInvincible) {\r\n\t\treturn rv;\r\n\t}\r\n\r\n\tif (plr[p]._pSpellFlags & 1) {\r\n\t\treturn rv;\r\n\t}\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PlrHitPlr: illegal attacking player %d\", pnum);\r\n\t}\r\n\r\n\thit = random_(4, 100);\r\n\r\n\thper = (plr[pnum]._pDexterity >> 1) + plr[pnum]._pLevel + 50 - (plr[p]._pIBonusAC + plr[p]._pIAC + plr[p]._pDexterity / 5);\r\n\r\n\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\thper += 20;\r\n\t}\r\n\thper += plr[pnum]._pIBonusToHit;\r\n\tif (hper < 5) {\r\n\t\thper = 5;\r\n\t}\r\n\tif (hper > 95) {\r\n\t\thper = 95;\r\n\t}\r\n\r\n\tif ((plr[p]._pmode == PM_STAND || plr[p]._pmode == PM_ATTACK) && plr[p]._pBlockFlag) {\r\n\t\tblk = random_(5, 100);\r\n\t} else {\r\n\t\tblk = 100;\r\n\t}\r\n\r\n\tblkper = plr[p]._pDexterity + plr[p]._pBaseToBlk + (plr[p]._pLevel << 1) - (plr[pnum]._pLevel << 1);\r\n\tif (blkper < 0) {\r\n\t\tblkper = 0;\r\n\t}\r\n\tif (blkper > 100) {\r\n\t\tblkper = 100;\r\n\t}\r\n\r\n\tif (hit < hper) {\r\n\t\tif (blk < blkper) {\r\n\t\t\tdir = GetDirection(plr[p]._px, plr[p]._py, plr[pnum]._px, plr[pnum]._py);\r\n\t\t\tStartPlrBlock(p, dir);\r\n\t\t} else {\r\n\t\t\tmind = plr[pnum]._pIMinDam;\r\n\t\t\tmaxd = plr[pnum]._pIMaxDam;\r\n\t\t\tdam = random_(5, maxd - mind + 1) + mind;\r\n\t\t\tdam += (dam * plr[pnum]._pIBonusDam) / 100;\r\n\t\t\tdam += plr[pnum]._pIBonusDamMod + plr[pnum]._pDamageMod;\r\n\r\n\t\t\tif (plr[pnum]._pClass == PC_WARRIOR\r\n#ifdef HELLFIRE\r\n\t\t\t    || plr[pnum]._pClass == PC_BARBARIAN\r\n#endif\r\n\t\t\t) {\r\n\t\t\t\tlvl = plr[pnum]._pLevel;\r\n\t\t\t\tif (random_(6, 100) < lvl) {\r\n\t\t\t\t\tdam <<= 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tskdam = dam << 6;\r\n\t\t\tif (plr[pnum]._pIFlags & ISPL_RNDSTEALLIFE) {\r\n\t\t\t\ttac = random_(7, skdam >> 3);\r\n\t\t\t\tplr[pnum]._pHitPoints += tac;\r\n\t\t\t\tif (plr[pnum]._pHitPoints > plr[pnum]._pMaxHP) {\r\n\t\t\t\t\tplr[pnum]._pHitPoints = plr[pnum]._pMaxHP;\r\n\t\t\t\t}\r\n\t\t\t\tplr[pnum]._pHPBase += tac;\r\n\t\t\t\tif (plr[pnum]._pHPBase > plr[pnum]._pMaxHPBase) {\r\n\t\t\t\t\tplr[pnum]._pHPBase = plr[pnum]._pMaxHPBase;\r\n\t\t\t\t}\r\n\t\t\t\tdrawhpflag = TRUE;\r\n\t\t\t}\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\tNetSendCmdDamage(TRUE, p, skdam);\r\n\t\t\t}\r\n\t\t\tStartPlrHit(p, skdam, FALSE);\r\n\t\t}\r\n\r\n\t\trv = TRUE;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nBOOL PlrHitObj(int pnum, int mx, int my)\r\n{\r\n\tint oi;\r\n\r\n\tif (dObject[mx][my] > 0) {\r\n\t\toi = dObject[mx][my] - 1;\r\n\t} else {\r\n\t\toi = -dObject[mx][my] - 1;\r\n\t}\r\n\r\n\tif (object[oi]._oBreak == 1) {\r\n\t\tBreakObject(pnum, oi);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL PM_DoAttack(int pnum)\r\n{\r\n\tint frame, dir, dx, dy, m;\r\n\tBOOL didhit = FALSE;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoAttack: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tframe = plr[pnum]._pAnimFrame;\r\n\tif (plr[pnum]._pIFlags & ISPL_QUICKATTACK && frame == 1) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTATTACK && (frame == 1 || frame == 3)) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTERATTACK && (frame == 1 || frame == 3 || frame == 5)) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTESTATTACK && (frame == 1 || frame == 4)) {\r\n\t\tplr[pnum]._pAnimFrame += 2;\r\n\t}\r\n\tif (plr[pnum]._pAnimFrame == plr[pnum]._pAFNum - 1) {\r\n\t\tPlaySfxLoc(PS_SWING, plr[pnum]._px, plr[pnum]._py);\r\n\t}\r\n\r\n\tif (plr[pnum]._pAnimFrame == plr[pnum]._pAFNum) {\r\n\t\tdx = plr[pnum]._px + offset_x[plr[pnum]._pdir];\r\n\t\tdy = plr[pnum]._py + offset_y[plr[pnum]._pdir];\r\n\r\n\t\tif (dMonster[dx][dy] != 0) {\r\n\t\t\tif (dMonster[dx][dy] > 0) {\r\n\t\t\t\tm = dMonster[dx][dy] - 1;\r\n\t\t\t} else {\r\n\t\t\t\tm = -(dMonster[dx][dy] + 1);\r\n\t\t\t}\r\n\t\t\tif (CanTalkToMonst(m)) {\r\n\t\t\t\tplr[pnum]._pVar1 = 0;\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\r\n#ifdef HELLFIRE\r\n\t\tif (!(plr[pnum]._pIFlags & ISPL_FIREDAM) || !(plr[pnum]._pIFlags & ISPL_LIGHTDAM))\r\n#endif\r\n\t\t\tif (plr[pnum]._pIFlags & ISPL_FIREDAM) {\r\n\t\t\t\tAddMissile(dx, dy, 1, 0, 0, MIS_WEAPEXP, TARGET_MONSTERS, pnum, 0, 0);\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\telse\r\n#endif\r\n\t\t\t    if (plr[pnum]._pIFlags & ISPL_LIGHTDAM) {\r\n\t\t\t\tAddMissile(dx, dy, 2, 0, 0, MIS_WEAPEXP, TARGET_MONSTERS, pnum, 0, 0);\r\n\t\t\t}\r\n\r\n\t\tif (dMonster[dx][dy]) {\r\n\t\t\tm = dMonster[dx][dy];\r\n\t\t\tif (dMonster[dx][dy] > 0) {\r\n\t\t\t\tm = dMonster[dx][dy] - 1;\r\n\t\t\t} else {\r\n\t\t\t\tm = -(dMonster[dx][dy] + 1);\r\n\t\t\t}\r\n\t\t\tdidhit = PlrHitMonst(pnum, m);\r\n\t\t} else if (dPlayer[dx][dy] != 0 && !FriendlyMode) {\r\n\t\t\tBYTE p = dPlayer[dx][dy];\r\n\t\t\tif (dPlayer[dx][dy] > 0) {\r\n\t\t\t\tp = dPlayer[dx][dy] - 1;\r\n\t\t\t} else {\r\n\t\t\t\tp = -(dPlayer[dx][dy] + 1);\r\n\t\t\t}\r\n\t\t\tdidhit = PlrHitPlr(pnum, p);\r\n\t\t} else if (dObject[dx][dy] > 0) {\r\n\t\t\tdidhit = PlrHitObj(pnum, dx, dy);\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif ((plr[pnum]._pClass == PC_MONK\r\n\t\t        && (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_STAFF))\r\n\t\t    || (plr[pnum]._pClass == PC_BARD\r\n\t\t        && plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SWORD)\r\n\t\t    || (plr[pnum]._pClass == PC_BARBARIAN\r\n\t\t        && (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_AXE || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_AXE\r\n\t\t            || (((plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_MACE && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND)\r\n\t\t                    || (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_MACE && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iLoc == ILOC_TWOHAND)\r\n\t\t                    || (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SWORD && plr[pnum].InvBody[INVLOC_HAND_LEFT]._iLoc == ILOC_TWOHAND)\r\n\t\t                    || (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SWORD && plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iLoc == ILOC_TWOHAND))\r\n\t\t                && !(plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD || plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD))))) {\r\n\t\t\tdx = plr[pnum]._px + offset_x[(plr[pnum]._pdir + 1) % 8];\r\n\t\t\tdy = plr[pnum]._py + offset_y[(plr[pnum]._pdir + 1) % 8];\r\n\t\t\tm = ((dMonster[dx][dy] > 0) ? dMonster[dx][dy] : -dMonster[dx][dy]) - 1;\r\n\t\t\tif (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && monster[m]._moldx == dx && monster[m]._moldy == dy) {\r\n\t\t\t\tif (PlrHitMonst(-pnum, m))\r\n\t\t\t\t\tdidhit = TRUE;\r\n\t\t\t}\r\n\t\t\tdx = plr[pnum]._px + offset_x[(plr[pnum]._pdir + 7) % 8];\r\n\t\t\tdy = plr[pnum]._py + offset_y[(plr[pnum]._pdir + 7) % 8];\r\n\t\t\tm = ((dMonster[dx][dy] > 0) ? dMonster[dx][dy] : -dMonster[dx][dy]) - 1;\r\n\t\t\tif (dMonster[dx][dy] != 0 && !CanTalkToMonst(m) && monster[m]._moldx == dx && monster[m]._moldy == dy) {\r\n\t\t\t\tif (PlrHitMonst(-pnum, m))\r\n\t\t\t\t\tdidhit = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\r\n\t\tif (didhit && WeaponDur(pnum, 30)) {\r\n\t\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\t\tClearPlrPVars(pnum);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum]._pAnimFrame == plr[pnum]._pAFrames) {\r\n\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\tClearPlrPVars(pnum);\r\n\t\treturn TRUE;\r\n\t} else {\r\n\t\treturn FALSE;\r\n\t}\r\n}\r\n\r\nBOOL PM_DoRangeAttack(int pnum)\r\n{\r\n\tint origFrame, mistype;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoRangeAttack: illegal player %d\", pnum);\r\n\t}\r\n\r\n\torigFrame = plr[pnum]._pAnimFrame;\r\n\tif (plr[pnum]._pIFlags & ISPL_QUICKATTACK && origFrame == 1) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTATTACK && (origFrame == 1 || origFrame == 3)) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\r\n\tif (plr[pnum]._pAnimFrame == plr[pnum]._pAFNum) {\r\n\t\tmistype = MIS_ARROW;\r\n\t\tif (plr[pnum]._pIFlags & ISPL_FIRE_ARROWS) {\r\n\t\t\tmistype = MIS_FARROW;\r\n\t\t}\r\n\t\tif (plr[pnum]._pIFlags & ISPL_LIGHT_ARROWS) {\r\n\t\t\tmistype = MIS_LARROW;\r\n\t\t}\r\n\t\tAddMissile(\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._pVar1,\r\n\t\t    plr[pnum]._pVar2,\r\n\t\t    plr[pnum]._pdir,\r\n\t\t    mistype,\r\n\t\t    TARGET_MONSTERS,\r\n\t\t    pnum,\r\n\t\t    4,\r\n\t\t    0);\r\n\r\n\t\tPlaySfxLoc(PS_BFIRE, plr[pnum]._px, plr[pnum]._py);\r\n\r\n\t\tif (WeaponDur(pnum, 40)) {\r\n\t\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\t\tClearPlrPVars(pnum);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum]._pAnimFrame >= plr[pnum]._pAFrames) {\r\n\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\tClearPlrPVars(pnum);\r\n\t\treturn TRUE;\r\n\t} else {\r\n\t\treturn FALSE;\r\n\t}\r\n}\r\n\r\nvoid ShieldDur(int pnum)\r\n{\r\n\tif (pnum != myplr) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ShieldDur: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_SHIELD) {\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability == DUR_INDESTRUCTIBLE) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability--;\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_LEFT]._iDurability == 0) {\r\n\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_LEFT);\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_LEFT]._itype = ITYPE_NONE;\r\n\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype == ITYPE_SHIELD) {\r\n\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability != DUR_INDESTRUCTIBLE) {\r\n\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability--;\r\n\t\t\tif (plr[pnum].InvBody[INVLOC_HAND_RIGHT]._iDurability == 0) {\r\n\t\t\t\tNetSendCmdDelItem(TRUE, INVLOC_HAND_RIGHT);\r\n\t\t\t\tplr[pnum].InvBody[INVLOC_HAND_RIGHT]._itype = ITYPE_NONE;\r\n\t\t\t\tCalcPlrInv(pnum, TRUE);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL PM_DoBlock(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoBlock: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTBLOCK && plr[pnum]._pAnimFrame != 1) {\r\n\t\tplr[pnum]._pAnimFrame = plr[pnum]._pBFrames;\r\n\t}\r\n\r\n\tif (plr[pnum]._pAnimFrame >= plr[pnum]._pBFrames) {\r\n\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\tClearPlrPVars(pnum);\r\n\r\n\t\tif (random_(3, 10) == 0) {\r\n\t\t\tShieldDur(pnum);\r\n\t\t}\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nstatic void ArmorDur(int pnum)\r\n{\r\n\tint a;\r\n\tItemStruct *pi;\r\n\tPlayerStruct *p;\r\n\r\n\tif (pnum != myplr) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ArmorDur: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tp = &plr[pnum];\r\n\tif (p->InvBody[INVLOC_CHEST]._itype == ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ta = random_(8, 3);\r\n\tif (p->InvBody[INVLOC_CHEST]._itype != ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype == ITYPE_NONE) {\r\n\t\ta = 1;\r\n\t}\r\n\tif (p->InvBody[INVLOC_CHEST]._itype == ITYPE_NONE && p->InvBody[INVLOC_HEAD]._itype != ITYPE_NONE) {\r\n\t\ta = 0;\r\n\t}\r\n\r\n\tif (a != 0) {\r\n\t\tpi = &p->InvBody[INVLOC_CHEST];\r\n\t} else {\r\n\t\tpi = &p->InvBody[INVLOC_HEAD];\r\n\t}\r\n\tif (pi->_iDurability == DUR_INDESTRUCTIBLE) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tpi->_iDurability--;\r\n\tif (pi->_iDurability != 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (a != 0) {\r\n\t\tNetSendCmdDelItem(TRUE, INVLOC_CHEST);\r\n\t} else {\r\n\t\tNetSendCmdDelItem(TRUE, INVLOC_HEAD);\r\n\t}\r\n\tpi->_itype = ITYPE_NONE;\r\n\tCalcPlrInv(pnum, TRUE);\r\n}\r\n\r\nBOOL PM_DoSpell(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoSpell: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pVar8 == plr[pnum]._pSFNum) {\r\n\t\tCastSpell(\r\n\t\t    pnum,\r\n\t\t    plr[pnum]._pSpell,\r\n\t\t    plr[pnum]._px,\r\n\t\t    plr[pnum]._py,\r\n\t\t    plr[pnum]._pVar1,\r\n\t\t    plr[pnum]._pVar2,\r\n\t\t    TARGET_MONSTERS,\r\n\t\t    plr[pnum]._pVar4);\r\n\r\n\t\tif (plr[pnum]._pSplFrom == 0) {\r\n\t\t\tif (plr[pnum]._pRSplType == RSPLTYPE_SCROLL) {\r\n\t\t\t\tif (!(plr[pnum]._pScrlSpells\r\n\t\t\t\t        & SPELLBIT(plr[pnum]._pRSpell))) {\r\n\t\t\t\t\tplr[pnum]._pRSpell = SPL_INVALID;\r\n\t\t\t\t\tplr[pnum]._pRSplType = RSPLTYPE_INVALID;\r\n\t\t\t\t\tforce_redraw = 255;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (plr[pnum]._pRSplType == RSPLTYPE_CHARGES) {\r\n\t\t\t\tif (!(plr[pnum]._pISpells\r\n\t\t\t\t        & SPELLBIT(plr[pnum]._pRSpell))) {\r\n\t\t\t\t\tplr[pnum]._pRSpell = SPL_INVALID;\r\n\t\t\t\t\tplr[pnum]._pRSplType = RSPLTYPE_INVALID;\r\n\t\t\t\t\tforce_redraw = 255;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tplr[pnum]._pVar8++;\r\n\r\n\tif (leveltype == DTYPE_TOWN) {\r\n\t\tif (plr[pnum]._pVar8 > plr[pnum]._pSFrames) {\r\n\t\t\tStartWalkStand(pnum);\r\n\t\t\tClearPlrPVars(pnum);\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t} else if (plr[pnum]._pAnimFrame == plr[pnum]._pSFrames) {\r\n\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\tClearPlrPVars(pnum);\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL PM_DoGotHit(int pnum)\r\n{\r\n\tint frame;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoGotHit: illegal player %d\", pnum);\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[pnum]._pIFlags & (ISPL_FASTRECOVER | ISPL_FASTERRECOVER | ISPL_FASTESTRECOVER)) {\r\n\t\tframe = 3;\r\n\t\tif (plr[pnum]._pIFlags & ISPL_FASTERRECOVER)\r\n\t\t\tframe = 4;\r\n\t\tif (plr[pnum]._pIFlags & ISPL_FASTESTRECOVER)\r\n\t\t\tframe = 5;\r\n\t\tif (plr[pnum]._pVar8 > 1 && plr[pnum]._pVar8 < frame) {\r\n\t\t\tplr[pnum]._pVar8 = frame;\r\n\t\t}\r\n\t\tif (plr[pnum]._pVar8 > plr[pnum]._pHFrames)\r\n\t\t\tplr[pnum]._pVar8 = plr[pnum]._pHFrames;\r\n\t}\r\n\r\n\tif (plr[pnum]._pVar8 == plr[pnum]._pHFrames) {\r\n#else\r\n\tframe = plr[pnum]._pAnimFrame;\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTRECOVER && frame == 3) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTERRECOVER && (frame == 3 || frame == 5)) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\tif (plr[pnum]._pIFlags & ISPL_FASTESTRECOVER && (frame == 1 || frame == 3 || frame == 5)) {\r\n\t\tplr[pnum]._pAnimFrame++;\r\n\t}\r\n\r\n\tif (plr[pnum]._pAnimFrame >= plr[pnum]._pHFrames) {\r\n#endif\r\n\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\tClearPlrPVars(pnum);\r\n\t\tif (random_(3, 4) != 0) {\r\n\t\t\tArmorDur(pnum);\r\n\t\t}\r\n\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tplr[pnum]._pVar8++;\r\n#endif\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL PM_DoDeath(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PM_DoDeath: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum]._pVar8 >= 2 * plr[pnum]._pDFrames) {\r\n\t\tif (deathdelay > 1 && pnum == myplr) {\r\n\t\t\tdeathdelay--;\r\n\t\t\tif (deathdelay == 1) {\r\n\t\t\t\tdeathflag = TRUE;\r\n\t\t\t\tif (gbMaxPlayers == 1) {\r\n\t\t\t\t\tgamemenu_on();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tplr[pnum]._pAnimDelay = 10000;\r\n\t\tplr[pnum]._pAnimFrame = plr[pnum]._pAnimLen;\r\n\t\tdFlags[plr[pnum]._px][plr[pnum]._py] |= BFLAG_DEAD_PLAYER;\r\n\t}\r\n\r\n\tif (plr[pnum]._pVar8 < 100) {\r\n\t\tplr[pnum]._pVar8++;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL PM_DoNewLvl(int pnum)\r\n{\r\n\treturn FALSE;\r\n}\r\n\r\nvoid CheckNewPath(int pnum)\r\n{\r\n\tint i, x, y, d;\r\n\tint xvel3, xvel, yvel;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"CheckNewPath: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tif (plr[pnum].destAction == ACTION_ATTACKMON) {\r\n\t\ti = plr[pnum].destParam1;\r\n\t\tMakePlrPath(pnum, monster[i]._mfutx, monster[i]._mfuty, FALSE);\r\n\t}\r\n\r\n\tif (plr[pnum].destAction == ACTION_ATTACKPLR) {\r\n\t\ti = plr[pnum].destParam1;\r\n\t\tMakePlrPath(pnum, plr[i]._pfutx, plr[i]._pfuty, FALSE);\r\n\t}\r\n\r\n\tif (plr[pnum].walkpath[0] != WALK_NONE) {\r\n\t\tif (plr[pnum]._pmode == PM_STAND) {\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\tif (plr[pnum].destAction == ACTION_ATTACKMON || plr[pnum].destAction == ACTION_ATTACKPLR) {\r\n\t\t\t\t\ti = plr[pnum].destParam1;\r\n\r\n\t\t\t\t\tif (plr[pnum].destAction == ACTION_ATTACKMON) {\r\n\t\t\t\t\t\tx = abs(plr[pnum]._pfutx - monster[i]._mfutx);\r\n\t\t\t\t\t\ty = abs(plr[pnum]._pfuty - monster[i]._mfuty);\r\n\t\t\t\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tx = abs(plr[pnum]._pfutx - plr[i]._pfutx);\r\n\t\t\t\t\t\ty = abs(plr[pnum]._pfuty - plr[i]._pfuty);\r\n\t\t\t\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (x < 2 && y < 2) {\r\n\t\t\t\t\t\tClrPlrPath(pnum);\r\n\t\t\t\t\t\t// BUGFIX: missing check for `destAction == ACTION_ATTACKMON` in if-statement of `TalktoMonster` branch.\r\n\t\t\t\t\t\tif (monster[i].mtalkmsg && monster[i].mtalkmsg != TEXT_VILE14) {\r\n\t\t\t\t\t\t\tTalktoMonster(i);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (currlevel != 0) {\r\n\t\t\t\txvel3 = PWVel[plr[pnum]._pClass][0];\r\n\t\t\t\txvel = PWVel[plr[pnum]._pClass][1];\r\n\t\t\t\tyvel = PWVel[plr[pnum]._pClass][2];\r\n\t\t\t} else {\r\n\t\t\t\txvel3 = 2048;\r\n\t\t\t\txvel = 1024;\r\n\t\t\t\tyvel = 512;\r\n\t\t\t}\r\n\r\n\t\t\tswitch (plr[pnum].walkpath[0]) {\r\n\t\t\tcase WALK_N:\r\n\t\t\t\tStartWalk(pnum, 0, -xvel, -1, -1, DIR_N, SDIR_N);\r\n\t\t\t\tbreak;\r\n\t\t\tcase WALK_NE:\r\n\t\t\t\tStartWalk(pnum, xvel, -yvel, 0, -1, DIR_NE, SDIR_NE);\r\n\t\t\t\tbreak;\r\n\t\t\tcase WALK_E:\r\n\t\t\t\tStartWalk3(pnum, xvel3, 0, -32, -16, 1, -1, 1, 0, DIR_E, SDIR_E);\r\n\t\t\t\tbreak;\r\n\t\t\tcase WALK_SE:\r\n\t\t\t\tStartWalk2(pnum, xvel, yvel, -32, -16, 1, 0, DIR_SE, SDIR_SE);\r\n\t\t\t\tbreak;\r\n\t\t\tcase WALK_S:\r\n\t\t\t\tStartWalk2(pnum, 0, xvel, 0, -32, 1, 1, DIR_S, SDIR_S);\r\n\t\t\t\tbreak;\r\n\t\t\tcase WALK_SW:\r\n\t\t\t\tStartWalk2(pnum, -xvel, yvel, 32, -16, 0, 1, DIR_SW, SDIR_SW);\r\n\t\t\t\tbreak;\r\n\t\t\tcase WALK_W:\r\n\t\t\t\tStartWalk3(pnum, -xvel3, 0, 32, -16, -1, 1, 0, 1, DIR_W, SDIR_W);\r\n\t\t\t\tbreak;\r\n\t\t\tcase WALK_NW:\r\n\t\t\t\tStartWalk(pnum, -xvel, -yvel, -1, 0, DIR_NW, SDIR_NW);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tfor (i = 1; i < MAX_PATH_LENGTH; i++) {\r\n\t\t\t\tplr[pnum].walkpath[i - 1] = plr[pnum].walkpath[i];\r\n\t\t\t}\r\n\r\n\t\t\tplr[pnum].walkpath[MAX_PATH_LENGTH - 1] = WALK_NONE;\r\n\r\n\t\t\tif (plr[pnum]._pmode == PM_STAND) {\r\n\t\t\t\tStartStand(pnum, plr[pnum]._pdir);\r\n\t\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn;\r\n\t}\r\n\tif (plr[pnum].destAction == ACTION_NONE) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (plr[pnum]._pmode == PM_STAND) {\r\n\t\tswitch (plr[pnum].destAction) {\r\n\t\tcase ACTION_ATTACK:\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tStartAttack(pnum, d);\r\n\t\t\tbreak;\r\n\t\tcase ACTION_ATTACKMON:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tx = abs(plr[pnum]._px - monster[i]._mfutx);\r\n\t\t\ty = abs(plr[pnum]._py - monster[i]._mfuty);\r\n\t\t\tif (x <= 1 && y <= 1) {\r\n\t\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\t\tif (monster[i].mtalkmsg && monster[i].mtalkmsg != TEXT_VILE14) {\r\n\t\t\t\t\tTalktoMonster(i);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_ATTACKPLR:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tx = abs(plr[pnum]._px - plr[i]._pfutx);\r\n\t\t\ty = abs(plr[pnum]._py - plr[i]._pfuty);\r\n\t\t\tif (x <= 1 && y <= 1) {\r\n\t\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_RATTACK:\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tStartRangeAttack(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tbreak;\r\n\t\tcase ACTION_RATTACKMON:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\tif (monster[i].mtalkmsg && monster[i].mtalkmsg != TEXT_VILE14) {\r\n\t\t\t\tTalktoMonster(i);\r\n\t\t\t} else {\r\n\t\t\t\tStartRangeAttack(pnum, d, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_RATTACKPLR:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tStartRangeAttack(pnum, d, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tbreak;\r\n\t\tcase ACTION_SPELL:\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tStartSpell(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tplr[pnum]._pVar4 = plr[pnum].destParam3;\r\n\t\t\tbreak;\r\n\t\tcase ACTION_SPELLWALL:\r\n\t\t\tStartSpell(pnum, plr[pnum].destParam3, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tplr[pnum]._pVar3 = plr[pnum].destParam3;\r\n\t\t\tplr[pnum]._pVar4 = plr[pnum].destParam4;\r\n\t\t\tbreak;\r\n\t\tcase ACTION_SPELLMON:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\tStartSpell(pnum, d, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\tplr[pnum]._pVar4 = plr[pnum].destParam2;\r\n\t\t\tbreak;\r\n\t\tcase ACTION_SPELLPLR:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tStartSpell(pnum, d, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tplr[pnum]._pVar4 = plr[pnum].destParam2;\r\n\t\t\tbreak;\r\n\t\tcase ACTION_OPERATE:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tx = abs(plr[pnum]._px - object[i]._ox);\r\n\t\t\ty = abs(plr[pnum]._py - object[i]._oy);\r\n\t\t\tif (y > 1 && dObject[object[i]._ox][object[i]._oy - 1] == -1 - i) {\r\n\t\t\t\ty = abs(plr[pnum]._py - object[i]._oy + 1);\r\n\t\t\t}\r\n\t\t\tif (x <= 1 && y <= 1) {\r\n\t\t\t\tif (object[i]._oBreak == 1) {\r\n\t\t\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, object[i]._ox, object[i]._oy);\r\n\t\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tOperateObject(pnum, i, FALSE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_DISARM:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tx = abs(plr[pnum]._px - object[i]._ox);\r\n\t\t\ty = abs(plr[pnum]._py - object[i]._oy);\r\n\t\t\tif (y > 1 && dObject[object[i]._ox][object[i]._oy - 1] == -1 - i) {\r\n\t\t\t\ty = abs(plr[pnum]._py - object[i]._oy + 1);\r\n\t\t\t}\r\n\t\t\tif (x <= 1 && y <= 1) {\r\n\t\t\t\tif (object[i]._oBreak == 1) {\r\n\t\t\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, object[i]._ox, object[i]._oy);\r\n\t\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tTryDisarm(pnum, i);\r\n\t\t\t\t\tOperateObject(pnum, i, FALSE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_OPERATETK:\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tif (object[i]._oBreak != 1) {\r\n\t\t\t\tOperateObject(pnum, i, TRUE);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_PICKUPITEM:\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\ti = plr[pnum].destParam1;\r\n\t\t\t\tx = abs(plr[pnum]._px - item[i]._ix);\r\n\t\t\t\ty = abs(plr[pnum]._py - item[i]._iy);\r\n\t\t\t\tif (x <= 1 && y <= 1 && pcurs == CURSOR_HAND && !item[i]._iRequest) {\r\n\t\t\t\t\tNetSendCmdGItem(TRUE, CMD_REQUESTGITEM, myplr, myplr, i);\r\n\t\t\t\t\titem[i]._iRequest = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_PICKUPAITEM:\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\ti = plr[pnum].destParam1;\r\n\t\t\t\tx = abs(plr[pnum]._px - item[i]._ix);\r\n\t\t\t\ty = abs(plr[pnum]._py - item[i]._iy);\r\n\t\t\t\tif (x <= 1 && y <= 1 && pcurs == CURSOR_HAND) {\r\n\t\t\t\t\tNetSendCmdGItem(TRUE, CMD_REQUESTAGITEM, myplr, myplr, i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ACTION_TALK:\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\tTalkToTowner(pnum, plr[pnum].destParam1);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tFixPlayerLocation(pnum, plr[pnum]._pdir);\r\n\t\tplr[pnum].destAction = ACTION_NONE;\r\n\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (plr[pnum]._pmode == PM_ATTACK && plr[pnum]._pAnimFrame > plr[myplr]._pAFNum) {\r\n\t\tif (plr[pnum].destAction == ACTION_ATTACK) {\r\n\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tStartAttack(pnum, d);\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t} else if (plr[pnum].destAction == ACTION_ATTACKMON) {\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tx = abs(plr[pnum]._px - monster[i]._mfutx);\r\n\t\t\ty = abs(plr[pnum]._py - monster[i]._mfuty);\r\n\t\t\tif (x <= 1 && y <= 1) {\r\n\t\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t}\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t} else if (plr[pnum].destAction == ACTION_ATTACKPLR) {\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tx = abs(plr[pnum]._px - plr[i]._pfutx);\r\n\t\t\ty = abs(plr[pnum]._py - plr[i]._pfuty);\r\n\t\t\tif (x <= 1 && y <= 1) {\r\n\t\t\t\td = GetDirection(plr[pnum]._pfutx, plr[pnum]._pfuty, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t}\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t} else if (plr[pnum].destAction == ACTION_OPERATE) {\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\tx = abs(plr[pnum]._px - object[i]._ox);\r\n\t\t\ty = abs(plr[pnum]._py - object[i]._oy);\r\n\t\t\tif (y > 1 && dObject[object[i]._ox][object[i]._oy - 1] == -1 - i) {\r\n\t\t\t\ty = abs(plr[pnum]._py - object[i]._oy + 1);\r\n\t\t\t}\r\n\t\t\tif (x <= 1 && y <= 1) {\r\n\t\t\t\tif (object[i]._oBreak == 1) {\r\n\t\t\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, object[i]._ox, object[i]._oy);\r\n\t\t\t\t\tStartAttack(pnum, d);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tOperateObject(pnum, i, FALSE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum]._pmode == PM_RATTACK && plr[pnum]._pAnimFrame > plr[myplr]._pAFNum) {\r\n\t\tif (plr[pnum].destAction == ACTION_RATTACK) {\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tStartRangeAttack(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t} else if (plr[pnum].destAction == ACTION_RATTACKMON) {\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\tStartRangeAttack(pnum, d, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t} else if (plr[pnum].destAction == ACTION_RATTACKPLR) {\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tStartRangeAttack(pnum, d, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (plr[pnum]._pmode == PM_SPELL && plr[pnum]._pAnimFrame > plr[pnum]._pSFNum) {\r\n\t\tif (plr[pnum].destAction == ACTION_SPELL) {\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tStartSpell(pnum, d, plr[pnum].destParam1, plr[pnum].destParam2);\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t} else if (plr[pnum].destAction == ACTION_SPELLMON) {\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\tStartSpell(pnum, d, monster[i]._mfutx, monster[i]._mfuty);\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t} else if (plr[pnum].destAction == ACTION_SPELLPLR) {\r\n\t\t\ti = plr[pnum].destParam1;\r\n\t\t\td = GetDirection(plr[pnum]._px, plr[pnum]._py, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tStartSpell(pnum, d, plr[i]._pfutx, plr[i]._pfuty);\r\n\t\t\tplr[pnum].destAction = ACTION_NONE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL PlrDeathModeOK(int p)\r\n{\r\n\tif (p != myplr) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PlrDeathModeOK: illegal player %d\", p);\r\n\t}\r\n\r\n\tif (plr[p]._pmode == PM_DEATH) {\r\n\t\treturn TRUE;\r\n\t} else if (plr[p]._pmode == PM_QUIT) {\r\n\t\treturn TRUE;\r\n\t} else if (plr[p]._pmode == PM_NEWLVL) {\r\n\t\treturn TRUE;\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid ValidatePlayer()\r\n{\r\n\t__int64 msk;\r\n\tint gt, pc, i, b;\r\n\r\n\tmsk = 0;\r\n\r\n\tif ((DWORD)myplr >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ValidatePlayer: illegal player %d\", myplr);\r\n\t}\r\n\tif (plr[myplr]._pLevel > MAXCHARLEVEL - 1)\r\n\t\tplr[myplr]._pLevel = MAXCHARLEVEL - 1;\r\n\tif (plr[myplr]._pExperience > plr[myplr]._pNextExper)\r\n\t\tplr[myplr]._pExperience = plr[myplr]._pNextExper;\r\n\r\n\tgt = 0;\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n\t\tif (plr[myplr].InvList[i]._itype == ITYPE_GOLD) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (plr[myplr].InvList[i]._ivalue > auricGold) {\r\n\t\t\t\tplr[myplr].InvList[i]._ivalue = auricGold;\r\n#else\r\n\t\t\tif (plr[myplr].InvList[i]._ivalue > GOLD_MAX_LIMIT) {\r\n\t\t\t\tplr[myplr].InvList[i]._ivalue = GOLD_MAX_LIMIT;\r\n#endif\r\n\t\t\t}\r\n\t\t\tgt += plr[myplr].InvList[i]._ivalue;\r\n\t\t}\r\n\t}\r\n\tif (gt != plr[myplr]._pGold)\r\n\t\tplr[myplr]._pGold = gt;\r\n\r\n\tpc = plr[myplr]._pClass;\r\n\tif (plr[myplr]._pBaseStr > MaxStats[pc][ATTRIB_STR]) {\r\n\t\tplr[myplr]._pBaseStr = MaxStats[pc][ATTRIB_STR];\r\n\t}\r\n\tif (plr[myplr]._pBaseMag > MaxStats[pc][ATTRIB_MAG]) {\r\n\t\tplr[myplr]._pBaseMag = MaxStats[pc][ATTRIB_MAG];\r\n\t}\r\n\tif (plr[myplr]._pBaseDex > MaxStats[pc][ATTRIB_DEX]) {\r\n\t\tplr[myplr]._pBaseDex = MaxStats[pc][ATTRIB_DEX];\r\n\t}\r\n\tif (plr[myplr]._pBaseVit > MaxStats[pc][ATTRIB_VIT]) {\r\n\t\tplr[myplr]._pBaseVit = MaxStats[pc][ATTRIB_VIT];\r\n\t}\r\n\r\n\tfor (b = 1; b < MAX_SPELLS; b++) {\r\n\t\tif (spelldata[b].sBookLvl != -1) {\r\n\t\t\tmsk |= SPELLBIT(b);\r\n\t\t\tif (plr[myplr]._pSplLvl[b] > MAX_SPELL_LEVEL)\r\n\t\t\t\tplr[myplr]._pSplLvl[b] = MAX_SPELL_LEVEL;\r\n\t\t}\r\n\t}\r\n\r\n\tplr[myplr]._pMemSpells &= msk;\r\n}\r\n\r\nstatic void CheckCheatStats(int pnum)\r\n{\r\n\tif (plr[pnum]._pStrength > 750) {\r\n\t\tplr[pnum]._pStrength = 750;\r\n\t}\r\n\r\n\tif (plr[pnum]._pDexterity > 750) {\r\n\t\tplr[pnum]._pDexterity = 750;\r\n\t}\r\n\r\n\tif (plr[pnum]._pMagic > 750) {\r\n\t\tplr[pnum]._pMagic = 750;\r\n\t}\r\n\r\n\tif (plr[pnum]._pVitality > 750) {\r\n\t\tplr[pnum]._pVitality = 750;\r\n\t}\r\n\r\n\tif (plr[pnum]._pHitPoints > 128000) {\r\n\t\tplr[pnum]._pHitPoints = 128000;\r\n\t}\r\n\r\n\tif (plr[pnum]._pMana > 128000) {\r\n\t\tplr[pnum]._pMana = 128000;\r\n\t}\r\n}\r\n\r\nvoid ProcessPlayers()\r\n{\r\n\tint pnum;\r\n\tBOOL tplayer;\r\n\r\n\tif ((DWORD)myplr >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ProcessPlayers: illegal player %d\", myplr);\r\n\t}\r\n\r\n\tif (plr[myplr].pLvlLoad > 0) {\r\n\t\tplr[myplr].pLvlLoad--;\r\n\t}\r\n\r\n\tif (sfxdelay > 0) {\r\n\t\tsfxdelay--;\r\n\t\tif (sfxdelay == 0) {\r\n#ifdef HELLFIRE\r\n\t\t\tswitch (sfxdnum) {\r\n\t\t\tcase USFX_DEFILER1:\r\n\t\t\t\tInitQTextMsg(286);\r\n\t\t\t\tbreak;\r\n\t\t\tcase USFX_DEFILER2:\r\n\t\t\t\tInitQTextMsg(287);\r\n\t\t\t\tbreak;\r\n\t\t\tcase USFX_DEFILER3:\r\n\t\t\t\tInitQTextMsg(288);\r\n\t\t\t\tbreak;\r\n\t\t\tcase USFX_DEFILER4:\r\n\t\t\t\tInitQTextMsg(289);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n#endif\r\n\t\t\t\tPlaySFX(sfxdnum);\r\n#ifdef HELLFIRE\r\n\t\t\t}\r\n#endif\r\n\t\t}\r\n\t}\r\n\r\n\tValidatePlayer();\r\n\r\n\tfor (pnum = 0; pnum < MAX_PLRS; pnum++) {\r\n\t\tif (plr[pnum].plractive && currlevel == plr[pnum].plrlevel && (pnum == myplr || !plr[pnum]._pLvlChanging)) {\r\n\t\t\tCheckCheatStats(pnum);\r\n\r\n\t\t\tif (!PlrDeathModeOK(pnum) && (plr[pnum]._pHitPoints >> 6) <= 0) {\r\n\t\t\t\tSyncPlrKill(pnum, -1);\r\n\t\t\t}\r\n\r\n\t\t\tif (pnum == myplr) {\r\n\t\t\t\tif ((plr[pnum]._pIFlags & ISPL_DRAINLIFE) && currlevel != 0) {\r\n\t\t\t\t\tplr[pnum]._pHitPoints -= 4;\r\n\t\t\t\t\tplr[pnum]._pHPBase -= 4;\r\n\t\t\t\t\tif ((plr[pnum]._pHitPoints >> 6) <= 0) {\r\n\t\t\t\t\t\tSyncPlrKill(pnum, 0);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdrawhpflag = TRUE;\r\n\t\t\t\t}\r\n\t\t\t\tif (plr[pnum]._pIFlags & ISPL_NOMANA && plr[pnum]._pManaBase > 0) {\r\n\t\t\t\t\tplr[pnum]._pManaBase -= plr[pnum]._pMana;\r\n\t\t\t\t\tplr[pnum]._pMana = 0;\r\n\t\t\t\t\tdrawmanaflag = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\ttplayer = FALSE;\r\n\t\t\tdo {\r\n\t\t\t\tswitch (plr[pnum]._pmode) {\r\n\t\t\t\tcase PM_STAND:\r\n\t\t\t\t\ttplayer = PM_DoStand(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_WALK:\r\n\t\t\t\t\ttplayer = PM_DoWalk(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_WALK2:\r\n\t\t\t\t\ttplayer = PM_DoWalk2(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_WALK3:\r\n\t\t\t\t\ttplayer = PM_DoWalk3(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_ATTACK:\r\n\t\t\t\t\ttplayer = PM_DoAttack(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_RATTACK:\r\n\t\t\t\t\ttplayer = PM_DoRangeAttack(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_BLOCK:\r\n\t\t\t\t\ttplayer = PM_DoBlock(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_SPELL:\r\n\t\t\t\t\ttplayer = PM_DoSpell(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_GOTHIT:\r\n\t\t\t\t\ttplayer = PM_DoGotHit(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_DEATH:\r\n\t\t\t\t\ttplayer = PM_DoDeath(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase PM_NEWLVL:\r\n\t\t\t\t\ttplayer = PM_DoNewLvl(pnum);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tCheckNewPath(pnum);\r\n\t\t\t} while (tplayer);\r\n\r\n\t\t\tplr[pnum]._pAnimCnt++;\r\n\t\t\tif (plr[pnum]._pAnimCnt > plr[pnum]._pAnimDelay) {\r\n\t\t\t\tplr[pnum]._pAnimCnt = 0;\r\n\t\t\t\tplr[pnum]._pAnimFrame++;\r\n\t\t\t\tif (plr[pnum]._pAnimFrame > plr[pnum]._pAnimLen) {\r\n\t\t\t\t\tplr[pnum]._pAnimFrame = 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ClrPlrPath(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ClrPlrPath: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tmemset(plr[pnum].walkpath, WALK_NONE, sizeof(plr[pnum].walkpath));\r\n}\r\n\r\nBOOL PosOkPlayer(int pnum, int x, int y)\r\n{\r\n\tBOOL PosOK;\r\n\tDWORD p;\r\n\tchar bv;\r\n\r\n#ifndef HELLFIRE\r\n\tPosOK = FALSE;\r\n\tif (x >= 0 && x < MAXDUNX && y >= 0 && y < MAXDUNY && !SolidLoc(x, y) && dPiece[x][y] != 0) {\r\n#else\r\n\tif (dPiece[x][y] == 0)\r\n\t\treturn FALSE;\r\n\tif (SolidLoc(x, y))\r\n\t\treturn FALSE;\r\n#endif\r\n\t\tif (dPlayer[x][y] != 0) {\r\n\t\t\tif (dPlayer[x][y] > 0) {\r\n\t\t\t\tp = dPlayer[x][y] - 1;\r\n\t\t\t} else {\r\n\t\t\t\tp = -(dPlayer[x][y] + 1);\r\n\t\t\t}\r\n\t\t\tif (p != pnum\r\n#ifndef HELLFIRE\r\n\t\t\t    && p < MAX_PLRS\r\n#endif\r\n\t\t\t    && plr[p]._pHitPoints != 0) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (dMonster[x][y] != 0) {\r\n\t\t\tif (currlevel == 0) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t\tif (dMonster[x][y] <= 0) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t\tif ((monster[dMonster[x][y] - 1]._mhitpoints >> 6) > 0) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (dObject[x][y] != 0) {\r\n\t\t\tif (dObject[x][y] > 0) {\r\n\t\t\t\tbv = dObject[x][y] - 1;\r\n\t\t\t} else {\r\n\t\t\t\tbv = -(dObject[x][y] + 1);\r\n\t\t\t}\r\n\t\t\tif (object[bv]._oSolidFlag) {\r\n\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\r\n#ifndef HELLFIRE\r\n\t\tPosOK = TRUE;\r\n\t}\r\n\r\n\tif (!PosOK)\r\n\t\treturn FALSE;\r\n#endif\r\n\treturn TRUE;\r\n}\r\n\r\nvoid MakePlrPath(int pnum, int xx, int yy, BOOL endspace)\r\n{\r\n\tint path;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"MakePlrPath: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._ptargx = xx;\r\n\tplr[pnum]._ptargy = yy;\r\n\tif (plr[pnum]._pfutx == xx && plr[pnum]._pfuty == yy) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tpath = FindPath(PosOkPlayer, pnum, plr[pnum]._pfutx, plr[pnum]._pfuty, xx, yy, plr[pnum].walkpath);\r\n\tif (!path) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!endspace) {\r\n\t\tpath--;\r\n\r\n\t\tswitch (plr[pnum].walkpath[path]) {\r\n\t\tcase WALK_NE:\r\n\t\t\tyy++;\r\n\t\t\tbreak;\r\n\t\tcase WALK_NW:\r\n\t\t\txx++;\r\n\t\t\tbreak;\r\n\t\tcase WALK_SE:\r\n\t\t\txx--;\r\n\t\t\tbreak;\r\n\t\tcase WALK_SW:\r\n\t\t\tyy--;\r\n\t\t\tbreak;\r\n\t\tcase WALK_N:\r\n\t\t\txx++;\r\n\t\t\tyy++;\r\n\t\t\tbreak;\r\n\t\tcase WALK_E:\r\n\t\t\txx--;\r\n\t\t\tyy++;\r\n\t\t\tbreak;\r\n\t\tcase WALK_S:\r\n\t\t\txx--;\r\n\t\t\tyy--;\r\n\t\t\tbreak;\r\n\t\tcase WALK_W:\r\n\t\t\txx++;\r\n\t\t\tyy--;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tplr[pnum]._ptargx = xx;\r\n\t\tplr[pnum]._ptargy = yy;\r\n\t}\r\n\r\n\tplr[pnum].walkpath[path] = WALK_NONE;\r\n}\r\n\r\nvoid CheckPlrSpell()\r\n{\r\n\tBOOL addflag = FALSE;\r\n\tint rspell, sd, sl;\r\n\r\n\tif ((DWORD)myplr >= MAX_PLRS) {\r\n\t\tapp_fatal(\"CheckPlrSpell: illegal player %d\", myplr);\r\n\t}\r\n\r\n\trspell = plr[myplr]._pRSpell;\r\n\tif (rspell == SPL_INVALID) {\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tPlaySFX(PS_WARR34);\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tPlaySFX(PS_ROGUE34);\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tPlaySFX(PS_MAGE34);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tPlaySFX(PS_MONK34);\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tPlaySFX(PS_ROGUE34);\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tPlaySFX(PS_WARR34);\r\n#endif\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (leveltype == DTYPE_TOWN && !spelldata[rspell].sTownSpell) {\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tPlaySFX(PS_WARR27);\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tPlaySFX(PS_ROGUE27);\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tPlaySFX(PS_MAGE27);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tPlaySFX(PS_MONK27);\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tPlaySFX(PS_ROGUE27);\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tPlaySFX(PS_WARR27);\r\n#endif\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (pcurs != CURSOR_HAND)\r\n\t\treturn;\r\n\r\n\tif (((MouseY >= PANEL_TOP)\r\n\t        || (chrflag && MouseX < SPANEL_WIDTH) || (invflag && MouseX > RIGHT_PANEL))\r\n\t    && ((MouseY >= PANEL_TOP) || (rspell != SPL_HEAL && rspell != SPL_IDENTIFY && rspell != SPL_REPAIR && rspell != SPL_INFRA && rspell != SPL_RECHARGE))) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tswitch (plr[myplr]._pRSplType) {\r\n\tcase RSPLTYPE_SKILL:\r\n\tcase RSPLTYPE_SPELL:\r\n\t\taddflag = CheckSpell(myplr, rspell, plr[myplr]._pRSplType, FALSE);\r\n\t\tbreak;\r\n\tcase RSPLTYPE_SCROLL:\r\n\t\taddflag = UseScroll();\r\n\t\tbreak;\r\n\tcase RSPLTYPE_CHARGES:\r\n\t\taddflag = UseStaff();\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (addflag) {\r\n\t\tif (plr[myplr]._pRSpell == SPL_FIREWALL\r\n#ifdef HELLFIRE\r\n\t\t    || plr[myplr]._pRSpell == SPL_LIGHTWALL\r\n#endif\r\n\t\t) {\r\n\t\t\tsd = GetDirection(plr[myplr]._px, plr[myplr]._py, cursmx, cursmy);\r\n\t\t\tsl = GetSpellLevel(myplr, plr[myplr]._pRSpell);\r\n\t\t\tNetSendCmdLocParam3(TRUE, CMD_SPELLXYD, cursmx, cursmy, plr[myplr]._pRSpell, sd, sl);\r\n\t\t} else if (pcursmonst != -1) {\r\n\t\t\tsl = GetSpellLevel(myplr, plr[myplr]._pRSpell);\r\n\t\t\tNetSendCmdParam3(TRUE, CMD_SPELLID, pcursmonst, plr[myplr]._pRSpell, sl);\r\n\t\t} else if (pcursplr != -1) {\r\n\t\t\tsl = GetSpellLevel(myplr, plr[myplr]._pRSpell);\r\n\t\t\tNetSendCmdParam3(TRUE, CMD_SPELLPID, pcursplr, plr[myplr]._pRSpell, sl);\r\n\t\t} else { //145\r\n\t\t\tsl = GetSpellLevel(myplr, plr[myplr]._pRSpell);\r\n\t\t\tNetSendCmdLocParam2(TRUE, CMD_SPELLXY, cursmx, cursmy, plr[myplr]._pRSpell, sl);\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (plr[myplr]._pRSplType == RSPLTYPE_SPELL) {\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tPlaySFX(PS_WARR35);\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tPlaySFX(PS_ROGUE35);\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tPlaySFX(PS_MAGE35);\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tPlaySFX(PS_MONK35);\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tPlaySFX(PS_ROGUE35);\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tPlaySFX(PS_WARR35);\r\n#endif\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SyncPlrAnim(int pnum)\r\n{\r\n\tint dir, sType;\r\n\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SyncPlrAnim: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tdir = plr[pnum]._pdir;\r\n\tswitch (plr[pnum]._pmode) {\r\n\tcase PM_STAND:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pNAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_WALK:\r\n\tcase PM_WALK2:\r\n\tcase PM_WALK3:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pWAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_ATTACK:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pAAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_RATTACK:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pAAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_BLOCK:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pBAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_SPELL:\r\n\t\tif (pnum == myplr)\r\n\t\t\tsType = spelldata[plr[pnum]._pSpell].sType;\r\n\t\telse\r\n\t\t\tsType = STYPE_FIRE;\r\n\t\tif (sType == STYPE_FIRE)\r\n\t\t\tplr[pnum]._pAnimData = plr[pnum]._pFAnim[dir];\r\n\t\tif (sType == STYPE_LIGHTNING)\r\n\t\t\tplr[pnum]._pAnimData = plr[pnum]._pLAnim[dir];\r\n\t\tif (sType == STYPE_MAGIC)\r\n\t\t\tplr[pnum]._pAnimData = plr[pnum]._pTAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_GOTHIT:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pHAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_NEWLVL:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pNAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_DEATH:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pDAnim[dir];\r\n\t\tbreak;\r\n\tcase PM_QUIT:\r\n\t\tplr[pnum]._pAnimData = plr[pnum]._pNAnim[dir];\r\n\t\tbreak;\r\n\tdefault:\r\n\t\tapp_fatal(\"SyncPlrAnim\");\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid SyncInitPlrPos(int pnum)\r\n{\r\n\tint x, y, xx, yy, range;\r\n\tDWORD i;\r\n\tBOOL posOk;\r\n\r\n\tplr[pnum]._ptargx = plr[pnum]._px;\r\n\tplr[pnum]._ptargy = plr[pnum]._py;\r\n\r\n\tif (gbMaxPlayers == 1 || plr[pnum].plrlevel != currlevel) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tx = plr[pnum]._px + plrxoff2[i];\r\n\t\ty = plr[pnum]._py + plryoff2[i];\r\n\t\tif (PosOkPlayer(pnum, x, y)) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tplr[pnum]._px += plrxoff2[i];\r\n\tplr[pnum]._py += plryoff2[i];\r\n\tdPlayer[plr[pnum]._px][plr[pnum]._py] = pnum + 1;\r\n#else\r\n\tif (!PosOkPlayer(pnum, x, y)) {\r\n\t\tposOk = FALSE;\r\n\t\tfor (range = 1; range < 50 && !posOk; range++) {\r\n\t\t\tfor (yy = -range; yy <= range && !posOk; yy++) {\r\n\t\t\t\ty = yy + plr[pnum]._py;\r\n\t\t\t\tfor (xx = -range; xx <= range && !posOk; xx++) {\r\n\t\t\t\t\tx = xx + plr[pnum]._px;\r\n\t\t\t\t\tif (PosOkPlayer(pnum, x, y) && !PosOkPortal(currlevel, x, y)) {\r\n\t\t\t\t\t\tposOk = TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tplr[pnum]._px = x;\r\n\tplr[pnum]._py = y;\r\n\tdPlayer[x][y] = pnum + 1;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tplr[pnum]._pfutx = x;\r\n\t\tplr[pnum]._pfuty = y;\r\n\t\tplr[pnum]._ptargx = x;\r\n\t\tplr[pnum]._ptargy = y;\r\n\t\tViewX = x;\r\n\t\tViewY = y;\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid SyncInitPlr(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SyncInitPlr: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tSetPlrAnims(pnum);\r\n\tSyncInitPlrPos(pnum);\r\n}\r\n\r\nvoid CheckStats(int p)\r\n{\r\n\tint c, i;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"CheckStats: illegal player %d\", p);\r\n\t}\r\n\r\n\tif (plr[p]._pClass == PC_WARRIOR) {\r\n\t\tc = PC_WARRIOR;\r\n\t} else if (plr[p]._pClass == PC_ROGUE) {\r\n\t\tc = PC_ROGUE;\r\n\t} else if (plr[p]._pClass == PC_SORCERER) {\r\n\t\tc = PC_SORCERER;\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse if (plr[p]._pClass == PC_MONK) {\r\n\t\tc = PC_MONK;\r\n\t} else if (plr[p]._pClass == PC_BARD) {\r\n\t\tc = PC_BARD;\r\n\t} else if (plr[p]._pClass == PC_BARBARIAN) {\r\n\t\tc = PC_BARBARIAN;\r\n\t}\r\n#endif\r\n\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tswitch (i) {\r\n\t\tcase ATTRIB_STR:\r\n\t\t\tif (plr[p]._pBaseStr > MaxStats[c][ATTRIB_STR]) {\r\n\t\t\t\tplr[p]._pBaseStr = MaxStats[c][ATTRIB_STR];\r\n\t\t\t} else if (plr[p]._pBaseStr < 0) {\r\n\t\t\t\tplr[p]._pBaseStr = 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ATTRIB_MAG:\r\n\t\t\tif (plr[p]._pBaseMag > MaxStats[c][ATTRIB_MAG]) {\r\n\t\t\t\tplr[p]._pBaseMag = MaxStats[c][ATTRIB_MAG];\r\n\t\t\t} else if (plr[p]._pBaseMag < 0) {\r\n\t\t\t\tplr[p]._pBaseMag = 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ATTRIB_DEX:\r\n\t\t\tif (plr[p]._pBaseDex > MaxStats[c][ATTRIB_DEX]) {\r\n\t\t\t\tplr[p]._pBaseDex = MaxStats[c][ATTRIB_DEX];\r\n\t\t\t} else if (plr[p]._pBaseDex < 0) {\r\n\t\t\t\tplr[p]._pBaseDex = 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase ATTRIB_VIT:\r\n\t\t\tif (plr[p]._pBaseVit > MaxStats[c][ATTRIB_VIT]) {\r\n\t\t\t\tplr[p]._pBaseVit = MaxStats[c][ATTRIB_VIT];\r\n\t\t\t} else if (plr[p]._pBaseVit < 0) {\r\n\t\t\t\tplr[p]._pBaseVit = 0;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ModifyPlrStr(int p, int l)\r\n{\r\n\tint max;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ModifyPlrStr: illegal player %d\", p);\r\n\t}\r\n\r\n\tmax = MaxStats[plr[p]._pClass][ATTRIB_STR];\r\n\tif (plr[p]._pBaseStr + l > max) {\r\n\t\tl = max - plr[p]._pBaseStr;\r\n\t}\r\n\r\n\tplr[p]._pStrength += l;\r\n\tplr[p]._pBaseStr += l;\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[p]._pClass == PC_ROGUE) {\r\n\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 200;\r\n\t} else {\r\n\t\tplr[p]._pDamageMod = plr[p]._pLevel * plr[p]._pStrength / 100;\r\n\t}\r\n#endif\r\n\r\n\tCalcPlrInv(p, TRUE);\r\n\r\n\tif (p == myplr) {\r\n\t\tNetSendCmdParam1(FALSE, CMD_SETSTR, plr[p]._pBaseStr);\r\n\t}\r\n}\r\n\r\nvoid ModifyPlrMag(int p, int l)\r\n{\r\n\tint max, ms;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ModifyPlrMag: illegal player %d\", p);\r\n\t}\r\n\r\n\tmax = MaxStats[plr[p]._pClass][ATTRIB_MAG];\r\n\tif (plr[p]._pBaseMag + l > max) {\r\n\t\tl = max - plr[p]._pBaseMag;\r\n\t}\r\n\r\n\tplr[p]._pMagic += l;\r\n\tplr[p]._pBaseMag += l;\r\n\r\n\tms = l << 6;\r\n\tif (plr[p]._pClass == PC_SORCERER) {\r\n\t\tms <<= 1;\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse if (plr[p]._pClass == PC_BARD) {\r\n\t\tms += ms >> 1;\r\n\t}\r\n#endif\r\n\r\n\tplr[p]._pMaxManaBase += ms;\r\n\tplr[p]._pMaxMana += ms;\r\n\tif (!(plr[p]._pIFlags & ISPL_NOMANA)) {\r\n\t\tplr[p]._pManaBase += ms;\r\n\t\tplr[p]._pMana += ms;\r\n\t}\r\n\r\n\tCalcPlrInv(p, TRUE);\r\n\r\n\tif (p == myplr) {\r\n\t\tNetSendCmdParam1(FALSE, CMD_SETMAG, plr[p]._pBaseMag);\r\n\t}\r\n}\r\n\r\nvoid ModifyPlrDex(int p, int l)\r\n{\r\n\tint max;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ModifyPlrDex: illegal player %d\", p);\r\n\t}\r\n\r\n\tmax = MaxStats[plr[p]._pClass][ATTRIB_DEX];\r\n\tif (plr[p]._pBaseDex + l > max) {\r\n\t\tl = max - plr[p]._pBaseDex;\r\n\t}\r\n\r\n\tplr[p]._pDexterity += l;\r\n\tplr[p]._pBaseDex += l;\r\n\tCalcPlrInv(p, TRUE);\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[p]._pClass == PC_ROGUE) {\r\n\t\tplr[p]._pDamageMod = plr[p]._pLevel * (plr[p]._pDexterity + plr[p]._pStrength) / 200;\r\n\t}\r\n#endif\r\n\r\n\tif (p == myplr) {\r\n\t\tNetSendCmdParam1(FALSE, CMD_SETDEX, plr[p]._pBaseDex);\r\n\t}\r\n}\r\n\r\nvoid ModifyPlrVit(int p, int l)\r\n{\r\n\tint max, ms;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"ModifyPlrVit: illegal player %d\", p);\r\n\t}\r\n\r\n\tmax = MaxStats[plr[p]._pClass][ATTRIB_VIT];\r\n\tif (plr[p]._pBaseVit + l > max) {\r\n\t\tl = max - plr[p]._pBaseVit;\r\n\t}\r\n\r\n\tplr[p]._pVitality += l;\r\n\tplr[p]._pBaseVit += l;\r\n\r\n\tms = l << 6;\r\n\tif (plr[p]._pClass == PC_WARRIOR) {\r\n\t\tms <<= 1;\r\n#ifdef HELLFIRE\r\n\t} else if (plr[p]._pClass == PC_BARBARIAN) {\r\n\t\tms <<= 1;\r\n#endif\r\n\t}\r\n\r\n\tplr[p]._pHPBase += ms;\r\n\tplr[p]._pMaxHPBase += ms;\r\n\tplr[p]._pHitPoints += ms;\r\n\tplr[p]._pMaxHP += ms;\r\n\r\n\tCalcPlrInv(p, TRUE);\r\n\r\n\tif (p == myplr) {\r\n\t\tNetSendCmdParam1(FALSE, CMD_SETVIT, plr[p]._pBaseVit);\r\n\t}\r\n}\r\n\r\nvoid SetPlayerHitPoints(int pnum, int val)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SetPlayerHitPoints: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum]._pHitPoints = val;\r\n\tplr[pnum]._pHPBase = val + plr[pnum]._pMaxHPBase - plr[pnum]._pMaxHP;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tdrawhpflag = TRUE;\r\n\t}\r\n}\r\n\r\nvoid SetPlrStr(int p, int v)\r\n{\r\n\tint dm;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SetPlrStr: illegal player %d\", p);\r\n\t}\r\n\r\n\tplr[p]._pBaseStr = v;\r\n\tCalcPlrInv(p, TRUE);\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[p]._pClass == PC_ROGUE) {\r\n\t\tdm = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 200;\r\n\t} else {\r\n\t\tdm = plr[p]._pLevel * plr[p]._pStrength / 100;\r\n\t}\r\n\r\n\tplr[p]._pDamageMod = dm;\r\n#endif\r\n}\r\n\r\nvoid SetPlrMag(int p, int v)\r\n{\r\n\tint m;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SetPlrMag: illegal player %d\", p);\r\n\t}\r\n\r\n\tplr[p]._pBaseMag = v;\r\n\r\n\tm = v << 6;\r\n\tif (plr[p]._pClass == PC_SORCERER) {\r\n\t\tm <<= 1;\r\n#ifdef HELLFIRE\r\n\t} else if (plr[p]._pClass == PC_BARD) {\r\n\t\tm += m >> 1;\r\n#endif\r\n\t}\r\n\r\n\tplr[p]._pMaxManaBase = m;\r\n\tplr[p]._pMaxMana = m;\r\n\tCalcPlrInv(p, TRUE);\r\n}\r\n\r\nvoid SetPlrDex(int p, int v)\r\n{\r\n\tint dm;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SetPlrDex: illegal player %d\", p);\r\n\t}\r\n\r\n\tplr[p]._pBaseDex = v;\r\n\tCalcPlrInv(p, TRUE);\r\n\r\n#ifndef HELLFIRE\r\n\tif (plr[p]._pClass == PC_ROGUE) {\r\n\t\tdm = plr[p]._pLevel * (plr[p]._pStrength + plr[p]._pDexterity) / 200;\r\n\t} else {\r\n\t\tdm = plr[p]._pStrength * plr[p]._pLevel / 100;\r\n\t}\r\n\r\n\tplr[p]._pDamageMod = dm;\r\n#endif\r\n}\r\n\r\nvoid SetPlrVit(int p, int v)\r\n{\r\n\tint hp;\r\n\r\n\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\tapp_fatal(\"SetPlrVit: illegal player %d\", p);\r\n\t}\r\n\r\n\tplr[p]._pBaseVit = v;\r\n\r\n\thp = v << 6;\r\n\tif (plr[p]._pClass == PC_WARRIOR) {\r\n\t\thp <<= 1;\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse if (plr[p]._pClass == PC_BARBARIAN) {\r\n\t\thp <<= 1;\r\n\t}\r\n#endif\r\n\r\n\tplr[p]._pHPBase = hp;\r\n\tplr[p]._pMaxHPBase = hp;\r\n\tCalcPlrInv(p, TRUE);\r\n}\r\n\r\nvoid InitDungMsgs(int pnum)\r\n{\r\n\tif ((DWORD)pnum >= MAX_PLRS) {\r\n\t\tapp_fatal(\"InitDungMsgs: illegal player %d\", pnum);\r\n\t}\r\n\r\n\tplr[pnum].pDungMsgs = 0;\r\n#ifdef HELLFIRE\r\n\tplr[pnum].pDungMsgs2 = 0;\r\n#endif\r\n}\r\n\r\nvoid PlayDungMsgs()\r\n{\r\n\tif ((DWORD)myplr >= MAX_PLRS) {\r\n\t\tapp_fatal(\"PlayDungMsgs: illegal player %d\", myplr);\r\n\t}\r\n\r\n\tif (currlevel == 1 && !plr[myplr]._pLvlVisited[1] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs & DMSG_CATHEDRAL)) {\r\n\t\tsfxdelay = 40;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR97;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE97;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE97;\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK97;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE97;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR97;\r\n#endif\r\n#endif\r\n\t\t}\r\n\t\tplr[myplr].pDungMsgs = plr[myplr].pDungMsgs | DMSG_CATHEDRAL;\r\n\t} else if (currlevel == 5 && !plr[myplr]._pLvlVisited[5] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs & DMSG_CATACOMBS)) {\r\n\t\tsfxdelay = 40;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR96B;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE96;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE96;\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK96;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE96;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR96B;\r\n#endif\r\n#endif\r\n\t\t}\r\n\t\tplr[myplr].pDungMsgs |= DMSG_CATACOMBS;\r\n\t} else if (currlevel == 9 && !plr[myplr]._pLvlVisited[9] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs & DMSG_CAVES)) {\r\n\t\tsfxdelay = 40;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR98;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE98;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE98;\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK98;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE98;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR98;\r\n#endif\r\n#endif\r\n\t\t}\r\n\t\tplr[myplr].pDungMsgs |= DMSG_CAVES;\r\n\t} else if (currlevel == 13 && !plr[myplr]._pLvlVisited[13] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs & DMSG_HELL)) {\r\n\t\tsfxdelay = 40;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR99;\r\n#ifndef SPAWN\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE99;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE99;\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK99;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE99;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR99;\r\n#endif\r\n#endif\r\n\t\t}\r\n\t\tplr[myplr].pDungMsgs |= DMSG_HELL;\r\n\t} else if (currlevel == 16 && !plr[myplr]._pLvlVisited[15] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs & DMSG_DIABLO)) { // BUGFIX: _pLvlVisited should check 16 or this message will never play\r\n\t\tsfxdelay = 40;\r\n#ifndef SPAWN\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR || plr[myplr]._pClass == PC_ROGUE || plr[myplr]._pClass == PC_SORCERER || plr[myplr]._pClass == PC_MONK || plr[myplr]._pClass == PC_BARD || plr[myplr]._pClass == PC_BARBARIAN) {\r\n#else\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR || plr[myplr]._pClass == PC_ROGUE || plr[myplr]._pClass == PC_SORCERER) {\r\n#endif\r\n\t\t\tsfxdnum = PS_DIABLVLINT;\r\n\t\t}\r\n#endif\r\n\t\tplr[myplr].pDungMsgs |= DMSG_DIABLO;\r\n#ifdef HELLFIRE\r\n\t} else if (currlevel == 17 && !plr[myplr]._pLvlVisited[17] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs2 & 1)) {\r\n\t\tsfxdelay = 10;\r\n\t\tsfxdnum = USFX_DEFILER1;\r\n\t\tquests[Q_DEFILER]._qactive = QUEST_ACTIVE;\r\n\t\tquests[Q_DEFILER]._qlog = TRUE;\r\n\t\tquests[Q_DEFILER]._qmsg = 286;\r\n\t\tplr[myplr].pDungMsgs2 |= 1;\r\n\t} else if (currlevel == 19 && !plr[myplr]._pLvlVisited[19] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs2 & 4)) {\r\n\t\tsfxdelay = 10;\r\n\t\tsfxdnum = USFX_DEFILER3;\r\n\t\tplr[myplr].pDungMsgs2 |= 4;\r\n\t} else if (currlevel == 21 && !plr[myplr]._pLvlVisited[21] && gbMaxPlayers == 1 && !(plr[myplr].pDungMsgs & 32)) {\r\n\t\tsfxdelay = 30;\r\n#ifndef SPAWN\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR92;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE92;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE92;\r\n\t\t} else\r\n#endif\r\n\t\t    if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK92;\r\n\t\t}\r\n#ifndef SPAWN\r\n\t\telse if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE92;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR92;\r\n\t\t}\r\n#endif\r\n\t\tplr[myplr].pDungMsgs |= 32;\r\n#endif\r\n\t} else {\r\n\t\tsfxdelay = 0;\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nint get_max_strength(int i)\r\n{\r\n\treturn MaxStats[i][ATTRIB_STR];\r\n}\r\n\r\nint get_max_magic(int i)\r\n{\r\n\treturn MaxStats[i][ATTRIB_MAG];\r\n}\r\n\r\nint get_max_dexterity(int i)\r\n{\r\n\treturn MaxStats[i][ATTRIB_DEX];\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/player.h",
    "content": "/**\r\n * @file player.h\r\n *\r\n * Interface of player functionality, leveling, actions, creation, loading, etc.\r\n */\r\n#ifndef __PLAYER_H__\r\n#define __PLAYER_H__\r\n\r\nextern int myplr;\r\n#ifdef HELLFIRE\r\nextern PlayerStruct *plr;\r\n#else\r\nextern PlayerStruct plr[MAX_PLRS];\r\n#endif\r\nextern BOOL deathflag;\r\n\r\nvoid LoadPlrGFX(int pnum, player_graphic gfxflag);\r\nvoid InitPlayerGFX(int pnum);\r\nvoid InitPlrGFXMem(int pnum);\r\nvoid FreePlayerGFX(int pnum);\r\nvoid NewPlrAnim(int pnum, BYTE *Peq, int numFrames, int Delay, int width);\r\nvoid SetPlrAnims(int pnum);\r\nvoid ClearPlrRVars(PlayerStruct *p);\r\nvoid CreatePlayer(int pnum, char c);\r\nint CalcStatDiff(int pnum);\r\nvoid NextPlrLevel(int pnum);\r\nvoid AddPlrExperience(int pnum, int lvl, int exp);\r\nvoid AddPlrMonstExper(int lvl, int exp, char pmask);\r\nvoid InitPlayer(int pnum, BOOL FirstTime);\r\nvoid InitMultiView();\r\nvoid CheckEFlag(int pnum, BOOL flag);\r\nBOOL SolidLoc(int x, int y);\r\nvoid PlrClrTrans(int x, int y);\r\nvoid PlrDoTrans(int x, int y);\r\nvoid SetPlayerOld(int pnum);\r\nvoid FixPlayerLocation(int pnum, int bDir);\r\nvoid StartStand(int pnum, int dir);\r\nvoid StartAttack(int pnum, int d);\r\nvoid StartPlrBlock(int pnum, int dir);\r\nvoid FixPlrWalkTags(int pnum);\r\nvoid RemovePlrFromMap(int pnum);\r\nvoid StartPlrHit(int pnum, int dam, BOOL forcehit);\r\nvoid StartPlayerKill(int pnum, int earflag);\r\nvoid DropHalfPlayersGold(int pnum);\r\n#ifdef HELLFIRE\r\nvoid StripTopGold(int pnum);\r\n#endif\r\nvoid SyncPlrKill(int pnum, int earflag);\r\nvoid RemovePlrMissiles(int pnum);\r\nvoid StartNewLvl(int pnum, int fom, int lvl);\r\nvoid RestartTownLvl(int pnum);\r\nvoid StartWarpLvl(int pnum, int pidx);\r\nvoid ProcessPlayers();\r\nvoid ClrPlrPath(int pnum);\r\nBOOL PosOkPlayer(int pnum, int x, int y);\r\nvoid MakePlrPath(int pnum, int xx, int yy, BOOL endspace);\r\nvoid CheckPlrSpell();\r\nvoid SyncPlrAnim(int pnum);\r\nvoid SyncInitPlrPos(int pnum);\r\nvoid SyncInitPlr(int pnum);\r\nvoid CheckStats(int p);\r\nvoid ModifyPlrStr(int p, int l);\r\nvoid ModifyPlrMag(int p, int l);\r\nvoid ModifyPlrDex(int p, int l);\r\nvoid ModifyPlrVit(int p, int l);\r\nvoid SetPlayerHitPoints(int pnum, int val);\r\nvoid SetPlrStr(int p, int v);\r\nvoid SetPlrMag(int p, int v);\r\nvoid SetPlrDex(int p, int v);\r\nvoid SetPlrVit(int p, int v);\r\nvoid InitDungMsgs(int pnum);\r\nvoid PlayDungMsgs();\r\n#ifdef HELLFIRE\r\nint get_max_strength(int i);\r\nint get_max_magic(int i);\r\nint get_max_dexterity(int i);\r\n#endif\r\n\r\n/* data */\r\n\r\nextern int plrxoff[9];\r\nextern int plryoff[9];\r\nextern int plrxoff2[9];\r\nextern int plryoff2[9];\r\nextern int StrengthTbl[NUM_CLASSES];\r\nextern int MagicTbl[NUM_CLASSES];\r\nextern int DexterityTbl[NUM_CLASSES];\r\nextern int VitalityTbl[NUM_CLASSES];\r\nextern int MaxStats[NUM_CLASSES][4];\r\nextern const char *const ClassStrTbl[NUM_CLASSES];\r\n\r\n#endif /* __PLAYER_H__ */\r\n"
  },
  {
    "path": "Source/plrmsg.cpp",
    "content": "/**\r\n * @file plrmsg.cpp\r\n *\r\n * Implementation of functionality for printing the ingame chat messages.\r\n */\r\n#include \"all.h\"\r\n\r\nstatic BYTE plr_msg_slot;\r\n_plrmsg plr_msgs[PMSG_COUNT];\r\n\r\n/** Maps from player_num to text colour, as used in chat messages. */\r\nconst char text_color_from_player_num[MAX_PLRS + 1] = { COL_WHITE, COL_WHITE, COL_WHITE, COL_WHITE, COL_GOLD };\r\n\r\nvoid plrmsg_delay(BOOL delay)\r\n{\r\n\tint i;\r\n\t_plrmsg *pMsg;\r\n\tstatic DWORD plrmsg_ticks;\r\n\r\n\tif (delay) {\r\n\t\tplrmsg_ticks = -GetTickCount();\r\n\t\treturn;\r\n\t}\r\n\r\n\tplrmsg_ticks += GetTickCount();\r\n\tpMsg = plr_msgs;\r\n\tfor (i = 0; i < PMSG_COUNT; i++, pMsg++)\r\n\t\tpMsg->time += plrmsg_ticks;\r\n}\r\n\r\nchar *ErrorPlrMsg(const char *pszMsg)\r\n{\r\n\tchar *result;\r\n\t_plrmsg *pMsg = &plr_msgs[plr_msg_slot];\r\n\tplr_msg_slot = (plr_msg_slot + 1) & (PMSG_COUNT - 1);\r\n\tpMsg->player = MAX_PLRS;\r\n\tpMsg->time = GetTickCount();\r\n\tresult = strncpy(pMsg->str, pszMsg, sizeof(pMsg->str));\r\n\tpMsg->str[sizeof(pMsg->str) - 1] = '\\0';\r\n\treturn result;\r\n}\r\n\r\nsize_t __cdecl EventPlrMsg(const char *pszFmt, ...)\r\n{\r\n\t_plrmsg *pMsg;\r\n\tva_list va;\r\n\r\n\tva_start(va, pszFmt);\r\n\tpMsg = &plr_msgs[plr_msg_slot];\r\n\tplr_msg_slot = (plr_msg_slot + 1) & (PMSG_COUNT - 1);\r\n\tpMsg->player = MAX_PLRS;\r\n\tpMsg->time = GetTickCount();\r\n\tvsprintf(pMsg->str, pszFmt, va);\r\n\tva_end(va);\r\n\treturn strlen(pMsg->str);\r\n}\r\n\r\nvoid SendPlrMsg(int pnum, const char *pszStr)\r\n{\r\n\t_plrmsg *pMsg = &plr_msgs[plr_msg_slot];\r\n\tplr_msg_slot = (plr_msg_slot + 1) & (PMSG_COUNT - 1);\r\n\tpMsg->player = pnum;\r\n\tpMsg->time = GetTickCount();\r\n\tstrlen(plr[pnum]._pName); /* these are used in debug */\r\n\tstrlen(pszStr);\r\n\tsprintf(pMsg->str, \"%s (lvl %d): %s\", plr[pnum]._pName, plr[pnum]._pLevel, pszStr);\r\n}\r\n\r\nvoid ClearPlrMsg()\r\n{\r\n\tint i;\r\n\t_plrmsg *pMsg = plr_msgs;\r\n\tDWORD tick = GetTickCount();\r\n\r\n\tfor (i = 0; i < PMSG_COUNT; i++, pMsg++) {\r\n\t\tif ((int)(tick - pMsg->time) > 10000)\r\n\t\t\tpMsg->str[0] = '\\0';\r\n\t}\r\n}\r\n\r\nvoid InitPlrMsg()\r\n{\r\n\tmemset(plr_msgs, 0, sizeof(plr_msgs));\r\n\tplr_msg_slot = 0;\r\n}\r\n\r\nvoid DrawPlrMsg()\r\n{\r\n\tint i;\r\n\tDWORD x = 10 + SCREEN_X;\r\n\tDWORD y = 70 + SCREEN_Y;\r\n\tDWORD width = SCREEN_WIDTH - 20;\r\n\t_plrmsg *pMsg;\r\n\r\n\tif (chrflag || questlog) {\r\n\t\tif (invflag || sbookflag)\r\n\t\t\treturn;\r\n\t\tx += SPANEL_WIDTH;\r\n\t\twidth -= SPANEL_WIDTH;\r\n\t} else if (invflag || sbookflag)\r\n\t\twidth -= SPANEL_WIDTH;\r\n\r\n\tpMsg = plr_msgs;\r\n\tfor (i = 0; i < PMSG_COUNT; i++) {\r\n\t\tif (pMsg->str[0])\r\n\t\t\tPrintPlrMsg(x, y, width, pMsg->str, text_color_from_player_num[pMsg->player]);\r\n\t\tpMsg++;\r\n\t\ty += 35;\r\n\t}\r\n}\r\n\r\nvoid PrintPlrMsg(DWORD x, DWORD y, DWORD width, const char *str, BYTE col)\r\n{\r\n\tint line = 0;\r\n\r\n\twhile (*str) {\r\n\t\tBYTE c;\r\n\t\tint screen = PitchTbl[y] + x;\r\n\t\tDWORD len = 0;\r\n\t\tconst char *sstr = str;\r\n\t\tconst char *endstr = sstr;\r\n\r\n\t\twhile (1) {\r\n\t\t\tif (*sstr) {\r\n\t\t\t\tc = gbFontTransTbl[(BYTE)*sstr++];\r\n\t\t\t\tc = fontframe[c];\r\n\t\t\t\tlen += fontkern[c] + 1;\r\n\t\t\t\tif (!c) // allow wordwrap on blank glyph\r\n\t\t\t\t\tendstr = sstr;\r\n\t\t\t\telse if (len >= width)\r\n\t\t\t\t\tbreak;\r\n\t\t\t} else {\r\n\t\t\t\tendstr = sstr;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\twhile (str < endstr) {\r\n\t\t\tc = gbFontTransTbl[(BYTE)*str++];\r\n\t\t\tc = fontframe[c];\r\n\t\t\tif (c)\r\n\t\t\t\tPrintChar(screen, c, col);\r\n\t\t\tscreen += fontkern[c] + 1;\r\n\t\t}\r\n\r\n\t\ty += 10;\r\n\t\tline++;\r\n\t\tif (line == 3)\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/plrmsg.h",
    "content": "/**\r\n * @file plrmsg.h\r\n *\r\n * Interface of functionality for printing the ingame chat messages.\r\n */\r\n#ifndef __PLRMSG_H__\r\n#define __PLRMSG_H__\r\n\r\nvoid plrmsg_delay(BOOL delay);\r\nchar *ErrorPlrMsg(const char *pszMsg);\r\nsize_t __cdecl EventPlrMsg(const char *pszFmt, ...);\r\nvoid SendPlrMsg(int pnum, const char *pszStr);\r\nvoid ClearPlrMsg();\r\nvoid InitPlrMsg();\r\nvoid DrawPlrMsg();\r\nvoid PrintPlrMsg(DWORD x, DWORD y, DWORD width, const char *str, BYTE col);\r\n\r\n#endif /* __PLRMSG_H__ */\r\n"
  },
  {
    "path": "Source/portal.cpp",
    "content": "/**\r\n * @file portal.cpp\r\n *\r\n * Implementation of functionality for handling town portals.\r\n */\r\n#include \"all.h\"\r\n\r\n/** In-game state of portals. */\r\nPortalStruct portal[MAXPORTAL];\r\n/** Current portal number (a portal array index). */\r\nint portalindex;\r\n\r\n/** X-coordinate of each players portal in town. */\r\nint WarpDropX[MAXPORTAL] = { 57, 59, 61, 63 };\r\n/** Y-coordinate of each players portal in town. */\r\nint WarpDropY[MAXPORTAL] = { 40, 40, 40, 40 };\r\n\r\nvoid InitPortals()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAXPORTAL; i++) {\r\n\t\tif (delta_portal_inited(i))\r\n\t\t\tportal[i].open = FALSE;\r\n\t}\r\n}\r\n\r\nvoid SetPortalStats(int i, BOOL o, int x, int y, int lvl, int lvltype)\r\n{\r\n\tportal[i].open = o;\r\n\tportal[i].x = x;\r\n\tportal[i].y = y;\r\n\tportal[i].level = lvl;\r\n\tportal[i].ltype = lvltype;\r\n\tportal[i].setlvl = FALSE;\r\n}\r\n\r\nvoid AddWarpMissile(int i, int x, int y)\r\n{\r\n\tint mi;\r\n\r\n\tmissiledata[MIS_TOWN].mlSFX = -1;\r\n\tdMissile[x][y] = 0;\r\n\tmi = AddMissile(0, 0, x, y, 0, MIS_TOWN, TARGET_MONSTERS, i, 0, 0);\r\n\r\n\tif (mi != -1) {\r\n\t\tSetMissDir(mi, 1);\r\n\r\n\t\tif (currlevel != 0)\r\n\t\t\tmissile[mi]._mlid = AddLight(missile[mi]._mix, missile[mi]._miy, 15);\r\n\r\n\t\tmissiledata[MIS_TOWN].mlSFX = LS_SENTINEL;\r\n\t}\r\n}\r\n\r\nvoid SyncPortals()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAXPORTAL; i++) {\r\n\t\tif (!portal[i].open)\r\n\t\t\tcontinue;\r\n\t\tif (currlevel == 0)\r\n\t\t\tAddWarpMissile(i, WarpDropX[i], WarpDropY[i]);\r\n\t\telse {\r\n\t\t\tint lvl = currlevel;\r\n\t\t\tif (setlevel)\r\n\t\t\t\tlvl = setlvlnum;\r\n\t\t\tif (portal[i].level == lvl)\r\n\t\t\t\tAddWarpMissile(i, portal[i].x, portal[i].y);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid AddInTownPortal(int i)\r\n{\r\n\tAddWarpMissile(i, WarpDropX[i], WarpDropY[i]);\r\n}\r\n\r\nvoid ActivatePortal(int i, int x, int y, int lvl, int lvltype, BOOL sp)\r\n{\r\n\tportal[i].open = TRUE;\r\n\r\n\tif (lvl != 0) {\r\n\t\tportal[i].x = x;\r\n\t\tportal[i].y = y;\r\n\t\tportal[i].level = lvl;\r\n\t\tportal[i].ltype = lvltype;\r\n\t\tportal[i].setlvl = sp;\r\n\t}\r\n}\r\n\r\nvoid DeactivatePortal(int i)\r\n{\r\n\tportal[i].open = FALSE;\r\n}\r\n\r\nBOOL PortalOnLevel(int i)\r\n{\r\n\tif (portal[i].level == currlevel)\r\n\t\treturn TRUE;\r\n\telse\r\n\t\treturn currlevel == 0;\r\n}\r\n\r\nvoid RemovePortalMissile(int id)\r\n{\r\n\tint i;\r\n\tint mi;\r\n\r\n\tfor (i = 0; i < nummissiles; i++) {\r\n\t\tmi = missileactive[i];\r\n\t\tif (missile[mi]._mitype == MIS_TOWN && missile[mi]._misource == id) {\r\n\t\t\tdFlags[missile[mi]._mix][missile[mi]._miy] &= ~BFLAG_MISSILE;\r\n\t\t\tdMissile[missile[mi]._mix][missile[mi]._miy] = 0;\r\n\r\n\t\t\tif (portal[id].level != 0)\r\n\t\t\t\tAddUnLight(missile[mi]._mlid);\r\n\r\n\t\t\tDeleteMissile(mi, i);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetCurrentPortal(int p)\r\n{\r\n\tportalindex = p;\r\n}\r\n\r\nvoid GetPortalLevel()\r\n{\r\n\tif (currlevel != 0) {\r\n\t\tsetlevel = FALSE;\r\n\t\tcurrlevel = 0;\r\n\t\tplr[myplr].plrlevel = 0;\r\n\t\tleveltype = DTYPE_TOWN;\r\n\t} else {\r\n\t\tif (portal[portalindex].setlvl) {\r\n\t\t\tsetlevel = TRUE;\r\n\t\t\tsetlvlnum = portal[portalindex].level;\r\n\t\t\tcurrlevel = portal[portalindex].level;\r\n\t\t\tplr[myplr].plrlevel = setlvlnum;\r\n\t\t\tleveltype = portal[portalindex].ltype;\r\n\t\t} else {\r\n\t\t\tsetlevel = FALSE;\r\n\t\t\tcurrlevel = portal[portalindex].level;\r\n\t\t\tplr[myplr].plrlevel = currlevel;\r\n\t\t\tleveltype = portal[portalindex].ltype;\r\n\t\t}\r\n\t\tif (portalindex == myplr) {\r\n\t\t\tNetSendCmd(TRUE, CMD_DEACTIVATEPORTAL);\r\n\t\t\tDeactivatePortal(portalindex);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid GetPortalLvlPos()\r\n{\r\n\tif (currlevel == 0) {\r\n\t\tViewX = WarpDropX[portalindex] + 1;\r\n\t\tViewY = WarpDropY[portalindex] + 1;\r\n\t} else {\r\n\t\tViewX = portal[portalindex].x;\r\n\t\tViewY = portal[portalindex].y;\r\n\r\n\t\tif (portalindex != myplr) {\r\n\t\t\tViewX++;\r\n\t\t\tViewY++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL PosOkPortal(int lvl, int x, int y)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAXPORTAL; i++) {\r\n\t\tif (portal[i].open && portal[i].level == lvl && ((portal[i].x == x && portal[i].y == y) || (portal[i].x == x - 1 && portal[i].y == y - 1)))\r\n\t\t\treturn TRUE;\r\n\t}\r\n\treturn FALSE;\r\n}\r\n"
  },
  {
    "path": "Source/portal.h",
    "content": "/**\r\n * @file portal.h\r\n *\r\n * Interface of functionality for handling town portals.\r\n */\r\n#ifndef __PORTAL_H__\r\n#define __PORTAL_H__\r\n\r\nextern PortalStruct portal[MAXPORTAL];\r\n\r\nvoid InitPortals();\r\nvoid SetPortalStats(int i, BOOL o, int x, int y, int lvl, int lvltype);\r\nvoid AddWarpMissile(int i, int x, int y);\r\nvoid SyncPortals();\r\nvoid AddInTownPortal(int i);\r\nvoid ActivatePortal(int i, int x, int y, int lvl, int lvltype, BOOL sp);\r\nvoid DeactivatePortal(int i);\r\nBOOL PortalOnLevel(int i);\r\nvoid RemovePortalMissile(int id);\r\nvoid SetCurrentPortal(int p);\r\nvoid GetPortalLevel();\r\nvoid GetPortalLvlPos();\r\nBOOL PosOkPortal(int lvl, int x, int y);\r\n\r\n#endif /* __PORTAL_H__ */\r\n"
  },
  {
    "path": "Source/quests.cpp",
    "content": "/**\r\n * @file quests.cpp\r\n *\r\n * Implementation of functionality for handling quests.\r\n */\r\n#include \"all.h\"\r\n\r\nint qtopline;\r\nBOOL questlog;\r\nBYTE *pQLogCel;\r\n/** Contains the quests of the current game. */\r\nQuestStruct quests[MAXQUESTS];\r\nint qline;\r\nint qlist[MAXQUESTS];\r\nint numqlines;\r\nint WaterDone;\r\nint ReturnLvlX;\r\nint ReturnLvlY;\r\nint ReturnLvlT;\r\n/** current frame # for the quest pentagram selector */\r\nint questpentframe;\r\nint ReturnLvl;\r\n\r\n/** Contains the data related to each quest_id. */\r\nQuestData questlist[MAXQUESTS] = {\r\n\t// clang-format off\r\n\t// _qdlvl,  _qdmultlvl, _qlvlt,          _qdtype,     _qdrnd,  _qslvl,  _qflags,       _qdmsg,        _qlstr\r\n\t{       5,         -1, DTYPE_NONE,      Q_ROCK,      100,      0,       QUEST_SINGLE,  TEXT_INFRA5,   \"The Magic Rock\"           },\r\n\t{       9,         -1, DTYPE_NONE,      Q_MUSHROOM,  100,      0,       QUEST_SINGLE,  TEXT_MUSH8,    \"Black Mushroom\"           },\r\n\t{       4,         -1, DTYPE_NONE,      Q_GARBUD,    100,      0,       QUEST_SINGLE,  TEXT_GARBUD1,  \"Gharbad The Weak\"         },\r\n\t{       8,         -1, DTYPE_NONE,      Q_ZHAR,      100,      0,       QUEST_SINGLE,  TEXT_ZHAR1,    \"Zhar the Mad\"             },\r\n\t{      14,         -1, DTYPE_NONE,      Q_VEIL,      100,      0,       QUEST_SINGLE,  TEXT_VEIL9,    \"Lachdanan\"                },\r\n\t{      15,         -1, DTYPE_NONE,      Q_DIABLO,    100,      0,       QUEST_ANY,     TEXT_VILE3,    \"Diablo\"                   },\r\n\t{       2,          2, DTYPE_NONE,      Q_BUTCHER,   100,      0,       QUEST_ANY,     TEXT_BUTCH9,   \"The Butcher\"              },\r\n\t{       4,         -1, DTYPE_NONE,      Q_LTBANNER,  100,      0,       QUEST_SINGLE,  TEXT_BANNER2,  \"Ogden's Sign\"             },\r\n\t{       7,         -1, DTYPE_NONE,      Q_BLIND,     100,      0,       QUEST_SINGLE,  TEXT_BLINDING, \"Halls of the Blind\"       },\r\n\t{       5,         -1, DTYPE_NONE,      Q_BLOOD,     100,      0,       QUEST_SINGLE,  TEXT_BLOODY,   \"Valor\"                    },\r\n\t{      10,         -1, DTYPE_NONE,      Q_ANVIL,     100,      0,       QUEST_SINGLE,  TEXT_ANVIL5,   \"Anvil of Fury\"            },\r\n\t{      13,         -1, DTYPE_NONE,      Q_WARLORD,   100,      0,       QUEST_SINGLE,  TEXT_BLOODWAR, \"Warlord of Blood\"         },\r\n\t{       3,          3, DTYPE_CATHEDRAL, Q_SKELKING,  100,      1,       QUEST_ANY,     TEXT_KING2,    \"The Curse of King Leoric\" },\r\n\t{       2,         -1, DTYPE_CAVES,     Q_PWATER,    100,      4,       QUEST_SINGLE,  TEXT_POISON3,  \"Poisoned Water Supply\"    },\r\n\t{       6,         -1, DTYPE_CATACOMBS, Q_SCHAMB,    100,      2,       QUEST_SINGLE,  TEXT_BONER,    \"The Chamber of Bone\"      },\r\n\t{      15,         15, DTYPE_CATHEDRAL, Q_BETRAYER,  100,      5,       QUEST_ANY,     TEXT_VILE1,    \"Archbishop Lazarus\"       },\r\n#ifdef HELLFIRE\r\n\t{      17,         17, DTYPE_NONE,      Q_GRAVE,     100,      0,       QUEST_ANY,     TEXT_GRAVE7,   \"Grave Matters\"            },\r\n\t{      9,           9, DTYPE_NONE,      Q_FARMER,    100,      0,       QUEST_ANY,     TEXT_FARMER1,  \"Farmer's Orchard\"         },\r\n\t{      17,         -1, DTYPE_NONE,      Q_GIRL,      100,      0,       QUEST_SINGLE,  TEXT_GIRL2,    \"Little Girl\"              },\r\n\t{      19,         -1, DTYPE_NONE,      Q_TRADER,    100,      0,       QUEST_SINGLE,  TEXT_TRADER,   \"Wandering Trader\"         },\r\n\t{      17,         17, DTYPE_NONE,      Q_DEFILER,   100,      0,       QUEST_ANY,     TEXT_DEFILER1, \"The Defiler\"              },\r\n\t{      21,         21, DTYPE_NONE,      Q_NAKRUL,    100,      0,       QUEST_ANY,     TEXT_NAKRUL1,  \"Na-Krul\"                  },\r\n\t{      21,         -1, DTYPE_NONE,      Q_CORNSTN,   100,      0,       QUEST_SINGLE,  TEXT_CORNSTN,  \"Cornerstone of the World\" },\r\n\t{       9,          9, DTYPE_NONE,      Q_JERSEY,    100,      0,       QUEST_ANY,     TEXT_JERSEY4,  \"The Jersey's Jersey\"      },\r\n#endif\r\n\t// clang-format on\r\n};\r\n/**\r\n * Specifies a delta in X-coordinates from the quest entrance for\r\n * which the hover text of the cursor will be visible.\r\n */\r\nchar questxoff[7] = { 0, -1, 0, -1, -2, -1, -2 };\r\n/**\r\n * Specifies a delta in Y-coordinates from the quest entrance for\r\n * which the hover text of the cursor will be visible.\r\n */\r\nchar questyoff[7] = { 0, 0, -1, -1, -1, -2, -2 };\r\nconst char *const questtrigstr[5] = {\r\n\t\"King Leoric's Tomb\",\r\n\t\"The Chamber of Bone\",\r\n\t\"Maze\",\r\n\t\"A Dark Passage\",\r\n\t\"Unholy Altar\"\r\n};\r\n/**\r\n * A quest group containing the three quests the Butcher,\r\n * Ogden's Sign and Gharbad the Weak, which ensures that exactly\r\n * two of these three quests appear in any single player game.\r\n */\r\nint QuestGroup1[3] = { Q_BUTCHER, Q_LTBANNER, Q_GARBUD };\r\n/**\r\n * A quest group containing the three quests Halls of the Blind,\r\n * the Magic Rock and Valor, which ensures that exactly two of\r\n * these three quests appear in any single player game.\r\n */\r\nint QuestGroup2[3] = { Q_BLIND, Q_ROCK, Q_BLOOD };\r\n/**\r\n * A quest group containing the three quests Black Mushroom,\r\n * Zhar the Mad and Anvil of Fury, which ensures that exactly\r\n * two of these three quests appear in any single player game.\r\n */\r\nint QuestGroup3[3] = { Q_MUSHROOM, Q_ZHAR, Q_ANVIL };\r\n/**\r\n * A quest group containing the two quests Lachdanan and Warlord\r\n * of Blood, which ensures that exactly one of these two quests\r\n * appears in any single player game.\r\n */\r\nint QuestGroup4[2] = { Q_VEIL, Q_WARLORD };\r\n\r\nvoid InitQuests()\r\n{\r\n\tint i, initiatedQuests;\r\n\tDWORD z;\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\t\tquests[i]._qactive = QUEST_NOTAVAIL;\r\n\t\t}\r\n\t} else {\r\n\t\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\t\tif (!(questlist[i]._qflags & QUEST_ANY)) {\r\n\t\t\t\tquests[i]._qactive = QUEST_NOTAVAIL;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tquestlog = FALSE;\r\n\tquestpentframe = 1;\r\n\tWaterDone = 0;\r\n\tinitiatedQuests = 0;\r\n\r\n\tfor (z = 0; z < MAXQUESTS; z++) {\r\n\t\tif (gbMaxPlayers > 1 && !(questlist[z]._qflags & QUEST_ANY))\r\n\t\t\tcontinue;\r\n\t\tquests[z]._qtype = questlist[z]._qdtype;\r\n\t\tif (gbMaxPlayers > 1) {\r\n\t\t\tquests[z]._qlevel = questlist[z]._qdmultlvl;\r\n\t\t\tif (!delta_quest_inited(initiatedQuests)) {\r\n\t\t\t\tquests[z]._qactive = QUEST_INIT;\r\n\t\t\t\tquests[z]._qvar1 = 0;\r\n\t\t\t\tquests[z]._qlog = FALSE;\r\n\t\t\t}\r\n\t\t\tinitiatedQuests++;\r\n\t\t} else {\r\n\t\t\tquests[z]._qactive = QUEST_INIT;\r\n\t\t\tquests[z]._qlevel = questlist[z]._qdlvl;\r\n\t\t\tquests[z]._qvar1 = 0;\r\n\t\t\tquests[z]._qlog = FALSE;\r\n\t\t}\r\n\r\n\t\tquests[z]._qslvl = questlist[z]._qslvl;\r\n\t\tquests[z]._qtx = 0;\r\n\t\tquests[z]._qty = 0;\r\n\t\tquests[z]._qidx = z;\r\n\t\tquests[z]._qlvltype = questlist[z]._qlvlt;\r\n\t\tquests[z]._qvar2 = 0;\r\n\t\tquests[z]._qmsg = questlist[z]._qdmsg;\r\n\t}\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tSetRndSeed(glSeedTbl[15]);\r\n\t\tif (random_(0, 2) != 0)\r\n\t\t\tquests[Q_PWATER]._qactive = QUEST_NOTAVAIL;\r\n\t\telse\r\n\t\t\tquests[Q_SKELKING]._qactive = QUEST_NOTAVAIL;\r\n\r\n\t\tquests[QuestGroup1[random_(0, sizeof(QuestGroup1) / sizeof(int))]]._qactive = QUEST_NOTAVAIL;\r\n\t\tquests[QuestGroup2[random_(0, sizeof(QuestGroup2) / sizeof(int))]]._qactive = QUEST_NOTAVAIL;\r\n\t\tquests[QuestGroup3[random_(0, sizeof(QuestGroup3) / sizeof(int))]]._qactive = QUEST_NOTAVAIL;\r\n\t\tquests[QuestGroup4[random_(0, sizeof(QuestGroup4) / sizeof(int))]]._qactive = QUEST_NOTAVAIL;\r\n\t}\r\n#ifdef _DEBUG\r\n\tif (questdebug != -1)\r\n\t\tquests[questdebug]._qactive = QUEST_ACTIVE;\r\n#endif\r\n\r\n#ifdef SPAWN\r\n\tfor (z = 0; z < MAXQUESTS; z++) {\r\n\t\tquests[z]._qactive = QUEST_NOTAVAIL;\r\n\t}\r\n#endif\r\n\r\n\tif (quests[Q_SKELKING]._qactive == QUEST_NOTAVAIL)\r\n\t\tquests[Q_SKELKING]._qvar2 = 2;\r\n\tif (quests[Q_ROCK]._qactive == QUEST_NOTAVAIL)\r\n\t\tquests[Q_ROCK]._qvar2 = 2;\r\n\tquests[Q_LTBANNER]._qvar1 = 1;\r\n\tif (gbMaxPlayers != 1)\r\n\t\tquests[Q_BETRAYER]._qvar1 = 2;\r\n}\r\n\r\nvoid CheckQuests()\r\n{\r\n#ifndef SPAWN\r\n\tint i, rportx, rporty;\r\n\r\n\tif (QuestStatus(Q_BETRAYER) && gbMaxPlayers != 1 && quests[Q_BETRAYER]._qvar1 == 2) {\r\n\t\tAddObject(OBJ_ALTBOY, 2 * setpc_x + 20, 2 * setpc_y + 22);\r\n\t\tquests[Q_BETRAYER]._qvar1 = 3;\r\n\t\tNetSendCmdQuest(TRUE, Q_BETRAYER);\r\n\t}\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (currlevel == quests[Q_BETRAYER]._qlevel\r\n\t    && !setlevel\r\n\t    && quests[Q_BETRAYER]._qvar1 >= 2\r\n\t    && (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE || quests[Q_BETRAYER]._qactive == QUEST_DONE)\r\n\t    && (quests[Q_BETRAYER]._qvar2 == 0 || quests[Q_BETRAYER]._qvar2 == 2)) {\r\n\t\tquests[Q_BETRAYER]._qtx = 2 * quests[Q_BETRAYER]._qtx + 16;\r\n\t\tquests[Q_BETRAYER]._qty = 2 * quests[Q_BETRAYER]._qty + 16;\r\n\t\trportx = quests[Q_BETRAYER]._qtx;\r\n\t\trporty = quests[Q_BETRAYER]._qty;\r\n\t\tAddMissile(rportx, rporty, rportx, rporty, 0, MIS_RPORTAL, TARGET_MONSTERS, myplr, 0, 0);\r\n\t\tquests[Q_BETRAYER]._qvar2 = 1;\r\n\t\tif (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE) {\r\n\t\t\tquests[Q_BETRAYER]._qvar1 = 3;\r\n\t\t}\r\n\t}\r\n\r\n\tif (quests[Q_BETRAYER]._qactive == QUEST_DONE\r\n\t    && setlevel\r\n\t    && setlvlnum == SL_VILEBETRAYER\r\n\t    && quests[Q_BETRAYER]._qvar2 == 4) {\r\n\t\trportx = 35;\r\n\t\trporty = 32;\r\n\t\tAddMissile(rportx, rporty, rportx, rporty, 0, MIS_RPORTAL, TARGET_MONSTERS, myplr, 0, 0);\r\n\t\tquests[Q_BETRAYER]._qvar2 = 3;\r\n\t}\r\n\r\n\tif (setlevel) {\r\n\t\tif (setlvlnum == quests[Q_PWATER]._qslvl\r\n\t\t    && quests[Q_PWATER]._qactive != QUEST_INIT\r\n\t\t    && leveltype == quests[Q_PWATER]._qlvltype\r\n\t\t    && nummonsters == 4\r\n\t\t    && quests[Q_PWATER]._qactive != QUEST_DONE) {\r\n\t\t\tquests[Q_PWATER]._qactive = QUEST_DONE;\r\n\t\t\tPlaySfxLoc(IS_QUESTDN, plr[myplr]._px, plr[myplr]._py);\r\n\t\t\tLoadPalette(\"Levels\\\\L3Data\\\\L3pwater.pal\");\r\n\t\t\tWaterDone = 32;\r\n\t\t}\r\n\t\tif (WaterDone > 0) {\r\n\t\t\tpalette_update_quest_palette(WaterDone);\r\n\t\t\tWaterDone--;\r\n\t\t}\r\n\t} else if (plr[myplr]._pmode == PM_STAND) {\r\n\t\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\t\tif (currlevel == quests[i]._qlevel\r\n\t\t\t    && quests[i]._qslvl != 0\r\n\t\t\t    && quests[i]._qactive != QUEST_NOTAVAIL\r\n\t\t\t    && plr[myplr]._px == quests[i]._qtx\r\n\t\t\t    && plr[myplr]._py == quests[i]._qty) {\r\n\t\t\t\tif (quests[i]._qlvltype != DTYPE_NONE) {\r\n\t\t\t\t\tsetlvltype = quests[i]._qlvltype;\r\n\t\t\t\t}\r\n\t\t\t\tStartNewLvl(myplr, WM_DIABSETLVL, quests[i]._qslvl);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\nBOOL ForceQuests()\r\n{\r\n#ifndef SPAWN\r\n\tint i, j, qx, qy, ql;\r\n\r\n\tif (gbMaxPlayers != 1) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\r\n\t\tif (i != Q_BETRAYER && currlevel == quests[i]._qlevel && quests[i]._qslvl != 0) {\r\n\t\t\tql = quests[quests[i]._qidx]._qslvl - 1;\r\n\t\t\tqx = quests[i]._qtx;\r\n\t\t\tqy = quests[i]._qty;\r\n\r\n\t\t\tfor (j = 0; j < 7; j++) {\r\n\t\t\t\tif (qx + questxoff[j] == cursmx && qy + questyoff[j] == cursmy) {\r\n\t\t\t\t\tsprintf(infostr, \"To %s\", questtrigstr[ql]);\r\n\t\t\t\t\tcursmx = qx;\r\n\t\t\t\t\tcursmy = qy;\r\n\t\t\t\t\treturn TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL QuestStatus(int i)\r\n{\r\n\tif (setlevel)\r\n\t\treturn FALSE;\r\n\tif (currlevel != quests[i]._qlevel)\r\n\t\treturn FALSE;\r\n\tif (quests[i]._qactive == QUEST_NOTAVAIL)\r\n\t\treturn FALSE;\r\n\tif (gbMaxPlayers != 1 && !(questlist[i]._qflags & QUEST_ANY))\r\n\t\treturn FALSE;\r\n\treturn TRUE;\r\n}\r\n\r\nvoid CheckQuestKill(int m, BOOL sendmsg)\r\n{\r\n#ifndef SPAWN\r\n\tint i, j;\r\n\r\n\tif (monster[m].MType->mtype == MT_SKING) {\r\n\t\tquests[Q_SKELKING]._qactive = QUEST_DONE;\r\n\t\tsfxdelay = 30;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR82;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE82;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE82;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK82;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE82;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR82;\r\n\t\t}\r\n#endif\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdQuest(TRUE, Q_SKELKING);\r\n\r\n\t} else if (monster[m].MType->mtype == MT_CLEAVER) {\r\n\t\tquests[Q_BUTCHER]._qactive = QUEST_DONE;\r\n\t\tsfxdelay = 30;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR80;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE80;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE80;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK80;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE80;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR80;\r\n\t\t}\r\n#endif\r\n\t\tif (sendmsg)\r\n\t\t\tNetSendCmdQuest(TRUE, Q_BUTCHER);\r\n\t} else if (monster[m].mName == UniqMonst[UMT_GARBUD].mName) { //\"Gharbad the Weak\"\r\n\t\tquests[Q_GARBUD]._qactive = QUEST_DONE;\r\n\t\tsfxdelay = 30;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR61;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE61;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE61;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK61;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE61;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR61;\r\n\t\t}\r\n#endif\r\n\t} else if (monster[m].mName == UniqMonst[UMT_ZHAR].mName) { //\"Zhar the Mad\"\r\n\t\tquests[Q_ZHAR]._qactive = QUEST_DONE;\r\n\t\tsfxdelay = 30;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR62;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE62;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE62;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK62;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE62;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR62;\r\n\t\t}\r\n#endif\r\n\t} else if (monster[m].mName == UniqMonst[UMT_LAZURUS].mName && gbMaxPlayers != 1) { //\"Arch-Bishop Lazarus\"\r\n\t\tquests[Q_BETRAYER]._qactive = QUEST_DONE;\r\n\t\tquests[Q_BETRAYER]._qvar1 = 7;\r\n\t\tsfxdelay = 30;\r\n\t\tquests[Q_DIABLO]._qactive = QUEST_ACTIVE;\r\n\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tif (dPiece[i][j] == 370) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR83;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE83;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE83;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK83;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE83;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR83;\r\n\t\t}\r\n#endif\r\n\t\tif (sendmsg) {\r\n\t\t\tNetSendCmdQuest(TRUE, Q_BETRAYER);\r\n\t\t\tNetSendCmdQuest(TRUE, Q_DIABLO);\r\n\t\t}\r\n\t} else if (monster[m].mName == UniqMonst[UMT_LAZURUS].mName && gbMaxPlayers == 1) { //\"Arch-Bishop Lazarus\"\r\n\t\tquests[Q_BETRAYER]._qactive = QUEST_DONE;\r\n\t\tsfxdelay = 30;\r\n\t\tInitVPTriggers();\r\n\t\tquests[Q_BETRAYER]._qvar1 = 7;\r\n\t\tquests[Q_BETRAYER]._qvar2 = 4;\r\n\t\tquests[Q_DIABLO]._qactive = QUEST_ACTIVE;\r\n\t\tAddMissile(35, 32, 35, 32, 0, MIS_RPORTAL, TARGET_MONSTERS, myplr, 0, 0);\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR83;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE83;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE83;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK83;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE83;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR83;\r\n\t\t}\r\n#endif\r\n\t} else if (monster[m].mName == UniqMonst[UMT_WARLORD].mName) { //\"Warlord of Blood\"\r\n\t\tquests[Q_WARLORD]._qactive = QUEST_DONE;\r\n\t\tsfxdelay = 30;\r\n\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\tsfxdnum = PS_WARR94;\r\n\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\tsfxdnum = PS_ROGUE94;\r\n\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\tsfxdnum = PS_MAGE94;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\tsfxdnum = PS_MONK94;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\tsfxdnum = PS_ROGUE94;\r\n\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\tsfxdnum = PS_WARR94;\r\n\t\t}\r\n#endif\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid DrawButcher()\r\n{\r\n\tint x, y;\r\n\r\n\tx = 2 * setpc_x + 16;\r\n\ty = 2 * setpc_y + 16;\r\n\tDRLG_RectTrans(x + 3, y + 3, x + 10, y + 10);\r\n}\r\n\r\nvoid DrawSkelKing(int q, int x, int y)\r\n{\r\n\tquests[q]._qtx = 2 * x + 28;\r\n\tquests[q]._qty = 2 * y + 23;\r\n}\r\n\r\nvoid DrawWarLord(int x, int y)\r\n{\r\n\tint rw, rh;\r\n\tint i, j;\r\n\tBYTE *sp, *setp;\r\n\tint v;\r\n\r\n\tsetp = LoadFileInMem(\"Levels\\\\L4Data\\\\Warlord2.DUN\", NULL);\r\n\trw = *setp;\r\n\tsp = setp + 2;\r\n\trh = *sp;\r\n\tsp += 2;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\tsetpc_x = x;\r\n\tsetpc_y = y;\r\n\tfor (j = y; j < y + rh; j++) {\r\n\t\tfor (i = x; i < x + rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tv = *sp;\r\n\t\t\t} else {\r\n\t\t\t\tv = 6;\r\n\t\t\t}\r\n\t\t\tdungeon[i][j] = v;\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n\tmem_free_dbg(setp);\r\n}\r\n\r\nvoid DrawSChamber(int q, int x, int y)\r\n{\r\n\tint i, j;\r\n\tint rw, rh;\r\n\tint xx, yy;\r\n\tBYTE *sp, *setp;\r\n\tint v;\r\n\r\n\tsetp = LoadFileInMem(\"Levels\\\\L2Data\\\\Bonestr1.DUN\", NULL);\r\n\trw = *setp;\r\n\tsp = setp + 2;\r\n\trh = *sp;\r\n\tsp += 2;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\tsetpc_x = x;\r\n\tsetpc_y = y;\r\n\tfor (j = y; j < y + rh; j++) {\r\n\t\tfor (i = x; i < x + rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tv = *sp;\r\n\t\t\t} else {\r\n\t\t\t\tv = 3;\r\n\t\t\t}\r\n\t\t\tdungeon[i][j] = v;\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n\txx = 2 * x + 22;\r\n\tyy = 2 * y + 23;\r\n\tquests[q]._qtx = xx;\r\n\tquests[q]._qty = yy;\r\n\tmem_free_dbg(setp);\r\n}\r\n\r\nvoid DrawLTBanner(int x, int y)\r\n{\r\n\tint rw, rh;\r\n\tint i, j;\r\n\tBYTE *sp, *setp;\r\n\r\n\tsetp = LoadFileInMem(\"Levels\\\\L1Data\\\\Banner1.DUN\", NULL);\r\n\trw = *setp;\r\n\tsp = setp + 2;\r\n\trh = *sp;\r\n\tsp += 2;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\tsetpc_x = x;\r\n\tsetpc_y = y;\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tpdungeon[x + i][y + j] = *sp;\r\n\t\t\t}\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n\tmem_free_dbg(setp);\r\n}\r\n\r\nvoid DrawBlind(int x, int y)\r\n{\r\n\tint rw, rh;\r\n\tint i, j;\r\n\tBYTE *sp, *setp;\r\n\r\n\tsetp = LoadFileInMem(\"Levels\\\\L2Data\\\\Blind1.DUN\", NULL);\r\n\trw = *setp;\r\n\tsp = setp + 2;\r\n\trh = *sp;\r\n\tsp += 2;\r\n\tsetpc_x = x;\r\n\tsetpc_y = y;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tpdungeon[x + i][y + j] = *sp;\r\n\t\t\t}\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n\tmem_free_dbg(setp);\r\n}\r\n\r\nvoid DrawBlood(int x, int y)\r\n{\r\n\tint rw, rh;\r\n\tint i, j;\r\n\tBYTE *sp, *setp;\r\n\r\n\tsetp = LoadFileInMem(\"Levels\\\\L2Data\\\\Blood2.DUN\", NULL);\r\n\trw = *setp;\r\n\tsp = setp + 2;\r\n\trh = *sp;\r\n\tsp += 2;\r\n\tsetpc_x = x;\r\n\tsetpc_y = y;\r\n\tsetpc_w = rw;\r\n\tsetpc_h = rh;\r\n\tfor (j = 0; j < rh; j++) {\r\n\t\tfor (i = 0; i < rw; i++) {\r\n\t\t\tif (*sp != 0) {\r\n\t\t\t\tdungeon[x + i][y + j] = *sp;\r\n\t\t\t}\r\n\t\t\tsp += 2;\r\n\t\t}\r\n\t}\r\n\tmem_free_dbg(setp);\r\n}\r\n\r\nvoid DRLG_CheckQuests(int x, int y)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\tif (QuestStatus(i)) {\r\n\t\t\tswitch (quests[i]._qtype) {\r\n\t\t\tcase Q_BUTCHER:\r\n\t\t\t\tDrawButcher();\r\n\t\t\t\tbreak;\r\n\t\t\tcase Q_LTBANNER:\r\n\t\t\t\tDrawLTBanner(x, y);\r\n\t\t\t\tbreak;\r\n\t\t\tcase Q_BLIND:\r\n\t\t\t\tDrawBlind(x, y);\r\n\t\t\t\tbreak;\r\n\t\t\tcase Q_BLOOD:\r\n\t\t\t\tDrawBlood(x, y);\r\n\t\t\t\tbreak;\r\n\t\t\tcase Q_WARLORD:\r\n\t\t\t\tDrawWarLord(x, y);\r\n\t\t\t\tbreak;\r\n\t\t\tcase Q_SKELKING:\r\n\t\t\t\tDrawSkelKing(i, x, y);\r\n\t\t\t\tbreak;\r\n\t\t\tcase Q_SCHAMB:\r\n\t\t\t\tDrawSChamber(i, x, y);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SetReturnLvlPos()\r\n{\r\n\tswitch (setlvlnum) {\r\n\tcase SL_SKELKING:\r\n\t\tReturnLvlX = quests[Q_SKELKING]._qtx + 1;\r\n\t\tReturnLvlY = quests[Q_SKELKING]._qty;\r\n\t\tReturnLvl = quests[Q_SKELKING]._qlevel;\r\n\t\tReturnLvlT = DTYPE_CATHEDRAL;\r\n\t\tbreak;\r\n\tcase SL_BONECHAMB:\r\n\t\tReturnLvlX = quests[Q_SCHAMB]._qtx + 1;\r\n\t\tReturnLvlY = quests[Q_SCHAMB]._qty;\r\n\t\tReturnLvl = quests[Q_SCHAMB]._qlevel;\r\n\t\tReturnLvlT = DTYPE_CATACOMBS;\r\n\t\tbreak;\r\n\tcase SL_POISONWATER:\r\n\t\tReturnLvlX = quests[Q_PWATER]._qtx;\r\n\t\tReturnLvlY = quests[Q_PWATER]._qty + 1;\r\n\t\tReturnLvl = quests[Q_PWATER]._qlevel;\r\n\t\tReturnLvlT = DTYPE_CATHEDRAL;\r\n\t\tbreak;\r\n\tcase SL_VILEBETRAYER:\r\n\t\tReturnLvlX = quests[Q_BETRAYER]._qtx + 1;\r\n\t\tReturnLvlY = quests[Q_BETRAYER]._qty - 1;\r\n\t\tReturnLvl = quests[Q_BETRAYER]._qlevel;\r\n\t\tReturnLvlT = DTYPE_HELL;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid GetReturnLvlPos()\r\n{\r\n\tif (quests[Q_BETRAYER]._qactive == QUEST_DONE)\r\n\t\tquests[Q_BETRAYER]._qvar2 = 2;\r\n\tViewX = ReturnLvlX;\r\n\tViewY = ReturnLvlY;\r\n\tcurrlevel = ReturnLvl;\r\n\tleveltype = ReturnLvlT;\r\n}\r\n\r\nvoid ResyncMPQuests()\r\n{\r\n#ifndef SPAWN\r\n\tif (quests[Q_SKELKING]._qactive == QUEST_INIT\r\n\t    && currlevel >= quests[Q_SKELKING]._qlevel - 1\r\n\t    && currlevel <= quests[Q_SKELKING]._qlevel + 1) {\r\n\t\tquests[Q_SKELKING]._qactive = QUEST_ACTIVE;\r\n\t\tNetSendCmdQuest(TRUE, Q_SKELKING);\r\n\t}\r\n\tif (quests[Q_BUTCHER]._qactive == QUEST_INIT\r\n\t    && currlevel >= quests[Q_BUTCHER]._qlevel - 1\r\n\t    && currlevel <= quests[Q_BUTCHER]._qlevel + 1) {\r\n\t\tquests[Q_BUTCHER]._qactive = QUEST_ACTIVE;\r\n\t\tNetSendCmdQuest(TRUE, Q_BUTCHER);\r\n\t}\r\n\tif (quests[Q_BETRAYER]._qactive == QUEST_INIT && currlevel == quests[Q_BETRAYER]._qlevel - 1) {\r\n\t\tquests[Q_BETRAYER]._qactive = QUEST_ACTIVE;\r\n\t\tNetSendCmdQuest(TRUE, Q_BETRAYER);\r\n\t}\r\n\tif (QuestStatus(Q_BETRAYER))\r\n\t\tAddObject(OBJ_ALTBOY, 2 * setpc_x + 20, 2 * setpc_y + 22);\r\n#ifdef HELLFIRE\r\n\tif (quests[Q_GRAVE]._qactive == QUEST_INIT && currlevel == quests[Q_GRAVE]._qlevel - 1) {\r\n\t\tquests[Q_GRAVE]._qactive = QUEST_ACTIVE;\r\n\t\tNetSendCmdQuest(TRUE, Q_GRAVE);\r\n\t}\r\n\tif (quests[Q_DEFILER]._qactive == QUEST_INIT && currlevel == quests[Q_DEFILER]._qlevel - 1) {\r\n\t\tquests[Q_DEFILER]._qactive = QUEST_ACTIVE;\r\n\t\tNetSendCmdQuest(TRUE, Q_DEFILER);\r\n\t}\r\n\tif (quests[Q_NAKRUL]._qactive == QUEST_INIT && currlevel == quests[Q_NAKRUL]._qlevel - 1) {\r\n\t\tquests[Q_NAKRUL]._qactive = QUEST_ACTIVE;\r\n\t\tNetSendCmdQuest(TRUE, Q_NAKRUL);\r\n\t}\r\n\tif (quests[Q_JERSEY]._qactive == QUEST_INIT && currlevel == quests[Q_JERSEY]._qlevel - 1) {\r\n\t\tquests[Q_JERSEY]._qactive = QUEST_ACTIVE;\r\n\t\tNetSendCmdQuest(TRUE, Q_JERSEY);\r\n\t}\r\n#endif\r\n#endif\r\n}\r\n\r\nvoid ResyncQuests()\r\n{\r\n#ifndef SPAWN\r\n\tint i, tren, x, y;\r\n\r\n\tif (setlevel && setlvlnum == quests[Q_PWATER]._qslvl && quests[Q_PWATER]._qactive != QUEST_INIT && leveltype == quests[Q_PWATER]._qlvltype) {\r\n\r\n\t\tif (quests[Q_PWATER]._qactive == QUEST_DONE)\r\n\t\t\tLoadPalette(\"Levels\\\\L3Data\\\\L3pwater.pal\");\r\n\t\telse\r\n\t\t\tLoadPalette(\"Levels\\\\L3Data\\\\L3pfoul.pal\");\r\n\r\n\t\tfor (i = 0; i <= 32; i++)\r\n\t\t\tpalette_update_quest_palette(i);\r\n\t}\r\n\r\n\tif (QuestStatus(Q_LTBANNER)) {\r\n\t\tif (quests[Q_LTBANNER]._qvar1 == 1)\r\n\t\t\tObjChangeMapResync(\r\n\t\t\t    setpc_w + setpc_x - 2,\r\n\t\t\t    setpc_h + setpc_y - 2,\r\n\t\t\t    setpc_w + setpc_x + 1,\r\n\t\t\t    setpc_h + setpc_y + 1);\r\n\t\tif (quests[Q_LTBANNER]._qvar1 == 2) {\r\n\t\t\tObjChangeMapResync(\r\n\t\t\t    setpc_w + setpc_x - 2,\r\n\t\t\t    setpc_h + setpc_y - 2,\r\n\t\t\t    setpc_w + setpc_x + 1,\r\n\t\t\t    setpc_h + setpc_y + 1);\r\n\t\t\tObjChangeMapResync(setpc_x, setpc_y, (setpc_w >> 1) + setpc_x + 2, (setpc_h >> 1) + setpc_y - 2);\r\n\t\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\t\tSyncObjectAnim(objectactive[i]);\r\n\t\t\ttren = TransVal;\r\n\t\t\tTransVal = 9;\r\n\t\t\tDRLG_MRectTrans(setpc_x, setpc_y, (setpc_w >> 1) + setpc_x + 4, setpc_y + (setpc_h >> 1));\r\n\t\t\tTransVal = tren;\r\n\t\t}\r\n\t\tif (quests[Q_LTBANNER]._qvar1 == 3) {\r\n\t\t\tx = setpc_x;\r\n\t\t\ty = setpc_y;\r\n\t\t\tObjChangeMapResync(x, y, x + setpc_w + 1, y + setpc_h + 1);\r\n\t\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\t\tSyncObjectAnim(objectactive[i]);\r\n\t\t\ttren = TransVal;\r\n\t\t\tTransVal = 9;\r\n\t\t\tDRLG_MRectTrans(setpc_x, setpc_y, (setpc_w >> 1) + setpc_x + 4, setpc_y + (setpc_h >> 1));\r\n\t\t\tTransVal = tren;\r\n\t\t}\r\n\t}\r\n\tif (currlevel == quests[Q_MUSHROOM]._qlevel) {\r\n\t\tif (quests[Q_MUSHROOM]._qactive == QUEST_INIT && quests[Q_MUSHROOM]._qvar1 == 0) {\r\n\t\t\tSpawnQuestItem(IDI_FUNGALTM, 0, 0, 5, 1);\r\n\t\t\tquests[Q_MUSHROOM]._qvar1 = QS_TOMESPAWNED;\r\n\t\t} else {\r\n\t\t\tif (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE) {\r\n\t\t\t\tif (quests[Q_MUSHROOM]._qvar1 >= QS_MUSHGIVEN) {\r\n\t\t\t\t\tQtalklist[TOWN_WITCH]._qblkm = -1;\r\n\t\t\t\t\tQtalklist[TOWN_HEALER]._qblkm = TEXT_MUSH3;\r\n\t\t\t\t} else if (quests[Q_MUSHROOM]._qvar1 >= QS_BRAINGIVEN) {\r\n\t\t\t\t\tQtalklist[TOWN_HEALER]._qblkm = -1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (currlevel == quests[Q_VEIL]._qlevel + 1 && quests[Q_VEIL]._qactive == QUEST_ACTIVE && quests[Q_VEIL]._qvar1 == 0) {\r\n\t\tquests[Q_VEIL]._qvar1 = 1;\r\n\t\tSpawnQuestItem(IDI_GLDNELIX, 0, 0, 5, 1);\r\n\t}\r\n\tif (setlevel && setlvlnum == SL_VILEBETRAYER) {\r\n\t\tif (quests[Q_BETRAYER]._qvar1 >= 4)\r\n\t\t\tObjChangeMapResync(1, 11, 20, 18);\r\n\t\tif (quests[Q_BETRAYER]._qvar1 >= 6)\r\n\t\t\tObjChangeMapResync(1, 18, 20, 24);\r\n\t\tif (quests[Q_BETRAYER]._qvar1 >= 7)\r\n\t\t\tInitVPTriggers();\r\n\t\tfor (i = 0; i < nobjects; i++)\r\n\t\t\tSyncObjectAnim(objectactive[i]);\r\n\t}\r\n\tif (currlevel == quests[Q_BETRAYER]._qlevel\r\n\t    && !setlevel\r\n\t    && (quests[Q_BETRAYER]._qvar2 == 1 || quests[Q_BETRAYER]._qvar2 >= 3)\r\n\t    && (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE || quests[Q_BETRAYER]._qactive == QUEST_DONE)) {\r\n\t\tquests[Q_BETRAYER]._qvar2 = 2;\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid PrintQLString(int x, int y, BOOL cjustflag, const char *str, int col)\r\n{\r\n\tint len, width, off, i, k, s;\r\n\tBYTE c;\r\n\r\n\ts = SStringY[y];\r\n\toff = x + PitchTbl[SStringY[y] + 44 + SCREEN_Y] + 32 + SCREEN_X;\r\n\tlen = strlen(str);\r\n\tk = 0;\r\n\tif (cjustflag) {\r\n\t\twidth = 0;\r\n\t\tfor (i = 0; i < len; i++)\r\n\t\t\twidth += fontkern[fontframe[gbFontTransTbl[(BYTE)str[i]]]] + 1;\r\n\t\tif (width < 257)\r\n\t\t\tk = (257 - width) >> 1;\r\n\t\toff += k;\r\n\t}\r\n\tif (qline == y) {\r\n\t\tCelDraw(cjustflag ? x + k + 12 + SCREEN_X : x + 12 + SCREEN_X, s + 205, pSPentSpn2Cels, questpentframe, 12);\r\n\t}\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tc = fontframe[gbFontTransTbl[(BYTE)str[i]]];\r\n\t\tk += fontkern[c] + 1;\r\n\t\tif (c && k <= 257) {\r\n\t\t\tPrintChar(off, c, col);\r\n\t\t}\r\n\t\toff += fontkern[c] + 1;\r\n\t}\r\n\tif (qline == y) {\r\n\t\tCelDraw(cjustflag ? x + k + 36 + SCREEN_X : 276 + SCREEN_X - x, s + 205, pSPentSpn2Cels, questpentframe, 12);\r\n\t}\r\n}\r\n\r\nvoid DrawQuestLog()\r\n{\r\n\tint y, i;\r\n\r\n\tPrintQLString(0, 2, TRUE, \"Quest Log\", 3);\r\n\tCelDraw(64, 511, pQLogCel, 1, 320);\r\n\ty = qtopline;\r\n\tfor (i = 0; i < numqlines; i++) {\r\n\t\tPrintQLString(0, y, TRUE, questlist[qlist[i]]._qlstr, 0);\r\n\t\ty += 2;\r\n\t}\r\n\tPrintQLString(0, 22, TRUE, \"Close Quest Log\", 0);\r\n\tquestpentframe = (questpentframe & 7) + 1;\r\n}\r\n\r\nvoid StartQuestlog()\r\n{\r\n\tDWORD i;\r\n\r\n\tnumqlines = 0;\r\n\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\tif (quests[i]._qactive == QUEST_ACTIVE && quests[i]._qlog) {\r\n\t\t\tqlist[numqlines] = i;\r\n\t\t\tnumqlines++;\r\n\t\t}\r\n\t}\r\n\tif (numqlines > 5) {\r\n\t\tqtopline = 5 - (numqlines >> 1);\r\n\t} else {\r\n\t\tqtopline = 8;\r\n\t}\r\n\tqline = 22;\r\n\tif (numqlines != 0)\r\n\t\tqline = qtopline;\r\n\tquestlog = TRUE;\r\n\tquestpentframe = 1;\r\n}\r\n\r\nvoid QuestlogUp()\r\n{\r\n\tif (numqlines) {\r\n\t\tif (qline == qtopline) {\r\n\t\t\tqline = 22;\r\n\t\t} else if (qline == 22) {\r\n\t\t\tqline = qtopline + 2 * numqlines - 2;\r\n\t\t} else {\r\n\t\t\tqline -= 2;\r\n\t\t}\r\n\t\tPlaySFX(IS_TITLEMOV);\r\n\t}\r\n}\r\n\r\nvoid QuestlogDown()\r\n{\r\n\tif (numqlines) {\r\n\t\tif (qline == 22) {\r\n\t\t\tqline = qtopline;\r\n\t\t} else if (qline == qtopline + 2 * numqlines - 2) {\r\n\t\t\tqline = 22;\r\n\t\t} else {\r\n\t\t\tqline += 2;\r\n\t\t}\r\n\t\tPlaySFX(IS_TITLEMOV);\r\n\t}\r\n}\r\n\r\nvoid QuestlogEnter()\r\n{\r\n\tPlaySFX(IS_TITLSLCT);\r\n\tif (numqlines && qline != 22)\r\n\t\tInitQTextMsg(quests[qlist[(qline - qtopline) >> 1]]._qmsg);\r\n\tquestlog = FALSE;\r\n}\r\n\r\nvoid QuestlogESC()\r\n{\r\n\tint y, i;\r\n\r\n\ty = (MouseY - 32) / 12;\r\n\tif (numqlines) {\r\n\t\tfor (i = 0; i < numqlines; i++) {\r\n\t\t\tif (y == qtopline + 2 * i) {\r\n\t\t\t\tqline = y;\r\n\t\t\t\tQuestlogEnter();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (y == 22) {\r\n\t\tqline = 22;\r\n\t\tQuestlogEnter();\r\n\t}\r\n}\r\n\r\nvoid SetMultiQuest(int q, int s, int l, int v1)\r\n{\r\n#ifndef SPAWN\r\n\tif (quests[q]._qactive != QUEST_DONE) {\r\n\t\tif (s > quests[q]._qactive)\r\n\t\t\tquests[q]._qactive = s;\r\n\t\tquests[q]._qlog |= l;\r\n\t\tif (v1 > quests[q]._qvar1)\r\n\t\t\tquests[q]._qvar1 = v1;\r\n\t}\r\n#endif\r\n}\r\n"
  },
  {
    "path": "Source/quests.h",
    "content": "/**\r\n * @file quests.cpp\r\n *\r\n * Interface of functionality for handling quests.\r\n */\r\n#ifndef __QUESTS_H__\r\n#define __QUESTS_H__\r\n\r\nextern BOOL questlog;\r\nextern BYTE *pQLogCel;\r\nextern QuestStruct quests[MAXQUESTS];\r\nextern int ReturnLvlX;\r\nextern int ReturnLvlY;\r\nextern int ReturnLvlT;\r\nextern int ReturnLvl;\r\n\r\nvoid InitQuests();\r\nvoid CheckQuests();\r\nBOOL ForceQuests();\r\nBOOL QuestStatus(int i);\r\nvoid CheckQuestKill(int m, BOOL sendmsg);\r\nvoid DRLG_CheckQuests(int x, int y);\r\nvoid SetReturnLvlPos();\r\nvoid GetReturnLvlPos();\r\nvoid ResyncMPQuests();\r\nvoid ResyncQuests();\r\nvoid DrawQuestLog();\r\nvoid StartQuestlog();\r\nvoid QuestlogUp();\r\nvoid QuestlogDown();\r\nvoid QuestlogEnter();\r\nvoid QuestlogESC();\r\nvoid SetMultiQuest(int q, int s, int l, int v1);\r\n\r\n/* rdata */\r\nextern QuestData questlist[MAXQUESTS];\r\n\r\n#endif /* __QUESTS_H__ */\r\n"
  },
  {
    "path": "Source/render.cpp",
    "content": "/**\r\n * @file render.cpp\r\n *\r\n * Implementation of functionality for rendering the level tiles.\r\n */\r\n#include \"all.h\"\r\n#include \"_asm.cpp\"\r\n\r\nint WorldBoolFlag = 0;\r\nDWORD gdwCurrentMask = 0;\r\n// char world_4B3264 = 0;\r\nBYTE *gpCelFrame = NULL;\r\nDWORD *gpDrawMask = NULL;\r\n// char world_4B326D[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\r\n\r\n/** Specifies the draw masks used to render transparency of the right side of tiles. */\r\nDWORD RightMask[TILE_WIDTH] = {\r\n\t0xEAAAAAAA, 0xF5555555,\r\n\t0xFEAAAAAA, 0xFF555555,\r\n\t0xFFEAAAAA, 0xFFF55555,\r\n\t0xFFFEAAAA, 0xFFFF5555,\r\n\t0xFFFFEAAA, 0xFFFFF555,\r\n\t0xFFFFFEAA, 0xFFFFFF55,\r\n\t0xFFFFFFEA, 0xFFFFFFF5,\r\n\t0xFFFFFFFE, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF\r\n};\r\n/** Specifies the draw masks used to render transparency of the left side of tiles. */\r\nDWORD LeftMask[TILE_WIDTH] = {\r\n\t0xAAAAAAAB, 0x5555555F,\r\n\t0xAAAAAABF, 0x555555FF,\r\n\t0xAAAAABFF, 0x55555FFF,\r\n\t0xAAAABFFF, 0x5555FFFF,\r\n\t0xAAABFFFF, 0x555FFFFF,\r\n\t0xAABFFFFF, 0x55FFFFFF,\r\n\t0xABFFFFFF, 0x5FFFFFFF,\r\n\t0xBFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF,\r\n\t0xFFFFFFFF, 0xFFFFFFFF\r\n};\r\n/** Specifies the draw masks used to render transparency of wall tiles. */\r\nDWORD WallMask[TILE_WIDTH] = {\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555,\r\n\t0xAAAAAAAA, 0x55555555\r\n};\r\n\r\nint WorldTbl3x16[48] = {\r\n\t0, 0, 0,\r\n\t4, 4, 4,\r\n\t8, 8, 8,\r\n\t12, 12, 12,\r\n\t16, 16, 16,\r\n\t20, 20, 20,\r\n\t24, 24, 24,\r\n\t28, 28, 28,\r\n\t32, 32, 32,\r\n\t36, 36, 36,\r\n\t40, 40, 40,\r\n\t44, 44, 44,\r\n\t48, 48, 48,\r\n\t52, 52, 52,\r\n\t56, 56, 56,\r\n\t60, 60, 60\r\n};\r\n\r\n/** slope/angle tables, left and right */\r\nint WorldTbl17_1[17] = { 0, 4, 8, 16, 24, 36, 48, 64, 80, 100, 120, 144, 168, 196, 224, 256, 288 };\r\nint WorldTbl17_2[17] = { 0, 32, 60, 88, 112, 136, 156, 176, 192, 208, 220, 232, 240, 248, 252, 256, 288 };\r\n\r\n/*\r\n 32x32 arch types\r\n add 8 if light index is 0\r\n\r\n\t|-| 0x8 (0)\r\n\t|-|\r\n\r\n\t/\\  0x9 (1)\r\n\t\\/\r\n\r\n\t /| 0xA (2)\r\n\t \\|\r\n\r\n\t|\\  0xB (3)\r\n\t|/\r\n\r\n\t|-| 0xC (4)\r\n\t \\|\r\n\r\n\t|-| 0xD (5)\r\n\t|/\r\n*/\r\n\r\n#ifdef USE_ASM\r\n#include \"_render.cpp\"\r\n#else\r\n/**\r\n * While blitting this function will check for the upper bound of the buffer\r\n * @brief Blit upper part of transparent world CELs\r\n * @param pBuff Output buffer\r\n */\r\nvoid drawTopArchesUpperScreen(BYTE *pBuff)\r\n{\r\n\tBYTE *dst, *src;\r\n\tBYTE *tbl;\r\n\tshort cel_type_16;\r\n\tunsigned int width;\r\n\tunsigned int chk_sh_and;\r\n\tunsigned int n_draw_shift;\r\n\tunsigned int x_minus;\r\n\tunsigned int y_minus;\r\n\tint xx_32, yy_32;\r\n\tint i, j;\r\n\r\n\tgpCelFrame = (BYTE *)SpeedFrameTbl;\r\n\tdst = pBuff;\r\n\tif (!(BYTE)light_table_index) {\r\n\t\tif (level_cel_block & 0x8000)\r\n\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\tcel_type_16 = ((level_cel_block >> 12) & 7) + 8;\r\n\t\tgoto LABEL_11;\r\n\t}\r\n\tif ((BYTE)light_table_index != lightmax) {\r\n\t\tif (!(level_cel_block & 0x8000)) {\r\n\t\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\t\ttbl = &pLightTbl[256 * light_table_index];\r\n\t\t\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\n\t\t\tswitch (cel_type_16) {\r\n\t\t\tcase 0: // upper (top transparent), with lighting\r\n\t\t\t\ti = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tasm_trans_light_square_1_3(8, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tasm_trans_light_square_0_2(8, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1: // upper (top transparent), with lighting\r\n\t\t\t\tWorldBoolFlag = (BYTE)pBuff & 1;\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tyy_32 = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\t\tgoto LABEL_67;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tif (((BYTE)dst & 1) == WorldBoolFlag) {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_0_2(width, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_1_3(width, tbl, &dst, &src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\tLABEL_67:\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // upper (top transparent), with lighting\r\n\t\t\t\tWorldBoolFlag = 0;\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\t\tsrc += (32 - (BYTE)yy_32) & 2;\r\n\t\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3: // upper (top transparent), with lighting\r\n\t\t\t\tWorldBoolFlag = 0;\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 4: // upper (top transparent), with lighting\r\n\t\t\t\tWorldBoolFlag = 0;\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\ti = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_trans_light_square_1_3(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_trans_light_square_0_2(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: // upper (top transparent), with lighting\r\n\t\t\t\tWorldBoolFlag = 0;\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\ti = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_trans_light_square_1_3(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_trans_light_square_0_2(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsrc = pSpeedCels\r\n\t\t    + *(DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];\r\n\t\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\n\tLABEL_11:\r\n\r\n\t\tswitch (cel_type_16) {\r\n\t\tcase 8: // upper (top transparent), without lighting\r\n\t\t\ti = 16;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tj = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--j;\r\n\t\t\t\t} while (j);\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tj = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--j;\r\n\t\t\t\t} while (j);\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--i;\r\n\t\t\t} while (i);\r\n\t\t\tbreak;\r\n\t\tcase 9: // upper (top transparent), without lighting\r\n\t\t\tWorldBoolFlag = (BYTE)pBuff & 1;\r\n\t\t\tyy_32 = 32;\r\n\t\tLABEL_251:\r\n\t\t\txx_32 = 32;\r\n\t\t\twhile (1) {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\txx_32 -= width;\r\n\t\t\t\t\tif (!xx_32) {\r\n\t\t\t\t\tLABEL_271:\r\n\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tif (!--yy_32)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tgoto LABEL_251;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\txx_32 -= width;\r\n\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\treturn;\r\n\t\t\t\tif (((BYTE)dst & 1) == WorldBoolFlag) {\r\n\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\tgoto LABEL_258;\r\n\t\t\t\t\t++src;\r\n\t\t\t\t\t++dst;\r\n\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\tLABEL_265:\r\n\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tgoto LABEL_268;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\tgoto LABEL_265;\r\n\t\t\t\t\t*dst++ = *src++;\r\n\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\tLABEL_258:\r\n\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tgoto LABEL_268;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\tLABEL_268:\r\n\t\t\t\tif (!xx_32)\r\n\t\t\t\t\tgoto LABEL_271;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 10: // upper (top transparent), without lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\tdst[1] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\tdst[0] = src[2];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\ty_minus = 32 - yy_32;\r\n\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\t\tdst[1] = src[3];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\t\tdst[0] = src[2];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 11: // upper (top transparent), without lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\ty_minus = 32 - yy_32;\r\n\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\t\tfor (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (x_minus & 2) /// BUGFIX: change to `y_minus & 2`\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tfor (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (x_minus & 2) /// BUGFIX: change to `y_minus & 2`\r\n\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 12: // upper (top transparent), without lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\tdst[1] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\tdst[0] = src[2];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\ti = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tdefault: // upper (top transparent), without lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\ti = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\tif (level_cel_block & 0x8000)\r\n\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\tcel_type_16 = (level_cel_block >> 12) & 7;\r\n\tswitch (cel_type_16) {\r\n\tcase 0: // upper (top transparent), black\r\n\t\ti = 16;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tj = 8;\r\n\t\t\tdo {\r\n\t\t\t\tdst[1] = 0;\r\n\t\t\t\tdst[3] = 0;\r\n\t\t\t\tdst += 4;\r\n\t\t\t\t--j;\r\n\t\t\t} while (j);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tj = 8;\r\n\t\t\tdo {\r\n\t\t\t\tdst[0] = 0;\r\n\t\t\t\tdst[2] = 0;\r\n\t\t\t\tdst += 4;\r\n\t\t\t\t--j;\r\n\t\t\t} while (j);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--i;\r\n\t\t} while (i);\r\n\t\tbreak;\r\n\tcase 1: // upper (top transparent), black\r\n\t\tWorldBoolFlag = (BYTE)pBuff & 1;\r\n\t\txx_32 = 32;\r\n\t\twhile (1) {\r\n\t\t\tyy_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) != 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tif (((BYTE)dst & 1) == WorldBoolFlag) {\r\n\t\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\t\tgoto LABEL_378;\r\n\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\tLABEL_385:\r\n\t\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tgoto LABEL_388;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\t\tgoto LABEL_385;\r\n\t\t\t\t\t\t*dst++ = 0;\r\n\t\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\tLABEL_378:\r\n\t\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tgoto LABEL_388;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\tLABEL_388:\r\n\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\tgoto LABEL_391;\r\n\t\t\t\t}\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tyy_32 -= width;\r\n\t\t\t} while (yy_32);\r\n\t\tLABEL_391:\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!--xx_32)\r\n\t\t\t\treturn;\r\n\t\t}\r\n\tcase 2: // upper (top transparent), black\r\n\t\tWorldBoolFlag = 0;\r\n\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\treturn;\r\n\t\t\tdst += xx_32;\r\n\t\t\tx_minus = 32 - xx_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tyy_32 = 2;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tdst += yy_32;\r\n\t\t\ty_minus = 32 - yy_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tyy_32 += 2;\r\n\t\t} while (yy_32 != 32);\r\n\t\tbreak;\r\n\tcase 3: // upper (top transparent), black\r\n\t\tWorldBoolFlag = 0;\r\n\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\treturn;\r\n\t\t\tx_minus = 32 - xx_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32)\r\n\t\t\t\tbreak;\r\n\t\t\tdst += xx_32;\r\n\t\t}\r\n\t\tyy_32 = 2;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\ty_minus = 32 - yy_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\tyy_32 += 2;\r\n\t\t} while (yy_32 != 32);\r\n\t\tbreak;\r\n\tcase 4: // upper (top transparent), black\r\n\t\tWorldBoolFlag = 0;\r\n\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\treturn;\r\n\t\t\tdst += xx_32;\r\n\t\t\tx_minus = 32 - xx_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\ti = 8;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tj = 8;\r\n\t\t\tdo {\r\n\t\t\t\tdst[1] = 0;\r\n\t\t\t\tdst[3] = 0;\r\n\t\t\t\tdst += 4;\r\n\t\t\t\t--j;\r\n\t\t\t} while (j);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tj = 8;\r\n\t\t\tdo {\r\n\t\t\t\tdst[0] = 0;\r\n\t\t\t\tdst[2] = 0;\r\n\t\t\t\tdst += 4;\r\n\t\t\t\t--j;\r\n\t\t\t} while (j);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--i;\r\n\t\t} while (i);\r\n\t\tbreak;\r\n\tdefault: // upper (top transparent), black\r\n\t\tWorldBoolFlag = 0;\r\n\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\treturn;\r\n\t\t\tx_minus = 32 - xx_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32)\r\n\t\t\t\tbreak;\r\n\t\t\tdst += xx_32;\r\n\t\t}\r\n\t\ti = 8;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tj = 8;\r\n\t\t\tdo {\r\n\t\t\t\tdst[1] = 0;\r\n\t\t\t\tdst[3] = 0;\r\n\t\t\t\tdst += 4;\r\n\t\t\t\t--j;\r\n\t\t\t} while (j);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tj = 8;\r\n\t\t\tdo {\r\n\t\t\t\tdst[0] = 0;\r\n\t\t\t\tdst[2] = 0;\r\n\t\t\t\tdst += 4;\r\n\t\t\t\t--j;\r\n\t\t\t} while (j);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--i;\r\n\t\t} while (i);\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/**\r\n * While blitting this function will check for the upper bound of the buffer\r\n * @brief Blit lower part of transparent world CELs\r\n * @param pBuff Output buffer\r\n * @param pMask Transparancy pattern\r\n */\r\nvoid drawBottomArchesUpperScreen(BYTE *pBuff, DWORD *pMask)\r\n{\r\n\tBYTE *dst, *src;\r\n\tBYTE *tbl;\r\n\tshort cel_type_16;\r\n\tunsigned int left_shift;\r\n\tunsigned int n_draw_shift;\r\n\tint width;\r\n\tint and80_i;\r\n\tint i;\r\n\tint xx_32, yy_32;\r\n\r\n\tgpCelFrame = (BYTE *)SpeedFrameTbl;\r\n\tdst = pBuff;\r\n\tgpDrawMask = pMask;\r\n\tif ((BYTE)light_table_index == 0) {\r\n\t\tif (level_cel_block & 0x8000)\r\n\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\tcel_type_16 = ((level_cel_block >> 12) & 7) + 8;\r\n\tLABEL_12:\r\n\t\tswitch (cel_type_16) {\r\n\t\tcase 8: // upper (bottom transparent), without lighting\r\n\t\t\txx_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\ti = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t++src;\r\n\t\t\t\t\t++dst;\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--gpDrawMask;\r\n\t\t\t\t--xx_32;\r\n\t\t\t} while (xx_32);\r\n\t\t\tbreak;\r\n\t\tcase 9: // upper (bottom transparent), without lighting\r\n\t\t\txx_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\tgdwCurrentMask = *gpDrawMask;\r\n\t\t\t\tyy_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\tif (width & 0x1F)\r\n\t\t\t\t\t\t\tgdwCurrentMask <<= width & 0x1F;\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\tgoto LABEL_129;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tleft_shift = gdwCurrentMask;\r\n\t\t\t\t\tand80_i = width;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t--and80_i;\r\n\t\t\t\t\t} while (and80_i);\r\n\t\t\t\t\tgdwCurrentMask = left_shift;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\tLABEL_129:\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--gpDrawMask;\r\n\t\t\t\t--xx_32;\r\n\t\t\t} while (xx_32);\r\n\t\t\tbreak;\r\n\t\tcase 10: // upper (bottom transparent), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 11: // upper (bottom transparent), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ((32 - (BYTE)yy_32) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 12: // upper (bottom transparent), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\t\ti = 32;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tdefault: // upper (bottom transparent), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\t\ti = 32;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\tif ((BYTE)light_table_index != lightmax) {\r\n\t\tif (!(level_cel_block & 0x8000)) {\r\n\t\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\t\ttbl = &pLightTbl[256 * light_table_index];\r\n\t\t\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\n\t\t\tswitch (cel_type_16) {\r\n\t\t\tcase 0: // upper (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tasm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1: // upper (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tgdwCurrentMask = *gpDrawMask;\r\n\t\t\t\t\tyy_32 = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\tif (width & 0x1F)\r\n\t\t\t\t\t\t\t\tgdwCurrentMask <<= width & 0x1F;\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\t\tgoto LABEL_50;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tgdwCurrentMask = asm_trans_light_mask(width, tbl, &dst, &src, gdwCurrentMask);\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\tLABEL_50:\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // upper (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\t\tsrc += (32 - (BYTE)yy_32) & 2;\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3: // upper (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 4: // upper (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\t\tasm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: // upper (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);\r\n\t\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsrc = pSpeedCels\r\n\t\t    + *(DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];\r\n\t\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\n\t\tgoto LABEL_12;\r\n\t}\r\n\tif (level_cel_block & 0x8000)\r\n\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\tcel_type_16 = (level_cel_block >> 12) & 7;\r\n\tswitch (cel_type_16) {\r\n\tcase 0: // upper (bottom transparent), black\r\n\t\txx_32 = 32;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\ti = 32;\r\n\t\t\tdo {\r\n\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t++dst;\r\n\t\t\t\t--i;\r\n\t\t\t} while (i);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--gpDrawMask;\r\n\t\t\t--xx_32;\r\n\t\t} while (xx_32);\r\n\t\tbreak;\r\n\tcase 1: // upper (bottom transparent), black\r\n\t\txx_32 = 32;\r\n\t\tdo {\r\n\t\t\tgdwCurrentMask = *gpDrawMask;\r\n\t\t\tyy_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\tif (width & 0x1F)\r\n\t\t\t\t\t\tgdwCurrentMask <<= width & 0x1F;\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\tgoto LABEL_208;\r\n\t\t\t\t}\r\n\t\t\t\tyy_32 -= width;\r\n\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\treturn;\r\n\t\t\t\tleft_shift = gdwCurrentMask;\r\n\t\t\t\tand80_i = width;\r\n\t\t\t\tsrc += width;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t++dst;\r\n\t\t\t\t\t--and80_i;\r\n\t\t\t\t} while (and80_i);\r\n\t\t\t\tgdwCurrentMask = left_shift;\r\n\t\t\t} while (yy_32);\r\n\t\tLABEL_208:\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--gpDrawMask;\r\n\t\t\t--xx_32;\r\n\t\t} while (xx_32);\r\n\t\tbreak;\r\n\tcase 2: // upper (bottom transparent), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\tyy_32 = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 3: // upper (bottom transparent), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\tyy_32 = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdst += xx_32;\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 4: // upper (bottom transparent), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\tyy_32 = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\ti = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\tdefault: // upper (bottom transparent), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\tyy_32 = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\ti = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdst += xx_32;\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/**\r\n * While blitting this function will check for the upper bound of the buffer\r\n * @brief Blit current world CEL to the given buffer\r\n * @param pBuff Output buffer\r\n */\r\nvoid drawUpperScreen(BYTE *pBuff)\r\n{\r\n\tBYTE *dst, *src;\r\n\tBYTE *tbl;\r\n\tshort cel_type_16;\r\n\tunsigned int width;\r\n\tunsigned int chk_sh_and;\r\n\tunsigned int n_draw_shift;\r\n\tint i, j;\r\n\tint xx_32, yy_32;\r\n\r\n\tif (cel_transparency_active) {\r\n\t\tif (!arch_draw_type) {\r\n\t\t\tdrawTopArchesUpperScreen(pBuff);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (arch_draw_type == 1) {\r\n\t\t\tif (block_lvid[level_piece_id] == 1 || block_lvid[level_piece_id] == 3) {\r\n\t\t\t\tdrawBottomArchesUpperScreen(pBuff, &LeftMask[31]);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (arch_draw_type == 2) {\r\n\t\t\tif (block_lvid[level_piece_id] == 2 || block_lvid[level_piece_id] == 3) {\r\n\t\t\t\tdrawBottomArchesUpperScreen(pBuff, &RightMask[31]);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tgpCelFrame = (BYTE *)SpeedFrameTbl;\r\n\tdst = pBuff;\r\n\tif ((BYTE)light_table_index == 0) {\r\n\t\tif (level_cel_block & 0x8000)\r\n\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\tcel_type_16 = ((level_cel_block >> 12) & 7) + 8;\r\n\tLABEL_22:\r\n\t\tswitch (cel_type_16) {\r\n\t\tcase 8: // upper (solid), without lighting\r\n\t\t\ti = 32;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tj = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--j;\r\n\t\t\t\t} while (j);\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--i;\r\n\t\t\t} while (i);\r\n\t\t\tbreak;\r\n\t\tcase 9: // upper (solid), without lighting\r\n\t\t\txx_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\tyy_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\tgoto LABEL_133;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\t*dst++ = *src++;\r\n\t\t\t\t\t\tif (!chk_sh_and)\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\tif (!n_draw_shift)\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t} while (yy_32);\r\n\t\t\tLABEL_133:\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--xx_32;\r\n\t\t\t} while (xx_32);\r\n\t\t\tbreak;\r\n\t\tcase 10: // upper (solid), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 11: // upper (solid), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ((32 - (BYTE)yy_32) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 12: // upper (solid), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\ti = 16;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tdefault: // upper (solid), without lighting\r\n\t\t\txx_32 = 30;\r\n\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\ti = 16;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\tif ((BYTE)light_table_index != lightmax) {\r\n\t\tif (!(level_cel_block & 0x8000)) {\r\n\t\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\t\ttbl = &pLightTbl[256 * light_table_index];\r\n\t\t\tcel_type_16 = (WORD)level_cel_block >> 12;\r\n\t\t\tswitch (cel_type_16) {\r\n\t\t\tcase 0: // upper (solid), with lighting\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tasm_cel_light_square(8, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1: // upper (solid), with lighting\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tyy_32 = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\t\tgoto LABEL_58;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tasm_cel_light_edge(width, tbl, &dst, &src);\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\tLABEL_58:\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // upper (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\t\tsrc += (32 - (BYTE)yy_32) & 2;\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3: // upper (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 4: // upper (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_cel_light_square(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: // upper (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\twhile (dst >= gpBufEnd) {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t\tif (xx_32 < 0) {\r\n\t\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tasm_cel_light_square(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsrc = pSpeedCels\r\n\t\t    + *(DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];\r\n\t\tcel_type_16 = (WORD)level_cel_block >> 12;\r\n\t\tgoto LABEL_22;\r\n\t}\r\n\tif (level_cel_block & 0x8000)\r\n\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\tcel_type_16 = ((unsigned int)level_cel_block >> 12) & 7;\r\n\tswitch (cel_type_16) {\r\n\tcase 0: // upper (solid), black\r\n\t\ti = 32;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\tbreak;\r\n\t\t\tj = 8;\r\n\t\t\tdo {\r\n\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\tdst += 4;\r\n\t\t\t\t--j;\r\n\t\t\t} while (j);\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--i;\r\n\t\t} while (i);\r\n\t\tbreak;\r\n\tcase 1: // upper (solid), black\r\n\t\txx_32 = 32;\r\n\t\tdo {\r\n\t\t\tyy_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\tgoto LABEL_205;\r\n\t\t\t\t}\r\n\t\t\t\tyy_32 -= width;\r\n\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\treturn;\r\n\t\t\t\tsrc += width;\r\n\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t*dst++ = 0;\r\n\t\t\t\t\tif (!chk_sh_and)\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tn_draw_shift = width >> 2;\r\n\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t\tif (!n_draw_shift)\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t} while (yy_32);\r\n\t\tLABEL_205:\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--xx_32;\r\n\t\t} while (xx_32);\r\n\t\tbreak;\r\n\tcase 2: // upper (solid), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\tyy_32 = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 3: // upper (solid), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\tyy_32 = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdst += xx_32;\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase 4: // upper (solid), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\ti = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\tdefault: // upper (solid), black\r\n\t\txx_32 = 30;\r\n\t\twhile (dst >= gpBufEnd) {\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!xx_32) {\r\n\t\t\t\ti = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tdst += xx_32;\r\n\t\t\txx_32 -= 2;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\n/**\r\n * While blitting this function will check for the lower bound of the buffer\r\n * @brief Blit upper part of transparent world CELs\r\n * @param pBuff Output buffer\r\n */\r\nvoid drawTopArchesLowerScreen(BYTE *pBuff)\r\n{\r\n\tBYTE *dst, *src;\r\n\tBYTE *tbl;\r\n\tshort cel_type_16;\r\n\tunsigned int world_tbl;\r\n\tunsigned int width;\r\n\tunsigned int chk_sh_and;\r\n\tunsigned int x_minus;\r\n\tunsigned int n_draw_shift;\r\n\tunsigned int y_minus;\r\n\tint tile_42_45;\r\n\tint xx_32, yy_32;\r\n\tint i, j;\r\n\r\n\tgpCelFrame = (BYTE *)SpeedFrameTbl;\r\n\tdst = pBuff;\r\n\tif ((BYTE)light_table_index == 0) {\r\n\t\tif (level_cel_block & 0x8000)\r\n\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\tcel_type_16 = ((level_cel_block >> 12) & 7) + 8;\r\n\t\tgoto LABEL_11;\r\n\t}\r\n\tif ((BYTE)light_table_index == lightmax) {\r\n\t\tif (level_cel_block & 0x8000)\r\n\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\tcel_type_16 = (level_cel_block >> 12) & 7;\r\n\t\tswitch (cel_type_16) {\r\n\t\tcase 0: // lower (top transparent), black\r\n\t\t\ti = 16;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--i;\r\n\t\t\t} while (i);\r\n\t\t\tbreak;\r\n\t\tcase 1: // lower (top transparent), black\r\n\t\t\tWorldBoolFlag = (BYTE)pBuff & 1;\r\n\t\t\txx_32 = 32;\r\n\t\tLABEL_412:\r\n\t\t\tyy_32 = 32;\r\n\t\t\twhile (1) {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (!yy_32) {\r\n\t\t\t\t\tLABEL_433:\r\n\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tif (!--xx_32)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tgoto LABEL_412;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tyy_32 -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tif (((BYTE)dst & 1) == WorldBoolFlag) {\r\n\t\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\t\tgoto LABEL_420;\r\n\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\tLABEL_427:\r\n\t\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tgoto LABEL_430;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\t\tgoto LABEL_427;\r\n\t\t\t\t\t\t*dst++ = 0;\r\n\t\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\tLABEL_420:\r\n\t\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tgoto LABEL_430;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\tLABEL_430:\r\n\t\t\t\tif (!yy_32)\r\n\t\t\t\t\tgoto LABEL_433;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 2: // lower (top transparent), black\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc = &src[-xx_32 + 32];\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (!xx_32)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tyy_32 = 2;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\ty_minus = 32 - yy_32;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc = &src[-yy_32 + 32];\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tyy_32 += 2;\r\n\t\t\t} while (yy_32 != 32);\r\n\t\t\tbreak;\r\n\t\tcase 3: // lower (top transparent), black\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc = &src[-xx_32 + 32];\r\n\t\t\t\t\tdst = &dst[-xx_32 + 32];\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (!xx_32)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t}\r\n\t\t\tyy_32 = 2;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\ty_minus = 32 - yy_32;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc = &src[-yy_32 + 32];\r\n\t\t\t\t\tdst = &dst[-yy_32 + 32];\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\tyy_32 += 2;\r\n\t\t\t} while (yy_32 != 32);\r\n\t\t\tbreak;\r\n\t\tcase 4: // lower (top transparent), black\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc = &src[-xx_32 + 32];\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (!xx_32)\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\ti = 8;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--i;\r\n\t\t\t} while (i);\r\n\t\t\tbreak;\r\n\t\tdefault: // lower (top transparent), black\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\tfor (xx_32 = 30;; xx_32 -= 2) {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc = &src[-xx_32 + 32];\r\n\t\t\t\t\tdst = &dst[-xx_32 + 32];\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (!xx_32)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t}\r\n\t\t\ti = 8;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = 0;\r\n\t\t\t\t\t\tdst[3] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tj = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\tdst[2] = 0;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--j;\r\n\t\t\t\t\t} while (j);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--i;\r\n\t\t\t} while (i);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\tif (!(level_cel_block & 0x8000)) {\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\ttbl = &pLightTbl[256 * light_table_index];\r\n\t\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\n\t\tswitch (cel_type_16) {\r\n\t\tcase 0: // lower (top transparent), with lighting\r\n\t\t\ti = 16;\r\n\t\t\tdo {\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tasm_trans_light_square_1_3(8, tbl, &dst, &src);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tasm_trans_light_square_0_2(8, tbl, &dst, &src);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\tdst += 32;\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--i;\r\n\t\t\t} while (i);\r\n\t\t\tbreak;\r\n\t\tcase 1: // lower (top transparent), with lighting\r\n\t\t\tWorldBoolFlag = (BYTE)pBuff & 1;\r\n\t\t\txx_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\tyy_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\tgoto LABEL_69;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tif (((BYTE)dst & 1) == WorldBoolFlag) {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_0_2(width, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_1_3(width, tbl, &dst, &src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t}\r\n\t\t\t\t} while (yy_32);\r\n\t\t\tLABEL_69:\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t--xx_32;\r\n\t\t\t} while (xx_32);\r\n\t\t\tbreak;\r\n\t\tcase 2: // lower (top transparent), with lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\tsrc += 288;\r\n\t\t\t\tLABEL_98:\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\t\tworld_tbl >>= 1;\r\n\t\t\t\t\t\tyy_32 = world_tbl + 2;\r\n\t\t\t\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\tsrc += (32 - (BYTE)yy_32) & 2;\r\n\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\tworld_tbl >>= 1;\r\n\t\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\t}\r\n\t\t\tdo {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t} while (xx_32 >= 0);\r\n\t\t\tgoto LABEL_98;\r\n\t\tcase 3: // lower (top transparent), with lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\tsrc += 288;\r\n\t\t\t\tLABEL_154:\r\n\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\t\tworld_tbl >>= 1;\r\n\t\t\t\t\t\tyy_32 = world_tbl + 2;\r\n\t\t\t\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_0_2(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tasm_trans_light_cel_1_3(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\tworld_tbl >>= 1;\r\n\t\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\t}\r\n\t\t\tdo {\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t}\r\n\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t} while (xx_32 >= 0);\r\n\t\t\tgoto LABEL_154;\r\n\t\tcase 4: // lower (top transparent), with lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\tsrc += 288;\r\n\t\t\t\tLABEL_210:\r\n\t\t\t\t\ti = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\tasm_trans_light_square_1_3(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\tasm_trans_light_square_0_2(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\tworld_tbl >>= 1;\r\n\t\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\t}\r\n\t\t\tdo {\r\n\t\t\t\tdst += xx_32;\r\n\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t} while (xx_32 >= 0);\r\n\t\t\tgoto LABEL_210;\r\n\t\tdefault: // lower (top transparent), with lighting\r\n\t\t\tWorldBoolFlag = 0;\r\n\t\t\txx_32 = 30;\r\n\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\tsrc += 288;\r\n\t\t\t\tLABEL_249:\r\n\t\t\t\t\ti = 8;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\tasm_trans_light_square_1_3(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\tasm_trans_light_square_0_2(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t--i;\r\n\t\t\t\t\t} while (i);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\tworld_tbl >>= 1;\r\n\t\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\t}\r\n\t\t\tdo {\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tasm_trans_light_cel_0_2(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tasm_trans_light_cel_1_3(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t}\r\n\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t} while (xx_32 >= 0);\r\n\t\t\tgoto LABEL_249;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\tsrc = pSpeedCels + *(DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];\r\n\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\nLABEL_11:\r\n\tswitch (cel_type_16) {\r\n\tcase 8: // lower (top transparent), without lighting\r\n\t\ti = 16;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\tj = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--j;\r\n\t\t\t\t} while (j);\r\n\t\t\t} else {\r\n\t\t\t\tsrc += 32;\r\n\t\t\t\tdst += 32;\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\tj = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--j;\r\n\t\t\t\t} while (j);\r\n\t\t\t} else {\r\n\t\t\t\tsrc += 32;\r\n\t\t\t\tdst += 32;\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--i;\r\n\t\t} while (i);\r\n\t\tbreak;\r\n\tcase 9: // lower (top transparent), without lighting\r\n\t\tWorldBoolFlag = (BYTE)pBuff & 1;\r\n\t\txx_32 = 32;\r\n\t\twhile (1) {\r\n\t\t\tyy_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) != 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tif (((BYTE)dst & 1) == WorldBoolFlag) {\r\n\t\t\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\t\t\tgoto LABEL_280;\r\n\t\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\t\tLABEL_287:\r\n\t\t\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tgoto LABEL_290;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\t\t\tif (!(width & 1))\r\n\t\t\t\t\t\t\t\tgoto LABEL_287;\r\n\t\t\t\t\t\t\t*dst++ = *src++;\r\n\t\t\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\t\tLABEL_280:\r\n\t\t\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tgoto LABEL_290;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t}\r\n\t\t\t\tLABEL_290:\r\n\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\tgoto LABEL_293;\r\n\t\t\t\t}\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tyy_32 -= width;\r\n\t\t\t} while (yy_32);\r\n\t\tLABEL_293:\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\tif (!--xx_32)\r\n\t\t\t\treturn;\r\n\t\t}\r\n\tcase 10: // lower (top transparent), without lighting\r\n\t\tWorldBoolFlag = 0;\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_308:\r\n\t\t\t\tyy_32 = 2;\r\n\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\tworld_tbl >>= 1;\r\n\t\t\t\t\tyy_32 = world_tbl + 2;\r\n\t\t\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\ty_minus = 32 - yy_32;\r\n\t\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\tdst[1] = src[3];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tn_draw_shift = y_minus >> 2;\r\n\t\t\t\t\t\tif (y_minus & 2) {\r\n\t\t\t\t\t\t\tdst[0] = src[2];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t--n_draw_shift; /// BUGFIX: delete this line\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\tworld_tbl >>= 1;\r\n\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tdst += xx_32;\r\n\t\t\tx_minus = 32 - xx_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[1] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[0] = src[2];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_308;\r\n\tcase 11: // lower (top transparent), without lighting\r\n\t\tWorldBoolFlag = 0;\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff < gpBufEnd)\r\n\t\t\tgoto LABEL_326;\r\n\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\tif (tile_42_45 <= 45) {\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\tworld_tbl >>= 1;\r\n\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t\tdo {\r\n\t\t\tLABEL_326:\r\n\t\t\t\tx_minus = 32 - xx_32;\r\n\t\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t} while (xx_32 >= 0);\r\n\t\t\tgoto LABEL_336;\r\n\t\t}\r\n\t\tdst = pBuff - 12288;\r\n\t\tsrc += 288;\r\n\tLABEL_336:\r\n\t\tyy_32 = 2;\r\n\t\tif (dst >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\treturn;\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\tworld_tbl >>= 1;\r\n\t\t\tyy_32 = world_tbl + 2;\r\n\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t}\r\n\t\tdo {\r\n\t\t\ty_minus = 32 - yy_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tfor (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)yy_32) & 2) {\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (n_draw_shift = y_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)yy_32) & 2) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\tyy_32 += 2;\r\n\t\t} while (yy_32 != 32);\r\n\t\tbreak;\r\n\tcase 12: // lower (top transparent), without lighting\r\n\t\tWorldBoolFlag = 0;\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_364:\r\n\t\t\t\ti = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\tworld_tbl >>= 1;\r\n\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tdst += xx_32;\r\n\t\t\tx_minus = 32 - xx_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[1] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tn_draw_shift = x_minus >> 2;\r\n\t\t\t\tif (x_minus & 2) {\r\n\t\t\t\t\tdst[0] = src[2];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_364;\r\n\tdefault: // lower (top transparent), without lighting\r\n\t\tWorldBoolFlag = 0;\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_389:\r\n\t\t\t\ti = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\tworld_tbl >>= 1;\r\n\t\t\txx_32 = 30 - world_tbl;\r\n\t\t\tWorldBoolFlag += world_tbl >> 1;\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tx_minus = 32 - xx_32;\r\n\t\t\tWorldBoolFlag = ((BYTE)WorldBoolFlag + 1) & 1;\r\n\t\t\tif (WorldBoolFlag) {\r\n\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (n_draw_shift = x_minus >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_389;\r\n\t}\r\n}\r\n\r\n/**\r\n * While blitting this function will check for the lower bound of the buffer\r\n * @brief Blit lower part of transparent world CELs\r\n * @param pBuff Output buffer\r\n * @param pMask Transparancy pattern\r\n */\r\nvoid drawBottomArchesLowerScreen(BYTE *pBuff, DWORD *pMask)\r\n{\r\n\tBYTE *dst, *src;\r\n\tBYTE *tbl;\r\n\tshort cel_type_16;\r\n\tint and80_i;\r\n\tunsigned int world_tbl;\r\n\tunsigned int left_shift;\r\n\tunsigned int n_draw_shift;\r\n\tint tile_42_45;\r\n\tint width;\r\n\tint xx_32, yy_32;\r\n\tint i;\r\n\r\n\tgpCelFrame = (BYTE *)SpeedFrameTbl;\r\n\tdst = pBuff;\r\n\tgpDrawMask = pMask;\r\n\tif ((BYTE)light_table_index) {\r\n\t\tif ((BYTE)light_table_index == lightmax) {\r\n\t\t\tif (level_cel_block & 0x8000)\r\n\t\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\t\tcel_type_16 = (level_cel_block >> 12) & 7;\r\n\t\t\tswitch (cel_type_16) {\r\n\t\t\tcase 0: // lower (bottom transparent), black\r\n\t\t\t\tyy_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\t\ti = 32;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1: // lower (bottom transparent), black\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tgdwCurrentMask = *gpDrawMask;\r\n\t\t\t\t\tyy_32 = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t\tif ((width & 0x80) != 0)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\t\tand80_i = width;\r\n\t\t\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\t\t\tleft_shift = gdwCurrentMask;\r\n\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t\t\t--and80_i;\r\n\t\t\t\t\t\t\t\t} while (and80_i);\r\n\t\t\t\t\t\t\t\tgdwCurrentMask = left_shift;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\t\tgoto LABEL_252;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\tif (width & 0x1F)\r\n\t\t\t\t\t\t\tgdwCurrentMask <<= width & 0x1F;\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\tLABEL_252:\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // lower (bottom transparent), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tdst += i;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\ti = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tdst += i;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\ti += 2;\r\n\t\t\t\t} while (i != 32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3: // lower (bottom transparent), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst = &dst[32 - i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdst += i;\r\n\t\t\t\t}\r\n\t\t\t\ti = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst = &dst[32 - i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst = &dst[i - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\ti += 2;\r\n\t\t\t\t} while (i != 32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 4: // lower (bottom transparent), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tdst += i;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\tyy_32 = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\t\ti = 32;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: // lower (bottom transparent), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst = &dst[32 - i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdst += i;\r\n\t\t\t\t}\r\n\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\tyy_32 = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\t\ti = 32;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!(level_cel_block & 0x8000)) {\r\n\t\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\t\ttbl = &pLightTbl[256 * light_table_index];\r\n\t\t\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\n\t\t\tswitch (cel_type_16) {\r\n\t\t\tcase 0: // lower (bottom transparent), with lighting\r\n\t\t\t\tyy_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tasm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1: // lower (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tgdwCurrentMask = *gpDrawMask;\r\n\t\t\t\t\tyy_32 = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t\tif ((width & 0x80) != 0)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\t\tgdwCurrentMask = asm_trans_light_mask(width, tbl, &dst, &src, gdwCurrentMask);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\t\tgoto LABEL_52;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\tif (width & 0x1F)\r\n\t\t\t\t\t\t\tgdwCurrentMask <<= width & 0x1F;\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\tLABEL_52:\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // lower (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_62:\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\t\tsrc += (32 - (BYTE)yy_32) & 2;\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_62;\r\n\t\t\tcase 3: // lower (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_80:\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t/// BUGFIX: uncomment this line\r\n\t\t\t\t\t\t\t// src += (BYTE)src & 2;\r\n\t\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_80;\r\n\t\t\tcase 4: // lower (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_98:\r\n\t\t\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\t\tasm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_98;\r\n\t\t\tdefault: // lower (bottom transparent), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_117:\r\n\t\t\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\t\t\tyy_32 = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\t\tasm_trans_light_mask(32, tbl, &dst, &src, *gpDrawMask);\r\n\t\t\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t\t\t--yy_32;\r\n\t\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_117;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsrc = pSpeedCels\r\n\t\t    + *(DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];\r\n\t\tcel_type_16 = (BYTE)(level_cel_block >> 12);\r\n\t} else {\r\n\t\tif (level_cel_block & 0x8000)\r\n\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\tcel_type_16 = ((level_cel_block >> 12) & 7) + 8;\r\n\t}\r\n\tswitch (cel_type_16) {\r\n\tcase 8: // lower (bottom transparent), without lighting\r\n\t\tyy_32 = 32;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\ti = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t++src;\r\n\t\t\t\t\t++dst;\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t} else {\r\n\t\t\t\tsrc += 32;\r\n\t\t\t\tdst += 32;\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--gpDrawMask;\r\n\t\t\t--yy_32;\r\n\t\t} while (yy_32);\r\n\t\tbreak;\r\n\tcase 9: // lower (bottom transparent), without lighting\r\n\t\txx_32 = 32;\r\n\t\tdo {\r\n\t\t\tgdwCurrentMask = *gpDrawMask;\r\n\t\t\tyy_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) != 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tand80_i = width;\r\n\t\t\t\t\t\tleft_shift = gdwCurrentMask;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--and80_i;\r\n\t\t\t\t\t\t} while (and80_i);\r\n\t\t\t\t\t\tgdwCurrentMask = left_shift;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\tgoto LABEL_152;\r\n\t\t\t\t}\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tif (width & 0x1F)\r\n\t\t\t\t\tgdwCurrentMask <<= width & 0x1F;\r\n\t\t\t\tyy_32 -= width;\r\n\t\t\t} while (yy_32);\r\n\t\tLABEL_152:\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--gpDrawMask;\r\n\t\t\t--xx_32;\r\n\t\t} while (xx_32);\r\n\t\tbreak;\r\n\tcase 10: // lower (bottom transparent), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_162:\r\n\t\t\t\tyy_32 = 2;\r\n\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_162;\r\n\tcase 11: // lower (bottom transparent), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff < gpBufEnd)\r\n\t\t\tgoto LABEL_175;\r\n\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\tif (tile_42_45 <= 45) {\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\tdo {\r\n\t\t\tLABEL_175:\r\n\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t} while (xx_32 >= 0);\r\n\t\t\tgoto LABEL_180;\r\n\t\t}\r\n\t\tdst = pBuff - 12288;\r\n\t\tsrc += 288;\r\n\tLABEL_180:\r\n\t\tyy_32 = 2;\r\n\t\tif (dst >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\treturn;\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tfor (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 4;\r\n\t\t\t}\r\n\t\t\tif ((32 - (BYTE)yy_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\tyy_32 += 2;\r\n\t\t} while (yy_32 != 32);\r\n\t\tbreak;\r\n\tcase 12: // lower (bottom transparent), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_198:\r\n\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\tyy_32 = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\t\ti = 32;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_198;\r\n\tdefault: // lower (bottom transparent), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_217:\r\n\t\t\t\tgpDrawMask -= 16;\r\n\t\t\t\tyy_32 = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tleft_shift = *gpDrawMask;\r\n\t\t\t\t\t\ti = 32;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (left_shift & 0x80000000)\r\n\t\t\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t\tleft_shift *= 2;\r\n\t\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--gpDrawMask;\r\n\t\t\t\t\t--yy_32;\r\n\t\t\t\t} while (yy_32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 4;\r\n\t\t\t}\r\n\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_217;\r\n\t}\r\n}\r\n\r\n/**\r\n * While blitting this function will check for the lower bound of the buffer\r\n * @brief Blit current world CEL to the given buffer\r\n * @param pBuff Output buffer\r\n */\r\nvoid drawLowerScreen(BYTE *pBuff)\r\n{\r\n\tBYTE *dst, *src;\r\n\tBYTE *tbl;\r\n\tshort cel_type_16;\r\n\tunsigned int chk_sh_and;\r\n\tunsigned int world_tbl;\r\n\tunsigned int n_draw_shift;\r\n\tunsigned int width;\r\n\tint tile_42_45;\r\n\tint xx_32, yy_32;\r\n\tint i, j;\r\n\r\n\tif (cel_transparency_active) {\r\n\t\tif (!arch_draw_type) {\r\n\t\t\tdrawTopArchesLowerScreen(pBuff);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (arch_draw_type == 1) {\r\n\t\t\tif (block_lvid[level_piece_id] == 1 || block_lvid[level_piece_id] == 3) {\r\n\t\t\t\tdrawBottomArchesLowerScreen(pBuff, &LeftMask[31]);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (arch_draw_type == 2) {\r\n\t\t\tif (block_lvid[level_piece_id] == 2 || block_lvid[level_piece_id] == 3) {\r\n\t\t\t\tdrawBottomArchesLowerScreen(pBuff, &RightMask[31]);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tgpCelFrame = (BYTE *)SpeedFrameTbl;\r\n\tdst = pBuff;\r\n\tif ((BYTE)light_table_index) {\r\n\t\tif ((BYTE)light_table_index == lightmax) {\r\n\t\t\tif (level_cel_block & 0x8000)\r\n\t\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\t\tcel_type_16 = (level_cel_block >> 12) & 7;\r\n\t\t\tswitch (cel_type_16) {\r\n\t\t\tcase 0: // lower (solid), black\r\n\t\t\t\ti = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1: // lower (solid), black\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tyy_32 = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\twhile (1) {\r\n\t\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\t\t\tgoto LABEL_232;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\t\t\tdst[0] = 0;\r\n\t\t\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\t\t\tn_draw_shift = width >> 2;\r\n\t\t\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\tLABEL_232:\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // lower (solid), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tdst += i;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\ti = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tdst += i;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\ti += 2;\r\n\t\t\t\t} while (i != 32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3: // lower (solid), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst = &dst[32 - i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdst += i;\r\n\t\t\t\t}\r\n\t\t\t\ti = 2;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst = &dst[32 - i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst = &dst[i - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\ti += 2;\r\n\t\t\t\t} while (i != 32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 4: // lower (solid), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tdst += i;\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\ti = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\tbreak;\r\n\t\t\tdefault: // lower (solid), black\r\n\t\t\t\tfor (i = 30;; i -= 2) {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tn_draw_shift = (unsigned int)(32 - i) >> 2;\r\n\t\t\t\t\t\tif ((32 - i) & 2) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc = &src[32 - i];\r\n\t\t\t\t\t\tdst = &dst[32 - i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\tif (!i)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdst += i;\r\n\t\t\t\t}\r\n\t\t\t\ti = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = 0;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!(level_cel_block & 0x8000)) {\r\n\t\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\t\ttbl = &pLightTbl[256 * light_table_index];\r\n\t\t\tcel_type_16 = (WORD)level_cel_block >> 12;\r\n\t\t\tswitch (cel_type_16) {\r\n\t\t\tcase 0: // lower (solid), with lighting\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tasm_cel_light_square(8, tbl, &dst, &src);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1: // lower (solid), with lighting\r\n\t\t\t\txx_32 = 32;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tyy_32 = 32;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\t\tif ((width & 0x80) == 0) {\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\t\tasm_cel_light_edge(width, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsrc += width;\r\n\t\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\t\t\tdst += width;\r\n\t\t\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} while (yy_32);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--xx_32;\r\n\t\t\t\t} while (xx_32);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2: // lower (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_68:\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\t\t\tsrc += (32 - (BYTE)yy_32) & 2;\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_68;\r\n\t\t\tcase 3: // lower (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_83:\r\n\t\t\t\t\t\tyy_32 = 2;\r\n\t\t\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tasm_cel_light_edge(32 - yy_32, tbl, &dst, &src);\r\n\t\t\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\t\t\tdst = &dst[yy_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\t\t} while (yy_32 != 32);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_83;\r\n\t\t\tcase 4: // lower (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_100:\r\n\t\t\t\t\t\ti = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\t\tasm_cel_light_square(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--i;\r\n\t\t\t\t\t\t} while (i);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst += xx_32;\r\n\t\t\t\t\tsrc += (32 - (BYTE)xx_32) & 2;\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_100;\r\n\t\t\tdefault: // lower (solid), with lighting\r\n\t\t\t\txx_32 = 30;\r\n\t\t\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\t\t\tsrc += 288;\r\n\t\t\t\t\tLABEL_116:\r\n\t\t\t\t\t\tj = 16;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\t\t\tasm_cel_light_square(8, tbl, &dst, &src);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tasm_cel_light_edge(32 - xx_32, tbl, &dst, &src);\r\n\t\t\t\t\tsrc += (BYTE)src & 2;\r\n\t\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\t\txx_32 -= 2;\r\n\t\t\t\t} while (xx_32 >= 0);\r\n\t\t\t\tgoto LABEL_116;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsrc = pSpeedCels\r\n\t\t    + *(DWORD *)&gpCelFrame[4 * (light_table_index + 16 * (level_cel_block & 0xFFF))];\r\n\t\tcel_type_16 = (WORD)level_cel_block >> 12;\r\n\t} else {\r\n\t\tif (level_cel_block & 0x8000)\r\n\t\t\tlevel_cel_block = *(DWORD *)&gpCelFrame[64 * (level_cel_block & 0xFFF)]\r\n\t\t\t    + (WORD)(level_cel_block & 0xF000);\r\n\t\tsrc = pDungeonCels + *((DWORD *)pDungeonCels + (level_cel_block & 0xFFF));\r\n\t\tcel_type_16 = (((unsigned int)level_cel_block >> 12) & 7) + 8;\r\n\t}\r\n\tswitch (cel_type_16) {\r\n\tcase 8: // lower (solid), without lighting\r\n\t\ti = 32;\r\n\t\tdo {\r\n\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\tj = 8;\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--j;\r\n\t\t\t\t} while (j);\r\n\t\t\t} else {\r\n\t\t\t\tsrc += 32;\r\n\t\t\t\tdst += 32;\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--i;\r\n\t\t} while (i);\r\n\t\tbreak;\r\n\tcase 9: // lower (solid), without lighting\r\n\t\txx_32 = 32;\r\n\t\tdo {\r\n\t\t\tyy_32 = 32;\r\n\t\t\tdo {\r\n\t\t\t\twhile (1) {\r\n\t\t\t\t\twidth = *src++;\r\n\t\t\t\t\tif ((width & 0x80) == 0)\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\twidth = -(char)width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t\tyy_32 -= width;\r\n\t\t\t\t\tif (!yy_32)\r\n\t\t\t\t\t\tgoto LABEL_143;\r\n\t\t\t\t}\r\n\t\t\t\tyy_32 -= width;\r\n\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\tchk_sh_and = width >> 1;\r\n\t\t\t\t\tif (width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\t++src;\r\n\t\t\t\t\t\t++dst;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (chk_sh_and) {\r\n\t\t\t\t\t\tn_draw_shift = chk_sh_and >> 1;\r\n\t\t\t\t\t\tif (chk_sh_and & 1) {\r\n\t\t\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} while (yy_32);\r\n\t\tLABEL_143:\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t--xx_32;\r\n\t\t} while (xx_32);\r\n\t\tbreak;\r\n\tcase 10: // lower (solid), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_153:\r\n\t\t\t\tyy_32 = 2;\r\n\t\t\t\tif (dst >= gpBufEnd) {\r\n\t\t\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\t\t\tdst -= 192 * world_tbl;\r\n\t\t\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t\t\t}\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdst += yy_32;\r\n\t\t\t\t\tn_draw_shift = (unsigned int)(32 - yy_32) >> 2;\r\n\t\t\t\t\tif ((32 - yy_32) & 2) {\r\n\t\t\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (n_draw_shift) {\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t\t\t} while (n_draw_shift);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tyy_32 += 2;\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t} while (yy_32 < 32);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_153;\r\n\tcase 11: // lower (solid), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff < gpBufEnd)\r\n\t\t\tgoto LABEL_166;\r\n\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\tif (tile_42_45 <= 45) {\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t\tdo {\r\n\t\t\tLABEL_166:\r\n\t\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\t\txx_32 -= 2;\r\n\t\t\t} while (xx_32 >= 0);\r\n\t\t\tgoto LABEL_171;\r\n\t\t}\r\n\t\tdst = pBuff - 12288;\r\n\t\tsrc += 288;\r\n\tLABEL_171:\r\n\t\tyy_32 = 2;\r\n\t\tif (dst >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(dst - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 42)\r\n\t\t\t\treturn;\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_2[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\tyy_32 = (world_tbl >> 1) + 2;\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tfor (n_draw_shift = (unsigned int)(32 - yy_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 4;\r\n\t\t\t}\r\n\t\t\tif ((32 - (BYTE)yy_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tdst += yy_32;\r\n\t\t\tyy_32 += 2;\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t} while (yy_32 < 32);\r\n\t\tbreak;\r\n\tcase 12: // lower (solid), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_189:\r\n\t\t\t\ti = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tdst += xx_32;\r\n\t\t\tn_draw_shift = (unsigned int)(32 - xx_32) >> 2;\r\n\t\t\tif ((32 - xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *((WORD *)src + 1);\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tif (n_draw_shift) {\r\n\t\t\t\tdo {\r\n\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t--n_draw_shift;\r\n\t\t\t\t} while (n_draw_shift);\r\n\t\t\t}\r\n\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_189;\r\n\tdefault: // lower (solid), without lighting\r\n\t\txx_32 = 30;\r\n\t\tif (pBuff >= gpBufEnd) {\r\n\t\t\ttile_42_45 = (unsigned int)(pBuff - gpBufEnd + 1023) >> 8;\r\n\t\t\tif (tile_42_45 > 45) {\r\n\t\t\t\tdst = pBuff - 12288;\r\n\t\t\t\tsrc += 288;\r\n\t\t\tLABEL_205:\r\n\t\t\t\ti = 16;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (dst < gpBufEnd) {\r\n\t\t\t\t\t\tj = 8;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t\t\t--j;\r\n\t\t\t\t\t\t} while (j);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsrc += 32;\r\n\t\t\t\t\t\tdst += 32;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= (SCREEN_WIDTH + 160);\r\n\t\t\t\t\t--i;\r\n\t\t\t\t} while (i);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tworld_tbl = WorldTbl3x16[tile_42_45];\r\n\t\t\tsrc += WorldTbl17_1[world_tbl >> 2];\r\n\t\t\tdst -= 192 * world_tbl;\r\n\t\t\txx_32 = 30 - (world_tbl >> 1);\r\n\t\t}\r\n\t\tdo {\r\n\t\t\tfor (n_draw_shift = (unsigned int)(32 - xx_32) >> 2; n_draw_shift; --n_draw_shift) {\r\n\t\t\t\t*(DWORD *)dst = *(DWORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 4;\r\n\t\t\t}\r\n\t\t\tif ((32 - (BYTE)xx_32) & 2) {\r\n\t\t\t\t*(WORD *)dst = *(WORD *)src;\r\n\t\t\t\tsrc += 4;\r\n\t\t\t\tdst += 2;\r\n\t\t\t}\r\n\t\t\tdst = &dst[xx_32 - (SCREEN_WIDTH + 160)];\r\n\t\t\txx_32 -= 2;\r\n\t\t} while (xx_32 >= 0);\r\n\t\tgoto LABEL_205;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a black tile\r\n * @param pBuff pointer where to render the tile\r\n */\r\nvoid world_draw_black_tile(BYTE *pBuff)\r\n{\r\n\tBYTE *dst;\r\n\tint i, j;\r\n\tint xx, yy;\r\n\r\n\tdst = pBuff;\r\n\r\n\txx = 30;\r\n\tfor (i = 1;; i++) {\r\n\t\tdst += xx;\r\n\t\tj = i;\r\n\t\tdo {\r\n\t\t\t*(DWORD *)dst = 0;\r\n\t\t\tdst += 4;\r\n\t\t\tj--;\r\n\t\t} while (j);\r\n\t\tdst = &dst[xx - 832];\r\n\t\tif (!xx)\r\n\t\t\tbreak;\r\n\t\txx -= 2;\r\n\t}\r\n\r\n\tyy = 2;\r\n\ti = 15;\r\n\tdo {\r\n\t\tdst += yy;\r\n\t\tj = i;\r\n\t\tdo {\r\n\t\t\t*(DWORD *)dst = 0;\r\n\t\t\tdst += 4;\r\n\t\t\tj--;\r\n\t\t} while (j);\r\n\t\tdst = &dst[yy - 832];\r\n\t\ti--;\r\n\t\tyy += 2;\r\n\t} while (yy != 32);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/render.h",
    "content": "/**\r\n * @file render.h\r\n *\r\n * Interface of functionality for rendering the level tiles.\r\n */\r\n#ifndef __RENDER_H__\r\n#define __RENDER_H__\r\n\r\nvoid drawUpperScreen(BYTE *pBuff);\r\nvoid drawLowerScreen(BYTE *pBuff);\r\nvoid world_draw_black_tile(BYTE *pBuff);\r\n\r\n/* rdata */\r\n\r\nextern int WorldBoolFlag;\r\nextern DWORD gdwCurrentMask;\r\nextern BYTE *gpCelFrame;\r\nextern DWORD *gpDrawMask;\r\nextern DWORD RightMask[TILE_WIDTH];\r\nextern DWORD LeftMask[TILE_WIDTH];\r\nextern int WorldTbl3x16[48];\r\nextern int WorldTbl17_1[17];\r\nextern int WorldTbl17_2[17];\r\n\r\n#endif /* __RENDER_H__ */\r\n"
  },
  {
    "path": "Source/restrict.cpp",
    "content": "/**\r\n * @file restrict.cpp\r\n *\r\n * Implementation of functionality for checking if the game will be able run on the system.\r\n */\r\n#include \"all.h\"\r\n\r\n/**\r\n * @brief Check that the OS version is the minimum required by the game\r\n * @return True if suported\r\n */\r\nBOOL SystemSupported()\r\n{\r\n\tOSVERSIONINFO VersionInformation;\r\n\tBOOL ret = FALSE;\r\n\r\n\tmemset(&VersionInformation, 0, sizeof(VersionInformation));\r\n\tVersionInformation.dwOSVersionInfoSize = sizeof(VersionInformation);\r\n\tif (GetVersionEx(&VersionInformation)\r\n\t    && VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT\r\n\t    && VersionInformation.dwMajorVersion >= 5) {\r\n\t\tret = TRUE;\r\n\t}\r\n\treturn ret;\r\n}\r\n\r\n/**\r\n * @brief Check that we have write access to the Windows install folder\r\n * @return False if we have write access\r\n\r\n */\r\nBOOL RestrictedTest()\r\n{\r\n\tFILE *f;\r\n\tchar Buffer[MAX_PATH];\r\n\tBOOL ret = FALSE;\r\n\r\n\tif (SystemSupported() && GetWindowsDirectory(Buffer, sizeof(Buffer))) {\r\n\t\tstrcat(Buffer, \"\\\\Diablo1RestrictedTest.foo\");\r\n\t\tf = fopen(Buffer, \"wt\");\r\n\t\tif (f) {\r\n\t\t\tfclose(f);\r\n\t\t\tremove(Buffer);\r\n\t\t} else {\r\n\t\t\tret = TRUE;\r\n\t\t}\r\n\t}\r\n\treturn ret;\r\n}\r\n\r\n/**\r\n * @brief Check that we have write access to the game install folder\r\n * @return False if we have write access\r\n\r\n */\r\nBOOL ReadOnlyTest()\r\n{\r\n\tchar *c;\r\n\tFILE *f;\r\n\tchar Filename[MAX_PATH];\r\n\tBOOL ret = FALSE;\r\n\r\n\tif (GetModuleFileName(ghInst, Filename, sizeof(Filename))) {\r\n\t\tc = strrchr(Filename, '\\\\');\r\n\t\tif (c) {\r\n\t\t\tstrcpy(c + 1, \"Diablo1ReadOnlyTest.foo\");\r\n\t\t\tf = fopen(Filename, \"wt\");\r\n\t\t\tif (f) {\r\n\t\t\t\tfclose(f);\r\n\t\t\t\tremove(Filename);\r\n\t\t\t} else {\r\n\t\t\t\tret = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn ret;\r\n}\r\n"
  },
  {
    "path": "Source/restrict.h",
    "content": "/**\r\n * @file restrict.h\r\n *\r\n * Interface of functionality for checking if the game will be able run on the system.\r\n */\r\n#ifndef __RESTRICT_H__\r\n#define __RESTRICT_H__\r\n\r\nBOOL RestrictedTest();\r\nBOOL ReadOnlyTest();\r\n\r\n#endif /* __RESTRICT_H__ */\r\n"
  },
  {
    "path": "Source/scrollrt.cpp",
    "content": "/**\r\n * @file scrollrt.cpp\r\n *\r\n * Implementation of functionality for rendering the dungeons, monsters and calling other render routines.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n/**\r\n * Specifies the current light entry.\r\n */\r\nint light_table_index;\r\nint PitchTbl[1024];\r\nDWORD sgdwCursWdtOld;\r\nDWORD sgdwCursX;\r\nDWORD sgdwCursY;\r\n/**\r\n * Lower bound of back buffer.\r\n */\r\nBYTE *gpBufEnd;\r\nDWORD sgdwCursHgt;\r\n\r\n/**\r\n * Specifies the current MIN block of the level CEL file, as used during rendering of the level tiles.\r\n *\r\n * frameNum  := block & 0x0FFF\r\n * frameType := block & 0x7000 >> 12\r\n */\r\nDWORD level_cel_block;\r\nDWORD sgdwCursXOld;\r\nDWORD sgdwCursYOld;\r\n#ifdef HELLFIRE\r\nBOOLEAN AutoMapShowItems;\r\n#endif\r\n/**\r\n * Specifies the type of arches to render.\r\n */\r\nchar arch_draw_type;\r\n/**\r\n * Describes the surface being rendered.\r\n */\r\nDDSURFACEDESC DDS_desc;\r\n/**\r\n * Specifies whether transparency is active for the current CEL file being decoded.\r\n */\r\nint cel_transparency_active;\r\n/**\r\n * Specifies the current dungeon piece ID of the level, as used during rendering of the level tiles.\r\n */\r\nint level_piece_id;\r\nDWORD sgdwCursWdt;\r\nvoid (*DrawPlrProc)(int, int, int, int, int, BYTE *, int, int, int, int);\r\nBYTE sgSaveBack[8192];\r\n/**\r\n * Specifies the monster_num to render.\r\n */\r\nint draw_monster_num;\r\nDWORD sgdwCursHgtOld;\r\n\r\n/* data */\r\n\r\n/* used in 1.00 debug */\r\nconst char *const szMonModeAssert[18] = {\r\n\t\"standing\",\r\n\t\"walking (1)\",\r\n\t\"walking (2)\",\r\n\t\"walking (3)\",\r\n\t\"attacking\",\r\n\t\"getting hit\",\r\n\t\"dying\",\r\n\t\"attacking (special)\",\r\n\t\"fading in\",\r\n\t\"fading out\",\r\n\t\"attacking (ranged)\",\r\n\t\"standing (special)\",\r\n\t\"attacking (special ranged)\",\r\n\t\"delaying\",\r\n\t\"charging\",\r\n\t\"stoned\",\r\n\t\"healing\",\r\n\t\"talking\"\r\n};\r\n\r\nconst char *const szPlrModeAssert[12] = {\r\n\t\"standing\",\r\n\t\"walking (1)\",\r\n\t\"walking (2)\",\r\n\t\"walking (3)\",\r\n\t\"attacking (melee)\",\r\n\t\"attacking (ranged)\",\r\n\t\"blocking\",\r\n\t\"getting hit\",\r\n\t\"dying\",\r\n\t\"casting a spell\",\r\n\t\"changing levels\",\r\n\t\"quitting\"\r\n};\r\n\r\n/**\r\n * @brief Clear cursor state\r\n */\r\nvoid ClearCursor() // CODE_FIX: this was supposed to be in cursor.cpp\r\n{\r\n\tsgdwCursWdt = 0;\r\n\tsgdwCursWdtOld = 0;\r\n}\r\n\r\n/**\r\n * @brief Remove the cursor from the back buffer\r\n */\r\nstatic void scrollrt_draw_cursor_back_buffer()\r\n{\r\n\tint i;\r\n\tBYTE *src, *dst;\r\n\r\n\tif (sgdwCursWdt == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tsrc = sgSaveBack;\r\n\tdst = &gpBuffer[SCREENXY(sgdwCursX, sgdwCursY)];\r\n\ti = sgdwCursHgt;\r\n\r\n\tif (sgdwCursHgt != 0) {\r\n\t\twhile (i--) {\r\n\t\t\tmemcpy(dst, src, sgdwCursWdt);\r\n\t\t\tsrc += sgdwCursWdt;\r\n\t\t\tdst += BUFFER_WIDTH;\r\n\t\t}\r\n\t}\r\n\r\n\tsgdwCursXOld = sgdwCursX;\r\n\tsgdwCursYOld = sgdwCursY;\r\n\tsgdwCursWdtOld = sgdwCursWdt;\r\n\tsgdwCursHgtOld = sgdwCursHgt;\r\n\tsgdwCursWdt = 0;\r\n}\r\n\r\n/**\r\n * @brief Draw the cursor on the back buffer\r\n */\r\nstatic void scrollrt_draw_cursor_item()\r\n{\r\n\tint i, mx, my, col;\r\n\tBYTE *src, *dst;\r\n\r\n\t/// ASSERT: assert(! sgdwCursWdt);\r\n\r\n\tif (pcurs <= CURSOR_NONE || cursW == 0 || cursH == 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmx = MouseX - 1;\r\n\tif (mx < 0) {\r\n\t\tmx = 0;\r\n\t} else if (mx > SCREEN_WIDTH - 1) {\r\n\t\treturn;\r\n\t}\r\n\tmy = MouseY - 1;\r\n\tif (my < 0) {\r\n\t\tmy = 0;\r\n\t} else if (my > SCREEN_HEIGHT - 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tsgdwCursX = mx;\r\n\tsgdwCursWdt = sgdwCursX + cursW + 1;\r\n\tif (sgdwCursWdt > SCREEN_WIDTH - 1) {\r\n\t\tsgdwCursWdt = SCREEN_WIDTH - 1;\r\n\t}\r\n\tsgdwCursX &= ~3;\r\n\tsgdwCursWdt |= 3;\r\n\tsgdwCursWdt -= sgdwCursX;\r\n\tsgdwCursWdt++;\r\n\r\n\tsgdwCursY = my;\r\n\tsgdwCursHgt = sgdwCursY + cursH + 1;\r\n\tif (sgdwCursHgt > SCREEN_HEIGHT - 1) {\r\n\t\tsgdwCursHgt = SCREEN_HEIGHT - 1;\r\n\t}\r\n\tsgdwCursHgt -= sgdwCursY;\r\n\tsgdwCursHgt++;\r\n\r\n\t/// ASSERT: assert(sgdwCursWdt * sgdwCursHgt < sizeof sgSaveBack);\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tdst = sgSaveBack;\r\n\tsrc = &gpBuffer[SCREENXY(sgdwCursX, sgdwCursY)];\r\n\r\n\tfor (i = sgdwCursHgt; i != 0; i--, dst += sgdwCursWdt, src += BUFFER_WIDTH) {\r\n\t\tmemcpy(dst, src, sgdwCursWdt);\r\n\t}\r\n\r\n\tmx++;\r\n\tmy++;\r\n\tgpBufEnd = &gpBuffer[PitchTbl[SCREEN_HEIGHT + SCREEN_Y] - cursW - 2];\r\n\r\n\tif (pcurs >= CURSOR_FIRSTITEM) {\r\n\t\tcol = PAL16_YELLOW + 5;\r\n\t\tif (plr[myplr].HoldItem._iMagical != 0) {\r\n\t\t\tcol = PAL16_BLUE + 5;\r\n\t\t}\r\n\t\tif (!plr[myplr].HoldItem._iStatFlag) {\r\n\t\t\tcol = PAL16_RED + 5;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (pcurs <= 179) {\r\n#endif\r\n\t\t\tCelBlitOutlineSafe(col, mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8);\r\n\t\t\tif (col != PAL16_RED + 5) {\r\n\t\t\t\tCelClippedDrawSafe(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8);\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRedSafe(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8, 1);\r\n\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t} else {\r\n\t\t\tCelBlitOutlineSafe(col, mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels2, pcurs - 179, cursW, 0, 8);\r\n\t\t\tif (col != PAL16_RED + 5) {\r\n\t\t\t\tCelClippedDrawSafe(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels2, pcurs - 179, cursW, 0, 8);\r\n\t\t\t} else {\r\n\t\t\t\tCelDrawLightRedSafe(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels2, pcurs - 179, cursW, 0, 8, 1);\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\t} else {\r\n\t\tCelClippedDrawSafe(mx + SCREEN_X, my + cursH + SCREEN_Y - 1, pCursCels, pcurs, cursW, 0, 8);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a missile sprites for a given tile\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n * @param pre Is the sprite in the background\r\n */\r\nvoid DrawMissile(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL pre)\r\n{\r\n\tint i, mx, my, nCel;\r\n\tMissileStruct *m;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif (dMissile[x][y] == -1) {\r\n\t\tfor (i = 0; i < nummissiles; i++) {\r\n\t\t\t/// ASSERT: assert(missileactive[i] < MAXMISSILES);\r\n\t\t\tif (missileactive[i] >= MAXMISSILES)\r\n\t\t\t\tbreak;\r\n#ifdef HELLFIRE\r\n\t\t\tif (missileactive[i] < 0)\r\n\t\t\t\tbreak;\r\n#endif\r\n\t\t\tm = &missile[missileactive[i]];\r\n\t\t\tif (m->_mix == x && m->_miy == y && m->_miPreFlag == pre && m->_miDrawFlag) {\r\n\t\t\t\tpCelBuff = m->_miAnimData;\r\n\t\t\t\tif (!pCelBuff) {\r\n\t\t\t\t\t// app_fatal(\"Draw Missile type %d: NULL Cel Buffer\", m->_mitype);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tnCel = m->_miAnimFrame;\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t// app_fatal(\"Draw Missile: frame %d of %d, missile type==%d\", nCel, pFrameTable[0], m->_mitype);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tmx = sx + m->_mixoff - m->_miAnimWidth2;\r\n\t\t\t\tmy = sy + m->_miyoff;\r\n\t\t\t\tif (m->_miUniqTrans)\r\n\t\t\t\t\tCl2DrawLightTbl(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap, m->_miUniqTrans + 3);\r\n\t\t\t\telse if (m->_miLightFlag)\r\n\t\t\t\t\tCl2DrawLight(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t\t\telse\r\n\t\t\t\t\tCl2Draw(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tm = &missile[dMissile[x][y] - 1];\r\n#ifdef HELLFIRE\r\n\t\tif (m->_miPreFlag == pre) {\r\n#else\r\n\t\tif (m->_miPreFlag == pre && m->_miDrawFlag) {\r\n#endif\r\n\t\t\tpCelBuff = m->_miAnimData;\r\n\t\t\tif (!pCelBuff) {\r\n\t\t\t\t// app_fatal(\"Draw Missile 2 type %d: NULL Cel Buffer\", m->_mitype);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tnCel = m->_miAnimFrame;\r\n\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t// app_fatal(\"Draw Missile 2: frame %d of %d, missile type==%d\", nCel, pFrameTable[0], m->_mitype);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tmx = sx + m->_mixoff - m->_miAnimWidth2;\r\n\t\t\tmy = sy + m->_miyoff;\r\n\t\t\tif (m->_miUniqTrans)\r\n\t\t\t\tCl2DrawLightTbl(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap, m->_miUniqTrans + 3);\r\n\t\t\telse if (m->_miLightFlag)\r\n\t\t\t\tCl2DrawLight(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t\telse\r\n\t\t\t\tCl2Draw(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a missile sprite, check for overdraw on lower screen\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n * @param pre Is the sprite in the background\r\n */\r\nvoid DrawClippedMissile(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL pre)\r\n{\r\n\tint i, mx, my, nCel;\r\n\tMissileStruct *m;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif (dMissile[x][y] == -1) {\r\n\t\tfor (i = 0; i < nummissiles; i++) {\r\n\t\t\t/// ASSERT: assert(missileactive[i] < MAXMISSILES);\r\n\t\t\tif (missileactive[i] >= MAXMISSILES)\r\n\t\t\t\tbreak;\r\n#ifdef HELLFIRE\r\n\t\t\tif (missileactive[i] < 0)\r\n\t\t\t\tbreak;\r\n#endif\r\n\t\t\tm = &missile[missileactive[i]];\r\n\t\t\tif (m->_mix == x && m->_miy == y && m->_miPreFlag == pre && m->_miDrawFlag) {\r\n\t\t\t\tpCelBuff = m->_miAnimData;\r\n\t\t\t\tif (!pCelBuff) {\r\n\t\t\t\t\t// app_fatal(\"Draw Missile type %d Clipped: NULL Cel Buffer\", m->_mitype);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tnCel = m->_miAnimFrame;\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t// app_fatal(\"Draw Clipped Missile: frame %d of %d, missile type==%d\", nCel, pFrameTable[0], m->_mitype);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tmx = sx + m->_mixoff - m->_miAnimWidth2;\r\n\t\t\t\tmy = sy + m->_miyoff;\r\n\t\t\t\tif (m->_miUniqTrans)\r\n\t\t\t\t\tCl2DrawLightTblSafe(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap, m->_miUniqTrans + 3);\r\n\t\t\t\telse if (m->_miLightFlag)\r\n\t\t\t\t\tCl2DrawLightSafe(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t\t\telse\r\n\t\t\t\t\tCl2DrawSafe(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tm = &missile[dMissile[x][y] - 1];\r\n#ifdef HELLFIRE\r\n\t\tif (m->_miPreFlag == pre) {\r\n#else\r\n\t\tif (m->_miPreFlag == pre && m->_miDrawFlag) {\r\n#endif\r\n\t\t\tpCelBuff = m->_miAnimData;\r\n\t\t\tif (!pCelBuff) {\r\n\t\t\t\t// app_fatal(\"Draw Missile 2 type %d Clipped: NULL Cel Buffer\", m->_mitype);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tnCel = m->_miAnimFrame;\r\n\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t// app_fatal(\"Draw Clipped Missile 2: frame %d of %d, missile type==%d\", nCel, pFrameTable[0], m->_mitype);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tmx = sx + m->_mixoff - m->_miAnimWidth2;\r\n\t\t\tmy = sy + m->_miyoff;\r\n\t\t\tif (m->_miUniqTrans)\r\n\t\t\t\tCl2DrawLightTblSafe(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap, m->_miUniqTrans + 3);\r\n\t\t\telse if (m->_miLightFlag)\r\n\t\t\t\tCl2DrawLightSafe(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t\telse\r\n\t\t\t\tCl2DrawSafe(mx, my, m->_miAnimData, m->_miAnimFrame, m->_miAnimWidth, CelSkip, CelCap);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a monster sprite\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param mx Back buffer coordinate\r\n * @param my Back buffer coordinate\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n */\r\nstatic void DrawMonster(int x, int y, int mx, int my, int m, int CelSkip, int CelCap)\r\n{\r\n\tint nCel;\r\n\tchar trans;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif ((DWORD)m >= MAXMONSTERS) {\r\n\t\t// app_fatal(\"Draw Monster: tried to draw illegal monster %d\", m);\r\n\t\treturn;\r\n\t}\r\n\r\n\tpCelBuff = monster[m]._mAnimData;\r\n\tif (!pCelBuff) {\r\n\t\t// app_fatal(\"Draw Monster \\\"%s\\\": NULL Cel Buffer\", monster[m].mName);\r\n\t\treturn;\r\n\t}\r\n\r\n\tnCel = monster[m]._mAnimFrame;\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t/*\r\n\t\tconst char *szMode = \"unknown action\";\r\n\t\tif(monster[m]._mmode <= 17)\r\n\t\t\tszMode = szMonModeAssert[monster[m]._mmode];\r\n\t\tapp_fatal(\r\n\t\t\t\"Draw Monster \\\"%s\\\" %s: facing %d, frame %d of %d\",\r\n\t\t\tmonster[m].mName,\r\n\t\t\tszMode,\r\n\t\t\tmonster[m]._mdir,\r\n\t\t\tnCel,\r\n\t\t\tpFrameTable[0]);\r\n\t\t*/\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!(dFlags[x][y] & BFLAG_LIT)) {\r\n\t\tCl2DrawLightTbl(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, 1);\r\n\t} else {\r\n\t\ttrans = 0;\r\n\t\tif (monster[m]._uniqtype)\r\n\t\t\ttrans = monster[m]._uniqtrans + 4;\r\n\t\tif (monster[m]._mmode == MM_STONE)\r\n\t\t\ttrans = 2;\r\n\t\tif (plr[myplr]._pInfraFlag && light_table_index > 8)\r\n\t\t\ttrans = 1;\r\n\t\tif (trans)\r\n\t\t\tCl2DrawLightTbl(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, trans);\r\n\t\telse\r\n\t\t\tCl2DrawLight(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a monster sprite, check for overdraw on lower screen\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param mx Back buffer coordinate\r\n * @param my Back buffer coordinate\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n */\r\nstatic void DrawClippedMonster(int x, int y, int mx, int my, int m, int CelSkip, int CelCap)\r\n{\r\n\tint nCel;\r\n\tchar trans;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif ((DWORD)m >= MAXMONSTERS) {\r\n\t\t// app_fatal(\"Draw Monster Clipped: tried to draw illegal monster %d\", m);\r\n\t\treturn;\r\n\t}\r\n\r\n\tpCelBuff = monster[m]._mAnimData;\r\n\tif (!pCelBuff) {\r\n\t\t// app_fatal(\"Draw Monster \\\"%s\\\" Clipped: NULL Cel Buffer\", monster[m].mName);\r\n\t\treturn;\r\n\t}\r\n\r\n\tnCel = monster[m]._mAnimFrame;\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t/*\r\n\t\tconst char *szMode = \"unknown action\";\r\n\t\tif(monster[m]._mmode <= 17)\r\n\t\t\tszMode = szMonModeAssert[monster[m]._mmode];\r\n\t\tapp_fatal(\r\n\t\t\t\"Draw Monster \\\"%s\\\" %s Clipped: facing %d, frame %d of %d\",\r\n\t\t\tmonster[m].mName,\r\n\t\t\tszMode,\r\n\t\t\tmonster[m]._mdir,\r\n\t\t\tnCel,\r\n\t\t\tpFrameTable[0]);\r\n\t\t*/\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!(dFlags[x][y] & BFLAG_LIT)) {\r\n\t\tCl2DrawLightTblSafe(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, 1);\r\n\t} else {\r\n\t\ttrans = 0;\r\n\t\tif (monster[m]._uniqtype)\r\n\t\t\ttrans = monster[m]._uniqtrans + 4;\r\n\t\tif (monster[m]._mmode == MM_STONE)\r\n\t\t\ttrans = 2;\r\n\t\tif (plr[myplr]._pInfraFlag && light_table_index > 8)\r\n\t\t\ttrans = 1;\r\n\t\tif (trans)\r\n\t\t\tCl2DrawLightTblSafe(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap, trans);\r\n\t\telse\r\n\t\t\tCl2DrawLightSafe(mx, my, monster[m]._mAnimData, monster[m]._mAnimFrame, monster[m].MType->width, CelSkip, CelCap);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a player sprite\r\n * @param pnum Player id\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param px Back buffer coordinate\r\n * @param py Back buffer coordinate\r\n * @param pCelBuff sprite buffer\r\n * @param nCel frame\r\n * @param nWidth width\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n */\r\nstatic void DrawPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint l;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif (dFlags[x][y] & BFLAG_LIT || plr[myplr]._pInfraFlag || !setlevel && currlevel == 0) {\r\n\t\tif (!pCelBuff) {\r\n\t\t\t// app_fatal(\"Drawing player %d \\\"%s\\\": NULL Cel Buffer\", pnum, plr[pnum]._pName);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t/*\r\n\t\t\tconst char *szMode = \"unknown action\";\r\n\t\t\tif(plr[pnum]._pmode <= PM_QUIT)\r\n\t\t\t\tszMode = szPlrModeAssert[plr[pnum]._pmode];\r\n\t\t\tapp_fatal(\r\n\t\t\t\t\"Drawing player %d \\\"%s\\\" %s: facing %d, frame %d of %d\",\r\n\t\t\t\tpnum,\r\n\t\t\t\tplr[pnum]._pName,\r\n\t\t\t\tszMode,\r\n\t\t\t\tplr[pnum]._pdir,\r\n\t\t\t\tnCel,\r\n\t\t\t\tpFrameTable[0]);\r\n\t\t\t*/\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (pnum == pcursplr)\r\n\t\t\tCl2DrawOutline(165, px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap);\r\n\t\tif (pnum == myplr) {\r\n\t\t\tCl2Draw(px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap);\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum].pManaShield)\r\n\t\t\t\tCl2Draw(\r\n\t\t\t\t    px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0],\r\n\t\t\t\t    py,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimData[0],\r\n\t\t\t\t    1,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimWidth[0],\r\n\t\t\t\t    CelSkip,\r\n\t\t\t\t    CelCap);\r\n#endif\r\n\t\t} else if (!(dFlags[x][y] & BFLAG_LIT) || plr[myplr]._pInfraFlag && light_table_index > 8) {\r\n\t\t\tCl2DrawLightTbl(px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap, 1);\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum].pManaShield)\r\n\t\t\t\tCl2DrawLightTbl(\r\n\t\t\t\t    px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0],\r\n\t\t\t\t    py,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimData[0],\r\n\t\t\t\t    1,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimWidth[0],\r\n\t\t\t\t    CelSkip,\r\n\t\t\t\t    CelCap,\r\n\t\t\t\t    1);\r\n#endif\r\n\t\t} else {\r\n\t\t\tl = light_table_index;\r\n\t\t\tif (light_table_index < 5)\r\n\t\t\t\tlight_table_index = 0;\r\n\t\t\telse\r\n\t\t\t\tlight_table_index -= 5;\r\n\t\t\tCl2DrawLight(px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap);\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum].pManaShield)\r\n\t\t\t\tCl2DrawLight(\r\n\t\t\t\t    px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0],\r\n\t\t\t\t    py,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimData[0],\r\n\t\t\t\t    1,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimWidth[0],\r\n\t\t\t\t    CelSkip,\r\n\t\t\t\t    CelCap);\r\n#endif\r\n\t\t\tlight_table_index = l;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a monster sprite, check for overdraw on lower screen\r\n * @param pnum Player id\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param px Back buffer coordinate\r\n * @param py Back buffer coordinate\r\n * @param pCelBuff sprite buffer\r\n * @param nCel frame\r\n * @param nWidth width\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n */\r\nstatic void DrawClippedPlayer(int pnum, int x, int y, int px, int py, BYTE *pCelBuff, int nCel, int nWidth, int CelSkip, int CelCap)\r\n{\r\n\tint l;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif (dFlags[x][y] & BFLAG_LIT || plr[myplr]._pInfraFlag) {\r\n\t\tif (!pCelBuff) {\r\n\t\t\t// app_fatal(\"Drawing player %d \\\"%s\\\" clipped: NULL Cel Buffer\", pnum, plr[pnum]._pName);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t/*\r\n\t\t\tconst char *szMode = \"unknown action\";\r\n\t\t\tif(plr[pnum]._pmode <= PM_QUIT)\r\n\t\t\t\tszMode = szPlrModeAssert[plr[pnum]._pmode];\r\n\t\t\tapp_fatal(\r\n\t\t\t\t\"Drawing player %d \\\"%s\\\" %s clipped: facing %d, frame %d of %d\",\r\n\t\t\t\tpnum,\r\n\t\t\t\tplr[pnum]._pName,\r\n\t\t\t\tszMode,\r\n\t\t\t\tplr[pnum]._pdir,\r\n\t\t\t\tnCel,\r\n\t\t\t\tpFrameTable[0]);\r\n\t\t\t*/\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (pnum == pcursplr)\r\n\t\t\tCl2DrawOutlineSafe(165, px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap);\r\n\t\tif (pnum == myplr) {\r\n\t\t\tCl2DrawSafe(px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap);\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum].pManaShield)\r\n\t\t\t\tCl2DrawSafe(\r\n\t\t\t\t    px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0],\r\n\t\t\t\t    py,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimData[0],\r\n\t\t\t\t    1,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimWidth[0],\r\n\t\t\t\t    CelSkip,\r\n\t\t\t\t    CelCap);\r\n#endif\r\n\t\t} else if (!(dFlags[x][y] & BFLAG_LIT) || plr[myplr]._pInfraFlag && light_table_index > 8) {\r\n\t\t\tCl2DrawLightTblSafe(px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap, 1);\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum].pManaShield)\r\n\t\t\t\tCl2DrawLightTblSafe(\r\n\t\t\t\t    px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0],\r\n\t\t\t\t    py,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimData[0],\r\n\t\t\t\t    1,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimWidth[0],\r\n\t\t\t\t    CelSkip,\r\n\t\t\t\t    CelCap,\r\n\t\t\t\t    1);\r\n#endif\r\n\t\t} else {\r\n\t\t\tl = light_table_index;\r\n\t\t\tif (light_table_index < 5)\r\n\t\t\t\tlight_table_index = 0;\r\n\t\t\telse\r\n\t\t\t\tlight_table_index -= 5;\r\n\t\t\tCl2DrawLightSafe(px, py, pCelBuff, nCel, nWidth, CelSkip, CelCap);\r\n#ifndef HELLFIRE\r\n\t\t\tif (plr[pnum].pManaShield)\r\n\t\t\t\tCl2DrawLightSafe(\r\n\t\t\t\t    px + plr[pnum]._pAnimWidth2 - misfiledata[MFILE_MANASHLD].mAnimWidth2[0],\r\n\t\t\t\t    py,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimData[0],\r\n\t\t\t\t    1,\r\n\t\t\t\t    misfiledata[MFILE_MANASHLD].mAnimWidth[0],\r\n\t\t\t\t    CelSkip,\r\n\t\t\t\t    CelCap);\r\n#endif\r\n\t\t\tlight_table_index = l;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a player sprite\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n * @param clipped check for overdraw on lower screen\r\n */\r\nvoid DrawDeadPlayer(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL clipped)\r\n{\r\n\tint i, px, py, nCel;\r\n\tPlayerStruct *p;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif (clipped)\r\n\t\tDrawPlrProc = DrawClippedPlayer;\r\n\telse\r\n\t\tDrawPlrProc = DrawPlayer;\r\n\r\n\tdFlags[x][y] &= ~BFLAG_DEAD_PLAYER;\r\n\r\n\tfor (i = 0; i < MAX_PLRS; i++) {\r\n\t\tp = &plr[i];\r\n\t\tif (p->plractive && p->_pHitPoints == 0 && p->plrlevel == (BYTE)currlevel && p->_px == x && p->_py == y) {\r\n\t\t\tpCelBuff = p->_pAnimData;\r\n\t\t\tif (!pCelBuff) {\r\n\t\t\t\t// app_fatal(\"Drawing dead player %d \\\"%s\\\": NULL Cel Buffer\", i, p->_pName);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tnCel = p->_pAnimFrame;\r\n\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t// app_fatal(\"Drawing dead player %d \\\"%s\\\": facing %d, frame %d of %d\", i, p->_pName, p->_pdir, nCel, pFrameTable[0]);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tdFlags[x][y] |= BFLAG_DEAD_PLAYER;\r\n\t\t\tpx = sx + p->_pxoff - p->_pAnimWidth2;\r\n\t\t\tpy = sy + p->_pyoff;\r\n\t\t\tDrawPlrProc(i, x, y, px, py, p->_pAnimData, p->_pAnimFrame, p->_pAnimWidth, CelSkip, CelCap);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render an object sprite\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param ox Back buffer coordinate\r\n * @param oy Back buffer coordinate\r\n * @param pre Is the sprite in the background\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n */\r\nstatic void DrawObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int CelCap)\r\n{\r\n\tint sx, sy, xx, yy, nCel;\r\n\tchar bv;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif (dObject[x][y] > 0) {\r\n\t\tbv = dObject[x][y] - 1;\r\n\t\tif (object[bv]._oPreFlag != pre)\r\n\t\t\treturn;\r\n\t\tsx = ox - object[bv]._oAnimWidth2;\r\n\t\tsy = oy;\r\n\t} else {\r\n\t\tbv = -(dObject[x][y] + 1);\r\n\t\tif (object[bv]._oPreFlag != pre)\r\n\t\t\treturn;\r\n\t\txx = object[bv]._ox - x;\r\n\t\tyy = object[bv]._oy - y;\r\n\t\tsx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5);\r\n\t\tsy = oy + (yy << 4) + (xx << 4);\r\n\t\tCelSkip = 0;\r\n\t\tCelCap = 8;\r\n\t}\r\n\r\n\t/// ASSERT: assert((unsigned char)bv < MAXOBJECTS);\r\n#ifdef HELLFIRE\r\n\tif (bv >= MAXOBJECTS)\r\n\t\treturn;\r\n\tif (bv < 0)\r\n\t\treturn;\r\n#else\r\n\tif ((BYTE)bv >= MAXOBJECTS)\r\n\t\treturn;\r\n#endif\r\n\r\n\tpCelBuff = object[bv]._oAnimData;\r\n\tif (!pCelBuff) {\r\n\t\t// app_fatal(\"Draw Object type %d: NULL Cel Buffer\", object[bv]._otype);\r\n\t\treturn;\r\n\t}\r\n\r\n\tnCel = object[bv]._oAnimFrame;\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t// app_fatal(\"Draw Object: frame %d of %d, object type==%d\", nCel, pFrameTable[0], object[bv]._otype);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (bv == pcursobj)\r\n\t\tCelBlitOutline(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap);\r\n\tif (object[bv]._oLight) {\r\n\t\tCelClippedDrawLight(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap);\r\n\t} else {\r\n\t\t/// ASSERT: assert(object[bv]._oAnimData);\r\n\t\tif (object[bv]._oAnimData) // BUGFIX: _oAnimData was already checked, this is redundant\r\n\t\t\tCelClippedDraw(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render an object sprite, check for overdraw on lower screen\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param ox Back buffer coordinate\r\n * @param oy Back buffer coordinate\r\n * @param pre Is the sprite in the background\r\n * @param CelSkip Skip part of sprite, see Cl2Draw\r\n * @param CelCap  Skip part of sprite, see Cl2Draw\r\n */\r\nstatic void DrawClippedObject(int x, int y, int ox, int oy, BOOL pre, int CelSkip, int CelCap)\r\n{\r\n\tint sx, sy, xx, yy, nCel;\r\n\tchar bv;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\tif (dObject[x][y] > 0) {\r\n\t\tbv = dObject[x][y] - 1;\r\n\t\tif (object[bv]._oPreFlag != pre)\r\n\t\t\treturn;\r\n\t\tsx = ox - object[bv]._oAnimWidth2;\r\n\t\tsy = oy;\r\n\t} else {\r\n\t\tbv = -(dObject[x][y] + 1);\r\n\t\tif (object[bv]._oPreFlag != pre)\r\n\t\t\treturn;\r\n\t\txx = object[bv]._ox - x;\r\n\t\tyy = object[bv]._oy - y;\r\n\t\tsx = (xx << 5) + ox - object[bv]._oAnimWidth2 - (yy << 5);\r\n\t\tsy = oy + (yy << 4) + (xx << 4);\r\n\t\tCelSkip = 0;\r\n\t\tCelCap = 8;\r\n\t}\r\n\r\n\t/// ASSERT: assert((unsigned char)bv < MAXOBJECTS);\r\n#ifdef HELLFIRE\r\n\tif (bv >= MAXOBJECTS)\r\n#else\r\n\tif ((BYTE)bv >= MAXOBJECTS)\r\n#endif\r\n\t\treturn;\r\n\r\n\tpCelBuff = object[bv]._oAnimData;\r\n\tif (!pCelBuff) {\r\n\t\t// app_fatal(\"Draw Object type %d Clipped: NULL Cel Buffer\", object[bv]._otype);\r\n\t\treturn;\r\n\t}\r\n\r\n\tnCel = object[bv]._oAnimFrame;\r\n\tpFrameTable = (DWORD *)pCelBuff;\r\n\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t// app_fatal(\"Draw Clipped Object: frame %d of %d, object type==%d\", nCel, pFrameTable[0], object[bv]._otype);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (bv == pcursobj)\r\n\t\tCelBlitOutlineSafe(194, sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap);\r\n\tif (object[bv]._oLight)\r\n\t\tCelDrawLightSafe(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap);\r\n\telse\r\n\t\tCelClippedDrawSafe(sx, sy, object[bv]._oAnimData, object[bv]._oAnimFrame, object[bv]._oAnimWidth, CelSkip, CelCap);\r\n}\r\n\r\nstatic void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy, BOOL eflag);\r\n\r\n/**\r\n * This variant checks for of screen element on the lower screen\r\n * This function it self causes rendering issues since it will render on top of objects on the other side of walls\r\n * @brief Re render tile to workaround sorting issues with players walking east/west\r\n * @param pBuff Pointer to output buffer at location sx,sy\r\n * @param y dPiece coordinate\r\n * @param x dPiece coordinate\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n */\r\nstatic void scrollrt_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy)\r\n{\r\n\tint i, lti_old, cta_old, lpi_old;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\tlti_old = light_table_index;\r\n\tcta_old = cel_transparency_active;\r\n\tlpi_old = level_piece_id;\r\n\r\n\tlevel_piece_id = dPiece[x][y];\r\n\tlight_table_index = dLight[x][y];\r\n\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tdst = pBuff;\r\n\tarch_draw_type = 1;\r\n\tlevel_cel_block = pMap->mt[0];\r\n\tif (level_cel_block != 0) {\r\n\t\tdrawLowerScreen(dst);\r\n\t}\r\n\tarch_draw_type = 2;\r\n\tlevel_cel_block = pMap->mt[1];\r\n\tif (level_cel_block != 0) {\r\n\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t}\r\n\r\n\tdst = pBuff;\r\n\tarch_draw_type = 0;\r\n\tfor (i = 2; i < MicroTileLen; i += 2) {\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\tlevel_cel_block = pMap->mt[i];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst);\r\n\t\t}\r\n\t\tlevel_cel_block = pMap->mt[i + 1];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t}\r\n\t}\r\n\r\n\tscrollrt_draw_clipped_dungeon(pBuff, x, y, sx, sy, FALSE);\r\n\r\n\tlight_table_index = lti_old;\r\n\tcel_transparency_active = cta_old;\r\n\tlevel_piece_id = lpi_old;\r\n}\r\n\r\n/**\r\n * @brief Render object sprites\r\n * @param pBuff where to render to with sx,sy already applied\r\n * @param sx dPiece coordinate\r\n * @param sy dPiece coordinate\r\n * @param dx Back buffer coordinate\r\n * @param dy Back buffer coordinate\r\n * @param eflag Should the sorting workaround be applied\r\n */\r\nstatic void scrollrt_draw_clipped_dungeon(BYTE *pBuff, int sx, int sy, int dx, int dy, BOOL eflag)\r\n{\r\n\tint px, py, nCel, nMon, negMon, p;\r\n\tchar bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd;\r\n\tDeadStruct *pDeadGuy;\r\n\tItemStruct *pItem;\r\n\tPlayerStruct *pPlayer;\r\n\tMonsterStruct *pMonster;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\t/// ASSERT: assert((DWORD)sx < MAXDUNX);\r\n\t/// ASSERT: assert((DWORD)sy < MAXDUNY);\r\n\tbFlag = dFlags[sx][sy];\r\n\tbDead = dDead[sx][sy];\r\n\tbObj = dObject[sx][sy];\r\n\tbItem = dItem[sx][sy];\r\n\tbPlr = dPlayer[sx][sy];\r\n\tbArch = dSpecial[sx][sy];\r\n\tbMap = dTransVal[sx][sy];\r\n\tnMon = dMonster[sx][sy];\r\n\r\n\t/// ASSERT: assert((DWORD)(sy-1) < MAXDUNY);\r\n\tnegPlr = dPlayer[sx][sy - 1];\r\n\tnegMon = dMonster[sx][sy - 1];\r\n\r\n\tif (visiondebug && bFlag & BFLAG_LIT) {\r\n\t\tCelClippedBlitSafe(pBuff, pSquareCel, 1, 64, 0, 8);\r\n\t}\r\n\tif (MissilePreFlag && bFlag & BFLAG_MISSILE) {\r\n\t\tDrawClippedMissile(sx, sy, dx, dy, 0, 8, TRUE);\r\n\t}\r\n\tif (light_table_index < lightmax) {\r\n\t\tif (bDead != 0) {\r\n\t\t\tdo {\r\n\t\t\t\tpDeadGuy = &dead[(bDead & 0x1F) - 1];\r\n\t\t\t\tdd = (bDead >> 5) & 7;\r\n\t\t\t\tpx = dx - pDeadGuy->_deadWidth2;\r\n\t\t\t\tpCelBuff = pDeadGuy->_deadData[dd];\r\n\t\t\t\t/// ASSERT: assert(pDeadGuy->_deadData[dd] != NULL);\r\n\t\t\t\tif (pCelBuff == NULL)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpFrameTable = (DWORD *)pDeadGuy->_deadData[dd];\r\n\t\t\t\tnCel = pDeadGuy->_deadFrame;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t// app_fatal(\"Clipped dead sub: frame %d of %d, deadnum==%d\", nCel, pFrameTable[0], (bDead & 0x1F) - 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (pDeadGuy->_deadtrans != 0) {\r\n\t\t\t\t\tCl2DrawLightTblSafe(px, dy, pCelBuff, nCel, pDeadGuy->_deadWidth, 0, 8, pDeadGuy->_deadtrans);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tCl2DrawLightSafe(px, dy, pCelBuff, pDeadGuy->_deadFrame, pDeadGuy->_deadWidth, 0, 8);\r\n\t\t\t\t}\r\n\t\t\t} while (0);\r\n\t\t}\r\n\t\tif (bObj != 0) {\r\n\t\t\tDrawClippedObject(sx, sy, dx, dy, TRUE, 0, 8);\r\n\t\t}\r\n\t}\r\n\tif (bItem != 0) {\r\n\t\tdo {\r\n\t\t\tpItem = &item[bItem - 1];\r\n\t\t\tif (!pItem->_iPostDraw) {\r\n\t\t\t\t/// ASSERT: assert((unsigned char)bItem <= MAXITEMS);\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (bItem > MAXITEMS || bItem < 0)\r\n#else\r\n\t\t\t\tif ((BYTE)bItem > MAXITEMS)\r\n#endif\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpCelBuff = pItem->_iAnimData;\r\n\t\t\t\tif (pCelBuff == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Item \\\"%s\\\" Clipped 1: NULL Cel Buffer\", pItem->_iIName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tnCel = pItem->_iAnimFrame;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t\tapp_fatal(\r\n\t\t\t\t\t\t\t\"Draw Clipped \\\"%s\\\" Item: frame %d of %d, item type==%d\",\r\n\t\t\t\t\t\t\tpItem->_iIName,\r\n\t\t\t\t\t\t\tnCel,\r\n\t\t\t\t\t\t\tpFrameTable[0],\r\n\t\t\t\t\t\t\tpItem->_itype);\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx - pItem->_iAnimWidth2;\r\n\t\t\t\tif (bItem - 1 == pcursitem\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || AutoMapShowItems == TRUE\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tCelBlitOutlineSafe(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, 0, 8);\r\n\t\t\t\t}\r\n\t\t\t\tCelDrawLightSafe(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, 0, 8);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_PLAYERLR) {\r\n\t\tdo {\r\n\t\t\tp = -(negPlr + 1);\r\n\t\t\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\t\t\t// app_fatal(\"draw player clipped: tried to draw illegal player %d\", p);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPlayer = &plr[p];\r\n\t\t\tpx = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;\r\n\t\t\tpy = dy + pPlayer->_pyoff;\r\n\t\t\tDrawClippedPlayer(p, sx, sy - 1, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, 0, 8);\r\n\t\t\tif (eflag && pPlayer->_peflag != 0) {\r\n\t\t\t\tif (pPlayer->_peflag == 2) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag(pBuff - (BUFFER_WIDTH * TILE_HEIGHT / 2 + TILE_WIDTH + TILE_WIDTH / 2), sx - 2, sy + 1, dx - (TILE_WIDTH + TILE_WIDTH / 2), dy - TILE_HEIGHT / 2);\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_clipped_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, dx - TILE_WIDTH, dy);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_MONSTLR && (bFlag & BFLAG_LIT || plr[myplr]._pInfraFlag) && negMon < 0) {\r\n\t\tdo {\r\n\t\t\tdraw_monster_num = -(negMon + 1);\r\n\t\t\tif ((DWORD)draw_monster_num >= MAXMONSTERS) {\r\n\t\t\t\t// app_fatal(\"Draw Monster Clipped: tried to draw illegal monster %d\", draw_monster_num);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpMonster = &monster[draw_monster_num];\r\n\t\t\tif (!(pMonster->_mFlags & MFLAG_HIDDEN)) {\r\n\t\t\t\tif (pMonster->MType == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Monster \\\"%s\\\" Clipped: uninitialized monster\", pMonster->mName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx + pMonster->_mxoff - pMonster->MType->width2;\r\n\t\t\t\tpy = dy + pMonster->_myoff;\r\n\t\t\t\tif (draw_monster_num == pcursmonst) {\r\n\t\t\t\t\tCl2DrawOutlineSafe(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, 0, 8);\r\n\t\t\t\t}\r\n\t\t\t\tDrawClippedMonster(sx, sy, px, py, draw_monster_num, 0, 8);\r\n\t\t\t\tif (eflag && pMonster->_meflag) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, dx - TILE_WIDTH, dy);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_DEAD_PLAYER) {\r\n\t\tDrawDeadPlayer(sx, sy, dx, dy, 0, 8, TRUE);\r\n\t}\r\n\tif (bPlr > 0) {\r\n\t\tdo {\r\n\t\t\tp = bPlr - 1;\r\n\t\t\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\t\t\t// app_fatal(\"draw player clipped: tried to draw illegal player %d\", p);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPlayer = &plr[p];\r\n\t\t\tpx = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;\r\n\t\t\tpy = dy + pPlayer->_pyoff;\r\n\t\t\tDrawClippedPlayer(bPlr - 1, sx, sy, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, 0, 8);\r\n\t\t\tif (eflag && pPlayer->_peflag != 0) {\r\n\t\t\t\tif (pPlayer->_peflag == 2) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag(pBuff - (BUFFER_WIDTH * TILE_HEIGHT / 2 + TILE_WIDTH + TILE_WIDTH / 2), sx - 2, sy + 1, dx - (TILE_WIDTH + TILE_WIDTH / 2), dy - TILE_HEIGHT / 2);\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_clipped_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, dx - TILE_WIDTH, dy);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (nMon > 0 && (bFlag & BFLAG_LIT || plr[myplr]._pInfraFlag)) {\r\n\t\tdo {\r\n\t\t\tdraw_monster_num = nMon - 1;\r\n\t\t\tif ((DWORD)draw_monster_num >= MAXMONSTERS) {\r\n\t\t\t\t// app_fatal(\"Draw Monster Clipped: tried to draw illegal monster %d\", draw_monster_num);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpMonster = &monster[draw_monster_num];\r\n\t\t\tif (!(pMonster->_mFlags & MFLAG_HIDDEN)) {\r\n\t\t\t\tif (pMonster->MType == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Monster \\\"%s\\\" Clipped: uninitialized monster\", pMonster->mName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx + pMonster->_mxoff - pMonster->MType->width2;\r\n\t\t\t\tpy = dy + pMonster->_myoff;\r\n\t\t\t\tif (draw_monster_num == pcursmonst) {\r\n\t\t\t\t\tCl2DrawOutlineSafe(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, 0, 8);\r\n\t\t\t\t}\r\n\t\t\t\tDrawClippedMonster(sx, sy, px, py, draw_monster_num, 0, 8);\r\n\t\t\t\tif (eflag && pMonster->_meflag) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, dx - TILE_WIDTH, dy);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_MISSILE) {\r\n\t\tDrawClippedMissile(sx, sy, dx, dy, 0, 8, FALSE);\r\n\t}\r\n\tif (bObj != 0 && light_table_index < lightmax) {\r\n\t\tDrawClippedObject(sx, sy, dx, dy, FALSE, 0, 8);\r\n\t}\r\n\tif (bItem != 0) {\r\n\t\tdo {\r\n\t\t\tpItem = &item[bItem - 1];\r\n\t\t\tif (pItem->_iPostDraw) {\r\n\t\t\t\t/// ASSERT: assert((unsigned char)bItem <= MAXITEMS);\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (bItem > MAXITEMS || bItem < 0)\r\n#else\r\n\t\t\t\tif ((BYTE)bItem > MAXITEMS)\r\n#endif\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpCelBuff = pItem->_iAnimData;\r\n\t\t\t\tif (pCelBuff == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Item \\\"%s\\\" Clipped 2: NULL Cel Buffer\", pItem->_iIName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tnCel = pItem->_iAnimFrame;\r\n\t\t\t\tif (pItem->_iAnimFrame < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t\tapp_fatal(\r\n\t\t\t\t\t\t\t\"Draw Clipped \\\"%s\\\" Item 2: frame %d of %d, item type==%d\",\r\n\t\t\t\t\t\t\tpItem->_iIName,\r\n\t\t\t\t\t\t\tnCel,\r\n\t\t\t\t\t\t\tpFrameTable[0],\r\n\t\t\t\t\t\t\tpItem->_itype);\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx - pItem->_iAnimWidth2;\r\n\t\t\t\tif (bItem - 1 == pcursitem\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || AutoMapShowItems == TRUE\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tCelBlitOutlineSafe(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, 0, 8);\r\n\t\t\t\t}\r\n\t\t\t\tCelDrawLightSafe(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, 0, 8);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bArch != 0) {\r\n\t\tcel_transparency_active = TransList[bMap];\r\n\t\tCelClippedBlitLightTransSafe(pBuff, pSpecialCels, bArch, 64, 0, 8);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a row of tiles\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param chunks tile width of row\r\n * @param eflag is it an even (0) or odd (1) row\r\n */\r\nstatic void scrollrt_draw_lower(int x, int y, int sx, int sy, int chunks, BOOL eflag)\r\n{\r\n\tint i, j;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tif (eflag) {\r\n\t\tif ((DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + TILE_WIDTH / 2 + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\tarch_draw_type = 2;\r\n\t\t\t\tlevel_cel_block = pMap->mt[1];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tarch_draw_type = 0;\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tlevel_cel_block = pMap->mt[3];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tlevel_cel_block = pMap->mt[5];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tlevel_cel_block = pMap->mt[7];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tlevel_cel_block = pMap->mt[9];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tlevel_cel_block = pMap->mt[11];\r\n\t\t\t\tif (level_cel_block != 0 && leveltype == DTYPE_HELL) {\r\n\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, FALSE);\r\n\t\t\t} else {\r\n\t\t\t\tworld_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t\tpMap++;\r\n\t\tchunks--;\r\n\t}\r\n\r\n\tj = chunks;\r\n\twhile (j-- != 0) {\r\n\t\tif (y < 0 || x >= MAXDUNX) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (y < MAXDUNY && x >= 0) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id == 0) {\r\n\t\t\t\tworld_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t} else {\r\n\t\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\tarch_draw_type = 1;\r\n\t\t\t\tlevel_cel_block = pMap->mt[0];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tarch_draw_type = 2;\r\n\t\t\t\tlevel_cel_block = pMap->mt[1];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t\t}\r\n\t\t\t\tarch_draw_type = 0;\r\n\t\t\t\tfor (i = 2; i < MicroTileLen; i += 2) {\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[i];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[i + 1];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, TRUE);\r\n\t\t\t}\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t\tpMap++;\r\n\t}\r\n\r\n\tif (eflag && (DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) {\r\n\t\tlevel_piece_id = dPiece[x][y];\r\n\t\tlight_table_index = dLight[x][y];\r\n\t\tif (level_piece_id == 0) {\r\n\t\t\tworld_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t} else {\r\n\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\tarch_draw_type = 1;\r\n\t\t\tlevel_cel_block = pMap->mt[0];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t}\r\n\t\t\tarch_draw_type = 0;\r\n\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\tlevel_cel_block = pMap->mt[2];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t}\r\n\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\tlevel_cel_block = pMap->mt[4];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t}\r\n\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\tlevel_cel_block = pMap->mt[6];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t}\r\n\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\tlevel_cel_block = pMap->mt[8];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t}\r\n\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\tlevel_cel_block = pMap->mt[10];\r\n\t\t\tif (level_cel_block != 0 && leveltype == DTYPE_HELL) {\r\n\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t}\r\n\t\t\tscrollrt_draw_clipped_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, FALSE);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int row, int CelSkip, int dx, int dy, BOOL eflag);\r\n\r\n/**\r\n * This variant checks for of screen element on the lower screen\r\n * This function it self causes rendering issues since it will render on top of objects on the other side of walls\r\n * @brief Re render tile to workaround sorting issues with players walking east/west\r\n * @param pBuff Pointer to output buffer at location sx,sy\r\n * @param y dPiece coordinate\r\n * @param x dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelSkip chunks of cell to skip\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n */\r\nstatic void scrollrt_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int row, int CelSkip, int sx, int sy)\r\n{\r\n\tint lti_old, cta_old, lpi_old;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\tlti_old = light_table_index;\r\n\tcta_old = cel_transparency_active;\r\n\tlpi_old = level_piece_id;\r\n\r\n\tlevel_piece_id = dPiece[x][y];\r\n\tlight_table_index = dLight[x][y];\r\n\tdst = &pBuff[BUFFER_WIDTH * TILE_HEIGHT * row];\r\n\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tswitch (row) {\r\n\tcase 0:\r\n\t\tlevel_cel_block = pMap->mt[2];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst);\r\n\t\t}\r\n\t\tlevel_cel_block = pMap->mt[3];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t}\r\n\tcase 1:\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\tlevel_cel_block = pMap->mt[4];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst);\r\n\t\t}\r\n\t\tlevel_cel_block = pMap->mt[5];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t}\r\n\tcase 2:\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\tlevel_cel_block = pMap->mt[6];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst);\r\n\t\t}\r\n\t\tlevel_cel_block = pMap->mt[7];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t}\r\n\tcase 3:\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\tlevel_cel_block = pMap->mt[8];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst);\r\n\t\t}\r\n\t\tlevel_cel_block = pMap->mt[9];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\r\n\tif (CelSkip < 8) {\r\n\t\tscrollrt_draw_clipped_dungeon_2(pBuff, x, y, row, CelSkip, sx, sy, FALSE);\r\n\t}\r\n\r\n\tlight_table_index = lti_old;\r\n\tcel_transparency_active = cta_old;\r\n\tlevel_piece_id = lpi_old;\r\n}\r\n\r\n/**\r\n * This variant checks for of screen element on the lower screen\r\n * @brief Render object sprites, skip offscreen parts for lower screen\r\n * @param pBuff where to render to with sx,sy already applied\r\n * @param sx dPiece coordinate\r\n * @param sy dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelSkip chunks of cell to skip\r\n * @param dx Back buffer coordinate\r\n * @param dy Back buffer coordinate\r\n * @param eflag Should the sorting workaround be applied\r\n */\r\nstatic void scrollrt_draw_clipped_dungeon_2(BYTE *pBuff, int sx, int sy, int row, int CelSkip, int dx, int dy, BOOL eflag)\r\n{\r\n\tint px, py, nCel, nMon, negMon, p;\r\n\tchar bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd;\r\n\tDeadStruct *pDeadGuy;\r\n\tItemStruct *pItem;\r\n\tPlayerStruct *pPlayer;\r\n\tMonsterStruct *pMonster;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\t/// ASSERT: assert((DWORD)sx < MAXDUNX);\r\n\t/// ASSERT: assert((DWORD)sy < MAXDUNY);\r\n\tbFlag = dFlags[sx][sy];\r\n\tbDead = dDead[sx][sy];\r\n\tbObj = dObject[sx][sy];\r\n\tbItem = dItem[sx][sy];\r\n\tbPlr = dPlayer[sx][sy];\r\n\tbArch = dSpecial[sx][sy];\r\n\tbMap = dTransVal[sx][sy];\r\n\tnMon = dMonster[sx][sy];\r\n\r\n\t/// ASSERT: assert((DWORD)(sy-1) < MAXDUNY);\r\n\tnegPlr = dPlayer[sx][sy - 1];\r\n\tnegMon = dMonster[sx][sy - 1];\r\n\r\n\tif (visiondebug && bFlag & BFLAG_LIT) {\r\n\t\tCelClippedBlitSafe(pBuff, pSquareCel, 1, 64, CelSkip, 8);\r\n\t}\r\n\tif (MissilePreFlag && bFlag & BFLAG_MISSILE) {\r\n\t\tDrawClippedMissile(sx, sy, dx, dy, CelSkip, 8, TRUE);\r\n\t}\r\n\tif (light_table_index < lightmax) {\r\n\t\tif (bDead != 0) {\r\n\t\t\tdo {\r\n\t\t\t\tpDeadGuy = &dead[(bDead & 0x1F) - 1];\r\n\t\t\t\tdd = (bDead >> 5) & 7;\r\n\t\t\t\tpx = dx - pDeadGuy->_deadWidth2;\r\n\t\t\t\tpCelBuff = pDeadGuy->_deadData[dd];\r\n\t\t\t\t/// ASSERT: assert(pDeadGuy->_deadData[dd] != NULL);\r\n\t\t\t\tif (pCelBuff == NULL)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpFrameTable = (DWORD *)pDeadGuy->_deadData[dd];\r\n\t\t\t\tnCel = pDeadGuy->_deadFrame;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t// app_fatal(\"Clipped dead sub2: frame %d of %d, deadnum==%d\", nCel, pFrameTable[0], (bDead & 0x1F) - 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (pDeadGuy->_deadtrans != 0) {\r\n\t\t\t\t\tCl2DrawLightTblSafe(px, dy, pCelBuff, nCel, pDeadGuy->_deadWidth, CelSkip, 8, pDeadGuy->_deadtrans);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tCl2DrawLightSafe(px, dy, pCelBuff, pDeadGuy->_deadFrame, pDeadGuy->_deadWidth, CelSkip, 8);\r\n\t\t\t\t}\r\n\t\t\t} while (0);\r\n\t\t}\r\n\t\tif (bObj != 0) {\r\n\t\t\tDrawClippedObject(sx, sy, dx, dy, TRUE, CelSkip, 8);\r\n\t\t}\r\n\t}\r\n\tif (bItem != 0) {\r\n\t\tdo {\r\n\t\t\tpItem = &item[bItem - 1];\r\n\t\t\tif (!pItem->_iPostDraw) {\r\n\t\t\t\t/// ASSERT: assert((unsigned char)bItem <= MAXITEMS);\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (bItem > MAXITEMS || bItem < 0)\r\n#else\r\n\t\t\t\tif ((BYTE)bItem > MAXITEMS)\r\n#endif\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpCelBuff = pItem->_iAnimData;\r\n\t\t\t\tif (pCelBuff == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Item \\\"%s\\\" Clipped 3: NULL Cel Buffer\", pItem->_iIName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tnCel = pItem->_iAnimFrame;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t\tapp_fatal(\r\n\t\t\t\t\t\t\t\"Draw Clipped \\\"%s\\\" Item 3: frame %d of %d, item type==%d\",\r\n\t\t\t\t\t\t\tpItem->_iIName,\r\n\t\t\t\t\t\t\tnCel,\r\n\t\t\t\t\t\t\tpFrameTable[0],\r\n\t\t\t\t\t\t\tpItem->_itype);\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx - pItem->_iAnimWidth2;\r\n\t\t\t\tif (bItem - 1 == pcursitem\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || AutoMapShowItems == TRUE\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tCelBlitOutlineSafe(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, CelSkip, 8);\r\n\t\t\t\t}\r\n\t\t\t\tCelDrawLightSafe(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, CelSkip, 8);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_PLAYERLR) {\r\n\t\tdo {\r\n\t\t\tp = -(negPlr + 1);\r\n#ifdef HELLFIRE\r\n\t\t\tif (p >= MAX_PLRS) {\r\n#else\r\n\t\t\tif ((DWORD)p >= MAX_PLRS) {\r\n#endif\r\n\t\t\t\t// app_fatal(\"draw player clipped: tried to draw illegal player %d\", p);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPlayer = &plr[p];\r\n\t\t\tpx = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;\r\n\t\t\tpy = dy + pPlayer->_pyoff;\r\n\t\t\tDrawClippedPlayer(p, sx, sy - 1, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, CelSkip, 8);\r\n\t\t\tif (eflag && pPlayer->_peflag != 0) {\r\n\t\t\t\tif (pPlayer->_peflag == 2) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag_2(pBuff - (BUFFER_WIDTH * TILE_HEIGHT / 2 + TILE_WIDTH + TILE_WIDTH / 2), sx - 2, sy + 1, row, CelSkip, dx - (TILE_WIDTH + TILE_WIDTH / 2), dy - TILE_HEIGHT / 2);\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_clipped_e_flag_2(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelSkip, dx - TILE_WIDTH, dy);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_MONSTLR && (bFlag & BFLAG_LIT || plr[myplr]._pInfraFlag) && negMon < 0) {\r\n\t\tdo {\r\n\t\t\tdraw_monster_num = -(negMon + 1);\r\n#ifdef HELLFIRE\r\n\t\t\tif (draw_monster_num >= MAXMONSTERS) {\r\n#else\r\n\t\t\tif ((DWORD)draw_monster_num >= MAXMONSTERS) {\r\n#endif\r\n\t\t\t\t// app_fatal(\"Draw Monster Clipped: tried to draw illegal monster %d\", draw_monster_num);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpMonster = &monster[draw_monster_num];\r\n\t\t\tif (!(pMonster->_mFlags & MFLAG_HIDDEN)) {\r\n\t\t\t\tif (pMonster->MType == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Monster \\\"%s\\\" Clipped: uninitialized monster\", pMonster->mName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx + pMonster->_mxoff - pMonster->MType->width2;\r\n\t\t\t\tpy = dy + pMonster->_myoff;\r\n\t\t\t\tif (draw_monster_num == pcursmonst) {\r\n\t\t\t\t\tCl2DrawOutlineSafe(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, CelSkip, 8);\r\n\t\t\t\t}\r\n\t\t\t\tDrawClippedMonster(sx, sy, px, py, draw_monster_num, CelSkip, 8);\r\n\t\t\t\tif (eflag && !pMonster->_meflag) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag_2(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelSkip, dx - TILE_WIDTH, dy);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_DEAD_PLAYER) {\r\n\t\tDrawDeadPlayer(sx, sy, dx, dy, CelSkip, 8, TRUE);\r\n\t}\r\n\tif (bPlr > 0) {\r\n\t\tdo {\r\n\t\t\tp = bPlr - 1;\r\n\t\t\tif ((DWORD)p >= MAX_PLRS) {\r\n\t\t\t\t// app_fatal(\"draw player clipped: tried to draw illegal player %d\", p);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPlayer = &plr[p];\r\n\t\t\tpx = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;\r\n\t\t\tpy = dy + pPlayer->_pyoff;\r\n\t\t\tDrawClippedPlayer(p, sx, sy, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, CelSkip, 8);\r\n\t\t\tif (eflag && pPlayer->_peflag != 0) {\r\n\t\t\t\tif (pPlayer->_peflag == 2) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag_2(pBuff - (BUFFER_WIDTH * TILE_HEIGHT / 2 + TILE_WIDTH + TILE_WIDTH / 2), sx - 2, sy + 1, row, CelSkip, dx - (TILE_WIDTH + TILE_WIDTH / 2), dy - TILE_HEIGHT / 2);\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_clipped_e_flag_2(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelSkip, dx - TILE_WIDTH, dy);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (nMon > 0 && (bFlag & BFLAG_LIT || plr[myplr]._pInfraFlag)) {\r\n\t\tdo {\r\n\t\t\tdraw_monster_num = nMon - 1;\r\n\t\t\tif ((DWORD)draw_monster_num >= MAXMONSTERS) {\r\n\t\t\t\t// app_fatal(\"Draw Monster Clipped: tried to draw illegal monster %d\", draw_monster_num);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpMonster = &monster[draw_monster_num];\r\n\t\t\tif (!(pMonster->_mFlags & MFLAG_HIDDEN)) {\r\n\t\t\t\tif (pMonster->MType == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Monster \\\"%s\\\" Clipped: uninitialized monster\", pMonster->mName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx + pMonster->_mxoff - pMonster->MType->width2;\r\n\t\t\t\tpy = dy + pMonster->_myoff;\r\n\t\t\t\tif (draw_monster_num == pcursmonst) {\r\n\t\t\t\t\tCl2DrawOutlineSafe(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, CelSkip, 8);\r\n\t\t\t\t}\r\n\t\t\t\tDrawClippedMonster(sx, sy, px, py, draw_monster_num, CelSkip, 8);\r\n\t\t\t\tif (eflag && !pMonster->_meflag) {\r\n\t\t\t\t\tscrollrt_draw_clipped_e_flag_2(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelSkip, dx - TILE_WIDTH, dy);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_MISSILE) {\r\n\t\tDrawClippedMissile(sx, sy, dx, dy, CelSkip, 8, FALSE);\r\n\t}\r\n\tif (bObj != 0 && light_table_index < lightmax) {\r\n\t\tDrawClippedObject(sx, sy, dx, dy, FALSE, CelSkip, 8);\r\n\t}\r\n\tif (bItem != 0) {\r\n\t\tdo {\r\n\t\t\tpItem = &item[bItem - 1];\r\n\t\t\tif (pItem->_iPostDraw) {\r\n\t\t\t\t/// ASSERT: assert((unsigned char)bItem <= MAXITEMS);\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (bItem > MAXITEMS || bItem < 0)\r\n#else\r\n\t\t\t\tif ((BYTE)bItem > MAXITEMS)\r\n#endif\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpCelBuff = pItem->_iAnimData;\r\n\t\t\t\tif (pCelBuff == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Item \\\"%s\\\" Clipped 4: NULL Cel Buffer\", pItem->_iIName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tnCel = pItem->_iAnimFrame;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t/*\r\n\t\t\t\t\t\tapp_fatal(\r\n\t\t\t\t\t\t\t\"Draw Clipped \\\"%s\\\" Item 4: frame %d of %d, item type==%d\",\r\n\t\t\t\t\t\t\tpItem->_iIName,\r\n\t\t\t\t\t\t\tnCel,\r\n\t\t\t\t\t\t\tpFrameTable[0],\r\n\t\t\t\t\t\t\tpItem->_itype);\r\n\t\t\t\t\t\t*/\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx - pItem->_iAnimWidth2;\r\n\t\t\t\tif (bItem - 1 == pcursitem\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || AutoMapShowItems == TRUE\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tCelBlitOutlineSafe(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, CelSkip, 8);\r\n\t\t\t\t}\r\n\t\t\t\tCelDrawLightSafe(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, CelSkip, 8);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bArch != 0) {\r\n\t\tcel_transparency_active = TransList[bMap];\r\n\t\tCelClippedBlitLightTransSafe(pBuff, pSpecialCels, bArch, 64, CelSkip, 8);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a row of tile, checking for overdrawing on lower part of screen\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param chunks tile width of row\r\n * @param row current row being rendered\r\n * @param eflag is it an even (0) or odd (1) row\r\n */\r\nstatic void scrollrt_draw_lower_2(int x, int y, int sx, int sy, int chunks, int row, BOOL eflag)\r\n{\r\n\tint i, j, CelSkip;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\tCelSkip = 2 * row + 2;\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx - (BUFFER_WIDTH * TILE_HEIGHT - 32) + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\tfor (i = 0; i < (MicroTileLen >> 1) - 1; i++) {\r\n\t\t\t\t\tif (row <= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 3];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\tif (CelSkip < 8) {\r\n\t\t\t\t\tscrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * TILE_HEIGHT / 2 * CelSkip], x, y, row, CelSkip, sx, sy, FALSE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t\tchunks--;\r\n\t\tpMap++;\r\n\t}\r\n\r\n\tj = chunks;\r\n\twhile (j-- != 0) {\r\n\t\tif (x >= MAXDUNX || y < 0) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (y < MAXDUNY && x >= 0) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx - BUFFER_WIDTH * TILE_HEIGHT + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\ti = 0;\r\n\t\t\t\twhile (i < (MicroTileLen >> 1) - 1) {\r\n\t\t\t\t\tif (row <= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 2];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 3];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ti++;\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\tif (CelSkip < 8) {\r\n\t\t\t\t\tscrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * TILE_HEIGHT * (row + 1)], x, y, row, CelSkip, sx, sy, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t\tpMap++;\r\n\t}\r\n\r\n\tif (eflag) {\r\n\t\tif ((DWORD)y < MAXDUNY && (DWORD)x < MAXDUNX) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx - BUFFER_WIDTH * TILE_HEIGHT + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\tfor (i = 0; i < (MicroTileLen >> 1) - 1; i++) {\r\n\t\t\t\t\tif (row <= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 2];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\tif (CelSkip < 8) {\r\n\t\t\t\t\tscrollrt_draw_clipped_dungeon_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * TILE_HEIGHT / 2 * CelSkip], x, y, row, CelSkip, sx, sy, FALSE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int row, int CelCap, int dx, int dy, BOOL eflag);\r\n\r\n/**\r\n * This variant checks for of screen element on the upper screen\r\n * This function it self causes rendering issues since it will render on top of objects on the other side of walls\r\n * @brief Re render tile to workaround sorting issues with players walking east/west\r\n * @param pBuff Pointer to output buffer at location sx,sy\r\n * @param y dPiece coordinate\r\n * @param x dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelCap chunks of cell to skip\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n */\r\nstatic void scrollrt_draw_e_flag(BYTE *pBuff, int x, int y, int row, int CelCap, int sx, int sy)\r\n{\r\n\tint i, lti_old, cta_old, lpi_old;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\tlti_old = light_table_index;\r\n\tcta_old = cel_transparency_active;\r\n\tlpi_old = level_piece_id;\r\n\r\n\tlevel_piece_id = dPiece[x][y];\r\n\tlight_table_index = dLight[x][y];\r\n\tdst = pBuff;\r\n\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tarch_draw_type = 1;\r\n\tlevel_cel_block = pMap->mt[0];\r\n\tif (level_cel_block != 0) {\r\n\t\tdrawUpperScreen(dst);\r\n\t}\r\n\tarch_draw_type = 2;\r\n\tlevel_cel_block = pMap->mt[1];\r\n\tif (level_cel_block != 0) {\r\n\t\tdrawUpperScreen(dst + TILE_WIDTH / 2);\r\n\t}\r\n\r\n\tarch_draw_type = 0;\r\n\tfor (i = 1; i < (MicroTileLen >> 1) - 1; i++) {\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\tif (row >= i) {\r\n\t\t\tlevel_cel_block = pMap->mt[2 * i];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t}\r\n\t\t\tlevel_cel_block = pMap->mt[2 * i + 1];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawUpperScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tscrollrt_draw_dungeon(pBuff, x, y, row, CelCap, sx, sy, FALSE);\r\n\r\n\tlight_table_index = lti_old;\r\n\tcel_transparency_active = cta_old;\r\n\tlevel_piece_id = lpi_old;\r\n}\r\n\r\n/**\r\n * @brief Render object sprites, skip offscreen parts for upper screen\r\n * @param pBuff where to render to with sx,sx already applied\r\n * @param sx dPiece coordinate\r\n * @param sy dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelCap chunks of cell to skip\r\n * @param dx Back buffer coordinate\r\n * @param dy Back buffer coordinate\r\n * @param eflag Should the sorting workaround be applied\r\n */\r\nstatic void scrollrt_draw_dungeon(BYTE *pBuff, int sx, int sy, int row, int CelCap, int dx, int dy, BOOL eflag)\r\n{\r\n\tint px, py, nCel, nMon, negMon, p;\r\n\tchar bFlag, bDead, bObj, bItem, bPlr, bArch, bMap, negPlr, dd;\r\n\tDeadStruct *pDeadGuy;\r\n\tItemStruct *pItem;\r\n\tPlayerStruct *pPlayer;\r\n\tMonsterStruct *pMonster;\r\n\tBYTE *pCelBuff;\r\n\tDWORD *pFrameTable;\r\n\r\n\t/// ASSERT: assert((DWORD)sx < MAXDUNX);\r\n\t/// ASSERT: assert((DWORD)sy < MAXDUNY);\r\n\tbFlag = dFlags[sx][sy];\r\n\tbDead = dDead[sx][sy];\r\n\tbObj = dObject[sx][sy];\r\n\tbItem = dItem[sx][sy];\r\n\tbPlr = dPlayer[sx][sy];\r\n\tbArch = dSpecial[sx][sy];\r\n\tbMap = dTransVal[sx][sy];\r\n\tnMon = dMonster[sx][sy];\r\n\r\n\t/// ASSERT: assert((DWORD)(sy-1) < MAXDUNY);\r\n\tnegPlr = dPlayer[sx][sy - 1];\r\n\tnegMon = dMonster[sx][sy - 1];\r\n\r\n\tif (visiondebug && bFlag & BFLAG_LIT) {\r\n\t\tCelClippedBlit(pBuff, pSquareCel, 1, 64, 0, CelCap);\r\n\t}\r\n\tif (MissilePreFlag && bFlag & BFLAG_MISSILE) {\r\n\t\tDrawMissile(sx, sy, dx, dy, 0, CelCap, TRUE);\r\n\t}\r\n\r\n\tif (light_table_index < lightmax) {\r\n\t\tif (bDead != 0) {\r\n\t\t\tdo {\r\n\t\t\t\tpDeadGuy = &dead[(bDead & 0x1F) - 1];\r\n\t\t\t\tdd = (bDead >> 5) & 7;\r\n\t\t\t\tpx = dx - pDeadGuy->_deadWidth2;\r\n\t\t\t\tpCelBuff = pDeadGuy->_deadData[dd];\r\n\t\t\t\t/// ASSERT: assert(pDeadGuy->_deadData[dd] != NULL);\r\n\t\t\t\tif (pCelBuff == NULL)\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpFrameTable = (DWORD *)pDeadGuy->_deadData[dd];\r\n\t\t\t\tnCel = pDeadGuy->_deadFrame;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t// app_fatal(\"Unclipped dead: frame %d of %d, deadnum==%d\", nCel, pFrameTable[0], (bDead & 0x1F) - 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif (pDeadGuy->_deadtrans != 0) {\r\n\t\t\t\t\tCl2DrawLightTbl(px, dy, pCelBuff, nCel, pDeadGuy->_deadWidth, 0, CelCap, pDeadGuy->_deadtrans);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tCl2DrawLight(px, dy, pCelBuff, pDeadGuy->_deadFrame, pDeadGuy->_deadWidth, 0, CelCap);\r\n\t\t\t\t}\r\n\t\t\t} while (0);\r\n\t\t}\r\n\t\tif (bObj != 0) {\r\n\t\t\tDrawObject(sx, sy, dx, dy, TRUE, 0, CelCap);\r\n\t\t}\r\n\t}\r\n\tif (bItem != 0) {\r\n\t\tdo {\r\n\t\t\tpItem = &item[bItem - 1];\r\n\t\t\tif (!pItem->_iPostDraw) {\r\n\t\t\t\t/// ASSERT: assert((unsigned char)bItem <= MAXITEMS);\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (bItem > MAXITEMS || bItem < 0)\r\n#else\r\n\t\t\t\tif ((BYTE)bItem > MAXITEMS)\r\n#endif\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpCelBuff = pItem->_iAnimData;\r\n\t\t\t\tif (pCelBuff == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Item \\\"%s\\\" 1: NULL Cel Buffer\", pItem->_iIName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tnCel = pItem->_iAnimFrame;\r\n\t\t\t\tif (nCel < 1 || pFrameTable[0] > 50 || nCel > (int)pFrameTable[0]) {\r\n\t\t\t\t\t// app_fatal(\"Draw \\\"%s\\\" Item 1: frame %d of %d, item type==%d\", pItem->_iIName, nCel, pFrameTable[0], pItem->_itype);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx - pItem->_iAnimWidth2;\r\n\t\t\t\tif (bItem - 1 == pcursitem\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || AutoMapShowItems == TRUE\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tCelBlitOutline(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, 0, CelCap);\r\n\t\t\t\t}\r\n\t\t\t\tCelClippedDrawLight(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, 0, CelCap);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_PLAYERLR) {\r\n\t\tdo {\r\n\t\t\tp = -(negPlr + 1);\r\n#ifdef HELLFIRE\r\n\t\t\tif (p >= MAX_PLRS) {\r\n#else\r\n\t\t\tif ((DWORD)p >= MAX_PLRS) {\r\n#endif\r\n\t\t\t\t// app_fatal(\"draw player: tried to draw illegal player %d\", p);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPlayer = &plr[p];\r\n\t\t\tpx = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;\r\n\t\t\tpy = dy + pPlayer->_pyoff;\r\n\t\t\tDrawPlayer(p, sx, sy - 1, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, 0, CelCap);\r\n\t\t\tif (eflag && pPlayer->_peflag != 0) {\r\n\t\t\t\tif (pPlayer->_peflag == 2) {\r\n\t\t\t\t\tscrollrt_draw_e_flag(pBuff - (BUFFER_WIDTH * TILE_HEIGHT / 2 + TILE_WIDTH + TILE_WIDTH / 2), sx - 2, sy + 1, row, CelCap, dx - (TILE_WIDTH + TILE_WIDTH / 2), dy - TILE_HEIGHT / 2);\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelCap, dx - TILE_WIDTH, dy);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_MONSTLR && (bFlag & BFLAG_LIT || plr[myplr]._pInfraFlag) && negMon < 0) {\r\n\t\tdo {\r\n\t\t\tdraw_monster_num = -(negMon + 1);\r\n#ifdef HELLFIRE\r\n\t\t\tif (draw_monster_num >= MAXMONSTERS) {\r\n#else\r\n\t\t\tif ((DWORD)draw_monster_num >= MAXMONSTERS) {\r\n#endif\r\n\t\t\t\t// app_fatal(\"Draw Monster: tried to draw illegal monster %d\", draw_monster_num);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpMonster = &monster[draw_monster_num];\r\n\t\t\tif (!(pMonster->_mFlags & MFLAG_HIDDEN)) {\r\n\t\t\t\tif (pMonster->MType == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Monster \\\"%s\\\": uninitialized monster\", pMonster->mName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx + pMonster->_mxoff - pMonster->MType->width2;\r\n\t\t\t\tpy = dy + pMonster->_myoff;\r\n\t\t\t\tif (draw_monster_num == pcursmonst) {\r\n\t\t\t\t\tCl2DrawOutline(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, 0, CelCap);\r\n\t\t\t\t}\r\n\t\t\t\tDrawMonster(sx, sy, px, py, draw_monster_num, 0, CelCap);\r\n\t\t\t\tif (eflag && !pMonster->_meflag) {\r\n\t\t\t\t\tscrollrt_draw_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelCap, dx - TILE_WIDTH, dy);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_DEAD_PLAYER) {\r\n\t\tDrawDeadPlayer(sx, sy, dx, dy, 0, CelCap, FALSE);\r\n\t}\r\n\tif (bPlr > 0) {\r\n\t\tdo {\r\n\t\t\tp = bPlr - 1;\r\n#ifdef HELLFIRE\r\n\t\t\tif (p >= MAX_PLRS) {\r\n#else\r\n\t\t\tif ((DWORD)p >= MAX_PLRS) {\r\n#endif\r\n\t\t\t\t// app_fatal(\"draw player: tried to draw illegal player %d\", p);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpPlayer = &plr[p];\r\n\t\t\tpx = dx + pPlayer->_pxoff - pPlayer->_pAnimWidth2;\r\n\t\t\tpy = dy + pPlayer->_pyoff;\r\n\t\t\tDrawPlayer(p, sx, sy, px, py, pPlayer->_pAnimData, pPlayer->_pAnimFrame, pPlayer->_pAnimWidth, 0, CelCap);\r\n\t\t\tif (eflag && pPlayer->_peflag != 0) {\r\n\t\t\t\tif (pPlayer->_peflag == 2) {\r\n\t\t\t\t\tscrollrt_draw_e_flag(pBuff - (BUFFER_WIDTH * TILE_HEIGHT / 2 + TILE_WIDTH + TILE_WIDTH / 2), sx - 2, sy + 1, row, CelCap, dx - (TILE_WIDTH + TILE_WIDTH / 2), dy - TILE_HEIGHT / 2);\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelCap, dx - TILE_WIDTH, dy);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (nMon > 0 && (bFlag & BFLAG_LIT || plr[myplr]._pInfraFlag)) {\r\n\t\tdo {\r\n\t\t\tdraw_monster_num = nMon - 1;\r\n\t\t\tif ((DWORD)draw_monster_num >= MAXMONSTERS) {\r\n\t\t\t\t// app_fatal(\"Draw Monster: tried to draw illegal monster %d\", draw_monster_num);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tpMonster = &monster[draw_monster_num];\r\n\t\t\tif (!(pMonster->_mFlags & MFLAG_HIDDEN)) {\r\n\t\t\t\tif (pMonster->MType == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Monster \\\"%s\\\": uninitialized monster\", pMonster->mName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx + pMonster->_mxoff - pMonster->MType->width2;\r\n\t\t\t\tpy = dy + pMonster->_myoff;\r\n\t\t\t\tif (draw_monster_num == pcursmonst) {\r\n\t\t\t\t\tCl2DrawOutline(233, px, py, pMonster->_mAnimData, pMonster->_mAnimFrame, pMonster->MType->width, 0, CelCap);\r\n\t\t\t\t}\r\n\t\t\t\tDrawMonster(sx, sy, px, py, draw_monster_num, 0, CelCap);\r\n\t\t\t\tif (eflag && !pMonster->_meflag) {\r\n\t\t\t\t\tscrollrt_draw_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelCap, dx - TILE_WIDTH, dy);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bFlag & BFLAG_MISSILE) {\r\n\t\tDrawMissile(sx, sy, dx, dy, 0, CelCap, FALSE);\r\n\t}\r\n\tif (bObj != 0 && light_table_index < lightmax) {\r\n\t\tDrawObject(sx, sy, dx, dy, FALSE, 0, CelCap);\r\n\t}\r\n\tif (bItem != 0) {\r\n\t\tdo {\r\n\t\t\tpItem = &item[bItem - 1];\r\n\t\t\tif (pItem->_iPostDraw) {\r\n\t\t\t\t/// ASSERT: assert((unsigned char)bItem <= MAXITEMS);\r\n#ifdef HELLFIRE\r\n\t\t\t\tif (bItem > MAXITEMS || bItem < 0)\r\n#else\r\n\t\t\t\tif ((BYTE)bItem > MAXITEMS)\r\n#endif\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tpCelBuff = pItem->_iAnimData;\r\n\t\t\t\tif (pCelBuff == NULL) {\r\n\t\t\t\t\t// app_fatal(\"Draw Item \\\"%s\\\" 2: NULL Cel Buffer\", pItem->_iIName);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpFrameTable = (DWORD *)pCelBuff;\r\n\t\t\t\tnCel = pItem->_iAnimFrame;\r\n\t\t\t\tif (nCel < 1 || ((DWORD *)pCelBuff)[0] > 50 || pItem->_iAnimFrame > ((int *)pCelBuff)[0]) {\r\n\t\t\t\t\t// app_fatal(\"Draw \\\"%s\\\" Item 2: frame %d of %d, item type==%d\", pItem->_iIName, nCel, pFrameTable[0], pItem->_itype);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tpx = dx - pItem->_iAnimWidth2;\r\n\t\t\t\tif (bItem - 1 == pcursitem\r\n#ifdef HELLFIRE\r\n\t\t\t\t    || AutoMapShowItems == TRUE\r\n#endif\r\n\t\t\t\t) {\r\n\t\t\t\t\tCelBlitOutline(181, px, dy, pCelBuff, nCel, pItem->_iAnimWidth, 0, CelCap);\r\n\t\t\t\t}\r\n\t\t\t\tCelClippedDrawLight(px, dy, pItem->_iAnimData, pItem->_iAnimFrame, pItem->_iAnimWidth, 0, CelCap);\r\n\t\t\t}\r\n\t\t} while (0);\r\n\t}\r\n\tif (bArch != 0) {\r\n\t\tcel_transparency_active = TransList[bMap];\r\n\t\tCelClippedBlitLightTrans(pBuff, pSpecialCels, bArch, 64, 0, CelCap);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a row of tile, checking for overdrawing on upper part of screen\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Back buffer coordinate\r\n * @param sy Back buffer coordinate\r\n * @param chunks tile width of row\r\n * @param row current row being rendered\r\n * @param eflag is it an even (0) or odd (1) row\r\n */\r\nstatic void scrollrt_draw_upper(int x, int y, int sx, int sy, int chunks, int row, BOOL eflag)\r\n{\r\n\tint i, j, CelCap;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\tCelCap = 2 * row + 2;\r\n\tif (CelCap > 8) {\r\n\t\tCelCap = 8;\r\n\t}\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + TILE_HEIGHT + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\tif (row >= 0) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[1];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tarch_draw_type = 2;\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t\tarch_draw_type = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tif (row >= 1) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[3];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tif (row >= 2) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[5];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tif (row >= 3) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[7];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelCap, sx, sy, FALSE);\r\n\t\t\t} else {\r\n\t\t\t\tworld_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t\tchunks--;\r\n\t\tpMap++;\r\n\t}\r\n\r\n\tfor (j = 0; j < chunks; j++) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\tarch_draw_type = 1;\r\n\t\t\t\tlevel_cel_block = pMap->mt[0];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t}\r\n\t\t\t\tarch_draw_type = 2;\r\n\t\t\t\tlevel_cel_block = pMap->mt[1];\r\n\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\tdrawUpperScreen(dst + TILE_HEIGHT);\r\n\t\t\t\t}\r\n\t\t\t\tarch_draw_type = 0;\r\n\t\t\t\tfor (i = 1; i < (MicroTileLen >> 1) - 1; i++) {\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t\tif (row >= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 1];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawUpperScreen(dst + TILE_HEIGHT);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelCap, sx, sy, TRUE);\r\n\t\t\t} else {\r\n\t\t\t\tworld_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t\tpMap++;\r\n\t}\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_piece_id = dPiece[x][y];\r\n\t\t\tlight_table_index = dLight[x][y];\r\n\t\t\tif (level_piece_id != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\t\tcel_transparency_active = (BYTE)(nTransTable[level_piece_id] & TransList[dTransVal[x][y]]);\r\n\t\t\t\tarch_draw_type = 1;\r\n\t\t\t\tif (row >= 0) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[0];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tarch_draw_type = 0;\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tif (row >= 1) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[2];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tif (row >= 2) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[4];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\tif (row >= 3) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[6];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tscrollrt_draw_dungeon(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelCap, sx, sy, FALSE);\r\n\t\t\t} else {\r\n\t\t\t\tworld_draw_black_tile(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Configure render and process screen rows\r\n * @param x Center of view in dPiece coordinate\r\n * @param y Center of view in dPiece coordinate\r\n */\r\nstatic void DrawGame(int x, int y)\r\n{\r\n\tint i, sx, sy, chunks, blocks;\r\n\r\n\tViewDX = SCREEN_WIDTH;\r\n\tViewDY = VIEWPORT_HEIGHT;\r\n\tViewBX = SCREEN_WIDTH / TILE_WIDTH;\r\n\tViewBY = VIEWPORT_HEIGHT / TILE_HEIGHT;\r\n\r\n\tsx = ScrollInfo._sxoff + SCREEN_X;\r\n\tsy = ScrollInfo._syoff + SCREEN_Y + (TILE_HEIGHT / 2 - 1);\r\n\tx -= SCREEN_WIDTH / TILE_WIDTH;\r\n\ty--;\r\n\tchunks = SCREEN_WIDTH / TILE_WIDTH;\r\n\tblocks = 8;\r\n\r\n\tif (chrflag || questlog) {\r\n\t\tx += 2;\r\n\t\ty -= 2;\r\n\t\tsx += (SCREEN_WIDTH / 2) - TILE_WIDTH / 2;\r\n\t\tchunks = (SCREEN_WIDTH / TILE_WIDTH) - 4;\r\n\t}\r\n\tif (invflag || sbookflag) {\r\n\t\tx += 2;\r\n\t\ty -= 2;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tchunks = (SCREEN_WIDTH / TILE_WIDTH) - 4;\r\n\t}\r\n\r\n\tswitch (ScrollInfo._sdir) {\r\n\tcase SDIR_NE:\r\n\t\tchunks++;\r\n\tcase SDIR_N:\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx--;\r\n\t\ty--;\r\n#ifndef HELLFIRE\r\n\t\tblocks++;\r\n#endif\r\n\t\tbreak;\r\n\tcase SDIR_SE:\r\n\t\tblocks++;\r\n\tcase SDIR_E:\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_S:\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_SW:\r\n\t\tblocks++;\r\n\tcase SDIR_W:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tx--;\r\n\t\ty++;\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_NW:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx -= 2;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\t}\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[0 + SCREEN_Y]];\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tscrollrt_draw_upper(x, y, sx, sy, chunks, i, FALSE);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\tscrollrt_draw_upper(x, y, sx, sy, chunks, i, TRUE);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[VIEWPORT_HEIGHT + SCREEN_Y]];\r\n\tfor (i = 0; i < blocks; i++) {\r\n\t\tscrollrt_draw_lower(x, y, sx, sy, chunks, FALSE);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\tscrollrt_draw_lower(x, y, sx, sy, chunks, TRUE);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\tarch_draw_type = 0;\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tscrollrt_draw_lower_2(x, y, sx, sy, chunks, i, FALSE);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\tscrollrt_draw_lower_2(x, y, sx, sy, chunks, i, TRUE);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Configure render for zoomed view and process screen rows\r\n * @param x Center of view in dPiece coordinate\r\n * @param y Center of view in dPiece coordinate\r\n */\r\nstatic void DrawZoom(int x, int y)\r\n{\r\n\tint i, sx, sy, chunks, blocks;\r\n\tint wdt, nSrcOff, nDstOff;\r\n\r\n\tViewDX = ZOOM_WIDTH;\r\n\tViewDY = ZOOM_HEIGHT - TILE_HEIGHT;\r\n\tViewBX = ZOOM_WIDTH / TILE_WIDTH;\r\n\tViewBY = (ZOOM_HEIGHT - TILE_HEIGHT) / TILE_HEIGHT;\r\n\r\n\tsx = ScrollInfo._sxoff + SCREEN_X;\r\n\tsy = ScrollInfo._syoff + SCREEN_Y - (TILE_HEIGHT / 2 + 1);\r\n\tx -= ZOOM_WIDTH / TILE_WIDTH;\r\n\ty--;\r\n\tchunks = ZOOM_WIDTH / TILE_WIDTH;\r\n\tblocks = 3;\r\n\r\n\tswitch (ScrollInfo._sdir) {\r\n\tcase SDIR_NE:\r\n\t\tchunks++;\r\n\tcase SDIR_N:\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx--;\r\n\t\ty--;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_SE:\r\n\t\tblocks++;\r\n\tcase SDIR_E:\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_S:\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_SW:\r\n\t\tblocks++;\r\n\tcase SDIR_W:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tx--;\r\n\t\ty++;\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_NW:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx -= 2;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\t}\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[-(TILE_HEIGHT / 2 + 1) + SCREEN_Y]];\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tscrollrt_draw_upper(x, y, sx, sy, chunks, i, FALSE);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\tscrollrt_draw_upper(x, y, sx, sy, chunks, i, TRUE);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[(VIEWPORT_HEIGHT - TILE_HEIGHT) / 2 + SCREEN_Y]];\r\n\tfor (i = 0; i < blocks; i++) {\r\n\t\tscrollrt_draw_lower(x, y, sx, sy, chunks, FALSE);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\tscrollrt_draw_lower(x, y, sx, sy, chunks, TRUE);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\tarch_draw_type = 0;\r\n\tfor (i = 0; i < 4; i++) {\r\n\t\tscrollrt_draw_lower_2(x, y, sx, sy, chunks, i, FALSE);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\tscrollrt_draw_lower_2(x, y, sx, sy, chunks, i, TRUE);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\r\n\tif (chrflag || questlog) {\r\n\t\tnSrcOff = SCREENXY(TILE_WIDTH / 2 + SPANEL_WIDTH / 4, VIEWPORT_HEIGHT / 2 - (TILE_HEIGHT / 2 + 1));\r\n\t\tnDstOff = SCREENXY(SPANEL_WIDTH, VIEWPORT_HEIGHT - 2);\r\n\t\twdt = (SCREEN_WIDTH - SPANEL_WIDTH) / 2;\r\n\t} else if (invflag || sbookflag) {\r\n\t\tnSrcOff = SCREENXY(TILE_WIDTH / 2 + SPANEL_WIDTH / 4, VIEWPORT_HEIGHT / 2 - (TILE_HEIGHT / 2 + 1));\r\n\t\tnDstOff = SCREENXY(0, VIEWPORT_HEIGHT - 2);\r\n\t\twdt = (SCREEN_WIDTH - SPANEL_WIDTH) / 2;\r\n\t} else {\r\n\t\tnSrcOff = SCREENXY(TILE_WIDTH / 2, VIEWPORT_HEIGHT / 2 - (TILE_HEIGHT / 2 + 1));\r\n\t\tnDstOff = SCREENXY(0, VIEWPORT_HEIGHT - 2);\r\n\t\twdt = SCREEN_WIDTH / 2;\r\n\t}\r\n\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, gpBuffer\r\n\t\tmov\t\tedx, nDstOff\r\n\t\tmov\t\tedi, esi\r\n\t\tmov\t\tecx, nSrcOff\r\n\t\tadd\t\tedi, edx\r\n\t\tadd\t\tesi, ecx\r\n\t\tmov\t\tebx, edi\r\n\t\tadd\t\tebx, BUFFER_WIDTH\r\n\t\tmov\t\tedx, (VIEWPORT_HEIGHT / 2)\r\n\tlabel1:\r\n\t\tmov\t\tecx, wdt\r\n\tlabel2:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tah, al\r\n\t\tmov\t\t[edi], ax\r\n\t\tmov\t\t[ebx], ax\r\n\t\tadd\t\tedi, 2\r\n\t\tadd\t\tebx, 2\r\n\t\tdec\t\tecx\r\n\t\tjnz\t\tlabel2\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, wdt\r\n\t\tsub\t\tesi, eax\r\n\t\tadd\t\teax, eax\r\n\t\tsub\t\tebx, eax\r\n\t\tsub\t\tedi, eax\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint hgt;\r\n\tBYTE *src, *dst1, *dst2;\r\n\r\n\tsrc = &gpBuffer[nSrcOff];\r\n\tdst1 = &gpBuffer[nDstOff];\r\n\tdst2 = &gpBuffer[nDstOff + BUFFER_WIDTH];\r\n\r\n\tfor (hgt = VIEWPORT_HEIGHT / 2; hgt != 0; hgt--, src -= BUFFER_WIDTH + wdt, dst1 -= 2 * (BUFFER_WIDTH + wdt), dst2 -= 2 * (BUFFER_WIDTH + wdt)) {\r\n\t\tfor (i = wdt; i != 0; i--) {\r\n\t\t\t*dst1++ = *src;\r\n\t\t\t*dst1++ = *src;\r\n\t\t\t*dst2++ = *src;\r\n\t\t\t*dst2++ = *src;\r\n\t\t\tsrc++;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Start rendering of screen, town variation\r\n * @param StartX Center of view in dPiece coordinate\r\n * @param StartY Center of view in dPiece coordinate\r\n */\r\nvoid DrawView(int StartX, int StartY)\r\n{\r\n\tif (zoomflag) {\r\n\t\tDrawGame(StartX, StartY);\r\n\t} else {\r\n\t\tDrawZoom(StartX, StartY);\r\n\t}\r\n\tif (automapflag) {\r\n\t\tDrawAutomap();\r\n\t}\r\n\tif (invflag) {\r\n\t\tDrawInv();\r\n\t} else if (sbookflag) {\r\n\t\tDrawSpellBook();\r\n\t}\r\n\r\n\tDrawDurIcon();\r\n\r\n\tif (chrflag) {\r\n\t\tDrawChr();\r\n\t} else if (questlog) {\r\n\t\tDrawQuestLog();\r\n\t} else if (plr[myplr]._pStatPts != 0 && !spselflag) {\r\n\t\tDrawLevelUpIcon();\r\n\t}\r\n\tif (uitemflag) {\r\n\t\tDrawUniqueInfo();\r\n\t}\r\n\tif (qtextflag) {\r\n\t\tDrawQText();\r\n\t}\r\n\tif (spselflag) {\r\n\t\tDrawSpellList();\r\n\t}\r\n\tif (dropGoldFlag) {\r\n\t\tDrawGoldSplit(dropGoldValue);\r\n\t}\r\n\tif (helpflag) {\r\n\t\tDrawHelp();\r\n\t}\r\n\tif (msgflag) {\r\n\t\tDrawDiabloMsg();\r\n\t}\r\n\tif (deathflag) {\r\n\t\tRedBack();\r\n\t} else if (PauseMode != 0) {\r\n\t\tgmenu_draw_pause();\r\n\t}\r\n\r\n\tDrawPlrMsg();\r\n\tgmenu_draw();\r\n\tdoom_draw();\r\n\tDrawInfoBox();\r\n\tDrawLifeFlask();\r\n\tDrawManaFlask();\r\n}\r\n\r\n/**\r\n * @brief Render the whole screen black\r\n */\r\nvoid ClearScreenBuffer()\r\n{\r\n\tlock_buf(3);\r\n\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tedi, gpBuffer\r\n\t\tadd\t\tedi, SCREENXY(0, 0)\r\n\t\tmov\t\tedx, SCREEN_HEIGHT\r\n\t\txor\t\teax, eax\r\n\tzeroline:\r\n\t\tmov\t\tecx, SCREEN_WIDTH / 4\r\n\t\trep stosd\r\n\t\tadd\t\tedi, BUFFER_WIDTH - SCREEN_WIDTH\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tzeroline\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE *dst;\r\n\r\n\tdst = &gpBuffer[SCREENXY(0, 0)];\r\n\r\n\tfor (i = 0; i < SCREEN_HEIGHT; i++, dst += BUFFER_WIDTH) {\r\n\t\tmemset(dst, 0, SCREEN_WIDTH);\r\n\t}\r\n#endif\r\n\r\n\tunlock_buf(3);\r\n}\r\n\r\n#ifdef _DEBUG\r\n/**\r\n * @brief Scroll the screen when mouse is close to the edge\r\n */\r\nvoid ScrollView()\r\n{\r\n\tBOOL scroll;\r\n\r\n\tif (pcurs >= CURSOR_FIRSTITEM)\r\n\t\treturn;\r\n\r\n\tscroll = FALSE;\r\n\r\n\tif (MouseX < 20) {\r\n\t\tif (dmaxy - 1 <= ViewY || dminx >= ViewX) {\r\n\t\t\tif (dmaxy - 1 > ViewY) {\r\n\t\t\t\tViewY++;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dminx < ViewX) {\r\n\t\t\t\tViewX--;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tViewY++;\r\n\t\t\tViewX--;\r\n\t\t\tscroll = TRUE;\r\n\t\t}\r\n\t}\r\n\tif (MouseX > SCREEN_WIDTH - 20) {\r\n\t\tif (dmaxx - 1 <= ViewX || dminy >= ViewY) {\r\n\t\t\tif (dmaxx - 1 > ViewX) {\r\n\t\t\t\tViewX++;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dminy < ViewY) {\r\n\t\t\t\tViewY--;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tViewY--;\r\n\t\t\tViewX++;\r\n\t\t\tscroll = TRUE;\r\n\t\t}\r\n\t}\r\n\tif (MouseY < 20) {\r\n\t\tif (dminy >= ViewY || dminx >= ViewX) {\r\n\t\t\tif (dminy < ViewY) {\r\n\t\t\t\tViewY--;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dminx < ViewX) {\r\n\t\t\t\tViewX--;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tViewX--;\r\n\t\t\tViewY--;\r\n\t\t\tscroll = TRUE;\r\n\t\t}\r\n\t}\r\n\tif (MouseY > SCREEN_HEIGHT - 20) {\r\n\t\tif (dmaxy - 1 <= ViewY || dmaxx - 1 <= ViewX) {\r\n\t\t\tif (dmaxy - 1 > ViewY) {\r\n\t\t\t\tViewY++;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t\tif (dmaxx - 1 > ViewX) {\r\n\t\t\t\tViewX++;\r\n\t\t\t\tscroll = TRUE;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tViewX++;\r\n\t\t\tViewY++;\r\n\t\t\tscroll = TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (scroll)\r\n\t\tScrollInfo._sdir = SDIR_NONE;\r\n}\r\n\r\n/**\r\n * @brief Initialize the FPS meter\r\n */\r\nvoid EnableFrameCount()\r\n{\r\n\tframeflag = frameflag == 0;\r\n\tframestart = GetTickCount();\r\n}\r\n\r\n/**\r\n * @brief Display the current average FPS over 1 sec\r\n */\r\nstatic void DrawFPS()\r\n{\r\n\tDWORD tc, frames;\r\n\tchar String[12];\r\n\tHDC hdc;\r\n\r\n\tif (frameflag && gbActive) {\r\n\t\tframeend++;\r\n\t\ttc = GetTickCount();\r\n\t\tframes = tc - framestart;\r\n\t\tif (tc - framestart >= 1000) {\r\n\t\t\tframestart = tc;\r\n\t\t\tframerate = 1000 * frameend / frames;\r\n\t\t\tframeend = 0;\r\n\t\t}\r\n\t\tif (framerate > 99)\r\n\t\t\tframerate = 99;\r\n\t\twsprintf(String, \"%2d\", framerate);\r\n\t\tif (!lpDDSPrimary->GetDC(&hdc)) {\r\n\t\t\tTextOut(hdc, 0, 400, String, strlen(String));\r\n\t\t\tlpDDSPrimary->ReleaseDC(hdc);\r\n\t\t}\r\n\t}\r\n}\r\n#endif\r\n\r\n/**\r\n * @brief Update part of the screen from the back buffer\r\n * @param dwX Back buffer coordinate\r\n * @param dwY Back buffer coordinate\r\n * @param dwWdt Back buffer coordinate\r\n * @param dwHgt Back buffer coordinate\r\n */\r\nstatic void DoBlitScreen(DWORD dwX, DWORD dwY, DWORD dwWdt, DWORD dwHgt)\r\n{\r\n\tint nSrcOff, nDstOff, nSrcWdt, nDstWdt;\r\n\tDWORD dwTicks;\r\n\tHRESULT hDDVal;\r\n\tRECT SrcRect;\r\n\r\n\tassert(!(dwX & 3));\r\n\tassert(!(dwWdt & 3));\r\n\r\n\tif (lpDDSBackBuf != NULL) {\r\n\t\tSrcRect.left = dwX + SCREEN_X;\r\n\t\tSrcRect.top = dwY + SCREEN_Y;\r\n\t\tSrcRect.right = SrcRect.left + dwWdt - 1;\r\n\t\tSrcRect.bottom = SrcRect.top + dwHgt - 1;\r\n\t\t/// ASSERT: assert(! gpBuffer);\r\n\t\tdwTicks = GetTickCount();\r\n\t\twhile (1) {\r\n\t\t\thDDVal = lpDDSPrimary->BltFast(dwX, dwY, lpDDSBackBuf, &SrcRect, DDBLTFAST_WAIT);\r\n\t\t\tif (hDDVal == DD_OK) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (dwTicks - GetTickCount() > 5000) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tSleep(1);\r\n\t\t\tif (hDDVal == DDERR_SURFACELOST) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (hDDVal != DDERR_WASSTILLDRAWING && hDDVal != DDERR_SURFACEBUSY) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (hDDVal != DDERR_SURFACELOST\r\n\t\t    && hDDVal != DDERR_WASSTILLDRAWING\r\n\t\t    && hDDVal != DDERR_SURFACEBUSY\r\n\t\t    && hDDVal != DD_OK) {\r\n\t\t\tDDErrMsg(hDDVal, 3596, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SCROLLRT.CPP\");\r\n\t\t}\r\n\t} else {\r\n\t\tnSrcOff = SCREENXY(dwX, dwY);\r\n\t\tnDstOff = dwX * (SCREEN_BPP / 8) + dwY * DDS_desc.lPitch;\r\n\t\tnSrcWdt = BUFFER_WIDTH - dwWdt;\r\n\t\tnDstWdt = DDS_desc.lPitch - dwWdt * (SCREEN_BPP / 8);\r\n\t\tdwWdt >>= 2;\r\n\r\n\t\tlock_buf(6);\r\n\r\n\t\t/// ASSERT: assert(gpBuffer);\r\n\r\n#if defined(USE_ASM) && !defined(RGBMODE)\r\n\t\t__asm {\r\n\t\t\tmov\t\tesi, gpBuffer\r\n\t\t\tmov\t\tedi, DDS_desc.lpSurface\r\n\t\t\tadd\t\tesi, nSrcOff\r\n\t\t\tadd\t\tedi, nDstOff\r\n\t\t\tmov\t\teax, nSrcWdt\r\n\t\t\tmov\t\tebx, nDstWdt\r\n\t\t\tmov\t\tedx, dwHgt\r\n\t\tblitline:\r\n\t\t\tmov\t\tecx, dwWdt\r\n\t\t\trep movsd\r\n\t\t\tadd\t\tesi, eax\r\n\t\t\tadd\t\tedi, ebx\r\n\t\t\tdec\t\tedx\r\n\t\t\tjnz\t\tblitline\r\n\t\t}\r\n#else\r\n\t\tint wdt, hgt;\r\n\t\tBYTE *src, *dst;\r\n\r\n\t\tsrc = &gpBuffer[nSrcOff];\r\n\t\tdst = (BYTE *)DDS_desc.lpSurface + nDstOff;\r\n\r\n\t\tfor (hgt = 0; hgt < dwHgt; hgt++, src += nSrcWdt, dst += nDstWdt) {\r\n\t\t\tfor (wdt = 0; wdt < 4 * dwWdt; wdt++) {\r\n#ifndef RGBMODE\r\n\t\t\t\t*dst++ = *src++;\r\n#else\r\n\t\t\t\tPALETTEENTRY pal = system_palette[*src++];\r\n\t\t\t\tdst[0] = pal.peBlue;\r\n\t\t\t\tdst[1] = pal.peGreen;\r\n\t\t\t\tdst[2] = pal.peRed;\r\n\t\t\t\tdst += 4;\r\n#endif\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\r\n\t\tunlock_buf(6);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Check render pipeline and blit individual screen parts\r\n * @param dwHgt Section of screen to update from top to bottom\r\n * @param draw_desc Render info box\r\n * @param draw_hp Render health bar\r\n * @param draw_mana Render mana bar\r\n * @param draw_sbar Render belt\r\n * @param draw_btn Render panel buttons\r\n */\r\nstatic void DrawMain(int dwHgt, BOOL draw_desc, BOOL draw_hp, BOOL draw_mana, BOOL draw_sbar, BOOL draw_btn)\r\n{\r\n\tint ysize;\r\n\tDWORD dwTicks;\r\n\tBOOL retry;\r\n\tHRESULT hDDVal;\r\n\r\n\tysize = dwHgt;\r\n\r\n\tif (!gbActive || lpDDSPrimary == NULL) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (lpDDSPrimary->IsLost() == DDERR_SURFACELOST) {\r\n\t\tif (lpDDSPrimary->Restore() != DD_OK) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tResetPal();\r\n\t\tysize = SCREEN_HEIGHT;\r\n\t}\r\n\r\n\tif (lpDDSBackBuf == NULL) {\r\n\t\tretry = TRUE;\r\n\t\tdwTicks = GetTickCount();\r\n\t\twhile (1) {\r\n\t\t\tDDS_desc.dwSize = sizeof(DDS_desc);\r\n\t\t\thDDVal = lpDDSPrimary->Lock(NULL, &DDS_desc, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL);\r\n\t\t\tif (hDDVal == DD_OK) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (dwTicks - GetTickCount() > 5000) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tSleep(1);\r\n\t\t\tif (hDDVal == DDERR_SURFACELOST) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (hDDVal != DDERR_WASSTILLDRAWING && hDDVal != DDERR_SURFACEBUSY) {\r\n\t\t\t\tif (!retry || hDDVal != DDERR_GENERIC) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tretry = FALSE;\r\n\t\t\t\tj_dx_reinit();\r\n\t\t\t\tysize = SCREEN_HEIGHT;\r\n\t\t\t\tdwTicks = GetTickCount();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (hDDVal == DDERR_SURFACELOST\r\n\t\t    || hDDVal == DDERR_WASSTILLDRAWING\r\n\t\t    || hDDVal == DDERR_SURFACEBUSY) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (hDDVal != DD_OK) {\r\n\t\t\tDDErrMsg(hDDVal, 3707, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SCROLLRT.CPP\");\r\n\t\t}\r\n\t}\r\n\r\n\t/// ASSERT: assert(ysize >= 0 && ysize <= 480); // SCREEN_HEIGHT\r\n\r\n\tif (ysize > 0) {\r\n\t\tDoBlitScreen(0, 0, SCREEN_WIDTH, ysize);\r\n\t}\r\n\tif (ysize < SCREEN_HEIGHT) {\r\n\t\tif (draw_sbar) {\r\n\t\t\tDoBlitScreen(PANEL_LEFT + 204, PANEL_TOP + 5, 232, 28);\r\n\t\t}\r\n\t\tif (draw_desc) {\r\n\t\t\tDoBlitScreen(PANEL_LEFT + 176, PANEL_TOP + 46, 288, 60);\r\n\t\t}\r\n\t\tif (draw_mana) {\r\n\t\t\tDoBlitScreen(PANEL_LEFT + 460, PANEL_TOP, 88, 72);\r\n\t\t\tDoBlitScreen(PANEL_LEFT + 564, PANEL_TOP + 64, 56, 56);\r\n\t\t}\r\n\t\tif (draw_hp) {\r\n\t\t\tDoBlitScreen(PANEL_LEFT + 96, PANEL_TOP, 88, 72);\r\n\t\t}\r\n\t\tif (draw_btn) {\r\n\t\t\tDoBlitScreen(PANEL_LEFT + 8, PANEL_TOP + 5, 72, 119);\r\n\t\t\tDoBlitScreen(PANEL_LEFT + 556, PANEL_TOP + 5, 72, 48);\r\n\t\t\tif (gbMaxPlayers > 1) {\r\n\t\t\t\tDoBlitScreen(PANEL_LEFT + 84, PANEL_TOP + 91, 36, 32);\r\n\t\t\t\tDoBlitScreen(PANEL_LEFT + 524, PANEL_TOP + 91, 36, 32);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (sgdwCursWdtOld != 0) {\r\n\t\t\tDoBlitScreen(sgdwCursXOld, sgdwCursYOld, sgdwCursWdtOld, sgdwCursHgtOld);\r\n\t\t}\r\n\t\tif (sgdwCursWdt != 0) {\r\n\t\t\tDoBlitScreen(sgdwCursX, sgdwCursY, sgdwCursWdt, sgdwCursHgt);\r\n\t\t}\r\n\t}\r\n\r\n\tif (lpDDSBackBuf == NULL) {\r\n\t\thDDVal = lpDDSPrimary->Unlock(NULL);\r\n\t\tif (hDDVal != DDERR_SURFACELOST && hDDVal != DD_OK) {\r\n\t\t\tDDErrMsg(hDDVal, 3779, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SCROLLRT.CPP\");\r\n\t\t}\r\n\t}\r\n\r\n#ifdef _DEBUG\r\n\tDrawFPS();\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Redraw screen\r\n * @param draw_cursor\r\n */\r\nvoid scrollrt_draw_game_screen(BOOL draw_cursor)\r\n{\r\n\tint hgt;\r\n\r\n\tif (force_redraw == 255) {\r\n\t\tforce_redraw = 0;\r\n\t\thgt = SCREEN_HEIGHT;\r\n\t} else {\r\n\t\thgt = 0;\r\n\t}\r\n\r\n\tif (draw_cursor) {\r\n\t\tlock_buf(0);\r\n\t\tscrollrt_draw_cursor_item();\r\n\t\tunlock_buf(0);\r\n\t}\r\n\r\n\tDrawMain(hgt, FALSE, FALSE, FALSE, FALSE, FALSE);\r\n\r\n\tif (draw_cursor) {\r\n\t\tlock_buf(0);\r\n\t\tscrollrt_draw_cursor_back_buffer();\r\n\t\tunlock_buf(0);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render the game\r\n */\r\nvoid DrawAndBlit()\r\n{\r\n\tint hgt;\r\n\tBOOL ddsdesc, ctrlPan;\r\n\r\n\tif (!gbRunGame) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (force_redraw == 255) {\r\n\t\tdrawhpflag = TRUE;\r\n\t\tdrawmanaflag = TRUE;\r\n\t\tdrawbtnflag = TRUE;\r\n\t\tdrawsbarflag = TRUE;\r\n\t\tddsdesc = FALSE;\r\n\t\tctrlPan = TRUE;\r\n\t\thgt = SCREEN_HEIGHT;\r\n\t} else if (force_redraw == 1) {\r\n\t\tddsdesc = TRUE;\r\n\t\tctrlPan = FALSE;\r\n\t\thgt = VIEWPORT_HEIGHT;\r\n\t} else {\r\n\t\treturn;\r\n\t}\r\n\r\n\tforce_redraw = 0;\r\n\r\n\tlock_buf(0);\r\n\tif (leveltype != DTYPE_TOWN) {\r\n\t\tDrawView(ViewX, ViewY);\r\n\t} else {\r\n\t\tT_DrawView(ViewX, ViewY);\r\n\t}\r\n\tif (ctrlPan) {\r\n\t\tDrawCtrlPan();\r\n\t}\r\n\tif (drawhpflag) {\r\n\t\tUpdateLifeFlask();\r\n\t}\r\n\tif (drawmanaflag) {\r\n\t\tUpdateManaFlask();\r\n\t}\r\n\tif (drawbtnflag) {\r\n\t\tDrawCtrlBtns();\r\n\t}\r\n\tif (drawsbarflag) {\r\n\t\tDrawInvBelt();\r\n\t}\r\n\tif (talkflag) {\r\n\t\tDrawTalkPan();\r\n\t\thgt = SCREEN_HEIGHT;\r\n\t}\r\n\tscrollrt_draw_cursor_item();\r\n\tunlock_buf(0);\r\n\r\n\tDrawMain(hgt, ddsdesc, drawhpflag, drawmanaflag, drawsbarflag, drawbtnflag);\r\n\r\n\tlock_buf(0);\r\n\tscrollrt_draw_cursor_back_buffer();\r\n\tunlock_buf(0);\r\n\r\n\tdrawhpflag = FALSE;\r\n\tdrawmanaflag = FALSE;\r\n\tdrawbtnflag = FALSE;\r\n\tdrawsbarflag = FALSE;\r\n}\r\n"
  },
  {
    "path": "Source/scrollrt.h",
    "content": "/**\r\n * @file scrollrt.h\r\n *\r\n * Interface of functionality for rendering the dungeons, monsters and calling other render routines.\r\n */\r\n#ifndef __SCROLLRT_H__\r\n#define __SCROLLRT_H__\r\n\r\nextern int light_table_index;\r\nextern int PitchTbl[1024];\r\nextern BYTE *gpBufEnd;\r\nextern DWORD level_cel_block;\r\nextern char arch_draw_type;\r\nextern int cel_transparency_active;\r\nextern int level_piece_id;\r\n#ifdef HELLFIRE\r\nextern BOOLEAN AutoMapShowItems;\r\n#endif\r\n\r\nvoid ClearCursor();\r\nvoid DrawMissile(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL pre);\r\nvoid DrawClippedMissile(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL pre);\r\nvoid DrawDeadPlayer(int x, int y, int sx, int sy, int CelSkip, int CelCap, BOOL clipped);\r\nvoid DrawView(int StartX, int StartY);\r\nvoid ClearScreenBuffer();\r\n#ifdef _DEBUG\r\nvoid ScrollView();\r\nvoid EnableFrameCount();\r\n#endif\r\nvoid scrollrt_draw_game_screen(BOOL draw_cursor);\r\nvoid DrawAndBlit();\r\n\r\n#endif /* __SCROLLRT_H__ */\r\n"
  },
  {
    "path": "Source/setmaps.cpp",
    "content": "/**\r\n * @file setmaps.cpp\r\n *\r\n * Implementation of functionality the special quest dungeons.\r\n */\r\n#include \"all.h\"\r\n\r\n// BUGFIX: constant data should be const\r\nBYTE SkelKingTrans1[] = {\r\n\t19, 47, 26, 55,\r\n\t26, 49, 30, 53\r\n};\r\n\r\nBYTE SkelKingTrans2[] = {\r\n\t33, 19, 47, 29,\r\n\t37, 29, 43, 39\r\n};\r\n\r\nBYTE SkelKingTrans3[] = {\r\n\t27, 53, 35, 61,\r\n\t27, 35, 34, 42,\r\n\t45, 35, 53, 43,\r\n\t45, 53, 53, 61,\r\n\t31, 39, 49, 57\r\n};\r\n\r\nBYTE SkelKingTrans4[] = {\r\n\t49, 45, 58, 51,\r\n\t57, 31, 62, 37,\r\n\t63, 31, 69, 40,\r\n\t59, 41, 73, 55,\r\n\t63, 55, 69, 65,\r\n\t73, 45, 78, 51,\r\n\t79, 43, 89, 53\r\n};\r\n\r\nBYTE SkelChamTrans1[] = {\r\n\t43, 19, 50, 26,\r\n\t51, 19, 59, 26,\r\n\t35, 27, 42, 34,\r\n\t43, 27, 49, 34,\r\n\t50, 27, 59, 34\r\n};\r\n\r\nBYTE SkelChamTrans2[] = {\r\n\t19, 31, 34, 47,\r\n\t34, 35, 42, 42\r\n};\r\n\r\nBYTE SkelChamTrans3[] = {\r\n\t43, 35, 50, 42,\r\n\t51, 35, 62, 42,\r\n\t63, 31, 66, 46,\r\n\t67, 31, 78, 34,\r\n\t67, 35, 78, 42,\r\n\t67, 43, 78, 46,\r\n\t35, 43, 42, 51,\r\n\t43, 43, 49, 51,\r\n\t50, 43, 59, 51\r\n};\r\n\r\n/** Maps from quest level to quest level names. */\r\nconst char *const quest_level_names[] = {\r\n\t\"\",\r\n\t\"Skeleton King's Lair\",\r\n\t\"Bone Chamber\",\r\n\t\"Maze\",\r\n\t\"Poisoned Water Supply\",\r\n\t\"Archbishop Lazarus' Lair\",\r\n};\r\n\r\nint ObjIndex(int x, int y)\r\n{\r\n\tint i;\r\n\tint oi;\r\n\r\n\tfor (i = 0; i < nobjects; i++) {\r\n\t\toi = objectactive[i];\r\n\t\tif (object[oi]._ox == x && object[oi]._oy == y)\r\n\t\t\treturn oi;\r\n\t}\r\n\tapp_fatal(\"ObjIndex: Active object not found at (%d,%d)\", x, y);\r\n\treturn -1;\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid AddSKingObjs()\r\n{\r\n\tSetObjMapRange(ObjIndex(64, 34), 20, 7, 23, 10, 1);\r\n\tSetObjMapRange(ObjIndex(64, 59), 20, 14, 21, 16, 2);\r\n\tSetObjMapRange(ObjIndex(27, 37), 8, 1, 15, 11, 3);\r\n\tSetObjMapRange(ObjIndex(46, 35), 8, 1, 15, 11, 3);\r\n\tSetObjMapRange(ObjIndex(49, 53), 8, 1, 15, 11, 3);\r\n\tSetObjMapRange(ObjIndex(27, 53), 8, 1, 15, 11, 3);\r\n}\r\n\r\nvoid AddSChamObjs()\r\n{\r\n\tSetObjMapRange(ObjIndex(37, 30), 17, 0, 21, 5, 1);\r\n\tSetObjMapRange(ObjIndex(37, 46), 13, 0, 16, 5, 2);\r\n}\r\n\r\nvoid AddVileObjs()\r\n{\r\n\tSetObjMapRange(ObjIndex(26, 45), 1, 1, 9, 10, 1);\r\n\tSetObjMapRange(ObjIndex(45, 46), 11, 1, 20, 10, 2);\r\n\tSetObjMapRange(ObjIndex(35, 36), 7, 11, 13, 18, 3);\r\n}\r\n\r\nvoid DRLG_SetMapTrans(const char *sFileName)\r\n{\r\n\tint x, y;\r\n\tint i, j;\r\n\tBYTE *pLevelMap;\r\n\tBYTE *d;\r\n\tDWORD dwOffset;\r\n\r\n\tpLevelMap = LoadFileInMem(sFileName, NULL);\r\n\td = pLevelMap + 2;\r\n\tx = pLevelMap[0];\r\n\ty = *d;\r\n\tdwOffset = (x * y + 1) * 2;\r\n\tx <<= 1;\r\n\ty <<= 1;\r\n\tdwOffset += 3 * x * y * 2;\r\n\td += dwOffset;\r\n\r\n\tfor (j = 0; j < y; j++) {\r\n\t\tfor (i = 0; i < x; i++) {\r\n\t\t\tdTransVal[16 + i][16 + j] = *d;\r\n\t\t\td += 2;\r\n\t\t}\r\n\t}\r\n\tmem_free_dbg(pLevelMap);\r\n}\r\n\r\n/**\r\n * @brief Load a quest map, the given map is specified via the global setlvlnum\r\n */\r\nvoid LoadSetMap()\r\n{\r\n\tswitch (setlvlnum) {\r\n\tcase SL_SKELKING:\r\n\t\tif (quests[Q_SKELKING]._qactive == QUEST_INIT) {\r\n\t\t\tquests[Q_SKELKING]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_SKELKING]._qvar1 = 1;\r\n\t\t}\r\n\t\tLoadPreL1Dungeon(\"Levels\\\\L1Data\\\\SklKng1.DUN\", 83, 45);\r\n\t\tLoadL1Dungeon(\"Levels\\\\L1Data\\\\SklKng2.DUN\", 83, 45);\r\n\t\tLoadPalette(\"Levels\\\\L1Data\\\\L1_2.pal\");\r\n\t\tDRLG_AreaTrans(sizeof(SkelKingTrans1) / 4, &SkelKingTrans1[0]);\r\n\t\tDRLG_ListTrans(sizeof(SkelKingTrans2) / 4, &SkelKingTrans2[0]);\r\n\t\tDRLG_AreaTrans(sizeof(SkelKingTrans3) / 4, &SkelKingTrans3[0]);\r\n\t\tDRLG_ListTrans(sizeof(SkelKingTrans4) / 4, &SkelKingTrans4[0]);\r\n\t\tAddL1Objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\tAddSKingObjs();\r\n\t\tInitSKingTriggers();\r\n\t\tbreak;\r\n\tcase SL_BONECHAMB:\r\n\t\tLoadPreL2Dungeon(\"Levels\\\\L2Data\\\\Bonecha2.DUN\", 69, 39);\r\n\t\tLoadL2Dungeon(\"Levels\\\\L2Data\\\\Bonecha1.DUN\", 69, 39);\r\n\t\tLoadPalette(\"Levels\\\\L2Data\\\\L2_2.pal\");\r\n\t\tDRLG_ListTrans(sizeof(SkelChamTrans1) / 4, &SkelChamTrans1[0]);\r\n\t\tDRLG_AreaTrans(sizeof(SkelChamTrans2) / 4, &SkelChamTrans2[0]);\r\n\t\tDRLG_ListTrans(sizeof(SkelChamTrans3) / 4, &SkelChamTrans3[0]);\r\n\t\tAddL2Objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\tAddSChamObjs();\r\n\t\tInitSChambTriggers();\r\n\t\tbreak;\r\n\tcase SL_MAZE:\r\n\t\tLoadPreL1Dungeon(\"Levels\\\\L1Data\\\\Lv1MazeA.DUN\", 20, 50);\r\n\t\tLoadL1Dungeon(\"Levels\\\\L1Data\\\\Lv1MazeB.DUN\", 20, 50);\r\n\t\tLoadPalette(\"Levels\\\\L1Data\\\\L1_5.pal\");\r\n\t\tAddL1Objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\tDRLG_SetMapTrans(\"Levels\\\\L1Data\\\\Lv1MazeA.DUN\");\r\n\t\tbreak;\r\n\tcase SL_POISONWATER:\r\n\t\tif (quests[Q_PWATER]._qactive == QUEST_INIT)\r\n\t\t\tquests[Q_PWATER]._qactive = QUEST_ACTIVE;\r\n\t\tLoadPreL3Dungeon(\"Levels\\\\L3Data\\\\Foulwatr.DUN\", 19, 50);\r\n\t\tLoadL3Dungeon(\"Levels\\\\L3Data\\\\Foulwatr.DUN\", 20, 50);\r\n\t\tLoadPalette(\"Levels\\\\L3Data\\\\L3pfoul.pal\");\r\n\t\tInitPWaterTriggers();\r\n\t\tbreak;\r\n\tcase SL_VILEBETRAYER:\r\n\t\tif (quests[Q_BETRAYER]._qactive == QUEST_DONE) {\r\n\t\t\tquests[Q_BETRAYER]._qvar2 = 4;\r\n\t\t} else if (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE) {\r\n\t\t\tquests[Q_BETRAYER]._qvar2 = 3;\r\n\t\t}\r\n\t\tLoadPreL1Dungeon(\"Levels\\\\L1Data\\\\Vile1.DUN\", 35, 36);\r\n\t\tLoadL1Dungeon(\"Levels\\\\L1Data\\\\Vile2.DUN\", 35, 36);\r\n\t\tLoadPalette(\"Levels\\\\L1Data\\\\L1_2.pal\");\r\n\t\tAddL1Objs(0, 0, MAXDUNX, MAXDUNY);\r\n\t\tAddVileObjs();\r\n\t\tDRLG_SetMapTrans(\"Levels\\\\L1Data\\\\Vile1.DUN\");\r\n\t\tInitNoTriggers();\r\n\t\tbreak;\r\n\t}\r\n}\r\n#endif\r\n"
  },
  {
    "path": "Source/setmaps.h",
    "content": "/**\r\n * @file setmaps.cpp\r\n *\r\n * Interface of functionality for the special quest dungeons.\r\n */\r\n#ifndef __SETMAPS_H__\r\n#define __SETMAPS_H__\r\n\r\nint ObjIndex(int x, int y);\r\nvoid LoadSetMap();\r\n\r\n/* rdata */\r\nextern const char *const quest_level_names[];\r\n\r\n#endif /* __SETMAPS_H__ */\r\n"
  },
  {
    "path": "Source/sha.cpp",
    "content": "/**\r\n * @file sha.cpp\r\n *\r\n * Implementation of functionality for calculating X-SHA-1 (a flawed implementation of SHA-1).\r\n */\r\n#include \"all.h\"\r\n\r\n/**\r\n *  Define the SHA1 circular left shift macro\r\n */\r\n#define SHA1CircularShift(bits, word) \\\r\n\t(((word) << (bits)) | ((word) >> (32 - (bits))))\r\n\r\nSHA1Context sgSHA1[3];\r\n\r\nstatic void SHA1Init(SHA1Context *context)\r\n{\r\n\tcontext->count[0] = 0;\r\n\tcontext->count[1] = 0;\r\n\tcontext->state[0] = 0x67452301;\r\n\tcontext->state[1] = 0xEFCDAB89;\r\n\tcontext->state[2] = 0x98BADCFE;\r\n\tcontext->state[3] = 0x10325476;\r\n\tcontext->state[4] = 0xC3D2E1F0;\r\n}\r\n\r\n// Global Optimizations (/Og) cause the compiler to interpret\r\n// `SHA1CircularShift(5, A)` as `ror edx, 0x1b`, as if A were an unsigned integer.\r\n// This results in save files being incompatible between vanilla and MSVC Release builds.\r\n#if (_MSC_VER >= 1930) && NDEBUG\r\n#pragma optimize(\"g\", off)\r\n#endif\r\n\r\nstatic void SHA1ProcessMessageBlock(SHA1Context *context)\r\n{\r\n\tint i, temp;\r\n\tint W[80];\r\n\tint A, B, C, D, E;\r\n\r\n\tDWORD *buf = (DWORD *)context->buffer;\r\n\tfor (i = 0; i < 16; i++)\r\n\t\tW[i] = buf[i];\r\n\r\n\tfor (i = 16; i < 80; i++) {\r\n\t\tW[i] = W[i - 16] ^ W[i - 14] ^ W[i - 8] ^ W[i - 3];\r\n\t}\r\n\r\n\tA = context->state[0];\r\n\tB = context->state[1];\r\n\tC = context->state[2];\r\n\tD = context->state[3];\r\n\tE = context->state[4];\r\n\r\n\tfor (i = 0; i < 20; i++) {\r\n\t\ttemp = SHA1CircularShift(5, A) + ((B & C) | ((~B) & D)) + E + W[i] + 0x5A827999;\r\n\t\tE = D;\r\n\t\tD = C;\r\n\t\tC = SHA1CircularShift(30, B);\r\n\t\tB = A;\r\n\t\tA = temp;\r\n\t}\r\n\r\n\tfor (i = 20; i < 40; i++) {\r\n\t\ttemp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1;\r\n\t\tE = D;\r\n\t\tD = C;\r\n\t\tC = SHA1CircularShift(30, B);\r\n\t\tB = A;\r\n\t\tA = temp;\r\n\t}\r\n\r\n\tfor (i = 40; i < 60; i++) {\r\n\t\ttemp = SHA1CircularShift(5, A) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC;\r\n\t\tE = D;\r\n\t\tD = C;\r\n\t\tC = SHA1CircularShift(30, B);\r\n\t\tB = A;\r\n\t\tA = temp;\r\n\t}\r\n\r\n\tfor (i = 60; i < 80; i++) {\r\n\t\ttemp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6;\r\n\t\tE = D;\r\n\t\tD = C;\r\n\t\tC = SHA1CircularShift(30, B);\r\n\t\tB = A;\r\n\t\tA = temp;\r\n\t}\r\n\r\n\tcontext->state[0] += A;\r\n\tcontext->state[1] += B;\r\n\tcontext->state[2] += C;\r\n\tcontext->state[3] += D;\r\n\tcontext->state[4] += E;\r\n}\r\n\r\n#if (_MSC_VER >= 1930) && NDEBUG\r\n#pragma optimize(\"g\", on)\r\n#endif\r\n\r\nstatic void SHA1Input(SHA1Context *context, const char *message_array, int len)\r\n{\r\n\tint i, count;\r\n\r\n\tcount = context->count[0] + 8 * len;\r\n\tif (count < context->count[0])\r\n\t\tcontext->count[1]++;\r\n\r\n\tcontext->count[0] = count;\r\n\tcontext->count[1] += len >> 29;\r\n\r\n\tfor (i = len; i >= 64; i -= 64) {\r\n\t\tmemcpy(context->buffer, message_array, sizeof(context->buffer));\r\n\t\tSHA1ProcessMessageBlock(context);\r\n\t\tmessage_array += 64;\r\n\t}\r\n}\r\n\r\nvoid SHA1Clear()\r\n{\r\n\tmemset(sgSHA1, 0, sizeof(sgSHA1));\r\n}\r\n\r\nvoid SHA1Result(int n, char Message_Digest[SHA1HashSize])\r\n{\r\n\tDWORD *Message_Digest_Block;\r\n\tint i;\r\n\r\n\tMessage_Digest_Block = (DWORD *)Message_Digest;\r\n\tif (Message_Digest) {\r\n\t\tfor (i = 0; i < 5; i++) {\r\n\t\t\t*Message_Digest_Block = sgSHA1[n].state[i];\r\n\t\t\tMessage_Digest_Block++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SHA1Calculate(int n, const char *data, char Message_Digest[SHA1HashSize])\r\n{\r\n\tSHA1Input(&sgSHA1[n], data, 64);\r\n\tif (Message_Digest)\r\n\t\tSHA1Result(n, Message_Digest);\r\n}\r\n\r\nvoid SHA1Reset(int n)\r\n{\r\n\tSHA1Init(&sgSHA1[n]);\r\n}\r\n"
  },
  {
    "path": "Source/sha.h",
    "content": "/**\r\n * @file sha.cpp\r\n *\r\n * Interface of functionality for calculating X-SHA-1 (a flawed implementation of SHA-1).\r\n */\r\n#ifndef __SHA_H__\r\n#define __SHA_H__\r\n\r\n#define SHA1HashSize 20\r\n\r\nvoid SHA1Clear();\r\nvoid SHA1Result(int n, char Message_Digest[SHA1HashSize]);\r\nvoid SHA1Calculate(int n, const char *data, char Message_Digest[SHA1HashSize]);\r\nvoid SHA1Reset(int n);\r\n\r\n#endif /* __SHA_H__ */\r\n"
  },
  {
    "path": "Source/sound.cpp",
    "content": "/**\r\n * @file sound.cpp\r\n *\r\n * Implementation of functions setting up the audio pipeline.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\n/** Contains the audio channels used for playback of sounds. */\r\nLPDIRECTSOUNDBUFFER DSBs[8];\r\nLPDIRECTSOUND sglpDS;\r\nBOOLEAN gbSndInited;\r\nint sglMusicVolume;\r\nint sglSoundVolume;\r\n/** Provides a handle to the dynamic library dsound.dll. */\r\nHMODULE hDsound_dll;\r\n/** Specifies whether background music is enabled. */\r\nHANDLE sghMusic;\r\nLPDIRECTSOUNDBUFFER sglpDSB;\r\n\r\n/* data */\r\n\r\nBOOLEAN gbMusicOn = TRUE;\r\n/** Specifies whether sound effects are enabled. */\r\nBOOLEAN gbSoundOn = TRUE;\r\n/** Specifies that no duplicate audio channel should be used. */\r\nBOOLEAN gbDupSounds = TRUE;\r\n/** Specifies the active background music track id. */\r\nint sgnMusicTrack = NUM_MUSIC;\r\n/** Maps from track ID to track name. */\r\nconst char *const sgszMusicTracks[NUM_MUSIC] = {\r\n#ifdef SPAWN\r\n\t\"Music\\\\sTowne.wav\",\r\n\t\"Music\\\\sLvlA.wav\",\r\n\t\"Music\\\\sLvlA.wav\",\r\n\t\"Music\\\\sLvlA.wav\",\r\n\t\"Music\\\\sLvlA.wav\",\r\n#ifdef HELLFIRE\r\n\t\"Music\\\\sLvlA.wav\",\r\n\t\"Music\\\\sLvlA.wav\",\r\n#endif\r\n\t\"Music\\\\sintro.wav\",\r\n#else\r\n\t\"Music\\\\DTowne.wav\",\r\n\t\"Music\\\\DLvlA.wav\",\r\n\t\"Music\\\\DLvlB.wav\",\r\n\t\"Music\\\\DLvlC.wav\",\r\n\t\"Music\\\\DLvlD.wav\",\r\n#ifdef HELLFIRE\r\n\t\"Music\\\\DLvlE.wav\",\r\n\t\"Music\\\\DLvlF.wav\",\r\n#endif\r\n\t\"Music\\\\Dintro.wav\",\r\n#endif\r\n};\r\nchar unk_volume[4][2] = {\r\n\t{ 15, -16 },\r\n\t{ 15, -16 },\r\n\t{ 30, -31 },\r\n\t{ 30, -31 }\r\n};\r\n\r\nvoid snd_update(BOOL bStopAll)\r\n{\r\n\tDWORD dwStatus, i;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tif (!DSBs[i])\r\n\t\t\tcontinue;\r\n\r\n\t\tif (!bStopAll && DSBs[i]->GetStatus(&dwStatus) == DS_OK && dwStatus == DSBSTATUS_PLAYING)\r\n\t\t\tcontinue;\r\n\r\n\t\tDSBs[i]->Stop();\r\n\t\tDSBs[i]->Release();\r\n\r\n\t\tDSBs[i] = NULL;\r\n\t}\r\n}\r\n\r\nstatic LPDIRECTSOUNDBUFFER sound_dup_channel(LPDIRECTSOUNDBUFFER DSB)\r\n{\r\n\tDWORD i;\r\n\r\n\tif (!gbDupSounds) {\r\n\t\treturn NULL;\r\n\t}\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tif (!DSBs[i]) {\r\n\t\t\tif (sglpDS->DuplicateSoundBuffer(DSB, &DSBs[i]) != DS_OK) {\r\n\t\t\t\treturn NULL;\r\n\t\t\t}\r\n\r\n\t\t\treturn DSBs[i];\r\n\t\t}\r\n\t}\r\n\r\n\treturn NULL;\r\n}\r\n\r\nstatic void snd_get_volume(const char *value_name, int *value)\r\n{\r\n\tint v = *value;\r\n\tif (!SRegLoadValue(APP_NAME, value_name, 0, &v)) {\r\n\t\tv = VOLUME_MAX;\r\n\t}\r\n\t*value = v;\r\n\r\n\tif (*value < VOLUME_MIN) {\r\n\t\t*value = VOLUME_MIN;\r\n\t} else if (*value > VOLUME_MAX) {\r\n\t\t*value = VOLUME_MAX;\r\n\t}\r\n\t*value -= *value % 100;\r\n}\r\n\r\nstatic void snd_set_volume(const char *key, int value)\r\n{\r\n\tSRegSaveValue(APP_NAME, key, 0, value);\r\n}\r\n\r\nstatic BOOL sound_file_reload(TSnd *sound_file, LPDIRECTSOUNDBUFFER DSB)\r\n{\r\n\tHANDLE file;\r\n\tLPVOID buf1, buf2;\r\n\tDWORD size1, size2;\r\n\tBOOL rv;\r\n\tHRESULT error_code;\r\n\r\n\tif (DSB->Restore() != DS_OK)\r\n\t\treturn FALSE;\r\n\r\n\trv = FALSE;\r\n\r\n\tWOpenFile(sound_file->sound_path, &file, FALSE);\r\n\tWSetFilePointer(file, sound_file->chunk.dwOffset, NULL, FILE_BEGIN);\r\n\r\n\terror_code = DSB->Lock(0, sound_file->chunk.dwSize, &buf1, &size1, &buf2, &size2, 0);\r\n\tif (error_code == DS_OK) {\r\n\t\tWReadFile(file, buf1, size1);\r\n\t\terror_code = DSB->Unlock(buf1, size1, buf2, size2);\r\n\t\tif (error_code == DS_OK)\r\n\t\t\trv = TRUE;\r\n\t}\r\n\r\n\tWCloseFile(file);\r\n\r\n\treturn rv;\r\n}\r\n\r\nvoid snd_stop_snd(TSnd *pSnd)\r\n{\r\n\tif (pSnd && pSnd->DSB)\r\n\t\tpSnd->DSB->Stop();\r\n}\r\n\r\nBOOL snd_playing(TSnd *pSnd)\r\n{\r\n\tDWORD dwStatus;\r\n\r\n\tif (!pSnd)\r\n\t\treturn FALSE;\r\n\r\n\tif (pSnd->DSB == NULL)\r\n\t\treturn FALSE;\r\n\r\n\tif (pSnd->DSB->GetStatus(&dwStatus) != DS_OK)\r\n\t\treturn FALSE;\r\n\r\n\treturn dwStatus == DSBSTATUS_PLAYING;\r\n}\r\n\r\nvoid snd_play_snd(TSnd *pSnd, int lVolume, int lPan)\r\n{\r\n\tLPDIRECTSOUNDBUFFER DSB;\r\n\tDWORD tc;\r\n\tHRESULT error_code;\r\n\r\n\tif (!pSnd || !gbSoundOn) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tDSB = pSnd->DSB;\r\n\tif (DSB == NULL) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttc = GetTickCount();\r\n\tif (tc - pSnd->start_tc < 80) {\r\n\t\tGetTickCount(); // BUGFIX: unnecessary GetTickCount\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (snd_playing(pSnd)) {\r\n\t\tDSB = sound_dup_channel(pSnd->DSB);\r\n\t\tif (DSB == NULL) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\tlVolume += sglSoundVolume;\r\n\tif (lVolume < VOLUME_MIN) {\r\n\t\tlVolume = VOLUME_MIN;\r\n\t} else if (lVolume > VOLUME_MAX) {\r\n\t\tlVolume = VOLUME_MAX;\r\n\t}\r\n\tDSB->SetVolume(lVolume);\r\n\tDSB->SetPan(lPan);\r\n\r\n\terror_code = DSB->Play(0, 0, 0);\r\n\r\n\tif (error_code != DSERR_BUFFERLOST) {\r\n\t\tif (error_code != DS_OK) {\r\n\t\t\tDSErrMsg(error_code, 261, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\");\r\n\t\t}\r\n\t} else if (sound_file_reload(pSnd, DSB)) {\r\n\t\tDSB->Play(0, 0, 0);\r\n\t}\r\n\r\n\tpSnd->start_tc = tc;\r\n}\r\n\r\nstatic void sound_CreateSoundBuffer(TSnd *sound_file)\r\n{\r\n\tDSBUFFERDESC DSB;\r\n\tHRESULT error_code;\r\n\tmemset(&DSB, 0, sizeof(DSBUFFERDESC));\r\n\r\n\tDSB.dwSize = sizeof(DSBUFFERDESC);\r\n\tDSB.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_STATIC;\r\n\tDSB.dwBufferBytes = sound_file->chunk.dwSize;\r\n\tDSB.lpwfxFormat = &sound_file->fmt;\r\n\terror_code = sglpDS->CreateSoundBuffer(&DSB, &sound_file->DSB, NULL);\r\n\tif (error_code != ERROR_SUCCESS)\r\n\t\tDSErrMsg(error_code, 282, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\");\r\n}\r\n\r\nTSnd *sound_file_load(const char *path)\r\n{\r\n\tHANDLE file;\r\n\tBYTE *wave_file;\r\n\tTSnd *pSnd;\r\n\tLPVOID buf1, buf2;\r\n\tDWORD size1, size2;\r\n\tHRESULT error_code;\r\n\r\n\tif (!sglpDS)\r\n\t\treturn NULL;\r\n\r\n\tWOpenFile(path, &file, FALSE);\r\n\tpSnd = (TSnd *)DiabloAllocPtr(sizeof(TSnd));\r\n\tmemset(pSnd, 0, sizeof(TSnd));\r\n\tpSnd->sound_path = path;\r\n\tpSnd->start_tc = GetTickCount() - 80 - 1;\r\n\r\n\twave_file = LoadWaveFile(file, &pSnd->fmt, &pSnd->chunk);\r\n\tif (!wave_file)\r\n\t\tapp_fatal(\"Invalid sound format on file %s\", pSnd->sound_path);\r\n\r\n\tsound_CreateSoundBuffer(pSnd);\r\n\r\n\terror_code = pSnd->DSB->Lock(0, pSnd->chunk.dwSize, &buf1, &size1, &buf2, &size2, 0);\r\n\tif (error_code != DS_OK)\r\n\t\tDSErrMsg(error_code, 318, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\");\r\n\r\n\tmemcpy(buf1, wave_file + pSnd->chunk.dwOffset, size1);\r\n\r\n\terror_code = pSnd->DSB->Unlock(buf1, size1, buf2, size2);\r\n\tif (error_code != DS_OK)\r\n\t\tDSErrMsg(error_code, 325, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\");\r\n\r\n\tmem_free_dbg((void *)wave_file);\r\n\tWCloseFile(file);\r\n\r\n\treturn pSnd;\r\n}\r\n\r\nvoid sound_file_cleanup(TSnd *sound_file)\r\n{\r\n\tif (sound_file) {\r\n\t\tif (sound_file->DSB) {\r\n\t\t\tsound_file->DSB->Stop();\r\n\t\t\tsound_file->DSB->Release();\r\n\t\t\tsound_file->DSB = NULL;\r\n\t\t}\r\n\r\n\t\tmem_free_dbg(sound_file);\r\n\t}\r\n}\r\n\r\nstatic void sound_create_primary_buffer(HANDLE music_track)\r\n{\r\n\tHRESULT error_code;\r\n\tDSBUFFERDESC dsbuf;\r\n\tWAVEFORMATEX format;\r\n\r\n\tif (music_track == NULL) {\r\n\t\tmemset(&dsbuf, 0, sizeof(DSBUFFERDESC));\r\n\t\tdsbuf.dwSize = sizeof(DSBUFFERDESC);\r\n\t\tdsbuf.dwFlags = DSBCAPS_PRIMARYBUFFER;\r\n\r\n\t\terror_code = sglpDS->CreateSoundBuffer(&dsbuf, &sglpDSB, NULL);\r\n\t\tif (error_code != DS_OK)\r\n\t\t\tDSErrMsg(error_code, 375, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\");\r\n\t}\r\n\r\n\tif (sglpDSB) {\r\n\t\tDSCAPS dsbcaps;\r\n\t\tdsbcaps.dwSize = sizeof(DSCAPS);\r\n\r\n\t\terror_code = sglpDS->GetCaps(&dsbcaps);\r\n\t\tif (error_code != DS_OK)\r\n\t\t\tDSErrMsg(error_code, 383, \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\");\r\n\r\n\t\tif (!music_track || !LoadWaveFormat(music_track, &format)) {\r\n\t\t\tmemset(&format, 0, sizeof(WAVEFORMATEX));\r\n\t\t\tformat.wFormatTag = WAVE_FORMAT_PCM;\r\n\t\t\tformat.nSamplesPerSec = 22050;\r\n\t\t\tformat.wBitsPerSample = 16;\r\n\t\t\tformat.cbSize = 0;\r\n\t\t}\r\n\r\n\t\tformat.nChannels = 2;\r\n\t\tformat.nBlockAlign = format.nChannels * format.wBitsPerSample / 8;\r\n\t\tformat.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;\r\n\r\n\t\tsglpDSB->SetFormat(&format);\r\n\t}\r\n}\r\n\r\nstatic HRESULT sound_DirectSoundCreate(LPGUID lpGuid, LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter)\r\n{\r\n\tHRESULT(WINAPI * DirectSoundCreate)\r\n\t(LPGUID lpGuid, LPDIRECTSOUND * ppDS, LPUNKNOWN pUnkOuter);\r\n\r\n\tif (hDsound_dll == NULL) {\r\n\t\thDsound_dll = LoadLibrary(\"dsound.dll\");\r\n\t}\r\n\tif (hDsound_dll == NULL) {\r\n\t\tErrDlg(IDD_DIALOG5, GetLastError(), \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\", 422);\r\n\t}\r\n\r\n\tDirectSoundCreate = (HRESULT(WINAPI *)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN))GetProcAddress(hDsound_dll, \"DirectSoundCreate\");\r\n\tif (DirectSoundCreate == NULL) {\r\n\t\tErrDlg(IDD_DIALOG5, GetLastError(), \"C:\\\\Src\\\\Diablo\\\\Source\\\\SOUND.CPP\", 427);\r\n\t}\r\n\treturn DirectSoundCreate(lpGuid, ppDS, pUnkOuter);\r\n}\r\n\r\nvoid snd_init(HWND hWnd)\r\n{\r\n\tint error_code;\r\n\tsnd_get_volume(\"Sound Volume\", &sglSoundVolume);\r\n\tgbSoundOn = sglSoundVolume > VOLUME_MIN;\r\n\r\n\tsnd_get_volume(\"Music Volume\", &sglMusicVolume);\r\n\tgbMusicOn = sglMusicVolume > VOLUME_MIN;\r\n\r\n\terror_code = sound_DirectSoundCreate(NULL, &sglpDS, NULL);\r\n\tif (error_code != DS_OK)\r\n\t\tsglpDS = NULL;\r\n\r\n\tif (sglpDS && sglpDS->SetCooperativeLevel(hWnd, DSSCL_EXCLUSIVE) == DS_OK)\r\n\t\tsound_create_primary_buffer(NULL);\r\n\r\n\tSVidInitialize(sglpDS);\r\n\tSFileDdaInitialize(sglpDS);\r\n\r\n\tgbSndInited = sglpDS != NULL;\r\n}\r\n\r\nvoid sound_cleanup()\r\n{\r\n\tsnd_update(TRUE);\r\n\tSVidDestroy();\r\n\tSFileDdaDestroy();\r\n\r\n\tif (sglpDS) {\r\n\t\tsglpDS->Release();\r\n\t\tsglpDS = NULL;\r\n\t}\r\n\r\n\tif (gbSndInited) {\r\n\t\tgbSndInited = FALSE;\r\n\t\tsnd_set_volume(\"Sound Volume\", sglSoundVolume);\r\n\t\tsnd_set_volume(\"Music Volume\", sglMusicVolume);\r\n\t}\r\n}\r\n\r\nvoid music_stop()\r\n{\r\n\tif (sghMusic) {\r\n\t\tSFileDdaEnd(sghMusic);\r\n\t\tSFileCloseFile(sghMusic);\r\n\t\tsghMusic = NULL;\r\n\t\tsgnMusicTrack = NUM_MUSIC;\r\n\t}\r\n}\r\n\r\nvoid music_start(int nTrack)\r\n{\r\n\tBOOL success;\r\n\r\n\tassert((DWORD)nTrack < NUM_MUSIC);\r\n\tmusic_stop();\r\n\tif (sglpDS && gbMusicOn) {\r\n#ifdef _DEBUG\r\n\t\tSFileEnableDirectAccess(FALSE);\r\n#endif\r\n\t\tsuccess = SFileOpenFile(sgszMusicTracks[nTrack], &sghMusic);\r\n#ifdef _DEBUG\r\n\t\tSFileEnableDirectAccess(TRUE);\r\n#endif\r\n\t\tsound_create_primary_buffer(sghMusic);\r\n\t\tif (!success) {\r\n\t\t\tsghMusic = NULL;\r\n\t\t} else {\r\n\t\t\tSFileDdaBeginEx(sghMusic, 0x40000, 0x40000, 0, sglMusicVolume, 0, 0);\r\n\t\t\tsgnMusicTrack = nTrack;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid sound_disable_music(BOOL disable)\r\n{\r\n\tif (disable) {\r\n\t\tmusic_stop();\r\n\t} else if (sgnMusicTrack != NUM_MUSIC) {\r\n\t\tmusic_start(sgnMusicTrack);\r\n\t}\r\n}\r\n\r\nint sound_get_or_set_music_volume(int volume)\r\n{\r\n\tif (volume == 1)\r\n\t\treturn sglMusicVolume;\r\n\r\n\tsglMusicVolume = volume;\r\n\r\n\tif (sghMusic)\r\n\t\tSFileDdaSetVolume(sghMusic, volume, 0);\r\n\r\n\treturn sglMusicVolume;\r\n}\r\n\r\nint sound_get_or_set_sound_volume(int volume)\r\n{\r\n\tif (volume == 1)\r\n\t\treturn sglSoundVolume;\r\n\r\n\tsglSoundVolume = volume;\r\n\r\n\treturn sglSoundVolume;\r\n}\r\n"
  },
  {
    "path": "Source/sound.h",
    "content": "/**\r\n * @file sound.h\r\n *\r\n * Interface of functions setting up the audio pipeline.\r\n */\r\n#ifndef __SOUND_H__\r\n#define __SOUND_H__\r\n\r\nextern BOOLEAN gbSndInited;\r\n\r\nvoid snd_update(BOOL bStopAll);\r\nvoid snd_stop_snd(TSnd *pSnd);\r\nBOOL snd_playing(TSnd *pSnd);\r\nvoid snd_play_snd(TSnd *pSnd, int lVolume, int lPan);\r\nTSnd *sound_file_load(const char *path);\r\nvoid sound_file_cleanup(TSnd *sound_file);\r\nvoid snd_init(HWND hWnd);\r\nvoid sound_cleanup();\r\nvoid music_stop();\r\nvoid music_start(int nTrack);\r\nvoid sound_disable_music(BOOL disable);\r\nint sound_get_or_set_music_volume(int volume);\r\nint sound_get_or_set_sound_volume(int volume);\r\n\r\n/* data */\r\n\r\nextern BOOLEAN gbMusicOn;\r\nextern BOOLEAN gbSoundOn;\r\nextern BOOLEAN gbDupSounds;\r\n\r\n#endif /* __SOUND_H__ */\r\n"
  },
  {
    "path": "Source/spelldat.cpp",
    "content": "/**\r\n * @file spelldat.cpp\r\n *\r\n * Implementation of all spell data.\r\n */\r\n#include \"all.h\"\r\n\r\n/** Data related to each spell ID. */\r\nSpellData spelldata[] = {\r\n\t// clang-format off\r\n\t// sName,    sManaCost, sType,           sNameText,            sSkillText, sBookLvl, sStaffLvl, sTargeted, sTownSpell, sMinInt, sSFX,     sMissiles[3],                         sManaAdj, sMinMana, sStaffMin, sStaffMax, sBookCost, sStaffCost\r\n\t{ SPL_NULL,          0, 0,               NULL,                 NULL,              0,         0, FALSE,     FALSE,            0, 0,        { 0,                 0,          0 },        0,        0,        40,        80,         0,          0 },\r\n\t{ SPL_FIREBOLT,      6, STYPE_FIRE,      \"Firebolt\",           \"Firebolt\",        1,         1, TRUE,      FALSE,           15, IS_CAST2, { MIS_FIREBOLT,      0,          0 },        1,        3,        40,        80,      1000,         50 },\r\n\t{ SPL_HEAL,          5, STYPE_MAGIC,     \"Healing\",            NULL,              1,         1, FALSE,     TRUE,            17, IS_CAST8, { MIS_HEAL,          0,          0 },        3,        1,        20,        40,      1000,         50 },\r\n\t{ SPL_LIGHTNING,    10, STYPE_LIGHTNING, \"Lightning\",          NULL,              4,         3, TRUE,      FALSE,           20, IS_CAST4, { MIS_LIGHTCTRL,     0,          0 },        1,        6,        20,        60,      3000,        150 },\r\n\t{ SPL_FLASH,        30, STYPE_LIGHTNING, \"Flash\",              NULL,              5,         4, FALSE,     FALSE,           33, IS_CAST4, { MIS_FLASH,         MIS_FLASH2, 0 },        2,       16,        20,        40,      7500,        500 },\r\n\t{ SPL_IDENTIFY,     13, STYPE_MAGIC,     \"Identify\",           \"Identify\",       -1,        -1, FALSE,     TRUE,            23, IS_CAST6, { MIS_IDENTIFY,      0,          0 },        2,        1,         8,        12,         0,        100 },\r\n\t{ SPL_FIREWALL,     28, STYPE_FIRE,      \"Fire Wall\",          NULL,              3,         2, TRUE,      FALSE,           27, IS_CAST2, { MIS_FIREWALLC,     0,          0 },        2,       16,         8,        16,      6000,        400 },\r\n\t{ SPL_TOWN,         35, STYPE_MAGIC,     \"Town Portal\",        NULL,              3,         3, TRUE,      FALSE,           20, IS_CAST6, { MIS_TOWN,          0,          0 },        3,       18,         8,        12,      3000,        200 },\r\n#ifndef SPAWN\r\n\t{ SPL_STONE,        60, STYPE_MAGIC,     \"Stone Curse\",        NULL,              6,         5, TRUE,      FALSE,           51, IS_CAST2, { MIS_STONE,         0,          0 },        3,       40,         8,        16,     12000,        800 },\r\n#else\r\n\t{ SPL_STONE,        60, STYPE_MAGIC,     \"Stone Curse\",        NULL,             -1,        -1, TRUE,      FALSE,           51, IS_CAST2, { MIS_STONE,         0,          0 },        3,       40,         8,        16,     12000,        800 },\r\n#endif\r\n\t{ SPL_INFRA,        40, STYPE_MAGIC,     \"Infravision\",        NULL,             -1,        -1, FALSE,     FALSE,           36, IS_CAST8, { MIS_INFRA,         0,          0 },        5,       20,         0,         0,         0,        600 },\r\n\t{ SPL_RNDTELEPORT,  12, STYPE_MAGIC,     \"Phasing\",            NULL,              7,         6, FALSE,     FALSE,           39, IS_CAST2, { MIS_RNDTELEPORT,   0,          0 },        2,        4,        40,        80,      3500,        200 },\r\n\t{ SPL_MANASHIELD,   33, STYPE_MAGIC,     \"Mana Shield\",        NULL,              6,         5, FALSE,     FALSE,           25, IS_CAST2, { MIS_MANASHIELD,    0,          0 },        0,       33,         4,        10,     16000,       1200 },\r\n\t{ SPL_FIREBALL,     16, STYPE_FIRE,      \"Fireball\",           NULL,              8,         7, TRUE,      FALSE,           48, IS_CAST2, { MIS_FIREBALL,      0,          0 },        1,       10,        40,        80,      8000,        300 },\r\n#ifndef SPAWN\r\n\t{ SPL_GUARDIAN,     50, STYPE_FIRE,      \"Guardian\",           NULL,              9,         8, TRUE,      FALSE,           61, IS_CAST2, { MIS_GUARDIAN,      0,          0 },        2,       30,        16,        32,     14000,        950 },\r\n#else\r\n\t{ SPL_GUARDIAN,     50, STYPE_FIRE,      \"Guardian\",           NULL,             -1,        -1, TRUE,      FALSE,           61, IS_CAST2, { MIS_GUARDIAN,      0,          0 },        2,       30,        16,        32,     14000,        950 },\r\n#endif\r\n\t{ SPL_CHAIN,        30, STYPE_LIGHTNING, \"Chain Lightning\",    NULL,              8,         7, FALSE,     FALSE,           54, IS_CAST2, { MIS_CHAIN,         0,          0 },        1,       18,        20,        60,     11000,        750 },\r\n\t{ SPL_WAVE,         35, STYPE_FIRE,      \"Flame Wave\",         NULL,              9,         8, TRUE,      FALSE,           54, IS_CAST2, { MIS_WAVE,          0,          0 },        3,       20,        20,        40,     10000,        650 },\r\n\t{ SPL_DOOMSERP,      0, STYPE_LIGHTNING, \"Doom Serpents\",      NULL,             -1,        -1, FALSE,     FALSE,            0, IS_CAST2, { 0,                 0,          0 },        0,        0,        40,        80,         0,          0 },\r\n\t{ SPL_BLODRIT,       0, STYPE_MAGIC,     \"Blood Ritual\",       NULL,             -1,        -1, FALSE,     FALSE,            0, IS_CAST2, { 0,                 0,          0 },        0,        0,        40,        80,         0,          0 },\r\n#ifndef HELLFIRE\r\n\t{ SPL_NOVA,         60, STYPE_MAGIC,     \"Nova\",               NULL,             -1,        10, FALSE,     FALSE,           87, IS_CAST4, { MIS_NOVA,          0,          0 },        3,       35,        16,        32,     21000,       1300 },\r\n#else\r\n\t{ SPL_NOVA,         60, STYPE_MAGIC,     \"Nova\",               NULL,             14,        10, FALSE,     FALSE,           87, IS_CAST4, { MIS_NOVA,          0,          0 },        3,       35,        16,        32,     21000,       1300 },\r\n#endif\r\n\t{ SPL_INVISIBIL,     0, STYPE_MAGIC,     \"Invisibility\",       NULL,             -1,        -1, FALSE,     FALSE,            0, IS_CAST2, { 0,                 0,          0 },        0,        0,        40,        80,         0,          0 },\r\n\t{ SPL_FLAME,        11, STYPE_FIRE,      \"Inferno\",            NULL,              3,         2, TRUE,      FALSE,           20, IS_CAST2, { MIS_FLAMEC,        0,          0 },        1,        6,        20,        40,      2000,        100 },\r\n#ifndef SPAWN\r\n\t{ SPL_GOLEM,       100, STYPE_FIRE,      \"Golem\",              NULL,             11,         9, FALSE,     FALSE,           81, IS_CAST2, { MIS_GOLEM,         0,          0 },        6,       60,        16,        32,     18000,       1100 },\r\n#else\r\n\t{ SPL_GOLEM,       100, STYPE_FIRE,      \"Golem\",              NULL,             -1,        -1, FALSE,     FALSE,           81, IS_CAST2, { MIS_GOLEM,         0,          0 },        6,       60,        16,        32,     18000,       1100 },\r\n#endif\r\n#ifndef HELLFIRE\r\n\t{ SPL_BLODBOIL,      0, STYPE_LIGHTNING, \"Blood Boil\",         NULL,             -1,        -1, TRUE,      FALSE,            0, IS_CAST8, { 0,                 0,          0 },        0,        0,         0,         0,         0,          0 },\r\n#else\r\n\t{ SPL_BLODBOIL,     15, STYPE_MAGIC,     \"Rage\",               \"Rage\",           -1,        -1, FALSE,     FALSE,            0, IS_CAST8, { MIS_BLODBOIL,      0,          0 },        1,        1,         0,         0,         0,          0 },\r\n#endif\r\n\t{ SPL_TELEPORT,     35, STYPE_MAGIC,     \"Teleport\",           NULL,             14,        12, TRUE,      FALSE,          105, IS_CAST6, { MIS_TELEPORT,      0,          0 },        3,       15,        16,        32,     20000,       1250 },\r\n#if !defined(SPAWN) && !defined(HELLFIRE)\r\n\t{ SPL_APOCA,       150, STYPE_FIRE,      \"Apocalypse\",         NULL,             -1,        15, FALSE,     FALSE,          149, IS_CAST2, { MIS_APOCA,         0,          0 },        6,       90,         8,        12,     30000,       2000 },\r\n#elif !defined(SPAWN)\r\n\t{ SPL_APOCA,       150, STYPE_FIRE,      \"Apocalypse\",         NULL,             19,        15, FALSE,     FALSE,          149, IS_CAST2, { MIS_APOCA,         0,          0 },        6,       90,         8,        12,     30000,       2000 },\r\n#else\r\n\t{ SPL_APOCA,       150, STYPE_FIRE,      \"Apocalypse\",         NULL,             -1,        -1, FALSE,     FALSE,          149, IS_CAST2, { MIS_APOCA,         0,          0 },        6,       90,         8,        12,     30000,       2000 },\r\n#endif\r\n\t{ SPL_ETHEREALIZE, 100, STYPE_MAGIC,     \"Etherealize\",        NULL,             -1,        -1, FALSE,     FALSE,           93, IS_CAST2, { MIS_ETHEREALIZE,   0,          0 },        0,      100,         2,         6,     26000,       1600 },\r\n\t{ SPL_REPAIR,        0, STYPE_MAGIC,     \"Item Repair\",        \"Item Repair\",    -1,        -1, FALSE,     TRUE,            -1, IS_CAST6, { MIS_REPAIR,        0,          0 },        0,        0,        40,        80,         0,          0 },\r\n\t{ SPL_RECHARGE,      0, STYPE_MAGIC,     \"Staff Recharge\",     \"Staff Recharge\", -1,        -1, FALSE,     TRUE,            -1, IS_CAST6, { MIS_RECHARGE,      0,          0 },        0,        0,        40,        80,         0,          0 },\r\n\t{ SPL_DISARM,        0, STYPE_MAGIC,     \"Trap Disarm\",        \"Trap Disarm\",    -1,        -1, FALSE,     FALSE,           -1, IS_CAST6, { MIS_DISARM,        0,          0 },        0,        0,        40,        80,         0,          0 },\r\n#ifndef SPAWN\r\n\t{ SPL_ELEMENT,      35, STYPE_FIRE,      \"Elemental\",          NULL,              8,         6, FALSE,     FALSE,           68, IS_CAST2, { MIS_ELEMENT,       0,          0 },        2,       20,        20,        60,     10500,        700 },\r\n#else\r\n\t{ SPL_ELEMENT,      35, STYPE_FIRE,      \"Elemental\",          NULL,             -1,        -1, FALSE,     FALSE,           68, IS_CAST2, { MIS_ELEMENT,       0,          0 },        2,       20,        20,        60,     10500,        700 },\r\n#endif\r\n\t{ SPL_CBOLT,         6, STYPE_LIGHTNING, \"Charged Bolt\",       NULL,              1,         1, TRUE,      FALSE,           25, IS_CAST2, { MIS_CBOLT,         0,          0 },        1,        6,        40,        80,      1000,         50 },\r\n\t{ SPL_HBOLT,         7, STYPE_MAGIC,     \"Holy Bolt\",          NULL,              1,         1, TRUE,      FALSE,           20, IS_CAST2, { MIS_HBOLT,         0,          0 },        1,        3,        40,        80,      1000,         50 },\r\n\t{ SPL_RESURRECT,    20, STYPE_MAGIC,     \"Resurrect\",          NULL,             -1,         5, FALSE,     TRUE,            30, IS_CAST8, { MIS_RESURRECT,     0,          0 },        0,       20,         4,        10,      4000,        250 },\r\n\t{ SPL_TELEKINESIS,  15, STYPE_MAGIC,     \"Telekinesis\",        NULL,              2,         2, FALSE,     FALSE,           33, IS_CAST2, { MIS_TELEKINESIS,   0,          0 },        2,        8,        20,        40,      2500,        200 },\r\n\t{ SPL_HEALOTHER,     5, STYPE_MAGIC,     \"Heal Other\",         NULL,              1,         1, FALSE,     TRUE,            17, IS_CAST8, { MIS_HEALOTHER,     0,          0 },        3,        1,        20,        40,      1000,         50 },\r\n#ifndef SPAWN\r\n\t{ SPL_FLARE,        25, STYPE_MAGIC,     \"Blood Star\",         NULL,             14,        13, FALSE,     FALSE,           70, IS_CAST2, { MIS_FLARE,         0,          0 },        2,       14,        20,        60,     27500,       1800 },\r\n\t{ SPL_BONESPIRIT,   24, STYPE_MAGIC,     \"Bone Spirit\",        NULL,              9,         7, FALSE,     FALSE,           34, IS_CAST2, { MIS_BONESPIRIT,    0,          0 },        1,       12,        20,        60,     11500,        800 },\r\n#else\r\n\t{ SPL_FLARE,        25, STYPE_MAGIC,     \"Blood Star\",         NULL,             -1,        -1, FALSE,     FALSE,           70, IS_CAST2, { MIS_FLARE,         0,          0 },        2,       14,        20,        60,     27500,       1800 },\r\n\t{ SPL_BONESPIRIT,   24, STYPE_MAGIC,     \"Bone Spirit\",        NULL,             -1,        -1, FALSE,     FALSE,           34, IS_CAST2, { MIS_BONESPIRIT,    0,          0 },        1,       12,        20,        60,     11500,        800 },\r\n#endif\r\n#ifdef HELLFIRE\r\n\t{ SPL_MANA,        255, STYPE_MAGIC,     \"Mana\",               NULL,             -1,         5, FALSE,     TRUE,            17, IS_CAST8, { MIS_MANA,          0,          0 },        3,        1,        12,        24,      1000,         50 },\r\n\t{ SPL_MAGI,        255, STYPE_MAGIC,     \"the Magi\",           NULL,             -1,        20, FALSE,     TRUE,            45, IS_CAST8, { MIS_MAGI,          0,          0 },        3,        1,        15,        30,    100000,        200 },\r\n\t{ SPL_JESTER,      255, STYPE_MAGIC,     \"the Jester\",         NULL,             -1,         4, TRUE,      FALSE,           30, IS_CAST8, { MIS_JESTER,        0,          0 },        3,        1,        15,        30,    100000,        200 },\r\n\t{ SPL_LIGHTWALL,    28, STYPE_LIGHTNING, \"Lightning Wall\",     NULL,              3,         2, TRUE,      FALSE,           27, IS_CAST4, { MIS_LIGHTNINGWALL, 0,          0 },        2,       16,         8,        16,      6000,        400 },\r\n\t{ SPL_IMMOLAT,      60, STYPE_FIRE,      \"Immolation\",         NULL,             14,        10, FALSE,     FALSE,           87, IS_CAST2, { MIS_IMMOLATION,    0,          0 },        3,       35,        16,        32,     21000,       1300 },\r\n\t{ SPL_WARP,         35, STYPE_MAGIC,     \"Warp\",               NULL,              3,         3, FALSE,     FALSE,           25, IS_CAST6, { MIS_WARP,          0,          0 },        3,       18,         8,        12,      3000,        200 },\r\n\t{ SPL_REFLECT,      35, STYPE_MAGIC,     \"Reflect\",            NULL,              3,         3, FALSE,     FALSE,           25, IS_CAST6, { MIS_REFLECT,       0,          0 },        3,       15,         8,        12,      3000,        200 },\r\n\t{ SPL_BERSERK,      35, STYPE_MAGIC,     \"Berserk\",            NULL,              3,         3, TRUE,      FALSE,           35, IS_CAST6, { MIS_BERSERK,       0,          0 },        3,       15,         8,        12,      3000,        200 },\r\n\t{ SPL_FIRERING,     28, STYPE_FIRE,      \"Ring of Fire\",       NULL,              5,         5, FALSE,     FALSE,           27, IS_CAST2, { MIS_FIRERING,      0,          0 },        2,       16,         8,        16,      6000,        400 },\r\n\t{ SPL_SEARCH,       15, STYPE_MAGIC,     \"Search\",             \"Search\",          1,         3, FALSE,     FALSE,           25, IS_CAST6, { MIS_SEARCH,        0,          0 },        1,        1,         8,        12,      3000,        200 },\r\n\t{ SPL_RUNEFIRE,    255, STYPE_MAGIC,     \"Rune of Fire\",       NULL,             -1,        -1, TRUE,      FALSE,           48, IS_CAST8, { MIS_RUNEFIRE,      0,          0 },        1,       10,        40,        80,      8000,        300 },\r\n\t{ SPL_RUNELIGHT,   255, STYPE_MAGIC,     \"Rune of Light\",      NULL,             -1,        -1, TRUE,      FALSE,           48, IS_CAST8, { MIS_RUNELIGHT,     0,          0 },        1,       10,        40,        80,      8000,        300 },\r\n\t{ SPL_RUNENOVA,    255, STYPE_MAGIC,     \"Rune of Nova\",       NULL,             -1,        -1, TRUE,      FALSE,           48, IS_CAST8, { MIS_RUNENOVA,      0,          0 },        1,       10,        40,        80,      8000,        300 },\r\n\t{ SPL_RUNEIMMOLAT, 255, STYPE_MAGIC,     \"Rune of Immolation\", NULL,             -1,        -1, TRUE,      FALSE,           48, IS_CAST8, { MIS_RUNEIMMOLAT,   0,          0 },        1,       10,        40,        80,      8000,        300 },\r\n\t{ SPL_RUNESTONE,   255, STYPE_MAGIC,     \"Rune of Stone\",      NULL,             -1,        -1, TRUE,      FALSE,           48, IS_CAST8, { MIS_RUNESTONE,     0,          0 },        1,       10,        40,        80,      8000,        300 },\r\n#endif\r\n\t// clang-format on\r\n};\r\n"
  },
  {
    "path": "Source/spelldat.h",
    "content": "/**\r\n * @file spelldat.h\r\n *\r\n * Interface of all spell data.\r\n */\r\n#ifndef __SPELLDAT_H__\r\n#define __SPELLDAT_H__\r\n\r\nextern SpellData spelldata[];\r\n\r\n#endif /* __SPELLDAT_H__ */\r\n"
  },
  {
    "path": "Source/spells.cpp",
    "content": "/**\r\n * @file spells.cpp\r\n *\r\n * Implementation of functionality for casting player spells.\r\n */\r\n#include \"all.h\"\r\n\r\nint GetManaAmount(int id, int sn)\r\n{\r\n\tint ma; // mana amount\r\n\r\n\t// mana adjust\r\n\tint adj = 0;\r\n\r\n\t// spell level\r\n\tint sl = plr[id]._pSplLvl[sn] + plr[id]._pISplLvlAdd - 1;\r\n\r\n\tif (sl < 0) {\r\n\t\tsl = 0;\r\n\t}\r\n\r\n\tif (sl > 0) {\r\n\t\tadj = sl * spelldata[sn].sManaAdj;\r\n\t}\r\n\tif (sn == SPL_FIREBOLT) {\r\n\t\tadj >>= 1;\r\n\t}\r\n\tif (sn == SPL_RESURRECT && sl > 0) {\r\n\t\tadj = sl * (spelldata[SPL_RESURRECT].sManaCost / 8);\r\n\t}\r\n\r\n\tif (spelldata[sn].sManaCost == 255) {\r\n\t\tma = ((BYTE)plr[id]._pMaxManaBase - adj);\r\n\t} else {\r\n\t\tma = (spelldata[sn].sManaCost - adj);\r\n\t}\r\n\r\n\tma <<= 6;\r\n\r\n\tif (sn == SPL_HEAL) {\r\n\t\tma = (spelldata[SPL_HEAL].sManaCost + 2 * plr[id]._pLevel - adj) << 6;\r\n\t}\r\n\tif (sn == SPL_HEALOTHER) {\r\n\t\tma = (spelldata[SPL_HEAL].sManaCost + 2 * plr[id]._pLevel - adj) << 6;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif (plr[id]._pClass == PC_SORCERER) {\r\n\t\tma >>= 1;\r\n\t} else if (plr[id]._pClass == PC_ROGUE || plr[id]._pClass == PC_MONK || plr[id]._pClass == PC_BARD) {\r\n\t\tma -= ma >> 2;\r\n\t}\r\n#else\r\n\tif (plr[id]._pClass == PC_ROGUE) {\r\n\t\tma -= ma >> 2;\r\n\t}\r\n#endif\r\n\r\n\tif (spelldata[sn].sMinMana > ma >> 6) {\r\n\t\tma = spelldata[sn].sMinMana << 6;\r\n\t}\r\n\r\n\treturn ma * (100 - plr[id]._pISplCost) / 100;\r\n}\r\n\r\nvoid UseMana(int id, int sn)\r\n{\r\n\tint ma; // mana cost\r\n\r\n\tif (id == myplr) {\r\n\t\tswitch (plr[id]._pSplType) {\r\n\t\tcase RSPLTYPE_SKILL:\r\n\t\tcase RSPLTYPE_INVALID:\r\n\t\t\tbreak;\r\n\t\tcase RSPLTYPE_SCROLL:\r\n\t\t\tRemoveScroll(id);\r\n\t\t\tbreak;\r\n\t\tcase RSPLTYPE_CHARGES:\r\n\t\t\tUseStaffCharge(id);\r\n\t\t\tbreak;\r\n\t\tcase RSPLTYPE_SPELL:\r\n#ifdef _DEBUG\r\n\t\t\tif (!debug_mode_key_inverted_v) {\r\n#endif\r\n\t\t\t\tma = GetManaAmount(id, sn);\r\n\t\t\t\tplr[id]._pMana -= ma;\r\n\t\t\t\tplr[id]._pManaBase -= ma;\r\n\t\t\t\tdrawmanaflag = TRUE;\r\n#ifdef _DEBUG\r\n\t\t\t}\r\n#endif\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL CheckSpell(int id, int sn, char st, BOOL manaonly)\r\n{\r\n\tBOOL result;\r\n\r\n#ifdef _DEBUG\r\n\tif (debug_mode_key_inverted_v)\r\n\t\treturn TRUE;\r\n#endif\r\n\r\n\tresult = TRUE;\r\n\tif (!manaonly && pcurs != CURSOR_HAND) {\r\n\t\tresult = FALSE;\r\n\t} else {\r\n\t\tif (st != RSPLTYPE_SKILL) {\r\n\t\t\tif (GetSpellLevel(id, sn) <= 0) {\r\n\t\t\t\tresult = FALSE;\r\n\t\t\t} else {\r\n\t\t\t\tresult = plr[id]._pMana >= GetManaAmount(id, sn);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nvoid CastSpell(int id, int spl, int sx, int sy, int dx, int dy, int caster, int spllvl)\r\n{\r\n\tint i;\r\n\tint dir; // missile direction\r\n\r\n\tswitch (caster) {\r\n\tcase TARGET_PLAYERS:\r\n\t\tdir = monster[id]._mdir;\r\n\t\tbreak;\r\n\tcase TARGET_MONSTERS:\r\n\t\t// caster must be 0 already in this case, but oh well,\r\n\t\t// it's needed to generate the right code\r\n\t\tcaster = TARGET_MONSTERS;\r\n\t\tdir = plr[id]._pdir;\r\n\r\n#ifdef HELLFIRE\r\n\t\tif (spl == SPL_FIREWALL || spl == SPL_LIGHTWALL) {\r\n#else\r\n\t\tif (spl == SPL_FIREWALL) {\r\n#endif\r\n\t\t\tdir = plr[id]._pVar3;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\r\n\tfor (i = 0; spelldata[spl].sMissiles[i] != MIS_ARROW && i < 3; i++) {\r\n\t\tAddMissile(sx, sy, dx, dy, dir, spelldata[spl].sMissiles[i], caster, id, 0, spllvl);\r\n\t}\r\n\r\n\tif (spelldata[spl].sMissiles[0] == MIS_TOWN) {\r\n\t\tUseMana(id, SPL_TOWN);\r\n\t}\r\n\tif (spelldata[spl].sMissiles[0] == MIS_CBOLT) {\r\n\t\tUseMana(id, SPL_CBOLT);\r\n\r\n\t\tfor (i = (spllvl >> 1) + 3; i > 0; i--) {\r\n\t\t\tAddMissile(sx, sy, dx, dy, dir, MIS_CBOLT, caster, id, 0, spllvl);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void PlacePlayer(int pnum)\r\n{\r\n\tint nx, ny, max, min, x, y;\r\n\tDWORD i;\r\n\tBOOL done;\r\n\r\n\tif (plr[pnum].plrlevel == currlevel) {\r\n\t\tfor (i = 0; i < 8; i++) {\r\n\t\t\tnx = plr[pnum]._px + plrxoff2[i];\r\n\t\t\tny = plr[pnum]._py + plryoff2[i];\r\n\r\n\t\t\tif (PosOkPlayer(pnum, nx, ny)) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!PosOkPlayer(pnum, nx, ny)) {\r\n\t\t\tdone = FALSE;\r\n\r\n\t\t\tfor (max = 1, min = -1; min > -50 && !done; max++, min--) {\r\n\t\t\t\tfor (y = min; y <= max && !done; y++) {\r\n\t\t\t\t\tny = plr[pnum]._py + y;\r\n\r\n\t\t\t\t\tfor (x = min; x <= max && !done; x++) {\r\n\t\t\t\t\t\tnx = plr[pnum]._px + x;\r\n\r\n\t\t\t\t\t\tif (PosOkPlayer(pnum, nx, ny)) {\r\n\t\t\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tplr[pnum]._px = nx;\r\n\t\tplr[pnum]._py = ny;\r\n\r\n\t\tdPlayer[nx][ny] = pnum + 1;\r\n\r\n\t\tif (pnum == myplr) {\r\n\t\t\tViewX = nx;\r\n\t\t\tViewY = ny;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @param pnum player index\r\n * @param rid target player index\r\n */\r\nvoid DoResurrect(int pnum, int rid)\r\n{\r\n\tint hp;\r\n\r\n\tif ((char)rid != -1) {\r\n\t\tAddMissile(plr[rid]._px, plr[rid]._py, plr[rid]._px, plr[rid]._py, 0, MIS_RESURRECTBEAM, TARGET_MONSTERS, pnum, 0, 0);\r\n\t}\r\n\r\n\tif (pnum == myplr) {\r\n\t\tNewCursor(CURSOR_HAND);\r\n\t}\r\n\r\n\tif ((char)rid != -1 && plr[rid]._pHitPoints == 0) {\r\n\t\tif (rid == myplr) {\r\n\t\t\tdeathflag = FALSE;\r\n\t\t\tgamemenu_off();\r\n\t\t\tdrawhpflag = TRUE;\r\n\t\t\tdrawmanaflag = TRUE;\r\n\t\t}\r\n\r\n\t\tClrPlrPath(rid);\r\n\t\tplr[rid].destAction = ACTION_NONE;\r\n\t\tplr[rid]._pInvincible = FALSE;\r\n#ifndef HELLFIRE\r\n\t\tPlacePlayer(rid);\r\n#endif\r\n\r\n\t\thp = 10 << 6;\r\n#ifndef HELLFIRE\r\n\t\tif (plr[rid]._pMaxHPBase < (10 << 6)) {\r\n\t\t\thp = plr[rid]._pMaxHPBase;\r\n\t\t}\r\n#endif\r\n\t\tSetPlayerHitPoints(rid, hp);\r\n\r\n\t\tplr[rid]._pHPBase = plr[rid]._pHitPoints + (plr[rid]._pMaxHPBase - plr[rid]._pMaxHP); // CODEFIX: does the same stuff as SetPlayerHitPoints above, can be removed\r\n\t\tplr[rid]._pMana = 0;\r\n\t\tplr[rid]._pManaBase = plr[rid]._pMana + (plr[rid]._pMaxManaBase - plr[rid]._pMaxMana);\r\n\r\n\t\tCalcPlrInv(rid, TRUE);\r\n\r\n\t\tif (plr[rid].plrlevel == currlevel) {\r\n\t\t\tStartStand(rid, plr[rid]._pdir);\r\n\t\t} else {\r\n\t\t\tplr[rid]._pmode = PM_STAND;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid DoHealOther(int pnum, int rid)\r\n{\r\n\tint i, j, hp;\r\n\r\n\tif (pnum == myplr) {\r\n\t\tNewCursor(CURSOR_HAND);\r\n\t}\r\n\r\n\tif ((char)rid != -1 && (plr[rid]._pHitPoints >> 6) > 0) {\r\n\t\thp = (random_(57, 10) + 1) << 6;\r\n\r\n\t\tfor (i = 0; i < plr[pnum]._pLevel; i++) {\r\n\t\t\thp += (random_(57, 4) + 1) << 6;\r\n\t\t}\r\n\r\n\t\tfor (j = 0; j < GetSpellLevel(pnum, SPL_HEALOTHER); ++j) {\r\n\t\t\thp += (random_(57, 6) + 1) << 6;\r\n\t\t}\r\n\r\n#ifdef HELLFIRE\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR || plr[pnum]._pClass == PC_BARBARIAN) {\r\n\t\t\thp <<= 1;\r\n\t\t} else if (plr[pnum]._pClass == PC_ROGUE || plr[pnum]._pClass == PC_BARD) {\r\n\t\t\thp += hp >> 1;\r\n\t\t} else if (plr[pnum]._pClass == PC_MONK) {\r\n\t\t\thp *= 3;\r\n\t\t}\r\n#else\r\n\t\tif (plr[pnum]._pClass == PC_WARRIOR) {\r\n\t\t\thp <<= 1;\r\n\t\t}\r\n\r\n\t\tif (plr[pnum]._pClass == PC_ROGUE) {\r\n\t\t\thp += hp >> 1;\r\n\t\t}\r\n#endif\r\n\r\n\t\tplr[rid]._pHitPoints += hp;\r\n\r\n\t\tif (plr[rid]._pHitPoints > plr[rid]._pMaxHP) {\r\n\t\t\tplr[rid]._pHitPoints = plr[rid]._pMaxHP;\r\n\t\t}\r\n\r\n\t\tplr[rid]._pHPBase += hp;\r\n\r\n\t\tif (plr[rid]._pHPBase > plr[rid]._pMaxHPBase) {\r\n\t\t\tplr[rid]._pHPBase = plr[rid]._pMaxHPBase;\r\n\t\t}\r\n\r\n\t\tdrawhpflag = TRUE;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/spells.h",
    "content": "/**\r\n * @file spells.h\r\n *\r\n * Interface of functionality for casting player spells.\r\n */\r\n#ifndef __SPELLS_H__\r\n#define __SPELLS_H__\r\n\r\nint GetManaAmount(int id, int sn);\r\nvoid UseMana(int id, int sn);\r\nBOOL CheckSpell(int id, int sn, char st, BOOL manaonly);\r\nvoid CastSpell(int id, int spl, int sx, int sy, int dx, int dy, int caster, int spllvl);\r\nvoid DoResurrect(int pnum, int rid);\r\nvoid DoHealOther(int pnum, int rid);\r\n\r\n#endif /* __SPELLS_H__ */\r\n"
  },
  {
    "path": "Source/stores.cpp",
    "content": "/**\r\n * @file stores.cpp\r\n *\r\n * Implementation of functionality for stores and towner dialogs.\r\n */\r\n#include \"all.h\"\r\n\r\nint stextup;\r\nint storenumh;\r\nint stextlhold;\r\nItemStruct boyitem;\r\nint stextshold;\r\nItemStruct premiumitem[SMITH_PREMIUM_ITEMS];\r\nBYTE *pSTextBoxCels;\r\nint premiumlevel;\r\nint talker;\r\nSTextStruct stext[STORE_LINES];\r\nchar stextsize;\r\n\r\nint stextsmax;\r\nint InStoreFlag; /** current frame # for the pentagram selector */\r\nItemStruct storehold[48];\r\nint gossipstart;\r\nItemStruct witchitem[WITCH_ITEMS];\r\nBOOL stextscrl;\r\nint numpremium;\r\nItemStruct healitem[20];\r\nItemStruct golditem;\r\nchar storehidx[48];\r\nBYTE *pSTextSlidCels;\r\nint stextvhold;\r\nint stextsel;\r\nchar stextscrldbtn;\r\nint gossipend;\r\nBYTE *pSPentSpn2Cels;\r\nint stextsval;\r\nint boylevel;\r\nItemStruct smithitem[SMITH_ITEMS];\r\nint stextdown;\r\nchar stextscrlubtn;\r\nchar stextflag;\r\n\r\nint SStringY[24] = {\r\n\t0,\r\n\t12,\r\n\t24,\r\n\t36,\r\n\t48,\r\n\t60,\r\n\t72,\r\n\t84,\r\n\t96,\r\n\t108,\r\n\t120,\r\n\t132,\r\n\t144,\r\n\t156,\r\n\t168,\r\n\t180,\r\n\t192,\r\n\t204,\r\n\t216,\r\n\t228,\r\n\t240,\r\n\t252,\r\n\t264,\r\n\t276\r\n};\r\n/** Maps from towner IDs to NPC names. */\r\nconst char *const talkname[9] = {\r\n\t\"Griswold\",\r\n\t\"Pepin\",\r\n\t\"\",\r\n\t\"Ogden\",\r\n\t\"Cain\",\r\n\t\"Farnham\",\r\n\t\"Adria\",\r\n\t\"Gillian\",\r\n\t\"Wirt\"\r\n};\r\n\r\nvoid InitStores()\r\n{\r\n\tint i;\r\n\r\n\tpSTextBoxCels = LoadFileInMem(\"Data\\\\TextBox2.CEL\", NULL);\r\n\tpSPentSpn2Cels = LoadFileInMem(\"Data\\\\PentSpn2.CEL\", NULL);\r\n\tpSTextSlidCels = LoadFileInMem(\"Data\\\\TextSlid.CEL\", NULL);\r\n\tClearSText(0, STORE_LINES);\r\n\tstextflag = STORE_NONE;\r\n\tInStoreFlag = 1;\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tnumpremium = 0;\r\n\tpremiumlevel = 1;\r\n\r\n\tfor (i = 0; i < SMITH_PREMIUM_ITEMS; i++)\r\n\t\tpremiumitem[i]._itype = ITYPE_NONE;\r\n\r\n\tboyitem._itype = ITYPE_NONE;\r\n\tboylevel = 0;\r\n}\r\n\r\nvoid SetupTownStores()\r\n{\r\n\tint i, l;\r\n\r\n\tSetRndSeed(glSeedTbl[currlevel] * GetTickCount());\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tl = 0;\r\n\t\tfor (i = 0; i < NUMLEVELS; i++) {\r\n\t\t\tif (plr[myplr]._pLvlVisited[i])\r\n\t\t\t\tl = i;\r\n\t\t}\r\n\t} else {\r\n\t\tl = plr[myplr]._pLevel >> 1;\r\n\t}\r\n\tl += 2;\r\n\tif (l < 6)\r\n\t\tl = 6;\r\n\tif (l > 16)\r\n\t\tl = 16;\r\n\tSpawnStoreGold();\r\n\tSpawnSmith(l);\r\n\tSpawnWitch(l);\r\n\tSpawnHealer(l);\r\n\tSpawnBoy(plr[myplr]._pLevel);\r\n#ifdef HELLFIRE\r\n\tSpawnPremium(myplr);\r\n#else\r\n\tSpawnPremium(plr[myplr]._pLevel);\r\n#endif\r\n}\r\n\r\nvoid FreeStoreMem()\r\n{\r\n\tMemFreeDbg(pSTextBoxCels);\r\n\tMemFreeDbg(pSPentSpn2Cels);\r\n\tMemFreeDbg(pSTextSlidCels);\r\n}\r\n\r\nvoid DrawSTextBack()\r\n{\r\n\tCelDraw(PANEL_X + 344, 327 + SCREEN_Y, pSTextBoxCels, 1, 271);\r\n\r\n#define TRANS_RECT_X (PANEL_LEFT + 347)\r\n#define TRANS_RECT_Y 28\r\n#define TRANS_RECT_WIDTH 265\r\n#define TRANS_RECT_HEIGHT 297\r\n#include \"asm_trans_rect.inc\"\r\n}\r\n\r\nvoid PrintSString(int x, int y, BOOL cjustflag, const char *str, char col, int val)\r\n{\r\n\tint len, width, off, i, k, s;\r\n\tint xx, yy;\r\n\tBYTE c;\r\n\tchar valstr[32];\r\n\r\n\ts = SStringY[y] + stext[y]._syoff;\r\n\tif (stextsize != 0)\r\n\t\txx = PANEL_X + 32;\r\n\telse\r\n\t\txx = PANEL_X + 352;\r\n\toff = xx + x + PitchTbl[s + 44 + SCREEN_Y];\r\n\tlen = strlen(str);\r\n\tif (stextsize != 0)\r\n\t\tyy = 577;\r\n\telse\r\n\t\tyy = 257;\r\n\tk = 0;\r\n\tif (cjustflag) {\r\n\t\twidth = 0;\r\n\t\tfor (i = 0; i < len; i++)\r\n\t\t\twidth += fontkern[fontframe[gbFontTransTbl[(BYTE)str[i]]]] + 1;\r\n\t\tif (width < yy)\r\n\t\t\tk = (yy - width) >> 1;\r\n\t\toff += k;\r\n\t}\r\n\tif (stextsel == y) {\r\n\t\tCelDraw(cjustflag ? xx + x + k - 20 : xx + x - 20, s + 45 + SCREEN_Y, pSPentSpn2Cels, InStoreFlag, 12);\r\n\t}\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tc = fontframe[gbFontTransTbl[(BYTE)str[i]]];\r\n\t\tk += fontkern[c] + 1;\r\n\t\tif (c != 0 && k <= yy) {\r\n\t\t\tPrintChar(off, c, col);\r\n\t\t}\r\n\t\toff += fontkern[c] + 1;\r\n\t}\r\n\tif (!cjustflag && val >= 0) {\r\n\t\tsprintf(valstr, \"%i\", val);\r\n\t\toff = PitchTbl[s + 44 + SCREEN_Y] + PANEL_X + 592 - x;\r\n\t\tlen = strlen(valstr);\r\n\t\tfor (i = len - 1; i >= 0; i--) {\r\n\t\t\tc = fontframe[gbFontTransTbl[(BYTE)valstr[i]]];\r\n\t\t\toff -= fontkern[c] + 1;\r\n\t\t\tif (c != 0) {\r\n\t\t\t\tPrintChar(off, c, col);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (stextsel == y) {\r\n\t\tCelDraw(cjustflag ? (xx + x + k + 4) : (PANEL_X + 596 - x), s + 45 + SCREEN_Y, pSPentSpn2Cels, InStoreFlag, 12);\r\n\t}\r\n}\r\n\r\nvoid DrawSLine(int y)\r\n{\r\n\tint xy, yy, width, line, sy;\r\n\r\n\tsy = SStringY[y];\r\n\tif (stextsize) {\r\n\t\txy = SCREENXY(PANEL_LEFT + 26, 25);\r\n\t\tyy = PitchTbl[sy + 38 + SCREEN_Y] + 26 + PANEL_X;\r\n\t\twidth = 586 / 4;           // BUGFIX: should be 587, not 586\r\n\t\tline = BUFFER_WIDTH - 586; // BUGFIX: should be 587, not 586\r\n\t} else {\r\n\t\txy = SCREENXY(PANEL_LEFT + 346, 25);\r\n\t\tyy = PitchTbl[sy + 38 + SCREEN_Y] + 346 + PANEL_X;\r\n\t\twidth = 266 / 4;           // BUGFIX: should be 267, not 266\r\n\t\tline = BUFFER_WIDTH - 266; // BUGFIX: should be 267, not 266\r\n\t}\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, gpBuffer\r\n\t\tmov\t\tedi, esi\r\n\t\tadd\t\tesi, xy\r\n\t\tadd\t\tedi, yy\r\n\t\tmov\t\tebx, line\r\n\t\tmov\t\tedx, 3\r\n\tcopyline:\r\n\t\tmov\t\tecx, width\r\n\t\trep movsd\r\n\t\tmovsw\r\n\t\tadd\t\tesi, ebx\r\n\t\tadd\t\tedi, ebx\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tcopyline\r\n\t}\r\n#else\r\n\tint i;\r\n\tBYTE *src, *dst;\r\n\r\n\tsrc = &gpBuffer[xy];\r\n\tdst = &gpBuffer[yy];\r\n\r\n\tfor (i = 0; i < 3; i++, src += BUFFER_WIDTH, dst += BUFFER_WIDTH)\r\n\t\tmemcpy(dst, src, BUFFER_WIDTH - line);\r\n#endif\r\n}\r\n\r\nvoid DrawSSlider(int y1, int y2)\r\n{\r\n\tint yd1, yd2, yd3;\r\n\r\n\tyd1 = SStringY[y1] + 44 + SCREEN_Y;\r\n\tyd2 = SStringY[y2] + 44 + SCREEN_Y;\r\n\tif (stextscrlubtn != -1)\r\n\t\tCelDraw(PANEL_X + 601, yd1, pSTextSlidCels, 12, 12);\r\n\telse\r\n\t\tCelDraw(PANEL_X + 601, yd1, pSTextSlidCels, 10, 12);\r\n\tif (stextscrldbtn != -1)\r\n\t\tCelDraw(PANEL_X + 601, yd2, pSTextSlidCels, 11, 12);\r\n\telse\r\n\t\tCelDraw(PANEL_X + 601, yd2, pSTextSlidCels, 9, 12);\r\n\tyd1 += 12;\r\n\tfor (yd3 = yd1; yd3 < yd2; yd3 += 12) {\r\n\t\tCelDraw(PANEL_X + 601, yd3, pSTextSlidCels, 14, 12);\r\n\t}\r\n\tif (stextsel == 22)\r\n\t\tyd3 = stextlhold;\r\n\telse\r\n\t\tyd3 = stextsel;\r\n\tif (storenumh > 1)\r\n\t\tyd3 = 1000 * (stextsval + ((yd3 - stextup) >> 2)) / (storenumh - 1) * (SStringY[y2] - SStringY[y1] - 24) / 1000;\r\n\telse\r\n\t\tyd3 = 0;\r\n\tCelDraw(PANEL_X + 601, SStringY[y1 + 1] + 44 + SCREEN_Y + yd3, pSTextSlidCels, 13, 12);\r\n}\r\n\r\nvoid DrawSTextHelp()\r\n{\r\n\tstextsel = -1;\r\n\tstextsize = TRUE;\r\n}\r\n\r\nvoid ClearSText(int s, int e)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = s; i < e; i++) {\r\n\t\tstext[i]._sx = 0;\r\n\t\tstext[i]._syoff = 0;\r\n\t\tstext[i]._sstr[0] = 0;\r\n\t\tstext[i]._sjust = FALSE;\r\n\t\tstext[i]._sclr = COL_WHITE;\r\n\t\tstext[i]._sline = 0;\r\n\t\tstext[i]._ssel = FALSE;\r\n\t\tstext[i]._sval = -1;\r\n\t}\r\n}\r\n\r\nvoid AddSLine(int y)\r\n{\r\n\tstext[y]._sx = 0;\r\n\tstext[y]._syoff = 0;\r\n\tstext[y]._sstr[0] = 0;\r\n\tstext[y]._sline = 1;\r\n}\r\n\r\nvoid AddSTextVal(int y, int val)\r\n{\r\n\tstext[y]._sval = val;\r\n}\r\n\r\nvoid OffsetSTextY(int y, int yo)\r\n{\r\n\tstext[y]._syoff = yo;\r\n}\r\n\r\nvoid AddSText(int x, int y, BOOL j, const char *str, char clr, BOOL sel)\r\n{\r\n\tstext[y]._sx = x;\r\n\tstext[y]._syoff = 0;\r\n\tstrcpy(stext[y]._sstr, str);\r\n\tstext[y]._sjust = j;\r\n\tstext[y]._sclr = clr;\r\n\tstext[y]._sline = 0;\r\n\tstext[y]._ssel = sel;\r\n}\r\n\r\nstatic void PrintStoreItem(ItemStruct *x, int l, char iclr)\r\n{\r\n\tchar sstr[128];\r\n\tchar str, dex;\r\n\tBYTE mag;\r\n\r\n\tsstr[0] = '\\0';\r\n\tif (x->_iIdentified) {\r\n\t\tif (x->_iMagical != ITEM_QUALITY_UNIQUE) {\r\n\t\t\tif (x->_iPrePower != -1) {\r\n\t\t\t\tPrintItemPower(x->_iPrePower, x);\r\n\t\t\t\tstrcat(sstr, tempstr);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (x->_iSufPower != -1) {\r\n\t\t\tPrintItemPower(x->_iSufPower, x);\r\n\t\t\tif (sstr[0])\r\n\t\t\t\tstrcat(sstr, \",  \");\r\n\t\t\tstrcat(sstr, tempstr);\r\n\t\t}\r\n\t}\r\n\tif (x->_iMiscId == IMISC_STAFF && x->_iMaxCharges) {\r\n\t\tsprintf(tempstr, \"Charges: %i/%i\", x->_iCharges, x->_iMaxCharges);\r\n\t\tif (sstr[0])\r\n\t\t\tstrcat(sstr, \",  \");\r\n\t\tstrcat(sstr, tempstr);\r\n\t}\r\n\tif (sstr[0]) {\r\n\t\tAddSText(40, l, FALSE, sstr, iclr, FALSE);\r\n\t\tl++;\r\n\t}\r\n\tsstr[0] = '\\0';\r\n\tif (x->_iClass == ICLASS_WEAPON)\r\n\t\tsprintf(sstr, \"Damage: %i-%i  \", x->_iMinDam, x->_iMaxDam);\r\n\tif (x->_iClass == ICLASS_ARMOR)\r\n\t\tsprintf(sstr, \"Armor: %i  \", x->_iAC);\r\n\tif (x->_iMaxDur != DUR_INDESTRUCTIBLE && x->_iMaxDur) {\r\n\t\tsprintf(tempstr, \"Dur: %i/%i,  \", x->_iDurability, x->_iMaxDur);\r\n\t\tstrcat(sstr, tempstr);\r\n\t} else {\r\n\t\tstrcat(sstr, \"Indestructible,  \");\r\n\t}\r\n\tif (x->_itype == ITYPE_MISC)\r\n\t\tsstr[0] = '\\0';\r\n\tstr = x->_iMinStr;\r\n\tdex = x->_iMinDex;\r\n\tmag = x->_iMinMag;\r\n\tif ((str + mag + dex) == 0) {\r\n\t\tstrcat(sstr, \"No required attributes\");\r\n\t} else {\r\n\t\tstrcpy(tempstr, \"Required:\");\r\n\t\tif (x->_iMinStr)\r\n\t\t\tsprintf(tempstr, \"%s %i Str\", tempstr, x->_iMinStr);\r\n\t\tif (x->_iMinMag)\r\n\t\t\tsprintf(tempstr, \"%s %i Mag\", tempstr, x->_iMinMag);\r\n\t\tif (x->_iMinDex)\r\n\t\t\tsprintf(tempstr, \"%s %i Dex\", tempstr, x->_iMinDex);\r\n\t\tstrcat(sstr, tempstr);\r\n\t}\r\n\tAddSText(40, l++, FALSE, sstr, iclr, FALSE);\r\n\tif (x->_iMagical == ITEM_QUALITY_UNIQUE) {\r\n\t\tif (x->_iIdentified)\r\n\t\t\tAddSText(40, l, FALSE, \"Unique Item\", iclr, FALSE);\r\n\t}\r\n}\r\n\r\nvoid StoreAutoPlace()\r\n{\r\n\tBOOL done;\r\n\tint i, w, h, idx;\r\n\r\n\tSetICursor(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\tw = icursW28;\r\n\th = icursH28;\r\n\tdone = FALSE;\r\n\tif (w == 1 && h == 1) {\r\n\t\tidx = plr[myplr].HoldItem.IDidx;\r\n\t\tif (plr[myplr].HoldItem._iStatFlag && AllItemsList[idx].iUsable) {\r\n\t\t\tfor (i = 0; i < MAXBELTITEMS && !done; i++) {\r\n\t\t\t\tif (plr[myplr].SpdList[i]._itype == ITYPE_NONE) {\r\n\t\t\t\t\tplr[myplr].SpdList[i] = plr[myplr].HoldItem;\r\n\t\t\t\t\tdone = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 30; i <= 39 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 20; i <= 29 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 10; i <= 19 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 0; i <= 9 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t}\r\n\tif (w == 1 && h == 2) {\r\n\t\tfor (i = 29; i >= 20 && !done; i--) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 9; i >= 0 && !done; i--) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 19; i >= 10 && !done; i--) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t}\r\n\tif (w == 1 && h == 3) {\r\n\t\tfor (i = 0; i < 20 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t}\r\n\tif (w == 2 && h == 2) {\r\n\t\tfor (i = 0; i < 10 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, AP2x2Tbl[i], w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 21; i < 29 && !done; i += 2) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 1; i < 9 && !done; i += 2) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 10; i < 19 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t}\r\n\tif (w == 2 && h == 3) {\r\n\t\tfor (i = 0; i < 9 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t\tfor (i = 10; i < 19 && !done; i++) {\r\n\t\t\tdone = AutoPlace(myplr, i, w, h, TRUE);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid S_StartSmith()\r\n{\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 1, TRUE, \"Welcome to the\", COL_GOLD, FALSE);\r\n\tAddSText(0, 3, TRUE, \"Blacksmith's shop\", COL_GOLD, FALSE);\r\n\tAddSText(0, 7, TRUE, \"Would you like to:\", COL_GOLD, FALSE);\r\n\tAddSText(0, 10, TRUE, \"Talk to Griswold\", COL_BLUE, TRUE);\r\n\tAddSText(0, 12, TRUE, \"Buy basic items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 14, TRUE, \"Buy premium items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 16, TRUE, \"Sell items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 18, TRUE, \"Repair items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 20, TRUE, \"Leave the shop\", COL_WHITE, TRUE);\r\n\tAddSLine(5);\r\n\tstorenumh = 20;\r\n}\r\n\r\nvoid S_ScrollSBuy(int idx)\r\n{\r\n\tint l, ls;\r\n\tchar iclr;\r\n\r\n\tls = idx;\r\n\tClearSText(5, 21);\r\n\tstextup = 5;\r\n\r\n\tfor (l = 5; l < 20; l += 4) {\r\n\t\tif (smithitem[ls]._itype != ITYPE_NONE) {\r\n\t\t\ticlr = COL_WHITE;\r\n\t\t\tif (smithitem[ls]._iMagical) {\r\n\t\t\t\ticlr = COL_BLUE;\r\n\t\t\t}\r\n\r\n\t\t\tif (!smithitem[ls]._iStatFlag) {\r\n\t\t\t\ticlr = COL_RED;\r\n\t\t\t}\r\n\r\n\t\t\tif (smithitem[ls]._iMagical) {\r\n\t\t\t\tAddSText(20, l, FALSE, smithitem[ls]._iIName, iclr, TRUE);\r\n\t\t\t} else {\r\n\t\t\t\tAddSText(20, l, FALSE, smithitem[ls]._iName, iclr, TRUE);\r\n\t\t\t}\r\n\r\n\t\t\tAddSTextVal(l, smithitem[ls]._iIvalue);\r\n\t\t\tPrintStoreItem(&smithitem[ls], l + 1, iclr);\r\n\t\t\tstextdown = l;\r\n\t\t\tls++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!stext[stextsel]._ssel && stextsel != 22)\r\n\t\tstextsel = stextdown;\r\n}\r\n\r\nvoid S_StartSBuy()\r\n{\r\n\tint i;\r\n\r\n\tstextsize = TRUE;\r\n\tstextscrl = TRUE;\r\n\tstextsval = 0;\r\n\tsprintf(tempstr, \"I have these items for sale :           Your gold : %i\", plr[myplr]._pGold);\r\n\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\tAddSLine(3);\r\n\tAddSLine(21);\r\n\tS_ScrollSBuy(stextsval);\r\n\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, FALSE);\r\n\tOffsetSTextY(22, 6);\r\n\tstorenumh = 0;\r\n\tfor (i = 0; smithitem[i]._itype != ITYPE_NONE; i++) {\r\n\t\tstorenumh++;\r\n\t}\r\n\r\n\tstextsmax = storenumh - 4;\r\n\tif (stextsmax < 0)\r\n\t\tstextsmax = 0;\r\n}\r\n\r\nvoid S_ScrollSPBuy(int idx)\r\n{\r\n\tint l, boughtitems;\r\n\tchar iclr;\r\n\r\n\tClearSText(5, 21);\r\n\tboughtitems = idx;\r\n\r\n\tstextup = 5;\r\n\tfor (idx = 0; boughtitems; idx++) {\r\n\t\tif (premiumitem[idx]._itype != ITYPE_NONE)\r\n\t\t\tboughtitems--;\r\n\t}\r\n\r\n\tfor (l = 5; l < 20 && idx < SMITH_PREMIUM_ITEMS; l += 4) {\r\n\t\tif (premiumitem[idx]._itype != ITYPE_NONE) {\r\n\t\t\ticlr = COL_WHITE;\r\n\t\t\tif (premiumitem[idx]._iMagical)\r\n\t\t\t\ticlr = COL_BLUE;\r\n\t\t\tif (!premiumitem[idx]._iStatFlag)\r\n\t\t\t\ticlr = COL_RED;\r\n\t\t\tAddSText(20, l, FALSE, premiumitem[idx]._iIName, iclr, TRUE);\r\n\t\t\tAddSTextVal(l, premiumitem[idx]._iIvalue);\r\n\t\t\tPrintStoreItem(&premiumitem[idx], l + 1, iclr);\r\n\t\t\tstextdown = l;\r\n\t\t} else {\r\n\t\t\tl -= 4;\r\n\t\t}\r\n\t\tidx++;\r\n\t}\r\n\tif (!stext[stextsel]._ssel && stextsel != 22)\r\n\t\tstextsel = stextdown;\r\n}\r\n\r\nBOOL S_StartSPBuy()\r\n{\r\n\tint i;\r\n\r\n\tstorenumh = 0;\r\n\tfor (i = 0; i < SMITH_PREMIUM_ITEMS; i++) {\r\n\t\tif (premiumitem[i]._itype != ITYPE_NONE)\r\n\t\t\tstorenumh++;\r\n\t}\r\n\tif (!storenumh) {\r\n\t\tStartStore(STORE_SMITH);\r\n\t\tstextsel = 14;\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tstextsize = TRUE;\r\n\tstextscrl = TRUE;\r\n\tstextsval = 0;\r\n\r\n\tsprintf(tempstr, \"I have these premium items for sale :   Your gold : %i\", plr[myplr]._pGold);\r\n\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\tAddSLine(3);\r\n\tAddSLine(21);\r\n\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, FALSE);\r\n\tOffsetSTextY(22, 6);\r\n\r\n\tstextsmax = storenumh - 4;\r\n\tif (stextsmax < 0)\r\n\t\tstextsmax = 0;\r\n\r\n\tS_ScrollSPBuy(stextsval);\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL SmithSellOk(int i)\r\n{\r\n#ifdef HELLFIRE\r\n\tItemStruct *pI;\r\n\r\n\tif (i >= 0) {\r\n\t\tpI = &plr[myplr].InvList[i];\r\n\t} else {\r\n\t\tpI = &plr[myplr].SpdList[-(i + 1)];\r\n\t}\r\n\r\n\tif (pI->_itype == ITYPE_NONE)\r\n\t\treturn FALSE;\r\n\r\n\tif (pI->_iMiscId > IMISC_OILFIRST && pI->_iMiscId < IMISC_OILLAST)\r\n\t\treturn TRUE;\r\n\r\n\tif (pI->_itype == ITYPE_MISC)\r\n\t\treturn FALSE;\r\n\tif (pI->_itype == ITYPE_GOLD)\r\n\t\treturn FALSE;\r\n\tif (pI->_itype == ITYPE_FOOD)\r\n\t\treturn FALSE;\r\n\tif (pI->_itype == ITYPE_STAFF && pI->_iSpell != SPL_NULL)\r\n\t\treturn FALSE;\r\n\tif (pI->_iClass == ICLASS_QUEST)\r\n\t\treturn FALSE;\r\n\tif (pI->IDidx == IDI_LAZSTAFF)\r\n\t\treturn FALSE;\r\n#else\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_NONE)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_MISC)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_GOLD)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_FOOD)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_STAFF)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i].IDidx == IDI_LAZSTAFF)\r\n\t\treturn FALSE;\r\n#endif\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid S_ScrollSSell(int idx)\r\n{\r\n\tint l;\r\n\tchar iclr;\r\n\r\n\tClearSText(5, 21);\r\n\tstextup = 5;\r\n\r\n\tfor (l = 5; l < 20; l += 4) {\r\n\t\tif (idx >= storenumh)\r\n\t\t\tbreak;\r\n\t\tif (storehold[idx]._itype != ITYPE_NONE) {\r\n\t\t\ticlr = COL_WHITE;\r\n\t\t\tif (storehold[idx]._iMagical) {\r\n\t\t\t\ticlr = COL_BLUE;\r\n\t\t\t}\r\n\r\n\t\t\tif (!storehold[idx]._iStatFlag) {\r\n\t\t\t\ticlr = COL_RED;\r\n\t\t\t}\r\n\r\n\t\t\tif (storehold[idx]._iMagical && storehold[idx]._iIdentified) {\r\n\t\t\t\tAddSText(20, l, FALSE, storehold[idx]._iIName, iclr, TRUE);\r\n\t\t\t\tAddSTextVal(l, storehold[idx]._iIvalue);\r\n\t\t\t} else {\r\n\t\t\t\tAddSText(20, l, FALSE, storehold[idx]._iName, iclr, TRUE);\r\n\t\t\t\tAddSTextVal(l, storehold[idx]._ivalue);\r\n\t\t\t}\r\n\r\n\t\t\tPrintStoreItem(&storehold[idx], l + 1, iclr);\r\n\t\t\tstextdown = l;\r\n\t\t}\r\n\t\tidx++;\r\n\t}\r\n\r\n\tstextsmax = storenumh - 4;\r\n\tif (stextsmax < 0)\r\n\t\tstextsmax = 0;\r\n}\r\n\r\nvoid S_StartSSell()\r\n{\r\n\tint i;\r\n\tBOOL sellok;\r\n\r\n\tstextsize = TRUE;\r\n\tsellok = FALSE;\r\n\tstorenumh = 0;\r\n\r\n\tfor (i = 0; i < 48; i++)\r\n\t\tstorehold[i]._itype = ITYPE_NONE;\r\n\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n#ifdef HELLFIRE\r\n\t\tif (storenumh >= 48)\r\n\t\t\tbreak;\r\n#endif\r\n\t\tif (SmithSellOk(i)) {\r\n\t\t\tsellok = TRUE;\r\n\t\t\tstorehold[storenumh] = plr[myplr].InvList[i];\r\n\r\n\t\t\tif (storehold[storenumh]._iMagical != ITEM_QUALITY_NORMAL && storehold[storenumh]._iIdentified)\r\n\t\t\t\tstorehold[storenumh]._ivalue = storehold[storenumh]._iIvalue;\r\n\r\n\t\t\tif ((storehold[storenumh]._ivalue >>= 2) == 0)\r\n\t\t\t\tstorehold[storenumh]._ivalue = 1;\r\n\r\n\t\t\tstorehold[storenumh]._iIvalue = storehold[storenumh]._ivalue;\r\n\t\t\tstorehidx[storenumh++] = i;\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n\t\tif (storenumh >= 48)\r\n\t\t\tbreak;\r\n\t\tif (SmithSellOk(-(i + 1))) {\r\n\t\t\tstorehold[storenumh] = plr[myplr].SpdList[i];\r\n\t\t\tsellok = TRUE;\r\n\r\n\t\t\tif (storehold[storenumh]._iMagical != ITEM_QUALITY_NORMAL && storehold[storenumh]._iIdentified)\r\n\t\t\t\tstorehold[storenumh]._ivalue = storehold[storenumh]._iIvalue;\r\n\r\n\t\t\tif (!(storehold[storenumh]._ivalue >>= 2))\r\n\t\t\t\tstorehold[storenumh]._ivalue = 1;\r\n\r\n\t\t\tstorehold[storenumh]._iIvalue = storehold[storenumh]._ivalue;\r\n\t\t\tstorehidx[storenumh++] = -(i + 1);\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tif (!sellok) {\r\n\t\tstextscrl = FALSE;\r\n\t\tsprintf(tempstr, \"You have nothing I want.            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t} else {\r\n\t\tstextscrl = TRUE;\r\n\t\tstextsval = 0;\r\n\t\tstextsmax = plr[myplr]._pNumInv;\r\n\t\tsprintf(tempstr, \"Which item is for sale?            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tS_ScrollSSell(stextsval);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t}\r\n}\r\n\r\nBOOL SmithRepairOk(int i)\r\n{\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_NONE)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_MISC)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_GOLD)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_FOOD)\r\n\t\treturn FALSE;\r\n\tif (plr[myplr].InvList[i]._iDurability == plr[myplr].InvList[i]._iMaxDur)\r\n\t\treturn FALSE;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void AddStoreHoldRepair(ItemStruct *itm, int i)\r\n{\r\n\tItemStruct *item;\r\n\tint v;\r\n\r\n\titem = &storehold[storenumh];\r\n\tstorehold[storenumh] = *itm;\r\n\tif (item->_iMagical != ITEM_QUALITY_NORMAL && item->_iIdentified)\r\n\t\titem->_ivalue = 30 * item->_iIvalue / 100;\r\n\tv = item->_ivalue * (100 * (item->_iMaxDur - item->_iDurability) / item->_iMaxDur) / 100;\r\n\tif (!v) {\r\n\t\tif (item->_iMagical != ITEM_QUALITY_NORMAL && item->_iIdentified)\r\n\t\t\treturn;\r\n\t\tv = 1;\r\n\t}\r\n\tif (v > 1)\r\n\t\tv >>= 1;\r\n\titem->_iIvalue = v;\r\n\titem->_ivalue = v;\r\n\tstorehidx[storenumh] = i;\r\n\tstorenumh++;\r\n}\r\n\r\nvoid S_StartSRepair()\r\n{\r\n\tBOOL repairok;\r\n\tint i;\r\n\r\n\tstextsize = TRUE;\r\n\trepairok = FALSE;\r\n\tstorenumh = 0;\r\n\tfor (i = 0; i < 48; i++)\r\n\t\tstorehold[i]._itype = ITYPE_NONE;\r\n\tif (plr[myplr].InvBody[INVLOC_HEAD]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_HEAD]._iDurability != plr[myplr].InvBody[INVLOC_HEAD]._iMaxDur) {\r\n\t\trepairok = TRUE;\r\n\t\tAddStoreHoldRepair(plr[myplr].InvBody, -1);\r\n\t}\r\n\tif (plr[myplr].InvBody[INVLOC_CHEST]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_CHEST]._iDurability != plr[myplr].InvBody[INVLOC_CHEST]._iMaxDur) {\r\n\t\trepairok = TRUE;\r\n\t\tAddStoreHoldRepair(&plr[myplr].InvBody[INVLOC_CHEST], -2);\r\n\t}\r\n\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iDurability != plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMaxDur) {\r\n\t\trepairok = TRUE;\r\n\t\tAddStoreHoldRepair(&plr[myplr].InvBody[INVLOC_HAND_LEFT], -3);\r\n\t}\r\n\tif (plr[myplr].InvBody[INVLOC_HAND_RIGHT]._itype != ITYPE_NONE && plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iDurability != plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iMaxDur) {\r\n\t\trepairok = TRUE;\r\n\t\tAddStoreHoldRepair(&plr[myplr].InvBody[INVLOC_HAND_RIGHT], -4);\r\n\t}\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n#ifdef HELLFIRE\r\n\t\tif (storenumh >= 48)\r\n\t\t\tbreak;\r\n#endif\r\n\t\tif (SmithRepairOk(i)) {\r\n\t\t\trepairok = TRUE;\r\n\t\t\tAddStoreHoldRepair(&plr[myplr].InvList[i], i);\r\n\t\t}\r\n\t}\r\n\tif (!repairok) {\r\n\t\tstextscrl = FALSE;\r\n\t\tsprintf(tempstr, \"You have nothing to repair.            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t\treturn;\r\n\t}\r\n\r\n\tstextscrl = TRUE;\r\n\tstextsval = 0;\r\n\tstextsmax = plr[myplr]._pNumInv;\r\n\tsprintf(tempstr, \"Repair which item?            Your gold : %i\", plr[myplr]._pGold);\r\n\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\tAddSLine(3);\r\n\tAddSLine(21);\r\n\tS_ScrollSSell(stextsval);\r\n\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\tOffsetSTextY(22, 6);\r\n}\r\n\r\nvoid S_StartWitch()\r\n{\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 2, TRUE, \"Witch's shack\", COL_GOLD, FALSE);\r\n\tAddSText(0, 9, TRUE, \"Would you like to:\", COL_GOLD, FALSE);\r\n\tAddSText(0, 12, TRUE, \"Talk to Adria\", COL_BLUE, TRUE);\r\n\tAddSText(0, 14, TRUE, \"Buy items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 16, TRUE, \"Sell items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 18, TRUE, \"Recharge staves\", COL_WHITE, TRUE);\r\n\tAddSText(0, 20, TRUE, \"Leave the shack\", COL_WHITE, TRUE);\r\n\tAddSLine(5);\r\n\tstorenumh = 20;\r\n}\r\n\r\nvoid S_ScrollWBuy(int idx)\r\n{\r\n\tint l, ls;\r\n\tchar iclr;\r\n\r\n\tls = idx;\r\n\tClearSText(5, 21);\r\n\tstextup = 5;\r\n\r\n\tfor (l = 5; l < 20; l += 4) {\r\n\t\tif (witchitem[ls]._itype != ITYPE_NONE) {\r\n\t\t\ticlr = COL_WHITE;\r\n\t\t\tif (witchitem[ls]._iMagical) {\r\n\t\t\t\ticlr = COL_BLUE;\r\n\t\t\t}\r\n\r\n\t\t\tif (!witchitem[ls]._iStatFlag) {\r\n\t\t\t\ticlr = COL_RED;\r\n\t\t\t}\r\n\r\n\t\t\tif (witchitem[ls]._iMagical) {\r\n\t\t\t\tAddSText(20, l, FALSE, witchitem[ls]._iIName, iclr, TRUE);\r\n\t\t\t} else {\r\n\t\t\t\tAddSText(20, l, FALSE, witchitem[ls]._iName, iclr, TRUE);\r\n\t\t\t}\r\n\r\n\t\t\tAddSTextVal(l, witchitem[ls]._iIvalue);\r\n\t\t\tPrintStoreItem(&witchitem[ls], l + 1, iclr);\r\n\t\t\tstextdown = l;\r\n\t\t\tls++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!stext[stextsel]._ssel && stextsel != 22)\r\n\t\tstextsel = stextdown;\r\n}\r\n\r\nvoid S_StartWBuy()\r\n{\r\n\tint i;\r\n\r\n\tstextsize = TRUE;\r\n\tstextscrl = TRUE;\r\n\tstextsval = 0;\r\n\tstextsmax = 20;\r\n\tsprintf(tempstr, \"I have these items for sale :           Your gold : %i\", plr[myplr]._pGold);\r\n\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\tAddSLine(3);\r\n\tAddSLine(21);\r\n\tS_ScrollWBuy(stextsval);\r\n\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, FALSE);\r\n\tOffsetSTextY(22, 6);\r\n\r\n\tstorenumh = 0;\r\n\tfor (i = 0; witchitem[i]._itype != ITYPE_NONE; i++) {\r\n\t\tstorenumh++;\r\n\t}\r\n\tstextsmax = storenumh - 4;\r\n\tif (stextsmax < 0)\r\n\t\tstextsmax = 0;\r\n}\r\n\r\nBOOL WitchSellOk(int i)\r\n{\r\n\tBOOL rv;\r\n\tItemStruct *pI;\r\n\r\n\trv = FALSE;\r\n\r\n\tif (i >= 0)\r\n\t\tpI = &plr[myplr].InvList[i];\r\n\telse\r\n\t\tpI = &plr[myplr].SpdList[-(i + 1)];\r\n\r\n\tif (pI->_itype == ITYPE_MISC)\r\n\t\trv = TRUE;\r\n#ifdef HELLFIRE\r\n\tif (pI->_iMiscId > 29 && pI->_iMiscId < 41)\r\n\t\trv = FALSE;\r\n\tif (pI->_iClass == ICLASS_QUEST)\r\n\t\trv = FALSE;\r\n\tif (pI->_itype == ITYPE_STAFF && pI->_iSpell != SPL_NULL)\r\n#else\r\n\tif (pI->_itype == ITYPE_STAFF)\r\n#endif\r\n\t\trv = TRUE;\r\n\tif (pI->IDidx >= IDI_FIRSTQUEST && pI->IDidx <= IDI_LASTQUEST)\r\n\t\trv = FALSE;\r\n\tif (pI->IDidx == IDI_LAZSTAFF)\r\n\t\trv = FALSE;\r\n\treturn rv;\r\n}\r\n\r\nvoid S_StartWSell()\r\n{\r\n\tint i;\r\n\tBOOL sellok;\r\n\r\n\tstextsize = TRUE;\r\n\tsellok = FALSE;\r\n\tstorenumh = 0;\r\n\r\n\tfor (i = 0; i < 48; i++)\r\n\t\tstorehold[i]._itype = ITYPE_NONE;\r\n\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n#ifdef HELLFIRE\r\n\t\tif (storenumh >= 48)\r\n\t\t\tbreak;\r\n#endif\r\n\t\tif (WitchSellOk(i)) {\r\n\t\t\tsellok = TRUE;\r\n\t\t\tstorehold[storenumh] = plr[myplr].InvList[i];\r\n\r\n\t\t\tif (storehold[storenumh]._iMagical != ITEM_QUALITY_NORMAL && storehold[storenumh]._iIdentified)\r\n\t\t\t\tstorehold[storenumh]._ivalue = storehold[storenumh]._iIvalue;\r\n\r\n\t\t\tif ((storehold[storenumh]._ivalue >>= 2) == 0)\r\n\t\t\t\tstorehold[storenumh]._ivalue = 1;\r\n\r\n\t\t\tstorehold[storenumh]._iIvalue = storehold[storenumh]._ivalue;\r\n\t\t\tstorehidx[storenumh++] = i;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXBELTITEMS; i++) {\r\n#ifdef HELLFIRE\r\n\t\tif (storenumh >= 48)\r\n\t\t\tbreak;\r\n#endif\r\n\t\tif (plr[myplr].SpdList[i]._itype != ITYPE_NONE && WitchSellOk(-(i + 1))) {\r\n\t\t\tsellok = TRUE;\r\n\t\t\tstorehold[storenumh] = plr[myplr].SpdList[i];\r\n\r\n\t\t\tif (storehold[storenumh]._iMagical != ITEM_QUALITY_NORMAL && storehold[storenumh]._iIdentified)\r\n\t\t\t\tstorehold[storenumh]._ivalue = storehold[storenumh]._iIvalue;\r\n\r\n\t\t\tif ((storehold[storenumh]._ivalue >>= 2) == 0)\r\n\t\t\t\tstorehold[storenumh]._ivalue = 1;\r\n\r\n\t\t\tstorehold[storenumh]._iIvalue = storehold[storenumh]._ivalue;\r\n\t\t\tstorehidx[storenumh++] = -(i + 1);\r\n\t\t}\r\n\t}\r\n\r\n\tif (!sellok) {\r\n\t\tstextscrl = FALSE;\r\n\t\tsprintf(tempstr, \"You have nothing I want.            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t} else {\r\n\t\tstextscrl = TRUE;\r\n\t\tstextsval = 0;\r\n\t\tstextsmax = plr[myplr]._pNumInv;\r\n\t\tsprintf(tempstr, \"Which item is for sale?            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tS_ScrollSSell(stextsval);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t}\r\n}\r\n\r\nBOOL WitchRechargeOk(int i)\r\n{\r\n\tBOOL rv;\r\n\r\n\trv = FALSE;\r\n\tif (plr[myplr].InvList[i]._itype == ITYPE_STAFF\r\n\t    && plr[myplr].InvList[i]._iCharges != plr[myplr].InvList[i]._iMaxCharges) {\r\n\t\trv = TRUE;\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif ((plr[myplr].InvList[i]._iMiscId == IMISC_UNIQUE || plr[myplr].InvList[i]._iMiscId == IMISC_STAFF)\r\n\t    && plr[myplr].InvList[i]._iCharges < plr[myplr].InvList[i]._iMaxCharges) {\r\n\t\trv = TRUE;\r\n\t}\r\n#endif\r\n\treturn rv;\r\n}\r\n\r\nvoid AddStoreHoldRecharge(ItemStruct itm, int i)\r\n{\r\n\tstorehold[storenumh] = itm;\r\n\tstorehold[storenumh]._ivalue += spelldata[itm._iSpell].sStaffCost;\r\n\tstorehold[storenumh]._ivalue = storehold[storenumh]._ivalue * (100 * (storehold[storenumh]._iMaxCharges - storehold[storenumh]._iCharges) / storehold[storenumh]._iMaxCharges) / 100 >> 1;\r\n\tstorehold[storenumh]._iIvalue = storehold[storenumh]._ivalue;\r\n\tstorehidx[storenumh] = i;\r\n\tstorenumh++;\r\n}\r\n\r\nvoid S_StartWRecharge()\r\n{\r\n\tint i;\r\n\tBOOL rechargeok;\r\n\r\n\tstextsize = TRUE;\r\n\trechargeok = FALSE;\r\n\tstorenumh = 0;\r\n\r\n\tfor (i = 0; i < 48; i++) {\r\n\t\tstorehold[i]._itype = ITYPE_NONE;\r\n\t}\r\n\r\n#ifdef HELLFIRE\r\n\tif ((plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF || plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMiscId == IMISC_UNIQUE)\r\n#else\r\n\tif (plr[myplr].InvBody[INVLOC_HAND_LEFT]._itype == ITYPE_STAFF\r\n#endif\r\n\t    && plr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges != plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMaxCharges) {\r\n\t\trechargeok = TRUE;\r\n\t\tAddStoreHoldRecharge(plr[myplr].InvBody[INVLOC_HAND_LEFT], -1);\r\n\t}\r\n\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n#ifdef HELLFIRE\r\n\t\tif (storenumh >= 48)\r\n\t\t\tbreak;\r\n#endif\r\n\t\tif (WitchRechargeOk(i)) {\r\n\t\t\trechargeok = TRUE;\r\n\t\t\tAddStoreHoldRecharge(plr[myplr].InvList[i], i);\r\n\t\t}\r\n\t}\r\n\r\n\tif (!rechargeok) {\r\n\t\tstextscrl = FALSE;\r\n\t\tsprintf(tempstr, \"You have nothing to recharge.            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t} else {\r\n\t\tstextscrl = TRUE;\r\n\t\tstextsval = 0;\r\n\t\tstextsmax = plr[myplr]._pNumInv;\r\n\t\tsprintf(tempstr, \"Recharge which item?            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tS_ScrollSSell(stextsval);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t}\r\n}\r\n\r\nvoid S_StartNoMoney()\r\n{\r\n\tStartStore(stextshold);\r\n\tstextscrl = FALSE;\r\n\tstextsize = TRUE;\r\n\tClearSText(5, 23);\r\n\tAddSText(0, 14, TRUE, \"You do not have enough gold\", COL_WHITE, TRUE);\r\n}\r\n\r\nvoid S_StartNoRoom()\r\n{\r\n\tStartStore(stextshold);\r\n\tstextscrl = FALSE;\r\n\tClearSText(5, 23);\r\n\tAddSText(0, 14, TRUE, \"You do not have enough room in inventory\", COL_WHITE, TRUE);\r\n}\r\n\r\nvoid S_StartConfirm()\r\n{\r\n\tBOOL idprint;\r\n\tchar iclr;\r\n\r\n\tStartStore(stextshold);\r\n\tstextscrl = FALSE;\r\n\tClearSText(5, 23);\r\n\ticlr = COL_WHITE;\r\n\r\n\tif (plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL)\r\n\t\ticlr = COL_BLUE;\r\n\tif (!plr[myplr].HoldItem._iStatFlag)\r\n\t\ticlr = COL_RED;\r\n\r\n\tidprint = plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL;\r\n\r\n\tif (stextshold == STORE_SIDENTIFY)\r\n\t\tidprint = FALSE;\r\n\tif (plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL && !plr[myplr].HoldItem._iIdentified) {\r\n\t\tif (stextshold == STORE_SSELL)\r\n\t\t\tidprint = FALSE;\r\n\t\tif (stextshold == STORE_WSELL)\r\n\t\t\tidprint = FALSE;\r\n\t\tif (stextshold == STORE_SREPAIR)\r\n\t\t\tidprint = FALSE;\r\n\t\tif (stextshold == STORE_WRECHARGE)\r\n\t\t\tidprint = FALSE;\r\n\t}\r\n\tif (idprint)\r\n\t\tAddSText(20, 8, FALSE, plr[myplr].HoldItem._iIName, iclr, FALSE);\r\n\telse\r\n\t\tAddSText(20, 8, FALSE, plr[myplr].HoldItem._iName, iclr, FALSE);\r\n\r\n\tAddSTextVal(8, plr[myplr].HoldItem._iIvalue);\r\n\tPrintStoreItem(&plr[myplr].HoldItem, 9, iclr);\r\n\r\n\tswitch (stextshold) {\r\n\tcase STORE_BBOY:\r\n\t\tstrcpy(tempstr, \"Do we have a deal?\");\r\n\t\tbreak;\r\n\tcase STORE_SIDENTIFY:\r\n\t\tstrcpy(tempstr, \"Are you sure you want to identify this item?\");\r\n\t\tbreak;\r\n\tcase STORE_HBUY:\r\n\tcase STORE_SPBUY:\r\n\tcase STORE_WBUY:\r\n\tcase STORE_SBUY:\r\n\t\tstrcpy(tempstr, \"Are you sure you want to buy this item?\");\r\n\t\tbreak;\r\n\tcase STORE_WRECHARGE:\r\n\t\tstrcpy(tempstr, \"Are you sure you want to recharge this item?\");\r\n\t\tbreak;\r\n\tcase STORE_SSELL:\r\n\tcase STORE_WSELL:\r\n\t\tstrcpy(tempstr, \"Are you sure you want to sell this item?\");\r\n\t\tbreak;\r\n\tcase STORE_SREPAIR:\r\n\t\tstrcpy(tempstr, \"Are you sure you want to repair this item?\");\r\n\t\tbreak;\r\n\t}\r\n\tAddSText(0, 15, TRUE, tempstr, COL_WHITE, FALSE);\r\n\tAddSText(0, 18, TRUE, \"Yes\", COL_WHITE, TRUE);\r\n\tAddSText(0, 20, TRUE, \"No\", COL_WHITE, TRUE);\r\n}\r\n\r\nvoid S_StartBoy()\r\n{\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 2, TRUE, \"Wirt the Peg-legged boy\", COL_GOLD, FALSE);\r\n\tAddSLine(5);\r\n\tif (boyitem._itype != ITYPE_NONE) {\r\n\t\tAddSText(0, 8, TRUE, \"Talk to Wirt\", COL_BLUE, TRUE);\r\n\t\tAddSText(0, 12, TRUE, \"I have something for sale,\", COL_GOLD, FALSE);\r\n\t\tAddSText(0, 14, TRUE, \"but it will cost 50 gold\", COL_GOLD, FALSE);\r\n\t\tAddSText(0, 16, TRUE, \"just to take a look. \", COL_GOLD, FALSE);\r\n\t\tAddSText(0, 18, TRUE, \"What have you got?\", COL_WHITE, TRUE);\r\n\t\tAddSText(0, 20, TRUE, \"Say goodbye\", COL_WHITE, TRUE);\r\n\t} else {\r\n\t\tAddSText(0, 12, TRUE, \"Talk to Wirt\", COL_BLUE, TRUE);\r\n\t\tAddSText(0, 18, TRUE, \"Say goodbye\", COL_WHITE, TRUE);\r\n\t}\r\n}\r\n\r\nvoid S_StartBBoy()\r\n{\r\n\tint iclr;\r\n\r\n\tstextsize = TRUE;\r\n\tstextscrl = FALSE;\r\n\tsprintf(tempstr, \"I have this item for sale :           Your gold : %i\", plr[myplr]._pGold);\r\n\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\tAddSLine(3);\r\n\tAddSLine(21);\r\n\ticlr = COL_WHITE;\r\n\r\n\tif (boyitem._iMagical != ITEM_QUALITY_NORMAL)\r\n\t\ticlr = COL_BLUE;\r\n\tif (!boyitem._iStatFlag)\r\n\t\ticlr = COL_RED;\r\n\tif (boyitem._iMagical != ITEM_QUALITY_NORMAL)\r\n\t\tAddSText(20, 10, FALSE, boyitem._iIName, iclr, TRUE);\r\n\telse\r\n\t\tAddSText(20, 10, FALSE, boyitem._iName, iclr, TRUE);\r\n\r\n#ifdef HELLFIRE\r\n\tAddSTextVal(10, boyitem._iIvalue - (boyitem._iIvalue >> 2));\r\n#else\r\n\tAddSTextVal(10, boyitem._iIvalue + (boyitem._iIvalue >> 1));\r\n#endif\r\n\tPrintStoreItem(&boyitem, 11, iclr);\r\n\tAddSText(0, 22, TRUE, \"Leave\", COL_WHITE, TRUE);\r\n\tOffsetSTextY(22, 6);\r\n}\r\n\r\nvoid S_StartHealer()\r\n{\r\n#ifdef HELLFIRE\r\n\tif (plr[myplr]._pHitPoints != plr[myplr]._pMaxHP) {\r\n\t\tPlaySFX(IS_CAST8);\r\n\t}\r\n\tplr[myplr]._pHitPoints = plr[myplr]._pMaxHP;\r\n\tplr[myplr]._pHPBase = plr[myplr]._pMaxHPBase;\r\n\tdrawhpflag = TRUE;\r\n#endif\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 1, TRUE, \"Welcome to the\", COL_GOLD, FALSE);\r\n\tAddSText(0, 3, TRUE, \"Healer's home\", COL_GOLD, FALSE);\r\n\tAddSText(0, 9, TRUE, \"Would you like to:\", COL_GOLD, FALSE);\r\n\tAddSText(0, 12, TRUE, \"Talk to Pepin\", COL_BLUE, TRUE);\r\n#ifdef HELLFIRE\r\n\tAddSText(0, 14, TRUE, \"Buy items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 16, TRUE, \"Leave Healer's home\", COL_WHITE, TRUE);\r\n#else\r\n\tAddSText(0, 14, TRUE, \"Receive healing\", COL_WHITE, TRUE);\r\n\tAddSText(0, 16, TRUE, \"Buy items\", COL_WHITE, TRUE);\r\n\tAddSText(0, 18, TRUE, \"Leave Healer's home\", COL_WHITE, TRUE);\r\n#endif\r\n\tAddSLine(5);\r\n\tstorenumh = 20;\r\n}\r\n\r\nvoid S_ScrollHBuy(int idx)\r\n{\r\n\tint l;\r\n\tchar iclr;\r\n\r\n\tClearSText(5, 21);\r\n\tstextup = 5;\r\n\tfor (l = 5; l < 20; l += 4) {\r\n\t\tif (healitem[idx]._itype != ITYPE_NONE) {\r\n\t\t\ticlr = COL_WHITE;\r\n\t\t\tif (!healitem[idx]._iStatFlag) {\r\n\t\t\t\ticlr = COL_RED;\r\n\t\t\t}\r\n\r\n\t\t\tAddSText(20, l, FALSE, healitem[idx]._iName, iclr, TRUE);\r\n\t\t\tAddSTextVal(l, healitem[idx]._iIvalue);\r\n\t\t\tPrintStoreItem(&healitem[idx], l + 1, iclr);\r\n\t\t\tstextdown = l;\r\n\t\t\tidx++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!stext[stextsel]._ssel && stextsel != 22)\r\n\t\tstextsel = stextdown;\r\n}\r\n\r\nvoid S_StartHBuy()\r\n{\r\n\tint i;\r\n\r\n\tstextsize = TRUE;\r\n\tstextscrl = TRUE;\r\n\tstextsval = 0;\r\n\tsprintf(tempstr, \"I have these items for sale :           Your gold : %i\", plr[myplr]._pGold);\r\n\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\tAddSLine(3);\r\n\tAddSLine(21);\r\n\tS_ScrollHBuy(stextsval);\r\n\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, FALSE);\r\n\tOffsetSTextY(22, 6);\r\n\r\n\tstorenumh = 0;\r\n\tfor (i = 0; healitem[i]._itype != ITYPE_NONE; i++) {\r\n\t\tstorenumh++;\r\n\t}\r\n\tstextsmax = storenumh - 4;\r\n\tif (stextsmax < 0)\r\n\t\tstextsmax = 0;\r\n}\r\n\r\nvoid S_StartStory()\r\n{\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 2, TRUE, \"The Town Elder\", COL_GOLD, FALSE);\r\n\tAddSText(0, 9, TRUE, \"Would you like to:\", COL_GOLD, FALSE);\r\n\tAddSText(0, 12, TRUE, \"Talk to Cain\", COL_BLUE, TRUE);\r\n\tAddSText(0, 14, TRUE, \"Identify an item\", COL_WHITE, TRUE);\r\n\tAddSText(0, 18, TRUE, \"Say goodbye\", COL_WHITE, TRUE);\r\n\tAddSLine(5);\r\n}\r\n\r\nBOOL IdItemOk(ItemStruct *i)\r\n{\r\n\tif (i->_itype == ITYPE_NONE) {\r\n\t\treturn FALSE;\r\n\t}\r\n\tif (i->_iMagical == ITEM_QUALITY_NORMAL) {\r\n\t\treturn FALSE;\r\n\t}\r\n\treturn !i->_iIdentified;\r\n}\r\n\r\nvoid AddStoreHoldId(ItemStruct itm, int i)\r\n{\r\n\tstorehold[storenumh] = itm;\r\n\tstorehold[storenumh]._ivalue = 100;\r\n\tstorehold[storenumh]._iIvalue = 100;\r\n\tstorehidx[storenumh] = i;\r\n\tstorenumh++;\r\n}\r\n\r\nvoid S_StartSIdentify()\r\n{\r\n\tBOOL idok;\r\n\tint i;\r\n\r\n\tidok = FALSE;\r\n\tstextsize = TRUE;\r\n\tstorenumh = 0;\r\n\r\n\tfor (i = 0; i < 48; i++)\r\n\t\tstorehold[i]._itype = ITYPE_NONE;\r\n\r\n\tif (IdItemOk(&plr[myplr].InvBody[INVLOC_HEAD])) {\r\n\t\tidok = TRUE;\r\n\t\tAddStoreHoldId(plr[myplr].InvBody[INVLOC_HEAD], -1);\r\n\t}\r\n\tif (IdItemOk(&plr[myplr].InvBody[INVLOC_CHEST])) {\r\n\t\tidok = TRUE;\r\n\t\tAddStoreHoldId(plr[myplr].InvBody[INVLOC_CHEST], -2);\r\n\t}\r\n\tif (IdItemOk(&plr[myplr].InvBody[INVLOC_HAND_LEFT])) {\r\n\t\tidok = TRUE;\r\n\t\tAddStoreHoldId(plr[myplr].InvBody[INVLOC_HAND_LEFT], -3);\r\n\t}\r\n\tif (IdItemOk(&plr[myplr].InvBody[INVLOC_HAND_RIGHT])) {\r\n\t\tidok = TRUE;\r\n\t\tAddStoreHoldId(plr[myplr].InvBody[INVLOC_HAND_RIGHT], -4);\r\n\t}\r\n\tif (IdItemOk(&plr[myplr].InvBody[INVLOC_RING_LEFT])) {\r\n\t\tidok = TRUE;\r\n\t\tAddStoreHoldId(plr[myplr].InvBody[INVLOC_RING_LEFT], -5);\r\n\t}\r\n\tif (IdItemOk(&plr[myplr].InvBody[INVLOC_RING_RIGHT])) {\r\n\t\tidok = TRUE;\r\n\t\tAddStoreHoldId(plr[myplr].InvBody[INVLOC_RING_RIGHT], -6);\r\n\t}\r\n\tif (IdItemOk(&plr[myplr].InvBody[INVLOC_AMULET])) {\r\n\t\tidok = TRUE;\r\n\t\tAddStoreHoldId(plr[myplr].InvBody[INVLOC_AMULET], -7);\r\n\t}\r\n\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n#ifdef HELLFIRE\r\n\t\tif (storenumh >= 48)\r\n\t\t\tbreak;\r\n#endif\r\n\t\tif (IdItemOk(&plr[myplr].InvList[i])) {\r\n\t\t\tidok = TRUE;\r\n\t\t\tAddStoreHoldId(plr[myplr].InvList[i], i);\r\n\t\t}\r\n\t}\r\n\r\n\tif (!idok) {\r\n\t\tstextscrl = FALSE;\r\n\t\tsprintf(tempstr, \"You have nothing to identify.            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t} else {\r\n\t\tstextscrl = TRUE;\r\n\t\tstextsval = 0;\r\n\t\tstextsmax = plr[myplr]._pNumInv;\r\n\t\tsprintf(tempstr, \"Identify which item?            Your gold : %i\", plr[myplr]._pGold);\r\n\t\tAddSText(0, 1, TRUE, tempstr, COL_GOLD, FALSE);\r\n\t\tAddSLine(3);\r\n\t\tAddSLine(21);\r\n\t\tS_ScrollSSell(stextsval);\r\n\t\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n\t\tOffsetSTextY(22, 6);\r\n\t}\r\n}\r\n\r\nvoid S_StartIdShow()\r\n{\r\n\tchar iclr;\r\n\r\n\tStartStore(stextshold);\r\n\tstextscrl = FALSE;\r\n\tClearSText(5, 23);\r\n\ticlr = COL_WHITE;\r\n\r\n\tif (plr[myplr].HoldItem._iMagical != ITEM_QUALITY_NORMAL)\r\n\t\ticlr = COL_BLUE;\r\n\tif (!plr[myplr].HoldItem._iStatFlag)\r\n\t\ticlr = COL_RED;\r\n\r\n\tAddSText(0, 7, TRUE, \"This item is:\", COL_WHITE, FALSE);\r\n\tAddSText(20, 11, FALSE, plr[myplr].HoldItem._iIName, iclr, FALSE);\r\n\tPrintStoreItem(&plr[myplr].HoldItem, 12, iclr);\r\n\tAddSText(0, 18, TRUE, \"Done\", COL_WHITE, TRUE);\r\n}\r\n\r\nvoid S_StartTalk()\r\n{\r\n\tint i, sn, sn2, la;\r\n\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tsprintf(tempstr, \"Talk to %s\", talkname[talker]);\r\n\tAddSText(0, 2, TRUE, tempstr, COL_GOLD, FALSE);\r\n\tAddSLine(5);\r\n#ifdef SPAWN\r\n\tsprintf(tempstr, \"Talking to %s\", talkname[talker]);\r\n\tAddSText(0, 10, TRUE, tempstr, COL_WHITE, FALSE);\r\n\tAddSText(0, 12, TRUE, \"is not available\", COL_WHITE, FALSE);\r\n\tAddSText(0, 14, TRUE, \"in the shareware\", COL_WHITE, FALSE);\r\n\tAddSText(0, 16, TRUE, \"version\", COL_WHITE, FALSE);\r\n#else\r\n\tsn = 0;\r\n\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\tif (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog)\r\n\t\t\tsn++;\r\n\t}\r\n\r\n\tif (sn > 6) {\r\n\t\tsn = 14 - (sn >> 1);\r\n\t\tla = 1;\r\n\t} else {\r\n\t\tsn = 15 - sn;\r\n\t\tla = 2;\r\n\t}\r\n\r\n\tsn2 = sn - 2;\r\n\r\n\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\tif (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog) {\r\n\t\t\tAddSText(0, sn, TRUE, questlist[i]._qlstr, COL_WHITE, TRUE);\r\n\t\t\tsn += la;\r\n\t\t}\r\n\t}\r\n\tAddSText(0, sn2, TRUE, \"Gossip\", COL_BLUE, TRUE);\r\n#endif\r\n\tAddSText(0, 22, TRUE, \"Back\", COL_WHITE, TRUE);\r\n}\r\n\r\nvoid S_StartTavern()\r\n{\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 1, TRUE, \"Welcome to the\", COL_GOLD, FALSE);\r\n\tAddSText(0, 3, TRUE, \"Rising Sun\", COL_GOLD, FALSE);\r\n\tAddSText(0, 9, TRUE, \"Would you like to:\", COL_GOLD, FALSE);\r\n\tAddSText(0, 12, TRUE, \"Talk to Ogden\", COL_BLUE, TRUE);\r\n\tAddSText(0, 18, TRUE, \"Leave the tavern\", COL_WHITE, TRUE);\r\n\tAddSLine(5);\r\n\tstorenumh = 20;\r\n}\r\n\r\nvoid S_StartBarMaid()\r\n{\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 2, TRUE, \"Gillian\", COL_GOLD, FALSE);\r\n\tAddSText(0, 9, TRUE, \"Would you like to:\", COL_GOLD, FALSE);\r\n\tAddSText(0, 12, TRUE, \"Talk to Gillian\", COL_BLUE, TRUE);\r\n\tAddSText(0, 18, TRUE, \"Say goodbye\", COL_WHITE, TRUE);\r\n\tAddSLine(5);\r\n\tstorenumh = 20;\r\n}\r\n\r\nvoid S_StartDrunk()\r\n{\r\n\tstextsize = FALSE;\r\n\tstextscrl = FALSE;\r\n\tAddSText(0, 2, TRUE, \"Farnham the Drunk\", COL_GOLD, FALSE);\r\n\tAddSText(0, 9, TRUE, \"Would you like to:\", COL_GOLD, FALSE);\r\n\tAddSText(0, 12, TRUE, \"Talk to Farnham\", COL_BLUE, TRUE);\r\n\tAddSText(0, 18, TRUE, \"Say Goodbye\", COL_WHITE, TRUE);\r\n\tAddSLine(5);\r\n\tstorenumh = 20;\r\n}\r\n\r\nvoid StartStore(char s)\r\n{\r\n\tchar t;\r\n\tint i;\r\n\r\n\tfor (t = s;; t = STORE_SMITH) {\r\n\t\tsbookflag = FALSE;\r\n\t\tinvflag = FALSE;\r\n\t\tchrflag = FALSE;\r\n\t\tquestlog = FALSE;\r\n\t\tdropGoldFlag = FALSE;\r\n\t\tClearSText(0, STORE_LINES);\r\n\t\tReleaseStoreBtn();\r\n\t\tswitch (t) {\r\n\t\tcase STORE_SMITH:\r\n\t\t\tS_StartSmith();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SBUY:\r\n\t\t\tif (storenumh > 0)\r\n\t\t\t\tS_StartSBuy();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SSELL:\r\n\t\t\tS_StartSSell();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SREPAIR:\r\n\t\t\tS_StartSRepair();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WITCH:\r\n\t\t\tS_StartWitch();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WBUY:\r\n\t\t\tif (storenumh > 0)\r\n\t\t\t\tS_StartWBuy();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WSELL:\r\n\t\t\tS_StartWSell();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WRECHARGE:\r\n\t\t\tS_StartWRecharge();\r\n\t\t\tbreak;\r\n\t\tcase STORE_NOMONEY:\r\n\t\t\tS_StartNoMoney();\r\n\t\t\tbreak;\r\n\t\tcase STORE_NOROOM:\r\n\t\t\tS_StartNoRoom();\r\n\t\t\tbreak;\r\n\t\tcase STORE_CONFIRM:\r\n\t\t\tS_StartConfirm();\r\n\t\t\tbreak;\r\n\t\tcase STORE_BOY:\r\n\t\t\tS_StartBoy();\r\n\t\t\tbreak;\r\n\t\tcase STORE_BBOY:\r\n\t\t\tS_StartBBoy();\r\n\t\t\tbreak;\r\n\t\tcase STORE_HEALER:\r\n\t\t\tS_StartHealer();\r\n\t\t\tbreak;\r\n\t\tcase STORE_STORY:\r\n\t\t\tS_StartStory();\r\n\t\t\tbreak;\r\n\t\tcase STORE_HBUY:\r\n\t\t\tif (storenumh > 0)\r\n\t\t\t\tS_StartHBuy();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SIDENTIFY:\r\n\t\t\tS_StartSIdentify();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SPBUY:\r\n\t\t\tif (!S_StartSPBuy())\r\n\t\t\t\treturn;\r\n\t\t\tbreak;\r\n\t\tcase STORE_GOSSIP:\r\n\t\t\tS_StartTalk();\r\n\t\t\tbreak;\r\n\t\tcase STORE_IDSHOW:\r\n\t\t\tS_StartIdShow();\r\n\t\t\tbreak;\r\n\t\tcase STORE_TAVERN:\r\n\t\t\tS_StartTavern();\r\n\t\t\tbreak;\r\n\t\tcase STORE_DRUNK:\r\n\t\t\tS_StartDrunk();\r\n\t\t\tbreak;\r\n\t\tcase STORE_BARMAID:\r\n\t\t\tS_StartBarMaid();\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < STORE_LINES; i++) {\r\n\t\t\tif (stext[i]._ssel)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tstextsel = i == STORE_LINES ? -1 : i;\r\n\t\tstextflag = t;\r\n\t\tif (t != STORE_SBUY || storenumh)\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid DrawSText()\r\n{\r\n\tint i;\r\n\r\n\tif (!stextsize)\r\n\t\tDrawSTextBack();\r\n\telse\r\n\t\tDrawQTextBack();\r\n\r\n\tif (stextscrl) {\r\n\t\tswitch (stextflag) {\r\n\t\tcase STORE_SBUY:\r\n\t\t\tS_ScrollSBuy(stextsval);\r\n\t\t\tbreak;\r\n\t\tcase STORE_SSELL:\r\n\t\tcase STORE_SREPAIR:\r\n\t\tcase STORE_WSELL:\r\n\t\tcase STORE_WRECHARGE:\r\n\t\tcase STORE_SIDENTIFY:\r\n\t\t\tS_ScrollSSell(stextsval);\r\n\t\t\tbreak;\r\n\t\tcase STORE_WBUY:\r\n\t\t\tS_ScrollWBuy(stextsval);\r\n\t\t\tbreak;\r\n\t\tcase STORE_HBUY:\r\n\t\t\tS_ScrollHBuy(stextsval);\r\n\t\t\tbreak;\r\n\t\tcase STORE_SPBUY:\r\n\t\t\tS_ScrollSPBuy(stextsval);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; i < STORE_LINES; i++) {\r\n\t\tif (stext[i]._sline)\r\n\t\t\tDrawSLine(i);\r\n\t\tif (stext[i]._sstr[0])\r\n\t\t\tPrintSString(stext[i]._sx, i, stext[i]._sjust, stext[i]._sstr, stext[i]._sclr, stext[i]._sval);\r\n\t}\r\n\r\n\tif (stextscrl)\r\n\t\tDrawSSlider(4, 20);\r\n\r\n\tInStoreFlag = (InStoreFlag & 7) + 1;\r\n}\r\n\r\nvoid STextESC()\r\n{\r\n\tif (qtextflag) {\r\n\t\tqtextflag = FALSE;\r\n\t\tif (leveltype == DTYPE_TOWN)\r\n\t\t\tstream_stop();\r\n\t} else {\r\n\t\tswitch (stextflag) {\r\n\t\tcase STORE_SMITH:\r\n\t\tcase STORE_WITCH:\r\n\t\tcase STORE_BOY:\r\n\t\tcase STORE_BBOY:\r\n\t\tcase STORE_HEALER:\r\n\t\tcase STORE_STORY:\r\n\t\tcase STORE_TAVERN:\r\n\t\tcase STORE_DRUNK:\r\n\t\tcase STORE_BARMAID:\r\n\t\t\tstextflag = STORE_NONE;\r\n\t\t\tbreak;\r\n\t\tcase STORE_GOSSIP:\r\n\t\t\tStartStore(stextshold);\r\n\t\t\tstextsel = stextlhold;\r\n\t\t\tbreak;\r\n\t\tcase STORE_SBUY:\r\n\t\t\tStartStore(STORE_SMITH);\r\n\t\t\tstextsel = 12;\r\n\t\t\tbreak;\r\n\t\tcase STORE_SPBUY:\r\n\t\t\tStartStore(STORE_SMITH);\r\n\t\t\tstextsel = 14;\r\n\t\t\tbreak;\r\n\t\tcase STORE_SSELL:\r\n\t\t\tStartStore(STORE_SMITH);\r\n\t\t\tstextsel = 16;\r\n\t\t\tbreak;\r\n\t\tcase STORE_SREPAIR:\r\n\t\t\tStartStore(STORE_SMITH);\r\n\t\t\tstextsel = 18;\r\n\t\t\tbreak;\r\n\t\tcase STORE_WBUY:\r\n\t\t\tStartStore(STORE_WITCH);\r\n\t\t\tstextsel = 14;\r\n\t\t\tbreak;\r\n\t\tcase STORE_WSELL:\r\n\t\t\tStartStore(STORE_WITCH);\r\n\t\t\tstextsel = 16;\r\n\t\t\tbreak;\r\n\t\tcase STORE_WRECHARGE:\r\n\t\t\tStartStore(STORE_WITCH);\r\n\t\t\tstextsel = 18;\r\n\t\t\tbreak;\r\n\t\tcase STORE_HBUY:\r\n\t\t\tStartStore(STORE_HEALER);\r\n\t\t\tstextsel = 16;\r\n\t\t\tbreak;\r\n\t\tcase STORE_SIDENTIFY:\r\n\t\t\tStartStore(STORE_STORY);\r\n\t\t\tstextsel = 14;\r\n\t\t\tbreak;\r\n\t\tcase STORE_IDSHOW:\r\n\t\t\tStartStore(STORE_SIDENTIFY);\r\n\t\t\tbreak;\r\n\t\tcase STORE_NOMONEY:\r\n\t\tcase STORE_NOROOM:\r\n\t\tcase STORE_CONFIRM:\r\n\t\t\tStartStore(stextshold);\r\n\t\t\tstextsel = stextlhold;\r\n\t\t\tstextsval = stextvhold;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid STextUp()\r\n{\r\n\tPlaySFX(IS_TITLEMOV);\r\n\tif (stextsel == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (stextscrl) {\r\n\t\tif (stextsel == stextup) {\r\n\t\t\tif (stextsval)\r\n\t\t\t\tstextsval--;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstextsel--;\r\n\t\twhile (!stext[stextsel]._ssel) {\r\n\t\t\tif (!stextsel)\r\n\t\t\t\tstextsel = STORE_LINES - 1;\r\n\t\t\telse\r\n\t\t\t\tstextsel--;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!stextsel)\r\n\t\tstextsel = STORE_LINES - 1;\r\n\telse\r\n\t\tstextsel--;\r\n\r\n\twhile (!stext[stextsel]._ssel) {\r\n\t\tif (!stextsel)\r\n\t\t\tstextsel = STORE_LINES - 1;\r\n\t\telse\r\n\t\t\tstextsel--;\r\n\t}\r\n}\r\n\r\nvoid STextDown()\r\n{\r\n\tPlaySFX(IS_TITLEMOV);\r\n\tif (stextsel == -1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (stextscrl) {\r\n\t\tif (stextsel == stextdown) {\r\n\t\t\tif (stextsval < stextsmax)\r\n\t\t\t\tstextsval++;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstextsel++;\r\n\t\twhile (!stext[stextsel]._ssel) {\r\n\t\t\tif (stextsel == STORE_LINES - 1)\r\n\t\t\t\tstextsel = 0;\r\n\t\t\telse\r\n\t\t\t\tstextsel++;\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (stextsel == STORE_LINES - 1)\r\n\t\tstextsel = 0;\r\n\telse\r\n\t\tstextsel++;\r\n\r\n\twhile (!stext[stextsel]._ssel) {\r\n\t\tif (stextsel == STORE_LINES - 1)\r\n\t\t\tstextsel = 0;\r\n\t\telse\r\n\t\t\tstextsel++;\r\n\t}\r\n}\r\n\r\nvoid STextPrior()\r\n{\r\n\tPlaySFX(IS_TITLEMOV);\r\n\tif (stextsel != -1 && stextscrl) {\r\n\t\tif (stextsel == stextup) {\r\n\t\t\tif (stextsval)\r\n\t\t\t\tstextsval -= 4;\r\n\t\t\tstextsval = stextsval;\r\n\t\t\tif (stextsval < 0)\r\n\t\t\t\tstextsval = 0;\r\n\t\t} else {\r\n\t\t\tstextsel = stextup;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid STextNext()\r\n{\r\n\tPlaySFX(IS_TITLEMOV);\r\n\tif (stextsel != -1 && stextscrl) {\r\n\t\tif (stextsel == stextdown) {\r\n\t\t\tif (stextsval < stextsmax)\r\n\t\t\t\tstextsval += 4;\r\n\t\t\tif (stextsval > stextsmax)\r\n\t\t\t\tstextsval = stextsmax;\r\n\t\t} else {\r\n\t\t\tstextsel = stextdown;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid S_SmithEnter()\r\n{\r\n\tswitch (stextsel) {\r\n\tcase 10:\r\n\t\ttalker = 0;\r\n\t\tstextlhold = 10;\r\n\t\tstextshold = STORE_SMITH;\r\n\t\tgossipstart = TEXT_GRISWOLD2;\r\n\t\tgossipend = TEXT_GRISWOLD13;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t\tbreak;\r\n\tcase 12:\r\n\t\tStartStore(STORE_SBUY);\r\n\t\tbreak;\r\n\tcase 14:\r\n\t\tStartStore(STORE_SPBUY);\r\n\t\tbreak;\r\n\tcase 16:\r\n\t\tStartStore(STORE_SSELL);\r\n\t\tbreak;\r\n\tcase 18:\r\n\t\tStartStore(STORE_SREPAIR);\r\n\t\tbreak;\r\n\tcase 20:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid SetGoldCurs(int pnum, int i)\r\n{\r\n\tif (plr[pnum].InvList[i]._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_LARGE;\r\n\telse if (plr[pnum].InvList[i]._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_SMALL;\r\n\telse\r\n\t\tplr[pnum].InvList[i]._iCurs = ICURS_GOLD_MEDIUM;\r\n}\r\n\r\nvoid SetSpdbarGoldCurs(int pnum, int i)\r\n{\r\n\tif (plr[pnum].SpdList[i]._ivalue >= GOLD_MEDIUM_LIMIT)\r\n\t\tplr[pnum].SpdList[i]._iCurs = ICURS_GOLD_LARGE;\r\n\telse if (plr[pnum].SpdList[i]._ivalue <= GOLD_SMALL_LIMIT)\r\n\t\tplr[pnum].SpdList[i]._iCurs = ICURS_GOLD_SMALL;\r\n\telse\r\n\t\tplr[pnum].SpdList[i]._iCurs = ICURS_GOLD_MEDIUM;\r\n}\r\n\r\nvoid TakePlrsMoney(int cost)\r\n{\r\n\tint i;\r\n\r\n\tplr[myplr]._pGold = CalculateGold(myplr) - cost;\r\n\tfor (i = 0; i < MAXBELTITEMS && cost > 0; i++) {\r\n\t\tif (plr[myplr].SpdList[i]._itype == ITYPE_GOLD && plr[myplr].SpdList[i]._ivalue != GOLD_MAX_LIMIT) {\r\n\t\t\tif (cost < plr[myplr].SpdList[i]._ivalue) {\r\n\t\t\t\tplr[myplr].SpdList[i]._ivalue -= cost;\r\n\t\t\t\tSetSpdbarGoldCurs(myplr, i);\r\n\t\t\t\tcost = 0;\r\n\t\t\t} else {\r\n\t\t\t\tcost -= plr[myplr].SpdList[i]._ivalue;\r\n\t\t\t\tRemoveSpdBarItem(myplr, i);\r\n\t\t\t\ti = -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (cost > 0) {\r\n\t\tfor (i = 0; i < MAXBELTITEMS && cost > 0; i++) {\r\n\t\t\tif (plr[myplr].SpdList[i]._itype == ITYPE_GOLD) {\r\n\t\t\t\tif (cost < plr[myplr].SpdList[i]._ivalue) {\r\n\t\t\t\t\tplr[myplr].SpdList[i]._ivalue -= cost;\r\n\t\t\t\t\tSetSpdbarGoldCurs(myplr, i);\r\n\t\t\t\t\tcost = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcost -= plr[myplr].SpdList[i]._ivalue;\r\n\t\t\t\t\tRemoveSpdBarItem(myplr, i);\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tforce_redraw = 255;\r\n\tif (cost > 0) {\r\n\t\tfor (i = 0; i < plr[myplr]._pNumInv && cost > 0; i++) {\r\n\t\t\tif (plr[myplr].InvList[i]._itype == ITYPE_GOLD && plr[myplr].InvList[i]._ivalue != GOLD_MAX_LIMIT) {\r\n\t\t\t\tif (cost < plr[myplr].InvList[i]._ivalue) {\r\n\t\t\t\t\tplr[myplr].InvList[i]._ivalue -= cost;\r\n\t\t\t\t\tSetGoldCurs(myplr, i);\r\n\t\t\t\t\tcost = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcost -= plr[myplr].InvList[i]._ivalue;\r\n\t\t\t\t\tRemoveInvItem(myplr, i);\r\n\t\t\t\t\ti = -1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (cost > 0) {\r\n\t\t\tfor (i = 0; i < plr[myplr]._pNumInv && cost > 0; i++) {\r\n\t\t\t\tif (plr[myplr].InvList[i]._itype == ITYPE_GOLD) {\r\n\t\t\t\t\tif (cost < plr[myplr].InvList[i]._ivalue) {\r\n\t\t\t\t\t\tplr[myplr].InvList[i]._ivalue -= cost;\r\n\t\t\t\t\t\tSetGoldCurs(myplr, i);\r\n\t\t\t\t\t\tcost = 0;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcost -= plr[myplr].InvList[i]._ivalue;\r\n\t\t\t\t\t\tRemoveInvItem(myplr, i);\r\n\t\t\t\t\t\ti = -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SmithBuyItem()\r\n{\r\n\tint idx;\r\n\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\tif (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_NORMAL)\r\n\t\tplr[myplr].HoldItem._iIdentified = FALSE;\r\n\tStoreAutoPlace();\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\tif (idx == SMITH_ITEMS - 1) {\r\n\t\tsmithitem[SMITH_ITEMS - 1]._itype = ITYPE_NONE;\r\n\t} else {\r\n\t\tfor (; smithitem[idx + 1]._itype != ITYPE_NONE; idx++) {\r\n\t\t\tsmithitem[idx] = smithitem[idx + 1];\r\n\t\t}\r\n\t\tsmithitem[idx]._itype = ITYPE_NONE;\r\n\t}\r\n\tCalcPlrInv(myplr, TRUE);\r\n}\r\n\r\nvoid S_SBuyEnter()\r\n{\r\n\tint idx, i;\r\n\tBOOL done;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_SMITH);\r\n\t\tstextsel = 12;\r\n\t} else {\r\n\t\tstextlhold = stextsel;\r\n\t\tstextvhold = stextsval;\r\n\t\tstextshold = STORE_SBUY;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tif (plr[myplr]._pGold < smithitem[idx]._iIvalue) {\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\t} else {\r\n\t\t\tplr[myplr].HoldItem = smithitem[idx];\r\n\t\t\tSetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\tdone = FALSE;\r\n\r\n\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM && !done; i++) {\r\n\t\t\t\tdone = AutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);\r\n\t\t\t}\r\n\t\t\tif (done)\r\n\t\t\t\tStartStore(STORE_CONFIRM);\r\n\t\t\telse\r\n\t\t\t\tStartStore(STORE_NOROOM);\r\n\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid SmithBuyPItem()\r\n{\r\n\tint i, xx, idx;\r\n\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\tif (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_NORMAL)\r\n\t\tplr[myplr].HoldItem._iIdentified = FALSE;\r\n\tStoreAutoPlace();\r\n\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\txx = 0;\r\n\tfor (i = 0; idx >= 0; i++) {\r\n\t\tif (premiumitem[i]._itype != ITYPE_NONE) {\r\n\t\t\tidx--;\r\n\t\t\txx = i;\r\n\t\t}\r\n\t}\r\n\r\n\tpremiumitem[xx]._itype = ITYPE_NONE;\r\n\tnumpremium--;\r\n#ifdef HELLFIRE\r\n\tSpawnPremium(myplr);\r\n#else\r\n\tSpawnPremium(plr[myplr]._pLevel);\r\n#endif\r\n}\r\n\r\nvoid S_SPBuyEnter()\r\n{\r\n\tint i, idx, xx;\r\n\tBOOL done;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_SMITH);\r\n\t\tstextsel = 14;\r\n\t} else {\r\n\t\tstextshold = STORE_SPBUY;\r\n\t\tstextlhold = stextsel;\r\n\t\tstextvhold = stextsval;\r\n\t\txx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tidx = 0;\r\n\t\tfor (i = 0; xx >= 0; i++) {\r\n\t\t\tif (premiumitem[i]._itype != ITYPE_NONE) {\r\n\t\t\t\txx--;\r\n\t\t\t\tidx = i;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (plr[myplr]._pGold < premiumitem[idx]._iIvalue) {\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\t} else {\r\n\t\t\tplr[myplr].HoldItem = premiumitem[idx];\r\n\t\t\tSetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\tdone = FALSE;\r\n\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM && !done; i++) {\r\n\t\t\t\tdone = AutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);\r\n\t\t\t}\r\n\t\t\tif (done)\r\n\t\t\t\tStartStore(STORE_CONFIRM);\r\n\t\t\telse\r\n\t\t\t\tStartStore(STORE_NOROOM);\r\n\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL StoreGoldFit(int idx)\r\n{\r\n\tint i, sz, cost, numsqrs;\r\n\r\n\tcost = storehold[idx]._iIvalue;\r\n\tsz = cost / GOLD_MAX_LIMIT;\r\n\tif (cost % GOLD_MAX_LIMIT != 0)\r\n\t\tsz++;\r\n\r\n\tSetCursor_(storehold[idx]._iCurs + CURSOR_FIRSTITEM);\r\n\tnumsqrs = cursW / 28 * (cursH / 28);\r\n\tSetCursor_(CURSOR_HAND);\r\n\r\n\tif (numsqrs >= sz)\r\n\t\treturn TRUE;\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM; i++) {\r\n\t\tif (plr[myplr].InvGrid[i] == 0)\r\n\t\t\tnumsqrs++;\r\n\t}\r\n\r\n\tfor (i = 0; i < plr[myplr]._pNumInv; i++) {\r\n\t\tif (plr[myplr].InvList[i]._itype == ITYPE_GOLD && plr[myplr].InvList[i]._ivalue != GOLD_MAX_LIMIT) {\r\n\t\t\tif (cost + plr[myplr].InvList[i]._ivalue <= GOLD_MAX_LIMIT)\r\n\t\t\t\tcost = 0;\r\n\t\t\telse\r\n\t\t\t\tcost -= GOLD_MAX_LIMIT - plr[myplr].InvList[i]._ivalue;\r\n\t\t}\r\n\t}\r\n\r\n\tsz = cost / GOLD_MAX_LIMIT;\r\n\tif (cost % GOLD_MAX_LIMIT)\r\n\t\tsz++;\r\n\r\n\treturn numsqrs >= sz;\r\n}\r\n\r\nvoid PlaceStoreGold(int v)\r\n{\r\n\tBOOL done;\r\n\tint ii, xx, yy, i;\r\n\r\n\tdone = FALSE;\r\n\r\n\tfor (i = 0; i < NUM_INV_GRID_ELEM && !done; i++) {\r\n\t\tyy = 10 * (i / 10);\r\n\t\txx = i % 10;\r\n\t\tif (plr[myplr].InvGrid[xx + yy] == 0) {\r\n\t\t\tii = plr[myplr]._pNumInv;\r\n\t\t\tGetGoldSeed(myplr, &golditem);\r\n\t\t\tplr[myplr].InvList[ii] = golditem;\r\n\t\t\tplr[myplr]._pNumInv++;\r\n\t\t\tplr[myplr].InvGrid[xx + yy] = plr[myplr]._pNumInv;\r\n\t\t\tplr[myplr].InvList[ii]._ivalue = v;\r\n\t\t\tSetGoldCurs(myplr, ii);\r\n\t\t\tdone = TRUE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid StoreSellItem()\r\n{\r\n\tint i, idx, cost;\r\n\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\tif (storehidx[idx] >= 0)\r\n\t\tRemoveInvItem(myplr, storehidx[idx]);\r\n\telse\r\n\t\tRemoveSpdBarItem(myplr, -(storehidx[idx] + 1));\r\n\tcost = storehold[idx]._iIvalue;\r\n\tstorenumh--;\r\n\tif (idx != storenumh) {\r\n\t\twhile (idx < storenumh) {\r\n\t\t\tstorehold[idx] = storehold[idx + 1];\r\n\t\t\tstorehidx[idx] = storehidx[idx + 1];\r\n\t\t\tidx++;\r\n\t\t}\r\n\t}\r\n\tplr[myplr]._pGold += cost;\r\n\tfor (i = 0; i < plr[myplr]._pNumInv && cost > 0; i++) {\r\n\t\tif (plr[myplr].InvList[i]._itype == ITYPE_GOLD && plr[myplr].InvList[i]._ivalue != GOLD_MAX_LIMIT) {\r\n\t\t\tif (cost + plr[myplr].InvList[i]._ivalue <= GOLD_MAX_LIMIT) {\r\n\t\t\t\tplr[myplr].InvList[i]._ivalue += cost;\r\n\t\t\t\tSetGoldCurs(myplr, i);\r\n\t\t\t\tcost = 0;\r\n\t\t\t} else {\r\n\t\t\t\tcost -= GOLD_MAX_LIMIT - plr[myplr].InvList[i]._ivalue;\r\n\t\t\t\tplr[myplr].InvList[i]._ivalue = GOLD_MAX_LIMIT;\r\n\t\t\t\tSetGoldCurs(myplr, i);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (cost > 0) {\r\n\t\twhile (cost > GOLD_MAX_LIMIT) {\r\n\t\t\tPlaceStoreGold(GOLD_MAX_LIMIT);\r\n\t\t\tcost -= GOLD_MAX_LIMIT;\r\n\t\t}\r\n\t\tPlaceStoreGold(cost);\r\n\t}\r\n}\r\n\r\nvoid S_SSellEnter()\r\n{\r\n\tint idx;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_SMITH);\r\n\t\tstextsel = 16;\r\n\t} else {\r\n\t\tstextlhold = stextsel;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tstextshold = STORE_SSELL;\r\n\t\tstextvhold = stextsval;\r\n\t\tplr[myplr].HoldItem = storehold[idx];\r\n\r\n\t\tif (StoreGoldFit(idx))\r\n\t\t\tStartStore(STORE_CONFIRM);\r\n\t\telse\r\n\t\t\tStartStore(STORE_NOROOM);\r\n\t}\r\n}\r\n\r\nvoid SmithRepairItem()\r\n{\r\n\tint i, idx;\r\n\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\tstorehold[idx]._iDurability = storehold[idx]._iMaxDur;\r\n\r\n\ti = storehidx[idx];\r\n\tif (i < 0) {\r\n\t\tif (i == -1)\r\n\t\t\tplr[myplr].InvBody[INVLOC_HEAD]._iDurability = plr[myplr].InvBody[INVLOC_HEAD]._iMaxDur;\r\n\t\tif (i == -2)\r\n\t\t\tplr[myplr].InvBody[INVLOC_CHEST]._iDurability = plr[myplr].InvBody[INVLOC_CHEST]._iMaxDur;\r\n\t\tif (i == -3)\r\n\t\t\tplr[myplr].InvBody[INVLOC_HAND_LEFT]._iDurability = plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMaxDur;\r\n\t\tif (i == -4)\r\n\t\t\tplr[myplr].InvBody[INVLOC_HAND_RIGHT]._iDurability = plr[myplr].InvBody[INVLOC_HAND_RIGHT]._iMaxDur;\r\n\t} else {\r\n\t\tplr[myplr].InvList[i]._iDurability = plr[myplr].InvList[i]._iMaxDur;\r\n\t}\r\n}\r\n\r\nvoid S_SRepairEnter()\r\n{\r\n\tint idx;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_SMITH);\r\n\t\tstextsel = 18;\r\n\t} else {\r\n\t\tstextshold = STORE_SREPAIR;\r\n\t\tstextlhold = stextsel;\r\n\t\tstextvhold = stextsval;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tplr[myplr].HoldItem = storehold[idx];\r\n\t\tif (plr[myplr]._pGold < storehold[idx]._iIvalue)\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\telse\r\n\t\t\tStartStore(STORE_CONFIRM);\r\n\t}\r\n}\r\n\r\nvoid S_WitchEnter()\r\n{\r\n\tswitch (stextsel) {\r\n\tcase 12:\r\n\t\tstextlhold = 12;\r\n\t\ttalker = 6;\r\n\t\tstextshold = STORE_WITCH;\r\n\t\tgossipstart = TEXT_ADRIA2;\r\n\t\tgossipend = TEXT_ADRIA13;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t\treturn;\r\n\tcase 14:\r\n\t\tStartStore(STORE_WBUY);\r\n\t\treturn;\r\n\tcase 16:\r\n\t\tStartStore(STORE_WSELL);\r\n\t\treturn;\r\n\tcase 18:\r\n\t\tStartStore(STORE_WRECHARGE);\r\n\t\treturn;\r\n\tcase 20:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid WitchBuyItem()\r\n{\r\n\tint idx;\r\n\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\r\n\tif (idx < 3)\r\n\t\tplr[myplr].HoldItem._iSeed = GetRndSeed();\r\n\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\tStoreAutoPlace();\r\n\r\n\tif (idx >= 3) {\r\n\t\tif (idx == WITCH_ITEMS - 1) {\r\n\t\t\twitchitem[WITCH_ITEMS - 1]._itype = ITYPE_NONE;\r\n\t\t} else {\r\n\t\t\tfor (; witchitem[idx + 1]._itype != ITYPE_NONE; idx++) {\r\n\t\t\t\twitchitem[idx] = witchitem[idx + 1];\r\n\t\t\t}\r\n\t\t\twitchitem[idx]._itype = ITYPE_NONE;\r\n\t\t}\r\n\t}\r\n\r\n\tCalcPlrInv(myplr, TRUE);\r\n}\r\n\r\nvoid S_WBuyEnter()\r\n{\r\n\tint i, idx;\r\n\tBOOL done;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_WITCH);\r\n\t\tstextsel = 14;\r\n\t} else {\r\n\t\tstextlhold = stextsel;\r\n\t\tstextvhold = stextsval;\r\n\t\tstextshold = STORE_WBUY;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\r\n\t\tif (plr[myplr]._pGold < witchitem[idx]._iIvalue) {\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\t} else {\r\n\t\t\tplr[myplr].HoldItem = witchitem[idx];\r\n\t\t\tSetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\tdone = FALSE;\r\n\r\n\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM && !done; i++) {\r\n\t\t\t\tdone = SpecialAutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);\r\n\t\t\t}\r\n\r\n\t\t\tif (done)\r\n\t\t\t\tStartStore(STORE_CONFIRM);\r\n\t\t\telse\r\n\t\t\t\tStartStore(STORE_NOROOM);\r\n\r\n\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid S_WSellEnter()\r\n{\r\n\tint idx;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_WITCH);\r\n\t\tstextsel = 16;\r\n\t} else {\r\n\t\tstextlhold = stextsel;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tstextshold = STORE_WSELL;\r\n\t\tstextvhold = stextsval;\r\n\t\tplr[myplr].HoldItem = storehold[idx];\r\n\t\tif (StoreGoldFit(idx))\r\n\t\t\tStartStore(STORE_CONFIRM);\r\n\t\telse\r\n\t\t\tStartStore(STORE_NOROOM);\r\n\t}\r\n}\r\n\r\nvoid WitchRechargeItem()\r\n{\r\n\tint i, idx;\r\n\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\tstorehold[idx]._iCharges = storehold[idx]._iMaxCharges;\r\n\r\n\ti = storehidx[idx];\r\n\tif (i < 0)\r\n\t\tplr[myplr].InvBody[INVLOC_HAND_LEFT]._iCharges = plr[myplr].InvBody[INVLOC_HAND_LEFT]._iMaxCharges;\r\n\telse\r\n\t\tplr[myplr].InvList[i]._iCharges = plr[myplr].InvList[i]._iMaxCharges;\r\n\r\n\tCalcPlrInv(myplr, TRUE);\r\n}\r\n\r\nvoid S_WRechargeEnter()\r\n{\r\n\tint idx;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_WITCH);\r\n\t\tstextsel = 18;\r\n\t} else {\r\n\t\tstextshold = STORE_WRECHARGE;\r\n\t\tstextlhold = stextsel;\r\n\t\tstextvhold = stextsval;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tplr[myplr].HoldItem = storehold[idx];\r\n\t\tif (plr[myplr]._pGold < storehold[idx]._iIvalue)\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\telse\r\n\t\t\tStartStore(STORE_CONFIRM);\r\n\t}\r\n}\r\n\r\nvoid S_BoyEnter()\r\n{\r\n\tif (boyitem._itype != ITYPE_NONE && stextsel == 18) {\r\n\t\tif (plr[myplr]._pGold < 50) {\r\n\t\t\tstextshold = STORE_BOY;\r\n\t\t\tstextlhold = 18;\r\n\t\t\tstextvhold = stextsval;\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\t} else {\r\n\t\t\tTakePlrsMoney(50);\r\n\t\t\tStartStore(STORE_BBOY);\r\n\t\t}\r\n\t} else if (stextsel == 8 && boyitem._itype != ITYPE_NONE || stextsel == 12 && boyitem._itype == ITYPE_NONE) {\r\n\t\ttalker = 8;\r\n\t\tstextshold = STORE_BOY;\r\n\t\tstextlhold = stextsel;\r\n\t\tgossipstart = TEXT_WIRT2;\r\n\t\tgossipend = TEXT_WIRT12;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t} else {\r\n\t\tstextflag = STORE_NONE;\r\n\t}\r\n}\r\n\r\nvoid BoyBuyItem()\r\n{\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\tStoreAutoPlace();\r\n\tboyitem._itype = ITYPE_NONE;\r\n\tstextshold = STORE_BOY;\r\n\tCalcPlrInv(myplr, TRUE);\r\n}\r\n\r\nvoid HealerBuyItem()\r\n{\r\n\tint idx;\r\n\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (idx < 2)\r\n\t\t\tplr[myplr].HoldItem._iSeed = GetRndSeed();\r\n\t} else {\r\n\t\tif (idx < 3)\r\n\t\t\tplr[myplr].HoldItem._iSeed = GetRndSeed();\r\n\t}\r\n\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\tif (plr[myplr].HoldItem._iMagical == ITEM_QUALITY_NORMAL)\r\n\t\tplr[myplr].HoldItem._iIdentified = FALSE;\r\n\tStoreAutoPlace();\r\n\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (idx < 2)\r\n\t\t\treturn;\r\n\t} else {\r\n\t\tif (idx < 3)\r\n\t\t\treturn;\r\n\t}\r\n\tidx = stextvhold + ((stextlhold - stextup) >> 2);\r\n\tif (idx == 19) {\r\n\t\thealitem[19]._itype = ITYPE_NONE;\r\n\t} else {\r\n\t\tfor (; healitem[idx + 1]._itype != ITYPE_NONE; idx++) {\r\n\t\t\thealitem[idx] = healitem[idx + 1];\r\n\t\t}\r\n\t\thealitem[idx]._itype = ITYPE_NONE;\r\n\t}\r\n\tCalcPlrInv(myplr, TRUE);\r\n}\r\n\r\nvoid S_BBuyEnter()\r\n{\r\n\tBOOL done;\r\n\tint i;\r\n\r\n\tif (stextsel == 10) {\r\n\t\tstextshold = STORE_BBOY;\r\n\t\tstextvhold = stextsval;\r\n\t\tstextlhold = 10;\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr]._pGold < boyitem._iIvalue - (boyitem._iIvalue >> 2)) {\r\n#else\r\n\t\tif (plr[myplr]._pGold < boyitem._iIvalue + (boyitem._iIvalue >> 1)) {\r\n#endif\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\t} else {\r\n\t\t\tplr[myplr].HoldItem = boyitem;\r\n#ifdef HELLFIRE\r\n\t\t\tplr[myplr].HoldItem._iIvalue -= plr[myplr].HoldItem._iIvalue >> 2;\r\n#else\r\n\t\t\tplr[myplr].HoldItem._iIvalue += plr[myplr].HoldItem._iIvalue >> 1;\r\n#endif\r\n\t\t\tSetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\tdone = FALSE;\r\n\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM && !done; i++) {\r\n\t\t\t\tdone = AutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);\r\n\t\t\t}\r\n\t\t\tif (done)\r\n\t\t\t\tStartStore(STORE_CONFIRM);\r\n\t\t\telse\r\n\t\t\t\tStartStore(STORE_NOROOM);\r\n\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t}\r\n\t} else {\r\n\t\tstextflag = STORE_NONE;\r\n\t}\r\n}\r\n\r\nvoid StoryIdItem()\r\n{\r\n\tint idx;\r\n\r\n\tidx = storehidx[((stextlhold - stextup) >> 2) + stextvhold];\r\n\tif (idx < 0) {\r\n\t\tif (idx == -1)\r\n\t\t\tplr[myplr].InvBody[INVLOC_HEAD]._iIdentified = TRUE;\r\n\t\tif (idx == -2)\r\n\t\t\tplr[myplr].InvBody[INVLOC_CHEST]._iIdentified = TRUE;\r\n\t\tif (idx == -3)\r\n\t\t\tplr[myplr].InvBody[INVLOC_HAND_LEFT]._iIdentified = TRUE;\r\n\t\tif (idx == -4)\r\n\t\t\tplr[myplr].InvBody[INVLOC_HAND_RIGHT]._iIdentified = TRUE;\r\n\t\tif (idx == -5)\r\n\t\t\tplr[myplr].InvBody[INVLOC_RING_LEFT]._iIdentified = TRUE;\r\n\t\tif (idx == -6)\r\n\t\t\tplr[myplr].InvBody[INVLOC_RING_RIGHT]._iIdentified = TRUE;\r\n\t\tif (idx == -7)\r\n\t\t\tplr[myplr].InvBody[INVLOC_AMULET]._iIdentified = TRUE;\r\n\t} else {\r\n\t\tplr[myplr].InvList[idx]._iIdentified = TRUE;\r\n\t}\r\n\tplr[myplr].HoldItem._iIdentified = TRUE;\r\n\tTakePlrsMoney(plr[myplr].HoldItem._iIvalue);\r\n\tCalcPlrInv(myplr, TRUE);\r\n}\r\n\r\nvoid S_ConfirmEnter()\r\n{\r\n\tif (stextsel == 18) {\r\n\t\tswitch (stextshold) {\r\n\t\tcase STORE_SBUY:\r\n\t\t\tSmithBuyItem();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SSELL:\r\n\t\tcase STORE_WSELL:\r\n\t\t\tStoreSellItem();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SREPAIR:\r\n\t\t\tSmithRepairItem();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WBUY:\r\n\t\t\tWitchBuyItem();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WRECHARGE:\r\n\t\t\tWitchRechargeItem();\r\n\t\t\tbreak;\r\n\t\tcase STORE_BBOY:\r\n\t\t\tBoyBuyItem();\r\n\t\t\tbreak;\r\n\t\tcase STORE_HBUY:\r\n\t\t\tHealerBuyItem();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SIDENTIFY:\r\n\t\t\tStoryIdItem();\r\n\t\t\tStartStore(STORE_IDSHOW);\r\n\t\t\treturn;\r\n\t\tcase STORE_SPBUY:\r\n\t\t\tSmithBuyPItem();\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tStartStore(stextshold);\r\n\t} else {\r\n\t\tStartStore(stextshold);\r\n\t\tstextsel = stextlhold;\r\n\t\tstextsval = stextvhold;\r\n\t}\r\n}\r\n\r\nvoid S_HealerEnter()\r\n{\r\n\tswitch (stextsel) {\r\n\tcase 12:\r\n\t\tstextlhold = 12;\r\n\t\ttalker = 1;\r\n\t\tstextshold = STORE_HEALER;\r\n\t\tgossipstart = TEXT_PEPIN2;\r\n\t\tgossipend = TEXT_PEPIN11;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t\tbreak;\r\n#ifdef HELLFIRE\r\n\tcase 14:\r\n\t\tStartStore(STORE_HBUY);\r\n\t\tbreak;\r\n\tcase 16:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n#else\r\n\tcase 14:\r\n\t\tif (plr[myplr]._pHitPoints != plr[myplr]._pMaxHP)\r\n\t\t\tPlaySFX(IS_CAST8);\r\n\t\tdrawhpflag = TRUE;\r\n\t\tplr[myplr]._pHitPoints = plr[myplr]._pMaxHP;\r\n\t\tplr[myplr]._pHPBase = plr[myplr]._pMaxHPBase;\r\n\t\tbreak;\r\n\tcase 16:\r\n\t\tStartStore(STORE_HBUY);\r\n\t\tbreak;\r\n\tcase 18:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n#endif\r\n\t}\r\n}\r\n\r\nvoid S_HBuyEnter()\r\n{\r\n\tint i, idx;\r\n\tBOOL done;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_HEALER);\r\n\t\tstextsel = 16;\r\n\t} else {\r\n\t\tstextlhold = stextsel;\r\n\t\tstextvhold = stextsval;\r\n\t\tstextshold = STORE_HBUY;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tif (plr[myplr]._pGold < healitem[idx]._iIvalue) {\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\t} else {\r\n\t\t\tplr[myplr].HoldItem = healitem[idx];\r\n\t\t\tSetCursor_(plr[myplr].HoldItem._iCurs + CURSOR_FIRSTITEM);\r\n\t\t\tdone = FALSE;\r\n\t\t\ti = 0;\r\n\t\t\tfor (i = 0; i < NUM_INV_GRID_ELEM && !done; i++) {\r\n\t\t\t\tdone = SpecialAutoPlace(myplr, i, cursW / 28, cursH / 28, FALSE);\r\n\t\t\t}\r\n\t\t\tif (done)\r\n\t\t\t\tStartStore(STORE_CONFIRM);\r\n\t\t\telse\r\n\t\t\t\tStartStore(STORE_NOROOM);\r\n\t\t\tSetCursor_(CURSOR_HAND);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid S_StoryEnter()\r\n{\r\n\tswitch (stextsel) {\r\n\tcase 12:\r\n\t\tstextlhold = 12;\r\n\t\ttalker = 4;\r\n\t\tstextshold = STORE_STORY;\r\n\t\tgossipstart = TEXT_STORY2;\r\n\t\tgossipend = TEXT_STORY11;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t\tbreak;\r\n\tcase 14:\r\n\t\tStartStore(STORE_SIDENTIFY);\r\n\t\tbreak;\r\n\tcase 18:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid S_SIDEnter()\r\n{\r\n\tint idx;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(STORE_STORY);\r\n\t\tstextsel = 14;\r\n\t} else {\r\n\t\tstextshold = STORE_SIDENTIFY;\r\n\t\tstextlhold = stextsel;\r\n\t\tstextvhold = stextsval;\r\n\t\tidx = stextsval + ((stextsel - stextup) >> 2);\r\n\t\tplr[myplr].HoldItem = storehold[idx];\r\n\t\tif (plr[myplr]._pGold < storehold[idx]._iIvalue)\r\n\t\t\tStartStore(STORE_NOMONEY);\r\n\t\telse\r\n\t\t\tStartStore(STORE_CONFIRM);\r\n\t}\r\n}\r\n\r\nvoid S_TalkEnter()\r\n{\r\n\tint i, tq, sn, la;\r\n\r\n\tif (stextsel == 22) {\r\n\t\tStartStore(stextshold);\r\n\t\tstextsel = stextlhold;\r\n\t\treturn;\r\n\t}\r\n\r\n\tsn = 0;\r\n\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\tif (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog)\r\n\t\t\tsn++;\r\n\t}\r\n\tif (sn > 6) {\r\n\t\tsn = 14 - (sn >> 1);\r\n\t\tla = 1;\r\n\t} else {\r\n\t\tsn = 15 - sn;\r\n\t\tla = 2;\r\n\t}\r\n\r\n\tif (stextsel == sn - 2) {\r\n\t\tSetRndSeed(towner[talker]._tSeed);\r\n\t\ttq = gossipstart + random_(0, gossipend - gossipstart + 1);\r\n\t\tInitQTextMsg(tq);\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (i = 0; i < MAXQUESTS; i++) {\r\n\t\tif (quests[i]._qactive == QUEST_ACTIVE && ((DWORD *)&Qtalklist[talker])[i] != -1 && quests[i]._qlog) {\r\n\t\t\tif (sn == stextsel) {\r\n\t\t\t\tInitQTextMsg(((DWORD *)&Qtalklist[talker])[i]);\r\n\t\t\t}\r\n\t\t\tsn += la;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid S_TavernEnter()\r\n{\r\n\tswitch (stextsel) {\r\n\tcase 12:\r\n\t\tstextlhold = 12;\r\n\t\ttalker = 3;\r\n\t\tstextshold = STORE_TAVERN;\r\n\t\tgossipstart = TEXT_OGDEN2;\r\n\t\tgossipend = TEXT_OGDEN10;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t\tbreak;\r\n\tcase 18:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid S_BarmaidEnter()\r\n{\r\n\tswitch (stextsel) {\r\n\tcase 12:\r\n\t\tstextlhold = 12;\r\n\t\ttalker = 7;\r\n\t\tstextshold = STORE_BARMAID;\r\n\t\tgossipstart = TEXT_GILLIAN2;\r\n\t\tgossipend = TEXT_GILLIAN10;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t\tbreak;\r\n\tcase 18:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid S_DrunkEnter()\r\n{\r\n\tswitch (stextsel) {\r\n\tcase 12:\r\n\t\tstextlhold = 12;\r\n\t\ttalker = 5;\r\n\t\tstextshold = STORE_DRUNK;\r\n\t\tgossipstart = TEXT_FARNHAM2;\r\n\t\tgossipend = TEXT_FARNHAM13;\r\n\t\tStartStore(STORE_GOSSIP);\r\n\t\tbreak;\r\n\tcase 18:\r\n\t\tstextflag = STORE_NONE;\r\n\t\tbreak;\r\n\t}\r\n}\r\n\r\nvoid STextEnter()\r\n{\r\n\tif (qtextflag) {\r\n\t\tqtextflag = FALSE;\r\n\t\tif (leveltype == DTYPE_TOWN)\r\n\t\t\tstream_stop();\r\n\t} else {\r\n\t\tPlaySFX(IS_TITLSLCT);\r\n\t\tswitch (stextflag) {\r\n\t\tcase STORE_SMITH:\r\n\t\t\tS_SmithEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SPBUY:\r\n\t\t\tS_SPBuyEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SBUY:\r\n\t\t\tS_SBuyEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SSELL:\r\n\t\t\tS_SSellEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SREPAIR:\r\n\t\t\tS_SRepairEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WITCH:\r\n\t\t\tS_WitchEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WBUY:\r\n\t\t\tS_WBuyEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WSELL:\r\n\t\t\tS_WSellEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_WRECHARGE:\r\n\t\t\tS_WRechargeEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_NOMONEY:\r\n\t\tcase STORE_NOROOM:\r\n\t\t\tStartStore(stextshold);\r\n\t\t\tstextsel = stextlhold;\r\n\t\t\tstextsval = stextvhold;\r\n\t\t\tbreak;\r\n\t\tcase STORE_CONFIRM:\r\n\t\t\tS_ConfirmEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_BOY:\r\n\t\t\tS_BoyEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_BBOY:\r\n\t\t\tS_BBuyEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_HEALER:\r\n\t\t\tS_HealerEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_STORY:\r\n\t\t\tS_StoryEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_HBUY:\r\n\t\t\tS_HBuyEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_SIDENTIFY:\r\n\t\t\tS_SIDEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_GOSSIP:\r\n\t\t\tS_TalkEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_IDSHOW:\r\n\t\t\tStartStore(STORE_SIDENTIFY);\r\n\t\t\tbreak;\r\n\t\tcase STORE_DRUNK:\r\n\t\t\tS_DrunkEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_TAVERN:\r\n\t\t\tS_TavernEnter();\r\n\t\t\tbreak;\r\n\t\tcase STORE_BARMAID:\r\n\t\t\tS_BarmaidEnter();\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid CheckStoreBtn()\r\n{\r\n\tint y;\r\n\r\n\tif (qtextflag) {\r\n\t\tqtextflag = FALSE;\r\n\t\tif (leveltype == DTYPE_TOWN)\r\n\t\t\tstream_stop();\r\n\t} else if (stextsel != -1 && MouseY >= 32 && MouseY <= 320) {\r\n\t\tif (!stextsize) {\r\n\t\t\tif (MouseX < 344 + PANEL_LEFT || MouseX > 616 + PANEL_LEFT)\r\n\t\t\t\treturn;\r\n\t\t} else {\r\n\t\t\tif (MouseX < 24 + PANEL_LEFT || MouseX > 616 + PANEL_LEFT)\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t\ty = (MouseY - 32) / 12;\r\n\t\tif (stextscrl && MouseX > 600 + PANEL_LEFT) {\r\n\t\t\tif (y == 4) {\r\n\t\t\t\tif (stextscrlubtn <= 0) {\r\n\t\t\t\t\tSTextUp();\r\n\t\t\t\t\tstextscrlubtn = 10;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstextscrlubtn--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (y == 20) {\r\n\t\t\t\tif (stextscrldbtn <= 0) {\r\n\t\t\t\t\tSTextDown();\r\n\t\t\t\t\tstextscrldbtn = 10;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstextscrldbtn--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (y >= 5) {\r\n\t\t\tif (y >= 23)\r\n\t\t\t\ty = 22;\r\n\t\t\tif (stextscrl && y < 21 && !stext[y]._ssel) {\r\n\t\t\t\tif (stext[y - 2]._ssel) {\r\n\t\t\t\t\ty -= 2;\r\n\t\t\t\t} else if (stext[y - 1]._ssel) {\r\n\t\t\t\t\ty--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (stext[y]._ssel || stextscrl && y == 22) {\r\n\t\t\t\tstextsel = y;\r\n\t\t\t\tSTextEnter();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid ReleaseStoreBtn()\r\n{\r\n\tstextscrlubtn = -1;\r\n\tstextscrldbtn = -1;\r\n}\r\n"
  },
  {
    "path": "Source/stores.h",
    "content": "/**\r\n * @file stores.h\r\n *\r\n * Interface of functionality for stores and towner dialogs.\r\n */\r\n#ifndef __STORES_H__\r\n#define __STORES_H__\r\n\r\nextern ItemStruct boyitem;\r\nextern ItemStruct premiumitem[SMITH_PREMIUM_ITEMS];\r\nextern BYTE *pSTextBoxCels;\r\nextern int premiumlevel;\r\nextern int talker;\r\nextern ItemStruct witchitem[WITCH_ITEMS];\r\nextern int numpremium;\r\nextern ItemStruct healitem[20];\r\nextern ItemStruct golditem;\r\nextern BYTE *pSTextSlidCels;\r\nextern BYTE *pSPentSpn2Cels;\r\nextern int boylevel;\r\nextern ItemStruct smithitem[SMITH_ITEMS];\r\nextern int stextdown;\r\nextern char stextflag;\r\n\r\nvoid InitStores();\r\nvoid SetupTownStores();\r\nvoid FreeStoreMem();\r\nvoid PrintSString(int x, int y, BOOL cjustflag, const char *str, char col, int val);\r\nvoid DrawSLine(int y);\r\nvoid DrawSTextHelp();\r\nvoid ClearSText(int s, int e);\r\nvoid StartStore(char s);\r\nvoid DrawSText();\r\nvoid STextESC();\r\nvoid STextUp();\r\nvoid STextDown();\r\nvoid STextPrior();\r\nvoid STextNext();\r\nvoid SetGoldCurs(int pnum, int i);\r\nvoid SetSpdbarGoldCurs(int pnum, int i);\r\nvoid TakePlrsMoney(int cost);\r\nvoid STextEnter();\r\nvoid CheckStoreBtn();\r\nvoid ReleaseStoreBtn();\r\n\r\n/* rdata */\r\n\r\nextern int SStringY[24];\r\n\r\n#endif /* __STORES_H__ */\r\n"
  },
  {
    "path": "Source/sync.cpp",
    "content": "/**\r\n * @file sync.cpp\r\n *\r\n * Implementation of functionality for syncing game state with other players.\r\n */\r\n#include \"all.h\"\r\n\r\nWORD sync_word_6AA708[MAXMONSTERS];\r\nint sgnMonsters;\r\nWORD sgwLRU[MAXMONSTERS];\r\nint sgnSyncItem;\r\nint sgnSyncPInv;\r\n\r\nstatic void sync_one_monster()\r\n{\r\n\tint i, m;\r\n\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\tm = monstactive[i];\r\n\t\tsync_word_6AA708[m] = abs(plr[myplr]._px - monster[m]._mx) + abs(plr[myplr]._py - monster[m]._my);\r\n\t\tif (monster[m]._msquelch == 0) {\r\n\t\t\tsync_word_6AA708[m] += 0x1000;\r\n\t\t} else if (sgwLRU[m] != 0) {\r\n\t\t\tsgwLRU[m]--;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic void sync_monster_pos(TSyncMonster *p, int ndx)\r\n{\r\n\tp->_mndx = ndx;\r\n\tp->_mx = monster[ndx]._mx;\r\n\tp->_my = monster[ndx]._my;\r\n\tp->_menemy = encode_enemy(ndx);\r\n\tp->_mdelta = sync_word_6AA708[ndx] > 255 ? 255 : sync_word_6AA708[ndx];\r\n\r\n\tsync_word_6AA708[ndx] = 0xFFFF;\r\n\tsgwLRU[ndx] = monster[ndx]._msquelch == 0 ? 0xFFFF : 0xFFFE;\r\n}\r\n\r\nstatic BOOL sync_monster_active(TSyncMonster *p)\r\n{\r\n\tint i, m, ndx;\r\n\tDWORD lru;\r\n\r\n\tndx = -1;\r\n\tlru = 0xFFFFFFFF;\r\n\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\tm = monstactive[i];\r\n\t\tif (sync_word_6AA708[m] < lru && sgwLRU[m] < 0xFFFE) {\r\n\t\t\tlru = sync_word_6AA708[m];\r\n\t\t\tndx = monstactive[i];\r\n\t\t}\r\n\t}\r\n\r\n\tif (ndx == -1) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tsync_monster_pos(p, ndx);\r\n\treturn TRUE;\r\n}\r\n\r\nstatic BOOL sync_monster_active2(TSyncMonster *p)\r\n{\r\n\tint i, m, ndx;\r\n\tDWORD lru;\r\n\r\n\tndx = -1;\r\n\tlru = 0xFFFE;\r\n\r\n\tfor (i = 0; i < nummonsters; i++) {\r\n\t\tif (sgnMonsters >= nummonsters) {\r\n\t\t\tsgnMonsters = 0;\r\n\t\t}\r\n\t\tm = monstactive[sgnMonsters];\r\n\t\tif (sgwLRU[m] < lru) {\r\n\t\t\tlru = sgwLRU[m];\r\n\t\t\tndx = monstactive[sgnMonsters];\r\n\t\t}\r\n\t\tsgnMonsters++;\r\n\t}\r\n\r\n\tif (ndx == -1) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tsync_monster_pos(p, ndx);\r\n\treturn TRUE;\r\n}\r\n\r\nstatic void SyncPlrInv(TSyncHeader *pHdr)\r\n{\r\n\tint ii;\r\n\tItemStruct *pItem;\r\n\r\n\tif (numitems > 0) {\r\n\t\tif (sgnSyncItem >= numitems) {\r\n\t\t\tsgnSyncItem = 0;\r\n\t\t}\r\n\t\tii = itemactive[sgnSyncItem++];\r\n\t\tpHdr->bItemI = ii;\r\n\t\tpHdr->bItemX = item[ii]._ix;\r\n\t\tpHdr->bItemY = item[ii]._iy;\r\n\t\tpHdr->wItemIndx = item[ii].IDidx;\r\n\t\tif (item[ii].IDidx == IDI_EAR) {\r\n\t\t\tpHdr->wItemCI = (item[ii]._iName[7] << 8) | item[ii]._iName[8];\r\n\t\t\tpHdr->dwItemSeed = (item[ii]._iName[9] << 24) | (item[ii]._iName[10] << 16) | (item[ii]._iName[11] << 8) | item[ii]._iName[12];\r\n\t\t\tpHdr->bItemId = item[ii]._iName[13];\r\n\t\t\tpHdr->bItemDur = item[ii]._iName[14];\r\n\t\t\tpHdr->bItemMDur = item[ii]._iName[15];\r\n\t\t\tpHdr->bItemCh = item[ii]._iName[16];\r\n\t\t\tpHdr->bItemMCh = item[ii]._iName[17];\r\n\t\t\tpHdr->wItemVal = (item[ii]._iName[18] << 8) | ((item[ii]._iCurs - ICURS_EAR_SORCEROR) << 6) | item[ii]._ivalue;\r\n\t\t\tpHdr->dwItemBuff = (item[ii]._iName[19] << 24) | (item[ii]._iName[20] << 16) | (item[ii]._iName[21] << 8) | item[ii]._iName[22];\r\n\t\t} else {\r\n\t\t\tpHdr->wItemCI = item[ii]._iCreateInfo;\r\n\t\t\tpHdr->dwItemSeed = item[ii]._iSeed;\r\n\t\t\tpHdr->bItemId = item[ii]._iIdentified;\r\n\t\t\tpHdr->bItemDur = item[ii]._iDurability;\r\n\t\t\tpHdr->bItemMDur = item[ii]._iMaxDur;\r\n\t\t\tpHdr->bItemCh = item[ii]._iCharges;\r\n\t\t\tpHdr->bItemMCh = item[ii]._iMaxCharges;\r\n\t\t\tif (item[ii].IDidx == IDI_GOLD) {\r\n\t\t\t\tpHdr->wItemVal = item[ii]._ivalue;\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tpHdr->bItemI = -1;\r\n\t}\r\n\r\n\tassert((DWORD)sgnSyncPInv < NUM_INVLOC);\r\n\tpItem = &plr[myplr].InvBody[sgnSyncPInv];\r\n\tif (pItem->_itype != ITYPE_NONE) {\r\n\t\tpHdr->bPInvLoc = sgnSyncPInv;\r\n\t\tpHdr->wPInvIndx = pItem->IDidx;\r\n\t\tpHdr->wPInvCI = pItem->_iCreateInfo;\r\n\t\tpHdr->dwPInvSeed = pItem->_iSeed;\r\n\t\tpHdr->bPInvId = pItem->_iIdentified;\r\n\t} else {\r\n\t\tpHdr->bPInvLoc = -1;\r\n\t}\r\n\r\n\tsgnSyncPInv++;\r\n\tif (sgnSyncPInv >= NUM_INVLOC) {\r\n\t\tsgnSyncPInv = 0;\r\n\t}\r\n}\r\n\r\nDWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen)\r\n{\r\n\tTSyncHeader *pHdr;\r\n\tint i;\r\n\tBOOL sync;\r\n\r\n\tif (nummonsters < 1) {\r\n\t\treturn dwMaxLen;\r\n\t}\r\n\tif (dwMaxLen < sizeof(*pHdr) + sizeof(TSyncMonster)) {\r\n\t\treturn dwMaxLen;\r\n\t}\r\n\r\n\tpHdr = (TSyncHeader *)pbBuf;\r\n\tpbBuf += sizeof(*pHdr);\r\n\tdwMaxLen -= sizeof(*pHdr);\r\n\r\n\tpHdr->bCmd = CMD_SYNCDATA;\r\n\tpHdr->bLevel = currlevel;\r\n\tpHdr->wLen = 0;\r\n\tSyncPlrInv(pHdr);\r\n\tassert(dwMaxLen <= 0xffff);\r\n\tsync_one_monster();\r\n\r\n\tfor (i = 0; i < nummonsters && dwMaxLen >= sizeof(TSyncMonster); i++) {\r\n\t\tsync = FALSE;\r\n\t\tif (i < 2) {\r\n\t\t\tsync = sync_monster_active2((TSyncMonster *)pbBuf);\r\n\t\t}\r\n\t\tif (!sync) {\r\n\t\t\tsync = sync_monster_active((TSyncMonster *)pbBuf);\r\n\t\t}\r\n\t\tif (!sync) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tpbBuf += sizeof(TSyncMonster);\r\n\t\tpHdr->wLen += sizeof(TSyncMonster);\r\n\t\tdwMaxLen -= sizeof(TSyncMonster);\r\n\t}\r\n\r\n\treturn dwMaxLen;\r\n}\r\n\r\nstatic void sync_monster(int pnum, const TSyncMonster *p)\r\n{\r\n\tint i, ndx, md, mdx, mdy;\r\n\tDWORD delta;\r\n\r\n\tndx = p->_mndx;\r\n\r\n#ifdef HELLFIRE\r\n\tif (monster[ndx]._mhitpoints <= 0) {\r\n#else\r\n\tif (monster[ndx]._mhitpoints == 0) {\r\n#endif\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (i = 0; i < nummonsters; i++) { // CODEFIX: this loop does nothing\r\n\t\tif (monstactive[i] == ndx) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tdelta = abs(plr[myplr]._px - monster[ndx]._mx) + abs(plr[myplr]._py - monster[ndx]._my);\r\n\tif (delta > 255) {\r\n\t\tdelta = 255;\r\n\t}\r\n\r\n\tif (delta < p->_mdelta || (delta == p->_mdelta && pnum > myplr)) {\r\n\t\treturn;\r\n\t}\r\n\tif (monster[ndx]._mfutx == p->_mx && monster[ndx]._mfuty == p->_my) {\r\n\t\treturn;\r\n\t}\r\n\tif (monster[ndx]._mmode == MM_CHARGE || monster[ndx]._mmode == MM_STONE) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tmdx = abs(monster[ndx]._mx - p->_mx);\r\n\tmdy = abs(monster[ndx]._my - p->_my);\r\n\tif (mdx <= 2 && mdy <= 2) {\r\n\t\tif (monster[ndx]._mmode < MM_WALK || monster[ndx]._mmode > MM_WALK3) {\r\n\t\t\tmd = GetDirection(monster[ndx]._mx, monster[ndx]._my, p->_mx, p->_my);\r\n\t\t\tif (DirOK(ndx, md)) {\r\n\t\t\t\tM_ClearSquares(ndx);\r\n\t\t\t\tdMonster[monster[ndx]._mx][monster[ndx]._my] = ndx + 1;\r\n\t\t\t\tM_WalkDir(ndx, md);\r\n\t\t\t\tmonster[ndx]._msquelch = UCHAR_MAX;\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (dMonster[p->_mx][p->_my] == 0) {\r\n\t\tM_ClearSquares(ndx);\r\n\t\tdMonster[p->_mx][p->_my] = ndx + 1;\r\n\t\tmonster[ndx]._mx = p->_mx;\r\n\t\tmonster[ndx]._my = p->_my;\r\n\t\tdecode_enemy(ndx, p->_menemy);\r\n\t\tmd = GetDirection(p->_mx, p->_my, monster[ndx]._menemyx, monster[ndx]._menemyy);\r\n\t\tM_StartStand(ndx, md);\r\n\t\tmonster[ndx]._msquelch = UCHAR_MAX;\r\n\t}\r\n\r\n\tdecode_enemy(ndx, p->_menemy);\r\n}\r\n\r\nDWORD sync_update(int pnum, const BYTE *pbBuf)\r\n{\r\n\tTSyncHeader *pHdr;\r\n\tWORD wLen;\r\n\r\n\tpHdr = (TSyncHeader *)pbBuf;\r\n\tpbBuf += sizeof(*pHdr);\r\n\r\n\tif (pHdr->bCmd != CMD_SYNCDATA) {\r\n\t\tapp_fatal(\"bad sync command\");\r\n\t}\r\n\r\n\t/// ASSERT: assert(gbBufferMsgs != BUFFER_PROCESS);\r\n\r\n\tif (gbBufferMsgs == 1) {\r\n\t\treturn pHdr->wLen + sizeof(*pHdr);\r\n\t}\r\n\tif (pnum == myplr) {\r\n\t\treturn pHdr->wLen + sizeof(*pHdr);\r\n\t}\r\n\r\n\tfor (wLen = pHdr->wLen; wLen >= sizeof(TSyncMonster); wLen -= sizeof(TSyncMonster)) {\r\n\t\tif (currlevel == pHdr->bLevel) {\r\n\t\t\tsync_monster(pnum, (TSyncMonster *)pbBuf);\r\n\t\t}\r\n\t\tdelta_sync_monster((TSyncMonster *)pbBuf, pHdr->bLevel);\r\n\t\tpbBuf += sizeof(TSyncMonster);\r\n\t}\r\n\r\n\tassert(wLen == 0);\r\n\r\n\treturn pHdr->wLen + sizeof(*pHdr);\r\n}\r\n\r\nvoid sync_init()\r\n{\r\n\tsgnMonsters = 16 * myplr;\r\n\tmemset(sgwLRU, 255, sizeof(sgwLRU));\r\n}\r\n"
  },
  {
    "path": "Source/sync.h",
    "content": "/**\r\n * @file sync.h\r\n *\r\n * Interface of functionality for syncing game state with other players.\r\n */\r\n#ifndef __SYNC_H__\r\n#define __SYNC_H__\r\n\r\nDWORD sync_all_monsters(const BYTE *pbBuf, DWORD dwMaxLen);\r\nDWORD sync_update(int pnum, const BYTE *pbBuf);\r\nvoid sync_init();\r\n\r\n#endif /* __SYNC_H__ */\r\n"
  },
  {
    "path": "Source/textdat.cpp",
    "content": "/**\r\n * @file textdat.cpp\r\n *\r\n * Implementation of all dialog texts.\r\n */\r\n#include \"all.h\"\r\n\r\n/* todo: move text out of struct */\r\n\r\n/** Contains the data related to each speech ID. */\r\nconst TextDataStruct alltext[] = {\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \" Ahh, the story of our King, is it? The tragic fall of Leoric was a harsh blow to this land. The people always loved the King, and now they live in mortal fear of him. The question that I keep asking myself is how he could have fallen so far from the Light, as Leoric had always been the holiest of men. Only the vilest powers of Hell could so utterly destroy a man from within... |\",\r\n\t    1, 5, TSFX_STORY1 },\r\n\t{ \"The village needs your help, good master! Some months ago King Leoric's son, Prince Albrecht, was kidnapped. The King went into a rage and scoured the village for his missing child. With each passing day, Leoric seemed to slip deeper into madness. He sought to blame innocent townsfolk for the boy's disappearance and had them brutally executed. Less than half of us survived his insanity...\\n \\nThe King's Knights and Priests tried to placate him, but he turned against them and sadly, they were forced to kill him. With his dying breath the King called down a terrible curse upon his former followers. He vowed that they would serve him in darkness forever...\\n \\nThis is where things take an even darker twist than I thought possible! Our former King has risen from his eternal sleep and now commands a legion of undead minions within the Labyrinth. His body was buried in a tomb three levels beneath the Cathedral. Please, good master, put his soul at ease by destroying his now cursed form... |\",\r\n\t    1, 5, TSFX_TAVERN21 },\r\n\t{ \"As I told you, good master, the King was entombed three levels below. He's down there, waiting in the putrid darkness for his chance to destroy this land... |\",\r\n\t    1, 6, TSFX_TAVERN22 },\r\n\t{ \"The curse of our King has passed, but I fear that it was only part of a greater evil at work. However, we may yet be saved from the darkness that consumes our land, for your victory is a good omen. May Light guide you on your way, good master. |\",\r\n\t    1, 5, TSFX_TAVERN23 },\r\n\t{ \"The loss of his son was too much for King Leoric. I did what I could to ease his madness, but in the end it overcame him. A black curse has hung over this kingdom from that day forward, but perhaps if you were to free his spirit from his earthly prison, the curse would be lifted... |\",\r\n\t    1, 5, TSFX_HEALER1 },\r\n\t{ \"I don't like to think about how the King died. I like to remember him for the kind and just ruler that he was. His death was so sad and seemed very wrong, somehow. |\",\r\n\t    1, 6, TSFX_BMAID1 },\r\n\t{ \"I made many of the weapons and most of the armor that King Leoric used to outfit his knights. I even crafted a huge two-handed sword of the finest mithril for him, as well as a field crown to match. I still cannot believe how he died, but it must have been some sinister force that drove him insane! |\",\r\n\t    1, 5, TSFX_SMITH1 },\r\n\t{ \"I don't care about that. Listen, no skeleton is gonna be MY king. Leoric is King. King, so you hear me? HAIL TO THE KING! |\",\r\n\t    1, 5, TSFX_DRUNK1 },\r\n\t{ \"The dead who walk among the living follow the cursed King. He holds the power to raise yet more warriors for an ever growing army of the undead. If you do not stop his reign, he will surely march across this land and slay all who still live here. |\",\r\n\t    1, 5, TSFX_WITCH1 },\r\n\t{ \"Look, I'm running a business here. I don't sell information, and I don't care about some King that's been dead longer than I've been alive. If you need something to use against this King of the undead, then I can help you out... |\",\r\n\t    1, 5, TSFX_PEGBOY1 },\r\n\t{ \"The warmth of life has entered my tomb. Prepare yourself, mortal, to serve my Master for eternity! |\",\r\n\t    0, 5, USFX_SKING1 },\r\n\t{ \"I see that this strange behavior puzzles you as well. I would surmise that since many demons fear the light of the sun and believe that it holds great power, it may be that the rising sun depicted on the sign you speak of has led them to believe that it too holds some arcane powers. Hmm, perhaps they are not all as smart as we had feared... |\",\r\n\t    1, 5, TSFX_STORY2 },\r\n\t{ \"Master, I have a strange experience to relate. I know that you have a great knowledge of those monstrosities that inhabit the labyrinth, and this is something that I cannot understand for the very life of me... I was awakened during the night by a scraping sound just outside of my tavern. When I looked out from my bedroom, I saw the shapes of small demon-like creatures in the inn yard. After a short time, they ran off, but not before stealing the sign to my inn. I don't know why the demons would steal my sign but leave my family in peace... 'tis strange, no? |\",\r\n\t    1, 5, TSFX_TAVERN24 },\r\n\t{ \"Oh, you didn't have to bring back my sign, but I suppose that it does save me the expense of having another one made. Well, let me see, what could I give you as a fee for finding it? Hmmm, what have we here... ah, yes! This cap was left in one of the rooms by a magician who stayed here some time ago. Perhaps it may be of some value to you. |\",\r\n\t    1, 5, TSFX_TAVERN25 },\r\n\t{ \"My goodness, demons running about the village at night, pillaging our homes - is nothing sacred? I hope that Ogden and Garda are all right. I suppose that they would come to see me if they were hurt... |\",\r\n\t    1, 5, TSFX_HEALER2 },\r\n\t{ \"Oh my! Is that where the sign went? My Grandmother and I must have slept right through the whole thing. Thank the Light that those monsters didn't attack the inn. |\",\r\n\t    1, 6, TSFX_BMAID2 },\r\n\t{ \"Demons stole Ogden's sign, you say? That doesn't sound much like the atrocities I've heard of - or seen. \\n \\nDemons are concerned with ripping out your heart, not your signpost. |\",\r\n\t    1, 6, TSFX_SMITH2 },\r\n\t{ \"You know what I think? Somebody took that sign, and they gonna want lots of money for it. If I was Ogden... and I'm not, but if I was... I'd just buy a new sign with some pretty drawing on it. Maybe a nice mug of ale or a piece of cheese... |\",\r\n\t    1, 5, TSFX_DRUNK2 },\r\n\t{ \"No mortal can truly understand the mind of the demon. \\n \\nNever let their erratic actions confuse you, as that too may be their plan. |\",\r\n\t    1, 6, TSFX_WITCH2 },\r\n\t{ \"What - is he saying I took that? I suppose that Griswold is on his side, too. \\n \\nLook, I got over simple sign stealing months ago. You can't turn a profit on a piece of wood. |\",\r\n\t    1, 6, TSFX_PEGBOY2 },\r\n\t{ \"Hey - You that one that kill all! You get me Magic Banner or we attack! You no leave with life! You kill big uglies and give back Magic. Go past corner and door, find uglies. You give, you go! |\",\r\n\t    1, 5, USFX_SNOT1 },\r\n\t{ \"You kill uglies, get banner. You bring to me, or else... |\",\r\n\t    1, 6, USFX_SNOT2 },\r\n\t{ \"You give! Yes, good! Go now, we strong. We kill all with big Magic! |\",\r\n\t    1, 6, USFX_SNOT3 },\r\n\t{ \"This does not bode well, for it confirms my darkest fears. While I did not allow myself to believe the ancient legends, I cannot deny them now. Perhaps the time has come to reveal who I am.\\n \\nMy true name is Deckard Cain the Elder, and I am the last descendant of an ancient Brotherhood that was dedicated to safeguarding the secrets of a timeless evil. An evil that quite obviously has now been released.\\n \\nThe Archbishop Lazarus, once King Leoric's most trusted advisor, led a party of simple townsfolk into the Labyrinth to find the King's missing son, Albrecht. Quite some time passed before they returned, and only a few of them escaped with their lives.\\n \\nCurse me for a fool! I should have suspected his veiled treachery then. It must have been Lazarus himself who kidnapped Albrecht and has since hidden him within the Labyrinth. I do not understand why the Archbishop turned to the darkness, or what his interest is in the child. unless he means to sacrifice him to his dark masters!\\n \\nThat must be what he has planned! The survivors of his 'rescue party' say that Lazarus was last seen running into the deepest bowels of the labyrinth. You must hurry and save the prince from the sacrificial blade of this demented fiend! |\",\r\n\t    1, 3, TSFX_STORY36 },\r\n\t{ \"You must hurry and rescue Albrecht from the hands of Lazarus. The prince and the people of this kingdom are counting on you! |\",\r\n\t    1, 5, TSFX_STORY37 },\r\n\t{ \"Your story is quite grim, my friend. Lazarus will surely burn in Hell for his horrific deed. The boy that you describe is not our prince, but I believe that Albrecht may yet be in danger. The symbol of power that you speak of must be a portal in the very heart of the labyrinth.\\n \\nKnow this, my friend - The evil that you move against is the dark Lord of Terror. He is known to mortal men as Diablo. It was he who was imprisoned within the Labyrinth many centuries ago and I fear that he seeks to once again sow chaos in the realm of mankind. You must venture through the portal and destroy Diablo before it is too late! |\",\r\n\t    1, 5, TSFX_STORY38 },\r\n\t{ \"Lazarus was the Archbishop who led many of the townspeople into the labyrinth. I lost many good friends that day, and Lazarus never returned. I suppose he was killed along with most of the others. If you would do me a favor, good master - please do not talk to Farnham about that day. |\",\r\n\t    1, 6, TSFX_TAVERN1 },\r\n\t{ \"|\", 1, 5, TSFX_STORY38 },\r\n\t{ \"|\", 1, 5, TSFX_STORY38 },\r\n\t{ \"I was shocked when I heard of what the townspeople were planning to do that night. I thought that of all people, Lazarus would have had more sense than that. He was an Archbishop, and always seemed to care so much for the townsfolk of Tristram. So many were injured, I could not save them all... |\",\r\n\t    1, 5, TSFX_HEALER3 },\r\n\t{ \"I remember Lazarus as being a very kind and giving man. He spoke at my mother's funeral, and was supportive of my grandmother and myself in a very troubled time. I pray every night that somehow, he is still alive and safe. |\",\r\n\t    1, 5, TSFX_BMAID3 },\r\n\t{ \"I was there when Lazarus led us into the labyrinth. He spoke of holy retribution, but when we started fighting those hellspawn, he did not so much as lift his mace against them. He just ran deeper into the dim, endless chambers that were filled with the servants of darkness! |\",\r\n\t    1, 5, TSFX_SMITH3 },\r\n\t{ \"They stab, then bite, then they're all around you. Liar! LIAR! They're all dead! Dead! Do you hear me? They just keep falling and falling... their blood spilling out all over the floor... all his fault... |\",\r\n\t    1, 5, TSFX_DRUNK3 },\r\n\t{ \"I did not know this Lazarus of whom you speak, but I do sense a great conflict within his being. He poses a great danger, and will stop at nothing to serve the powers of darkness which have claimed him as theirs. |\",\r\n\t    1, 5, TSFX_WITCH3 },\r\n\t{ \"Yes, the righteous Lazarus, who was sooo effective against those monsters down there. Didn't help save my leg, did it? Look, I'll give you a free piece of advice. Ask Farnham, he was there. |\",\r\n\t    1, 5, TSFX_PEGBOY3 },\r\n\t{ \"Abandon your foolish quest. All that awaits you is the wrath of my Master! You are too late to save the child. Now you will join him in Hell! |\",\r\n\t    0, 5, USFX_LAZ1 },\r\n\t{ \" |\", 0, 5, USFX_LAZ1 },\r\n\t{ \"Hmm, I don't know what I can really tell you about this that will be of any help. The water that fills our wells comes from an underground spring. I have heard of a tunnel that leads to a great lake - perhaps they are one and the same. Unfortunately, I do not know what would cause our water supply to be tainted. |\",\r\n\t    1, 5, TSFX_STORY4 },\r\n\t{ \"I have always tried to keep a large supply of foodstuffs and drink in our storage cellar, but with the entire town having no source of fresh water, even our stores will soon run dry. \\n \\nPlease, do what you can or I don't know what we will do. |\",\r\n\t    1, 6, TSFX_TAVERN2 },\r\n\t{ \"I'm glad I caught up to you in time! Our wells have become brackish and stagnant and some of the townspeople have become ill drinking from them. Our reserves of fresh water are quickly running dry. I believe that there is a passage that leads to the springs that serve our town. Please find what has caused this calamity, or we all will surely perish. |\",\r\n\t    1, 5, TSFX_HEALER20 },\r\n\t{ \"Please, you must hurry. Every hour that passes brings us closer to having no water to drink. \\n \\nWe cannot survive for long without your help. |\",\r\n\t    1, 6, TSFX_HEALER21 },\r\n\t{ \"What's that you say - the mere presence of the demons had caused the water to become tainted? Oh, truly a great evil lurks beneath our town, but your perseverance and courage gives us hope. Please take this ring - perhaps it will aid you in the destruction of such vile creatures. |\",\r\n\t    1, 5, TSFX_HEALER22 },\r\n\t{ \"My grandmother is very weak, and Garda says that we cannot drink the water from the wells. Please, can you do something to help us? |\",\r\n\t    1, 6, TSFX_BMAID4 },\r\n\t{ \"Pepin has told you the truth. We will need fresh water badly, and soon. I have tried to clear one of the smaller wells, but it reeks of stagnant filth. It must be getting clogged at the source. |\",\r\n\t    1, 5, TSFX_SMITH4 },\r\n\t{ \"You drink water? |\", 1, 8, TSFX_DRUNK4 },\r\n\t{ \"The people of Tristram will die if you cannot restore fresh water to their wells. \\n \\nKnow this - demons are at the heart of this matter, but they remain ignorant of what they have spawned. |\",\r\n\t    1, 6, TSFX_WITCH4 },\r\n\t{ \"For once, I'm with you. My business runs dry - so to speak - if I have no market to sell to. You better find out what is going on, and soon! |\",\r\n\t    1, 6, TSFX_PEGBOY4 },\r\n\t{ \"A book that speaks of a chamber of human bones? Well, a Chamber of Bone is mentioned in certain archaic writings that I studied in the libraries of the East. These tomes inferred that when the Lords of the underworld desired to protect great treasures, they would create domains where those who died in the attempt to steal that treasure would be forever bound to defend it. A twisted, but strangely fitting, end? |\",\r\n\t    1, 4, TSFX_STORY7 },\r\n\t{ \"I am afraid that I don't know anything about that, good master. Cain has many books that may be of some help. |\",\r\n\t    1, 6, TSFX_TAVERN5 },\r\n\t{ \"This sounds like a very dangerous place. If you venture there, please take great care. |\",\r\n\t    1, 6, TSFX_HEALER5 },\r\n\t{ \"I am afraid that I haven't heard anything about that. Perhaps Cain the Storyteller could be of some help. |\",\r\n\t    1, 6, TSFX_BMAID6 },\r\n\t{ \"I know nothing of this place, but you may try asking Cain. He talks about many things, and it would not surprise me if he had some answers to your question. |\",\r\n\t    1, 6, TSFX_SMITH7 },\r\n\t{ \"Okay, so listen. There's this chamber of wood, see. And his wife, you know - her - tells the tree... cause you gotta wait. Then I says, that might work against him, but if you think I'm gonna PAY for this... you... uh... yeah. |\",\r\n\t    1, 5, TSFX_DRUNK7 },\r\n\t{ \"You will become an eternal servant of the dark lords should you perish within this cursed domain. \\n \\nEnter the Chamber of Bone at your own peril. |\",\r\n\t    1, 6, TSFX_WITCH7 },\r\n\t{ \"A vast and mysterious treasure, you say? Maybe I could be interested in picking up a few things from you... or better yet, don't you need some rare and expensive supplies to get you through this ordeal? |\",\r\n\t    1, 5, TSFX_PEGBOY7 },\r\n\t{ \"It seems that the Archbishop Lazarus goaded many of the townsmen into venturing into the Labyrinth to find the King's missing son. He played upon their fears and whipped them into a frenzied mob. None of them were prepared for what lay within the cold earth... Lazarus abandoned them down there - left in the clutches of unspeakable horrors - to die. |\",\r\n\t    1, 5, TSFX_STORY10 },\r\n\t{ \"Yes, Farnham has mumbled something about a hulking brute who wielded a fierce weapon. I believe he called him a butcher. |\",\r\n\t    1, 6, TSFX_TAVERN8 },\r\n\t{ \"By the Light, I know of this vile demon. There were many that bore the scars of his wrath upon their bodies when the few survivors of the charge led by Lazarus crawled from the Cathedral. I don't know what he used to slice open his victims, but it could not have been of this world. It left wounds festering with disease and even I found them almost impossible to treat. Beware if you plan to battle this fiend... |\",\r\n\t    1, 5, TSFX_HEALER8 },\r\n\t{ \"When Farnham said something about a butcher killing people, I immediately discounted it. But since you brought it up, maybe it is true. |\",\r\n\t    1, 6, TSFX_BMAID8 },\r\n\t{ \"I saw what Farnham calls the Butcher as it swathed a path through the bodies of my friends. He swung a cleaver as large as an axe, hewing limbs and cutting down brave men where they stood. I was separated from the fray by a host of small screeching demons and somehow found the stairway leading out. I never saw that hideous beast again, but his blood-stained visage haunts me to this day. |\",\r\n\t    1, 5, TSFX_SMITH10 },\r\n\t{ \"Big! Big cleaver killing all my friends. Couldn't stop him, had to run away, couldn't save them. Trapped in a room with so many bodies... so many friends... NOOOOOOOOOO! |\",\r\n\t    1, 5, TSFX_DRUNK10 },\r\n\t{ \"The Butcher is a sadistic creature that delights in the torture and pain of others. You have seen his handiwork in the drunkard Farnham. His destruction will do much to ensure the safety of this village. |\",\r\n\t    1, 5, TSFX_WITCH10 },\r\n\t{ \"I know more than you'd think about that grisly fiend. His little friends got a hold of me and managed to get my leg before Griswold pulled me out of that hole. \\n \\nI'll put it bluntly - kill him before he kills you and adds your corpse to his collection. |\",\r\n\t    1, 6, TSFX_PEGBOY10 },\r\n\t{ \"Please, listen to me. The Archbishop Lazarus, he led us down here to find the lost prince. The bastard led us into a trap! Now everyone is dead...killed by a demon he called the Butcher. Avenge us! Find this Butcher and slay him so that our souls may finally rest... |\",\r\n\t    1, 5, TSFX_WOUND },\r\n\t{ \" |\", 1, 5, USFX_CLEAVER },\r\n\t{ \"You recite an interesting rhyme written in a style that reminds me of other works. Let me think now - what was it?\\n \\n...Darkness shrouds the Hidden. Eyes glowing unseen with only the sounds of razor claws briefly scraping to torment those poor souls who have been made sightless for all eternity. The prison for those so damned is named the Halls of the Blind... |\",\r\n\t    1, 5, TSFX_STORY12 },\r\n\t{ \"I never much cared for poetry. Occasionally, I had cause to hire minstrels when the inn was doing well, but that seems like such a long time ago now. \\n \\nWhat? Oh, yes... uh, well, I suppose you could see what someone else knows. |\",\r\n\t    1, 6, TSFX_TAVERN10 },\r\n\t{ \"This does seem familiar, somehow. I seem to recall reading something very much like that poem while researching the history of demonic afflictions. It spoke of a place of great evil that... wait - you're not going there are you? |\",\r\n\t    1, 5, TSFX_HEALER10 },\r\n\t{ \"If you have questions about blindness, you should talk to Pepin. I know that he gave my grandmother a potion that helped clear her vision, so maybe he can help you, too. |\",\r\n\t    1, 6, TSFX_BMAID10 },\r\n\t{ \"I am afraid that I have neither heard nor seen a place that matches your vivid description, my friend. Perhaps Cain the Storyteller could be of some help. |\",\r\n\t    1, 6, TSFX_SMITH12 },\r\n\t{ \"Look here... that's pretty funny, huh? Get it? Blind - look here? |\",\r\n\t    1, 6, TSFX_DRUNK12 },\r\n\t{ \"This is a place of great anguish and terror, and so serves its master well. \\n \\nTread carefully or you may yourself be staying much longer than you had anticipated. |\",\r\n\t    1, 6, TSFX_WITCH12 },\r\n\t{ \"Lets see, am I selling you something? No. Are you giving me money to tell you about this? No. Are you now leaving and going to talk to the storyteller who lives for this kind of thing? Yes. |\",\r\n\t    1, 5, TSFX_PEGBOY11 },\r\n\t{ \"You claim to have spoken with Lachdanan? He was a great hero during his life. Lachdanan was an honorable and just man who served his King faithfully for years. But of course, you already know that.\\n \\nOf those who were caught within the grasp of the King's Curse, Lachdanan would be the least likely to submit to the darkness without a fight, so I suppose that your story could be true. If I were in your place, my friend, I would find a way to release him from his torture. |\",\r\n\t    1, 5, TSFX_STORY13 },\r\n\t{ \"You speak of a brave warrior long dead! I'll have no such talk of speaking with departed souls in my inn yard, thank you very much. |\",\r\n\t    1, 6, TSFX_TAVERN11 },\r\n\t{ \"A golden elixir, you say. I have never concocted a potion of that color before, so I can't tell you how it would effect you if you were to try to drink it. As your healer, I strongly advise that should you find such an elixir, do as Lachdanan asks and DO NOT try to use it. |\",\r\n\t    1, 5, TSFX_HEALER11 },\r\n\t{ \"I've never heard of a Lachdanan before. I'm sorry, but I don't think that I can be of much help to you. |\",\r\n\t    1, 7, TSFX_BMAID11 },\r\n\t{ \"If it is actually Lachdanan that you have met, then I would advise that you aid him. I dealt with him on several occasions and found him to be honest and loyal in nature. The curse that fell upon the followers of King Leoric would fall especially hard upon him. |\",\r\n\t    1, 5, TSFX_SMITH13 },\r\n\t{ \" Lachdanan is dead. Everybody knows that, and you can't fool me into thinking any other way. You can't talk to the dead. I know! |\",\r\n\t    1, 5, TSFX_DRUNK13 },\r\n\t{ \"You may meet people who are trapped within the Labyrinth, such as Lachdanan. \\n \\nI sense in him honor and great guilt. Aid him, and you aid all of Tristram. |\",\r\n\t    1, 6, TSFX_WITCH13 },\r\n\t{ \"Wait, let me guess. Cain was swallowed up in a gigantic fissure that opened beneath him. He was incinerated in a ball of hellfire, and can't answer your questions anymore. Oh, that isn't what happened? Then I guess you'll be buying something or you'll be on your way. |\",\r\n\t    1, 5, TSFX_PEGBOY12 },\r\n\t{ \"Please, don't kill me, just hear me out. I was once Captain of King Leoric's Knights, upholding the laws of this land with justice and honor. Then his dark Curse fell upon us for the role we played in his tragic death. As my fellow Knights succumbed to their twisted fate, I fled from the King's burial chamber, searching for some way to free myself from the Curse. I failed...\\n \\nI have heard of a Golden Elixir that could lift the Curse and allow my soul to rest, but I have been unable to find it. My strength now wanes, and with it the last of my humanity as well. Please aid me and find the Elixir. I will repay your efforts - I swear upon my honor. |\",\r\n\t    1, 3, USFX_LACH1 },\r\n\t{ \"You have not found the Golden Elixir. I fear that I am doomed for eternity. Please, keep trying... |\",\r\n\t    1, 6, USFX_LACH2 },\r\n\t{ \"You have saved my soul from damnation, and for that I am in your debt. If there is ever a way that I can repay you from beyond the grave I will find it, but for now - take my helm. On the journey I am about to take I will have little use for it. May it protect you against the dark powers below. Go with the Light, my friend... |\",\r\n\t    1, 4, USFX_LACH3 },\r\n\t{ \"Griswold speaks of The Anvil of Fury - a legendary artifact long searched for, but never found. Crafted from the metallic bones of the Razor Pit demons, the Anvil of Fury was smelt around the skulls of the five most powerful magi of the underworld. Carved with runes of power and chaos, any weapon or armor forged upon this Anvil will be immersed into the realm of Chaos, imbedding it with magical properties. It is said that the unpredictable nature of Chaos makes it difficult to know what the outcome of this smithing will be... |\",\r\n\t    1, 4, TSFX_STORY14 },\r\n\t{ \"Don't you think that Griswold would be a better person to ask about this? He's quite handy, you know. |\",\r\n\t    1, 7, TSFX_TAVERN12 },\r\n\t{ \"If you had been looking for information on the Pestle of Curing or the Silver Chalice of Purification, I could have assisted you, my friend. However, in this matter, you would be better served to speak to either Griswold or Cain. |\",\r\n\t    1, 6, TSFX_HEALER12 },\r\n\t{ \"Griswold's father used to tell some of us when we were growing up about a giant anvil that was used to make mighty weapons. He said that when a hammer was struck upon this anvil, the ground would shake with a great fury. Whenever the earth moves, I always remember that story. |\",\r\n\t    1, 5, TSFX_BMAID12 },\r\n\t{ \"Greetings! It's always a pleasure to see one of my best customers! I know that you have been venturing deeper into the Labyrinth, and there is a story I was told that you may find worth the time to listen to...\\n \\nOne of the men who returned from the Labyrinth told me about a mystic anvil that he came across during his escape. His description reminded me of legends I had heard in my youth about the burning Hellforge where powerful weapons of magic are crafted. The legend had it that deep within the Hellforge rested the Anvil of Fury! This Anvil contained within it the very essence of the demonic underworld...\\n \\nIt is said that any weapon crafted upon the burning Anvil is imbued with great power. If this anvil is indeed the Anvil of Fury, I may be able to make you a weapon capable of defeating even the darkest lord of Hell! \\n \\nFind the Anvil for me, and I'll get to work! |\",\r\n\t    1, 5, TSFX_SMITH21 },\r\n\t{ \"Nothing yet, eh? Well, keep searching. A weapon forged upon the Anvil could be your best hope, and I am sure that I can make you one of legendary proportions. |\",\r\n\t    1, 5, TSFX_SMITH22 },\r\n\t{ \"I can hardly believe it! This is the Anvil of Fury - good work, my friend. Now we'll show those bastards that there are no weapons in Hell more deadly than those made by men! Take this and may Light protect you. |\",\r\n\t    1, 5, TSFX_SMITH23 },\r\n\t{ \"Griswold can't sell his anvil. What will he do then? And I'd be angry too if someone took my anvil! |\",\r\n\t    1, 6, TSFX_DRUNK14 },\r\n\t{ \"There are many artifacts within the Labyrinth that hold powers beyond the comprehension of mortals. Some of these hold fantastic power that can be used by either the Light or the Darkness. Securing the Anvil from below could shift the course of the Sin War towards the Light. |\",\r\n\t    1, 5, TSFX_WITCH14 },\r\n\t{ \"If you were to find this artifact for Griswold, it could put a serious damper on my business here. Awwww, you'll never find it. |\",\r\n\t    1, 6, TSFX_PEGBOY13 },\r\n\t{ \"The Gateway of Blood and the Halls of Fire are landmarks of mystic origin. Wherever this book you read from resides it is surely a place of great power.\\n \\nLegends speak of a pedestal that is carved from obsidian stone and has a pool of boiling blood atop its bone encrusted surface. There are also allusions to Stones of Blood that will open a door that guards an ancient treasure...\\n \\nThe nature of this treasure is shrouded in speculation, my friend, but it is said that the ancient hero Arkaine placed the holy armor Valor in a secret vault. Arkaine was the first mortal to turn the tide of the Sin War and chase the legions of darkness back to the Burning Hells.\\n \\nJust before Arkaine died, his armor was hidden away in a secret vault. It is said that when this holy armor is again needed, a hero will arise to don Valor once more. Perhaps you are that hero... |\",\r\n\t    1, 3, TSFX_STORY15 },\r\n\t{ \"Every child hears the story of the warrior Arkaine and his mystic armor known as Valor. If you could find its resting place, you would be well protected against the evil in the Labyrinth. |\",\r\n\t    1, 6, TSFX_TAVERN13 },\r\n\t{ \"Hmm... it sounds like something I should remember, but I've been so busy learning new cures and creating better elixirs that I must have forgotten. Sorry... |\",\r\n\t    1, 6, TSFX_HEALER13 },\r\n\t{ \"The story of the magic armor called Valor is something I often heard the boys talk about. You had better ask one of the men in the village. |\",\r\n\t    1, 6, TSFX_BMAID13 },\r\n\t{ \"The armor known as Valor could be what tips the scales in your favor. I will tell you that many have looked for it - including myself. Arkaine hid it well, my friend, and it will take more than a bit of luck to unlock the secrets that have kept it concealed oh, lo these many years. |\",\r\n\t    1, 5, TSFX_SMITH14 },\r\n\t{ \"Zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz... |\", 1, 7, TSFX_DRUNK15 },\r\n\t{ \"Should you find these Stones of Blood, use them carefully. \\n \\nThe way is fraught with danger and your only hope rests within your self trust. |\",\r\n\t    1, 6, TSFX_WITCH15 },\r\n\t{ \"You intend to find the armor known as Valor? \\n \\nNo one has ever figured out where Arkaine stashed the stuff, and if my contacts couldn't find it, I seriously doubt you ever will either. |\",\r\n\t    1, 6, TSFX_PEGBOY14 },\r\n\t{ \"I know of only one legend that speaks of such a warrior as you describe. His story is found within the ancient chronicles of the Sin War...\\n \\nStained by a thousand years of war, blood and death, the Warlord of Blood stands upon a mountain of his tattered victims. His dark blade screams a black curse to the living; a tortured invitation to any who would stand before this Executioner of Hell.\\n \\nIt is also written that although he was once a mortal who fought beside the Legion of Darkness during the Sin War, he lost his humanity to his insatiable hunger for blood. |\",\r\n\t    1, 5, TSFX_STORY18 },\r\n\t{ \"I am afraid that I haven't heard anything about such a vicious warrior, good master. I hope that you do not have to fight him, for he sounds extremely dangerous. |\",\r\n\t    1, 6, TSFX_TAVERN16 },\r\n\t{ \"Cain would be able to tell you much more about something like this than I would ever wish to know. |\",\r\n\t    1, 7, TSFX_HEALER16 },\r\n\t{ \"If you are to battle such a fierce opponent, may Light be your guide and your defender. I will keep you in my thoughts. |\",\r\n\t    1, 6, TSFX_BMAID16 },\r\n\t{ \"Dark and wicked legends surrounds the one Warlord of Blood. Be well prepared, my friend, for he shows no mercy or quarter. |\",\r\n\t    1, 6, TSFX_SMITH17 },\r\n\t{ \"Always you gotta talk about Blood? What about flowers, and sunshine, and that pretty girl that brings the drinks. Listen here, friend - you're obsessive, you know that? |\",\r\n\t    1, 5, TSFX_DRUNK17 },\r\n\t{ \"His prowess with the blade is awesome, and he has lived for thousands of years knowing only warfare. I am sorry... I can not see if you will defeat him. |\",\r\n\t    1, 5, TSFX_WITCH18 },\r\n\t{ \"I haven't ever dealt with this Warlord you speak of, but he sounds like he's going through a lot of swords. Wouldn't mind supplying his armies... |\",\r\n\t    1, 6, TSFX_PEGBOY17 },\r\n\t{ \"My blade sings for your blood, mortal, and by my dark masters it shall not be denied. |\",\r\n\t    0, 6, USFX_WARLRD1 },\r\n\t{ \"Griswold speaks of the Heaven Stone that was destined for the enclave located in the east. It was being taken there for further study. This stone glowed with an energy that somehow granted vision beyond that which a normal man could possess. I do not know what secrets it holds, my friend, but finding this stone would certainly prove most valuable. |\",\r\n\t    1, 5, TSFX_STORY20 },\r\n\t{ \"The caravan stopped here to take on some supplies for their journey to the east. I sold them quite an array of fresh fruits and some excellent sweetbreads that Garda has just finished baking. Shame what happened to them... |\",\r\n\t    1, 6, TSFX_TAVERN18 },\r\n\t{ \"I don't know what it is that they thought they could see with that rock, but I will say this. If rocks are falling from the sky, you had better be careful! |\",\r\n\t    1, 6, TSFX_HEALER18 },\r\n\t{ \"Well, a caravan of some very important people did stop here, but that was quite a while ago. They had strange accents and were starting on a long journey, as I recall. \\n \\nI don't see how you could hope to find anything that they would have been carrying. |\",\r\n\t    1, 6, TSFX_BMAID18 },\r\n\t{ \"Stay for a moment - I have a story you might find interesting. A caravan that was bound for the eastern kingdoms passed through here some time ago. It was supposedly carrying a piece of the heavens that had fallen to earth! The caravan was ambushed by cloaked riders just north of here along the roadway. I searched the wreckage for this sky rock, but it was nowhere to be found. If you should find it, I believe that I can fashion something useful from it. |\",\r\n\t    1, 5, TSFX_SMITH24 },\r\n\t{ \"I am still waiting for you to bring me that stone from the heavens. I know that I can make something powerful out of it. |\",\r\n\t    1, 6, TSFX_SMITH25 },\r\n\t{ \"Let me see that - aye... aye, it is as I believed. Give me a moment...\\n \\nAh, Here you are. I arranged pieces of the stone within a silver ring that my father left me. I hope it serves you well. |\",\r\n\t    1, 5, TSFX_SMITH26 },\r\n\t{ \"I used to have a nice ring; it was a really expensive one, with blue and green and red and silver. Don't remember what happened to it, though. I really miss that ring... |\",\r\n\t    1, 5, TSFX_DRUNK19 },\r\n\t{ \"The Heaven Stone is very powerful, and were it any but Griswold who bid you find it, I would prevent it. He will harness its powers and its use will be for the good of us all. |\",\r\n\t    1, 5, TSFX_WITCH20 },\r\n\t{ \"If anyone can make something out of that rock, Griswold can. He knows what he is doing, and as much as I try to steal his customers, I respect the quality of his work. |\",\r\n\t    1, 6, TSFX_PEGBOY18 },\r\n\t{ \"The witch Adria seeks a black mushroom? I know as much about Black Mushrooms as I do about Red Herrings. Perhaps Pepin the Healer could tell you more, but this is something that cannot be found in any of my stories or books. |\",\r\n\t    1, 5, TSFX_STORY21 },\r\n\t{ \"Let me just say this. Both Garda and I would never, EVER serve black mushrooms to our honored guests. If Adria wants some mushrooms in her stew, then that is her business, but I can't help you find any. Black mushrooms... disgusting! |\",\r\n\t    1, 5, TSFX_TAVERN19 },\r\n\t{ \"The witch told me that you were searching for the brain of a demon to assist me in creating my elixir. It should be of great value to the many who are injured by those foul beasts, if I can just unlock the secrets I suspect that its alchemy holds. If you can remove the brain of a demon when you kill it, I would be grateful if you could bring it to me. |\",\r\n\t    1, 5, TSFX_HEALER26 },\r\n\t{ \"Excellent, this is just what I had in mind. I was able to finish the elixir without this, but it can't hurt to have this to study. Would you please carry this to the witch? I believe that she is expecting it. |\",\r\n\t    1, 5, TSFX_HEALER27 },\r\n\t{ \"I think Ogden might have some mushrooms in the storage cellar. Why don't you ask him? |\",\r\n\t    1, 7, TSFX_BMAID19 },\r\n\t{ \"If Adria doesn't have one of these, you can bet that's a rare thing indeed. I can offer you no more help than that, but it sounds like... a huge, gargantuan, swollen, bloated mushroom! Well, good hunting, I suppose. |\",\r\n\t    1, 5, TSFX_SMITH19 },\r\n\t{ \"Ogden mixes a MEAN black mushroom, but I get sick if I drink that. Listen, listen... here's the secret - moderation is the key! |\",\r\n\t    1, 5, TSFX_DRUNK20 },\r\n\t{ \"What do we have here? Interesting, it looks like a book of reagents. Keep your eyes open for a black mushroom. It should be fairly large and easy to identify. If you find it, bring it to me, won't you? |\",\r\n\t    1, 5, TSFX_WITCH22 },\r\n\t{ \"It's a big, black mushroom that I need. Now run off and get it for me so that I can use it for a special concoction that I am working on. |\",\r\n\t    1, 6, TSFX_WITCH23 },\r\n\t{ \"Yes, this will be perfect for a brew that I am creating. By the way, the healer is looking for the brain of some demon or another so he can treat those who have been afflicted by their poisonous venom. I believe that he intends to make an elixir from it. If you help him find what he needs, please see if you can get a sample of the elixir for me. |\",\r\n\t    1, 5, TSFX_WITCH24 },\r\n\t{ \"Why have you brought that here? I have no need for a demon's brain at this time. I do need some of the elixir that the Healer is working on. He needs that grotesque organ that you are holding, and then bring me the elixir. Simple when you think about it, isn't it? |\",\r\n\t    1, 5, TSFX_WITCH25 },\r\n\t{ \"What? Now you bring me that elixir from the healer? I was able to finish my brew without it. Why don't you just keep it... |\",\r\n\t    1, 6, TSFX_WITCH26 },\r\n\t{ \"I don't have any mushrooms of any size or color for sale. How about something a bit more useful? |\",\r\n\t    1, 6, TSFX_PEGBOY19 },\r\n\t{ \"So, the legend of the Map is real. Even I never truly believed any of it! I suppose it is time that I told you the truth about who I am, my friend. You see, I am not all that I seem...\\n \\nMy true name is Deckard Cain the Elder, and I am the last descendant of an ancient Brotherhood that was dedicated to keeping and safeguarding the secrets of a timeless evil. An evil that quite obviously has now been released...\\n \\nThe evil that you move against is the dark Lord of Terror - known to mortal men as Diablo. It was he who was imprisoned within the Labyrinth many centuries ago. The Map that you hold now was created ages ago to mark the time when Diablo would rise again from his imprisonment. When the two stars on that map align, Diablo will be at the height of his power. He will be all but invincible...\\n \\nYou are now in a race against time, my friend! Find Diablo and destroy him before the stars align, for we may never have a chance to rid the world of his evil again! |\",\r\n\t    1, 2, TSFX_STORY22 },\r\n\t{ \"Our time is running short! I sense his dark power building and only you can stop him from attaining his full might. |\",\r\n\t    1, 6, TSFX_STORY23 },\r\n\t{ \"I am sure that you tried your best, but I fear that even your strength and will may not be enough. Diablo is now at the height of his earthly power, and you will need all your courage and strength to defeat him. May the Light protect and guide you, my friend. I will help in any way that I am able. |\",\r\n\t    1, 5, TSFX_STORY24 },\r\n\t{ \"If the witch can't help you and suggests you see Cain, what makes you think that I would know anything? It sounds like this is a very serious matter. You should hurry along and see the storyteller as Adria suggests. |\",\r\n\t    1, 6, TSFX_TAVERN20 },\r\n\t{ \"I can't make much of the writing on this map, but perhaps Adria or Cain could help you decipher what this refers to. \\n \\nI can see that it is a map of the stars in our sky, but any more than that is beyond my talents. |\",\r\n\t    1, 6, TSFX_HEALER19 },\r\n\t{ \"The best person to ask about that sort of thing would be our storyteller. \\n \\nCain is very knowledgeable about ancient writings, and that is easily the oldest looking piece of paper that I have ever seen. |\",\r\n\t    1, 6, TSFX_BMAID20 },\r\n\t{ \"I have never seen a map of this sort before. Where'd you get it? Although I have no idea how to read this, Cain or Adria may be able to provide the answers that you seek. |\",\r\n\t    1, 6, TSFX_SMITH20 },\r\n\t{ \"Listen here, come close. I don't know if you know what I know, but you have really got somethin' here. That's a map. |\",\r\n\t    1, 5, TSFX_DRUNK21 },\r\n\t{ \"Oh, I'm afraid this does not bode well at all. This map of the stars portends great disaster, but its secrets are not mine to tell. The time has come for you to have a very serious conversation with the Storyteller... |\",\r\n\t    1, 5, TSFX_WITCH21 },\r\n\t{ \"I've been looking for a map, but that certainly isn't it. You should show that to Adria - she can probably tell you what it is. I'll say one thing; it looks old, and old usually means valuable. |\",\r\n\t    1, 5, TSFX_PEGBOY20 },\r\n\t{ \"Pleeeease, no hurt. No Kill. Keep alive and next time good bring to you. |\",\r\n\t    1, 6, USFX_GARBUD1 },\r\n\t{ \"Something for you I am making. Again, not kill Gharbad. Live and give good. \\n \\nYou take this as proof I keep word... |\",\r\n\t    1, 6, USFX_GARBUD2 },\r\n\t{ \"Nothing yet! Almost done. \\n \\nVery powerful, very strong. Live! Live! \\n \\nNo pain and promise I keep! |\",\r\n\t    1, 6, USFX_GARBUD3 },\r\n\t{ \"This too good for you. Very Powerful! You want - you take! |\",\r\n\t    1, 6, USFX_GARBUD4 },\r\n\t{ \"What?! Why are you here? All these interruptions are enough to make one insane. Here, take this and leave me to my work. Trouble me no more! |\",\r\n\t    1, 6, USFX_ZHAR1 },\r\n\t{ \"Arrrrgh! Your curiosity will be the death of you!!! |\", 1, 7, USFX_ZHAR2 },\r\n#endif\r\n\t{ \"Hello, my friend. Stay awhile and listen... |\", 0, 5, TSFX_STORY25 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"While you are venturing deeper into the Labyrinth you may find tomes of great knowledge hidden there. \\n \\nRead them carefully for they can tell you things that even I cannot. |\",\r\n\t    1, 6, TSFX_STORY26 },\r\n\t{ \"I know of many myths and legends that may contain answers to questions that may arise in your journeys into the Labyrinth. If you come across challenges and questions to which you seek knowledge, seek me out and I will tell you what I can. |\",\r\n\t    1, 5, TSFX_STORY27 },\r\n\t{ \"Griswold - a man of great action and great courage. I bet he never told you about the time he went into the Labyrinth to save Wirt, did he? He knows his fair share of the dangers to be found there, but then again - so do you. He is a skilled craftsman, and if he claims to be able to help you in any way, you can count on his honesty and his skill. |\",\r\n\t    1, 5, TSFX_STORY28 },\r\n\t{ \"Ogden has owned and run the Rising Sun Inn and Tavern for almost four years now. He purchased it just a few short months before everything here went to hell. He and his wife Garda do not have the money to leave as they invested all they had in making a life for themselves here. He is a good man with a deep sense of responsibility. |\",\r\n\t    1, 5, TSFX_STORY29 },\r\n\t{ \"Poor Farnham. He is a disquieting reminder of the doomed assembly that entered into the Cathedral with Lazarus on that dark day. He escaped with his life, but his courage and much of his sanity were left in some dark pit. He finds comfort only at the bottom of his tankard nowadays, but there are occasional bits of truth buried within his constant ramblings. |\",\r\n\t    1, 5, TSFX_STORY30 },\r\n\t{ \"The witch, Adria, is an anomaly here in Tristram. She arrived shortly after the Cathedral was desecrated while most everyone else was fleeing. She had a small hut constructed at the edge of town, seemingly overnight, and has access to many strange and arcane artifacts and tomes of knowledge that even I have never seen before. |\",\r\n\t    1, 5, TSFX_STORY31 },\r\n\t{ \"The story of Wirt is a frightening and tragic one. He was taken from the arms of his mother and dragged into the labyrinth by the small, foul demons that wield wicked spears. There were many other children taken that day, including the son of King Leoric. The Knights of the palace went below, but never returned. The Blacksmith found the boy, but only after the foul beasts had begun to torture him for their sadistic pleasures. |\",\r\n\t    1, 5, TSFX_STORY33 },\r\n\t{ \"Ah, Pepin. I count him as a true friend - perhaps the closest I have here. He is a bit addled at times, but never a more caring or considerate soul has existed. His knowledge and skills are equaled by few, and his door is always open. |\",\r\n\t    1, 5, TSFX_STORY34 },\r\n\t{ \"Gillian is a fine woman. Much adored for her high spirits and her quick laugh, she holds a special place in my heart. She stays on at the tavern to support her elderly grandmother who is too sick to travel. I sometimes fear for her safety, but I know that any man in the village would rather die than see her harmed. |\",\r\n\t    1, 5, TSFX_STORY35 },\r\n#endif\r\n\t{ \"Greetings, good master. Welcome to the Tavern of the Rising Sun! |\",\r\n\t    0, 5, TSFX_TAVERN36 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"Many adventurers have graced the tables of my tavern, and ten times as many stories have been told over as much ale. The only thing that I ever heard any of them agree on was this old axiom. Perhaps it will help you. You can cut the flesh, but you must crush the bone. |\",\r\n\t    1, 5, TSFX_TAVERN37 },\r\n\t{ \"Griswold the blacksmith is extremely knowledgeable about weapons and armor. If you ever need work done on your gear, he is definitely the man to see. |\",\r\n\t    1, 6, TSFX_TAVERN38 },\r\n\t{ \"Farnham spends far too much time here, drowning his sorrows in cheap ale. I would make him leave, but he did suffer so during his time in the Labyrinth. |\",\r\n\t    1, 6, TSFX_TAVERN39 },\r\n\t{ \"Adria is wise beyond her years, but I must admit - she frightens me a little. \\n \\nWell, no matter. If you ever have need to trade in items of sorcery, she maintains a strangely well-stocked hut just across the river. |\",\r\n\t    1, 6, TSFX_TAVERN40 },\r\n\t{ \"If you want to know more about the history of our village, the storyteller Cain knows quite a bit about the past. |\",\r\n\t    1, 6, TSFX_TAVERN41 },\r\n\t{ \"Wirt is a rapscallion and a little scoundrel. He was always getting into trouble, and it's no surprise what happened to him. \\n \\nHe probably went fooling about someplace that he shouldn't have been. I feel sorry for the boy, but I don't abide the company that he keeps. |\",\r\n\t    1, 6, TSFX_TAVERN43 },\r\n\t{ \"Pepin is a good man - and certainly the most generous in the village. He is always attending to the needs of others, but trouble of some sort or another does seem to follow him wherever he goes... |\",\r\n\t    1, 6, TSFX_TAVERN44 },\r\n\t{ \"Gillian, my Barmaid? If it were not for her sense of duty to her grand-dam, she would have fled from here long ago. \\n \\nGoodness knows I begged her to leave, telling her that I would watch after the old woman, but she is too sweet and caring to have done so. |\",\r\n\t    1, 6, TSFX_TAVERN45 },\r\n#endif\r\n\t{ \"What ails you, my friend? |\", 0, 5, TSFX_HEALER37 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"I have made a very interesting discovery. Unlike us, the creatures in the Labyrinth can heal themselves without the aid of potions or magic. If you hurt one of the monsters, make sure it is dead or it very well may regenerate itself. |\",\r\n\t    1, 5, TSFX_HEALER38 },\r\n\t{ \"Before it was taken over by, well, whatever lurks below, the Cathedral was a place of great learning. There are many books to be found there. If you find any, you should read them all, for some may hold secrets to the workings of the Labyrinth. |\",\r\n\t    1, 5, TSFX_HEALER39 },\r\n\t{ \"Griswold knows as much about the art of war as I do about the art of healing. He is a shrewd merchant, but his work is second to none. Oh, I suppose that may be because he is the only blacksmith left here. |\",\r\n\t    1, 5, TSFX_HEALER40 },\r\n\t{ \"Cain is a true friend and a wise sage. He maintains a vast library and has an innate ability to discern the true nature of many things. If you ever have any questions, he is the person to go to. |\",\r\n\t    1, 5, TSFX_HEALER41 },\r\n\t{ \"Even my skills have been unable to fully heal Farnham. Oh, I have been able to mend his body, but his mind and spirit are beyond anything I can do. |\",\r\n\t    1, 5, TSFX_HEALER42 },\r\n\t{ \"While I use some limited forms of magic to create the potions and elixirs I store here, Adria is a true sorceress. She never seems to sleep, and she always has access to many mystic tomes and artifacts. I believe her hut may be much more than the hovel it appears to be, but I can never seem to get inside the place. |\",\r\n\t    1, 5, TSFX_HEALER43 },\r\n\t{ \"Poor Wirt. I did all that was possible for the child, but I know he despises that wooden peg that I was forced to attach to his leg. His wounds were hideous. No one - and especially such a young child - should have to suffer the way he did. |\",\r\n\t    1, 5, TSFX_HEALER45 },\r\n\t{ \"I really don't understand why Ogden stays here in Tristram. He suffers from a slight nervous condition, but he is an intelligent and industrious man who would do very well wherever he went. I suppose it may be the fear of the many murders that happen in the surrounding countryside, or perhaps the wishes of his wife that keep him and his family where they are. |\",\r\n\t    1, 5, TSFX_HEALER46 },\r\n\t{ \"Ogden's barmaid is a sweet girl. Her grandmother is quite ill, and suffers from delusions. \\n \\nShe claims that they are visions, but I have no proof of that one way or the other. |\",\r\n\t    1, 6, TSFX_HEALER47 },\r\n#endif\r\n\t{ \"Good day! How may I serve you? |\", 0, 5, TSFX_BMAID31 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"My grandmother had a dream that you would come and talk to me. She has visions, you know and can see into the future. |\",\r\n\t    1, 6, TSFX_BMAID32 },\r\n\t{ \"The woman at the edge of town is a witch! She seems nice enough, and her name, Adria, is very pleasing to the ear, but I am very afraid of her. \\n \\nIt would take someone quite brave, like you, to see what she is doing out there. |\",\r\n\t    1, 6, TSFX_BMAID33 },\r\n\t{ \"Our Blacksmith is a point of pride to the people of Tristram. Not only is he a master craftsman who has won many contests within his guild, but he received praises from our King Leoric himself - may his soul rest in peace. Griswold is also a great hero; just ask Cain. |\",\r\n\t    1, 5, TSFX_BMAID34 },\r\n\t{ \"Cain has been the storyteller of Tristram for as long as I can remember. He knows so much, and can tell you just about anything about almost everything. |\",\r\n\t    1, 6, TSFX_BMAID35 },\r\n\t{ \"Farnham is a drunkard who fills his belly with ale and everyone else's ears with nonsense. \\n \\nI know that both Pepin and Ogden feel sympathy for him, but I get so frustrated watching him slip farther and farther into a befuddled stupor every night. |\",\r\n\t    1, 6, TSFX_BMAID36 },\r\n\t{ \"Pepin saved my grandmother's life, and I know that I can never repay him for that. His ability to heal any sickness is more powerful than the mightiest sword and more mysterious than any spell you can name. If you ever are in need of healing, Pepin can help you. |\",\r\n\t    1, 5, TSFX_BMAID37 },\r\n\t{ \"I grew up with Wirt's mother, Canace. Although she was only slightly hurt when those hideous creatures stole him, she never recovered. I think she died of a broken heart. Wirt has become a mean-spirited youngster, looking only to profit from the sweat of others. I know that he suffered and has seen horrors that I cannot even imagine, but some of that darkness hangs over him still. |\",\r\n\t    1, 5, TSFX_BMAID39 },\r\n\t{ \"Ogden and his wife have taken me and my grandmother into their home and have even let me earn a few gold pieces by working at the inn. I owe so much to them, and hope one day to leave this place and help them start a grand hotel in the east. |\",\r\n\t    1, 5, TSFX_BMAID40 },\r\n#endif\r\n\t{ \"Well, what can I do for ya? |\", 0, 5, TSFX_SMITH44 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"If you're looking for a good weapon, let me show this to you. Take your basic blunt weapon, such as a mace. Works like a charm against most of those undying horrors down there, and there's nothing better to shatter skinny little skeletons! |\",\r\n\t    1, 5, TSFX_SMITH45 },\r\n\t{ \"The axe? Aye, that's a good weapon, balanced against any foe. Look how it cleaves the air, and then imagine a nice fat demon head in its path. Keep in mind, however, that it is slow to swing - but talk about dealing a heavy blow! |\",\r\n\t    1, 5, TSFX_SMITH46 },\r\n\t{ \"Look at that edge, that balance. A sword in the right hands, and against the right foe, is the master of all weapons. Its keen blade finds little to hack or pierce on the undead, but against a living, breathing enemy, a sword will better slice their flesh! |\",\r\n\t    1, 5, TSFX_SMITH47 },\r\n\t{ \"Your weapons and armor will show the signs of your struggles against the Darkness. If you bring them to me, with a bit of work and a hot forge, I can restore them to top fighting form. |\",\r\n\t    1, 6, TSFX_SMITH48 },\r\n\t{ \"While I have to practically smuggle in the metals and tools I need from caravans that skirt the edges of our damned town, that witch, Adria, always seems to get whatever she needs. If I knew even the smallest bit about how to harness magic as she did, I could make some truly incredible things. |\",\r\n\t    1, 5, TSFX_SMITH49 },\r\n\t{ \"Gillian is a nice lass. Shame that her gammer is in such poor health or I would arrange to get both of them out of here on one of the trading caravans. |\",\r\n\t    1, 6, TSFX_SMITH50 },\r\n\t{ \"Sometimes I think that Cain talks too much, but I guess that is his calling in life. If I could bend steel as well as he can bend your ear, I could make a suit of court plate good enough for an Emperor! |\",\r\n\t    1, 5, TSFX_SMITH51 },\r\n\t{ \"I was with Farnham that night that Lazarus led us into Labyrinth. I never saw the Archbishop again, and I may not have survived if Farnham was not at my side. I fear that the attack left his soul as crippled as, well, another did my leg. I cannot fight this battle for him now, but I would if I could. |\",\r\n\t    1, 5, TSFX_SMITH52 },\r\n\t{ \"A good man who puts the needs of others above his own. You won't find anyone left in Tristram - or anywhere else for that matter - who has a bad thing to say about the healer. |\",\r\n\t    1, 6, TSFX_SMITH53 },\r\n\t{ \"That lad is going to get himself into serious trouble... or I guess I should say, again. I've tried to interest him in working here and learning an honest trade, but he prefers the high profits of dealing in goods of dubious origin. I cannot hold that against him after what happened to him, but I do wish he would at least be careful. |\",\r\n\t    1, 5, TSFX_SMITH55 },\r\n\t{ \"The Innkeeper has little business and no real way of turning a profit. He manages to make ends meet by providing food and lodging for those who occasionally drift through the village, but they are as likely to sneak off into the night as they are to pay him. If it weren't for the stores of grains and dried meats he kept in his cellar, why, most of us would have starved during that first year when the entire countryside was overrun by demons. |\",\r\n\t    1, 5, TSFX_SMITH56 },\r\n#endif\r\n\t{ \"Can't a fella drink in peace? |\", 0, 5, TSFX_DRUNK27 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"The gal who brings the drinks? Oh, yeah, what a pretty lady. So nice, too. |\",\r\n\t    1, 6, TSFX_DRUNK28 },\r\n\t{ \"Why don't that old crone do somethin' for a change. Sure, sure, she's got stuff, but you listen to me... she's unnatural. I ain't never seen her eat or drink - and you can't trust somebody who doesn't drink at least a little. |\",\r\n\t    1, 5, TSFX_DRUNK29 },\r\n\t{ \"Cain isn't what he says he is. Sure, sure, he talks a good story... some of 'em are real scary or funny... but I think he knows more than he knows he knows. |\",\r\n\t    1, 5, TSFX_DRUNK30 },\r\n\t{ \"Griswold? Good old Griswold. I love him like a brother! We fought together, you know, back when... we... Lazarus...  Lazarus... Lazarus!!! |\",\r\n\t    1, 5, TSFX_DRUNK31 },\r\n\t{ \"Hehehe, I like Pepin. He really tries, you know. Listen here, you should make sure you get to know him. Good fella like that with people always wantin' help. Hey, I guess that would be kinda like you, huh hero? I was a hero too... |\",\r\n\t    1, 5, TSFX_DRUNK32 },\r\n\t{ \"Wirt is a kid with more problems than even me, and I know all about problems. Listen here - that kid is gotta sweet deal, but he's been there, you know? Lost a leg! Gotta walk around on a piece of wood. So sad, so sad... |\",\r\n\t    1, 5, TSFX_DRUNK34 },\r\n\t{ \"Ogden is the best man in town. I don't think his wife likes me much, but as long as she keeps tappin' kegs, I'll like her just fine. Seems like I been spendin' more time with Ogden than most, but he's so good to me... |\",\r\n\t    1, 5, TSFX_DRUNK35 },\r\n\t{ \"I wanna tell ya sumthin', 'cause I know all about this stuff. It's my specialty. This here is the best... theeeee best! That other ale ain't no good since those stupid dogs... |\",\r\n\t    1, 5, TSFX_DRUNK23 },\r\n\t{ \"No one ever lis... listens to me. Somewhere - I ain't too sure - but somewhere under the church is a whole pile o' gold. Gleamin' and shinin' and just waitin' for someone to get it. |\",\r\n\t    1, 5, TSFX_DRUNK24 },\r\n\t{ \"I know you gots your own ideas, and I know you're not gonna believe this, but that weapon you got there - it just ain't no good against those big brutes! Oh, I don't care what Griswold says, they can't make anything like they used to in the old days... |\",\r\n\t    1, 5, TSFX_DRUNK25 },\r\n\t{ \"If I was you... and I ain't... but if I was, I'd sell all that stuff you got and get out of here. That boy out there... He's always got somethin good, but you gotta give him some gold or he won't even show you what he's got. |\",\r\n\t    1, 5, TSFX_DRUNK26 },\r\n#endif\r\n\t{ \"I sense a soul in search of answers... |\", 0, 5, TSFX_WITCH38 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"Wisdom is earned, not given. If you discover a tome of knowledge, devour its words. Should you already have knowledge of the arcane mysteries scribed within a book, remember - that level of mastery can always increase. |\",\r\n\t    1, 5, TSFX_WITCH39 },\r\n\t{ \"The greatest power is often the shortest lived. You may find ancient words of power written upon scrolls of parchment. The strength of these scrolls lies in the ability of either apprentice or adept to cast them with equal ability. Their weakness is that they must first be read aloud and can never be kept at the ready in your mind. Know also that these scrolls can be read but once, so use them with care. |\",\r\n\t    1, 5, TSFX_WITCH40 },\r\n\t{ \"Though the heat of the sun is beyond measure, the mere flame of a candle is of greater danger. No energies, no matter how great, can be used without the proper focus. For many spells, ensorcelled Staves may be charged with magical energies many times over. I have the ability to restore their power - but know that nothing is done without a price. |\",\r\n\t    1, 5, TSFX_WITCH41 },\r\n\t{ \"The sum of our knowledge is in the sum of its people. Should you find a book or scroll that you cannot decipher, do not hesitate to bring it to me. If I can make sense of it I will share what I find. |\",\r\n\t    1, 5, TSFX_WITCH42 },\r\n\t{ \"To a man who only knows Iron, there is no greater magic than Steel. The blacksmith Griswold is more of a sorcerer than he knows. His ability to meld fire and metal is unequaled in this land. |\",\r\n\t    1, 5, TSFX_WITCH43 },\r\n\t{ \"Corruption has the strength of deceit, but innocence holds the power of purity. The young woman Gillian has a pure heart, placing the needs of her matriarch over her own. She fears me, but it is only because she does not understand me. |\",\r\n\t    1, 5, TSFX_WITCH44 },\r\n\t{ \"A chest opened in darkness holds no greater treasure than when it is opened in the light. The storyteller Cain is an enigma, but only to those who do not look. His knowledge of what lies beneath the cathedral is far greater than even he allows himself to realize. |\",\r\n\t    1, 5, TSFX_WITCH45 },\r\n\t{ \"The higher you place your faith in one man, the farther it has to fall. Farnham has lost his soul, but not to any demon. It was lost when he saw his fellow townspeople betrayed by the Archbishop Lazarus. He has knowledge to be gleaned, but you must separate fact from fantasy. |\",\r\n\t    1, 5, TSFX_WITCH46 },\r\n\t{ \"The hand, the heart and the mind can perform miracles when they are in perfect harmony. The healer Pepin sees into the body in a way that even I cannot. His ability to restore the sick and injured is magnified by his understanding of the creation of elixirs and potions. He is as great an ally as you have in Tristram. |\",\r\n\t    1, 5, TSFX_WITCH47 },\r\n\t{ \"There is much about the future we cannot see, but when it comes it will be the children who wield it. The boy Wirt has a blackness upon his soul, but he poses no threat to the town or its people. His secretive dealings with the urchins and unspoken guilds of nearby towns gain him access to many devices that cannot be easily found in Tristram. While his methods may be reproachful, Wirt can provide assistance for your battle against the encroaching Darkness. |\",\r\n\t    1, 4, TSFX_WITCH49 },\r\n\t{ \"Earthen walls and thatched canopy do not a home create. The innkeeper Ogden serves more of a purpose in this town than many understand. He provides shelter for Gillian and her matriarch, maintains what life Farnham has left to him, and provides an anchor for all who are left in the town to what Tristram once was. His tavern, and the simple pleasures that can still be found there, provide a glimpse of a life that the people here remember. It is that memory that continues to feed their hopes for your success. |\",\r\n\t    1, 4, TSFX_WITCH50 },\r\n#endif\r\n\t{ \"Pssst... over here... |\", 0, 5, TSFX_PEGBOY32 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"Not everyone in Tristram has a use - or a market - for everything you will find in the labyrinth. Not even me, as hard as that is to believe. \\n \\nSometimes, only you will be able to find a purpose for some things. |\",\r\n\t    1, 6, TSFX_PEGBOY33 },\r\n\t{ \"Don't trust everything the drunk says. Too many ales have fogged his vision and his good sense. |\",\r\n\t    1, 6, TSFX_PEGBOY34 },\r\n\t{ \"In case you haven't noticed, I don't buy anything from Tristram. I am an importer of quality goods. If you want to peddle junk, you'll have to see Griswold, Pepin or that witch, Adria. I'm sure that they will snap up whatever you can bring them... |\",\r\n\t    1, 5, TSFX_PEGBOY35 },\r\n\t{ \"I guess I owe the blacksmith my life - what there is of it. Sure, Griswold offered me an apprenticeship at the smithy, and he is a nice enough guy, but I'll never get enough money to... well, let's just say that I have definite plans that require a large amount of gold. |\",\r\n\t    1, 5, TSFX_PEGBOY36 },\r\n\t{ \"If I were a few years older, I would shower her with whatever riches I could muster, and let me assure you I can get my hands on some very nice stuff. Gillian is a beautiful girl who should get out of Tristram as soon as it is safe. Hmmm... maybe I'll take her with me when I go... |\",\r\n\t    1, 5, TSFX_PEGBOY37 },\r\n\t{ \"Cain knows too much. He scares the life out of me - even more than that woman across the river. He keeps telling me about how lucky I am to be alive, and how my story is foretold in legend. I think he's off his crock. |\",\r\n\t    1, 5, TSFX_PEGBOY38 },\r\n\t{ \"Farnham - now there is a man with serious problems, and I know all about how serious problems can be. He trusted too much in the integrity of one man, and Lazarus led him into the very jaws of death. Oh, I know what it's like down there, so don't even start telling me about your plans to destroy the evil that dwells in that Labyrinth. Just watch your legs... |\",\r\n\t    1, 5, TSFX_PEGBOY39 },\r\n\t{ \"As long as you don't need anything reattached, old Pepin is as good as they come. \\n \\nIf I'd have had some of those potions he brews, I might still have my leg... |\",\r\n\t    1, 6, TSFX_PEGBOY40 },\r\n\t{ \"Adria truly bothers me. Sure, Cain is creepy in what he can tell you about the past, but that witch can see into your past. She always has some way to get whatever she needs, too. Adria gets her hands on more merchandise than I've seen pass through the gates of the King's Bazaar during High Festival. |\",\r\n\t    1, 5, TSFX_PEGBOY42 },\r\n\t{ \"Ogden is a fool for staying here. I could get him out of town for a very reasonable price, but he insists on trying to make a go of it with that stupid tavern. I guess at the least he gives Gillian a place to work, and his wife Garda does make a superb Shepherd's pie... |\",\r\n\t    1, 5, TSFX_PEGBOY43 },\r\n\t{ \"Beyond the Hall of Heroes lies the Chamber of Bone. Eternal death awaits any who would seek to steal the treasures secured within this room. So speaks the Lord of Terror, and so it is written. |\",\r\n\t    1, 5, PS_WARR1 },\r\n\t{ \"...and so, locked beyond the Gateway of Blood and past the Hall of Fire, Valor awaits for the Hero of Light to awaken... |\",\r\n\t    1, 6, PS_WARR10 },\r\n\t{ \"I can see what you see not.\\nVision milky then eyes rot.\\nWhen you turn they will be gone,\\nWhispering their hidden song.\\nThen you see what cannot be,\\nShadows move where light should be.\\nOut of darkness, out of mind,\\nCast down into the Halls of the Blind. |\\n\",\r\n\t    1, 5, PS_WARR11 },\r\n\t{ \"The armories of Hell are home to the Warlord of Blood. In his wake lay the mutilated bodies of thousands. Angels and man alike have been cut down to fulfill his endless sacrifices to the Dark ones who scream for one thing - blood. |\",\r\n\t    1, 5, PS_WARR12 },\r\n\t{ \"Beyond the Hall of Heroes lies the Chamber of Bone. Eternal death awaits any who would seek to steal the treasures secured within this room. So speaks the Lord of Terror, and so it is written. |\",\r\n\t    1, 5, PS_MAGE1 },\r\n\t{ \"...and so, locked beyond the Gateway of Blood and past the Hall of Fire, Valor awaits for the Hero of Light to awaken... |\",\r\n\t    1, 6, PS_MAGE10 },\r\n\t{ \"I can see what you see not.\\nVision milky then eyes rot.\\nWhen you turn they will be gone,\\nWhispering their hidden song.\\nThen you see what cannot be,\\nShadows move where light should be.\\nOut of darkness, out of mind,\\nCast down into the Halls of the Blind. |\\n\",\r\n\t    1, 4, PS_MAGE11 },\r\n\t{ \"The armories of Hell are home to the Warlord of Blood. In his wake lay the mutilated bodies of thousands. Angels and man alike have been cut down to fulfill his endless sacrifices to the Dark ones who scream for one thing - blood. |\",\r\n\t    1, 5, PS_MAGE12 },\r\n\t{ \"Beyond the Hall of Heroes lies the Chamber of Bone. Eternal death awaits any who would seek to steal the treasures secured within this room. So speaks the Lord of Terror, and so it is written. |\",\r\n\t    1, 5, PS_ROGUE1 },\r\n\t{ \"...and so, locked beyond the Gateway of Blood and past the Hall of Fire, Valor awaits for the Hero of Light to awaken... |\",\r\n\t    1, 5, PS_ROGUE10 },\r\n\t{ \"I can see what you see not.\\nVision milky then eyes rot.\\nWhen you turn they will be gone,\\nWhispering their hidden song.\\nThen you see what cannot be,\\nShadows move where light should be.\\nOut of darkness, out of mind,\\nCast down into the Halls of the Blind. |\\n\",\r\n\t    1, 5, PS_ROGUE11 },\r\n\t{ \"The armories of Hell are home to the Warlord of Blood. In his wake lay the mutilated bodies of thousands. Angels and man alike have been cut down to fulfill his endless sacrifices to the Dark ones who scream for one thing - blood. |\",\r\n\t    1, 5, PS_ROGUE12 },\r\n#endif\r\n\t{ \" |\", 0, 5, TSFX_COW1 },\r\n\t{ \" |\", 0, 5, TSFX_COW2 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"Take heed and bear witness to the truths that lie herein, for they are the last legacy of the Horadrim. There is a war that rages on even now, beyond the fields that we know - between the utopian kingdoms of the High Heavens and the chaotic pits of the Burning Hells. This war is known as the Great Conflict, and it has raged and burned longer than any of the stars in the sky. Neither side ever gains sway for long as the forces of Light and Darkness constantly vie for control over all creation. |\",\r\n\t    1, 5, PS_NAR1 },\r\n\t{ \"Take heed and bear witness to the truths that lie herein, for they are the last legacy of the Horadrim. When the Eternal Conflict between the High Heavens and the Burning Hells falls upon mortal soil, it is called the Sin War. Angels and Demons walk amongst humanity in disguise, fighting in secret, away from the prying eyes of mortals. Some daring, powerful mortals have even allied themselves with either side, and helped to dictate the course of the Sin War. |\",\r\n\t    1, 4, PS_NAR2 },\r\n\t{ \"Take heed and bear witness to the truths that lie herein, for they are the last legacy of the Horadrim. Nearly three hundred years ago, it came to be known that the Three Prime Evils of the Burning Hells had mysteriously come to our world. The Three Brothers ravaged the lands of the east for decades, while humanity was left trembling in their wake. Our Order - the Horadrim - was founded by a group of secretive magi to hunt down and capture the Three Evils once and for all.\\n \\nThe original Horadrim captured two of the Three within powerful artifacts known as Soulstones and buried them deep beneath the desolate eastern sands. The third Evil escaped capture and fled to the west with many of the Horadrim in pursuit. The Third Evil - known as Diablo, the Lord of Terror - was eventually captured, his essence set in a Soulstone and buried within this Labyrinth.\\n \\nBe warned that the soulstone must be kept from discovery by those not of the faith. If Diablo were to be released, he would seek a body that is easily controlled as he would be very weak - perhaps that of an old man or a child. |\",\r\n\t    1, 3, PS_NAR3 },\r\n\t{ \"So it came to be that there was a great revolution within the Burning Hells known as The Dark Exile. The Lesser Evils overthrew the Three Prime Evils and banished their spirit forms to the mortal realm. The demons Belial (the Lord of Lies) and Azmodan (the Lord of Sin) fought to claim rulership of Hell during the absence of the Three Brothers. All of Hell polarized between the factions of Belial and Azmodan while the forces of the High Heavens continually battered upon the very Gates of Hell. |\",\r\n\t    1, 4, PS_NAR4 },\r\n\t{ \"Many demons traveled to the mortal realm in search of the Three Brothers. These demons were followed to the mortal plane by Angels who hunted them throughout the vast cities of the East. The Angels allied themselves with a secretive Order of mortal magi named the Horadrim, who quickly became adept at hunting demons. They also made many dark enemies in the underworlds. |\",\r\n\t    1, 5, PS_NAR5 },\r\n\t{ \"So it came to be that the Three Prime Evils were banished in spirit form to the mortal realm and after sewing chaos across the East for decades, they were hunted down by the cursed Order of the mortal Horadrim. The Horadrim used artifacts called Soulstones to contain the essence of Mephisto, the Lord of Hatred and his brother Baal, the Lord of Destruction. The youngest brother - Diablo, the Lord of Terror - escaped to the west.\\n \\nEventually the Horadrim captured Diablo within a Soulstone as well, and buried him under an ancient, forgotten Cathedral. There, the Lord of Terror sleeps and awaits the time of his rebirth. Know ye that he will seek a body of youth and power to possess - one that is innocent and easily controlled. He will then arise to free his Brothers and once more fan the flames of the Sin War... |\",\r\n\t    1, 3, PS_NAR6 },\r\n\t{ \"All praises to Diablo - Lord of Terror and Survivor of The Dark Exile. When he awakened from his long slumber, my Lord and Master spoke to me of secrets that few mortals know. He told me the kingdoms of the High Heavens and the pits of the Burning Hells engage in an eternal war. He revealed the powers that have brought this discord to the realms of man. My lord has named the battle for this world and all who exist here the Sin War. |\",\r\n\t    1, 4, PS_NAR7 },\r\n\t{ \"Glory and Approbation to Diablo - Lord of Terror and Leader of the Three. My Lord spoke to me of his two Brothers, Mephisto and Baal, who were banished to this world long ago. My Lord wishes to bide his time and harness his awesome power so that he may free his captive brothers from their tombs beneath the sands of the east. Once my Lord releases his Brothers, the Sin War will once again know the fury of the Three. |\",\r\n\t    1, 4, PS_NAR8 },\r\n\t{ \"Hail and Sacrifice to Diablo - Lord of Terror and Destroyer of Souls. When I awoke my Master from his sleep, he attempted to possess a mortal's form. Diablo attempted to claim the body of King Leoric, but my Master was too weak from his imprisonment. My Lord required a simple and innocent anchor to this world, and so found the boy Albrecht to be perfect for the task. While the good King Leoric was left maddened by Diablo's unsuccessful possession, I kidnapped his son Albrecht and brought him before my Master. I now await Diablo's call and pray that I will be rewarded when he at last emerges as the Lord of this world. |\",\r\n\t    1, 3, PS_NAR9 },\r\n#endif\r\n\t{ \"Thank goodness you've returned!\\nMuch has changed since you lived here, my friend. All was peaceful until the dark riders came and destroyed our village. Many were cut down where they stood, and those who took up arms were slain or dragged away to become slaves - or worse. The church at the edge of town has been desecrated and is being used for dark rituals. The screams that echo in the night are inhuman, but some of our townsfolk may yet survive. Follow the path that lies between my tavern and the blacksmith shop to find the church and save who you can. \\n \\nPerhaps I can tell you more if we speak again. Good luck.|\",\r\n\t    1, 5, TSFX_TAVERN0 },\r\n#ifdef HELLFIRE\r\n\t{ \"Beyond the Hall of Heroes lies the Chamber of Bone.  Eternal death awaits any who would seek to steal the treasures secured within this room.  So speaks the Lord of Terror, and so it is written. |\",\r\n\t    1, 5, PS_MONK1 },\r\n\t{ \"...and so, locked beyond the Gateway of Blood and past the Hall of Fire, Valor awaits for the Hero of Light to awaken... |\",\r\n\t    1, 5, PS_MONK10 },\r\n\t{ \"I can see what you see not.\\nVision milky then eyes rot.\\nWhen you turn they will be gone,\\nWhispering their hidden song.\\nThen you see what cannot be,\\nShadows move where light should be.\\nOut of darkness, out of mind,\\nCast down into the Halls of the Blind. |\\n\",\r\n\t    1, 5, PS_MONK11 },\r\n\t{ \"The armories of Hell are home to the Warlord of Blood.  In his wake lay the mutilated bodies of thousands.  Angels and man alike have been cut down to fulfill his endless sacrifices to the Dark ones who scream for one thing - blood. |\",\r\n\t    1, 5, PS_MONK12 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"Beyond the Hall of Heroes lies the Chamber of Bone.  Eternal death awaits any who would seek to steal the treasures secured within this room.  So speaks the Lord of Terror, and so it is written. |\",\r\n\t    1, 5, PS_ROGUE1 },\r\n\t{ \"...and so, locked beyond the Gateway of Blood and past the Hall of Fire, Valor awaits for the Hero of Light to awaken... |\",\r\n\t    1, 5, PS_ROGUE10 },\r\n\t{ \"I can see what you see not.\\nVision milky then eyes rot.\\nWhen you turn they will be gone,\\nWhispering their hidden song.\\nThen you see what cannot be,\\nShadows move where light should be.\\nOut of darkness, out of mind,\\nCast down into the Halls of the Blind. |\\n\",\r\n\t    1, 5, PS_ROGUE11 },\r\n\t{ \"The armories of Hell are home to the Warlord of Blood.  In his wake lay the mutilated bodies of thousands.  Angels and man alike have been cut down to fulfill his endless sacrifices to the Dark ones who scream for one thing - blood. |\",\r\n\t    1, 5, PS_ROGUE12 },\r\n\t{ \"Maintain your quest.  Finding a treasure that is lost is not easy.  Finding a treasure that is hidden less so.  I will leave you with this.  Do not let the sands of time confuse your search.|\",\r\n\t    1, 5, TSFX_WITCH19 },\r\n\t{ \"A what?!  This is foolishness.  There's no treasure buried here in Tristram.  Let me see that!!  Ah, Look these drawings are inaccurate.  They don't match our town at all.  I'd keep my mind on what lies below the cathedral and not what lies below our topsoil.|\",\r\n\t    1, 5, TSFX_SMITH18 },\r\n\t{ \"I really don't have time to discuss some map you are looking for.  I have many sick people that require my help and yours as well.|\",\r\n\t    1, 5, TSFX_HEALER17 },\r\n\t{ \"The once proud Iswall is trapped deep beneath the surface of this world.  His honor stripped and his visage altered.  He is trapped in immortal torment.  Charged to conceal the very thing that could free him.|\",\r\n\t    1, 5, TSFX_WITCH9 },\r\n\t{ \"I'll bet that Wirt saw you coming and put on an act just so he could laugh at you later when you were running around the town with your nose in the dirt.  I'd ignore it.|\",\r\n\t    1, 5, TSFX_TAVERN17 },\r\n\t{ \"There was a time when this town was a frequent stop for travelers from far and wide.  Much has changed since then.  But hidden caves and buried treasure are common fantasies of any child.  Wirt seldom indulges in youthful games.  So it may just be his imagination.|\",\r\n\t    1, 5, TSFX_STORY19 },\r\n\t{ \"Listen here.  Come close.  I don't know if you know what I know, but you've have really got something here.  That's a map.|\",\r\n\t    1, 5, TSFX_DRUNK21 },\r\n\t{ \"My grandmother often tells me stories about the strange forces that inhabit the graveyard outside of the church.  And it may well interest you to hear one of them.  She said that if you were to leave the proper offering in the cemetary, enter the cathedral to pray for the dead, and then return, the offering would be altered in some strange way.  I don't know if this is just the talk of an old sick woman, but anything seems possible these days.|\",\r\n\t    1, 5, TSFX_BMAID27 },\r\n\t{ \"Hmmm.  A vast and mysterious treasure you say.  Mmmm.  Maybe I could be interested in picking up a few things from you.  Or better yet, don't you need some rare and expensive supplies to get you through this ordeal?|\",\r\n\t    1, 5, TSFX_PEGBOY7 },\r\n\t{ \"The once proud Iswall is trapped deep beneath the surface of this world.  His honor stripped and his visage altered.  He is trapped in immortal torment.  Charged to conceal the very thing that could free him.|\",\r\n\t    1, 5, TSFX_WITCH9 },\r\n#endif\r\n\t{ \"So, you're the hero everyone's been talking about. Perhaps you could help a poor, simple farmer out of a terrible mess? At the edge of my orchard, just south of here, there's a horrible thing swelling out of the ground! I can't get to my crops or my bales of hay, and my poor cows will starve. The witch gave this to me and said that it would blast that thing out of my field. If you could destroy it, I would be forever grateful. I'd do it myself, but someone has to stay here with the cows...|\",\r\n\t    1, 3, TSFX_FARMER1 },\r\n\t{ \"I knew that it couldn't be as simple as that witch made it sound. It's a sad world when you can't even trust your neighbors.|\",\r\n\t    1, 5, TSFX_FARMER2 },\r\n\t{ \"Is it gone? Did you send it back to the dark recesses of Hades that spawned it? You what? Oh, don't tell me you lost it! Those things don't come cheap, you know. You've got to find it, and then blast that horror out of our town.|\",\r\n\t    1, 5, TSFX_FARMER3 },\r\n\t{ \"I heard the explosion from here! Many thanks to you, kind stranger. What with all these things comin' out of the ground, monsters taking over the church, and so forth, these are trying times. I am but a poor farmer, but here -- take this with my great thanks.|\",\r\n\t    1, 5, TSFX_FARMER4 },\r\n\t{ \"Oh, such a trouble I have...maybe...No, I couldn't impose on you, what with all the other troubles. Maybe after you've cleansed the church of some of those creatures you could come back... and spare a little time to help a poor farmer?|\",\r\n\t    1, 5, TSFX_FARMER5 },\r\n\t{ \"Waaaah! (sniff) Waaaah! (sniff)|\", 1, 5, TSFX_TEDDYBR1 },\r\n\t{ \"I lost Theo!  I lost my best friend!  We were playing over by the river, and Theo said he wanted to go look at the big green thing.  I said we shouldn't, but we snuck over there, and then suddenly this BUG came out!  We ran away but Theo fell down and the bug GRABBED him and took him away!|\",\r\n\t    1, 5, TSFX_TEDDYBR2 },\r\n\t{ \"Didja find him?  You gotta find Theodore, please!  He's just little.  He can't take care of himself!  Please!|\",\r\n\t    1, 5, TSFX_TEDDYBR3 },\r\n\t{ \"You found him!  You found him!  Thank you!  Oh Theo, did those nasty bugs scare you?  Hey!  Ugh!  There's something stuck to your fur!  Ick!  Come on, Theo, let's go home!  Thanks again, hero person!|\",\r\n\t    1, 5, TSFX_TEDDYBR4 },\r\n\t{ \"We have long lain dormant, and the time to awaken has come.  After our long sleep, we are filled with great hunger.  Soon, now, we shall feed...|\",\r\n\t    1, 5, USFX_DEFILER6 },\r\n\t{ \"Have you been enjoying yourself, little mammal?  How pathetic. Your little world will be no challenge at all.|\",\r\n\t    1, 5, USFX_DEFILER2 },\r\n\t{ \"These lands shall be defiled, and our brood shall overrun the fields that men call home.  Our tendrils shall envelop this world, and we will feast on the flesh of its denizens.  Man shall become our chattel and sustenance.|\",\r\n\t    1, 5, USFX_DEFILER7 },\r\n\t{ \"Ah, I can smell you...you are close! Close! Ssss...the scent of blood and fear...how enticing...|\",\r\n\t    1, 5, USFX_DEFILER4 },\r\n\t{ \" |\", 1, 5, USFX_DEFILER8 },\r\n\t{ \" |\", 1, 5, USFX_NAKRUL1 },\r\n\t{ \" |\", 1, 5, USFX_NAKRUL2 },\r\n\t{ \" |\", 1, 5, USFX_NAKRUL3 },\r\n\t{ \" |\", 1, 5, USFX_NAKRUL4 },\r\n\t{ \" |\", 1, 5, USFX_NAKRUL5 },\r\n\t{ \"And in the year of the Golden Light, it was so decreed that a great Cathedral be raised.  The cornerstone of this holy place was to be carved from the translucent stone Antyrael, named for the Angel who shared his power with the Horadrim.  \\n \\nIn the Year of Drawing Shadows, the ground shook and the Cathedral shattered and fell.  As the building of catacombs and castles began and man stood against the ravages of the Sin War, the ruins were scavenged for their stones.  And so it was that the cornerstone vanished from the eyes of man. \\n \\nThe stone was of this world -- and of all worlds -- as the Light is both within all things and beyond all things. Light and unity are the products of this holy foundation, a unity of purpose and a unity of possession.|\",\r\n\t    1, 2, PS_NARATR3 },\r\n\t{ \"Moo.|\", 1, 5, TSFX_COWSUT1 },\r\n\t{ \"I said, Moo.|\", 1, 5, TSFX_COWSUT2 },\r\n\t{ \"Look I'm just a cow, OK?|\", 1, 5, TSFX_COWSUT3 },\r\n\t{ \"All right, all right.  I'm not really a cow.  I don't normally go around like this; but, I was sitting at home minding my own business and all of a sudden these bugs & vines & bulbs & stuff started coming out of the floor... it was horrible!  If only I had something normal to wear, it wouldn't be so bad.  Hey!  Could you go back to my place and get my suit for me?  The brown one, not the gray one, that's for evening wear.  I'd do it myself, but I don't want anyone seeing me like this.  Here, take this, you might need it... to kill those things that have overgrown everything.  You can't miss my house, it's just south of the fork in the river... you know... the one with the overgrown vegetable garden.|\",\r\n\t    1, 5, TSFX_COWSUT4 },\r\n\t{ \"What are you wasting time for?  Go get my suit!  And hurry!  That Holstein over there keeps winking at me! |\",\r\n\t    1, 5, TSFX_COWSUT5 },\r\n\t{ \"Hey, have you got my suit there?  Quick, pass it over!  These ears itch like you wouldn't believe!|\",\r\n\t    1, 5, TSFX_COWSUT6 },\r\n\t{ \"No no no no!  This is my GRAY suit!  It's for evening wear!  Formal occasions!  I can't wear THIS.  What are you, some kind of weirdo?  I need the BROWN suit.|\",\r\n\t    1, 5, TSFX_COWSUT7 },\r\n\t{ \"Ahh, that's MUCH better.  Whew!  At last, some dignity!  Are my antlers on straight?  Good.  Look, thanks a lot for helping me out.  Here, take this as a gift; and, you know... a little fashion tip... you could use a little... you could use a new... yknowwhatImean?  The whole adventurer motif is just so... retro.  Just a word of advice, eh?  Ciao.|\",\r\n\t    1, 5, TSFX_COWSUT8 },\r\n\t{ \"Look.  I'm a cow.  And you, you're monster bait. Get some experience under your belt!  We'll talk...|\",\r\n\t    1, 5, TSFX_COWSUT9 },\r\n\t{ \"|\", 1, 5, TSFX_TRADER1 },\r\n\t{ \"It must truly be a fearsome task I've set before you. If there was just some way that I could... would a flagon of some nice, fresh milk help?|\",\r\n\t    1, 5, TSFX_FARMER2A },\r\n\t{ \"Oh, I could use your help, but perhaps after you've saved the catacombs from the desecration of those beasts.|\",\r\n\t    1, 5, TSFX_FARMER6 },\r\n\t{ \"I need something done, but I couldn't impose on a perfect stranger. Perhaps after you've been here a while I might feel more comfortable asking a favor.|\",\r\n\t    1, 5, TSFX_FARMER7 },\r\n\t{ \"I see in you the potential for greatness.  Perhaps sometime while you are fulfilling your destiny, you could stop by and do a little favor for me?|\",\r\n\t    1, 5, TSFX_FARMER8 },\r\n\t{ \"I think you could probably help me, but perhaps after you've gotten a little more powerful. I wouldn't want to injure the village's only chance to destroy the menace in the church!|\",\r\n\t    1, 5, TSFX_FARMER9 },\r\n\t{ \"Me, I'm a self-made cow.  Make something of yourself, and... then we'll talk.|\",\r\n\t    1, 5, TSFX_COWSUT10 },\r\n\t{ \"I don't have to explain myself to every tourist that walks by!  Don't you have some monsters to kill?  Maybe we'll talk later.  If you live...|\",\r\n\t    1, 5, TSFX_COWSUT11 },\r\n\t{ \"Quit bugging me.  I'm looking for someone really heroic.  And you're not it.  I can't trust you, you're going to get eaten by monsters any day now... I need someone who's an experienced hero.|\",\r\n\t    1, 5, TSFX_COWSUT12 },\r\n\t{ \"All right, I'll cut the bull.  I didn't mean to steer you wrong.  I was sitting at home, feeling moo-dy, when things got really un-stable; a whole stampede of monsters came out of the floor!  I just cowed.  I just happened to be wearing this Jersey when I ran out the door, and now I look udderly ridiculous.  If only I had something normal to wear, it wouldn't be so bad.  Hey!  Can you go back to my place and get my suit for me?  The brown one, not the gray one, that's for evening wear.  I'd do it myself, but I don't want anyone seeing me like this.  Here, take this, you might need it... to kill those things that have overgrown everything.  You can't miss my house, it's just south of the fork in the river... you know... the one with the overgrown vegetable garden.|\",\r\n\t    1, 5, TSFX_COWSUT4A },\r\n\t{ \"Cloudy and cooler today.  Casting the nets of necromancy across the void landed two new subspecies of flying horror; a good day's work.  Must remember to order some more bat guano and black candles from Adria; I'm running a bit low.|\",\r\n\t    1, 5, USFX_SKLJRN1 },\r\n\t{ \"I have tried spells, threats, abjuration and bargaining with this foul creature -- to no avail.  My methods of enslaving lesser demons seem to have no effect on this fearsome beast.|\",\r\n\t    1, 5, PS_NARATR6 },\r\n\t{ \"My home is slowly becoming corrupted by the vileness of this unwanted prisoner.  The crypts are\tfull of shadows that move just beyond the corners of my vision.  The faint scrabble of claws dances at the edges of my hearing. They are searching, I think, for this journal.|\",\r\n\t    1, 5, PS_NARATR7 },\r\n\t{ \"In its ranting, the creature has let slip its name -- Na-Krul.  I have attempted to research the name, but the smaller demons have somehow destroyed my library.  Na-Krul... The name fills me with a cold dread.  I prefer to think of it only as The Creature rather than ponder its true name.|\",\r\n\t    1, 5, PS_NARATR8 },\r\n\t{ \"The entrapped creature's howls of fury keep me from gaining much needed sleep.  It rages against the one who sent it to the Void, and it calls foul curses upon me for trapping it here.  Its words fill my heart with terror, and yet I cannot block out its voice.|\",\r\n\t    1, 5, PS_NARATR5 },\r\n\t{ \"My time is quickly running out.  I must record the ways to weaken the demon, and then conceal that text, lest his minions find some way to use my knowledge to free their lord.  I hope that whoever finds this journal will seek the knowledge.|\",\r\n\t    1, 5, PS_NARATR9 },\r\n\t{ \"Whoever finds this scroll is charged with stopping the demonic creature that lies within these walls.  My time is over. Even now, its hellish minions claw at the frail door behind which I hide.  \\n \\nI have hobbled the demon with arcane magic and encased it within great walls, but I fear that will not be enough. \\n \\nThe spells found in my three grimoires will provide you protected entrance to his domain, but only if cast in their proper sequence.  The levers at the entryway will remove the barriers and free the demon; touch them not!  Use only these spells to gain entry or his power may be too great for you to defeat.|\",\r\n\t    1, 2, PS_NARATR4 },\r\n\t{ \"In Spiritu Sanctum. |\", 1, 5, PS_WARR54 },\r\n\t{ \"Praedictum Otium. |\", 1, 5, PS_WARR55 },\r\n\t{ \"Efficio Obitus Ut Inimicus. |\", 1, 5, PS_WARR56 },\r\n\t{ \"In Spiritu Sanctum. |\", 1, 5, PS_MONK54 },\r\n\t{ \"Praedictum Otium. |\", 1, 5, PS_MONK55 },\r\n\t{ \"Efficio Obitus Ut Inimicus. |\", 1, 5, PS_MONK56 },\r\n#ifdef SPAWN\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n\t{ \"Nice try... \", 0, 0, TSFX_TAVERN36 },\r\n#else\r\n\t{ \"In Spiritu Sanctum. |\", 1, 5, PS_MAGE54 },\r\n\t{ \"Praedictum Otium. |\", 1, 5, PS_MAGE55 },\r\n\t{ \"Efficio Obitus Ut Inimicus. |\", 1, 5, PS_MAGE56 },\r\n\t{ \"In Spiritu Sanctum. |\", 1, 5, PS_ROGUE54 },\r\n\t{ \"Praedictum Otium. |\", 1, 5, PS_ROGUE55 },\r\n\t{ \"Efficio Obitus Ut Inimicus. |\", 1, 5, PS_ROGUE56 },\r\n\t{ \"In Spiritu Sanctum. |\", 1, 5, PS_ROGUE54 },\r\n\t{ \"Praedictum Otium. |\", 1, 5, PS_ROGUE55 },\r\n\t{ \"Efficio Obitus Ut Inimicus. |\", 1, 5, PS_ROGUE56 },\r\n#endif\r\n#endif\r\n};\r\n/** unused */\r\nconst DWORD gdwAllTextEntries = 259;\r\n"
  },
  {
    "path": "Source/textdat.h",
    "content": "/**\r\n * @file textdat.h\r\n *\r\n * Interface of all dialog texts.\r\n */\r\n#ifndef __TEXTDAT_H__\r\n#define __TEXTDAT_H__\r\n\r\nextern const TextDataStruct alltext[];\r\n\r\n#endif /* __TEXTDAT_H__ */\r\n"
  },
  {
    "path": "Source/themes.cpp",
    "content": "/**\r\n * @file themes.cpp\r\n *\r\n * Implementation of the theme room placing algorithms.\r\n */\r\n#include \"all.h\"\r\n\r\nint numthemes;\r\nBOOL armorFlag;\r\nBOOL ThemeGoodIn[4];\r\nBOOL weaponFlag;\r\nBOOL treasureFlag;\r\nBOOL mFountainFlag;\r\nBOOL cauldronFlag;\r\nBOOL tFountainFlag;\r\nint zharlib;\r\nint themex;\r\nint themey;\r\nint themeVar1;\r\nThemeStruct themes[MAXTHEMES];\r\nBOOL pFountainFlag;\r\nBOOL bFountainFlag;\r\nBOOL bCrossFlag;\r\n\r\n/** Specifies the set of special theme IDs from which one will be selected at random. */\r\nint ThemeGood[4] = { THEME_GOATSHRINE, THEME_SHRINE, THEME_SKELROOM, THEME_LIBRARY };\r\n/** Specifies a 5x5 area to fit theme objects. */\r\nint trm5x[] = {\r\n\t-2, -1, 0, 1, 2,\r\n\t-2, -1, 0, 1, 2,\r\n\t-2, -1, 0, 1, 2,\r\n\t-2, -1, 0, 1, 2,\r\n\t-2, -1, 0, 1, 2\r\n};\r\n/** Specifies a 5x5 area to fit theme objects. */\r\nint trm5y[] = {\r\n\t-2, -2, -2, -2, -2,\r\n\t-1, -1, -1, -1, -1,\r\n\t0, 0, 0, 0, 0,\r\n\t1, 1, 1, 1, 1,\r\n\t2, 2, 2, 2, 2\r\n};\r\n/** Specifies a 3x3 area to fit theme objects. */\r\nint trm3x[] = {\r\n\t-1, 0, 1,\r\n\t-1, 0, 1,\r\n\t-1, 0, 1\r\n};\r\n/** Specifies a 3x3 area to fit theme objects. */\r\nint trm3y[] = {\r\n\t-1, -1, -1,\r\n\t0, 0, 0,\r\n\t1, 1, 1\r\n};\r\n\r\nBOOL TFit_Shrine(int i)\r\n{\r\n\tint xp, yp, found;\r\n\r\n\txp = 0;\r\n\typ = 0;\r\n\tfound = 0;\r\n\twhile (found == 0) {\r\n\t\tif (dTransVal[xp][yp] == themes[i].ttval) {\r\n\t\t\tif (nTrapTable[dPiece[xp][yp - 1]]\r\n\t\t\t    && !nSolidTable[dPiece[xp - 1][yp]]\r\n\t\t\t    && !nSolidTable[dPiece[xp + 1][yp]]\r\n\t\t\t    && dTransVal[xp - 1][yp] == themes[i].ttval\r\n\t\t\t    && dTransVal[xp + 1][yp] == themes[i].ttval\r\n\t\t\t    && dObject[xp - 1][yp - 1] == 0\r\n\t\t\t    && dObject[xp + 1][yp - 1] == 0) {\r\n\t\t\t\tfound = 1;\r\n\t\t\t}\r\n\t\t\tif (found == 0\r\n\t\t\t    && nTrapTable[dPiece[xp - 1][yp]]\r\n\t\t\t    && !nSolidTable[dPiece[xp][yp - 1]]\r\n\t\t\t    && !nSolidTable[dPiece[xp][yp + 1]]\r\n\t\t\t    && dTransVal[xp][yp - 1] == themes[i].ttval\r\n\t\t\t    && dTransVal[xp][yp + 1] == themes[i].ttval\r\n\t\t\t    && dObject[xp - 1][yp - 1] == 0\r\n\t\t\t    && dObject[xp - 1][yp + 1] == 0) {\r\n\t\t\t\tfound = 2;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (found == 0) {\r\n\t\t\txp++;\r\n\t\t\tif (xp == MAXDUNX) {\r\n\t\t\t\txp = 0;\r\n\t\t\t\typ++;\r\n\t\t\t\tif (yp == MAXDUNY)\r\n\t\t\t\t\treturn FALSE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tthemex = xp;\r\n\tthemey = yp;\r\n\tthemeVar1 = found;\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL TFit_Obj5(int t)\r\n{\r\n\tint xp, yp;\r\n\tint i, r, rs;\r\n\tBOOL found;\r\n\r\n\txp = 0;\r\n\typ = 0;\r\n\tr = random_(0, 5) + 1;\r\n\trs = r;\r\n\twhile (r > 0) {\r\n\t\tfound = FALSE;\r\n\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\tfound = TRUE;\r\n\t\t\tfor (i = 0; found && i < 25; i++) {\r\n\t\t\t\tif (nSolidTable[dPiece[xp + trm5x[i]][yp + trm5y[i]]]) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t\tif (dTransVal[xp + trm5x[i]][yp + trm5y[i]] != themes[t].ttval) {\r\n\t\t\t\t\tfound = FALSE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!found) {\r\n\t\t\txp++;\r\n\t\t\tif (xp == MAXDUNX) {\r\n\t\t\t\txp = 0;\r\n\t\t\t\typ++;\r\n\t\t\t\tif (yp == MAXDUNY) {\r\n\t\t\t\t\tif (r == rs) {\r\n\t\t\t\t\t\treturn FALSE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\typ = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tr--;\r\n\t}\r\n\r\n\tthemex = xp;\r\n\tthemey = yp;\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL TFit_SkelRoom(int t)\r\n{\r\n\tint i;\r\n\r\n\tif (leveltype != DTYPE_CATHEDRAL && leveltype != DTYPE_CATACOMBS) {\r\n\t\treturn FALSE;\r\n\t}\r\n\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tif (IsSkel(Monsters[i].mtype)) {\r\n\t\t\tthemeVar1 = i;\r\n\t\t\treturn TFit_Obj5(t);\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL TFit_GoatShrine(int t)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tif (IsGoat(Monsters[i].mtype)) {\r\n\t\t\tthemeVar1 = i;\r\n\t\t\treturn TFit_Obj5(t);\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL CheckThemeObj3(int xp, int yp, int t, int f)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < 9; i++) {\r\n\t\tif (xp + trm3x[i] < 0 || yp + trm3y[i] < 0)\r\n\t\t\treturn FALSE;\r\n\t\tif (nSolidTable[dPiece[xp + trm3x[i]][yp + trm3y[i]]])\r\n\t\t\treturn FALSE;\r\n\t\tif (dTransVal[xp + trm3x[i]][yp + trm3y[i]] != themes[t].ttval)\r\n\t\t\treturn FALSE;\r\n\t\tif (dObject[xp + trm3x[i]][yp + trm3y[i]])\r\n\t\t\treturn FALSE;\r\n\t\tif (f != -1 && random_(0, f) == 0)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nBOOL TFit_Obj3(int t)\r\n{\r\n\tint xp, yp;\r\n\tchar objrnd[4] = { 4, 4, 3, 5 };\r\n\r\n\tfor (yp = 1; yp < MAXDUNY - 1; yp++) {\r\n\t\tfor (xp = 1; xp < MAXDUNX - 1; xp++) {\r\n\t\t\tif (CheckThemeObj3(xp, yp, t, objrnd[leveltype - 1])) {\r\n\t\t\t\tthemex = xp;\r\n\t\t\t\tthemey = yp;\r\n\t\t\t\treturn TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL CheckThemeReqs(int t)\r\n{\r\n\tBOOL rv;\r\n\r\n\trv = TRUE;\r\n\tswitch (t) {\r\n\tcase THEME_SHRINE:\r\n\tcase THEME_SKELROOM:\r\n\tcase THEME_LIBRARY:\r\n\t\tif (leveltype == DTYPE_CAVES || leveltype == DTYPE_HELL) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_BLOODFOUNTAIN:\r\n\t\tif (!bFountainFlag) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_PURIFYINGFOUNTAIN:\r\n\t\tif (!pFountainFlag) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_ARMORSTAND:\r\n\t\tif (leveltype == DTYPE_CATHEDRAL) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_CAULDRON:\r\n\t\tif (leveltype != DTYPE_HELL || !cauldronFlag) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_MURKYFOUNTAIN:\r\n\t\tif (!mFountainFlag) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_TEARFOUNTAIN:\r\n\t\tif (!tFountainFlag) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_WEAPONRACK:\r\n\t\tif (leveltype == DTYPE_CATHEDRAL) {\r\n\t\t\trv = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nBOOL SpecialThemeFit(int i, int t)\r\n{\r\n\tBOOL rv;\r\n\r\n\trv = CheckThemeReqs(t);\r\n\tswitch (t) {\r\n\tcase THEME_SHRINE:\r\n\tcase THEME_LIBRARY:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_Shrine(i);\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_SKELROOM:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_SkelRoom(i);\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_BLOODFOUNTAIN:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_Obj5(i);\r\n\t\t}\r\n\t\tif (rv) {\r\n\t\t\tbFountainFlag = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_PURIFYINGFOUNTAIN:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_Obj5(i);\r\n\t\t}\r\n\t\tif (rv) {\r\n\t\t\tpFountainFlag = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_MURKYFOUNTAIN:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_Obj5(i);\r\n\t\t}\r\n\t\tif (rv) {\r\n\t\t\tmFountainFlag = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_TEARFOUNTAIN:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_Obj5(i);\r\n\t\t}\r\n\t\tif (rv) {\r\n\t\t\ttFountainFlag = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_CAULDRON:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_Obj5(i);\r\n\t\t}\r\n\t\tif (rv) {\r\n\t\t\tcauldronFlag = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_GOATSHRINE:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_GoatShrine(i);\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_TORTURE:\r\n\tcase THEME_DECAPITATED:\r\n\tcase THEME_ARMORSTAND:\r\n\tcase THEME_BRNCROSS:\r\n\tcase THEME_WEAPONRACK:\r\n\t\tif (rv) {\r\n\t\t\trv = TFit_Obj3(i);\r\n\t\t}\r\n\t\tbreak;\r\n\tcase THEME_TREASURE:\r\n\t\trv = treasureFlag;\r\n\t\tif (rv) {\r\n\t\t\ttreasureFlag = FALSE;\r\n\t\t}\r\n\t\tbreak;\r\n\t}\r\n\r\n\treturn rv;\r\n}\r\n\r\nBOOL CheckThemeRoom(int tv)\r\n{\r\n\tint i, j, tarea;\r\n\r\n\tfor (i = 0; i < numtrigs; i++) {\r\n\t\tif (dTransVal[trigs[i]._tx][trigs[i]._ty] == tv)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\ttarea = 0;\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dTransVal[i][j] != tv)\r\n\t\t\t\tcontinue;\r\n\t\t\tif (dFlags[i][j] & BFLAG_POPULATED)\r\n\t\t\t\treturn FALSE;\r\n\r\n\t\t\ttarea++;\r\n\t\t}\r\n\t}\r\n\r\n\tif (leveltype == DTYPE_CATHEDRAL && (tarea < 9 || tarea > 100))\r\n\t\treturn FALSE;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dTransVal[i][j] != tv || nSolidTable[dPiece[i][j]])\r\n\t\t\t\tcontinue;\r\n\t\t\tif (dTransVal[i - 1][j] != tv && !nSolidTable[dPiece[i - 1][j]])\r\n\t\t\t\treturn FALSE;\r\n\t\t\tif (dTransVal[i + 1][j] != tv && !nSolidTable[dPiece[i + 1][j]])\r\n\t\t\t\treturn FALSE;\r\n\t\t\tif (dTransVal[i][j - 1] != tv && !nSolidTable[dPiece[i][j - 1]])\r\n\t\t\t\treturn FALSE;\r\n\t\t\tif (dTransVal[i][j + 1] != tv && !nSolidTable[dPiece[i][j + 1]])\r\n\t\t\t\treturn FALSE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn TRUE;\r\n}\r\n\r\nvoid InitThemes()\r\n{\r\n\tint i, j;\r\n\r\n\tzharlib = -1;\r\n\tnumthemes = 0;\r\n\tarmorFlag = TRUE;\r\n\tbFountainFlag = TRUE;\r\n\tcauldronFlag = TRUE;\r\n\tmFountainFlag = TRUE;\r\n\tpFountainFlag = TRUE;\r\n\ttFountainFlag = TRUE;\r\n\ttreasureFlag = TRUE;\r\n\tbCrossFlag = FALSE;\r\n\tweaponFlag = TRUE;\r\n\r\n\tif (currlevel == 16)\r\n\t\treturn;\r\n\r\n\tif (leveltype == DTYPE_CATHEDRAL) {\r\n\t\tfor (i = 0; i < sizeof(ThemeGoodIn) / sizeof(ThemeGoodIn[0]); i++)\r\n\t\t\tThemeGoodIn[i] = FALSE;\r\n\r\n\t\tfor (i = 0; i < 256 && numthemes < MAXTHEMES; i++) {\r\n\t\t\tif (CheckThemeRoom(i)) {\r\n\t\t\t\tthemes[numthemes].ttval = i;\r\n\t\t\t\tfor (j = ThemeGood[random_(0, 4)];; j = random_(0, 17)) {\r\n\t\t\t\t\tif (SpecialThemeFit(numthemes, j)) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthemes[numthemes].ttype = j;\r\n\t\t\t\tnumthemes++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (leveltype == DTYPE_CATACOMBS || leveltype == DTYPE_CAVES || leveltype == DTYPE_HELL) {\r\n\t\tfor (i = 0; i < themeCount; i++)\r\n\t\t\tthemes[i].ttype = THEME_NONE;\r\n\t\tif (QuestStatus(Q_ZHAR)) {\r\n\t\t\tfor (j = 0; j < themeCount; j++) {\r\n\t\t\t\tthemes[j].ttval = themeLoc[j].ttval;\r\n\t\t\t\tif (SpecialThemeFit(j, THEME_LIBRARY)) {\r\n\t\t\t\t\tthemes[j].ttype = THEME_LIBRARY;\r\n\t\t\t\t\tzharlib = j;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; i < themeCount; i++) {\r\n\t\t\tif (themes[i].ttype == THEME_NONE) {\r\n\t\t\t\tthemes[i].ttval = themeLoc[i].ttval;\r\n\t\t\t\tfor (j = ThemeGood[random_(0, 4)];; j = random_(0, 17)) {\r\n\t\t\t\t\tif (SpecialThemeFit(i, j)) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthemes[i].ttype = j;\r\n\t\t\t}\r\n\t\t}\r\n\t\tnumthemes += themeCount;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief HoldThemeRooms marks theme rooms as populated.\r\n */\r\nvoid HoldThemeRooms()\r\n{\r\n\tint i, x, y;\r\n\tchar v;\r\n\r\n\tif (currlevel != 16) {\r\n\t\tif (leveltype == DTYPE_CATHEDRAL) {\r\n\t\t\tfor (i = 0; i < numthemes; i++) {\r\n\t\t\t\tv = themes[i].ttval;\r\n\t\t\t\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\t\t\t\tfor (x = 0; x < MAXDUNX; x++) {\r\n\t\t\t\t\t\tif (dTransVal[x][y] == v) {\r\n\t\t\t\t\t\t\tdFlags[x][y] |= BFLAG_POPULATED;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tDRLG_HoldThemeRooms();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * PlaceThemeMonsts places theme monsters with the specified frequency.\r\n *\r\n * @param t theme number (index into themes array).\r\n * @param f frequency (1/f likelihood of adding monster).\r\n */\r\nvoid PlaceThemeMonsts(int t, int f)\r\n{\r\n\tint xp, yp;\r\n#ifdef HELLFIRE\r\n\tint scattertypes[138];\r\n#else\r\n\tint scattertypes[111];\r\n#endif\r\n\tint numscattypes, mtype, i;\r\n\r\n\tnumscattypes = 0;\r\n\tfor (i = 0; i < nummtypes; i++) {\r\n\t\tif (Monsters[i].mPlaceFlags & PLACE_SCATTER) {\r\n\t\t\tscattertypes[numscattypes] = i;\r\n\t\t\tnumscattypes++;\r\n\t\t}\r\n\t}\r\n\tmtype = scattertypes[random_(0, numscattypes)];\r\n\tfor (yp = 0; yp < MAXDUNY; yp++) {\r\n\t\tfor (xp = 0; xp < MAXDUNX; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]] && dItem[xp][yp] == 0 && dObject[xp][yp] == 0) {\r\n\t\t\t\tif (random_(0, f) == 0) {\r\n\t\t\t\t\tAddMonster(xp, yp, random_(0, 8), mtype, TRUE);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Theme_Barrel initializes the barrel theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_Barrel(int t)\r\n{\r\n\tint xp, yp, r;\r\n\tchar barrnd[4] = { 2, 6, 4, 8 };\r\n\tchar monstrnd[4] = { 5, 7, 3, 9 };\r\n\r\n\tfor (yp = 0; yp < MAXDUNY; yp++) {\r\n\t\tfor (xp = 0; xp < MAXDUNX; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\t\tif (random_(0, barrnd[leveltype - 1]) == 0) {\r\n\t\t\t\t\tif (random_(0, barrnd[leveltype - 1]) == 0) {\r\n\t\t\t\t\t\tr = OBJ_BARREL;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tr = OBJ_BARRELEX;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tAddObject(r, xp, yp);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_Shrine initializes the shrine theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_Shrine(int t)\r\n{\r\n\tchar monstrnd[4] = { 6, 6, 3, 9 };\r\n\r\n\tTFit_Shrine(t);\r\n\tif (themeVar1 == 1) {\r\n\t\tAddObject(OBJ_CANDLE2, themex - 1, themey);\r\n\t\tAddObject(OBJ_SHRINER, themex, themey);\r\n\t\tAddObject(OBJ_CANDLE2, themex + 1, themey);\r\n\t} else {\r\n\t\tAddObject(OBJ_CANDLE2, themex, themey - 1);\r\n\t\tAddObject(OBJ_SHRINEL, themex, themey);\r\n\t\tAddObject(OBJ_CANDLE2, themex, themey + 1);\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_MonstPit initializes the monster pit theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_MonstPit(int t)\r\n{\r\n\tint r;\r\n\tint ixp, iyp;\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tr = random_(0, 100) + 1;\r\n\tixp = 0;\r\n\tiyp = 0;\r\n\twhile (r > 0) {\r\n\t\tif (dTransVal[ixp][iyp] == themes[t].ttval && !nSolidTable[dPiece[ixp][iyp]]) {\r\n\t\t\t--r;\r\n\t\t}\r\n\t\tif (r <= 0)\r\n\t\t\tcontinue;\r\n\t\tixp++;\r\n\t\tif (ixp == MAXDUNX) {\r\n\t\t\tixp = 0;\r\n\t\t\tiyp++;\r\n\t\t\tif (iyp == MAXDUNY) {\r\n\t\t\t\tiyp = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tCreateRndItem(ixp, iyp, TRUE, FALSE, TRUE);\r\n\tItemNoFlippy();\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_SkelRoom initializes the skeleton room theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_SkelRoom(int t)\r\n{\r\n\tint xp, yp, i;\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tTFit_SkelRoom(t);\r\n\r\n\txp = themex;\r\n\typ = themey;\r\n\r\n\tAddObject(OBJ_SKFIRE, xp, yp);\r\n\r\n\tif (random_(0, monstrnd[leveltype - 1]) != 0) {\r\n\t\ti = PreSpawnSkeleton();\r\n\t\tSpawnSkeleton(i, xp - 1, yp - 1);\r\n\t} else {\r\n\t\tAddObject(OBJ_BANNERL, xp - 1, yp - 1);\r\n\t}\r\n\r\n\ti = PreSpawnSkeleton();\r\n\tSpawnSkeleton(i, xp, yp - 1);\r\n\r\n\tif (random_(0, monstrnd[leveltype - 1]) != 0) {\r\n\t\ti = PreSpawnSkeleton();\r\n\t\tSpawnSkeleton(i, xp + 1, yp - 1);\r\n\t} else {\r\n\t\tAddObject(OBJ_BANNERR, xp + 1, yp - 1);\r\n\t}\r\n\tif (random_(0, monstrnd[leveltype - 1]) != 0) {\r\n\t\ti = PreSpawnSkeleton();\r\n\t\tSpawnSkeleton(i, xp - 1, yp);\r\n\t} else {\r\n\t\tAddObject(OBJ_BANNERM, xp - 1, yp);\r\n\t}\r\n\tif (random_(0, monstrnd[leveltype - 1]) != 0) {\r\n\t\ti = PreSpawnSkeleton();\r\n\t\tSpawnSkeleton(i, xp + 1, yp);\r\n\t} else {\r\n\t\tAddObject(OBJ_BANNERM, xp + 1, yp);\r\n\t}\r\n\tif (random_(0, monstrnd[leveltype - 1]) != 0) {\r\n\t\ti = PreSpawnSkeleton();\r\n\t\tSpawnSkeleton(i, xp - 1, yp + 1);\r\n\t} else {\r\n\t\tAddObject(OBJ_BANNERR, xp - 1, yp + 1);\r\n\t}\r\n\r\n\ti = PreSpawnSkeleton();\r\n\tSpawnSkeleton(i, xp, yp + 1);\r\n\r\n\tif (random_(0, monstrnd[leveltype - 1]) != 0) {\r\n\t\ti = PreSpawnSkeleton();\r\n\t\tSpawnSkeleton(i, xp + 1, yp + 1);\r\n\t} else {\r\n\t\tAddObject(OBJ_BANNERL, xp + 1, yp + 1);\r\n\t}\r\n\r\n\tif (dObject[xp][yp - 3] == 0) {\r\n\t\tAddObject(OBJ_SKELBOOK, xp, yp - 2);\r\n\t}\r\n\tif (dObject[xp][yp + 3] == 0) {\r\n\t\tAddObject(OBJ_SKELBOOK, xp, yp + 2);\r\n\t}\r\n}\r\n\r\n/**\r\n * Theme_Treasure initializes the treasure theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_Treasure(int t)\r\n{\r\n\tint xp, yp;\r\n\tint i;\r\n\tchar treasrnd[4] = { 4, 9, 7, 10 };\r\n\tchar monstrnd[4] = { 6, 8, 3, 7 };\r\n\r\n\tGetRndSeed();\r\n\tfor (yp = 0; yp < MAXDUNY; yp++) {\r\n\t\tfor (xp = 0; xp < MAXDUNX; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\t\tint rv = random_(0, treasrnd[leveltype - 1]);\r\n\t\t\t\t// BUGFIX: the `2*` in `2*random_(0, treasrnd...) == 0` has no effect, should probably be `random_(0, 2*treasrnd...) == 0`\r\n\t\t\t\tif ((2 * random_(0, treasrnd[leveltype - 1])) == 0) {\r\n\t\t\t\t\tCreateTypeItem(xp, yp, FALSE, ITYPE_GOLD, IMISC_NONE, FALSE, TRUE);\r\n\t\t\t\t\tItemNoFlippy();\r\n\t\t\t\t}\r\n\t\t\t\tif (rv == 0) {\r\n\t\t\t\t\tCreateRndItem(xp, yp, FALSE, FALSE, TRUE);\r\n\t\t\t\t\tItemNoFlippy();\r\n\t\t\t\t}\r\n\t\t\t\t// BUGFIX: the following code is likely not working as intended.\r\n\t\t\t\t//\r\n\t\t\t\t//    `rv == 0` has no effect.\r\n\t\t\t\t//\r\n\t\t\t\t//    `rv >= treasrnd[leveltype - 1] - 2` is not connected to either\r\n\t\t\t\t//    of the item creation branches above, thus the last (unrelated)\r\n\t\t\t\t//    item spawned/dropped on ground would be halved in value.\r\n\t\t\t\tif (rv == 0 || rv >= treasrnd[leveltype - 1] - 2) {\r\n\t\t\t\t\ti = ItemNoFlippy();\r\n\t\t\t\t\tif (rv >= treasrnd[leveltype - 1] - 2 && leveltype != DTYPE_CATHEDRAL) {\r\n\t\t\t\t\t\titem[i]._ivalue >>= 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_Library initializes the library theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_Library(int t)\r\n{\r\n\tint xp, yp, oi;\r\n\tchar librnd[4] = { 1, 2, 2, 5 };\r\n\tchar monstrnd[4] = { 5, 7, 3, 9 };\r\n\r\n\tTFit_Shrine(t);\r\n\r\n\tif (themeVar1 == 1) {\r\n\t\tAddObject(OBJ_BOOKCANDLE, themex - 1, themey);\r\n\t\tAddObject(OBJ_BOOKCASER, themex, themey);\r\n\t\tAddObject(OBJ_BOOKCANDLE, themex + 1, themey);\r\n\t} else {\r\n\t\tAddObject(OBJ_BOOKCANDLE, themex, themey - 1);\r\n\t\tAddObject(OBJ_BOOKCASEL, themex, themey);\r\n\t\tAddObject(OBJ_BOOKCANDLE, themex, themey + 1);\r\n\t}\r\n\r\n\tfor (yp = 1; yp < MAXDUNY - 1; yp++) {\r\n\t\tfor (xp = 1; xp < MAXDUNX - 1; xp++) {\r\n\t\t\tif (CheckThemeObj3(xp, yp, t, -1) && dMonster[xp][yp] == 0 && random_(0, librnd[leveltype - 1]) == 0) {\r\n\t\t\t\tAddObject(OBJ_BOOKSTAND, xp, yp);\r\n\t\t\t\tif (random_(0, 2 * librnd[leveltype - 1]) != 0) { /// BUGFIX: check dObject[xp][yp] was populated by AddObject\r\n\t\t\t\t\toi = dObject[xp][yp] - 1;\r\n\t\t\t\t\tobject[oi]._oSelFlag = 0;\r\n\t\t\t\t\tobject[oi]._oAnimFrame += 2;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (QuestStatus(Q_ZHAR)) {\r\n\t\tif (t == zharlib) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tPlaceThemeMonsts(t, monstrnd[leveltype]); /// BUGFIX: `leveltype - 1`\r\n\t} else {\r\n\t\tPlaceThemeMonsts(t, monstrnd[leveltype]); /// BUGFIX: `leveltype - 1`\r\n\t}\r\n}\r\n\r\n/**\r\n * Theme_Torture initializes the torture theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_Torture(int t)\r\n{\r\n\tint xp, yp;\r\n\tchar tortrnd[4] = { 6, 8, 3, 8 };\r\n\tchar monstrnd[4] = { 6, 8, 3, 9 };\r\n\r\n\tfor (yp = 1; yp < MAXDUNY - 1; yp++) {\r\n\t\tfor (xp = 1; xp < MAXDUNX - 1; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\t\tif (CheckThemeObj3(xp, yp, t, -1)) {\r\n\t\t\t\t\tif (random_(0, tortrnd[leveltype - 1]) == 0) {\r\n\t\t\t\t\t\tAddObject(OBJ_TNUDEM2, xp, yp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_BloodFountain initializes the blood fountain theme.\r\n * @param t Theme number (index into themes array).\r\n */\r\nvoid Theme_BloodFountain(int t)\r\n{\r\n\tchar monstrnd[4] = { 6, 8, 3, 9 };\r\n\r\n\tTFit_Obj5(t);\r\n\tAddObject(OBJ_BLOODFTN, themex, themey);\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_Decap initializes the decapitated theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_Decap(int t)\r\n{\r\n\tint xp, yp;\r\n\tchar decaprnd[4] = { 6, 8, 3, 8 };\r\n\tchar monstrnd[4] = { 6, 8, 3, 9 };\r\n\r\n\tfor (yp = 1; yp < MAXDUNY - 1; yp++) {\r\n\t\tfor (xp = 1; xp < MAXDUNX - 1; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\t\tif (CheckThemeObj3(xp, yp, t, -1)) {\r\n\t\t\t\t\tif (random_(0, decaprnd[leveltype - 1]) == 0) {\r\n\t\t\t\t\t\tAddObject(OBJ_DECAP, xp, yp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_PurifyingFountain initializes the purifying fountain theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_PurifyingFountain(int t)\r\n{\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tTFit_Obj5(t);\r\n\tAddObject(OBJ_PURIFYINGFTN, themex, themey);\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_ArmorStand initializes the armor stand theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_ArmorStand(int t)\r\n{\r\n\tint xp, yp;\r\n\tchar armorrnd[4] = { 6, 8, 3, 8 };\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tif (armorFlag) {\r\n\t\tTFit_Obj3(t);\r\n\t\tAddObject(OBJ_ARMORSTAND, themex, themey);\r\n\t}\r\n\tfor (yp = 0; yp < MAXDUNY; yp++) {\r\n\t\tfor (xp = 0; xp < MAXDUNX; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\t\tif (CheckThemeObj3(xp, yp, t, -1)) {\r\n\t\t\t\t\tif (random_(0, armorrnd[leveltype - 1]) == 0) {\r\n\t\t\t\t\t\tAddObject(OBJ_ARMORSTANDN, xp, yp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n\tarmorFlag = FALSE;\r\n}\r\n\r\n/**\r\n * Theme_GoatShrine initializes the goat shrine theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_GoatShrine(int t)\r\n{\r\n\tint xx, yy;\r\n\r\n\tTFit_GoatShrine(t);\r\n\tAddObject(OBJ_GOATSHRINE, themex, themey);\r\n\tfor (yy = themey - 1; yy <= themey + 1; yy++) {\r\n\t\tfor (xx = themex - 1; xx <= themex + 1; xx++) {\r\n\t\t\tif (dTransVal[xx][yy] == themes[t].ttval && !nSolidTable[dPiece[xx][yy]] && (xx != themex || yy != themey)) {\r\n\t\t\t\tAddMonster(xx, yy, DIR_SW, themeVar1, TRUE);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Theme_Cauldron initializes the cauldron theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_Cauldron(int t)\r\n{\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tTFit_Obj5(t);\r\n\tAddObject(OBJ_CAULDRON, themex, themey);\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_MurkyFountain initializes the murky fountain theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_MurkyFountain(int t)\r\n{\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tTFit_Obj5(t);\r\n\tAddObject(OBJ_MURKYFTN, themex, themey);\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_TearFountain initializes the tear fountain theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_TearFountain(int t)\r\n{\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tTFit_Obj5(t);\r\n\tAddObject(OBJ_TEARFTN, themex, themey);\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n}\r\n\r\n/**\r\n * Theme_BrnCross initializes the burning cross theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_BrnCross(int t)\r\n{\r\n\tint xp, yp;\r\n\tchar monstrnd[4] = { 6, 8, 3, 9 };\r\n\tchar bcrossrnd[4] = { 5, 7, 3, 8 };\r\n\r\n\tfor (yp = 0; yp < MAXDUNY; yp++) {\r\n\t\tfor (xp = 0; xp < MAXDUNX; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\t\tif (CheckThemeObj3(xp, yp, t, -1)) {\r\n\t\t\t\t\tif (random_(0, bcrossrnd[leveltype - 1]) == 0) {\r\n\t\t\t\t\t\tAddObject(OBJ_TBCROSS, xp, yp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n\tbCrossFlag = TRUE;\r\n}\r\n\r\n/**\r\n * Theme_WeaponRack initializes the weapon rack theme.\r\n *\r\n * @param t theme number (index into themes array).\r\n */\r\nvoid Theme_WeaponRack(int t)\r\n{\r\n\tint xp, yp;\r\n\tchar weaponrnd[4] = { 6, 8, 5, 8 };\r\n\tchar monstrnd[4] = { 6, 7, 3, 9 };\r\n\r\n\tif (weaponFlag) {\r\n\t\tTFit_Obj3(t);\r\n\t\tAddObject(OBJ_WEAPONRACK, themex, themey);\r\n\t}\r\n\tfor (yp = 0; yp < MAXDUNY; yp++) {\r\n\t\tfor (xp = 0; xp < MAXDUNX; xp++) {\r\n\t\t\tif (dTransVal[xp][yp] == themes[t].ttval && !nSolidTable[dPiece[xp][yp]]) {\r\n\t\t\t\tif (CheckThemeObj3(xp, yp, t, -1)) {\r\n\t\t\t\t\tif (random_(0, weaponrnd[leveltype - 1]) == 0) {\r\n\t\t\t\t\t\tAddObject(OBJ_WEAPONRACKN, xp, yp);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tPlaceThemeMonsts(t, monstrnd[leveltype - 1]);\r\n\tweaponFlag = FALSE;\r\n}\r\n\r\n/**\r\n * UpdateL4Trans sets each value of the transparency map to 1.\r\n */\r\nvoid UpdateL4Trans()\r\n{\r\n\tint i, j;\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dTransVal[i][j] != 0) {\r\n\t\t\t\tdTransVal[i][j] = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * CreateThemeRooms adds thematic elements to rooms.\r\n */\r\nvoid CreateThemeRooms()\r\n{\r\n\tint i;\r\n\r\n\tif (currlevel == 16) {\r\n\t\treturn;\r\n\t}\r\n\tInitObjFlag = TRUE;\r\n\tfor (i = 0; i < numthemes; i++) {\r\n\t\tthemex = 0;\r\n\t\tthemey = 0;\r\n\t\tswitch (themes[i].ttype) {\r\n\t\tcase THEME_BARREL:\r\n\t\t\tTheme_Barrel(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_SHRINE:\r\n\t\t\tTheme_Shrine(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_MONSTPIT:\r\n\t\t\tTheme_MonstPit(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_SKELROOM:\r\n\t\t\tTheme_SkelRoom(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_TREASURE:\r\n\t\t\tTheme_Treasure(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_LIBRARY:\r\n\t\t\tTheme_Library(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_TORTURE:\r\n\t\t\tTheme_Torture(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_BLOODFOUNTAIN:\r\n\t\t\tTheme_BloodFountain(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_DECAPITATED:\r\n\t\t\tTheme_Decap(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_PURIFYINGFOUNTAIN:\r\n\t\t\tTheme_PurifyingFountain(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_ARMORSTAND:\r\n\t\t\tTheme_ArmorStand(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_GOATSHRINE:\r\n\t\t\tTheme_GoatShrine(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_CAULDRON:\r\n\t\t\tTheme_Cauldron(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_MURKYFOUNTAIN:\r\n\t\t\tTheme_MurkyFountain(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_TEARFOUNTAIN:\r\n\t\t\tTheme_TearFountain(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_BRNCROSS:\r\n\t\t\tTheme_BrnCross(i);\r\n\t\t\tbreak;\r\n\t\tcase THEME_WEAPONRACK:\r\n\t\t\tTheme_WeaponRack(i);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tInitObjFlag = FALSE;\r\n\tif (leveltype == DTYPE_HELL && themeCount > 0) {\r\n\t\tUpdateL4Trans();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/themes.h",
    "content": "/**\r\n * @file themes.h\r\n *\r\n * Interface of the theme room placing algorithms.\r\n */\r\n#ifndef __THEMES_H__\r\n#define __THEMES_H__\r\n\r\nextern int numthemes;\r\nextern BOOL armorFlag;\r\nextern BOOL weaponFlag;\r\nextern int zharlib;\r\nextern ThemeStruct themes[MAXTHEMES];\r\n\r\nvoid InitThemes();\r\nvoid HoldThemeRooms();\r\nvoid CreateThemeRooms();\r\n\r\n#endif /* __THEMES_H__ */\r\n"
  },
  {
    "path": "Source/tmsg.cpp",
    "content": "/**\r\n * @file tmsg.cpp\r\n *\r\n * Implementation of functionality transmitting chat messages.\r\n */\r\n#include \"all.h\"\r\n\r\nstatic TMsg *sgpTimedMsgHead;\r\n\r\nint tmsg_get(BYTE *pbMsg, DWORD dwMaxLen)\r\n{\r\n\tint len;\r\n\tTMsg *head;\r\n\r\n\tif (!sgpTimedMsgHead)\r\n\t\treturn 0;\r\n\r\n\tif ((int)(sgpTimedMsgHead->hdr.dwTime - GetTickCount()) >= 0)\r\n\t\treturn 0;\r\n\thead = sgpTimedMsgHead;\r\n\tsgpTimedMsgHead = head->hdr.pNext;\r\n\tlen = head->hdr.bLen;\r\n\t// BUGFIX: ignores dwMaxLen\r\n\tmemcpy(pbMsg, head->body, len);\r\n\tmem_free_dbg(head);\r\n\treturn len;\r\n}\r\n\r\nvoid tmsg_add(BYTE *pbMsg, BYTE bLen)\r\n{\r\n\tTMsg **tail;\r\n\r\n\tTMsg *msg = (TMsg *)DiabloAllocPtr(bLen + sizeof(*msg));\r\n\tmsg->hdr.pNext = NULL;\r\n\tmsg->hdr.dwTime = GetTickCount() + 500;\r\n\tmsg->hdr.bLen = bLen;\r\n\tmemcpy(msg->body, pbMsg, bLen);\r\n\tfor (tail = &sgpTimedMsgHead; *tail; tail = &(*tail)->hdr.pNext) {\r\n\t\t;\r\n\t}\r\n\t*tail = msg;\r\n}\r\n\r\nvoid tmsg_start()\r\n{\r\n\tassert(!sgpTimedMsgHead);\r\n}\r\n\r\nvoid tmsg_cleanup()\r\n{\r\n\tTMsg *next;\r\n\r\n\twhile (sgpTimedMsgHead) {\r\n\t\tnext = sgpTimedMsgHead->hdr.pNext;\r\n\t\tMemFreeDbg(sgpTimedMsgHead);\r\n\t\tsgpTimedMsgHead = next;\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/tmsg.h",
    "content": "/**\r\n * @file tmsg.h\r\n *\r\n * Interface of functionality transmitting chat messages.\r\n */\r\n#ifndef __TMSG_H__\r\n#define __TMSG_H__\r\n\r\nint tmsg_get(BYTE *pbMsg, DWORD dwMaxLen);\r\nvoid tmsg_add(BYTE *pbMsg, BYTE bLen);\r\nvoid tmsg_start();\r\nvoid tmsg_cleanup();\r\n\r\n#endif /* __TMSG_H__ */\r\n"
  },
  {
    "path": "Source/town.cpp",
    "content": "/**\r\n * @file town.h\r\n *\r\n * Implementation of functionality for rendering the town, towners and calling other render routines.\r\n */\r\n#include \"all.h\"\r\n\r\n/**\r\n * @brief Render a black tile\r\n * @brief world_draw_black_tile but limited to upper half of screen\r\n * @param pBuff location in back buffer to render the tile, must be on upper half of screen\r\n */\r\nvoid town_clear_upper_buf(BYTE *pBuff)\r\n{\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tedi, pBuff\r\n\t\tmov\t\tedx, TILE_HEIGHT - 2\r\n\t\tmov\t\tebx, 1\r\n\t\txor\t\teax, eax\r\n\tlabel1:\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel4\r\n\t\tadd\t\tedi, edx\r\n\t\tmov\t\tecx, ebx\r\n\t\trep stosd\r\n\t\tadd\t\tedi, edx\r\n\t\tsub\t\tedi, BUFFER_WIDTH + TILE_WIDTH\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel2\r\n\t\tsub\t\tedx, 2\r\n\t\tinc\t\tebx\r\n\t\tjmp\t\tlabel1\r\n\tlabel2:\r\n\t\tmov\t\tedx, 2\r\n\t\tmov\t\tebx, TILE_HEIGHT / 2 - 1\r\n\tlabel3:\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel4\r\n\t\tadd\t\tedi, edx\r\n\t\tmov\t\tecx, ebx\r\n\t\trep stosd\r\n\t\tadd\t\tedi, edx\r\n\t\tsub\t\tedi, BUFFER_WIDTH + TILE_WIDTH\r\n\t\tdec\t\tebx\r\n\t\tadd\t\tedx, 2\r\n\t\tcmp\t\tedx, TILE_HEIGHT\r\n\t\tjnz\t\tlabel3\r\n\tlabel4:\r\n\t\tnop\r\n\t}\r\n#else\r\n\tint i, j, k;\r\n\tBYTE *dst;\r\n\r\n\tdst = pBuff;\r\n\r\n\tfor (i = TILE_HEIGHT - 2, j = 1; i >= 0 && dst >= gpBufEnd; i -= 2, j++, dst -= BUFFER_WIDTH + TILE_WIDTH) {\r\n\t\tdst += i;\r\n\t\tfor (k = 0; k < 4 * j; k++)\r\n\t\t\t*dst++ = 0;\r\n\t\tdst += i;\r\n\t}\r\n\tfor (i = 2, j = TILE_HEIGHT / 2 - 1; i != TILE_HEIGHT && dst >= gpBufEnd; i += 2, j--, dst -= BUFFER_WIDTH + TILE_WIDTH) {\r\n\t\tdst += i;\r\n\t\tfor (k = 0; k < 4 * j; k++)\r\n\t\t\t*dst++ = 0;\r\n\t\tdst += i;\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Render a black tile\r\n * @brief world_draw_black_tile but limited to lower half of screen\r\n * @param pBuff location in back buffer to render the tile, must be on lower half of screen\r\n */\r\nvoid town_clear_low_buf(BYTE *pBuff)\r\n{\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tedi, pBuff\r\n\t\tmov\t\tedx, TILE_HEIGHT - 2\r\n\t\tmov\t\tebx, 1\r\n\t\txor\t\teax, eax\r\n\tlabel1:\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel2\r\n\t\tadd\t\tedi, TILE_WIDTH\r\n\t\tjmp\t\tlabel3\r\n\tlabel2:\r\n\t\tadd\t\tedi, edx\r\n\t\tmov\t\tecx, ebx\r\n\t\trep stosd\r\n\t\tadd\t\tedi, edx\r\n\tlabel3:\r\n\t\tsub\t\tedi, BUFFER_WIDTH + TILE_WIDTH\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel4\r\n\t\tsub\t\tedx, 2\r\n\t\tinc\t\tebx\r\n\t\tjmp\t\tlabel1\r\n\tlabel4:\r\n\t\tmov\t\tedx, 2\r\n\t\tmov\t\tebx, TILE_HEIGHT / 2 - 1\r\n\tlabel5:\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel6\r\n\t\tadd\t\tedi, TILE_WIDTH\r\n\t\tjmp\t\tlabel7\r\n\tlabel6:\r\n\t\tadd\t\tedi, edx\r\n\t\tmov\t\tecx, ebx\r\n\t\trep stosd\r\n\t\tadd\t\tedi, edx\r\n\tlabel7:\r\n\t\tsub\t\tedi, BUFFER_WIDTH + TILE_WIDTH\r\n\t\tdec\t\tebx\r\n\t\tadd\t\tedx, 2\r\n\t\tcmp\t\tedx, TILE_HEIGHT\r\n\t\tjnz\t\tlabel5\r\n\t}\r\n#else\r\n\tint i, j, k;\r\n\tBYTE *dst;\r\n\r\n\tdst = pBuff;\r\n\r\n\tfor (i = TILE_HEIGHT - 2, j = 1; i >= 0; i -= 2, j++, dst -= BUFFER_WIDTH + TILE_WIDTH) {\r\n\t\tif (dst < gpBufEnd) {\r\n\t\t\tdst += i;\r\n\t\t\tfor (k = 0; k < 4 * j; k++)\r\n\t\t\t\t*dst++ = 0;\r\n\t\t\tdst += i;\r\n\t\t} else {\r\n\t\t\tdst += TILE_WIDTH;\r\n\t\t}\r\n\t}\r\n\tfor (i = 2, j = TILE_HEIGHT / 2 - 1; i != TILE_HEIGHT; i += 2, j--, dst -= BUFFER_WIDTH + TILE_WIDTH) {\r\n\t\tif (dst < gpBufEnd) {\r\n\t\t\tdst += i;\r\n\t\t\tfor (k = 0; k < 4 * j; k++)\r\n\t\t\t\t*dst++ = 0;\r\n\t\t\tdst += i;\r\n\t\t} else {\r\n\t\t\tdst += TILE_WIDTH;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Render trees on top of player, buggy disabled in 1.09\r\n * @param pBuff backbuffer pointing where to render on lower part of screen\r\n * @param nCel Frame number for pSpecialCels tile to draw\r\n */\r\nvoid town_special_lower(BYTE *pBuff, int nCel)\r\n{\r\n#if 0\r\n\tint w;\r\n\tBYTE *end;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pSpecialCels\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\teax, [ebx+4]\r\n\t\tsub\t\teax, [ebx]\r\n\t\tmov\t\tend, eax\r\n\t\tmov\t\tesi, pSpecialCels\r\n\t\tadd\t\tesi, [ebx]\r\n\t\tmov\t\tedi, pBuff\r\n\t\tmov\t\teax, BUFFER_WIDTH + 64\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, end\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, 64\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel7\r\n\t\tsub\t\tedx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel3\r\n\t\tadd\t\tesi, eax\r\n\t\tadd\t\tedi, eax\r\n\t\tjmp\t\tlabel6\r\n\tlabel3:\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tmovsb\r\n\t\tjecxz\tlabel6\r\n\tlabel4:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel5\r\n\t\tmovsw\r\n\t\tjecxz\tlabel6\r\n\tlabel5:\r\n\t\trep movsd\r\n\tlabel6:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel8\r\n\t\tjmp\t\tlabel2\r\n\tlabel7:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel8:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)pSpecialCels;\r\n\tsrc = &pSpecialCels[pFrameTable[nCel]];\r\n\tdst = pBuff;\r\n\tend = &src[pFrameTable[nCel + 1] - pFrameTable[nCel]];\r\n\r\n\tfor(; src != end; dst -= BUFFER_WIDTH + 64) {\r\n\t\tfor(w = 64; w;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif(!(width & 0x80)) {\r\n\t\t\t\tw -= width;\r\n\t\t\t\tif(dst < gpBufEnd) {\r\n\t\t\t\t\tif(width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tsrc++;\r\n\t\t\t\t\t\tdst++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tif(width & 1) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\t\tdst += 2;\r\n\t\t\t\t\t}\r\n\t\t\t\t\twidth >>= 1;\r\n\t\t\t\t\tfor(; width; width--) {\r\n\t\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\t\tdst += 4;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsrc += width;\r\n\t\t\t\t\tdst += width;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n#endif\r\n}\r\n\r\n/**\r\n * @brief Render trees on top of player, buggy disabled in 1.09\r\n * @param pBuff backbuffer pointing where to render on upper part of screen\r\n * @param nCel Frame number for pSpecialCels tile to draw\r\n */\r\nvoid town_special_upper(BYTE *pBuff, int nCel)\r\n{\r\n#if 0\r\n\tint w;\r\n\tBYTE *end;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tebx, pSpecialCels\r\n\t\tmov\t\teax, nCel\r\n\t\tshl\t\teax, 2\r\n\t\tadd\t\tebx, eax\r\n\t\tmov\t\teax, [ebx+4]\r\n\t\tsub\t\teax, [ebx]\r\n\t\tmov\t\tend, eax\r\n\t\tmov\t\tesi, pSpecialCels\r\n\t\tadd\t\tesi, [ebx]\r\n\t\tmov\t\tedi, pBuff\r\n\t\tmov\t\teax, BUFFER_WIDTH + 64\r\n\t\tmov\t\tw, eax\r\n\t\tmov\t\tebx, end\r\n\t\tadd\t\tebx, esi\r\n\tlabel1:\r\n\t\tmov\t\tedx, 64\r\n\tlabel2:\r\n\t\txor\t\teax, eax\r\n\t\tlodsb\r\n\t\tor\t\tal, al\r\n\t\tjs\t\tlabel6\r\n\t\tsub\t\tedx, eax\r\n\t\tcmp\t\tedi, gpBufEnd\r\n\t\tjb\t\tlabel8\r\n\t\tmov\t\tecx, eax\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel3\r\n\t\tmovsb\r\n\t\tjecxz\tlabel5\r\n\tlabel3:\r\n\t\tshr\t\tecx, 1\r\n\t\tjnb\t\tlabel4\r\n\t\tmovsw\r\n\t\tjecxz\tlabel5\r\n\tlabel4:\r\n\t\trep movsd\r\n\tlabel5:\r\n\t\tor\t\tedx, edx\r\n\t\tjz\t\tlabel7\r\n\t\tjmp\t\tlabel2\r\n\tlabel6:\r\n\t\tneg\t\tal\r\n\t\tadd\t\tedi, eax\r\n\t\tsub\t\tedx, eax\r\n\t\tjnz\t\tlabel2\r\n\tlabel7:\r\n\t\tsub\t\tedi, w\r\n\t\tcmp\t\tebx, esi\r\n\t\tjnz\t\tlabel1\r\n\tlabel8:\r\n\t\tnop\r\n\t}\r\n#else\r\n\tBYTE width;\r\n\tBYTE *src, *dst;\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)pSpecialCels;\r\n\tsrc = &pSpecialCels[pFrameTable[nCel]];\r\n\tdst = pBuff;\r\n\tend = &src[pFrameTable[nCel + 1] - pFrameTable[nCel]];\r\n\r\n\tfor(; src != end; dst -= BUFFER_WIDTH + 64) {\r\n\t\tfor(w = 64; w;) {\r\n\t\t\twidth = *src++;\r\n\t\t\tif(!(width & 0x80)) {\r\n\t\t\t\tw -= width;\r\n\t\t\t\tif(dst < gpBufEnd) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif(width & 1) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tsrc++;\r\n\t\t\t\t\tdst++;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tif(width & 1) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tsrc += 2;\r\n\t\t\t\t\tdst += 2;\r\n\t\t\t\t}\r\n\t\t\t\twidth >>= 1;\r\n\t\t\t\tfor(; width; width--) {\r\n\t\t\t\t\tdst[0] = src[0];\r\n\t\t\t\t\tdst[1] = src[1];\r\n\t\t\t\t\tdst[2] = src[2];\r\n\t\t\t\t\tdst[3] = src[3];\r\n\t\t\t\t\tsrc += 4;\r\n\t\t\t\t\tdst += 4;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twidth = -(char)width;\r\n\t\t\t\tdst += width;\r\n\t\t\t\tw -= width;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n#endif\r\n}\r\n\r\n/**\r\n * This variant checks for of screen element on the lower screen\r\n * This function it self causes rendering issues since it will render on top of objects on the other side of walls\r\n * @brief Re render tile to workaround sorting issues with players walking east/west\r\n * @param pBuff Pointer to output buffer at location sx,sy\r\n * @param y dPiece coordinate\r\n * @param x dPiece coordinate\r\n * @param sx Backbuffer coordinate\r\n * @param sy Backbuffer coordinate\r\n */\r\nvoid town_draw_clipped_e_flag(BYTE *pBuff, int x, int y, int sx, int sy)\r\n{\r\n\tint i;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\tdst = pBuff;\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tfor (i = 0; i < 12; i += 2) {\r\n\t\tlevel_cel_block = pMap->mt[i];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst);\r\n\t\t}\r\n\t\tlevel_cel_block = pMap->mt[i + 1];\r\n\t\tif (level_cel_block != 0) {\r\n\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t}\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t}\r\n\r\n\ttown_draw_clipped_town(pBuff, x, y, sx, sy, 0);\r\n}\r\n\r\n/**\r\n * @brief Render object sprites\r\n * @param pBuff where to render to with sx,sy already applied\r\n * @param sx dPiece coordinate\r\n * @param sy dPiece coordinate\r\n * @param dx Backbuffer coordinate\r\n * @param dy Backbuffer coordinate\r\n * @param eflag Should the sorting workaround be applied\r\n */\r\nvoid town_draw_clipped_town(BYTE *pBuff, int sx, int sy, int dx, int dy, int eflag)\r\n{\r\n\tint mi, px, py;\r\n\tchar bv;\r\n\r\n\tassert(gpBuffer);\r\n\r\n\tpBuff = &gpBuffer[dx + PitchTbl[dy]];\r\n\r\n\tif (dItem[sx][sy] != 0) {\r\n\t\tbv = dItem[sx][sy] - 1;\r\n\t\tpx = dx - item[bv]._iAnimWidth2;\r\n\t\tif (bv == pcursitem) {\r\n\t\t\tCelBlitOutlineSafe(181, px, dy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8);\r\n\t\t}\r\n\t\tCelClippedDrawSafe(px, dy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, 8);\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_MONSTLR) {\r\n\t\tmi = -(dMonster[sx][sy - 1] + 1);\r\n\t\tpx = dx - towner[mi]._tAnimWidth2;\r\n\t\tif (mi == pcursmonst) {\r\n\t\t\tCelBlitOutlineSafe(166, px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8);\r\n\t\t}\r\n\t\tCelClippedDrawSafe(px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8);\r\n\t}\r\n\tif (dMonster[sx][sy] > 0) {\r\n\t\tmi = dMonster[sx][sy] - 1;\r\n\t\tpx = dx - towner[mi]._tAnimWidth2;\r\n\t\tif (mi == pcursmonst) {\r\n\t\t\tCelBlitOutlineSafe(166, px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8);\r\n\t\t}\r\n\t\tCelClippedDrawSafe(px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, 8);\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_PLAYERLR) {\r\n\t\tbv = -(dPlayer[sx][sy - 1] + 1);\r\n\t\tpx = dx + plr[bv]._pxoff - plr[bv]._pAnimWidth2;\r\n\t\tpy = dy + plr[bv]._pyoff;\r\n\t\tif (bv == pcursplr) {\r\n\t\t\tCl2DrawOutlineSafe(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);\r\n\t\t}\r\n\t\tCl2DrawSafe(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);\r\n\t\tif (eflag && plr[bv]._peflag) {\r\n\t\t\ttown_draw_clipped_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, dx - TILE_WIDTH, dy);\r\n\t\t}\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_DEAD_PLAYER) {\r\n\t\tDrawDeadPlayer(sx, sy, dx, dy, 0, 8, TRUE);\r\n\t}\r\n\tif (dPlayer[sx][sy] > 0) {\r\n\t\tbv = dPlayer[sx][sy] - 1;\r\n\t\tpx = dx + plr[bv]._pxoff - plr[bv]._pAnimWidth2;\r\n\t\tpy = dy + plr[bv]._pyoff;\r\n\t\tif (bv == pcursplr) {\r\n\t\t\tCl2DrawOutlineSafe(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);\r\n\t\t}\r\n\t\tCl2DrawSafe(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, 8);\r\n\t\tif (eflag && plr[bv]._peflag) {\r\n\t\t\ttown_draw_clipped_e_flag(pBuff - TILE_WIDTH, sx - 1, sy + 1, dx - TILE_WIDTH, dy);\r\n\t\t}\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_MISSILE) {\r\n\t\tDrawClippedMissile(sx, sy, dx, dy, 0, 8, 0);\r\n\t}\r\n\tif (dSpecial[sx][sy] != 0) {\r\n\t\ttown_special_lower(pBuff, dSpecial[sx][sy]);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a row of tile\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Backbuffer coordinate\r\n * @param sy Backbuffer coordinate\r\n * @param chunks tile width of row\r\n * @param eflag is it an even (0) or odd (1) row\r\n */\r\nvoid town_draw_lower(int x, int y, int sx, int sy, int chunks, int eflag)\r\n{\r\n\tint i, j;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + TILE_WIDTH / 2 + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 1; i < 17; i += 2) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[i];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\ttown_draw_clipped_town(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 0);\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t}\r\n\r\n\tfor (j = 0; j < chunks - eflag; j++) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 16; i += 2) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[i];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[i + 1];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\ttown_draw_clipped_town(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 1);\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t}\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 16; i += 2) {\r\n\t\t\t\t\tlevel_cel_block = pMap->mt[i];\r\n\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\ttown_draw_clipped_town(&gpBuffer[sx + PitchTbl[sy]], x, y, sx, sy, 0);\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * This variant checks for of screen element on the lower screen\r\n * This function it self causes rendering issues since it will render on top of objects on the other side of walls\r\n * @brief Re render tile to workaround sorting issues with players walking east/west\r\n * @param pBuff Pointer to output buffer at location sx,sy\r\n * @param y dPiece coordinate\r\n * @param x dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelSkip chunks of cell to skip\r\n * @param sx Backbuffer coordinate\r\n * @param sy Backbuffer coordinate\r\n */\r\nvoid town_draw_clipped_e_flag_2(BYTE *pBuff, int x, int y, int row, int CelSkip, int sx, int sy)\r\n{\r\n\tint i;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\tif (row == 0) {\r\n\t\tdst = pBuff;\r\n\t} else {\r\n\t\tdst = &pBuff[BUFFER_WIDTH * TILE_HEIGHT * row];\r\n\t}\r\n\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tfor (i = 0; i < 6; i++) {\r\n\t\tif (row <= i) {\r\n\t\t\tlevel_cel_block = pMap->mt[2 * i + 2];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t}\r\n\t\t\tlevel_cel_block = pMap->mt[2 * i + 3];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t}\r\n\t\t}\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t}\r\n\r\n\tif (CelSkip < 8) {\r\n\t\ttown_draw_clipped_town_2(pBuff, x, y, row, CelSkip, sx, sy, 0);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render object sprites, skip offscreen parts for lower screen\r\n * @param pBuff where to render to with sx,sy already applied\r\n * @param sx dPiece coordinate\r\n * @param sy dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelSkip chunks of cell to skip\r\n * @param dx Backbuffer coordinate\r\n * @param dy Backbuffer coordinate\r\n * @param eflag Should the sorting workaround be applied\r\n */\r\nvoid town_draw_clipped_town_2(BYTE *pBuff, int sx, int sy, int row, int CelSkip, int dx, int dy, int eflag)\r\n{\r\n\tint mi, px, py;\r\n\tchar bv;\r\n\r\n\tif (dItem[sx][sy] != 0) {\r\n\t\tbv = dItem[sx][sy] - 1;\r\n\t\tpx = dx - item[bv]._iAnimWidth2;\r\n\t\tif (bv == pcursitem) {\r\n\t\t\tCelBlitOutlineSafe(181, px, dy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, CelSkip, 8);\r\n\t\t}\r\n\t\tCelClippedDrawSafe(px, dy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, CelSkip, 8);\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_MONSTLR) {\r\n\t\tmi = -(dMonster[sx][sy - 1] + 1);\r\n\t\tpx = dx - towner[mi]._tAnimWidth2;\r\n\t\tif (mi == pcursmonst) {\r\n\t\t\tCelBlitOutlineSafe(166, px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, CelSkip, 8);\r\n\t\t}\r\n\t\tCelClippedDrawSafe(px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, CelSkip, 8);\r\n\t}\r\n\tif (dMonster[sx][sy] > 0) {\r\n\t\tmi = dMonster[sx][sy] - 1;\r\n\t\tpx = dx - towner[mi]._tAnimWidth2;\r\n\t\tif (mi == pcursmonst) {\r\n\t\t\tCelBlitOutlineSafe(166, px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, CelSkip, 8);\r\n\t\t}\r\n\t\tCelClippedDrawSafe(px, dy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, CelSkip, 8);\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_PLAYERLR) {\r\n\t\tbv = -(dPlayer[sx][sy - 1] + 1);\r\n\t\tpx = dx + plr[bv]._pxoff - plr[bv]._pAnimWidth2;\r\n\t\tpy = dy + plr[bv]._pyoff;\r\n\t\tif (bv == pcursplr) {\r\n\t\t\tCl2DrawOutlineSafe(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, CelSkip, 8);\r\n\t\t}\r\n\t\tCl2DrawSafe(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, CelSkip, 8);\r\n\t\tif (eflag && plr[bv]._peflag) {\r\n\t\t\ttown_draw_clipped_e_flag_2(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelSkip, dx - TILE_WIDTH, dy);\r\n\t\t}\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_DEAD_PLAYER) {\r\n\t\tDrawDeadPlayer(sx, sy, dx, dy, CelSkip, 8, TRUE);\r\n\t}\r\n\tif (dPlayer[sx][sy] > 0) {\r\n\t\tbv = dPlayer[sx][sy] - 1;\r\n\t\tpx = dx + plr[bv]._pxoff - plr[bv]._pAnimWidth2;\r\n\t\tpy = dy + plr[bv]._pyoff;\r\n\t\tif (bv == pcursplr) {\r\n\t\t\tCl2DrawOutlineSafe(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, CelSkip, 8);\r\n\t\t}\r\n\t\tCl2DrawSafe(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, CelSkip, 8);\r\n\t\tif (eflag && plr[bv]._peflag) {\r\n\t\t\ttown_draw_clipped_e_flag_2(pBuff - TILE_WIDTH, sx - 1, sy + 1, row, CelSkip, dx - TILE_WIDTH, dy);\r\n\t\t}\r\n\t}\r\n\tif (dFlags[sx][sy] & BFLAG_MISSILE) {\r\n\t\tDrawClippedMissile(sx, sy, dx, dy, CelSkip, 8, 0);\r\n\t}\r\n\tif (dSpecial[sx][sy] != 0) {\r\n\t\ttown_special_lower(&pBuff[PitchTbl[16 * CelSkip]], dSpecial[sx][sy]);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a row of tile, checking for overdrawing on lower part of screen\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Backbuffer coordinate\r\n * @param sy Backbuffer coordinate\r\n * @param chunks tile width of row\r\n * @param row current row being rendered\r\n * @param eflag is it an even (0) or odd (1) row\r\n */\r\nvoid town_draw_lower_2(int x, int y, int sx, int sy, int chunks, int row, int eflag)\r\n{\r\n\tint i, j, CelSkip;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n\tCelSkip = 2 * row + 2;\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + TILE_WIDTH / 2 - BUFFER_WIDTH * TILE_HEIGHT + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 7; i++) {\r\n\t\t\t\t\tif (row <= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 3];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\tif (CelSkip < 8) {\r\n\t\t\t\t\ttown_draw_clipped_town_2(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelSkip, sx, sy, 0);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t}\r\n\r\n\tfor (j = 0; j < chunks - eflag; j++) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx - BUFFER_WIDTH * TILE_HEIGHT + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 7; i++) {\r\n\t\t\t\t\tif (row <= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 2];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 3];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\tif (CelSkip < 8) {\r\n\t\t\t\t\ttown_draw_clipped_town_2(&gpBuffer[sx + PitchTbl[sy] - BUFFER_WIDTH * 16 * CelSkip], x, y, row, CelSkip, sx, sy, 1);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t}\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx - BUFFER_WIDTH * TILE_HEIGHT + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 7; i++) {\r\n\t\t\t\t\tif (row <= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 2];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawLowerScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\tif (CelSkip < 8) {\r\n\t\t\t\t\ttown_draw_clipped_town_2(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelSkip, sx, sy, 0);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_low_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * This variant checks for of screen element on the upper screen\r\n * This function it self causes rendering issues since it will render on top of objects on the other side of walls\r\n * @brief Re render tile to workaround sorting issues with players walking east/west\r\n * @param pBuff Pointer to output buffer at location sx,sy\r\n * @param y dPiece coordinate\r\n * @param x dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelCap chunks of cell to skip\r\n * @param sx Backbuffer coordinate\r\n * @param sy Backbuffer coordinate\r\n */\r\nvoid town_draw_e_flag(BYTE *pBuff, int x, int y, int row, int CelCap, int sx, int sy)\r\n{\r\n\tint i;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\tdst = pBuff;\r\n\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\r\n\tfor (i = 0; i < 7; i++) {\r\n\t\tif (row >= i) {\r\n\t\t\tlevel_cel_block = pMap->mt[2 * i];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t}\r\n\t\t\tlevel_cel_block = pMap->mt[2 * i + 1];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdrawUpperScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t}\r\n\t\t}\r\n\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t}\r\n\r\n\ttown_draw_town_all(pBuff, x, y, row, CelCap, sx, sy, 0);\r\n}\r\n\r\n/**\r\n * @brief Render object sprites, skip offscreen parts for upper screen\r\n * @param pBuff where to render to with sx,sx already applied\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param row The current row being rendered\r\n * @param CelCap chunks of cell to skip\r\n * @param sx Backbuffer coordinate\r\n * @param sy Backbuffer coordinate\r\n * @param eflag Should the sorting workaround be applied\r\n */\r\nvoid town_draw_town_all(BYTE *pBuff, int x, int y, int row, int CelCap, int sx, int sy, int eflag)\r\n{\r\n\tint mi, px, py;\r\n\tchar bv;\r\n\r\n\tif (dItem[x][y] != 0) {\r\n\t\tbv = dItem[x][y] - 1;\r\n\t\tpx = sx - item[bv]._iAnimWidth2;\r\n\t\tif (bv == pcursitem) {\r\n\t\t\tCelBlitOutline(181, px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, CelCap);\r\n\t\t}\r\n\t\t/// ASSERT: assert(item[bv]._iAnimData);\r\n\t\tCelClippedDraw(px, sy, item[bv]._iAnimData, item[bv]._iAnimFrame, item[bv]._iAnimWidth, 0, CelCap);\r\n\t}\r\n\tif (dFlags[x][y] & BFLAG_MONSTLR) {\r\n\t\tmi = -(dMonster[x][y - 1] + 1);\r\n\t\tpx = sx - towner[mi]._tAnimWidth2;\r\n\t\tif (mi == pcursmonst) {\r\n\t\t\tCelBlitOutline(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, CelCap);\r\n\t\t}\r\n\t\t/// ASSERT: assert(towner[mi]._tAnimData);\r\n\t\tCelClippedDraw(px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, CelCap);\r\n\t}\r\n\tif (dMonster[x][y] > 0) {\r\n\t\tmi = dMonster[x][y] - 1;\r\n\t\tpx = sx - towner[mi]._tAnimWidth2;\r\n\t\tif (mi == pcursmonst) {\r\n\t\t\tCelBlitOutline(166, px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, CelCap);\r\n\t\t}\r\n\t\t/// ASSERT: assert(towner[mi]._tAnimData);\r\n\t\tCelClippedDraw(px, sy, towner[mi]._tAnimData, towner[mi]._tAnimFrame, towner[mi]._tAnimWidth, 0, CelCap);\r\n\t}\r\n\tif (dFlags[x][y] & BFLAG_PLAYERLR) {\r\n\t\tbv = -(dPlayer[x][y - 1] + 1);\r\n\t\tpx = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2;\r\n\t\tpy = sy + plr[bv]._pyoff;\r\n\t\tif (bv == pcursplr) {\r\n\t\t\tCl2DrawOutline(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, CelCap);\r\n\t\t}\r\n\t\t/// ASSERT: assert(plr[bv]._pAnimData);\r\n\t\tCl2Draw(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, CelCap);\r\n\t\tif (eflag && plr[bv]._peflag) {\r\n\t\t\ttown_draw_e_flag(pBuff - TILE_WIDTH, x - 1, y + 1, row, CelCap, sx - TILE_WIDTH, sy);\r\n\t\t}\r\n\t}\r\n\tif (dFlags[x][y] & BFLAG_DEAD_PLAYER) {\r\n\t\tDrawDeadPlayer(x, y, sx, sy, 0, CelCap, FALSE);\r\n\t}\r\n\tif (dPlayer[x][y] > 0) {\r\n\t\tbv = dPlayer[x][y] - 1;\r\n\t\tpx = sx + plr[bv]._pxoff - plr[bv]._pAnimWidth2;\r\n\t\tpy = sy + plr[bv]._pyoff;\r\n\t\tif (bv == pcursplr) {\r\n\t\t\tCl2DrawOutline(165, px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, CelCap);\r\n\t\t}\r\n\t\t/// ASSERT: assert(plr[bv]._pAnimData);\r\n\t\tCl2Draw(px, py, plr[bv]._pAnimData, plr[bv]._pAnimFrame, plr[bv]._pAnimWidth, 0, CelCap);\r\n\t\tif (eflag && plr[bv]._peflag) {\r\n\t\t\ttown_draw_e_flag(pBuff - TILE_WIDTH, x - 1, y + 1, row, CelCap, sx - TILE_WIDTH, sy);\r\n\t\t}\r\n\t}\r\n\tif (dFlags[x][y] & BFLAG_MISSILE) {\r\n\t\tDrawMissile(x, y, sx, sy, 0, CelCap, FALSE);\r\n\t}\r\n\tif (dSpecial[x][y] != 0) {\r\n\t\ttown_special_upper(pBuff, dSpecial[x][y]);\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Render a row of tile, checking for overdrawing on upper part of screen\r\n * @param x dPiece coordinate\r\n * @param y dPiece coordinate\r\n * @param sx Backbuffer coordinate\r\n * @param sy Backbuffer coordinate\r\n * @param chunks tile width of row\r\n * @param row current row being rendered\r\n * @param eflag is it an even (0) or odd (1) row\r\n */\r\nvoid town_draw_upper(int x, int y, int sx, int sy, int chunks, int row, int eflag)\r\n{\r\n\tint i, j, CelCap;\r\n\tBYTE *dst;\r\n\tMICROS *pMap;\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\r\n\tCelCap = 2 * row + 2;\r\n\tif (CelCap > 8) {\r\n\t\tCelCap = 8;\r\n\t}\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + TILE_WIDTH / 2 + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 7; i++) {\r\n\t\t\t\t\tif (row >= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 1];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\ttown_draw_town_all(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelCap, sx, sy, 0);\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_upper_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_upper_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t}\r\n\r\n\tfor (j = 0; j < chunks - eflag; j++) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 7; i++) {\r\n\t\t\t\t\tif (row >= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i + 1];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawUpperScreen(dst + TILE_WIDTH / 2);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\ttown_draw_town_all(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelCap, sx, sy, 1);\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_upper_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_upper_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t\tx++;\r\n\t\ty--;\r\n\t\tsx += TILE_WIDTH;\r\n\t}\r\n\r\n\tif (eflag) {\r\n\t\tif (y >= 0 && y < MAXDUNY && x >= 0 && x < MAXDUNX) {\r\n\t\t\tlevel_cel_block = dPiece[x][y];\r\n\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\tdst = &gpBuffer[sx + PitchTbl[sy]];\r\n\t\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\t\tfor (i = 0; i < 7; i++) {\r\n\t\t\t\t\tif (row >= i) {\r\n\t\t\t\t\t\tlevel_cel_block = pMap->mt[2 * i];\r\n\t\t\t\t\t\tif (level_cel_block != 0) {\r\n\t\t\t\t\t\t\tdrawUpperScreen(dst);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdst -= BUFFER_WIDTH * TILE_HEIGHT;\r\n\t\t\t\t}\r\n\t\t\t\ttown_draw_town_all(&gpBuffer[sx + PitchTbl[sy]], x, y, row, CelCap, sx, sy, 0);\r\n\t\t\t} else {\r\n\t\t\t\ttown_clear_upper_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\ttown_clear_upper_buf(&gpBuffer[sx + PitchTbl[sy]]);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Configure render and process screen rows\r\n * @param x Center of view in dPiece coordinate\r\n * @param y Center of view in dPiece coordinate\r\n */\r\nvoid T_DrawGame(int x, int y)\r\n{\r\n\tint i, sx, sy, chunks, blocks;\r\n\r\n\tViewDX = SCREEN_WIDTH;\r\n\tViewDY = VIEWPORT_HEIGHT;\r\n\tViewBX = SCREEN_WIDTH / TILE_WIDTH;\r\n\tViewBY = VIEWPORT_HEIGHT / TILE_HEIGHT;\r\n\r\n\tsx = ScrollInfo._sxoff + TILE_WIDTH;\r\n\tsy = ScrollInfo._syoff + SCREEN_Y + (TILE_HEIGHT / 2 - 1);\r\n\tx -= SCREEN_WIDTH / TILE_WIDTH;\r\n\ty--;\r\n\tchunks = SCREEN_WIDTH / TILE_WIDTH;\r\n\tblocks = 5;\r\n\r\n\tif (chrflag || questlog) {\r\n\t\tx += 2;\r\n\t\ty -= 2;\r\n\t\tsx += (SCREEN_WIDTH / 2) - TILE_WIDTH / 2;\r\n\t\tchunks = 6;\r\n\t}\r\n\tif (invflag || sbookflag) {\r\n\t\tx += 2;\r\n\t\ty -= 2;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tchunks = 6;\r\n\t}\r\n\r\n\tswitch (ScrollInfo._sdir) {\r\n\tcase SDIR_NONE:\r\n\t\tbreak;\r\n\tcase SDIR_N:\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx--;\r\n\t\ty--;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_NE:\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx--;\r\n\t\ty--;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_E:\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_SE:\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_S:\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_SW:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tx--;\r\n\t\ty++;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_W:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tx--;\r\n\t\ty++;\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_NW:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx -= 2;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\t}\r\n\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[SCREEN_Y]];\r\n\tfor (i = 0; i < 7; i++) {\r\n\t\ttown_draw_upper(x, y, sx, sy, chunks, i, 0);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\ttown_draw_upper(x, y, sx, sy, chunks, i, 1);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\t/// ASSERT: assert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[VIEWPORT_HEIGHT + SCREEN_Y]];\r\n\tfor (i = 0; i < blocks; i++) {\r\n\t\ttown_draw_lower(x, y, sx, sy, chunks, 0);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\ttown_draw_lower(x, y, sx, sy, chunks, 1);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\tfor (i = 0; i < 7; i++) {\r\n\t\ttown_draw_lower_2(x, y, sx, sy, chunks, i, 0);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\ttown_draw_lower_2(x, y, sx, sy, chunks, i, 1);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Configure render for zoomed view and process screen rows\r\n * @param x Center of view in dPiece coordinate\r\n * @param y Center of view in dPiece coordinate\r\n */\r\nvoid T_DrawZoom(int x, int y)\r\n{\r\n\tint i, sx, sy, chunks, blocks;\r\n\tint wdt, nSrcOff, nDstOff;\r\n\r\n\tViewDX = ZOOM_WIDTH;\r\n\tViewDY = ZOOM_HEIGHT - TILE_HEIGHT;\r\n\tViewBX = ZOOM_WIDTH / TILE_WIDTH;\r\n\tViewBY = (ZOOM_HEIGHT - TILE_HEIGHT) / TILE_HEIGHT;\r\n\r\n\tsx = ScrollInfo._sxoff + SCREEN_X;\r\n\tsy = ScrollInfo._syoff + SCREEN_Y - (TILE_HEIGHT / 2 + 1);\r\n\tx -= ZOOM_WIDTH / TILE_WIDTH;\r\n\ty--;\r\n\tchunks = ZOOM_WIDTH / TILE_WIDTH;\r\n\tblocks = 0;\r\n\r\n\tswitch (ScrollInfo._sdir) {\r\n\tcase SDIR_NONE:\r\n\t\tbreak;\r\n\tcase SDIR_N:\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx--;\r\n\t\ty--;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_NE:\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx--;\r\n\t\ty--;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_E:\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_SE:\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_S:\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_SW:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tx--;\r\n\t\ty++;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\tcase SDIR_W:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tx--;\r\n\t\ty++;\r\n\t\tchunks++;\r\n\t\tbreak;\r\n\tcase SDIR_NW:\r\n\t\tsx -= TILE_WIDTH;\r\n\t\tsy -= TILE_HEIGHT;\r\n\t\tx -= 2;\r\n\t\tchunks++;\r\n\t\tblocks++;\r\n\t\tbreak;\r\n\t}\r\n\r\n\tassert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[-17 + SCREEN_Y]];\r\n\tfor (i = 0; i < 7; i++) {\r\n\t\ttown_draw_upper(x, y, sx, sy, chunks, i, 0);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\ttown_draw_upper(x, y, sx, sy, chunks, i, 1);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\tassert(gpBuffer);\r\n\tgpBufEnd = &gpBuffer[PitchTbl[160 + SCREEN_Y]];\r\n\tfor (i = 0; i < blocks; i++) {\r\n\t\ttown_draw_lower(x, y, sx, sy, chunks, 0);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\ttown_draw_lower(x, y, sx, sy, chunks, 1);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\tfor (i = 0; i < 7; i++) {\r\n\t\ttown_draw_lower_2(x, y, sx, sy, chunks, i, 0);\r\n\t\ty++;\r\n\t\tsx -= TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t\ttown_draw_lower_2(x, y, sx, sy, chunks, i, 1);\r\n\t\tx++;\r\n\t\tsx += TILE_WIDTH / 2;\r\n\t\tsy += TILE_HEIGHT / 2;\r\n\t}\r\n\r\n\tif (chrflag || questlog) {\r\n\t\tnSrcOff = SCREENXY(TILE_WIDTH / 2 + SPANEL_WIDTH / 4, VIEWPORT_HEIGHT / 2 - (TILE_HEIGHT / 2 + 1));\r\n\t\tnDstOff = SCREENXY(SPANEL_WIDTH, VIEWPORT_HEIGHT - 2);\r\n\t\twdt = (SCREEN_WIDTH - SPANEL_WIDTH) / 2;\r\n\t} else if (invflag || sbookflag) {\r\n\t\tnSrcOff = SCREENXY(TILE_WIDTH / 2 + SPANEL_WIDTH / 4, VIEWPORT_HEIGHT / 2 - (TILE_HEIGHT / 2 + 1));\r\n\t\tnDstOff = SCREENXY(0, VIEWPORT_HEIGHT - 2);\r\n\t\twdt = (SCREEN_WIDTH - SPANEL_WIDTH) / 2;\r\n\t} else {\r\n\t\tnSrcOff = SCREENXY(TILE_WIDTH / 2, VIEWPORT_HEIGHT / 2 - (TILE_HEIGHT / 2 + 1));\r\n\t\tnDstOff = SCREENXY(0, VIEWPORT_HEIGHT - 2);\r\n\t\twdt = SCREEN_WIDTH / 2;\r\n\t}\r\n\r\n\tassert(gpBuffer);\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\tesi, gpBuffer\r\n\t\tmov\t\tedx, nDstOff\r\n\t\tmov\t\tedi, esi\r\n\t\tmov\t\tecx, nSrcOff\r\n\t\tadd\t\tedi, edx\r\n\t\tadd\t\tesi, ecx\r\n\t\tmov\t\tebx, edi\r\n\t\tadd\t\tebx, BUFFER_WIDTH\r\n\t\tmov\t\tedx, VIEWPORT_HEIGHT / 2\r\n\tlabel1:\r\n\t\tmov\t\tecx, wdt\r\n\tlabel2:\r\n\t\tmov\t\tal, [esi]\r\n\t\tinc\t\tesi\r\n\t\tmov\t\tah, al\r\n\t\tmov\t\t[edi], ax\r\n\t\tmov\t\t[ebx], ax\r\n\t\tadd\t\tedi, 2\r\n\t\tadd\t\tebx, 2\r\n\t\tdec\t\tecx\r\n\t\tjnz\t\tlabel2\r\n\t\tmov\t\teax, BUFFER_WIDTH\r\n\t\tadd\t\teax, wdt\r\n\t\tsub\t\tesi, eax\r\n\t\tadd\t\teax, eax\r\n\t\tsub\t\tebx, eax\r\n\t\tsub\t\tedi, eax\r\n\t\tdec\t\tedx\r\n\t\tjnz\t\tlabel1\r\n\t}\r\n#else\r\n\tint hgt;\r\n\tBYTE *src, *dst1, *dst2;\r\n\r\n\tsrc = &gpBuffer[nSrcOff];\r\n\tdst1 = &gpBuffer[nDstOff];\r\n\tdst2 = &gpBuffer[nDstOff + BUFFER_WIDTH];\r\n\r\n\tfor (hgt = VIEWPORT_HEIGHT / 2; hgt != 0; hgt--, src -= BUFFER_WIDTH + wdt, dst1 -= 2 * (BUFFER_WIDTH + wdt), dst2 -= 2 * (BUFFER_WIDTH + wdt)) {\r\n\t\tfor (i = wdt; i != 0; i--) {\r\n\t\t\t*dst1++ = *src;\r\n\t\t\t*dst1++ = *src;\r\n\t\t\t*dst2++ = *src;\r\n\t\t\t*dst2++ = *src;\r\n\t\t\tsrc++;\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n\r\n/**\r\n * Mostly like DrawView but enables stores and lacks death screen\r\n * @brief Start rendering of screen, town variation\r\n * @param StartX Center of view in dPiece coordinate\r\n * @param StartY Center of view in dPiece coordinate\r\n */\r\nvoid T_DrawView(int StartX, int StartY)\r\n{\r\n\tlight_table_index = 0;\r\n\tcel_transparency_active = 0;\r\n\tif (zoomflag) {\r\n\t\tT_DrawGame(StartX, StartY);\r\n\t} else {\r\n\t\tT_DrawZoom(StartX, StartY);\r\n\t}\r\n\tif (automapflag) {\r\n\t\tDrawAutomap();\r\n\t}\r\n\tif (stextflag && !qtextflag)\r\n\t\tDrawSText();\r\n\tif (invflag) {\r\n\t\tDrawInv();\r\n\t} else if (sbookflag) {\r\n\t\tDrawSpellBook();\r\n\t}\r\n\r\n\tDrawDurIcon();\r\n\r\n\tif (chrflag) {\r\n\t\tDrawChr();\r\n\t} else if (questlog) {\r\n\t\tDrawQuestLog();\r\n\t} else if (plr[myplr]._pStatPts != 0 && !spselflag) {\r\n\t\tDrawLevelUpIcon();\r\n\t}\r\n\tif (uitemflag) {\r\n\t\tDrawUniqueInfo();\r\n\t}\r\n\tif (qtextflag) {\r\n\t\tDrawQText();\r\n\t}\r\n\tif (spselflag) {\r\n\t\tDrawSpellList();\r\n\t}\r\n\tif (dropGoldFlag) {\r\n\t\tDrawGoldSplit(dropGoldValue);\r\n\t}\r\n\tif (helpflag) {\r\n\t\tDrawHelp();\r\n\t}\r\n\tif (msgflag) {\r\n\t\tDrawDiabloMsg();\r\n\t}\r\n\tif (PauseMode != 0 && !deathflag) {\r\n\t\tgmenu_draw_pause();\r\n\t}\r\n\r\n\tDrawPlrMsg();\r\n\tgmenu_draw();\r\n\tdoom_draw();\r\n\tDrawInfoBox();\r\n\tDrawLifeFlask();\r\n\tDrawManaFlask();\r\n}\r\n\r\n/**\r\n * @brief Build tile columns\r\n */\r\nvoid SetTownMicros()\r\n{\r\n\tint i, x, y, lv;\r\n\tWORD *pPiece;\r\n\tMICROS *pMap;\r\n\r\n\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\tfor (x = 0; x < MAXDUNX; x++) {\r\n\t\t\tlv = dPiece[x][y];\r\n\t\t\tpMap = &dpiece_defs_map_1[IsometricCoord(x, y)];\r\n\t\t\tif (lv != 0) {\r\n\t\t\t\tlv--;\r\n\t\t\t\tpPiece = (WORD *)&pLevelPieces[32 * lv];\r\n\t\t\t\tfor (i = 0; i < 16; i++) {\r\n\t\t\t\t\tpMap->mt[i] = pPiece[(i & 1) + 16 - 2 - (i & 0xE)];\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (i = 0; i < 16; i++) {\r\n\t\t\t\t\tpMap->mt[i] = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (zoomflag) {\r\n\t\tViewDX = SCREEN_WIDTH;\r\n\t\tViewDY = VIEWPORT_HEIGHT;\r\n\t\tViewBX = SCREEN_WIDTH / TILE_WIDTH;\r\n\t\tViewBY = VIEWPORT_HEIGHT / TILE_HEIGHT;\r\n\t} else {\r\n\t\tViewDX = ZOOM_WIDTH;\r\n\t\tViewDY = ZOOM_HEIGHT;\r\n\t\tViewBX = ZOOM_WIDTH / TILE_WIDTH;\r\n\t\tViewBY = ZOOM_HEIGHT / TILE_HEIGHT;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Load level data into dPiece\r\n * @param P3Tiles Tile set\r\n * @param pSector Sector data\r\n * @param xi upper left destination\r\n * @param yi upper left destination\r\n * @param w width of sector\r\n * @param h height of sector\r\n */\r\nvoid T_FillSector(BYTE *P3Tiles, BYTE *pSector, int xi, int yi, int w, int h)\r\n{\r\n\tint i, j, xx, yy;\r\n\tlong v1, v2, v3, v4, ii;\r\n\r\n\tii = 4;\r\n\tyy = yi;\r\n\tfor (j = 0; j < h; j++) {\r\n\t\txx = xi;\r\n\t\tfor (i = 0; i < w; i++) {\r\n#ifdef USE_ASM\r\n\t\t\t__asm {\r\n\t\t\t\tmov\t\tesi, pSector\r\n\t\t\t\tmov\t\teax, ii\r\n\t\t\t\tadd\t\tesi, eax\r\n\t\t\t\txor\t\teax, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tor\t\teax, eax\r\n\t\t\t\tjz\t\tlabel1\r\n\t\t\t\tdec\t\teax\r\n\t\t\t\tmov\t\tesi, P3Tiles\r\n\t\t\t\tshl\t\teax, 3\r\n\t\t\t\tadd\t\tesi, eax\r\n\t\t\t\txor\t\teax, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv1, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv2, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv3, eax\r\n\t\t\t\tlodsw\r\n\t\t\t\tinc\t\teax\r\n\t\t\t\tmov\t\tv4, eax\r\n\t\t\t\tjmp\t\tlabel2\r\n\t\t\tlabel1:\r\n\t\t\t\tmov\t\tv1, eax\r\n\t\t\t\tmov\t\tv2, eax\r\n\t\t\t\tmov\t\tv3, eax\r\n\t\t\t\tmov\t\tv4, eax\r\n\t\t\tlabel2:\r\n\t\t\t\tnop\r\n\t\t\t}\r\n#else\r\n\t\t\tWORD *Map;\r\n\r\n\t\t\tMap = (WORD *)&pSector[ii];\r\n\t\t\tif (*Map) {\r\n\t\t\t\tv1 = *((WORD *)&P3Tiles[(*Map - 1) * 8] + 0) + 1;\r\n\t\t\t\tv2 = *((WORD *)&P3Tiles[(*Map - 1) * 8] + 1) + 1;\r\n\t\t\t\tv3 = *((WORD *)&P3Tiles[(*Map - 1) * 8] + 2) + 1;\r\n\t\t\t\tv4 = *((WORD *)&P3Tiles[(*Map - 1) * 8] + 3) + 1;\r\n\t\t\t} else {\r\n\t\t\t\tv1 = 0;\r\n\t\t\t\tv2 = 0;\r\n\t\t\t\tv3 = 0;\r\n\t\t\t\tv4 = 0;\r\n\t\t\t}\r\n#endif\r\n\t\t\tdPiece[xx][yy] = v1;\r\n\t\t\tdPiece[xx + 1][yy] = v2;\r\n\t\t\tdPiece[xx][yy + 1] = v3;\r\n\t\t\tdPiece[xx + 1][yy + 1] = v4;\r\n\t\t\txx += 2;\r\n\t\t\tii += 2;\r\n\t\t}\r\n\t\tyy += 2;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Load a tile in to dPiece\r\n * @param P3Tiles Tile set\r\n * @param xx upper left destination\r\n * @param yy upper left destination\r\n * @param t tile id\r\n */\r\nvoid T_FillTile(BYTE *P3Tiles, int xx, int yy, int t)\r\n{\r\n\tlong v1, v2, v3, v4;\r\n\r\n#ifdef USE_ASM\r\n\t__asm {\r\n\t\tmov\t\teax, t\r\n\t\tdec\t\teax\r\n\t\tmov\t\tesi, P3Tiles\r\n\t\tshl\t\teax, 3\r\n\t\tadd\t\tesi, eax\r\n\t\txor\t\teax, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv1, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv2, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv3, eax\r\n\t\tlodsw\r\n\t\tinc\t\teax\r\n\t\tmov\t\tv4, eax\r\n\t\tjmp\t\tlabel1\r\n\t\tmov\t\tv1, eax\r\n\t\tmov\t\tv2, eax\r\n\t\tmov\t\tv3, eax\r\n\t\tmov\t\tv4, eax\r\n\tlabel1:\r\n\t\tnop\r\n\t}\r\n#else\r\n\tv1 = *((WORD *)&P3Tiles[(t - 1) * 8] + 0) + 1;\r\n\tv2 = *((WORD *)&P3Tiles[(t - 1) * 8] + 1) + 1;\r\n\tv3 = *((WORD *)&P3Tiles[(t - 1) * 8] + 2) + 1;\r\n\tv4 = *((WORD *)&P3Tiles[(t - 1) * 8] + 3) + 1;\r\n#endif\r\n\r\n\tdPiece[xx][yy] = v1;\r\n\tdPiece[xx + 1][yy] = v2;\r\n\tdPiece[xx][yy + 1] = v3;\r\n\tdPiece[xx + 1][yy + 1] = v4;\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid TownOpenHive()\r\n{\r\n\tdPiece[78][60] = 0x48a;\r\n\tdPiece[79][60] = 0x48b;\r\n\tdPiece[78][61] = 0x48c;\r\n\tdPiece[79][61] = 0x50e;\r\n\tdPiece[78][62] = 0x4ee;\r\n\tdPiece[78][63] = 0x4f0;\r\n\tdPiece[79][62] = 0x510;\r\n\tdPiece[79][63] = 0x511;\r\n\tdPiece[79][64] = 0x512;\r\n\tdPiece[78][64] = 0x11a;\r\n\tdPiece[78][65] = 0x11c;\r\n\tdPiece[79][65] = 0x11d;\r\n\tdPiece[80][60] = 0x513;\r\n\tdPiece[80][61] = 0x515;\r\n\tdPiece[81][61] = 0x516;\r\n\tdPiece[82][60] = 0x517;\r\n\tdPiece[83][60] = 0x518;\r\n\tdPiece[82][61] = 0x519;\r\n\tdPiece[83][61] = 0x51a;\r\n\tdPiece[80][62] = 0x51b;\r\n\tdPiece[81][62] = 0x51c;\r\n\tdPiece[80][63] = 0x51d;\r\n\tdPiece[81][63] = 0x51e;\r\n\tdPiece[80][64] = 0x51f;\r\n\tdPiece[81][64] = 0x520;\r\n\tdPiece[80][65] = 0x521;\r\n\tdPiece[81][65] = 0x522;\r\n\tdPiece[82][64] = 0x527;\r\n\tdPiece[83][64] = 0x528;\r\n\tdPiece[82][65] = 0x529;\r\n\tdPiece[83][65] = 0x52a;\r\n\tdPiece[82][62] = 0x523;\r\n\tdPiece[83][62] = 0x524;\r\n\tdPiece[82][63] = 0x525;\r\n\tdPiece[83][63] = 0x526;\r\n\tdPiece[84][61] = 0x118;\r\n\tdPiece[84][62] = 0x118;\r\n\tdPiece[84][63] = 0x118;\r\n\tdPiece[85][60] = 0x118;\r\n\tdPiece[85][61] = 0x118;\r\n\tdPiece[85][63] = 8;\r\n\tdPiece[85][64] = 8;\r\n\tdPiece[86][60] = 0xd9;\r\n\tdPiece[86][61] = 0x18;\r\n\tdPiece[85][62] = 0x13;\r\n\tdPiece[84][64] = 0x118;\r\n\tSetTownMicros();\r\n}\r\n\r\nvoid TownCloseHive()\r\n{\r\n\tdPiece[78][60] = 0x48a;\r\n\tdPiece[79][60] = 0x4eb;\r\n\tdPiece[78][61] = 0x4ec;\r\n\tdPiece[79][61] = 0x4ed;\r\n\tdPiece[78][62] = 0x4ee;\r\n\tdPiece[79][62] = 0x4ef;\r\n\tdPiece[78][63] = 0x4f0;\r\n\tdPiece[79][63] = 0x4f1;\r\n\tdPiece[78][64] = 0x4f2;\r\n\tdPiece[79][64] = 0x4f3;\r\n\tdPiece[78][65] = 0x4f4;\r\n\tdPiece[80][60] = 0x4f5;\r\n\tdPiece[81][60] = 0x4f6;\r\n\tdPiece[80][61] = 0x4f7;\r\n\tdPiece[81][61] = 0x4f8;\r\n\tdPiece[82][60] = 0x4f9;\r\n\tdPiece[83][60] = 0x4fa;\r\n\tdPiece[82][61] = 0x4fb;\r\n\tdPiece[83][61] = 0x4fc;\r\n\tdPiece[80][62] = 0x4fd;\r\n\tdPiece[81][62] = 0x4fe;\r\n\tdPiece[80][63] = 0x4ff;\r\n\tdPiece[81][63] = 0x500;\r\n\tdPiece[80][64] = 0x501;\r\n\tdPiece[81][64] = 0x502;\r\n\tdPiece[80][65] = 0x503;\r\n\tdPiece[81][65] = 0x504;\r\n\tdPiece[82][64] = 0x509;\r\n\tdPiece[83][64] = 0x50a;\r\n\tdPiece[82][65] = 0x50b;\r\n\tdPiece[83][65] = 0x50c;\r\n\tdPiece[82][62] = 0x505;\r\n\tdPiece[83][62] = 0x506;\r\n\tdPiece[82][63] = 0x507;\r\n\tdPiece[83][63] = 0x508;\r\n\tdPiece[84][61] = 0x118;\r\n\tdPiece[84][62] = 0x118;\r\n\tdPiece[84][63] = 0x118;\r\n\tdPiece[85][60] = 0x118;\r\n\tdPiece[85][61] = 0x118;\r\n\tdPiece[85][63] = 8;\r\n\tdPiece[85][64] = 8;\r\n\tdPiece[86][60] = 0xd9;\r\n\tdPiece[86][61] = 0x18;\r\n\tdPiece[85][62] = 0x13;\r\n\tdPiece[84][64] = 0x118;\r\n\tSetTownMicros();\r\n}\r\n\r\nvoid TownCloseGrave()\r\n{\r\n\tdPiece[36][21] = 0x52b;\r\n\tdPiece[37][21] = 0x52c;\r\n\tdPiece[36][22] = 0x52d;\r\n\tdPiece[37][22] = 0x52e;\r\n\tdPiece[36][23] = 0x52f;\r\n\tdPiece[37][23] = 0x530;\r\n\tdPiece[36][24] = 0x531;\r\n\tdPiece[37][24] = 0x532;\r\n\tdPiece[35][21] = 0x53b;\r\n\tdPiece[34][21] = 0x53c;\r\n\tSetTownMicros();\r\n}\r\n\r\nvoid TownOpenGrave()\r\n{\r\n\tdPiece[36][21] = 0x533;\r\n\tdPiece[37][21] = 0x534;\r\n\tdPiece[36][22] = 0x535;\r\n\tdPiece[37][22] = 0x536;\r\n\tdPiece[36][23] = 0x537;\r\n\tdPiece[37][23] = 0x538;\r\n\tdPiece[36][24] = 0x539;\r\n\tdPiece[37][24] = 0x53a;\r\n\tdPiece[35][21] = 0x53b;\r\n\tdPiece[34][21] = 0x53c;\r\n\tSetTownMicros();\r\n}\r\n#endif\r\n\r\n/**\r\n * @brief Initialize all of the levels data\r\n */\r\nvoid T_Pass3()\r\n{\r\n\tint xx, yy, x;\r\n\tBYTE *P3Tiles, *pSector;\r\n\r\n\tfor (yy = 0; yy < MAXDUNY; yy += 2) {\r\n\t\tfor (xx = 0; xx < MAXDUNX; xx += 2) {\r\n\t\t\tdPiece[xx][yy] = 0;\r\n\t\t\tdPiece[xx + 1][yy] = 0;\r\n\t\t\tdPiece[xx][yy + 1] = 0;\r\n\t\t\tdPiece[xx + 1][yy + 1] = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tP3Tiles = LoadFileInMem(\"Levels\\\\TownData\\\\Town.TIL\", NULL);\r\n\tpSector = LoadFileInMem(\"Levels\\\\TownData\\\\Sector1s.DUN\", NULL);\r\n\tT_FillSector(P3Tiles, pSector, 46, 46, 25, 25);\r\n\tmem_free_dbg(pSector);\r\n\tpSector = LoadFileInMem(\"Levels\\\\TownData\\\\Sector2s.DUN\", NULL);\r\n\tT_FillSector(P3Tiles, pSector, 46, 0, 25, 23);\r\n\tmem_free_dbg(pSector);\r\n\tpSector = LoadFileInMem(\"Levels\\\\TownData\\\\Sector3s.DUN\", NULL);\r\n\tT_FillSector(P3Tiles, pSector, 0, 46, 23, 25);\r\n\tmem_free_dbg(pSector);\r\n\tpSector = LoadFileInMem(\"Levels\\\\TownData\\\\Sector4s.DUN\", NULL);\r\n\tT_FillSector(P3Tiles, pSector, 0, 0, 23, 23);\r\n\tmem_free_dbg(pSector);\r\n\r\n#ifndef SPAWN\r\n\tif (gbMaxPlayers == 1) {\r\n#endif\r\n#ifdef HELLFIRE\r\n\t\tif (quests[Q_FARMER]._qactive == QUEST_DONE || quests[Q_FARMER]._qactive == 10\r\n\t\t    || quests[Q_JERSEY]._qactive == QUEST_DONE || quests[Q_JERSEY]._qactive == 10) {\r\n\t\t\tTownOpenHive();\r\n\t\t} else {\r\n\t\t\tTownCloseHive();\r\n\t\t}\r\n\t\tif (quests[Q_GRAVE]._qactive == QUEST_DONE || plr[myplr]._pLvlVisited[21])\r\n\t\t\tTownOpenGrave();\r\n\t\telse\r\n\t\t\tTownCloseGrave();\r\n#endif\r\n#ifndef SPAWN\r\n#ifdef HELLFIRE\r\n\t\tif (!(plr[myplr].pTownWarps & 1) && plr[myplr]._pLevel < 10)\r\n#else\r\n\t\tif (!(plr[myplr].pTownWarps & 1))\r\n#endif\r\n#endif\r\n\t\t{\r\n\t\t\tT_FillTile(P3Tiles, 48, 20, 320);\r\n\t\t}\r\n#ifndef SPAWN\r\n#ifdef HELLFIRE\r\n\t\tif (!(plr[myplr].pTownWarps & 2) && plr[myplr]._pLevel < 15)\r\n#else\r\n\t\tif (!(plr[myplr].pTownWarps & 2))\r\n#endif\r\n#endif\r\n\t\t{\r\n\t\t\tT_FillTile(P3Tiles, 16, 68, 332);\r\n\t\t\tT_FillTile(P3Tiles, 16, 70, 331);\r\n\t\t}\r\n#ifndef SPAWN\r\n#ifdef HELLFIRE\r\n\t\tif (!(plr[myplr].pTownWarps & 4) && plr[myplr]._pLevel < 20) {\r\n#else\r\n\t\tif (!(plr[myplr].pTownWarps & 4)) {\r\n#endif\r\n#endif\r\n\t\t\tfor (x = 36; x < 46; x++) {\r\n\t\t\t\tT_FillTile(P3Tiles, x, 78, random_(0, 4) + 1);\r\n\t\t\t}\r\n#ifndef SPAWN\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\telse {\r\n\t\tif (quests[Q_FARMER]._qactive == QUEST_DONE || quests[Q_FARMER]._qactive == 10\r\n\t\t    || quests[Q_JERSEY]._qactive == QUEST_DONE || quests[Q_JERSEY]._qactive == 10) {\r\n\t\t\tTownOpenHive();\r\n\t\t} else {\r\n\t\t\tTownCloseHive();\r\n\t\t}\r\n\t\tif (quests[Q_GRAVE]._qactive == QUEST_DONE || plr[myplr]._pLvlVisited[21])\r\n\t\t\tTownOpenGrave();\r\n\t\telse\r\n\t\t\tTownCloseGrave();\r\n\t}\r\n#endif\r\n#endif\r\n\r\n\tif (quests[Q_PWATER]._qactive != QUEST_DONE && quests[Q_PWATER]._qactive) {\r\n\t\tT_FillTile(P3Tiles, 60, 70, 342);\r\n\t} else {\r\n\t\tT_FillTile(P3Tiles, 60, 70, 71);\r\n\t}\r\n\r\n\tmem_free_dbg(P3Tiles);\r\n}\r\n\r\n/**\r\n * @brief Initialize town level\r\n * @param entry Methode of entry\r\n */\r\nvoid CreateTown(int entry)\r\n{\r\n\tint x, y;\r\n\r\n\tdminx = 10;\r\n\tdminy = 10;\r\n\tdmaxx = 84;\r\n\tdmaxy = 84;\r\n\r\n\tif (entry == ENTRY_MAIN) { // New game\r\n\t\tViewX = 75;\r\n\t\tViewY = 68;\r\n\t} else if (entry == ENTRY_PREV) { // Cathedral\r\n\t\tViewX = 25;\r\n\t\tViewY = 31;\r\n\t} else if (entry == ENTRY_TWARPUP) {\r\n\t\tif (TWarpFrom == 5) {\r\n\t\t\tViewX = 49;\r\n\t\t\tViewY = 22;\r\n\t\t}\r\n\t\tif (TWarpFrom == 9) {\r\n\t\t\tViewX = 18;\r\n\t\t\tViewY = 69;\r\n\t\t}\r\n\t\tif (TWarpFrom == 13) {\r\n\t\t\tViewX = 41;\r\n\t\t\tViewY = 81;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (TWarpFrom == 21) {\r\n\t\t\tViewX = 36;\r\n\t\t\tViewY = 25;\r\n\t\t}\r\n\t\tif (TWarpFrom == 17) {\r\n\t\t\tViewX = 79;\r\n\t\t\tViewY = 62;\r\n\t\t}\r\n#endif\r\n\t}\r\n\r\n\tT_Pass3();\r\n\tmemset(dLight, 0, sizeof(dLight));\r\n\tmemset(dFlags, 0, sizeof(dFlags));\r\n\tmemset(dPlayer, 0, sizeof(dPlayer));\r\n\tmemset(dMonster, 0, sizeof(dMonster));\r\n\tmemset(dObject, 0, sizeof(dObject));\r\n\tmemset(dItem, 0, sizeof(dItem));\r\n\tmemset(dSpecial, 0, sizeof(dSpecial));\r\n\r\n\tfor (y = 0; y < MAXDUNY; y++) {\r\n\t\tfor (x = 0; x < MAXDUNX; x++) {\r\n\t\t\tif (dPiece[x][y] == 360) {\r\n\t\t\t\tdSpecial[x][y] = 1;\r\n\t\t\t} else if (dPiece[x][y] == 358) {\r\n\t\t\t\tdSpecial[x][y] = 2;\r\n\t\t\t} else if (dPiece[x][y] == 129) {\r\n\t\t\t\tdSpecial[x][y] = 6;\r\n\t\t\t} else if (dPiece[x][y] == 130) {\r\n\t\t\t\tdSpecial[x][y] = 7;\r\n\t\t\t} else if (dPiece[x][y] == 128) {\r\n\t\t\t\tdSpecial[x][y] = 8;\r\n\t\t\t} else if (dPiece[x][y] == 117) {\r\n\t\t\t\tdSpecial[x][y] = 9;\r\n\t\t\t} else if (dPiece[x][y] == 157) {\r\n\t\t\t\tdSpecial[x][y] = 10;\r\n\t\t\t} else if (dPiece[x][y] == 158) {\r\n\t\t\t\tdSpecial[x][y] = 11;\r\n\t\t\t} else if (dPiece[x][y] == 156) {\r\n\t\t\t\tdSpecial[x][y] = 12;\r\n\t\t\t} else if (dPiece[x][y] == 162) {\r\n\t\t\t\tdSpecial[x][y] = 13;\r\n\t\t\t} else if (dPiece[x][y] == 160) {\r\n\t\t\t\tdSpecial[x][y] = 14;\r\n\t\t\t} else if (dPiece[x][y] == 214) {\r\n\t\t\t\tdSpecial[x][y] = 15;\r\n\t\t\t} else if (dPiece[x][y] == 212) {\r\n\t\t\t\tdSpecial[x][y] = 16;\r\n\t\t\t} else if (dPiece[x][y] == 217) {\r\n\t\t\t\tdSpecial[x][y] = 17;\r\n\t\t\t} else if (dPiece[x][y] == 216) {\r\n\t\t\t\tdSpecial[x][y] = 18;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tSetTownMicros();\r\n}\r\n"
  },
  {
    "path": "Source/town.h",
    "content": "/**\r\n * @file town.h\r\n *\r\n * Interface of functionality for rendering the town, towners and calling other render routines.\r\n */\r\n#ifndef __TOWN_H__\r\n#define __TOWN_H__\r\n\r\nvoid town_draw_clipped_town(BYTE *pBuff, int sx, int sy, int dx, int dy, int eflag);\r\nvoid town_draw_clipped_town_2(BYTE *pBuff, int sx, int sy, int row, int CelSkip, int dx, int dy, int eflag);\r\nvoid town_draw_town_all(BYTE *pBuff, int x, int y, int row, int CelCap, int sx, int sy, int eflag);\r\nvoid T_DrawView(int StartX, int StartY);\r\n#ifdef HELLFIRE\r\nvoid TownOpenHive();\r\nvoid TownOpenGrave();\r\n#endif\r\nvoid CreateTown(int entry);\r\n\r\n#endif /* __TOWN_H__ */\r\n"
  },
  {
    "path": "Source/towners.cpp",
    "content": "/**\r\n * @file towners.cpp\r\n *\r\n * Implementation of functionality for loading and spawning towners.\r\n */\r\n#include \"all.h\"\r\n\r\nBOOL storeflag;\r\nint sgnCowMsg;\r\nint numtowners;\r\nDWORD sgdwCowClicks;\r\n/** unused 0x6AAC28 */\r\nBOOL bannerflag;\r\nBOOL boyloadflag;\r\nBYTE *pCowCels;\r\nTownerStruct towner[NUM_TOWNERS];\r\n\r\n#ifndef SPAWN\r\n/**\r\n * Maps from active cow sound effect index and player class to sound\r\n * effect ID for interacting with cows in Tristram.\r\n *\r\n * ref: enum _sfx_id\r\n * ref: enum plr_class\r\n */\r\nconst int snSFX[3][NUM_CLASSES] = {\r\n#ifdef HELLFIRE\r\n\t{ PS_WARR52, PS_ROGUE52, PS_MAGE52, PS_MONK52, 0 }, // BUGFIX: add warrior sounds for barbarian instead of 0 - walk sound\r\n\t{ PS_WARR49, PS_ROGUE49, PS_MAGE49, PS_MONK49, 0 },\r\n\t{ PS_WARR50, PS_ROGUE50, PS_MAGE50, PS_MONK50, 0 },\r\n#else\r\n\t{ PS_WARR52, PS_ROGUE52, PS_MAGE52 },\r\n\t{ PS_WARR49, PS_ROGUE49, PS_MAGE49 },\r\n\t{ PS_WARR50, PS_ROGUE50, PS_MAGE50 },\r\n#endif\r\n};\r\n#endif\r\n\r\n/* data */\r\n/** Specifies the animation frame sequence of a given NPC. */\r\nchar AnimOrder[6][148] = {\r\n\t// BUGFIX: was `15, 5, 1`, should be `15, 16, 1` in Griswold anim.\r\n\t{ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n\t    14, 13, 12, 11, 10, 9, 8, 7, 6, 5,\r\n\t    5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n\t    14, 13, 12, 11, 10, 9, 8, 7, 6, 5,\r\n\t    5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n\t    14, 13, 12, 11, 10, 9, 8, 7, 6, 5,\r\n\t    5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n\t    14, 13, 12, 11, 10, 9, 8, 7, 6, 5,\r\n\t    5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n\t    14, 13, 12, 11, 10, 9, 8, 7, 6, 5,\r\n\t    5, 6, 7, 8, 9, 10, 11, 12, 13, 14,\r\n\t    15, 5, 1, 1, 1, 1, 1, 1, 1, 1,\r\n\t    1, 1, 1, 1, 1, 1, 1, 2, 3, 4,\r\n\t    -1 },\r\n\t{ 1, 2, 3, 3, 2, 1, 20, 19, 19, 20,\r\n\t    1, 2, 3, 3, 2, 1, 20, 19, 19, 20,\r\n\t    1, 2, 3, 3, 2, 1, 20, 19, 19, 20,\r\n\t    1, 2, 3, 3, 2, 1, 20, 19, 19, 20,\r\n\t    1, 2, 3, 4, 5, 6, 7, 8, 9, 10,\r\n\t    11, 12, 13, 14, 15, 16, 15, 14, 13, 12,\r\n\t    11, 10, 9, 8, 7, 6, 5, 4, 5, 6,\r\n\t    7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\r\n\t    15, 14, 13, 12, 11, 10, 9, 8, 7, 6,\r\n\t    5, 4, 5, 6, 7, 8, 9, 10, 11, 12,\r\n\t    13, 14, 15, 16, 17, 18, 19, 20, -1 },\r\n\t{ 1, 1, 25, 25, 24, 23, 22, 21, 20, 19,\r\n\t    18, 17, 16, 15, 16, 17, 18, 19, 20, 21,\r\n\t    22, 23, 24, 25, 25, 25, 1, 1, 1, 25,\r\n\t    1, 2, 3, 4, 5, 6, 7, 8, 9, 10,\r\n\t    11, 12, 13, 14, 15, 14, 13, 12, 11, 10,\r\n\t    9, 8, 7, 6, 5, 4, 3, 2, 1, -1 },\r\n\t{ 1, 2, 3, 3, 2, 1, 16, 15, 14, 14,\r\n\t    16, 1, 2, 3, 3, 2, 1, 16, 15, 14,\r\n\t    14, 15, 16, 1, 2, 3, 3, 2, 1, 16,\r\n\t    15, 14, 14, 15, 16, 1, 2, 3, 3, 2,\r\n\t    1, 16, 15, 14, 14, 15, 16, 1, 2, 3,\r\n\t    3, 2, 1, 16, 15, 14, 14, 15, 16, 1,\r\n\t    2, 3, 3, 2, 1, 16, 15, 14, 14, 15,\r\n\t    16, 1, 2, 3, 3, 2, 1, 16, 15, 14,\r\n\t    14, 15, 16, 1, 2, 3, 2, 1, 16, 15,\r\n\t    14, 14, 15, 16, 1, 2, 3, 4, 5, 6,\r\n\t    7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\r\n\t    -1 },\r\n\t{ 1, 1, 1, 2, 3, 4, 5, 6, 7, 8,\r\n\t    9, 10, 11, 11, 11, 11, 12, 13, 14, 15,\r\n\t    16, 17, 18, 18, 1, 1, 1, 18, 17, 16,\r\n\t    15, 14, 13, 12, 11, 10, 11, 12, 13, 14,\r\n\t    15, 16, 17, 18, 1, 2, 3, 4, 5, 5,\r\n\t    5, 4, 3, 2, -1 },\r\n\t{ 4, 4, 4, 5, 6, 6, 6, 5, 4, 15,\r\n\t    14, 13, 13, 13, 14, 15, 4, 5, 6, 6,\r\n\t    6, 5, 4, 4, 4, 5, 6, 6, 6, 5,\r\n\t    4, 15, 14, 13, 13, 13, 14, 15, 4, 5,\r\n\t    6, 6, 6, 5, 4, 4, 4, 5, 6, 6,\r\n\t    6, 5, 4, 15, 14, 13, 13, 13, 14, 15,\r\n\t    4, 5, 6, 6, 6, 5, 4, 3, 2, 1,\r\n\t    19, 18, 19, 1, 2, 1, 19, 18, 19, 1,\r\n\t    2, 1, 2, 3, 4, 5, 6, 7, 8, 9,\r\n\t    10, 11, 12, 13, 14, 15, 15, 15, 14, 13,\r\n\t    13, 13, 13, 14, 15, 15, 15, 14, 13, 12,\r\n\t    12, 12, 11, 10, 10, 10, 9, 8, 9, 10,\r\n\t    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\r\n\t    1, 2, 1, 19, 18, 19, 1, 2, 1, 2,\r\n\t    3, -1 }\r\n};\r\n/** Specifies the start X-coordinates of the cows in Tristram. */\r\nint TownCowX[] = { 58, 56, 59 };\r\n/** Specifies the start Y-coordinates of the cows in Tristram. */\r\nint TownCowY[] = { 16, 14, 20 };\r\n/** Specifies the start directions of the cows in Tristram. */\r\nint TownCowDir[] = { DIR_SW, DIR_NW, DIR_N };\r\n/** Maps from direction to X-coordinate delta, which is used when\r\n * placing cows in Tristram. A single cow may require space of up\r\n * to three tiles when being placed on the map.\r\n */\r\nint cowoffx[8] = { -1, 0, -1, -1, -1, 0, -1, -1 };\r\n/** Maps from direction to Y-coordinate delta, which is used when\r\n * placing cows in Tristram. A single cow may require space of up\r\n * to three tiles when being placed on the map.\r\n */\r\nint cowoffy[8] = { -1, -1, -1, 0, -1, -1, -1, 0 };\r\n/** Contains the data related to quest gossip for each towner ID. */\r\nQuestTalkData Qtalklist[] = {\r\n// clang-format off\r\n#ifdef HELLFIRE\r\n\t// _qinfra,      _qblkm,       _qgarb,      _qzhar,      _qveil,      _qmod,       _qbutch,      _qbol,         _qblind,      _qblood,      _qanvil,      _qwarlrd,      _qking,       _qpw,           _qbone,      _qvb,         _qgrv,        _qfarm, _qgirl, _qtrade, _qdefiler, _qnakrul, _qjersy, _qhf8\r\n\t{ TEXT_INFRA6,  TEXT_MUSH6,  -1,          -1,          TEXT_VEIL5, -1,          TEXT_BUTCH5, TEXT_BANNER6, TEXT_BLIND5, TEXT_BLOOD5, TEXT_ANVIL6, TEXT_WARLRD5, TEXT_KING7,  TEXT_POISON7,  TEXT_BONE5, TEXT_VILE9,  TEXT_GRAVE2, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ TEXT_INFRA3,  -1,           -1,          -1,          TEXT_VEIL3, -1,          TEXT_BUTCH3, TEXT_BANNER4, TEXT_BLIND3, TEXT_BLOOD3, TEXT_ANVIL3, TEXT_WARLRD3, TEXT_KING5,  TEXT_POISON4,  TEXT_BONE3, TEXT_VILE7,  TEXT_GRAVE3, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1,           -1,           -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ TEXT_INFRA2,  TEXT_MUSH2,  -1,          -1,          TEXT_VEIL2, -1,          TEXT_BUTCH2, -1,            TEXT_BLIND2, TEXT_BLOOD2, TEXT_ANVIL2, TEXT_WARLRD2, TEXT_KING3,  TEXT_POISON2,  TEXT_BONE2, TEXT_VILE4,  TEXT_GRAVE5, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ TEXT_INFRA1,  TEXT_MUSH1,  -1,          -1,          TEXT_VEIL1, TEXT_VILE3, TEXT_BUTCH1, TEXT_BANNER1, TEXT_BLIND1, TEXT_BLOOD1, TEXT_ANVIL1, TEXT_WARLRD1, TEXT_KING1,  TEXT_POISON1,  TEXT_BONE1, TEXT_VILE2,  TEXT_GRAVE6, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ TEXT_INFRA8,  TEXT_MUSH7,  -1,          -1,          TEXT_VEIL6, -1,          TEXT_BUTCH6, TEXT_BANNER7, TEXT_BLIND6, TEXT_BLOOD6, TEXT_ANVIL8, TEXT_WARLRD6, TEXT_KING8,  TEXT_POISON8,  TEXT_BONE6, TEXT_VILE10, TEXT_GRAVE7, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ TEXT_INFRA9,  TEXT_MUSH9,  -1,          -1,          TEXT_VEIL7, -1,          TEXT_BUTCH7, TEXT_BANNER8, TEXT_BLIND7, TEXT_BLOOD7, TEXT_ANVIL9, TEXT_WARLRD7, TEXT_KING9,  TEXT_POISON9,  TEXT_BONE7, TEXT_VILE11, TEXT_GRAVE1, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ TEXT_INFRA4,  TEXT_MUSH5,  -1,          -1,          TEXT_VEIL4, -1,          TEXT_BUTCH4, TEXT_BANNER5, TEXT_BLIND4, TEXT_BLOOD4, TEXT_ANVIL4, TEXT_WARLRD4, TEXT_KING6,  TEXT_POISON6,  TEXT_BONE4, TEXT_VILE8,  TEXT_GRAVE8, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ TEXT_INFRA10, TEXT_MUSH13, -1,          -1,          TEXT_VEIL8, -1,          TEXT_BUTCH8, TEXT_BANNER9, TEXT_BLIND8, TEXT_BLOOD8, TEXT_ANVIL10,TEXT_WARLRD8, TEXT_KING10, TEXT_POISON10, TEXT_BONE8, TEXT_VILE12, TEXT_GRAVE9, -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1,           -1,           -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1,           -1,           -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1,           -1,           -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1,           -1,           -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1,           -1,           -1,     -1,     -1,      -1,        -1,       -1,      -1 },\r\n#else\r\n\t// _qinfra,      _qblkm,       _qgarb,      _qzhar,      _qveil,      _qmod,       _qbutch,      _qbol,         _qblind,      _qblood,      _qanvil,      _qwarlrd,      _qking,       _qpw,           _qbone,      _qvb\r\n\t{ TEXT_INFRA6,  TEXT_MUSH6,  -1,          -1,          TEXT_VEIL5, -1,          TEXT_BUTCH5, TEXT_BANNER6, TEXT_BLIND5, TEXT_BLOOD5, TEXT_ANVIL6, TEXT_WARLRD5, TEXT_KING7,  TEXT_POISON7,  TEXT_BONE5, TEXT_VILE9  },\r\n\t{ TEXT_INFRA3,  -1,           -1,          -1,          TEXT_VEIL3, -1,          TEXT_BUTCH3, TEXT_BANNER4, TEXT_BLIND3, TEXT_BLOOD3, TEXT_ANVIL3, TEXT_WARLRD3, TEXT_KING5,  TEXT_POISON4,  TEXT_BONE3, TEXT_VILE7  },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1           },\r\n\t{ TEXT_INFRA2,  TEXT_MUSH2,  -1,          -1,          TEXT_VEIL2, -1,          TEXT_BUTCH2, -1,            TEXT_BLIND2, TEXT_BLOOD2, TEXT_ANVIL2, TEXT_WARLRD2, TEXT_KING3,  TEXT_POISON2,  TEXT_BONE2, TEXT_VILE4  },\r\n\t{ TEXT_INFRA1,  TEXT_MUSH1,  -1,          -1,          TEXT_VEIL1, TEXT_VILE3, TEXT_BUTCH1, TEXT_BANNER1, TEXT_BLIND1, TEXT_BLOOD1, TEXT_ANVIL1, TEXT_WARLRD1, TEXT_KING1,  TEXT_POISON1,  TEXT_BONE1, TEXT_VILE2  },\r\n\t{ TEXT_INFRA8,  TEXT_MUSH7,  -1,          -1,          TEXT_VEIL6, -1,          TEXT_BUTCH6, TEXT_BANNER7, TEXT_BLIND6, TEXT_BLOOD6, TEXT_ANVIL8, TEXT_WARLRD6, TEXT_KING8,  TEXT_POISON8,  TEXT_BONE6, TEXT_VILE10 },\r\n\t{ TEXT_INFRA9,  TEXT_MUSH9,  -1,          -1,          TEXT_VEIL7, -1,          TEXT_BUTCH7, TEXT_BANNER8, TEXT_BLIND7, TEXT_BLOOD7, TEXT_ANVIL9, TEXT_WARLRD7, TEXT_KING9,  TEXT_POISON9,  TEXT_BONE7, TEXT_VILE11 },\r\n\t{ TEXT_INFRA4,  TEXT_MUSH5,  -1,          -1,          TEXT_VEIL4, -1,          TEXT_BUTCH4, TEXT_BANNER5, TEXT_BLIND4, TEXT_BLOOD4, TEXT_ANVIL4, TEXT_WARLRD4, TEXT_KING6,  TEXT_POISON6,  TEXT_BONE4, TEXT_VILE8  },\r\n\t{ TEXT_INFRA10, TEXT_MUSH13, -1,          -1,          TEXT_VEIL8, -1,          TEXT_BUTCH8, TEXT_BANNER9, TEXT_BLIND8, TEXT_BLOOD8, TEXT_ANVIL10,TEXT_WARLRD8, TEXT_KING10, TEXT_POISON10, TEXT_BONE8, TEXT_VILE12 },\r\n\t{ -1,            -1,           -1,          -1,          -1,          -1,          -1,           -1,            -1,           -1,           -1,           -1,            -1,           -1,             -1,          -1           },\r\n\t{ TEXT_KING1,   TEXT_KING1,  TEXT_KING1, TEXT_KING1, TEXT_KING1, TEXT_KING1, TEXT_KING1,  TEXT_KING1,   TEXT_KING1,  TEXT_KING1,  TEXT_KING1,  TEXT_KING1,   TEXT_KING1,  TEXT_KING1,    TEXT_KING1, TEXT_KING1  }\r\n#endif\r\n\t// clang-format on\r\n};\r\n/** Specifies the active sound effect ID for interacting with cows. */\r\nint CowPlaying = -1;\r\n\r\nstatic void CowSFX(int pnum)\r\n{\r\n\tif (CowPlaying == -1 || !effect_is_playing(CowPlaying)) {\r\n\t\tsgdwCowClicks++;\r\n#ifdef SPAWN\r\n\t\tif (sgdwCowClicks == 4) {\r\n\t\t\tsgdwCowClicks = 0;\r\n\t\t\tCowPlaying = TSFX_COW2;\r\n\t\t} else {\r\n\t\t\tCowPlaying = TSFX_COW1;\r\n\t\t}\r\n#else\r\n\t\tif (sgdwCowClicks >= 8) {\r\n\t\t\tPlaySfxLoc(TSFX_COW1, plr[pnum]._px, plr[pnum]._py + 5);\r\n\t\t\tsgdwCowClicks = 4;\r\n\t\t\tCowPlaying = snSFX[sgnCowMsg][plr[pnum]._pClass]; /* snSFX is local */\r\n\t\t\tsgnCowMsg++;\r\n\t\t\tif (sgnCowMsg >= 3)\r\n\t\t\t\tsgnCowMsg = 0;\r\n\t\t} else {\r\n\t\t\tCowPlaying = sgdwCowClicks == 4 ? TSFX_COW2 : TSFX_COW1;\r\n\t\t}\r\n#endif\r\n\t\tPlaySfxLoc(CowPlaying, plr[pnum]._px, plr[pnum]._py);\r\n\t}\r\n}\r\n\r\nint GetActiveTowner(int t)\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < numtowners; i++) {\r\n\t\tif (towner[i]._ttype == t)\r\n\t\t\treturn i;\r\n\t}\r\n\r\n\treturn -1;\r\n}\r\n\r\nvoid SetTownerGPtrs(BYTE *pData, BYTE **pAnim)\r\n{\r\n\tint i;\r\n#ifdef USE_ASM\r\n\tBYTE *src;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tsrc = pData;\r\n\t\t__asm {\r\n\t\t\tmov\t\teax, src\r\n\t\t\tmov\t\tebx, eax\r\n\t\t\tmov\t\tedx, i\r\n\t\t\tshl\t\tedx, 2\r\n\t\t\tadd\t\tebx, edx\r\n\t\t\tmov\t\tedx, [ebx]\r\n\t\t\tadd\t\teax, edx\r\n\t\t\tmov\t\tsrc, eax\r\n\t\t}\r\n\t\tpAnim[i] = src;\r\n\t}\r\n#else\r\n\tDWORD *pFrameTable;\r\n\r\n\tpFrameTable = (DWORD *)pData;\r\n\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\tpAnim[i] = &pData[pFrameTable[i]];\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid NewTownerAnim(int tnum, BYTE *pAnim, int numFrames, int Delay)\r\n{\r\n\ttowner[tnum]._tAnimData = pAnim;\r\n\ttowner[tnum]._tAnimLen = numFrames;\r\n\ttowner[tnum]._tAnimFrame = 1;\r\n\ttowner[tnum]._tAnimCnt = 0;\r\n\ttowner[tnum]._tAnimDelay = Delay;\r\n}\r\n\r\nvoid InitTownerInfo(int i, int w, int sel, int t, int x, int y, int ao, int tp)\r\n{\r\n\tmemset(&towner[i], 0, sizeof(TownerStruct));\r\n\ttowner[i]._tSelFlag = sel;\r\n\ttowner[i]._tAnimWidth = w;\r\n\ttowner[i]._tAnimWidth2 = (w - 64) >> 1;\r\n\ttowner[i]._tMsgSaid = FALSE;\r\n\ttowner[i]._ttype = t;\r\n\ttowner[i]._tx = x;\r\n\ttowner[i]._ty = y;\r\n\tdMonster[x][y] = i + 1;\r\n\ttowner[i]._tAnimOrder = ao;\r\n\ttowner[i]._tTenPer = tp;\r\n\ttowner[i]._tSeed = GetRndSeed();\r\n}\r\n\r\nvoid InitQstSnds(int i)\r\n{\r\n\tint j, tl;\r\n\ttl = i;\r\n\tif (boyloadflag)\r\n\t\ttl++;\r\n\tfor (j = 0; j < MAXQUESTS; j++) {\r\n\t\ttowner[i].qsts[j]._qsttype = quests[j]._qtype;\r\n\t\ttowner[i].qsts[j]._qstmsg = ((int *)(Qtalklist + tl))[j];\r\n\t\tif (((int *)(Qtalklist + tl))[j] != -1)\r\n\t\t\ttowner[i].qsts[j]._qstmsgact = TRUE;\r\n\t\telse\r\n\t\t\ttowner[i].qsts[j]._qstmsgact = FALSE;\r\n\t}\r\n}\r\n\r\n/**\r\n * @brief Load Griswold into the game\r\n\r\n */\r\nvoid InitSmith()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_SMITH, 62, 63, 0, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Smith\\\\SmithN.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 16;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_SW], towner[numtowners]._tNFrames, 3);\r\n\tstrcpy(towner[numtowners]._tName, \"Griswold the Blacksmith\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitBarOwner()\r\n{\r\n\tint i;\r\n\r\n\tbannerflag = FALSE; // unused\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_TAVERN, 55, 62, 3, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\TwnF\\\\TwnFN.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 16;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_SW], towner[numtowners]._tNFrames, 3);\r\n\tstrcpy(towner[numtowners]._tName, \"Ogden the Tavern owner\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitTownDead()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_DEADGUY, 24, 32, -1, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Butch\\\\Deadguy.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 8;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_N], towner[numtowners]._tNFrames, 6);\r\n\tstrcpy(towner[numtowners]._tName, \"Wounded Townsman\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitWitch()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_WITCH, 80, 20, 5, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\TownWmn1\\\\Witch.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 19;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 6);\r\n\tstrcpy(towner[numtowners]._tName, \"Adria the Witch\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitBarmaid()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_BMAID, 43, 66, -1, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\TownWmn1\\\\WmnN.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 18;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 6);\r\n\tstrcpy(towner[numtowners]._tName, \"Gillian the Barmaid\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitBoy()\r\n{\r\n\tint i;\r\n\r\n\tboyloadflag = TRUE;\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_PEGBOY, 11, 53, -1, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\TownBoy\\\\PegKid1.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 20;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 6);\r\n\tstrcpy(towner[numtowners]._tName, \"Wirt the Peg-legged boy\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitHealer()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_HEALER, 55, 79, 1, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Healer\\\\Healer.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 20;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_SE], towner[numtowners]._tNFrames, 6);\r\n\tstrcpy(towner[numtowners]._tName, \"Pepin the Healer\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitTeller()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_STORY, 62, 71, 2, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Strytell\\\\Strytell.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 25;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 3);\r\n\tstrcpy(towner[numtowners]._tName, \"Cain the Elder\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitDrunk()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, TRUE, TOWN_DRUNK, 71, 84, 4, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Drunk\\\\TwnDrunk.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 18;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 3);\r\n\tstrcpy(towner[numtowners]._tName, \"Farnham the Drunk\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitCows()\r\n{\r\n\tint i, dir;\r\n\tint x, y, xo, yo;\r\n\r\n\t//if ( pCowCels )\r\n\t//\tassertion_failed(300, \"C:\\\\Diablo\\\\Direct\\\\towners.cpp\", \"! pCowCels\");\r\n\tpCowCels = LoadFileInMem(\"Towners\\\\Animals\\\\Cow.CEL\", NULL);\r\n\tfor (i = 0; i < 3; i++) {\r\n\t\tx = TownCowX[i];\r\n\t\ty = TownCowY[i];\r\n\t\tdir = TownCowDir[i];\r\n\t\tInitTownerInfo(numtowners, 128, FALSE, TOWN_COW, x, y, -1, 10);\r\n\t\ttowner[numtowners]._tNData = pCowCels;\r\n\t\tSetTownerGPtrs(towner[numtowners]._tNData, towner[numtowners]._tNAnim);\r\n\t\ttowner[numtowners]._tNFrames = 12;\r\n\t\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[dir], towner[numtowners]._tNFrames, 3);\r\n\t\ttowner[numtowners]._tAnimFrame = random_(0, 11) + 1;\r\n\t\ttowner[numtowners]._tSelFlag = TRUE;\r\n\t\tstrcpy(towner[numtowners]._tName, \"Cow\");\r\n\r\n\t\txo = x + cowoffx[dir];\r\n\t\tyo = y + cowoffy[dir];\r\n\t\tif (dMonster[x][yo] == 0)\r\n\t\t\tdMonster[x][yo] = -(numtowners + 1);\r\n\t\tif (dMonster[xo][y] == 0)\r\n\t\t\tdMonster[xo][y] = -(numtowners + 1);\r\n\t\tif (dMonster[xo][yo] == 0)\r\n\t\t\tdMonster[xo][yo] = -(numtowners + 1);\r\n\r\n\t\tnumtowners++;\r\n\t}\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid InitFarmer()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, 1, TOWN_FARMER, 62, 16, -1, 10);\r\n\tInitQstSnds(numtowners);\r\n\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Farmer\\\\Farmrn2.CEL\", NULL);\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 15;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 3);\r\n\tstrcpy(towner[numtowners]._tName, \"Lester the farmer\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitCowFarmer()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, 1, TOWN_COWFARM, 61, 22, -1, 10);\r\n\tInitQstSnds(numtowners);\r\n\tif (quests[Q_JERSEY]._qactive != QUEST_DONE) {\r\n\t\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Farmer\\\\cfrmrn2.CEL\", NULL);\r\n\t} else {\r\n\t\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Farmer\\\\mfrmrn2.CEL\", NULL);\r\n\t}\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 15;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_SW], towner[numtowners]._tNFrames, 3);\r\n\tstrcpy(towner[numtowners]._tName, \"Complete Nut\");\r\n\tnumtowners++;\r\n}\r\n\r\nvoid InitGirl()\r\n{\r\n\tint i;\r\n\r\n\tInitTownerInfo(numtowners, 96, 1, TOWN_GIRL, 77, 43, -1, 10);\r\n\tInitQstSnds(numtowners);\r\n\tif (quests[Q_GIRL]._qactive != QUEST_DONE) {\r\n\t\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Girl\\\\Girlw1.CEL\", NULL);\r\n\t} else {\r\n\t\ttowner[numtowners]._tNData = LoadFileInMem(\"Towners\\\\Girl\\\\Girls1.CEL\", NULL);\r\n\t}\r\n\tfor (i = 0; i < 8; i++) {\r\n\t\ttowner[numtowners]._tNAnim[i] = towner[numtowners]._tNData;\r\n\t}\r\n\ttowner[numtowners]._tNFrames = 20;\r\n\tNewTownerAnim(numtowners, towner[numtowners]._tNAnim[DIR_S], towner[numtowners]._tNFrames, 6);\r\n\tstrcpy(towner[numtowners]._tName, \"Celia\");\r\n\tnumtowners++;\r\n}\r\n#endif\r\n\r\nvoid InitTowners()\r\n{\r\n\tnumtowners = 0;\r\n\tboyloadflag = FALSE;\r\n\tInitSmith();\r\n\tInitHealer();\r\n\tif (quests[Q_BUTCHER]._qactive != QUEST_NOTAVAIL && quests[Q_BUTCHER]._qactive != QUEST_DONE)\r\n\t\tInitTownDead();\r\n\tInitBarOwner();\r\n\tInitTeller();\r\n\tInitDrunk();\r\n\tInitWitch();\r\n\tInitBarmaid();\r\n\tInitBoy();\r\n\tInitCows();\r\n#ifdef HELLFIRE\r\n\tif (UseCowFarmer) {\r\n\t\tInitCowFarmer();\r\n\t} else if (quests[Q_FARMER]._qactive != 10) {\r\n\t\tInitFarmer();\r\n\t}\r\n\tif (UseTheoQuest && plr->_pLvlVisited[17]) {\r\n\t\tInitGirl();\r\n\t}\r\n#endif\r\n}\r\n\r\nvoid FreeTownerGFX()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; i < NUM_TOWNERS; i++) {\r\n\t\tif (towner[i]._tNData == pCowCels) {\r\n\t\t\ttowner[i]._tNData = NULL;\r\n\t\t} else if (towner[i]._tNData) {\r\n\t\t\tMemFreeDbg(towner[i]._tNData);\r\n\t\t}\r\n\t}\r\n\r\n\tMemFreeDbg(pCowCels);\r\n}\r\n\r\nvoid TownCtrlMsg(int i)\r\n{\r\n\tint p;\r\n\tint dx, dy;\r\n\r\n\tif (towner[i]._tbtcnt != 0) {\r\n\t\tp = towner[i]._tVar1;\r\n\t\tdx = abs(towner[i]._tx - plr[p]._px);\r\n\t\tdy = abs(towner[i]._ty - plr[p]._py);\r\n#ifdef HELLFIRE\r\n\t\tif (dx >= 2 || dy >= 2) {\r\n\t\t\ttowner[i]._tbtcnt = 0;\r\n\t\t\tqtextflag = FALSE;\r\n\t\t\tstream_stop();\r\n\t\t}\r\n#else\r\n\t\tif (dx >= 2 || dy >= 2)\r\n\t\t\ttowner[i]._tbtcnt = 0;\r\n\t\tif (!towner[i]._tbtcnt) {\r\n\t\t\tqtextflag = FALSE;\r\n\t\t\tstream_stop();\r\n\t\t}\r\n#endif\r\n\t}\r\n}\r\n\r\nvoid TownBlackSmith()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_SMITH);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownBarOwner()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_TAVERN);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownDead()\r\n{\r\n\tint tidx;\r\n\r\n\ttidx = GetActiveTowner(TOWN_DEADGUY);\r\n\tTownCtrlMsg(tidx);\r\n\tif (!qtextflag) {\r\n\t\tif (quests[Q_BUTCHER]._qactive == QUEST_ACTIVE && !quests[Q_BUTCHER]._qlog) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (quests[Q_BUTCHER]._qactive != QUEST_INIT) {\r\n\t\t\ttowner[tidx]._tAnimDelay = 1000;\r\n\t\t\ttowner[tidx]._tAnimFrame = 1;\r\n\t\t\tstrcpy(towner[tidx]._tName, \"Slain Townsman\");\r\n\t\t}\r\n\t}\r\n\tif (quests[Q_BUTCHER]._qactive != QUEST_INIT)\r\n\t\ttowner[tidx]._tAnimCnt = 0;\r\n}\r\n\r\nvoid TownHealer()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_HEALER);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownStory()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_STORY);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownDrunk()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_DRUNK);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownBoy()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_PEGBOY);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownWitch()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_WITCH);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownBarMaid()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_BMAID);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownCow()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_COW);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\n#ifdef HELLFIRE\r\nvoid TownFarmer()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_FARMER);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownCowFarmer()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_COWFARM);\r\n\tTownCtrlMsg(i);\r\n}\r\n\r\nvoid TownGirl()\r\n{\r\n\tint i;\r\n\r\n\ti = GetActiveTowner(TOWN_GIRL);\r\n\tTownCtrlMsg(i);\r\n}\r\n#endif\r\n\r\nvoid ProcessTowners()\r\n{\r\n\tint i, ao;\r\n\r\n\t// BUGFIX: should be `i < numtowners`, was `i < NUM_TOWNERS`.\r\n\tfor (i = 0; i < NUM_TOWNERS; i++) {\r\n\t\tswitch (towner[i]._ttype) {\r\n\t\tcase TOWN_SMITH:\r\n\t\t\tTownBlackSmith();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_HEALER:\r\n\t\t\tTownHealer();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_DEADGUY:\r\n\t\t\tTownDead();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_TAVERN:\r\n\t\t\tTownBarOwner();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_STORY:\r\n\t\t\tTownStory();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_DRUNK:\r\n\t\t\tTownDrunk();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_WITCH:\r\n\t\t\tTownWitch();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_BMAID:\r\n\t\t\tTownBarMaid();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_PEGBOY:\r\n\t\t\tTownBoy();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_COW:\r\n\t\t\tTownCow();\r\n\t\t\tbreak;\r\n#ifdef HELLFIRE\r\n\t\tcase TOWN_FARMER:\r\n\t\t\tTownFarmer();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_GIRL:\r\n\t\t\tTownGirl();\r\n\t\t\tbreak;\r\n\t\tcase TOWN_COWFARM:\r\n\t\t\tTownCowFarmer();\r\n\t\t\tbreak;\r\n#endif\r\n\t\t}\r\n\r\n\t\ttowner[i]._tAnimCnt++;\r\n\t\tif (towner[i]._tAnimCnt >= towner[i]._tAnimDelay) {\r\n\t\t\ttowner[i]._tAnimCnt = 0;\r\n\r\n\t\t\tif (towner[i]._tAnimOrder >= 0) {\r\n\t\t\t\tao = towner[i]._tAnimOrder;\r\n\t\t\t\ttowner[i]._tAnimFrameCnt++;\r\n\t\t\t\tif (AnimOrder[ao][towner[i]._tAnimFrameCnt] == -1)\r\n\t\t\t\t\ttowner[i]._tAnimFrameCnt = 0;\r\n\r\n\t\t\t\ttowner[i]._tAnimFrame = AnimOrder[ao][towner[i]._tAnimFrameCnt];\r\n\t\t\t} else {\r\n\t\t\t\ttowner[i]._tAnimFrame++;\r\n\t\t\t\tif (towner[i]._tAnimFrame > towner[i]._tAnimLen)\r\n\t\t\t\t\ttowner[i]._tAnimFrame = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nItemStruct *PlrHasItem(int pnum, int item, int &i)\r\n{\r\n\tfor (i = 0; i < plr[pnum]._pNumInv; i++) {\r\n\t\tif (plr[pnum].InvList[i].IDidx == item)\r\n\t\t\treturn &plr[pnum].InvList[i];\r\n\t}\r\n\r\n\treturn NULL;\r\n}\r\n\r\nvoid TownerTalk(int first, int t)\r\n{\r\n\tsgdwCowClicks = 0;\r\n\tsgnCowMsg = 0;\r\n\tstoreflag = TRUE;\r\n\tInitQTextMsg(first);\r\n}\r\n\r\nvoid TalkToTowner(int p, int t)\r\n{\r\n\tint i, dx, dy, rv1, rv2, rv3;\r\n\tItemStruct *Item;\r\n#ifdef HELLFIRE\r\n\tint qt, t2;\r\n#endif\r\n\r\n\trv1 = random_(6, 3); /* unused */\r\n\trv2 = random_(6, 4); /* unused */\r\n\trv3 = random_(6, 5); /* unused */\r\n\r\n\tdx = abs(plr[p]._px - towner[t]._tx);\r\n\tdy = abs(plr[p]._py - towner[t]._ty);\r\n#ifdef _DEBUG\r\n\tif (!debug_mode_key_d && (dx >= 2 || dy >= 2)) {\r\n\t\treturn;\r\n\t}\r\n#else\r\n\tif (dx >= 2 || dy >= 2) {\r\n\t\treturn;\r\n\t}\r\n#endif\r\n\r\n\tif (qtextflag) {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttowner[t]._tMsgSaid = FALSE;\r\n\r\n\tif (pcurs >= CURSOR_FIRSTITEM && !DropItemBeforeTrig()) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (t == GetActiveTowner(TOWN_TAVERN)) {\r\n\t\tif (!plr[p]._pLvlVisited[0] && !towner[t]._tMsgSaid) {\r\n\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\tInitQTextMsg(TEXT_INTRO);\r\n\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t}\r\n\t\tif ((plr[p]._pLvlVisited[2] || plr[p]._pLvlVisited[4]) && quests[Q_SKELKING]._qactive != QUEST_NOTAVAIL) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (quests[Q_SKELKING]._qactive != QUEST_NOTAVAIL)\r\n#endif\r\n\t\t\t\tif (quests[Q_SKELKING]._qvar2 == 0 && !towner[t]._tMsgSaid) {\r\n\t\t\t\t\tquests[Q_SKELKING]._qvar2 = 1;\r\n\t\t\t\t\tquests[Q_SKELKING]._qlog = TRUE;\r\n\t\t\t\t\tif (quests[Q_SKELKING]._qactive == QUEST_INIT) {\r\n\t\t\t\t\t\tquests[Q_SKELKING]._qactive = QUEST_ACTIVE;\r\n\t\t\t\t\t\tquests[Q_SKELKING]._qvar1 = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\t\tInitQTextMsg(TEXT_KING2);\r\n\t\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t\t\tNetSendCmdQuest(TRUE, Q_SKELKING);\r\n\t\t\t\t}\r\n\t\t\tif (quests[Q_SKELKING]._qactive == QUEST_DONE && quests[Q_SKELKING]._qvar2 == 1 && !towner[t]._tMsgSaid) {\r\n\t\t\t\tquests[Q_SKELKING]._qvar2 = 2;\r\n\t\t\t\tquests[Q_SKELKING]._qvar1 = 2;\r\n\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\tInitQTextMsg(TEXT_KING4);\r\n\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t\tNetSendCmdQuest(TRUE, Q_SKELKING);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (gbMaxPlayers == 1) {\r\n\t\t\tif (plr[p]._pLvlVisited[3] && quests[Q_LTBANNER]._qactive != QUEST_NOTAVAIL) {\r\n\t\t\t\tif ((quests[Q_LTBANNER]._qactive == QUEST_INIT || quests[Q_LTBANNER]._qactive == QUEST_ACTIVE) && quests[Q_LTBANNER]._qvar2 == 0 && !towner[t]._tMsgSaid) {\r\n\t\t\t\t\tquests[Q_LTBANNER]._qvar2 = 1;\r\n\t\t\t\t\tif (quests[Q_LTBANNER]._qactive == QUEST_INIT) {\r\n\t\t\t\t\t\tquests[Q_LTBANNER]._qvar1 = 1;\r\n\t\t\t\t\t\tquests[Q_LTBANNER]._qactive = QUEST_ACTIVE;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tquests[Q_LTBANNER]._qlog = TRUE;\r\n\t\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\t\tInitQTextMsg(TEXT_BANNER2);\r\n\t\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\t}\r\n\t\t\tif (!towner[t]._tMsgSaid && PlrHasItem(p, IDI_BANNER, i) != NULL) {\r\n#else\r\n\t\t\t\tif (quests[Q_LTBANNER]._qvar2 == 1 && PlrHasItem(p, IDI_BANNER, i) != NULL && !towner[t]._tMsgSaid) {\r\n#endif\r\n\t\t\t\tquests[Q_LTBANNER]._qactive = QUEST_DONE;\r\n\t\t\t\tquests[Q_LTBANNER]._qvar1 = 3;\r\n\t\t\t\tRemoveInvItem(p, i);\r\n\t\t\t\tCreateItem(UITEM_HARCREST, towner[t]._tx, towner[t]._ty + 1);\r\n\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\tInitQTextMsg(TEXT_BANNER3);\r\n\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n#ifndef HELLFIRE\r\n\t}\r\n#endif\r\n\tif (!qtextflag) {\r\n\t\tTownerTalk(TEXT_OGDEN1, t);\r\n\t\tif (storeflag) {\r\n\t\t\tStartStore(STORE_TAVERN);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_DEADGUY))\r\n{\r\n\tif (quests[Q_BUTCHER]._qactive == QUEST_ACTIVE && quests[Q_BUTCHER]._qvar1 == 1) {\r\n\t\ttowner[t]._tbtcnt = 150;\r\n\t\ttowner[t]._tVar1 = p;\r\n\t\tquests[Q_BUTCHER]._qvar1 = 1;\r\n#ifndef SPAWN\r\n\t\tif (plr[p]._pClass == PC_WARRIOR && !effect_is_playing(PS_WARR8)) {\r\n\t\t\tPlaySFX(PS_WARR8);\r\n\t\t} else if (plr[p]._pClass == PC_ROGUE && !effect_is_playing(PS_ROGUE8)) {\r\n\t\t\tPlaySFX(PS_ROGUE8);\r\n\t\t} else if (plr[p]._pClass == PC_SORCERER && !effect_is_playing(PS_MAGE8)) {\r\n\t\t\tPlaySFX(PS_MAGE8);\r\n#ifdef HELLFIRE\r\n\t\t} else if (plr[p]._pClass == PC_MONK && !effect_is_playing(PS_MONK8)) {\r\n\t\t\tPlaySFX(PS_MONK8);\r\n\t\t} else if (plr[p]._pClass == PC_BARD && !effect_is_playing(PS_ROGUE8)) {\r\n\t\t\tPlaySFX(PS_ROGUE8);\r\n\t\t} else if (plr[p]._pClass == PC_BARBARIAN && !effect_is_playing(PS_WARR8)) {\r\n\t\t\tPlaySFX(PS_WARR8);\r\n#endif\r\n\t\t}\r\n#endif\r\n\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t} else if (quests[Q_BUTCHER]._qactive == QUEST_DONE && quests[Q_BUTCHER]._qvar1 == 1) {\r\n\t\tquests[Q_BUTCHER]._qvar1 = 1;\r\n\t\ttowner[t]._tbtcnt = 150;\r\n\t\ttowner[t]._tVar1 = p;\r\n\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t} else if (quests[Q_BUTCHER]._qactive == QUEST_INIT || quests[Q_BUTCHER]._qactive == QUEST_ACTIVE && quests[Q_BUTCHER]._qvar1 == 0) {\r\n\t\tquests[Q_BUTCHER]._qactive = QUEST_ACTIVE;\r\n\t\tquests[Q_BUTCHER]._qlog = TRUE;\r\n\t\tquests[Q_BUTCHER]._qmsg = TEXT_BUTCH9;\r\n\t\tquests[Q_BUTCHER]._qvar1 = 1;\r\n\t\ttowner[t]._tbtcnt = 50;\r\n\t\ttowner[t]._tVar1 = p;\r\n\t\ttowner[t]._tVar2 = 3;\r\n\t\tInitQTextMsg(TEXT_BUTCH9);\r\n\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\tNetSendCmdQuest(TRUE, Q_BUTCHER);\r\n\t}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_SMITH))\r\n{\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (plr[p]._pLvlVisited[4] && quests[Q_ROCK]._qactive != QUEST_NOTAVAIL) {\r\n#ifdef HELLFIRE\r\n\t\t\tif (quests[Q_ROCK]._qactive != QUEST_NOTAVAIL)\r\n#endif\r\n\t\t\t\tif (quests[Q_ROCK]._qvar2 == 0) {\r\n\t\t\t\t\tquests[Q_ROCK]._qvar2 = 1;\r\n\t\t\t\t\tquests[Q_ROCK]._qlog = TRUE;\r\n\t\t\t\t\tif (quests[Q_ROCK]._qactive == QUEST_INIT) {\r\n\t\t\t\t\t\tquests[Q_ROCK]._qactive = QUEST_ACTIVE;\r\n\t\t\t\t\t\tquests[Q_ROCK]._qvar1 = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\t\tInitQTextMsg(TEXT_INFRA5);\r\n\t\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t}\r\n\t\tif (!towner[t]._tMsgSaid && PlrHasItem(p, IDI_ROCK, i) != NULL) {\r\n#else\r\n\t\t\t\t\tif (quests[Q_ROCK]._qvar2 == 1 && PlrHasItem(p, IDI_ROCK, i) != NULL && !towner[t]._tMsgSaid) {\r\n#endif\r\n\t\t\tquests[Q_ROCK]._qactive = QUEST_DONE;\r\n\t\t\tquests[Q_ROCK]._qvar2 = 2;\r\n\t\t\tquests[Q_ROCK]._qvar1 = 2;\r\n\t\t\tRemoveInvItem(p, i);\r\n\t\t\tCreateItem(UITEM_INFRARING, towner[t]._tx, towner[t]._ty + 1);\r\n\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\tInitQTextMsg(TEXT_INFRA7);\r\n\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t}\r\n#ifndef HELLFIRE\r\n\t}\r\n#endif\r\n\tif (plr[p]._pLvlVisited[9] && quests[Q_ANVIL]._qactive != QUEST_NOTAVAIL) {\r\n\t\tif ((quests[Q_ANVIL]._qactive == QUEST_INIT || quests[Q_ANVIL]._qactive == QUEST_ACTIVE) && quests[Q_ANVIL]._qvar2 == 0 && !towner[t]._tMsgSaid) {\r\n\t\t\tif (quests[Q_ROCK]._qvar2 == 2 || quests[Q_ROCK]._qactive == QUEST_ACTIVE && quests[Q_ROCK]._qvar2 == 1) {\r\n\t\t\t\tquests[Q_ANVIL]._qvar2 = 1;\r\n\t\t\t\tquests[Q_ANVIL]._qlog = TRUE;\r\n\t\t\t\tif (quests[Q_ANVIL]._qactive == QUEST_INIT) {\r\n\t\t\t\t\tquests[Q_ANVIL]._qactive = QUEST_ACTIVE;\r\n\t\t\t\t\tquests[Q_ANVIL]._qvar1 = 1;\r\n\t\t\t\t}\r\n\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\tInitQTextMsg(TEXT_ANVIL5);\r\n\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t}\r\n\tif (!towner[t]._tMsgSaid && PlrHasItem(p, IDI_ANVIL, i) != NULL) {\r\n#else\r\n\t\t\t\t\t\tif (quests[Q_ANVIL]._qvar2 == 1 && PlrHasItem(p, IDI_ANVIL, i) != NULL) {\r\n\t\t\t\t\t\t\tif (!towner[t]._tMsgSaid) {\r\n#endif\r\n\t\tquests[Q_ANVIL]._qactive = QUEST_DONE;\r\n\t\tquests[Q_ANVIL]._qvar2 = 2;\r\n\t\tquests[Q_ANVIL]._qvar1 = 2;\r\n\t\tRemoveInvItem(p, i);\r\n\t\tCreateItem(UITEM_GRISWOLD, towner[t]._tx, towner[t]._ty + 1);\r\n\t\ttowner[t]._tbtcnt = 150;\r\n\t\ttowner[t]._tVar1 = p;\r\n\t\tInitQTextMsg(TEXT_ANVIL7);\r\n\t\ttowner[t]._tMsgSaid = TRUE;\r\n#ifndef HELLFIRE\r\n\t}\r\n}\r\n#endif\r\n}\r\n}\r\nif (!qtextflag) {\r\n\tTownerTalk(TEXT_GRISWOLD1, t);\r\n\tif (storeflag) {\r\n\t\tStartStore(STORE_SMITH);\r\n\t}\r\n}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_WITCH))\r\n{\r\n\tif (quests[Q_MUSHROOM]._qactive == QUEST_INIT && PlrHasItem(p, IDI_FUNGALTM, i) != NULL) {\r\n\t\tRemoveInvItem(p, i);\r\n\t\tquests[Q_MUSHROOM]._qactive = QUEST_ACTIVE;\r\n\t\tquests[Q_MUSHROOM]._qlog = TRUE;\r\n\t\tquests[Q_MUSHROOM]._qvar1 = QS_TOMEGIVEN;\r\n\t\ttowner[t]._tbtcnt = 150;\r\n\t\ttowner[t]._tVar1 = p;\r\n\t\tInitQTextMsg(TEXT_MUSH8);\r\n\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t} else if (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE) {\r\n\t\tif (quests[Q_MUSHROOM]._qvar1 >= QS_TOMEGIVEN && quests[Q_MUSHROOM]._qvar1 <= QS_MUSHPICKED) {\r\n\t\t\tif (PlrHasItem(p, IDI_MUSHROOM, i) != NULL) {\r\n\t\t\t\tRemoveInvItem(p, i);\r\n\t\t\t\tquests[Q_MUSHROOM]._qvar1 = 5;\r\n\t\t\t\tQtalklist[TOWN_HEALER]._qblkm = TEXT_MUSH3;\r\n\t\t\t\tQtalklist[TOWN_WITCH]._qblkm = -1;\r\n\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\tquests[Q_MUSHROOM]._qmsg = TEXT_MUSH10;\r\n\t\t\t\tInitQTextMsg(TEXT_MUSH10);\r\n\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t} else if (quests[Q_MUSHROOM]._qmsg != TEXT_MUSH9) {\r\n\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\tquests[Q_MUSHROOM]._qmsg = TEXT_MUSH9;\r\n\t\t\t\tInitQTextMsg(TEXT_MUSH9);\r\n\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tItem = PlrHasItem(p, IDI_SPECELIX, i);\r\n\t\t\tif (Item != NULL) {\r\n\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\tInitQTextMsg(TEXT_MUSH12);\r\n\t\t\t\tquests[Q_MUSHROOM]._qactive = QUEST_DONE;\r\n\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t\tAllItemsList[Item->IDidx].iUsable = TRUE; /// BUGFIX: This will cause the elixir to be usable in the next game\r\n\r\n\t\t\t} else if (PlrHasItem(p, IDI_BRAIN, i) != NULL && quests[Q_MUSHROOM]._qvar2 != TEXT_MUSH11) {\r\n\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\tquests[Q_MUSHROOM]._qvar2 = TEXT_MUSH11;\r\n\t\t\t\tInitQTextMsg(TEXT_MUSH11);\r\n\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (!qtextflag) {\r\n\t\tTownerTalk(TEXT_ADRIA1, t);\r\n\t\tif (storeflag) {\r\n\t\t\tStartStore(STORE_WITCH);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_BMAID))\r\n{\r\n#ifdef HELLFIRE\r\n\tif (plr[p]._pLvlVisited[21] == false && PlrHasItem(p, IDI_MAPOFDOOM, i)) {\r\n\t\tquests[Q_GRAVE]._qactive = QUEST_ACTIVE;\r\n\t\tquests[Q_GRAVE]._qlog = TRUE;\r\n\t\tquests[Q_GRAVE]._qmsg = TEXT_GRAVE8;\r\n\t\tInitQTextMsg(TEXT_GRAVE8);\r\n\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t}\r\n#endif\r\n\tif (!qtextflag) {\r\n\t\tTownerTalk(TEXT_GILLIAN1, t);\r\n\t\tif (storeflag) {\r\n\t\t\tStartStore(STORE_BARMAID);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_DRUNK))\r\n{\r\n\tif (!qtextflag) {\r\n\t\tTownerTalk(TEXT_FARNHAM1, t);\r\n\t\tif (storeflag) {\r\n\t\t\tStartStore(STORE_DRUNK);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_HEALER))\r\n{\r\n\tif (gbMaxPlayers == 1) {\r\n#ifdef HELLFIRE\r\n\t\tif (plr[p]._pLvlVisited[1] || plr[p]._pLvlVisited[5]) {\r\n#else\r\n\t\t\t\t\t\t\tif (plr[p]._pLvlVisited[1]) {\r\n#endif\r\n\t\t\tif (!towner[t]._tMsgSaid) {\r\n\t\t\t\tif (quests[Q_PWATER]._qactive == QUEST_INIT) {\r\n\t\t\t\t\tquests[Q_PWATER]._qactive = QUEST_ACTIVE;\r\n\t\t\t\t\tquests[Q_PWATER]._qlog = TRUE;\r\n\t\t\t\t\tquests[Q_PWATER]._qmsg = TEXT_POISON3;\r\n\t\t\t\t\tquests[Q_PWATER]._qvar1 = 1;\r\n\t\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\t\tInitQTextMsg(TEXT_POISON3);\r\n\t\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t\t} else if (quests[Q_PWATER]._qactive == QUEST_DONE && quests[Q_PWATER]._qvar1 != 2) {\r\n\t\t\t\t\tquests[Q_PWATER]._qvar1 = 2;\r\n\t\t\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\t\t\tInitQTextMsg(TEXT_POISON5);\r\n\t\t\t\t\tCreateItem(UITEM_TRING, towner[t]._tx, towner[t]._ty + 1);\r\n\t\t\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && quests[Q_MUSHROOM]._qmsg == TEXT_MUSH10 && PlrHasItem(p, IDI_BRAIN, i) != NULL) {\r\n\t\t\tRemoveInvItem(p, i);\r\n\t\t\tSpawnQuestItem(IDI_SPECELIX, towner[t]._tx, towner[t]._ty + 1, 0, 0);\r\n\t\t\tInitQTextMsg(TEXT_MUSH4);\r\n\t\t\tquests[Q_MUSHROOM]._qvar1 = QS_BRAINGIVEN;\r\n\t\t\tQtalklist[TOWN_HEALER]._qblkm = -1;\r\n\t\t}\r\n\t}\r\n\tif (!qtextflag) {\r\n\t\tTownerTalk(TEXT_PEPIN1, t);\r\n\t\tif (storeflag) {\r\n\t\t\tStartStore(STORE_HEALER);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_PEGBOY))\r\n{\r\n\tif (!qtextflag) {\r\n\t\tTownerTalk(TEXT_WIRT1, t);\r\n\t\tif (storeflag) {\r\n\t\t\tStartStore(STORE_BOY);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (t == GetActiveTowner(TOWN_STORY))\r\n{\r\n\tif (gbMaxPlayers == 1) {\r\n\t\tif (quests[Q_BETRAYER]._qactive == QUEST_INIT && PlrHasItem(p, IDI_LAZSTAFF, i) != NULL) {\r\n\t\t\tRemoveInvItem(p, i);\r\n\t\t\tquests[Q_BETRAYER]._qvar1 = 2;\r\n\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\tInitQTextMsg(TEXT_VILE1);\r\n\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\tquests[Q_BETRAYER]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_BETRAYER]._qlog = TRUE;\r\n\t\t} else if (quests[Q_BETRAYER]._qactive == QUEST_DONE && quests[Q_BETRAYER]._qvar1 == 7) {\r\n\t\t\tquests[Q_BETRAYER]._qvar1 = 8;\r\n\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\tInitQTextMsg(TEXT_VILE3);\r\n\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\tquests[Q_DIABLO]._qlog = TRUE;\r\n\t\t}\r\n\t}\r\n\tif (gbMaxPlayers != 1) {\r\n\t\tif (quests[Q_BETRAYER]._qactive == QUEST_ACTIVE && !quests[Q_BETRAYER]._qlog) {\r\n\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\tInitQTextMsg(TEXT_VILE1);\r\n\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\tquests[Q_BETRAYER]._qlog = TRUE;\r\n\t\t\tNetSendCmdQuest(TRUE, Q_BETRAYER);\r\n\t\t} else if (quests[Q_BETRAYER]._qactive == QUEST_DONE && quests[Q_BETRAYER]._qvar1 == 7) {\r\n\t\t\tquests[Q_BETRAYER]._qvar1 = 8;\r\n\t\t\ttowner[t]._tbtcnt = 150;\r\n\t\t\ttowner[t]._tVar1 = p;\r\n\t\t\tInitQTextMsg(TEXT_VILE3);\r\n\t\t\ttowner[t]._tMsgSaid = TRUE;\r\n\t\t\tNetSendCmdQuest(TRUE, Q_BETRAYER);\r\n\t\t\tquests[Q_DIABLO]._qlog = TRUE;\r\n\t\t\tNetSendCmdQuest(TRUE, Q_DIABLO);\r\n\t\t}\r\n\t}\r\n\tif (!qtextflag) {\r\n\t\tTownerTalk(TEXT_STORY1, t);\r\n\t\tif (storeflag) {\r\n\t\t\tStartStore(STORE_STORY);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (towner[t]._ttype == TOWN_COW)\r\n{\r\n\tif (!qtextflag)\r\n\t\tCowSFX(p);\r\n#ifdef HELLFIRE\r\n}\r\nelse if (towner[t]._ttype == TOWN_FARMER)\r\n{\r\n\tif (!qtextflag) {\r\n\t\tqt = 277;\r\n\t\tt2 = 1;\r\n\t\tswitch (quests[Q_FARMER]._qactive) {\r\n\t\tcase 0:\r\n\t\t\tif (PlrHasItem(p, IDI_RUNEBOMB, i)) {\r\n\t\t\t\tqt = TEXT_FARMER2;\r\n\t\t\t\tquests[Q_FARMER]._qactive = QUEST_ACTIVE;\r\n\t\t\t\tquests[Q_FARMER]._qvar1 = 1;\r\n\t\t\t\tquests[Q_FARMER]._qlog = TRUE;\r\n\t\t\t\tquests[Q_FARMER]._qmsg = TEXT_FARMER1;\r\n\t\t\t\tbreak;\r\n\t\t\t} else if (!plr[myplr]._pLvlVisited[9] && plr[myplr]._pLevel < 15) {\r\n\t\t\t\tqt = 309;\r\n\t\t\t\tif (plr[myplr]._pLvlVisited[2])\r\n\t\t\t\t\tqt = 281;\r\n\t\t\t\tif (plr[myplr]._pLvlVisited[5])\r\n\t\t\t\t\tqt = 308;\r\n\t\t\t\tif (plr[myplr]._pLvlVisited[7])\r\n\t\t\t\t\tqt = 310;\r\n\t\t\t} else {\r\n\t\t\t\tqt = TEXT_FARMER1;\r\n\t\t\t\tquests[Q_FARMER]._qactive = QUEST_ACTIVE;\r\n\t\t\t\tquests[Q_FARMER]._qvar1 = 1;\r\n\t\t\t\tquests[Q_FARMER]._qlog = TRUE;\r\n\t\t\t\tquests[Q_FARMER]._qmsg = TEXT_FARMER1;\r\n\t\t\t\tSpawnRuneBomb(towner[t]._tx + 1, towner[t]._ty);\r\n\t\t\t\tt2 = 1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\tcase 2:\r\n\t\t\tif (PlrHasItem(p, IDI_RUNEBOMB, i))\r\n\t\t\t\tqt = TEXT_FARMER2;\r\n\t\t\telse\r\n\t\t\t\tqt = TEXT_FARMER3;\r\n\t\t\tbreak;\r\n\t\tcase 1:\r\n\t\t\tif (PlrHasItem(p, IDI_RUNEBOMB, i)) {\r\n\t\t\t\tqt = TEXT_FARMER2;\r\n\t\t\t\tquests[Q_FARMER]._qactive = QUEST_ACTIVE;\r\n\t\t\t\tquests[Q_FARMER]._qvar1 = 1;\r\n\t\t\t\tquests[Q_FARMER]._qmsg = TEXT_FARMER1;\r\n\t\t\t\tquests[Q_FARMER]._qlog = TRUE;\r\n\t\t\t} else if (!plr[myplr]._pLvlVisited[9] && plr[myplr]._pLevel < 15) {\r\n\t\t\t\tqt = TEXT_FARMER8;\r\n\t\t\t\tif (plr[myplr]._pLvlVisited[2]) {\r\n\t\t\t\t\tqt = TEXT_FARMER5;\r\n\t\t\t\t}\r\n\t\t\t\tif (plr[myplr]._pLvlVisited[5]) {\r\n\t\t\t\t\tqt = TEXT_FARMER7;\r\n\t\t\t\t}\r\n\t\t\t\tif (plr[myplr]._pLvlVisited[7]) {\r\n\t\t\t\t\tqt = TEXT_FARMER9;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tqt = TEXT_FARMER1;\r\n\t\t\t\tquests[Q_FARMER]._qactive = QUEST_ACTIVE;\r\n\t\t\t\tquests[Q_FARMER]._qvar1 = 1;\r\n\t\t\t\tquests[Q_FARMER]._qlog = TRUE;\r\n\t\t\t\tquests[Q_FARMER]._qmsg = TEXT_FARMER1;\r\n\t\t\t\tSpawnRuneBomb(towner[t]._tx + 1, towner[t]._ty);\r\n\t\t\t\tt2 = 1;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 3:\r\n\t\t\tqt = TEXT_FARMER4;\r\n\t\t\tSpawnRewardItem(IDI_AURIC, towner[t]._tx + 1, towner[t]._ty);\r\n\t\t\tquests[Q_FARMER]._qactive = 10;\r\n\t\t\tquests[Q_FARMER]._qlog = FALSE;\r\n\t\t\tt2 = 1;\r\n\t\t\tbreak;\r\n\t\tcase 10:\r\n\t\t\tqt = -1;\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tquests[Q_FARMER]._qactive = QUEST_NOTAVAIL;\r\n\t\t\tqt = TEXT_FARMER4;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (qt != -1) {\r\n\t\t\tif (t2)\r\n\t\t\t\tInitQTextMsg(qt);\r\n\t\t\telse\r\n\t\t\t\tPlaySFX(alltext[qt].sfxnr);\r\n\t\t}\r\n\t\tif (gbMaxPlayers != 1) {\r\n\t\t\tNetSendCmdQuest(TRUE, Q_FARMER);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (towner[t]._ttype == TOWN_COWFARM)\r\n{\r\n\tif (!qtextflag) {\r\n\t\tqt = 297;\r\n\t\tt2 = 1;\r\n\t\tif (PlrHasItem(p, IDI_GREYSUIT, i)) {\r\n\t\t\tqt = TEXT_JERSEY7;\r\n\t\t\tRemoveInvItem(p, i);\r\n\t\t} else if (PlrHasItem(p, IDI_BROWNSUIT, i)) {\r\n\t\t\tCreateItem(UITEM_BOVINE, towner[t]._tx + 1, towner[t]._ty);\r\n\t\t\tRemoveInvItem(p, i);\r\n\t\t\tqt = TEXT_JERSEY8;\r\n\t\t\tquests[Q_JERSEY]._qactive = QUEST_DONE;\r\n\t\t} else if (PlrHasItem(p, IDI_RUNEBOMB, i)) {\r\n\t\t\tqt = TEXT_JERSEY5;\r\n\t\t\tquests[Q_JERSEY]._qactive = QUEST_ACTIVE;\r\n\t\t\tquests[Q_JERSEY]._qvar1 = 1;\r\n\t\t\tquests[Q_JERSEY]._qmsg = TEXT_JERSEY4;\r\n\t\t\tquests[Q_JERSEY]._qlog = TRUE;\r\n\t\t} else {\r\n\t\t\tswitch (quests[Q_JERSEY]._qactive) {\r\n\t\t\tcase 0:\r\n\t\t\t\tqt = TEXT_JERSEY1;\r\n\t\t\t\tquests[Q_JERSEY]._qactive = 7;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tqt = TEXT_JERSEY1;\r\n\t\t\t\tquests[23]._qactive = 7;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tqt = TEXT_JERSEY5;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3:\r\n\t\t\t\tqt = TEXT_JERSEY1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 7:\r\n\t\t\t\tqt = TEXT_JERSEY2;\r\n\t\t\t\tquests[Q_JERSEY]._qactive = 8;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 8:\r\n\t\t\t\tqt = TEXT_JERSEY3;\r\n\t\t\t\tquests[Q_JERSEY]._qactive = 9;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 9:\r\n\t\t\t\tif (!plr[myplr]._pLvlVisited[9] && plr[myplr]._pLevel < 15) {\r\n\t\t\t\t\tswitch (random_(0, 4) + 9) {\r\n\t\t\t\t\tcase 9:\r\n\t\t\t\t\t\tqt = TEXT_JERSEY9;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 10:\r\n\t\t\t\t\t\tqt = TEXT_JERSEY10;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 11:\r\n\t\t\t\t\t\tqt = TEXT_JERSEY11;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tqt = TEXT_JERSEY12;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tqt = TEXT_JERSEY4;\r\n\t\t\t\t\tquests[Q_JERSEY]._qactive = QUEST_ACTIVE;\r\n\t\t\t\t\tquests[Q_JERSEY]._qvar1 = 1;\r\n\t\t\t\t\tquests[Q_JERSEY]._qmsg = TEXT_JERSEY4;\r\n\t\t\t\t\tquests[Q_JERSEY]._qlog = TRUE;\r\n\t\t\t\t\tSpawnRuneBomb(towner[t]._tx + 1, towner[t]._ty);\r\n\t\t\t\t\tt2 = 1;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tqt = TEXT_JERSEY5;\r\n\t\t\t\tquests[Q_JERSEY]._qactive = QUEST_NOTAVAIL;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (qt != -1) {\r\n\t\t\tif (t2)\r\n\t\t\t\tInitQTextMsg(qt);\r\n\t\t\telse\r\n\t\t\t\tPlaySFX(alltext[qt].sfxnr);\r\n\t\t}\r\n\t\tif (gbMaxPlayers != 1) {\r\n\t\t\tNetSendCmdQuest(TRUE, Q_JERSEY);\r\n\t\t}\r\n\t}\r\n}\r\nelse if (towner[t]._ttype == TOWN_GIRL)\r\n{\r\n\tif (!qtextflag) {\r\n\t\tqt = 282;\r\n\t\tt2 = 0;\r\n\t\tif (!PlrHasItem(p, IDI_THEODORE, i) || quests[Q_GIRL]._qactive == QUEST_DONE) {\r\n\t\t\tswitch (quests[Q_GIRL]._qactive) {\r\n\t\t\tcase 0:\r\n\t\t\t\tqt = TEXT_GIRL2;\r\n\t\t\t\tquests[Q_GIRL]._qactive = QUEST_ACTIVE;\r\n\t\t\t\tquests[Q_GIRL]._qvar1 = 1;\r\n\t\t\t\tquests[Q_GIRL]._qlog = TRUE;\r\n\t\t\t\tquests[Q_GIRL]._qmsg = TEXT_GIRL2;\r\n\t\t\t\tt2 = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 1:\r\n\t\t\t\tqt = TEXT_GIRL2;\r\n\t\t\t\tquests[Q_GIRL]._qvar1 = 1;\r\n\t\t\t\tquests[Q_GIRL]._qlog = TRUE;\r\n\t\t\t\tquests[Q_GIRL]._qmsg = TEXT_GIRL2;\r\n\t\t\t\tquests[Q_GIRL]._qactive = QUEST_ACTIVE;\r\n\t\t\t\tt2 = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 2:\r\n\t\t\t\tqt = TEXT_GIRL3;\r\n\t\t\t\tt2 = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3:\r\n\t\t\t\tqt = -1;\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tquests[Q_GIRL]._qactive = QUEST_NOTAVAIL;\r\n\t\t\t\tqt = TEXT_GIRL1;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tqt = TEXT_GIRL4;\r\n\t\t\tRemoveInvItem(p, i);\r\n\t\t\tCreateAmulet(towner[t]._tx, towner[t]._ty, 13, 0, 1);\r\n\t\t\tquests[Q_GIRL]._qlog = FALSE;\r\n\t\t\tquests[Q_GIRL]._qactive = QUEST_DONE;\r\n\t\t\tt2 = 1;\r\n\t\t}\r\n\t\tif (qt != -1) {\r\n\t\t\tif (t2 != 0) {\r\n\t\t\t\tInitQTextMsg(qt);\r\n\t\t\t} else {\r\n\t\t\t\tPlaySFX(alltext[qt].sfxnr);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (gbMaxPlayers != 1) {\r\n\t\t\tNetSendCmdQuest(TRUE, Q_GIRL);\r\n\t\t}\r\n\t}\r\n#endif\r\n}\r\n}\r\n"
  },
  {
    "path": "Source/towners.h",
    "content": "/**\r\n * @file towners.h\r\n *\r\n * Interface of functionality for loading and spawning towners.\r\n */\r\n#ifndef __TOWNERS_H__\r\n#define __TOWNERS_H__\r\n\r\nextern TownerStruct towner[NUM_TOWNERS];\r\n\r\nvoid InitTowners();\r\nvoid FreeTownerGFX();\r\nvoid ProcessTowners();\r\nItemStruct *PlrHasItem(int pnum, int item, int &i);\r\nvoid TalkToTowner(int p, int t);\r\n\r\n/* data */\r\n\r\nextern QuestTalkData Qtalklist[];\r\n\r\n#endif /* __TOWNERS_H__ */\r\n"
  },
  {
    "path": "Source/track.cpp",
    "content": "/**\r\n * @file track.cpp\r\n *\r\n * Implementation of functionality tracking what the mouse cursor is pointing at.\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nstatic BYTE sgbIsScrolling;\r\nstatic DWORD sgdwLastWalk;\r\nstatic BOOL sgbIsWalking;\r\n\r\nvoid track_process()\r\n{\r\n\tif (!sgbIsWalking)\r\n\t\treturn;\r\n\r\n\tif (cursmx < 0 || cursmx >= MAXDUNX - 1 || cursmy < 0 || cursmy >= MAXDUNY - 1)\r\n\t\treturn;\r\n\r\n\tif (plr[myplr]._pVar8 <= 6 && plr[myplr]._pmode != PM_STAND)\r\n\t\treturn;\r\n\r\n\tif (cursmx != plr[myplr]._ptargx || cursmy != plr[myplr]._ptargy) {\r\n\t\tDWORD tick = GetTickCount();\r\n\t\tif ((int)(tick - sgdwLastWalk) >= 300) {\r\n\t\t\tsgdwLastWalk = tick;\r\n\t\t\tNetSendCmdLoc(TRUE, CMD_WALKXY, cursmx, cursmy);\r\n\t\t\tif (!sgbIsScrolling)\r\n\t\t\t\tsgbIsScrolling = TRUE;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvoid track_repeat_walk(BOOL rep)\r\n{\r\n\tif (sgbIsWalking == rep)\r\n\t\treturn;\r\n\r\n\tsgbIsWalking = rep;\r\n\tif (rep) {\r\n\t\tsgbIsScrolling = FALSE;\r\n\t\tsgdwLastWalk = GetTickCount() - 50;\r\n\t\tNetSendCmdLoc(TRUE, CMD_WALKXY, cursmx, cursmy);\r\n\t} else if (sgbIsScrolling) {\r\n\t\tsgbIsScrolling = FALSE;\r\n\t}\r\n}\r\n\r\nBOOL track_isscrolling()\r\n{\r\n\treturn sgbIsScrolling;\r\n}\r\n"
  },
  {
    "path": "Source/track.h",
    "content": "/**\r\n * @file track.h\r\n *\r\n * Interface of functionality tracking what the mouse cursor is pointing at.\r\n */\r\n#ifndef __TRACK_H__\r\n#define __TRACK_H__\r\n\r\nvoid track_process();\r\nvoid track_repeat_walk(BOOL rep);\r\nBOOL track_isscrolling();\r\n\r\n#endif /* __TRACK_H__ */\r\n"
  },
  {
    "path": "Source/trigs.cpp",
    "content": "/**\r\n * @file trigs.cpp\r\n *\r\n * Implementation of functionality for triggering events when the player enters an area.\r\n */\r\n#include \"all.h\"\r\n\r\nBOOL townwarps[3];\r\nBOOL trigflag;\r\nint numtrigs;\r\nTriggerStruct trigs[MAXTRIGGERS];\r\nint TWarpFrom;\r\n\r\n/** Specifies the dungeon piece IDs which constitute stairways leading down to the cathedral from town. */\r\nint TownDownList[] = { 716, 715, 719, 720, 721, 723, 724, 725, 726, 727, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading down to the catacombs from town. */\r\nint TownWarp1List[] = { 1171, 1172, 1173, 1174, 1175, 1176, 1177, 1178, 1179, 1181, 1183, 1185, -1 };\r\n#ifdef HELLFIRE\r\nint TownCryptList[] = { 1331, 1332, 1333, 1334, 1335, 1336, 1337, 1338, -1 };\r\nint TownHiveList[] = { 1307, 1308, 1309, 1310, -1 };\r\n#endif\r\n/** Specifies the dungeon piece IDs which constitute stairways leading up from the cathedral. */\r\nint L1UpList[] = { 127, 129, 130, 131, 132, 133, 135, 137, 138, 139, 140, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading down from the cathedral. */\r\nint L1DownList[] = { 106, 107, 108, 109, 110, 112, 114, 115, 118, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading up from the catacombs. */\r\nint L2UpList[] = { 266, 267, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading down from the catacombs. */\r\nint L2DownList[] = { 269, 270, 271, 272, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading up to town from the catacombs. */\r\nint L2TWarpUpList[] = { 558, 559, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading up from the caves. */\r\nint L3UpList[] = { 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading down from the caves. */\r\nint L3DownList[] = { 162, 163, 164, 165, 166, 167, 168, 169, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading up to town from the caves. */\r\nint L3TWarpUpList[] = { 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading up from hell. */\r\nint L4UpList[] = { 82, 83, 90, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading down from hell. */\r\nint L4DownList[] = { 120, 130, 131, 132, 133, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading up to town from hell. */\r\nint L4TWarpUpList[] = { 421, 422, 429, -1 };\r\n/** Specifies the dungeon piece IDs which constitute stairways leading down to Diablo from hell. */\r\nint L4PentaList[] = { 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, -1 };\r\n#ifdef HELLFIRE\r\nint L5TWarpUpList[] = { 172, 173, 174, 175, 176, 177, 178, 179, 184, -1 };\r\nint L5UpList[] = { 149, 150, 151, 152, 153, 154, 155, 157, 158, 159, -1 };\r\nint L5DownList[] = { 125, 126, 129, 131, 132, 135, 136, 140, 142, -1 };\r\nint L6TWarpUpList[] = { 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, -1 };\r\nint L6UpList[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1 };\r\nint L6DownList[] = { 57, 58, 59, 60, 61, 62, 63, 64, -1 };\r\n#endif\r\n\r\n#ifndef SPAWN\r\nvoid InitNoTriggers()\r\n{\r\n\tnumtrigs = 0;\r\n\ttrigflag = FALSE;\r\n}\r\n#endif\r\n\r\nvoid InitTownTriggers()\r\n{\r\n\tint i;\r\n\r\n\tnumtrigs = 0;\r\n\r\n\ttrigs[numtrigs]._tx = 25;\r\n\ttrigs[numtrigs]._ty = 29;\r\n\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\tnumtrigs++;\r\n\r\n#ifndef SPAWN\r\n\tif (gbMaxPlayers == MAX_PLRS) {\r\n\t\tfor (i = 0; i < sizeof(townwarps) / sizeof(townwarps[0]); i++) {\r\n\t\t\ttownwarps[i] = TRUE;\r\n\t\t}\r\n\t\ttrigs[numtrigs]._tx = 49;\r\n\t\ttrigs[numtrigs]._ty = 21;\r\n\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\ttrigs[numtrigs]._tlvl = 5;\r\n\t\tnumtrigs++;\r\n\t\ttrigs[numtrigs]._tx = 17;\r\n\t\ttrigs[numtrigs]._ty = 69;\r\n\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\ttrigs[numtrigs]._tlvl = 9;\r\n\t\tnumtrigs++;\r\n\t\ttrigs[numtrigs]._tx = 41;\r\n\t\ttrigs[numtrigs]._ty = 80;\r\n\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\ttrigs[numtrigs]._tlvl = 13;\r\n\t\tnumtrigs++;\r\n#ifdef HELLFIRE\r\n\t\ttrigs[numtrigs]._tx = 36;\r\n\t\ttrigs[numtrigs]._ty = 24;\r\n\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\ttrigs[numtrigs]._tlvl = 21;\r\n\t\tnumtrigs++;\r\n\t\ttrigs[numtrigs]._tx = 80;\r\n\t\ttrigs[numtrigs]._ty = 62;\r\n\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\ttrigs[numtrigs]._tlvl = 17;\r\n\t\tnumtrigs++;\r\n#endif\r\n\t} else {\r\n#endif\r\n\t\tfor (i = 0; i < sizeof(townwarps) / sizeof(townwarps[0]); i++) {\r\n\t\t\ttownwarps[i] = FALSE;\r\n\t\t}\r\n#ifndef SPAWN\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr].pTownWarps & 1 || plr[myplr]._pLevel >= 10) {\r\n#else\r\n\t\tif (plr[myplr].pTownWarps & 1) {\r\n#endif\r\n\t\t\ttrigs[numtrigs]._tx = 49;\r\n\t\t\ttrigs[numtrigs]._ty = 21;\r\n\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\t\ttrigs[numtrigs]._tlvl = 5;\r\n\t\t\tnumtrigs++;\r\n\t\t\ttownwarps[0] = TRUE;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr].pTownWarps & 2 || plr[myplr]._pLevel >= 15) {\r\n#else\r\n\t\tif (plr[myplr].pTownWarps & 2) {\r\n#endif\r\n\t\t\ttownwarps[1] = TRUE;\r\n\t\t\ttrigs[numtrigs]._tx = 17;\r\n\t\t\ttrigs[numtrigs]._ty = 69;\r\n\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\t\ttrigs[numtrigs]._tlvl = 9;\r\n\t\t\tnumtrigs++;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (plr[myplr].pTownWarps & 4 || plr[myplr]._pLevel >= 20) {\r\n#else\r\n\t\tif (plr[myplr].pTownWarps & 4) {\r\n#endif\r\n\t\t\ttownwarps[2] = TRUE;\r\n\t\t\ttrigs[numtrigs]._tx = 41;\r\n\t\t\ttrigs[numtrigs]._ty = 80;\r\n\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\t\ttrigs[numtrigs]._tlvl = 13;\r\n\t\t\tnumtrigs++;\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t\tif (quests[Q_GRAVE]._qactive == QUEST_DONE) {\r\n\t\t\ttrigs[numtrigs]._tx = 36;\r\n\t\t\ttrigs[numtrigs]._ty = 24;\r\n\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\t\ttrigs[numtrigs]._tlvl = 21;\r\n\t\t\tnumtrigs++;\r\n\t\t}\r\n\t\ttrigs[numtrigs]._tx = 80;\r\n\t\ttrigs[numtrigs]._ty = 62;\r\n\t\ttrigs[numtrigs]._tmsg = WM_DIABTOWNWARP;\r\n\t\ttrigs[numtrigs]._tlvl = 17;\r\n\t\tnumtrigs++;\r\n#endif\r\n\t}\r\n#endif\r\n\r\n\ttrigflag = FALSE;\r\n}\r\n\r\nvoid InitL1Triggers()\r\n{\r\n\tint i, j;\r\n\r\n\tnumtrigs = 0;\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tif (dPiece[i][j] == 129) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABPREVLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t\tif (dPiece[i][j] == 115) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tif (dPiece[i][j] == 184) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTWARPUP;\r\n\t\t\t\t\ttrigs[numtrigs]._tlvl = 0;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t\tif (dPiece[i][j] == 158) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABPREVLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t\tif (dPiece[i][j] == 126) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\ttrigflag = FALSE;\r\n}\r\n\r\n#ifndef SPAWN\r\nvoid InitL2Triggers()\r\n{\r\n\tint i, j;\r\n\r\n\tnumtrigs = 0;\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 267 && (i != quests[Q_SCHAMB]._qtx || j != quests[Q_SCHAMB]._qty)) {\r\n\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABPREVLVL;\r\n\t\t\t\tnumtrigs++;\r\n\t\t\t}\r\n\r\n\t\t\tif (dPiece[i][j] == 559) {\r\n\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTWARPUP;\r\n\t\t\t\ttrigs[numtrigs]._tlvl = 0;\r\n\t\t\t\tnumtrigs++;\r\n\t\t\t}\r\n\r\n\t\t\tif (dPiece[i][j] == 271) {\r\n\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\tnumtrigs++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\ttrigflag = FALSE;\r\n}\r\n\r\nvoid InitL3Triggers()\r\n{\r\n\tint i, j;\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tnumtrigs = 0;\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tif (dPiece[i][j] == 171) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABPREVLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dPiece[i][j] == 168) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dPiece[i][j] == 549) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTWARPUP;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tnumtrigs = 0;\r\n\t\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\t\tif (dPiece[i][j] == 66) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABPREVLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dPiece[i][j] == 63) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dPiece[i][j] == 80) {\r\n\t\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTWARPUP;\r\n\t\t\t\t\tnumtrigs++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\ttrigflag = FALSE;\r\n}\r\n\r\nvoid InitL4Triggers()\r\n{\r\n\tint i, j;\r\n\r\n\tnumtrigs = 0;\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 83) {\r\n\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABPREVLVL;\r\n\t\t\t\tnumtrigs++;\r\n\t\t\t}\r\n\r\n\t\t\tif (dPiece[i][j] == 422) {\r\n\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABTWARPUP;\r\n\t\t\t\ttrigs[numtrigs]._tlvl = 0;\r\n\t\t\t\tnumtrigs++;\r\n\t\t\t}\r\n\r\n\t\t\tif (dPiece[i][j] == 120) {\r\n\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\tnumtrigs++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor (j = 0; j < MAXDUNY; j++) {\r\n\t\tfor (i = 0; i < MAXDUNX; i++) {\r\n\t\t\tif (dPiece[i][j] == 370 && quests[Q_BETRAYER]._qactive == QUEST_DONE) {\r\n\t\t\t\ttrigs[numtrigs]._tx = i;\r\n\t\t\t\ttrigs[numtrigs]._ty = j;\r\n\t\t\t\ttrigs[numtrigs]._tmsg = WM_DIABNEXTLVL;\r\n\t\t\t\tnumtrigs++;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\ttrigflag = FALSE;\r\n}\r\n\r\nvoid InitSKingTriggers()\r\n{\r\n\ttrigflag = FALSE;\r\n\tnumtrigs = 1;\r\n\ttrigs[0]._tx = 82;\r\n\ttrigs[0]._ty = 42;\r\n\ttrigs[0]._tmsg = WM_DIABRTNLVL;\r\n}\r\n\r\nvoid InitSChambTriggers()\r\n{\r\n\ttrigflag = FALSE;\r\n\tnumtrigs = 1;\r\n\ttrigs[0]._tx = 70;\r\n\ttrigs[0]._ty = 39;\r\n\ttrigs[0]._tmsg = WM_DIABRTNLVL;\r\n}\r\n\r\nvoid InitPWaterTriggers()\r\n{\r\n\ttrigflag = FALSE;\r\n\tnumtrigs = 1;\r\n\ttrigs[0]._tx = 30;\r\n\ttrigs[0]._ty = 83;\r\n\ttrigs[0]._tmsg = WM_DIABRTNLVL;\r\n}\r\n\r\nvoid InitVPTriggers()\r\n{\r\n\ttrigflag = FALSE;\r\n\tnumtrigs = 1;\r\n\ttrigs[0]._tx = 35;\r\n\ttrigs[0]._ty = 32;\r\n\ttrigs[0]._tmsg = WM_DIABRTNLVL;\r\n}\r\n#endif\r\n\r\nBOOL ForceTownTrig()\r\n{\r\n\tint i, j, k, l;\r\n\r\n#ifdef HELLFIRE\r\n\tfor (i = 0; TownCryptList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == TownCryptList[i]) {\r\n\t\t\tstrcpy(infostr, \"Down to Crypt\");\r\n\t\t\tcursmx = 36;\r\n\t\t\tcursmy = 24;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\tfor (i = 0; TownHiveList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == TownHiveList[i]) {\r\n\t\t\tstrcpy(infostr, \"Down to Hive\");\r\n\t\t\tcursmx = 80;\r\n\t\t\tcursmy = 62;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tfor (i = 0; TownDownList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == TownDownList[i]) {\r\n\t\t\tstrcpy(infostr, \"Down to dungeon\");\r\n\t\t\tcursmx = 25;\r\n\t\t\tcursmy = 29;\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\tif (townwarps[0]) {\r\n\t\tfor (j = 0; TownWarp1List[j] != -1; j++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == TownWarp1List[j]) {\r\n\t\t\t\tstrcpy(infostr, \"Down to catacombs\");\r\n\t\t\t\tcursmx = 49;\r\n\t\t\t\tcursmy = 21;\r\n\t\t\t\treturn TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (townwarps[1]) {\r\n\t\tfor (k = 1199; k <= 1220; k++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == k) {\r\n\t\t\t\tstrcpy(infostr, \"Down to caves\");\r\n\t\t\t\tcursmx = 17;\r\n\t\t\t\tcursmy = 69;\r\n\t\t\t\treturn TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (townwarps[2]) {\r\n\t\tfor (l = 1240; l <= 1255; l++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == l) {\r\n\t\t\t\tstrcpy(infostr, \"Down to hell\");\r\n\t\t\t\tcursmx = 41;\r\n\t\t\t\tcursmy = 80;\r\n\t\t\t\treturn TRUE;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL ForceL1Trig()\r\n{\r\n\tint i, j;\r\n#ifdef HELLFIRE\r\n\tint dx, dy;\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tfor (i = 0; L1UpList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L1UpList[i]) {\r\n\t\t\t\tif (currlevel > 1)\r\n\t\t\t\t\tsprintf(infostr, \"Up to level %i\", currlevel - 1);\r\n\t\t\t\telse\r\n\t\t\t\t\tstrcpy(infostr, \"Up to town\");\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABPREVLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; L1DownList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L1DownList[i]) {\r\n\t\t\t\tsprintf(infostr, \"Down to level %i\", currlevel + 1);\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABNEXTLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tfor (i = 0; L5UpList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L5UpList[i]) {\r\n\t\t\t\tsprintf(infostr, \"Up to Crypt level %i\", currlevel - 21);\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABPREVLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (dPiece[cursmx][cursmy] == 317) {\r\n\t\t\tstrcpy(infostr, \"Cornerstone of the World\");\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t\tfor (i = 0; L5DownList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L5DownList[i]) {\r\n\t\t\t\tsprintf(infostr, \"Down to Crypt level %i\", currlevel - 19);\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABNEXTLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (currlevel == 21) {\r\n\t\t\tfor (i = 0; L5TWarpUpList[i] != -1; i++) {\r\n\t\t\t\tif (dPiece[cursmx][cursmy] == L5TWarpUpList[i]) {\r\n\t\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABTWARPUP) {\r\n\t\t\t\t\t\t\tdx = abs(trigs[j]._tx - cursmx);\r\n\t\t\t\t\t\t\tdy = abs(trigs[j]._ty - cursmy);\r\n\t\t\t\t\t\t\tif (dx < 4 && dy < 4) {\r\n\t\t\t\t\t\t\t\tstrcpy(infostr, \"Up to town\");\r\n\t\t\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL ForceL2Trig()\r\n{\r\n\tint i, j, dx, dy;\r\n\r\n\tfor (i = 0; L2UpList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == L2UpList[i]) {\r\n\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\tif (trigs[j]._tmsg == WM_DIABPREVLVL) {\r\n\t\t\t\t\tdx = abs(trigs[j]._tx - cursmx);\r\n\t\t\t\t\tdy = abs(trigs[j]._ty - cursmy);\r\n\t\t\t\t\tif (dx < 4 && dy < 4) {\r\n\t\t\t\t\t\tsprintf(infostr, \"Up to level %i\", currlevel - 1);\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; L2DownList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == L2DownList[i]) {\r\n\t\t\tsprintf(infostr, \"Down to level %i\", currlevel + 1);\r\n\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\tif (trigs[j]._tmsg == WM_DIABNEXTLVL) {\r\n\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\treturn TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (currlevel == 5) {\r\n\t\tfor (i = 0; L2TWarpUpList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L2TWarpUpList[i]) {\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABTWARPUP) {\r\n\t\t\t\t\t\tdx = abs(trigs[j]._tx - cursmx);\r\n\t\t\t\t\t\tdy = abs(trigs[j]._ty - cursmy);\r\n\t\t\t\t\t\tif (dx < 4 && dy < 4) {\r\n\t\t\t\t\t\t\tstrcpy(infostr, \"Up to town\");\r\n\t\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL ForceL3Trig()\r\n{\r\n\tint i, j, dx, dy;\r\n\r\n#ifdef HELLFIRE\r\n\tif (currlevel < 17) {\r\n#endif\r\n\t\tfor (i = 0; L3UpList[i] != -1; ++i) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L3UpList[i]) {\r\n\t\t\t\tsprintf(infostr, \"Up to level %i\", currlevel - 1);\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABPREVLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; L3DownList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L3DownList[i]\r\n\t\t\t    || dPiece[cursmx + 1][cursmy] == L3DownList[i]\r\n\t\t\t    || dPiece[cursmx + 2][cursmy] == L3DownList[i]) {\r\n\t\t\t\tsprintf(infostr, \"Down to level %i\", currlevel + 1);\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABNEXTLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n#ifdef HELLFIRE\r\n\t} else {\r\n\t\tfor (i = 0; L6UpList[i] != -1; ++i) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L6UpList[i]) {\r\n\t\t\t\tsprintf(infostr, \"Up to Nest level %i\", currlevel - 17);\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABPREVLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (i = 0; L6DownList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L6DownList[i]\r\n\t\t\t    || dPiece[cursmx + 1][cursmy] == L6DownList[i]\r\n\t\t\t    || dPiece[cursmx + 2][cursmy] == L6DownList[i]) {\r\n\t\t\t\tsprintf(infostr, \"Down to level %i\", currlevel - 15);\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABNEXTLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\tif (currlevel == 9) {\r\n\t\tfor (i = 0; L3TWarpUpList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L3TWarpUpList[i]) {\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABTWARPUP) {\r\n\t\t\t\t\t\tdx = abs(trigs[j]._tx - cursmx);\r\n\t\t\t\t\t\tdy = abs(trigs[j]._ty - cursmy);\r\n\t\t\t\t\t\tif (dx < 4 && dy < 4) {\r\n\t\t\t\t\t\t\tstrcpy(infostr, \"Up to town\");\r\n\t\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#ifdef HELLFIRE\r\n\tif (currlevel == 17) {\r\n\t\tfor (i = 0; L6TWarpUpList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L6TWarpUpList[i]) {\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABTWARPUP) {\r\n\t\t\t\t\t\tdx = abs(trigs[j]._tx - cursmx);\r\n\t\t\t\t\t\tdy = abs(trigs[j]._ty - cursmy);\r\n\t\t\t\t\t\tif (dx < 4 && dy < 4) {\r\n\t\t\t\t\t\t\tstrcpy(infostr, \"Up to town\");\r\n\t\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n#endif\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL ForceL4Trig()\r\n{\r\n\tint i, j, dx, dy;\r\n\r\n\tfor (i = 0; L4UpList[i] != -1; ++i) {\r\n\t\tif (dPiece[cursmx][cursmy] == L4UpList[i]) {\r\n\t\t\tsprintf(infostr, \"Up to level %i\", currlevel - 1);\r\n\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\tif (trigs[j]._tmsg == WM_DIABPREVLVL) {\r\n\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\treturn TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfor (i = 0; L4DownList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == L4DownList[i]) {\r\n\t\t\tsprintf(infostr, \"Down to level %i\", currlevel + 1);\r\n\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\tif (trigs[j]._tmsg == WM_DIABNEXTLVL) {\r\n\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\treturn TRUE;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (currlevel == 13) {\r\n\t\tfor (i = 0; L4TWarpUpList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L4TWarpUpList[i]) {\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABTWARPUP) {\r\n\t\t\t\t\t\tdx = abs(trigs[j]._tx - cursmx);\r\n\t\t\t\t\t\tdy = abs(trigs[j]._ty - cursmy);\r\n\t\t\t\t\t\tif (dx < 4 && dy < 4) {\r\n\t\t\t\t\t\t\tstrcpy(infostr, \"Up to town\");\r\n\t\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (currlevel == 15) {\r\n\t\tfor (i = 0; L4PentaList[i] != -1; i++) {\r\n\t\t\tif (dPiece[cursmx][cursmy] == L4PentaList[i]) {\r\n\t\t\t\tstrcpy(infostr, \"Down to Diablo\");\r\n\t\t\t\tfor (j = 0; j < numtrigs; j++) {\r\n\t\t\t\t\tif (trigs[j]._tmsg == WM_DIABNEXTLVL) {\r\n\t\t\t\t\t\tcursmx = trigs[j]._tx;\r\n\t\t\t\t\t\tcursmy = trigs[j]._ty;\r\n\t\t\t\t\t\treturn TRUE;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid Freeupstairs()\r\n{\r\n\tint i, tx, ty, xx, yy;\r\n\r\n\tfor (i = 0; i < numtrigs; i++) {\r\n\t\ttx = trigs[i]._tx;\r\n\t\tty = trigs[i]._ty;\r\n\r\n\t\tfor (yy = -2; yy <= 2; yy++) {\r\n\t\t\tfor (xx = -2; xx <= 2; xx++) {\r\n\t\t\t\tdFlags[tx + xx][ty + yy] |= BFLAG_POPULATED;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nBOOL ForceSKingTrig()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; L1UpList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == L1UpList[i]) {\r\n\t\t\tsprintf(infostr, \"Back to Level %i\", quests[Q_SKELKING]._qlevel);\r\n\t\t\tcursmx = trigs[0]._tx;\r\n\t\t\tcursmy = trigs[0]._ty;\r\n\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL ForceSChambTrig()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; L2DownList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == L2DownList[i]) {\r\n\t\t\tsprintf(infostr, \"Back to Level %i\", quests[Q_SCHAMB]._qlevel);\r\n\t\t\tcursmx = trigs[0]._tx;\r\n\t\t\tcursmy = trigs[0]._ty;\r\n\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nBOOL ForcePWaterTrig()\r\n{\r\n\tint i;\r\n\r\n\tfor (i = 0; L3DownList[i] != -1; i++) {\r\n\t\tif (dPiece[cursmx][cursmy] == L3DownList[i]) {\r\n\t\t\tsprintf(infostr, \"Back to Level %i\", quests[Q_PWATER]._qlevel);\r\n\t\t\tcursmx = trigs[0]._tx;\r\n\t\t\tcursmy = trigs[0]._ty;\r\n\r\n\t\t\treturn TRUE;\r\n\t\t}\r\n\t}\r\n\r\n\treturn FALSE;\r\n}\r\n\r\nvoid CheckTrigForce()\r\n{\r\n\ttrigflag = FALSE;\r\n\r\n\tif (MouseY > PANEL_TOP - 1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!setlevel) {\r\n\t\tswitch (leveltype) {\r\n\t\tcase DTYPE_TOWN:\r\n\t\t\ttrigflag = ForceTownTrig();\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_CATHEDRAL:\r\n\t\t\ttrigflag = ForceL1Trig();\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_CATACOMBS:\r\n\t\t\ttrigflag = ForceL2Trig();\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_CAVES:\r\n\t\t\ttrigflag = ForceL3Trig();\r\n\t\t\tbreak;\r\n\t\tcase DTYPE_HELL:\r\n\t\t\ttrigflag = ForceL4Trig();\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (leveltype != DTYPE_TOWN && !trigflag) {\r\n\t\t\ttrigflag = ForceQuests();\r\n\t\t}\r\n\t} else {\r\n\t\tswitch (setlvlnum) {\r\n\t\tcase SL_SKELKING:\r\n\t\t\ttrigflag = ForceSKingTrig();\r\n\t\t\tbreak;\r\n\t\tcase SL_BONECHAMB:\r\n\t\t\ttrigflag = ForceSChambTrig();\r\n\t\t\tbreak;\r\n\t\tcase SL_POISONWATER:\r\n\t\t\ttrigflag = ForcePWaterTrig();\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (trigflag) {\r\n\t\tClearPanel();\r\n\t}\r\n}\r\n\r\nvoid CheckTriggers()\r\n{\r\n\tint x, y, i;\r\n\tBOOL abort;\r\n\tchar abortflag;\r\n\r\n\tif (plr[myplr]._pmode != PM_STAND)\r\n\t\treturn;\r\n\r\n\tfor (i = 0; i < numtrigs; i++) {\r\n\t\tif (plr[myplr]._px != trigs[i]._tx || plr[myplr]._py != trigs[i]._ty) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tswitch (trigs[i]._tmsg) {\r\n\t\tcase WM_DIABNEXTLVL:\r\n#ifdef SPAWN\r\n\t\t\tif (currlevel >= 2) {\r\n\t\t\t\tNetSendCmdLoc(TRUE, CMD_WALKXY, plr[myplr]._px, plr[myplr]._py + 1);\r\n\t\t\t\tPlaySFX(PS_WARR18);\r\n\t\t\t\tInitDiabloMsg(EMSG_NOT_IN_SHAREWARE);\r\n\t\t\t} else {\r\n#endif\r\n\t\t\t\tif (pcurs >= CURSOR_FIRSTITEM && DropItemBeforeTrig())\r\n\t\t\t\t\treturn;\r\n\t\t\t\tStartNewLvl(myplr, trigs[i]._tmsg, currlevel + 1);\r\n#ifdef SPAWN\r\n\t\t\t}\r\n#endif\r\n\t\t\tbreak;\r\n\t\tcase WM_DIABPREVLVL:\r\n\t\t\tif (pcurs >= CURSOR_FIRSTITEM && DropItemBeforeTrig())\r\n\t\t\t\treturn;\r\n\t\t\tStartNewLvl(myplr, trigs[i]._tmsg, currlevel - 1);\r\n\t\t\tbreak;\r\n\t\tcase WM_DIABRTNLVL:\r\n\t\t\tStartNewLvl(myplr, trigs[i]._tmsg, ReturnLvl);\r\n\t\t\tbreak;\r\n\t\tcase WM_DIABTOWNWARP:\r\n\t\t\tif (gbMaxPlayers != 1) {\r\n\t\t\t\tabort = FALSE;\r\n\r\n\t\t\t\tif (trigs[i]._tlvl == 5 && plr[myplr]._pLevel < 8) {\r\n\t\t\t\t\tabort = TRUE;\r\n\t\t\t\t\tx = plr[myplr]._px;\r\n\t\t\t\t\ty = plr[myplr]._py + 1;\r\n\t\t\t\t\tabortflag = EMSG_REQUIRES_LVL_8;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (trigs[i]._tlvl == 9 && plr[myplr]._pLevel < 13) {\r\n\t\t\t\t\tabort = TRUE;\r\n\t\t\t\t\tx = plr[myplr]._px + 1;\r\n\t\t\t\t\ty = plr[myplr]._py;\r\n\t\t\t\t\tabortflag = EMSG_REQUIRES_LVL_13;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (trigs[i]._tlvl == 13 && plr[myplr]._pLevel < 17) {\r\n\t\t\t\t\tabort = TRUE;\r\n\t\t\t\t\tx = plr[myplr]._px;\r\n\t\t\t\t\ty = plr[myplr]._py + 1;\r\n\t\t\t\t\tabortflag = EMSG_REQUIRES_LVL_17;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (abort) {\r\n\t\t\t\t\tif (plr[myplr]._pClass == PC_WARRIOR) {\r\n\t\t\t\t\t\tPlaySFX(PS_WARR43);\r\n#ifndef SPAWN\r\n\t\t\t\t\t} else if (plr[myplr]._pClass == PC_ROGUE) {\r\n\t\t\t\t\t\tPlaySFX(PS_ROGUE43);\r\n\t\t\t\t\t} else if (plr[myplr]._pClass == PC_SORCERER) {\r\n\t\t\t\t\t\tPlaySFX(PS_MAGE43);\r\n#endif\r\n\t\t\t\t\t}\r\n#ifdef HELLFIRE\r\n\t\t\t\t\telse if (plr[myplr]._pClass == PC_MONK) {\r\n\t\t\t\t\t\tPlaySFX(PS_MONK43);\r\n#ifndef SPAWN\r\n\t\t\t\t\t} else if (plr[myplr]._pClass == PC_BARD) {\r\n\t\t\t\t\t\tPlaySFX(PS_ROGUE43);\r\n#endif\r\n\t\t\t\t\t} else if (plr[myplr]._pClass == PC_BARBARIAN) {\r\n\t\t\t\t\t\tPlaySFX(PS_WARR43);\r\n\t\t\t\t\t}\r\n#endif\r\n\r\n\t\t\t\t\tInitDiabloMsg(abortflag);\r\n\t\t\t\t\tNetSendCmdLoc(TRUE, CMD_WALKXY, x, y);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tStartNewLvl(myplr, trigs[i]._tmsg, trigs[i]._tlvl);\r\n\t\t\tbreak;\r\n\t\tcase WM_DIABTWARPUP:\r\n\t\t\tTWarpFrom = currlevel;\r\n\t\t\tStartNewLvl(myplr, trigs[i]._tmsg, 0);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tapp_fatal(\"Unknown trigger msg\");\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "Source/trigs.h",
    "content": "/**\r\n * @file trigs.h\r\n *\r\n * Interface of functionality for triggering events when the player enters an area.\r\n */\r\n#ifndef __TRIGS_H__\r\n#define __TRIGS_H__\r\n\r\nextern BOOL trigflag;\r\nextern int numtrigs;\r\nextern TriggerStruct trigs[MAXTRIGGERS];\r\nextern int TWarpFrom;\r\n\r\nvoid InitNoTriggers();\r\nvoid InitTownTriggers();\r\nvoid InitL1Triggers();\r\nvoid InitL2Triggers();\r\nvoid InitL3Triggers();\r\nvoid InitL4Triggers();\r\nvoid InitSKingTriggers();\r\nvoid InitSChambTriggers();\r\nvoid InitPWaterTriggers();\r\nvoid InitVPTriggers();\r\nvoid Freeupstairs();\r\nvoid CheckTrigForce();\r\nvoid CheckTriggers();\r\n\r\n#endif /* __TRIGS_H__ */\r\n"
  },
  {
    "path": "Source/wave.cpp",
    "content": "/**\r\n * @file wave.cpp\r\n *\r\n * Implementation of functionality for loading and processing wave files.\r\n\r\n */\r\n#include \"all.h\"\r\n#include \"../3rdParty/Storm/Source/storm.h\"\r\n\r\nstatic void WGetFileArchive(HANDLE hsFile, DWORD *retries, const char *FileName)\r\n{\r\n\tHANDLE archive;\r\n\r\n\tif (*retries >= 5)\r\n\t\tFileErrDlg(FileName);\r\n\r\n\tif (hsFile && SFileGetFileArchive(hsFile, &archive) && archive != diabdat_mpq) {\r\n\t\tSleep(20);\r\n\t\t(*retries)++;\r\n\t} else if (!InsertCDDlg())\r\n\t\tFileErrDlg(FileName);\r\n}\r\n\r\nvoid WCloseFile(HANDLE file)\r\n{\r\n\tSFileCloseFile(file);\r\n}\r\n\r\nLONG WGetFileSize(HANDLE hsFile, DWORD *lpFileSizeHigh)\r\n{\r\n\tDWORD retry = 0;\r\n\tLONG ret;\r\n\r\n\twhile ((ret = SFileGetFileSize(hsFile, lpFileSizeHigh)) == 0)\r\n\t\tWGetFileArchive(hsFile, &retry, NULL);\r\n\r\n\treturn ret;\r\n}\r\n\r\nBOOL WOpenFile(const char *FileName, HANDLE *phsFile, BOOL mayNotExist)\r\n{\r\n\tDWORD retry = 0;\r\n\r\n\twhile (1) {\r\n\t\tif (SFileOpenFile(FileName, phsFile))\r\n\t\t\treturn TRUE;\r\n\t\tif (mayNotExist && DERROR() == ERROR_FILE_NOT_FOUND)\r\n\t\t\tbreak;\r\n\t\tWGetFileArchive(NULL, &retry, FileName);\r\n\t}\r\n\treturn FALSE;\r\n}\r\n\r\nvoid WReadFile(HANDLE hsFile, LPVOID buf, DWORD to_read)\r\n{\r\n\tDWORD retry = 0;\r\n\tDWORD readed;\r\n\tint initial_pos = WSetFilePointer(hsFile, 0, NULL, FILE_CURRENT);\r\n\r\n\twhile (!SFileReadFile(hsFile, buf, to_read, &readed, NULL)) {\r\n\t\tWGetFileArchive(hsFile, &retry, NULL);\r\n\t\tWSetFilePointer(hsFile, initial_pos, NULL, FILE_BEGIN);\r\n\t}\r\n}\r\n\r\nint WSetFilePointer(HANDLE file1, int offset, HANDLE file2, int whence)\r\n{\r\n\tDWORD retry = 0;\r\n\tint result;\r\n\r\n\twhile (1) {\r\n\t\tresult = SFileSetFilePointer(file1, offset, file2, whence);\r\n\t\tif (result != -1)\r\n\t\t\tbreak;\r\n\t\tWGetFileArchive(file1, &retry, NULL);\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nstatic void FillMemFile(MEMFILE *pMemFile)\r\n{\r\n\tDWORD to_read;\r\n\tWSetFilePointer(pMemFile->file, pMemFile->offset, NULL, FILE_BEGIN);\r\n\tto_read = pMemFile->end - pMemFile->offset;\r\n\tif (pMemFile->buf_len < to_read)\r\n\t\tto_read = pMemFile->buf_len;\r\n\tif (to_read)\r\n\t\tWReadFile(pMemFile->file, pMemFile->buf, to_read);\r\n\tpMemFile->dist = 0;\r\n\tpMemFile->bytes_to_read = to_read;\r\n}\r\n\r\nstatic void FreeMemFile(MEMFILE *pMemFile)\r\n{\r\n\tMemFreeDbg(pMemFile->buf);\r\n}\r\n\r\nstatic BOOL ReadMemFile(MEMFILE *pMemFile, void *lpBuf, size_t length)\r\n{\r\n\twhile (length) {\r\n\t\tsize_t to_copy;\r\n\t\tif (!pMemFile->bytes_to_read)\r\n\t\t\tFillMemFile(pMemFile);\r\n\t\tto_copy = pMemFile->bytes_to_read;\r\n\t\tif (length < to_copy)\r\n\t\t\tto_copy = length;\r\n\t\tif (!to_copy)\r\n\t\t\treturn FALSE;\r\n\t\tmemcpy(lpBuf, &pMemFile->buf[pMemFile->dist], to_copy);\r\n\t\tpMemFile->offset += to_copy;\r\n\t\tpMemFile->dist += to_copy;\r\n\t\tpMemFile->bytes_to_read -= to_copy;\r\n\t\t// BUGFIX: lpBuf is not incremented, next read will overwrite data\r\n\t\tlength -= to_copy;\r\n\t}\r\n\treturn TRUE;\r\n}\r\n\r\nstatic int SeekMemFile(MEMFILE *pMemFile, ULONG lDist, DWORD dwMethod)\r\n{\r\n\tif (lDist < pMemFile->bytes_to_read) {\r\n\t\tpMemFile->bytes_to_read -= lDist;\r\n\t\tpMemFile->dist += lDist;\r\n\t} else\r\n\t\tpMemFile->bytes_to_read = 0;\r\n\tpMemFile->offset += lDist;\r\n\treturn pMemFile->offset;\r\n}\r\n\r\nstatic BOOL ReadWaveSection(MEMFILE *pMemFile, DWORD id, CKINFO *chunk)\r\n{\r\n\tDWORD hdr[2];\r\n\r\n\twhile (1) {\r\n\t\tif (!ReadMemFile(pMemFile, hdr, sizeof(hdr)))\r\n\t\t\treturn FALSE;\r\n\t\tif (hdr[0] == id)\r\n\t\t\tbreak;\r\n\t\tif (SeekMemFile(pMemFile, hdr[1], FILE_CURRENT) == -1)\r\n\t\t\treturn FALSE;\r\n\t}\r\n\r\n\tchunk->dwSize = hdr[1];\r\n\tchunk->dwOffset = SeekMemFile(pMemFile, 0, FILE_CURRENT);\r\n\treturn chunk->dwOffset != (DWORD)-1;\r\n}\r\n\r\nstatic BOOL ReadWaveFile(MEMFILE *pMemFile, WAVEFORMATEX *pwfx, CKINFO *chunk)\r\n{\r\n\tMMCKINFO hdr;\r\n\tCKINFO fmt;\r\n\tPCMWAVEFORMAT wf;\r\n\r\n\tif (!ReadMemFile(pMemFile, &hdr, 12))\r\n\t\treturn FALSE;\r\n\tif (hdr.ckid != FOURCC_RIFF || hdr.fccType != MAKEFOURCC('W', 'A', 'V', 'E'))\r\n\t\treturn FALSE;\r\n\tif (!ReadWaveSection(pMemFile, MAKEFOURCC('f', 'm', 't', ' '), &fmt))\r\n\t\treturn FALSE;\r\n\tif (fmt.dwSize < sizeof(PCMWAVEFORMAT))\r\n\t\treturn FALSE;\r\n\tif (!ReadMemFile(pMemFile, &wf, sizeof(wf)))\r\n\t\treturn FALSE;\r\n\tif (SeekMemFile(pMemFile, fmt.dwSize - sizeof(wf), FILE_CURRENT) == -1)\r\n\t\treturn FALSE;\r\n\r\n\tpwfx->cbSize = 0;\r\n\tpwfx->wFormatTag = wf.wf.wFormatTag;\r\n\tpwfx->nChannels = wf.wf.nChannels;\r\n\tpwfx->nSamplesPerSec = wf.wf.nSamplesPerSec;\r\n\tpwfx->nAvgBytesPerSec = wf.wf.nAvgBytesPerSec;\r\n\tpwfx->nBlockAlign = wf.wf.nBlockAlign;\r\n\tpwfx->wBitsPerSample = wf.wBitsPerSample;\r\n\tif (chunk == NULL)\r\n\t\treturn TRUE;\r\n\treturn ReadWaveSection(pMemFile, MAKEFOURCC('d', 'a', 't', 'a'), chunk);\r\n}\r\n\r\nBOOL LoadWaveFormat(HANDLE hsFile, WAVEFORMATEX *pwfx)\r\n{\r\n\tBOOL ret;\r\n\tMEMFILE wave_file;\r\n\r\n\tAllocateMemFile(hsFile, &wave_file, 0);\r\n\tret = ReadWaveFile(&wave_file, pwfx, NULL);\r\n\tFreeMemFile(&wave_file);\r\n\treturn ret;\r\n}\r\n\r\nvoid AllocateMemFile(HANDLE hsFile, MEMFILE *pMemFile, DWORD dwPos)\r\n{\r\n\tDWORD length;\r\n\r\n\tmemset(pMemFile, 0, sizeof(*pMemFile));\r\n\tpMemFile->end = WGetFileSize(hsFile, NULL);\r\n\tlength = 4096;\r\n\tif (dwPos > length)\r\n\t\tlength = dwPos;\r\n\tpMemFile->buf_len = length;\r\n\tif (length >= pMemFile->end)\r\n\t\tlength = pMemFile->end;\r\n\tpMemFile->buf_len = length;\r\n\tpMemFile->buf = DiabloAllocPtr(length);\r\n\tpMemFile->file = hsFile;\r\n}\r\n\r\nBYTE *LoadWaveFile(HANDLE hsFile, WAVEFORMATEX *pwfx, CKINFO *chunk)\r\n{\r\n\tMEMFILE wave_file;\r\n\r\n\tAllocateMemFile(hsFile, &wave_file, (DWORD)-1);\r\n\tif (!ReadWaveFile(&wave_file, pwfx, chunk)) {\r\n\t\tFreeMemFile(&wave_file);\r\n\t\treturn NULL;\r\n\t}\r\n\treturn wave_file.buf;\r\n}\r\n"
  },
  {
    "path": "Source/wave.h",
    "content": "/**\r\n * @file wave.h\r\n *\r\n * Interface of functionality for loading files and processing wave files.\r\n */\r\n#ifndef __WAVE_H__\r\n#define __WAVE_H__\r\n\r\nvoid WCloseFile(HANDLE file);\r\nLONG WGetFileSize(HANDLE hsFile, DWORD *lpFileSizeHigh);\r\nBOOL WOpenFile(const char *FileName, HANDLE *phsFile, BOOL mayNotExist);\r\nvoid WReadFile(HANDLE hsFile, LPVOID buf, DWORD to_read);\r\nint WSetFilePointer(HANDLE file1, int offset, HANDLE file2, int whence);\r\nBOOL LoadWaveFormat(HANDLE hsFile, WAVEFORMATEX *pwfx);\r\nvoid AllocateMemFile(HANDLE hsFile, MEMFILE *pMemFile, DWORD dwPos);\r\nBYTE *LoadWaveFile(HANDLE hsFile, WAVEFORMATEX *pwfx, CKINFO *chunk);\r\n\r\n#endif /* __WAVE_H__ */\r\n"
  },
  {
    "path": "appveyor.yml",
    "content": "version: 1.0.{build}\npull_requests:\n  do_not_increment_build_number: true\nclone_depth: 1\nimage: Visual Studio 2017\nconfiguration: Release\nplatform: x86\nbuild:\n  project: Diablo.sln\n  verbosity: minimal\nartifacts:\n  - path: Source\\WinRel\\Diablo.exe\n    name: Diablo.exe\n"
  },
  {
    "path": "comparer-config/diablo.toml",
    "content": "# conversion between function and file location of the functions\n# = (0x401000 - PE header offset) (0x400 for VC5 linker)\naddress_offset = 0x400C00\n\n[[func]]\nname = \"operator delete\"\naddr = 0x401010\nsize = 0x1A\n\n[[func]]\nname = \"GetErrorStr\"\naddr = 0x40102A\nsize = 0xA4\n\n[[func]]\nname = \"TraceErrorDD\"\naddr = 0x4010CE\nsize = 0x6B8\n\n[[func]]\nname = \"TraceErrorDS\"\naddr = 0x401831\nsize = 0x109\n\n[[func]]\nname = \"TraceLastError\"\naddr = 0x40193A\nsize = 0xD\n\n[[func]]\nname = \"app_fatal\"\naddr = 0x401947\nsize = 0x2E\n\n[[func]]\nname = \"MsgBox\"\naddr = 0x401975\nsize = 0x52\n\n[[func]]\nname = \"FreeDlg\"\naddr = 0x4019C7\nsize = 0x69\n\n[[func]]\nname = \"DrawDlg\"\naddr = 0x401A30\nsize = 0x35\n\n[[func]]\nname = \"DDErrMsg\"\naddr = 0x401A65\nsize = 0x23\n\n[[func]]\nname = \"DSErrMsg\"\naddr = 0x401A88\nsize = 0x23\n\n[[func]]\nname = \"center_window\"\naddr = 0x401AAB\nsize = 0x92\n\n[[func]]\nname = \"ErrDlg\"\naddr = 0x401B3D\nsize = 0x8D\n\n[[func]]\nname = \"FuncDlg\"\naddr = 0x401BCA\nsize = 0x45\n\n[[func]]\nname = \"TextDlg\"\naddr = 0x401C0F\nsize = 0x1F\n\n[[func]]\nname = \"ErrOkDlg\"\naddr = 0x401C2E\nsize = 0x6E\n\n[[func]]\nname = \"FileErrDlg\"\naddr = 0x401C9C\nsize = 0x45\n\n[[func]]\nname = \"DiskFreeDlg\"\naddr = 0x401CE1\nsize = 0x3C\n\n[[func]]\nname = \"InsertCDDlg\"\naddr = 0x401D1D\nsize = 0x4B\n\n[[func]]\nname = \"DirErrorDlg\"\naddr = 0x401D68\nsize = 0x3C\n\n[[func]]\nname = \"InitAutomapOnce\"\naddr = 0x401DA4\nsize = 0x44\n\n[[func]]\nname = \"InitAutomap\"\naddr = 0x401DE8\nsize = 0x10C\n\n[[func]]\nname = \"StartAutomap\"\naddr = 0x401EF4\nsize = 0x19\n\n[[func]]\nname = \"AutomapUp\"\naddr = 0x401F0D\nsize = 0xD\n\n[[func]]\nname = \"AutomapDown\"\naddr = 0x401F1A\nsize = 0xD\n\n[[func]]\nname = \"AutomapLeft\"\naddr = 0x401F27\nsize = 0xD\n\n[[func]]\nname = \"AutomapRight\"\naddr = 0x401F34\nsize = 0xD\n\n[[func]]\nname = \"AutomapZoomIn\"\naddr = 0x401F41\nsize = 0x3F\n\n[[func]]\nname = \"AutomapZoomOut\"\naddr = 0x401F80\nsize = 0x3D\n\n[[func]]\nname = \"DrawAutomap\"\naddr = 0x401FBD\nsize = 0x276\n\n[[func]]\nname = \"DrawAutomapTile\"\naddr = 0x402233\nsize = 0x745\n\n[[func]]\nname = \"DrawAutomapPlr\"\naddr = 0x4029A8\nsize = 0x3BB\n\n[[func]]\nname = \"GetAutomapType\"\naddr = 0x402D83\nsize = 0xC7\n\n[[func]]\nname = \"DrawAutomapText\"\naddr = 0x402E4A\nsize = 0xDD\n\n[[func]]\nname = \"SetAutomapView\"\naddr = 0x402F27\nsize = 0x1B6\n\n[[func]]\nname = \"AutomapZoomReset\"\naddr = 0x4030DD\nsize = 0x3E\n\n[[func]]\nname = \"CaptureScreen\"\naddr = 0x40311B\nsize = 0xE9\n\n[[func]]\nname = \"CaptureHdr\"\naddr = 0x403204\nsize = 0x90\n\n[[func]]\nname = \"CapturePal\"\naddr = 0x403294\nsize = 0x69\n\n[[func]]\nname = \"CapturePix\"\naddr = 0x4032FD\nsize = 0x6D\n\n[[func]]\nname = \"CaptureEnc\"\naddr = 0x40336A\nsize = 0x3E\n\n[[func]]\nname = \"CaptureFile\"\naddr = 0x4033A8\nsize = 0xC8\n\n[[func]]\nname = \"RedPalette\"\naddr = 0x403470\nsize = 0x69\n\n[[func]]\nname = \"codec_decode\"\naddr = 0x4034D9\nsize = 0xFD\n\n[[func]]\nname = \"codec_init_key\"\naddr = 0x4035DB\nsize = 0xD1\n\n[[func]]\nname = \"codec_get_encoded_len\"\naddr = 0x4036AC\nsize = 0x12\n\n[[func]]\nname = \"codec_encode\"\naddr = 0x4036BE\nsize = 0x116\n\n[[func]]\nname = \"DrawSpellCel\"\naddr = 0x4037D4\nsize = 0xAA\n\n[[func]]\nname = \"SetSpellTrans\"\naddr = 0x40387E\nsize = 0x149\n\n[[func]]\nname = \"DrawSpell\"\naddr = 0x4039C7\nsize = 0xC7\n\n[[func]]\nname = \"DrawSpellList\"\naddr = 0x403A8E\nsize = 0x4DB\n\n[[func]]\nname = \"SetSpell\"\naddr = 0x403F69\nsize = 0x43\n\n[[func]]\nname = \"SetSpeedSpell\"\naddr = 0x403FAC\nsize = 0x6B\n\n[[func]]\nname = \"ToggleSpell\"\naddr = 0x404017\nsize = 0xC3\n\n[[func]]\nname = \"PrintChar\"\naddr = 0x4040DA\nsize = 0x13E\n\n[[func]]\nname = \"AddPanelString\"\naddr = 0x404218\nsize = 0x32\n\n[[func]]\nname = \"ClearPanel\"\naddr = 0x40424A\nsize = 0xF\n\n[[func]]\nname = \"DrawPanelBox\"\naddr = 0x404259\nsize = 0x6C\n\n[[func]]\nname = \"SetFlaskHeight\"\naddr = 0x4042CA\nsize = 0x51\n\n[[func]]\nname = \"DrawFlask\"\naddr = 0x40431B\nsize = 0x40\n\n[[func]]\nname = \"DrawLifeFlask\"\naddr = 0x40435B\nsize = 0x99\n\n[[func]]\nname = \"UpdateLifeFlask\"\naddr = 0x4043F4\nsize = 0x81\n\n[[func]]\nname = \"DrawManaFlask\"\naddr = 0x404475\nsize = 0x81\n\n[[func]]\nname = \"control_update_life_mana\"\naddr = 0x4044F6\nsize = 0x74\n\n[[func]]\nname = \"UpdateManaFlask\"\naddr = 0x40456A\nsize = 0xAC\n\n[[func]]\nname = \"InitControlPan\"\naddr = 0x404616\nsize = 0x31E\n\n[[func]]\nname = \"DrawCtrlPan\"\naddr = 0x404934\nsize = 0x25\n\n[[func]]\nname = \"DrawCtrlBtns\"\naddr = 0x404959\nsize = 0xB1\n\n[[func]]\nname = \"DoSpeedBook\"\naddr = 0x404A0A\nsize = 0x148\n\n[[func]]\nname = \"DoPanBtn\"\naddr = 0x404B52\nsize = 0x99\n\n[[func]]\nname = \"control_set_button_down\"\naddr = 0x404BEB\nsize = 0x15\n\n[[func]]\nname = \"control_check_btn_press\"\naddr = 0x404C00\nsize = 0x74\n\n[[func]]\nname = \"DoAutoMap\"\naddr = 0x404C74\nsize = 0x2C\n\n[[func]]\nname = \"CheckPanelInfo\"\naddr = 0x404CA0\nsize = 0x344\n\n[[func]]\nname = \"CheckBtnUp\"\naddr = 0x404FE4\nsize = 0x17D\n\n[[func]]\nname = \"FreeControlPan\"\naddr = 0x405181\nsize = 0x114\n\n[[func]]\nname = \"control_WriteStringToBuffer\"\naddr = 0x405295\nsize = 0x33\n\n[[func]]\nname = \"DrawInfoBox\"\naddr = 0x4052C8\nsize = 0x289\n\n[[func]]\nname = \"PrintInfo\"\naddr = 0x405551\nsize = 0x6B\n\n[[func]]\nname = \"CPrintString\"\naddr = 0x4055BC\nsize = 0xC5\n\n[[func]]\nname = \"PrintGameStr\"\naddr = 0x405681\nsize = 0x57\n\n[[func]]\nname = \"DrawChr\"\naddr = 0x4056D8\nsize = 0x980\n\n[[func]]\nname = \"ADD_PlrStringXY\"\naddr = 0x406058\nsize = 0xB7\n\n[[func]]\nname = \"MY_PlrStringXY\"\naddr = 0x40610F\nsize = 0xBB\n\n[[func]]\nname = \"CheckLvlBtn\"\naddr = 0x4061CA\nsize = 0x36\n\n[[func]]\nname = \"ReleaseLvlBtn\"\naddr = 0x406200\nsize = 0x34\n\n[[func]]\nname = \"DrawLevelUpIcon\"\naddr = 0x406234\nsize = 0x46\n\n[[func]]\nname = \"CheckChrBtns\"\naddr = 0x40627A\nsize = 0xEC\n\n[[func]]\nname = \"ReleaseChrBtns\"\naddr = 0x406366\nsize = 0xA2\n\n[[func]]\nname = \"DrawDurIcon\"\naddr = 0x406408\nsize = 0x86\n\n[[func]]\nname = \"DrawDurIcon4Item\"\naddr = 0x40648E\nsize = 0x7A\n\n[[func]]\nname = \"RedBack\"\naddr = 0x406508\nsize = 0x8A\n\n[[func]]\nname = \"GetSBookTrans\"\naddr = 0x406592\nsize = 0xD5\n\n[[func]]\nname = \"DrawSpellBook\"\naddr = 0x406667\nsize = 0x28D\n\n[[func]]\nname = \"PrintSBookStr\"\naddr = 0x4068F4\nsize = 0xC2\n\n[[func]]\nname = \"CheckSBook\"\naddr = 0x4069B6\nsize = 0x142\n\n[[func]]\nname = \"get_pieces_str\"\naddr = 0x406AF8\nsize = 0x10\n\n[[func]]\nname = \"DrawGoldSplit\"\naddr = 0x406B08\nsize = 0x138\n\n[[func]]\nname = \"control_drop_gold\"\naddr = 0x406C40\nsize = 0x12E\n\n[[func]]\nname = \"control_remove_gold\"\naddr = 0x406D6E\nsize = 0xB6\n\n[[func]]\nname = \"control_set_gold_curs\"\naddr = 0x406E24\nsize = 0x46\n\n[[func]]\nname = \"DrawTalkPan\"\naddr = 0x406E6A\nsize = 0x207\n\n[[func]]\nname = \"control_print_talk_msg\"\naddr = 0x407071\nsize = 0x82\n\n[[func]]\nname = \"control_check_talk_btn\"\naddr = 0x4070F3\nsize = 0x5A\n\n[[func]]\nname = \"control_release_talk_btn\"\naddr = 0x40714D\nsize = 0x73\n\n[[func]]\nname = \"control_reset_talk_msg\"\naddr = 0x4071C0\nsize = 0x3A\n\n[[func]]\nname = \"control_type_message\"\naddr = 0x4071FA\nsize = 0x47\n\n[[func]]\nname = \"control_reset_talk\"\naddr = 0x407241\nsize = 0x19\n\n[[func]]\nname = \"control_talk_last_key\"\naddr = 0x40725A\nsize = 0x40\n\n[[func]]\nname = \"control_presskeys\"\naddr = 0x40729A\nsize = 0x6A\n\n[[func]]\nname = \"control_press_enter\"\naddr = 0x407304\nsize = 0xBE\n\n[[func]]\nname = \"control_up_down\"\naddr = 0x4073C2\nsize = 0x48\n\n[[func]]\nname = \"InitCursor\"\naddr = 0x40740A\nsize = 0x16\n\n[[func]]\nname = \"FreeCursor\"\naddr = 0x407420\nsize = 0x17\n\n[[func]]\nname = \"SetICursor\"\naddr = 0x407437\nsize = 0x34\n\n[[func]]\nname = \"SetCursor_\"\naddr = 0x40746B\nsize = 0x23\n\n[[func]]\nname = \"NewCursor\"\naddr = 0x40748E\nsize = 0x5\n\n[[func]]\nname = \"InitLevelCursor\"\naddr = 0x407493\nsize = 0x3D\n\n[[func]]\nname = \"CheckTown\"\naddr = 0x4074D0\nsize = 0x12D\n\n[[func]]\nname = \"CheckRportal\"\naddr = 0x4075FD\nsize = 0x12C\n\n[[func]]\nname = \"CheckCursMove\"\naddr = 0x407729\nsize = 0xD7D\n\n[[func]]\nname = \"InitDead\"\naddr = 0x4084A6\nsize = 0x1B6\n\n[[func]]\nname = \"AddDead\"\naddr = 0x40865C\nsize = 0x21\n\n[[func]]\nname = \"SyncUniqDead\"\naddr = 0x40867D\nsize = 0x77\n\n[[func]]\nname = \"LoadDebugGFX\"\naddr = 0x4086F4\nsize = 0x1B\n\n[[func]]\nname = \"FreeDebugGFX\"\naddr = 0x40870F\nsize = 0x12\n\n[[func]]\nname = \"CheckDungeonClear\"\naddr = 0x408721\nsize = 0x90\n\n[[func]]\nname = \"FreeGameMem\"\naddr = 0x4087C1\nsize = 0x77\n\n[[func]]\nname = \"StartGame\"\naddr = 0x408838\nsize = 0xAA\n\n[[func]]\nname = \"run_game_loop\"\naddr = 0x4088E2\nsize = 0x1AA\n\n[[func]]\nname = \"start_game\"\naddr = 0x408A8C\nsize = 0x4F\n\n[[func]]\nname = \"free_game\"\naddr = 0x408ADB\nsize = 0x43\n\n[[func]]\nname = \"diablo_get_not_running\"\naddr = 0x408B1E\nsize = 0x2C\n\n[[func]]\nname = \"WinMain\"\naddr = 0x408B4A\nsize = 0x167\n\n[[func]]\nname = \"diablo_parse_flags\"\naddr = 0x408CB1\nsize = 0xB0\n\n[[func]]\nname = \"diablo_init_screen\"\naddr = 0x408D61\nsize = 0x50\n\n[[func]]\nname = \"diablo_find_window\"\naddr = 0x408DB1\nsize = 0x43\n\n[[func]]\nname = \"diablo_reload_process\"\naddr = 0x408DF4\nsize = 0x1DB\n\n[[func]]\nname = \"PressEscKey\"\naddr = 0x408FCF\nsize = 0x8F\n\n[[func]]\nname = \"DisableInputWndProc\"\naddr = 0x40905E\nsize = 0xD3\n\n[[func]]\nname = \"GM_Game\"\naddr = 0x409131\nsize = 0x281\n\n[[func]]\nname = \"LeftMouseDown\"\naddr = 0x4093B2\nsize = 0x1F3\n\n[[func]]\nname = \"LeftMouseCmd\"\naddr = 0x4095A5\nsize = 0x247\n\n[[func]]\nname = \"TryIconCurs\"\naddr = 0x4097EC\nsize = 0x177\n\n[[func]]\nname = \"LeftMouseUp\"\naddr = 0x409963\nsize = 0x45\n\n[[func]]\nname = \"RightMouseDown\"\naddr = 0x4099A8\nsize = 0xE1\n\n[[func]]\nname = \"PressSysKey\"\naddr = 0x409A8E\nsize = 0x22\n\n[[func]]\nname = \"diablo_hotkey_msg\"\naddr = 0x409AB0\nsize = 0xA1\n\n[[func]]\nname = \"ReleaseKey\"\naddr = 0x409B51\nsize = 0xB\n\n[[func]]\nname = \"PressKey\"\naddr = 0x409B5C\nsize = 0x3E7\n\n[[func]]\nname = \"diablo_pause_game\"\naddr = 0x409F43\nsize = 0x3C\n\n[[func]]\nname = \"PressChar\"\naddr = 0x409F7F\nsize = 0x364\n\n[[func]]\nname = \"LoadLvlGFX\"\naddr = 0x40A391\nsize = 0x123\n\n[[func]]\nname = \"LoadAllGFX\"\naddr = 0x40A4B4\nsize = 0x2D\n\n[[func]]\nname = \"CreateLevel\"\naddr = 0x40A4E1\nsize = 0xC3\n\n[[func]]\nname = \"LoadGameLevel\"\naddr = 0x40A5A4\nsize = 0x53F\n\n[[func]]\nname = \"game_loop\"\naddr = 0x40AAE3\nsize = 0x50\n\n[[func]]\nname = \"game_logic\"\naddr = 0x40AB33\nsize = 0xB4\n\n[[func]]\nname = \"timeout_cursor\"\naddr = 0x40ABE7\nsize = 0x84\n\n[[func]]\nname = \"diablo_color_cyc_logic\"\naddr = 0x40AC6B\nsize = 0x42\n\n[[func]]\nname = \"doom_get_frame_from_time\"\naddr = 0x40ACAD\nsize = 0x19\n\n[[func]]\nname = \"doom_alloc_cel\"\naddr = 0x40ACC6\nsize = 0x10\n\n[[func]]\nname = \"doom_cleanup\"\naddr = 0x40ACD6\nsize = 0x12\n\n[[func]]\nname = \"doom_load_graphics\"\naddr = 0x40ACE8\nsize = 0x4C\n\n[[func]]\nname = \"doom_init\"\naddr = 0x40AD34\nsize = 0x2A\n\n[[func]]\nname = \"doom_close\"\naddr = 0x40AD5E\nsize = 0x16\n\n[[func]]\nname = \"doom_draw\"\naddr = 0x40AD74\nsize = 0x62\n\n[[func]]\nname = \"DRLG_Init_Globals\"\naddr = 0x40ADD6\nsize = 0xA3\n\n[[func]]\nname = \"LoadL1Dungeon\"\naddr = 0x40AE79\nsize = 0xEC\n\n[[func]]\nname = \"DRLG_L1Floor\"\naddr = 0x40AF65\nsize = 0x4E\n\n[[func]]\nname = \"DRLG_L1Pass3\"\naddr = 0x40AFB3\nsize = 0xF2\n\n[[func]]\nname = \"DRLG_InitL1Vals\"\naddr = 0x40B0A5\nsize = 0xBB\n\n[[func]]\nname = \"LoadPreL1Dungeon\"\naddr = 0x40B160\nsize = 0xC9\n\n[[func]]\nname = \"CreateL5Dungeon\"\naddr = 0x40B229\nsize = 0x4D\n\n[[func]]\nname = \"DRLG_LoadL1SP\"\naddr = 0x40B276\nsize = 0x7E\n\n[[func]]\nname = \"DRLG_FreeL1SP\"\naddr = 0x40B2F4\nsize = 0x12\n\n[[func]]\nname = \"DRLG_L5\"\naddr = 0x40B306\nsize = 0x269\n\n[[func]]\nname = \"DRLG_PlaceDoor\"\naddr = 0x40B56F\nsize = 0x12A\n\n[[func]]\nname = \"DRLG_L1Shadows\"\naddr = 0x40B699\nsize = 0x1E8\n\n[[func]]\nname = \"DRLG_PlaceMiniSet\"\naddr = 0x40B881\nsize = 0x275\n\n[[func]]\nname = \"InitL5Dungeon\"\naddr = 0x40BAF6\nsize = 0x22\n\n[[func]]\nname = \"L5ClearFlags\"\naddr = 0x40BB18\nsize = 0x1B\n\n[[func]]\nname = \"L5firstRoom\"\naddr = 0x40BB33\nsize = 0x233\n\n[[func]]\nname = \"L5drawRoom\"\naddr = 0x40BD66\nsize = 0x37\n\n[[func]]\nname = \"L5roomGen\"\naddr = 0x40BD9D\nsize = 0x207\n\n[[func]]\nname = \"L5checkRoom\"\naddr = 0x40BFA4\nsize = 0x64\n\n[[func]]\nname = \"L5GetArea\"\naddr = 0x40C008\nsize = 0x22\n\n[[func]]\nname = \"L5makeDungeon\"\naddr = 0x40C02A\nsize = 0x44\n\n[[func]]\nname = \"L5makeDmt\"\naddr = 0x40C06E\nsize = 0x72\n\n[[func]]\nname = \"L5AddWall\"\naddr = 0x40C0E0\nsize = 0x15C\n\n[[func]]\nname = \"L5HWallOk\"\naddr = 0x40C23C\nsize = 0xA0\n\n[[func]]\nname = \"L5VWallOk\"\naddr = 0x40C2DC\nsize = 0x7F\n\n[[func]]\nname = \"L5HorizWall\"\naddr = 0x40C35B\nsize = 0xEE\n\n[[func]]\nname = \"L5VertWall\"\naddr = 0x40C449\nsize = 0x108\n\n[[func]]\nname = \"L5tileFix\"\naddr = 0x40C551\nsize = 0x36F\n\n[[func]]\nname = \"DRLG_L5Subs\"\naddr = 0x40C8C0\nsize = 0xDD\n\n[[func]]\nname = \"L5FillChambers\"\naddr = 0x40C99D\nsize = 0x3E9\n\n[[func]]\nname = \"DRLG_L5GChamber\"\naddr = 0x40CD86\nsize = 0x141\n\n[[func]]\nname = \"DRLG_L5GHall\"\naddr = 0x40CEC7\nsize = 0x50\n\n[[func]]\nname = \"DRLG_L5SetRoom\"\naddr = 0x40CF17\nsize = 0x85\n\n[[func]]\nname = \"DRLG_L5FloodTVal\"\naddr = 0x40CF9C\nsize = 0x6F\n\n[[func]]\nname = \"DRLG_L5FTVR\"\naddr = 0x40D00B\nsize = 0x1F0\n\n[[func]]\nname = \"DRLG_L5TransFix\"\naddr = 0x40D1FB\nsize = 0x88\n\n[[func]]\nname = \"DRLG_L5DirtFix\"\naddr = 0x40D283\nsize = 0x6C\n\n[[func]]\nname = \"DRLG_L5CornerFix\"\naddr = 0x40D2EF\nsize = 0x68\n\n[[func]]\nname = \"InitDungeon\"\naddr = 0x40D357\nsize = 0x22\n\n[[func]]\nname = \"L2LockoutFix\"\naddr = 0x40D379\nsize = 0x153\n\n[[func]]\nname = \"L2DoorFix\"\naddr = 0x40D4CC\nsize = 0x35\n\n[[func]]\nname = \"LoadL2Dungeon\"\naddr = 0x40D501\nsize = 0x1C0\n\n[[func]]\nname = \"DRLG_L2Pass3\"\naddr = 0x40D6C1\nsize = 0xF2\n\n[[func]]\nname = \"LoadPreL2Dungeon\"\naddr = 0x40D7B3\nsize = 0xD5\n\n[[func]]\nname = \"CreateL2Dungeon\"\naddr = 0x40D888\nsize = 0xC7\n\n[[func]]\nname = \"DRLG_LoadL2SP\"\naddr = 0x40D94F\nsize = 0x55\n\n[[func]]\nname = \"DRLG_FreeL2SP\"\naddr = 0x40D9A4\nsize = 0x12\n\n[[func]]\nname = \"DRLG_L2\"\naddr = 0x40D9B6\nsize = 0x6BE\n\n[[func]]\nname = \"DRLG_L2PlaceMiniSet\"\naddr = 0x40E074\nsize = 0x25D\n\n[[func]]\nname = \"DRLG_L2PlaceRndSet\"\naddr = 0x40E2D1\nsize = 0x1CB\n\n[[func]]\nname = \"DRLG_L2Subs\"\naddr = 0x40E49C\nsize = 0x100\n\n[[func]]\nname = \"DRLG_L2Shadows\"\naddr = 0x40E59C\nsize = 0xCF\n\n[[func]]\nname = \"DRLG_L2SetRoom\"\naddr = 0x40E66B\nsize = 0x85\n\n[[func]]\nname = \"L2TileFix\"\naddr = 0x40E6F0\nsize = 0x5F\n\n[[func]]\nname = \"CreateDungeon\"\naddr = 0x40E74F\nsize = 0x155\n\n[[func]]\nname = \"CreateRoom\"\naddr = 0x40E8A4\nsize = 0x455\n\n[[func]]\nname = \"DefineRoom\"\naddr = 0x40ECF9\nsize = 0x124\n\n[[func]]\nname = \"AddHall\"\naddr = 0x40EE1D\nsize = 0x8F\n\n[[func]]\nname = \"GetHall\"\naddr = 0x40EEAC\nsize = 0x5D\n\n[[func]]\nname = \"ConnectHall\"\naddr = 0x40EF09\nsize = 0x35C\n\n[[func]]\nname = \"CreateDoorType\"\naddr = 0x40F265\nsize = 0x58\n\n[[func]]\nname = \"PlaceHallExt\"\naddr = 0x40F2BD\nsize = 0x13\n\n[[func]]\nname = \"DoPatternCheck\"\naddr = 0x40F2D0\nsize = 0x165\n\n[[func]]\nname = \"DL2_FillVoids\"\naddr = 0x40F459\nsize = 0x558\n\n[[func]]\nname = \"DL2_Cont\"\naddr = 0x40F9B1\nsize = 0x3D\n\n[[func]]\nname = \"DL2_NumNoChar\"\naddr = 0x40F9EE\nsize = 0x22\n\n[[func]]\nname = \"DL2_DrawRoom\"\naddr = 0x40FA10\nsize = 0x87\n\n[[func]]\nname = \"DL2_KnockWalls\"\naddr = 0x40FA97\nsize = 0xD5\n\n[[func]]\nname = \"DRLG_L2FloodTVal\"\naddr = 0x40FB6C\nsize = 0x6F\n\n[[func]]\nname = \"DRLG_L2FTVR\"\naddr = 0x40FBDB\nsize = 0x1F0\n\n[[func]]\nname = \"DRLG_L2TransFix\"\naddr = 0x40FDCB\nsize = 0x88\n\n[[func]]\nname = \"L2DirtFix\"\naddr = 0x40FE53\nsize = 0x6C\n\n[[func]]\nname = \"DRLG_InitL2Vals\"\naddr = 0x40FEBF\nsize = 0xC2\n\n[[func]]\nname = \"AddFenceDoors\"\naddr = 0x40FF81\nsize = 0x6B\n\n[[func]]\nname = \"FenceDoorFix\"\naddr = 0x40FFEC\nsize = 0x119\n\n[[func]]\nname = \"DRLG_L3Anvil\"\naddr = 0x410105\nsize = 0x110\n\n[[func]]\nname = \"FixL3Warp\"\naddr = 0x410215\nsize = 0x68\n\n[[func]]\nname = \"FixL3HallofHeroes\"\naddr = 0x41027D\nsize = 0x74\n\n[[func]]\nname = \"DRLG_L3LockRec\"\naddr = 0x4102F1\nsize = 0x53\n\n[[func]]\nname = \"DRLG_L3Lockout\"\naddr = 0x410344\nsize = 0x5D\n\n[[func]]\nname = \"CreateL3Dungeon\"\naddr = 0x4103A1\nsize = 0xAD\n\n[[func]]\nname = \"DRLG_L3\"\naddr = 0x41044E\nsize = 0x431\n\n[[func]]\nname = \"InitL3Dungeon\"\naddr = 0x41087F\nsize = 0x36\n\n[[func]]\nname = \"DRLG_L3FillRoom\"\naddr = 0x4108B5\nsize = 0x13B\n\n[[func]]\nname = \"DRLG_L3CreateBlock\"\naddr = 0x4109F0\nsize = 0x1D0\n\n[[func]]\nname = \"DRLG_L3FloorArea\"\naddr = 0x410BC0\nsize = 0x34\n\n[[func]]\nname = \"DRLG_L3FillDiags\"\naddr = 0x410BF4\nsize = 0x71\n\n[[func]]\nname = \"DRLG_L3FillSingles\"\naddr = 0x410C65\nsize = 0x5F\n\n[[func]]\nname = \"DRLG_L3FillStraights\"\naddr = 0x410CC4\nsize = 0x217\n\n[[func]]\nname = \"DRLG_L3Edges\"\naddr = 0x410EDB\nsize = 0x21\n\n[[func]]\nname = \"DRLG_L3GetFloorArea\"\naddr = 0x410EFC\nsize = 0x23\n\n[[func]]\nname = \"DRLG_L3MakeMegas\"\naddr = 0x410F1F\nsize = 0x8E\n\n[[func]]\nname = \"DRLG_L3River\"\naddr = 0x410FAD\nsize = 0x667\n\n[[func]]\nname = \"DRLG_L3Pool\"\naddr = 0x411614\nsize = 0x15E\n\n[[func]]\nname = \"DRLG_L3Spawn\"\naddr = 0x411772\nsize = 0x12A\n\n[[func]]\nname = \"DRLG_L3SpawnEdge\"\naddr = 0x41189C\nsize = 0x144\n\n[[func]]\nname = \"DRLG_L3PoolFix\"\naddr = 0x4119E0\nsize = 0x94\n\n[[func]]\nname = \"DRLG_L3PlaceMiniSet\"\naddr = 0x411A74\nsize = 0x20F\n\n[[func]]\nname = \"DRLG_L3PlaceRndSet\"\naddr = 0x411C83\nsize = 0x18B\n\n[[func]]\nname = \"DRLG_L3Wood\"\naddr = 0x411E0E\nsize = 0x430\n\n[[func]]\nname = \"WoodVertU\"\naddr = 0x41223E\nsize = 0x4C\n\n[[func]]\nname = \"WoodVertD\"\naddr = 0x41228A\nsize = 0x44\n\n[[func]]\nname = \"WoodHorizL\"\naddr = 0x4122CE\nsize = 0x4C\n\n[[func]]\nname = \"WoodHorizR\"\naddr = 0x41231A\nsize = 0x44\n\n[[func]]\nname = \"DRLG_L3Pass3\"\naddr = 0x41235E\nsize = 0x108\n\n[[func]]\nname = \"LoadL3Dungeon\"\naddr = 0x412466\nsize = 0x14A\n\n[[func]]\nname = \"LoadPreL3Dungeon\"\naddr = 0x4125B0\nsize = 0xA5\n\n[[func]]\nname = \"DRLG_LoadL4SP\"\naddr = 0x412655\nsize = 0x58\n\n[[func]]\nname = \"DRLG_FreeL4SP\"\naddr = 0x4126AD\nsize = 0x12\n\n[[func]]\nname = \"DRLG_L4SetSPRoom\"\naddr = 0x4126BF\nsize = 0x85\n\n[[func]]\nname = \"L4SaveQuads\"\naddr = 0x412744\nsize = 0x8F\n\n[[func]]\nname = \"DRLG_L4SetRoom\"\naddr = 0x4127D3\nsize = 0x5E\n\n[[func]]\nname = \"DRLG_LoadDiabQuads\"\naddr = 0x412831\nsize = 0x102\n\n[[func]]\nname = \"IsDURWall\"\naddr = 0x412933\nsize = 0x15\n\n[[func]]\nname = \"IsDLLWall\"\naddr = 0x412948\nsize = 0x15\n\n[[func]]\nname = \"L4FixRim\"\naddr = 0x41295D\nsize = 0x1E\n\n[[func]]\nname = \"DRLG_L4GeneralFix\"\naddr = 0x41297B\nsize = 0x35\n\n[[func]]\nname = \"CreateL4Dungeon\"\naddr = 0x4129B0\nsize = 0x50\n\n[[func]]\nname = \"DRLG_L4\"\naddr = 0x412A00\nsize = 0x3DD\n\n[[func]]\nname = \"DRLG_L4Shadows\"\naddr = 0x412DDD\nsize = 0x57\n\n[[func]]\nname = \"InitL4Dungeon\"\naddr = 0x412E34\nsize = 0x47\n\n[[func]]\nname = \"L4makeDmt\"\naddr = 0x412E7B\nsize = 0x50\n\n[[func]]\nname = \"L4AddWall\"\naddr = 0x412ECB\nsize = 0x2F7\n\n[[func]]\nname = \"L4HWallOk\"\naddr = 0x4131C2\nsize = 0xAE\n\n[[func]]\nname = \"L4VWallOk\"\naddr = 0x413270\nsize = 0x9B\n\n[[func]]\nname = \"L4HorizWall\"\naddr = 0x41330B\nsize = 0xCB\n\n[[func]]\nname = \"L4VertWall\"\naddr = 0x4133D6\nsize = 0xDE\n\n[[func]]\nname = \"L4tileFix\"\naddr = 0x4134B4\nsize = 0xE29\n\n[[func]]\nname = \"DRLG_L4Subs\"\naddr = 0x4142DD\nsize = 0xBD\n\n[[func]]\nname = \"L4makeDungeon\"\naddr = 0x41439A\nsize = 0x117\n\n[[func]]\nname = \"uShape\"\naddr = 0x4144B1\nsize = 0x133\n\n[[func]]\nname = \"GetArea\"\naddr = 0x4145E4\nsize = 0x22\n\n[[func]]\nname = \"L4firstRoom\"\naddr = 0x414606\nsize = 0x132\n\n[[func]]\nname = \"L4drawRoom\"\naddr = 0x414738\nsize = 0x37\n\n[[func]]\nname = \"L4roomGen\"\naddr = 0x41476F\nsize = 0x207\n\n[[func]]\nname = \"L4checkRoom\"\naddr = 0x414976\nsize = 0x6C\n\n[[func]]\nname = \"DRLG_L4PlaceMiniSet\"\naddr = 0x4149E2\nsize = 0x262\n\n[[func]]\nname = \"DRLG_L4FloodTVal\"\naddr = 0x414C44\nsize = 0x6F\n\n[[func]]\nname = \"DRLG_L4FTVR\"\naddr = 0x414CB3\nsize = 0x1F0\n\n[[func]]\nname = \"DRLG_L4TransFix\"\naddr = 0x414EA3\nsize = 0xB8\n\n[[func]]\nname = \"DRLG_L4Corners\"\naddr = 0x414F5B\nsize = 0x35\n\n[[func]]\nname = \"DRLG_L4Pass3\"\naddr = 0x414F90\nsize = 0x108\n\n[[func]]\nname = \"dthread_remove_player\"\naddr = 0x4150D6\nsize = 0x33\n\n[[func]]\nname = \"dthread_send_delta\"\naddr = 0x415109\nsize = 0x7D\n\n[[func]]\nname = \"dthread_start\"\naddr = 0x415186\nsize = 0x6D\n\n[[func]]\nname = \"dthread_handler\"\naddr = 0x4151F3\nsize = 0xCD\n\n[[func]]\nname = \"dthread_cleanup\"\naddr = 0x4152C0\nsize = 0xA2\n\n[[func]]\nname = \"dx_init\"\naddr = 0x4153A0\nsize = 0x115\n\n[[func]]\nname = \"dx_create_back_buffer\"\naddr = 0x4154B5\nsize = 0x10D\n\n[[func]]\nname = \"dx_create_primary_surface\"\naddr = 0x4155C2\nsize = 0x58\n\n[[func]]\nname = \"dx_DirectDrawCreate\"\naddr = 0x41561A\nsize = 0x7B\n\n[[func]]\nname = \"lock_buf\"\naddr = 0x415695\nsize = 0x5\n\n[[func]]\nname = \"lock_buf_priv\"\naddr = 0x41569A\nsize = 0x86\n\n[[func]]\nname = \"unlock_buf\"\naddr = 0x415720\nsize = 0x5\n\n[[func]]\nname = \"unlock_buf_priv\"\naddr = 0x415725\nsize = 0x7B\n\n[[func]]\nname = \"dx_cleanup\"\naddr = 0x4157A0\nsize = 0xA8\n\n[[func]]\nname = \"dx_reinit\"\naddr = 0x415848\nsize = 0x5C\n\n[[func]]\nname = \"effect_is_playing\"\naddr = 0x4158B9\nsize = 0x29\n\n[[func]]\nname = \"stream_stop\"\naddr = 0x4158E2\nsize = 0x29\n\n[[func]]\nname = \"InitMonsterSND\"\naddr = 0x41590B\nsize = 0xD0\n\n[[func]]\nname = \"FreeMonsterSnd\"\naddr = 0x4159DB\nsize = 0x6A\n\n[[func]]\nname = \"PlayEffect\"\naddr = 0x415A45\nsize = 0x9C\n\n[[func]]\nname = \"calc_snd_position\"\naddr = 0x415AE1\nsize = 0x78\n\n[[func]]\nname = \"PlaySFX\"\naddr = 0x415B59\nsize = 0x18\n\n[[func]]\nname = \"PlaySFX_priv\"\naddr = 0x415B71\nsize = 0xB9\n\n[[func]]\nname = \"stream_play\"\naddr = 0x415C2A\nsize = 0x6D\n\n[[func]]\nname = \"RndSFX\"\naddr = 0x415C97\nsize = 0x6A\n\n[[func]]\nname = \"PlaySfxLoc\"\naddr = 0x415D01\nsize = 0x38\n\n[[func]]\nname = \"sound_stop\"\naddr = 0x415D39\nsize = 0x61\n\n[[func]]\nname = \"sfx_stop\"\naddr = 0x415D9A\nsize = 0x20\n\n[[func]]\nname = \"sound_update\"\naddr = 0x415DBA\nsize = 0x16\n\n[[func]]\nname = \"stream_update\"\naddr = 0x415DD0\nsize = 0x2F\n\n[[func]]\nname = \"effects_cleanup_sfx\"\naddr = 0x415DFF\nsize = 0x2B\n\n[[func]]\nname = \"sound_init\"\naddr = 0x415E2A\nsize = 0x4D\n\n[[func]]\nname = \"priv_sound_init\"\naddr = 0x415E77\nsize = 0x61\n\n[[func]]\nname = \"ui_sound_init\"\naddr = 0x415ED8\nsize = 0x7\n\n[[func]]\nname = \"effects_play_sound\"\naddr = 0x415EDF\nsize = 0x64\n\n[[func]]\nname = \"Decrypt\"\naddr = 0x415F43\nsize = 0x4C\n\n[[func]]\nname = \"Encrypt\"\naddr = 0x415F8F\nsize = 0x50\n\n[[func]]\nname = \"Hash\"\naddr = 0x415FDF\nsize = 0x4F\n\n[[func]]\nname = \"InitHash\"\naddr = 0x41602E\nsize = 0x6F\n\n[[func]]\nname = \"PkwareCompress\"\naddr = 0x41609D\nsize = 0x96\n\n[[func]]\nname = \"PkwareBufferRead\"\naddr = 0x416133\nsize = 0x34\n\n[[func]]\nname = \"PkwareBufferWrite\"\naddr = 0x416167\nsize = 0x27\n\n[[func]]\nname = \"PkwareDecompress\"\naddr = 0x41618E\nsize = 0x6E\n\n[[func]]\nname = \"CelBlit\"\naddr = 0x41620C\nsize = 0x68\n\n[[func]]\nname = \"CelDraw\"\naddr = 0x416274\nsize = 0x44\n\n[[func]]\nname = \"CelBlitFrame\"\naddr = 0x4162B8\nsize = 0x26\n\n[[func]]\nname = \"CelClippedDraw\"\naddr = 0x4162DE\nsize = 0x7B\n\n[[func]]\nname = \"CelClippedBlit\"\naddr = 0x416359\nsize = 0x53\n\n[[func]]\nname = \"CelBlitLight\"\naddr = 0x4163AC\nsize = 0xDC\n\n[[func]]\nname = \"CelBlitLightTrans\"\naddr = 0x416488\nsize = 0xDD\n\n[[func]]\nname = \"CelDrawLight\"\naddr = 0x416565\nsize = 0x58\n\n[[func]]\nname = \"CelClippedDrawLight\"\naddr = 0x4165BD\nsize = 0x8E\n\n[[func]]\nname = \"CelClippedBlitLightTrans\"\naddr = 0x41664B\nsize = 0x74\n\n[[func]]\nname = \"CelDrawLightRed\"\naddr = 0x4166BF\nsize = 0x11C\n\n[[func]]\nname = \"CelBlitSafe\"\naddr = 0x4167DB\nsize = 0x7F\n\n[[func]]\nname = \"CelClippedDrawSafe\"\naddr = 0x41685A\nsize = 0x7B\n\n[[func]]\nname = \"CelClippedBlitSafe\"\naddr = 0x4168D5\nsize = 0x55\n\n[[func]]\nname = \"CelBlitLightSafe\"\naddr = 0x41692A\nsize = 0xF7\n\n[[func]]\nname = \"CelBlitLightTransSafe\"\naddr = 0x416A21\nsize = 0xF8\n\n[[func]]\nname = \"CelDrawLightSafe\"\naddr = 0x416B19\nsize = 0x90\n\n[[func]]\nname = \"CelClippedBlitLightTransSafe\"\naddr = 0x416BA9\nsize = 0x72\n\n[[func]]\nname = \"CelDrawLightRedSafe\"\naddr = 0x416C1B\nsize = 0x121\n\n[[func]]\nname = \"CelBlitWidth\"\naddr = 0x416D3C\nsize = 0x8A\n\n[[func]]\nname = \"CelBlitOutline\"\naddr = 0x416DC6\nsize = 0xFA\n\n[[func]]\nname = \"CelBlitOutlineSafe\"\naddr = 0x416EC0\nsize = 0x12F\n\n[[func]]\nname = \"ENG_set_pixel\"\naddr = 0x416FEF\nsize = 0x45\n\n[[func]]\nname = \"engine_draw_pixel\"\naddr = 0x417034\nsize = 0x89\n\n[[func]]\nname = \"DrawLine\"\naddr = 0x4170BD\nsize = 0x3F6\n\n[[func]]\nname = \"GetDirection\"\naddr = 0x4174B3\nsize = 0x65\n\n[[func]]\nname = \"SetRndSeed\"\naddr = 0x417518\nsize = 0x14\n\n[[func]]\nname = \"GetRndSeed\"\naddr = 0x41752C\nsize = 0x1F\n\n[[func]]\nname = \"random_\"\naddr = 0x41754B\nsize = 0x22\n\n[[func]]\nname = \"DiabloAllocPtr\"\naddr = 0x41759B\nsize = 0x4D\n\n[[func]]\nname = \"mem_free_dbg\"\naddr = 0x4175E8\nsize = 0x30\n\n[[func]]\nname = \"LoadFileInMem\"\naddr = 0x417618\nsize = 0x5B\n\n[[func]]\nname = \"LoadFileWithMem\"\naddr = 0x417673\nsize = 0x5F\n\n[[func]]\nname = \"Cl2ApplyTrans\"\naddr = 0x4176D2\nsize = 0x73\n\n[[func]]\nname = \"Cl2Draw\"\naddr = 0x417745\nsize = 0x7A\n\n[[func]]\nname = \"Cl2Blit\"\naddr = 0x4177BF\nsize = 0x88\n\n[[func]]\nname = \"Cl2DrawOutline\"\naddr = 0x417847\nsize = 0x7E\n\n[[func]]\nname = \"Cl2BlitOutline\"\naddr = 0x4178C5\nsize = 0xBC\n\n[[func]]\nname = \"Cl2DrawLightTbl\"\naddr = 0x417981\nsize = 0xC3\n\n[[func]]\nname = \"Cl2BlitLight\"\naddr = 0x417A44\nsize = 0xA5\n\n[[func]]\nname = \"Cl2DrawLight\"\naddr = 0x417AE9\nsize = 0x9A\n\n[[func]]\nname = \"Cl2DrawSafe\"\naddr = 0x417B83\nsize = 0x7A\n\n[[func]]\nname = \"Cl2BlitSafe\"\naddr = 0x417BFD\nsize = 0x9C\n\n[[func]]\nname = \"Cl2DrawOutlineSafe\"\naddr = 0x417C99\nsize = 0x8F\n\n[[func]]\nname = \"Cl2BlitOutlineSafe\"\naddr = 0x417D28\nsize = 0xD0\n\n[[func]]\nname = \"Cl2DrawLightTblSafe\"\naddr = 0x417DF8\nsize = 0xC3\n\n[[func]]\nname = \"Cl2BlitLightSafe\"\naddr = 0x417EBB\nsize = 0xBD\n\n[[func]]\nname = \"Cl2DrawLightSafe\"\naddr = 0x417F78\nsize = 0x9A\n\n[[func]]\nname = \"PlayInGameMovie\"\naddr = 0x418012\nsize = 0x3C\n\n[[func]]\nname = \"InitDiabloMsg\"\naddr = 0x41804E\nsize = 0x41\n\n[[func]]\nname = \"ClrDiabloMsg\"\naddr = 0x41808F\nsize = 0x1B\n\n[[func]]\nname = \"DrawDiabloMsg\"\naddr = 0x4180AA\nsize = 0x203\n\n[[func]]\nname = \"fault_init_filter\"\naddr = 0x4182B7\nsize = 0xA\n\n[[func]]\nname = \"fault_cleanup_filter_atexit\"\naddr = 0x4182C1\nsize = 0xC\n\n[[func]]\nname = \"fault_cleanup_filter\"\naddr = 0x4182CD\nsize = 0xA\n\n[[func]]\nname = \"TopLevelExceptionFilter\"\naddr = 0x4182D7\nsize = 0x17E\n\n[[func]]\nname = \"fault_hex_format\"\naddr = 0x418455\nsize = 0xC3\n\n[[func]]\nname = \"fault_unknown_module\"\naddr = 0x418518\nsize = 0xE7\n\n[[func]]\nname = \"fault_call_stack\"\naddr = 0x4185FF\nsize = 0x89\n\n[[func]]\nname = \"fault_get_error_type\"\naddr = 0x418688\nsize = 0x190\n\n[[func]]\nname = \"fault_set_filter\"\naddr = 0x41883C\nsize = 0x17\n\n[[func]]\nname = \"fault_reset_filter\"\naddr = 0x418853\nsize = 0xD\n\n[[func]]\nname = \"fault_get_filter\"\naddr = 0x418860\nsize = 0x6\n\n[[func]]\nname = \"gamemenu_on\"\naddr = 0x418866\nsize = 0x29\n\n[[func]]\nname = \"gamemenu_update_single\"\naddr = 0x41888F\nsize = 0x39\n\n[[func]]\nname = \"gamemenu_update_multi\"\naddr = 0x4188C8\nsize = 0x10\n\n[[func]]\nname = \"gamemenu_off\"\naddr = 0x4188D8\nsize = 0x9\n\n[[func]]\nname = \"gamemenu_handle_previous\"\naddr = 0x4188E1\nsize = 0x13\n\n[[func]]\nname = \"gamemenu_previous\"\naddr = 0x4188F4\nsize = 0x5\n\n[[func]]\nname = \"gamemenu_new_game\"\naddr = 0x4188F9\nsize = 0x42\n\n[[func]]\nname = \"gamemenu_quit_game\"\naddr = 0x41893B\nsize = 0xD\n\n[[func]]\nname = \"gamemenu_load_game\"\naddr = 0x418948\nsize = 0x76\n\n[[func]]\nname = \"gamemenu_save_game\"\naddr = 0x4189BE\nsize = 0x84\n\n[[func]]\nname = \"gamemenu_restart_town\"\naddr = 0x418A42\nsize = 0xA\n\n[[func]]\nname = \"gamemenu_options\"\naddr = 0x418A4C\nsize = 0x20\n\n[[func]]\nname = \"gamemenu_get_music\"\naddr = 0x418A6C\nsize = 0x19\n\n[[func]]\nname = \"gamemenu_sound_music_toggle\"\naddr = 0x418A85\nsize = 0x41\n\n[[func]]\nname = \"gamemenu_get_sound\"\naddr = 0x418AC6\nsize = 0x19\n\n[[func]]\nname = \"gamemenu_get_color_cycling\"\naddr = 0x418ADF\nsize = 0x15\n\n[[func]]\nname = \"gamemenu_get_gamma\"\naddr = 0x418AF4\nsize = 0x26\n\n[[func]]\nname = \"gamemenu_music_volume\"\naddr = 0x418B1A\nsize = 0x89\n\n[[func]]\nname = \"gamemenu_slider_music_sound\"\naddr = 0x418BA3\nsize = 0xD\n\n[[func]]\nname = \"gamemenu_sound_volume\"\naddr = 0x418BB0\nsize = 0x80\n\n[[func]]\nname = \"gamemenu_gamma\"\naddr = 0x418C30\nsize = 0x2A\n\n[[func]]\nname = \"gamemenu_slider_gamma\"\naddr = 0x418C5A\nsize = 0x10\n\n[[func]]\nname = \"gamemenu_color_cycling\"\naddr = 0x418C6A\nsize = 0x21\n\n[[func]]\nname = \"FillSolidBlockTbls\"\naddr = 0x418C8B\nsize = 0x106\n\n[[func]]\nname = \"MakeSpeedCels\"\naddr = 0x418D91\nsize = 0x42E\n\n[[func]]\nname = \"SortTiles\"\naddr = 0x4191BF\nsize = 0x3C\n\n[[func]]\nname = \"SwapTile\"\naddr = 0x4191FB\nsize = 0x7F\n\n[[func]]\nname = \"IsometricCoord\"\naddr = 0x41927A\nsize = 0x48\n\n[[func]]\nname = \"SetSpeedCels\"\naddr = 0x4192C2\nsize = 0x49\n\n[[func]]\nname = \"SetDungeonMicros\"\naddr = 0x41930B\nsize = 0x13F\n\n[[func]]\nname = \"DRLG_InitTrans\"\naddr = 0x41944A\nsize = 0x2D\n\n[[func]]\nname = \"DRLG_MRectTrans\"\naddr = 0x419477\nsize = 0x59\n\n[[func]]\nname = \"DRLG_RectTrans\"\naddr = 0x4194D0\nsize = 0x45\n\n[[func]]\nname = \"DRLG_CopyTrans\"\naddr = 0x419515\nsize = 0x1F\n\n[[func]]\nname = \"DRLG_ListTrans\"\naddr = 0x419534\nsize = 0x31\n\n[[func]]\nname = \"DRLG_AreaTrans\"\naddr = 0x419565\nsize = 0x3D\n\n[[func]]\nname = \"DRLG_InitSetPC\"\naddr = 0x4195A2\nsize = 0x17\n\n[[func]]\nname = \"DRLG_SetPC\"\naddr = 0x4195B9\nsize = 0x53\n\n[[func]]\nname = \"Make_SetPC\"\naddr = 0x41960C\nsize = 0x4F\n\n[[func]]\nname = \"DRLG_WillThemeRoomFit\"\naddr = 0x41965B\nsize = 0x199\n\n[[func]]\nname = \"DRLG_CreateThemeRoom\"\naddr = 0x4197F4\nsize = 0x41C\n\n[[func]]\nname = \"DRLG_PlaceThemeRooms\"\naddr = 0x419C10\nsize = 0x182\n\n[[func]]\nname = \"DRLG_HoldThemeRooms\"\naddr = 0x419D92\nsize = 0x8D\n\n[[func]]\nname = \"SkipThemeRoom\"\naddr = 0x419E1F\nsize = 0x52\n\n[[func]]\nname = \"InitLevels\"\naddr = 0x419E71\nsize = 0x1A\n\n[[func]]\nname = \"gmenu_draw_pause\"\naddr = 0x419E8B\nsize = 0x33\n\n[[func]]\nname = \"gmenu_print_text\"\naddr = 0x419EBE\nsize = 0x59\n\n[[func]]\nname = \"FreeGMenu\"\naddr = 0x419F17\nsize = 0x59\n\n[[func]]\nname = \"gmenu_init_menu\"\naddr = 0x419F70\nsize = 0x78\n\n[[func]]\nname = \"gmenu_is_active\"\naddr = 0x419FE8\nsize = 0xC\n\n[[func]]\nname = \"gmenu_set_items\"\naddr = 0x419FF4\nsize = 0x5A\n\n[[func]]\nname = \"gmenu_up_down\"\naddr = 0x41A04E\nsize = 0x68\n\n[[func]]\nname = \"gmenu_draw\"\naddr = 0x41A0B6\nsize = 0x8F\n\n[[func]]\nname = \"gmenu_draw_menu_item\"\naddr = 0x41A145\nsize = 0xF4\n\n[[func]]\nname = \"gmenu_clear_buffer\"\naddr = 0x41A239\nsize = 0x39\n\n[[func]]\nname = \"gmenu_get_lfont\"\naddr = 0x41A272\nsize = 0x3C\n\n[[func]]\nname = \"gmenu_presskeys\"\naddr = 0x41A2AE\nsize = 0x7C\n\n[[func]]\nname = \"gmenu_left_right\"\naddr = 0x41A32A\nsize = 0x50\n\n[[func]]\nname = \"gmenu_on_mouse_move\"\naddr = 0x41A37A\nsize = 0x58\n\n[[func]]\nname = \"gmenu_get_mouse_slider\"\naddr = 0x41A3D2\nsize = 0x2F\n\n[[func]]\nname = \"gmenu_left_mouse\"\naddr = 0x41A401\nsize = 0xB7\n\n[[func]]\nname = \"gmenu_enable\"\naddr = 0x41A4B8\nsize = 0xE\n\n[[func]]\nname = \"gmenu_slider_set\"\naddr = 0x41A4C6\nsize = 0x42\n\n[[func]]\nname = \"gmenu_slider_get\"\naddr = 0x41A508\nsize = 0x3D\n\n[[func]]\nname = \"gmenu_slider_steps\"\naddr = 0x41A545\nsize = 0xE\n\n[[func]]\nname = \"InitHelp\"\naddr = 0x41A553\nsize = 0x12\n\n[[func]]\nname = \"DrawHelp\"\naddr = 0x41A565\nsize = 0x195\n\n[[func]]\nname = \"DrawHelpLine\"\naddr = 0x41A6FA\nsize = 0x79\n\n[[func]]\nname = \"DisplayHelp\"\naddr = 0x41A773\nsize = 0x1C\n\n[[func]]\nname = \"HelpScrollUp\"\naddr = 0x41A78F\nsize = 0x10\n\n[[func]]\nname = \"HelpScrollDown\"\naddr = 0x41A79F\nsize = 0x14\n\n[[func]]\nname = \"init_cleanup\"\naddr = 0x41A7C3\nsize = 0x89\n\n[[func]]\nname = \"init_run_office_from_start_menu\"\naddr = 0x41A84C\nsize = 0x6D\n\n[[func]]\nname = \"init_run_office\"\naddr = 0x41A8B9\nsize = 0x173\n\n[[func]]\nname = \"init_disable_screensaver\"\naddr = 0x41AA2C\nsize = 0x99\n\n[[func]]\nname = \"init_create_window\"\naddr = 0x41AAC5\nsize = 0x13B\n\n[[func]]\nname = \"init_kill_mom_parent\"\naddr = 0x41AC00\nsize = 0x21\n\n[[func]]\nname = \"init_find_mom_parent\"\naddr = 0x41AC21\nsize = 0x50\n\n[[func]]\nname = \"init_await_mom_parent_exit\"\naddr = 0x41AC71\nsize = 0x30\n\n[[func]]\nname = \"init_archives\"\naddr = 0x41ACA1\nsize = 0xD1\n\n[[func]]\nname = \"init_test_access\"\naddr = 0x41AD72\nsize = 0x1B0\n\n[[func]]\nname = \"init_strip_trailing_slash\"\naddr = 0x41AF22\nsize = 0x18\n\n[[func]]\nname = \"init_read_test_file\"\naddr = 0x41AF3A\nsize = 0x94\n\n[[func]]\nname = \"init_get_file_info\"\naddr = 0x41AFCE\nsize = 0x9E\n\n[[func]]\nname = \"MainWndProc\"\naddr = 0x41B06C\nsize = 0x99\n\n[[func]]\nname = \"init_activate_window\"\naddr = 0x41B105\nsize = 0x5A\n\n[[func]]\nname = \"WindowProc\"\naddr = 0x41B15F\nsize = 0x25\n\n[[func]]\nname = \"SetWindowProc\"\naddr = 0x41B184\nsize = 0xC\n\n[[func]]\nname = \"interface_msg_pump\"\naddr = 0x41B1A0\nsize = 0x3F\n\n[[func]]\nname = \"IncProgress\"\naddr = 0x41B1DF\nsize = 0x39\n\n[[func]]\nname = \"DrawCutscene\"\naddr = 0x41B218\nsize = 0x75\n\n[[func]]\nname = \"DrawProgress\"\naddr = 0x41B28D\nsize = 0x29\n\n[[func]]\nname = \"ShowProgress\"\naddr = 0x41B2B6\nsize = 0x317\n\n[[func]]\nname = \"FreeInterface\"\naddr = 0x41B5F5\nsize = 0x12\n\n[[func]]\nname = \"InitCutscene\"\naddr = 0x41B607\nsize = 0x1E5\n\n[[func]]\nname = \"FreeInvGFX\"\naddr = 0x41B814\nsize = 0x12\n\n[[func]]\nname = \"InitInv\"\naddr = 0x41B826\nsize = 0x4B\n\n[[func]]\nname = \"InvDrawSlotBack\"\naddr = 0x41B871\nsize = 0x53\n\n[[func]]\nname = \"DrawInv\"\naddr = 0x41B8C4\nsize = 0x79C\n\n[[func]]\nname = \"DrawInvBelt\"\naddr = 0x41C060\nsize = 0x1DF\n\n[[func]]\nname = \"AutoPlace\"\naddr = 0x41C23F\nsize = 0x134\n\n[[func]]\nname = \"SpecialAutoPlace\"\naddr = 0x41C373\nsize = 0x16D\n\n[[func]]\nname = \"GoldAutoPlace\"\naddr = 0x41C4E0\nsize = 0x1C9\n\n[[func]]\nname = \"WeaponAutoPlace\"\naddr = 0x41C6A9\nsize = 0x9D\n\n[[func]]\nname = \"SwapItem\"\naddr = 0x41C746\nsize = 0x3D\n\n[[func]]\nname = \"CheckInvPaste\"\naddr = 0x41C783\nsize = 0xB2C\n\n[[func]]\nname = \"CheckInvSwap\"\naddr = 0x41D2CF\nsize = 0xA9\n\n[[func]]\nname = \"CheckInvCut\"\naddr = 0x41D378\nsize = 0x373\n\n[[func]]\nname = \"inv_update_rem_item\"\naddr = 0x41D6EB\nsize = 0x37\n\n[[func]]\nname = \"RemoveInvItem\"\naddr = 0x41D722\nsize = 0xEE\n\n[[func]]\nname = \"RemoveSpdBarItem\"\naddr = 0x41D810\nsize = 0x5C\n\n[[func]]\nname = \"CheckInvItem\"\naddr = 0x41D86C\nsize = 0x27\n\n[[func]]\nname = \"CheckInvScrn\"\naddr = 0x41D893\nsize = 0x2C\n\n[[func]]\nname = \"CheckItemStats\"\naddr = 0x41D8BF\nsize = 0x4C\n\n[[func]]\nname = \"CheckBookLevel\"\naddr = 0x41D90B\nsize = 0x74\n\n[[func]]\nname = \"CheckQuestItem\"\naddr = 0x41D97F\nsize = 0x1E6\n\n[[func]]\nname = \"InvGetItem\"\naddr = 0x41DB65\nsize = 0x114\n\n[[func]]\nname = \"AutoGetItem\"\naddr = 0x41DC79\nsize = 0x48A\n\n[[func]]\nname = \"FindGetItem\"\naddr = 0x41E103\nsize = 0x55\n\n[[func]]\nname = \"SyncGetItem\"\naddr = 0x41E158\nsize = 0xCA\n\n[[func]]\nname = \"CanPut\"\naddr = 0x41E222\nsize = 0xD7\n\n[[func]]\nname = \"TryInvPut\"\naddr = 0x41E2F9\nsize = 0xC3\n\n[[func]]\nname = \"DrawInvMsg\"\naddr = 0x41E3BC\nsize = 0x28\n\n[[func]]\nname = \"InvPutItem\"\naddr = 0x41E3E4\nsize = 0x255\n\n[[func]]\nname = \"SyncPutItem\"\naddr = 0x41E639\nsize = 0x2A4\n\n[[func]]\nname = \"CheckInvHLight\"\naddr = 0x41E8DD\nsize = 0x20D\n\n[[func]]\nname = \"RemoveScroll\"\naddr = 0x41EAEA\nsize = 0xA1\n\n[[func]]\nname = \"UseScroll\"\naddr = 0x41EB8B\nsize = 0xB7\n\n[[func]]\nname = \"UseStaffCharge\"\naddr = 0x41EC42\nsize = 0x3D\n\n[[func]]\nname = \"UseStaff\"\naddr = 0x41EC7F\nsize = 0x44\n\n[[func]]\nname = \"StartGoldDrop\"\naddr = 0x41ECC3\nsize = 0x66\n\n[[func]]\nname = \"UseInvItem\"\naddr = 0x41ED29\nsize = 0x278\n\n[[func]]\nname = \"DoTelekinesis\"\naddr = 0x41EFA1\nsize = 0x72\n\n[[func]]\nname = \"CalculateGold\"\naddr = 0x41F013\nsize = 0x55\n\n[[func]]\nname = \"DropItemBeforeTrig\"\naddr = 0x41F068\nsize = 0x2E\n\n[[func]]\nname = \"InitItemGFX\"\naddr = 0x41F096\nsize = 0x52\n\n[[func]]\nname = \"ItemPlace\"\naddr = 0x41F0E8\nsize = 0x52\n\n[[func]]\nname = \"AddInitItems\"\naddr = 0x41F13A\nsize = 0x114\n\n[[func]]\nname = \"InitItems\"\naddr = 0x41F24E\nsize = 0xD2\n\n[[func]]\nname = \"CalcPlrItemVals\"\naddr = 0x41F320\nsize = 0x633\n\n[[func]]\nname = \"CalcPlrScrolls\"\naddr = 0x41F953\nsize = 0xF7\n\n[[func]]\nname = \"CalcPlrStaff\"\naddr = 0x41FA4A\nsize = 0x4D\n\n[[func]]\nname = \"CalcSelfItems\"\naddr = 0x41FA97\nsize = 0xFA\n\n[[func]]\nname = \"CalcPlrItemMin\"\naddr = 0x41FB91\nsize = 0x65\n\n[[func]]\nname = \"ItemMinStats\"\naddr = 0x41FBF6\nsize = 0x36\n\n[[func]]\nname = \"CalcPlrBookVals\"\naddr = 0x41FC2C\nsize = 0x112\n\n[[func]]\nname = \"CalcPlrInv\"\naddr = 0x41FD3E\nsize = 0x5A\n\n[[func]]\nname = \"SetPlrHandItem\"\naddr = 0x41FD98\nsize = 0x100\n\n[[func]]\nname = \"GetPlrHandSeed\"\naddr = 0x41FE98\nsize = 0xC\n\n[[func]]\nname = \"GetGoldSeed\"\naddr = 0x41FEA4\nsize = 0x72\n\n[[func]]\nname = \"SetPlrHandSeed\"\naddr = 0x41FF16\nsize = 0x3\n\n[[func]]\nname = \"SetPlrHandGoldCurs\"\naddr = 0x41FF19\nsize = 0x35\n\n[[func]]\nname = \"CreatePlrItems\"\naddr = 0x41FF4E\nsize = 0x1AA\n\n[[func]]\nname = \"ItemSpaceOk\"\naddr = 0x4200F8\nsize = 0xFA\n\n[[func]]\nname = \"GetItemSpace\"\naddr = 0x4201F2\nsize = 0xF6\n\n[[func]]\nname = \"GetSuperItemSpace\"\naddr = 0x4202E8\nsize = 0x8E\n\n[[func]]\nname = \"GetSuperItemLoc\"\naddr = 0x420376\nsize = 0x6A\n\n[[func]]\nname = \"CalcItemValue\"\naddr = 0x4203E0\nsize = 0x4C\n\n[[func]]\nname = \"GetBookSpell\"\naddr = 0x42042C\nsize = 0xE8\n\n[[func]]\nname = \"GetStaffPower\"\naddr = 0x420514\nsize = 0x1D1\n\n[[func]]\nname = \"GetStaffSpell\"\naddr = 0x4206E5\nsize = 0x165\n\n[[func]]\nname = \"GetItemAttrs\"\naddr = 0x42084A\nsize = 0x2CD\n\n[[func]]\nname = \"RndPL\"\naddr = 0x420B17\nsize = 0x11\n\n[[func]]\nname = \"PLVal\"\naddr = 0x420B28\nsize = 0x40\n\n[[func]]\nname = \"SaveItemPower\"\naddr = 0x420B68\nsize = 0x947\n\n[[func]]\nname = \"GetItemPower\"\naddr = 0x4215EF\nsize = 0x32D\n\n[[func]]\nname = \"GetItemBonus\"\naddr = 0x42191C\nsize = 0x7C\n\n[[func]]\nname = \"SetupItem\"\naddr = 0x4219C1\nsize = 0x8A\n\n[[func]]\nname = \"RndItem\"\naddr = 0x421A4B\nsize = 0xE7\n\n[[func]]\nname = \"RndUItem\"\naddr = 0x421B32\nsize = 0xF8\n\n[[func]]\nname = \"RndAllItems\"\naddr = 0x421C2A\nsize = 0x8D\n\n[[func]]\nname = \"RndTypeItems\"\naddr = 0x421CB7\nsize = 0x8A\n\n[[func]]\nname = \"CheckUnique\"\naddr = 0x421D41\nsize = 0xD0\n\n[[func]]\nname = \"GetUniqueItem\"\naddr = 0x421E11\nsize = 0x14B\n\n[[func]]\nname = \"SpawnUnique\"\naddr = 0x421F5C\nsize = 0x8A\n\n[[func]]\nname = \"ItemRndDur\"\naddr = 0x421FE6\nsize = 0x3E\n\n[[func]]\nname = \"SetupAllItems\"\naddr = 0x422024\nsize = 0x156\n\n[[func]]\nname = \"SpawnItem\"\naddr = 0x42217A\nsize = 0x116\n\n[[func]]\nname = \"CreateItem\"\naddr = 0x422290\nsize = 0x9B\n\n[[func]]\nname = \"CreateRndItem\"\naddr = 0x42232B\nsize = 0xA5\n\n[[func]]\nname = \"SetupAllUseful\"\naddr = 0x4223D0\nsize = 0x6D\n\n[[func]]\nname = \"CreateRndUseful\"\naddr = 0x42243D\nsize = 0x69\n\n[[func]]\nname = \"CreateTypeItem\"\naddr = 0x4224A6\nsize = 0xA4\n\n[[func]]\nname = \"RecreateItem\"\naddr = 0x42254A\nsize = 0x112\n\n[[func]]\nname = \"RecreateEar\"\naddr = 0x42265C\nsize = 0x139\n\n[[func]]\nname = \"SpawnQuestItem\"\naddr = 0x422795\nsize = 0x11C\n\n[[func]]\nname = \"SpawnRock\"\naddr = 0x4228B1\nsize = 0xD8\n\n[[func]]\nname = \"RespawnItem\"\naddr = 0x422989\nsize = 0xC7\n\n[[func]]\nname = \"DeleteItem\"\naddr = 0x422A50\nsize = 0x34\n\n[[func]]\nname = \"ItemDoppel\"\naddr = 0x422A84\nsize = 0x5A\n\n[[func]]\nname = \"ProcessItems\"\naddr = 0x422ADE\nsize = 0xD4\n\n[[func]]\nname = \"FreeItemGFX\"\naddr = 0x422BB2\nsize = 0x1D\n\n[[func]]\nname = \"GetItemFrm\"\naddr = 0x422BCF\nsize = 0x21\n\n[[func]]\nname = \"GetItemStr\"\naddr = 0x422BF0\nsize = 0x73\n\n[[func]]\nname = \"CheckIdentify\"\naddr = 0x422C63\nsize = 0x39\n\n[[func]]\nname = \"DoRepair\"\naddr = 0x422C9C\nsize = 0x5A\n\n[[func]]\nname = \"RepairItem\"\naddr = 0x422CF6\nsize = 0x76\n\n[[func]]\nname = \"DoRecharge\"\naddr = 0x422D6C\nsize = 0x71\n\n[[func]]\nname = \"RechargeItem\"\naddr = 0x422DDD\nsize = 0x37\n\n[[func]]\nname = \"PrintItemOil\"\naddr = 0x422E14\nsize = 0x98\n\n[[func]]\nname = \"PrintItemPower\"\naddr = 0x422EF4\nsize = 0x4FC\n\n[[func]]\nname = \"DrawUTextBack\"\naddr = 0x423530\nsize = 0x5C\n\n[[func]]\nname = \"PrintUString\"\naddr = 0x42358C\nsize = 0xCF\n\n[[func]]\nname = \"DrawULine\"\naddr = 0x42365B\nsize = 0x4B\n\n[[func]]\nname = \"DrawUniqueInfo\"\naddr = 0x4236A6\nsize = 0x136\n\n[[func]]\nname = \"PrintItemMisc\"\naddr = 0x4237DC\nsize = 0xF8\n\n[[func]]\nname = \"PrintItemDetails\"\naddr = 0x4238D4\nsize = 0x20D\n\n[[func]]\nname = \"PrintItemDur\"\naddr = 0x423AE1\nsize = 0x1FF\n\n[[func]]\nname = \"UseItem\"\naddr = 0x423CE0\nsize = 0x4F7\n\n[[func]]\nname = \"StoreStatOk\"\naddr = 0x4241D7\nsize = 0x45\n\n[[func]]\nname = \"SmithItemOk\"\naddr = 0x42421C\nsize = 0x36\n\n[[func]]\nname = \"RndSmithItem\"\naddr = 0x424252\nsize = 0x6F\n\n[[func]]\nname = \"BubbleSwapItem\"\naddr = 0x4242C1\nsize = 0x34\n\n[[func]]\nname = \"SortSmith\"\naddr = 0x4242F5\nsize = 0x5C\n\n[[func]]\nname = \"SpawnSmith\"\naddr = 0x424351\nsize = 0xCF\n\n[[func]]\nname = \"PremiumItemOk\"\naddr = 0x424420\nsize = 0x3F\n\n[[func]]\nname = \"RndPremiumItem\"\naddr = 0x42445F\nsize = 0x67\n\n[[func]]\nname = \"SpawnOnePremium\"\naddr = 0x4244C6\nsize = 0xDA\n\n[[func]]\nname = \"SpawnPremium\"\naddr = 0x4245A0\nsize = 0xCC\n\n[[func]]\nname = \"WitchItemOk\"\naddr = 0x42466C\nsize = 0x66\n\n[[func]]\nname = \"RndWitchItem\"\naddr = 0x4246D2\nsize = 0x63\n\n[[func]]\nname = \"SortWitch\"\naddr = 0x424735\nsize = 0x60\n\n[[func]]\nname = \"WitchBookLevel\"\naddr = 0x424795\nsize = 0x80\n\n[[func]]\nname = \"SpawnWitch\"\naddr = 0x424815\nsize = 0x18F\n\n[[func]]\nname = \"RndBoyItem\"\naddr = 0x4249A4\nsize = 0x5F\n\n[[func]]\nname = \"SpawnBoy\"\naddr = 0x424A03\nsize = 0x98\n\n[[func]]\nname = \"HealerItemOk\"\naddr = 0x424A9B\nsize = 0xAE\n\n[[func]]\nname = \"RndHealerItem\"\naddr = 0x424B49\nsize = 0x63\n\n[[func]]\nname = \"SortHealer\"\naddr = 0x424BAC\nsize = 0x60\n\n[[func]]\nname = \"SpawnHealer\"\naddr = 0x424C0C\nsize = 0x14B\n\n[[func]]\nname = \"SpawnStoreGold\"\naddr = 0x424D57\nsize = 0x29\n\n[[func]]\nname = \"RecreateSmithItem\"\naddr = 0x424D80\nsize = 0x51\n\n[[func]]\nname = \"RecreatePremiumItem\"\naddr = 0x424DD1\nsize = 0x6B\n\n[[func]]\nname = \"RecreateBoyItem\"\naddr = 0x424E3C\nsize = 0x65\n\n[[func]]\nname = \"RecreateWitchItem\"\naddr = 0x424EA1\nsize = 0xB1\n\n[[func]]\nname = \"RecreateHealerItem\"\naddr = 0x424F52\nsize = 0x66\n\n[[func]]\nname = \"RecreateTownItem\"\naddr = 0x424FB8\nsize = 0x67\n\n[[func]]\nname = \"RecalcStoreStats\"\naddr = 0x42501F\nsize = 0xA1\n\n[[func]]\nname = \"ItemNoFlippy\"\naddr = 0x4250C0\nsize = 0x2F\n\n[[func]]\nname = \"CreateSpellBook\"\naddr = 0x4250EF\nsize = 0xC9\n\n[[func]]\nname = \"CreateMagicArmor\"\naddr = 0x4251B8\nsize = 0xB6\n\n[[func]]\nname = \"CreateMagicWeapon\"\naddr = 0x4251B8\nsize = 0xB6\n\n[[func]]\nname = \"GetItemRecord\"\naddr = 0x42526E\nsize = 0xA3\n\n[[func]]\nname = \"NextItemRecord\"\naddr = 0x425311\nsize = 0x46\n\n[[func]]\nname = \"SetItemRecord\"\naddr = 0x425357\nsize = 0x47\n\n[[func]]\nname = \"PutItemRecord\"\naddr = 0x42539E\nsize = 0xA5\n\n[[func]]\nname = \"RotateRadius\"\naddr = 0x425443\nsize = 0x77\n\n[[func]]\nname = \"DoLighting\"\naddr = 0x4254BA\nsize = 0x3F6\n\n[[func]]\nname = \"DoUnLight\"\naddr = 0x4258B0\nsize = 0x80\n\n[[func]]\nname = \"DoUnVision\"\naddr = 0x425930\nsize = 0x5A\n\n[[func]]\nname = \"DoVision\"\naddr = 0x42598A\nsize = 0x289\n\n[[func]]\nname = \"FreeLightTable\"\naddr = 0x425C13\nsize = 0x12\n\n[[func]]\nname = \"InitLightTable\"\naddr = 0x425C25\nsize = 0x10\n\n[[func]]\nname = \"MakeLightTable\"\naddr = 0x425C35\nsize = 0x383\n\n[[func]]\nname = \"InitLightMax\"\naddr = 0x425FB8\nsize = 0x16\n\n[[func]]\nname = \"InitLighting\"\naddr = 0x425FCE\nsize = 0x1E\n\n[[func]]\nname = \"AddLight\"\naddr = 0x425FEC\nsize = 0x6A\n\n[[func]]\nname = \"AddUnLight\"\naddr = 0x426056\nsize = 0x20\n\n[[func]]\nname = \"ChangeLightRadius\"\naddr = 0x426076\nsize = 0x4F\n\n[[func]]\nname = \"ChangeLightXY\"\naddr = 0x4260C5\nsize = 0x5B\n\n[[func]]\nname = \"ChangeLightOff\"\naddr = 0x426120\nsize = 0x5B\n\n[[func]]\nname = \"ChangeLight\"\naddr = 0x42617B\nsize = 0x6C\n\n[[func]]\nname = \"ProcessLightList\"\naddr = 0x4261E7\nsize = 0xF9\n\n[[func]]\nname = \"SavePreLighting\"\naddr = 0x4262E0\nsize = 0x18\n\n[[func]]\nname = \"InitVision\"\naddr = 0x4262F8\nsize = 0x3B\n\n[[func]]\nname = \"AddVision\"\naddr = 0x426333\nsize = 0x6D\n\n[[func]]\nname = \"ChangeVisionRadius\"\naddr = 0x4263A0\nsize = 0x41\n\n[[func]]\nname = \"ChangeVisionXY\"\naddr = 0x4263E1\nsize = 0x4A\n\n[[func]]\nname = \"ProcessVisionList\"\naddr = 0x42642B\nsize = 0xF4\n\n[[func]]\nname = \"lighting_color_cycling\"\naddr = 0x42651F\nsize = 0x45\n\n[[func]]\nname = \"LoadGame\"\naddr = 0x426564\nsize = 0x57E\n\n[[func]]\nname = \"BLoad\"\naddr = 0x426AE2\nsize = 0xE\n\n[[func]]\nname = \"WLoad\"\naddr = 0x426AF0\nsize = 0x3C\n\n[[func]]\nname = \"ILoad\"\naddr = 0x426B2C\nsize = 0x3C\n\n[[func]]\nname = \"OLoad\"\naddr = 0x426B68\nsize = 0x17\n\n[[func]]\nname = \"LoadPlayer\"\naddr = 0x426B7F\nsize = 0x2A\n\n[[func]]\nname = \"LoadMonster\"\naddr = 0x426BA9\nsize = 0x35\n\n[[func]]\nname = \"LoadMissile\"\naddr = 0x426BDE\nsize = 0x2A\n\n[[func]]\nname = \"LoadObject\"\naddr = 0x426C08\nsize = 0x22\n\n[[func]]\nname = \"LoadItem\"\naddr = 0x426C2A\nsize = 0x35\n\n[[func]]\nname = \"LoadPremium\"\naddr = 0x426C5F\nsize = 0x2A\n\n[[func]]\nname = \"LoadQuest\"\naddr = 0x426C89\nsize = 0x55\n\n[[func]]\nname = \"LoadLighting\"\naddr = 0x426CDE\nsize = 0x22\n\n[[func]]\nname = \"LoadVision\"\naddr = 0x426D00\nsize = 0x22\n\n[[func]]\nname = \"LoadPortal\"\naddr = 0x426D22\nsize = 0x23\n\n[[func]]\nname = \"SaveGame\"\naddr = 0x426D45\nsize = 0x4BE\n\n[[func]]\nname = \"BSave\"\naddr = 0x427203\nsize = 0xE\n\n[[func]]\nname = \"WSave\"\naddr = 0x427211\nsize = 0x47\n\n[[func]]\nname = \"ISave\"\naddr = 0x427258\nsize = 0x47\n\n[[func]]\nname = \"OSave\"\naddr = 0x42729F\nsize = 0x18\n\n[[func]]\nname = \"SavePlayer\"\naddr = 0x4272B7\nsize = 0x2A\n\n[[func]]\nname = \"SaveMonster\"\naddr = 0x4272E1\nsize = 0x2A\n\n[[func]]\nname = \"SaveMissile\"\naddr = 0x42730B\nsize = 0x2A\n\n[[func]]\nname = \"SaveObject\"\naddr = 0x427335\nsize = 0x22\n\n[[func]]\nname = \"SaveItem\"\naddr = 0x427357\nsize = 0x2A\n\n[[func]]\nname = \"SavePremium\"\naddr = 0x427381\nsize = 0x2A\n\n[[func]]\nname = \"SaveQuest\"\naddr = 0x4273AB\nsize = 0x59\n\n[[func]]\nname = \"SaveLighting\"\naddr = 0x427404\nsize = 0x22\n\n[[func]]\nname = \"SaveVision\"\naddr = 0x427426\nsize = 0x22\n\n[[func]]\nname = \"SavePortal\"\naddr = 0x427448\nsize = 0x23\n\n[[func]]\nname = \"SaveLevel\"\naddr = 0x42746B\nsize = 0x2C4\n\n[[func]]\nname = \"LoadLevel\"\naddr = 0x42772F\nsize = 0x2C3\n\n[[func]]\nname = \"log_flush\"\naddr = 0x427A30\nsize = 0x92\n\n[[func]]\nname = \"log_create\"\naddr = 0x427AC2\nsize = 0x156\n\n[[func]]\nname = \"log_get_version\"\naddr = 0x427C18\nsize = 0xB1\n\n[[func]]\nname = \"log_printf\"\naddr = 0x427CC9\nsize = 0xAC\n\n[[func]]\nname = \"log_dump_computer_info\"\naddr = 0x427D75\nsize = 0x99\n\n[[func]]\nname = \"mainmenu_refresh_music\"\naddr = 0x427E1E\nsize = 0x27\n\n[[func]]\nname = \"mainmenu_change_name\"\naddr = 0x427E45\nsize = 0x1D\n\n[[func]]\nname = \"mainmenu_select_hero_dialog\"\naddr = 0x427E62\nsize = 0x114\n\n[[func]]\nname = \"mainmenu_loop\"\naddr = 0x427F76\nsize = 0x76\n\n[[func]]\nname = \"mainmenu_single_player\"\naddr = 0x427FEC\nsize = 0xE\n\n[[func]]\nname = \"mainmenu_init_menu\"\naddr = 0x427FFA\nsize = 0x36\n\n[[func]]\nname = \"mainmenu_multi_player\"\naddr = 0x428030\nsize = 0xF\n\n[[func]]\nname = \"mainmenu_play_intro\"\naddr = 0x42803F\nsize = 0x17\n\n[[func]]\nname = \"FreeQuestText\"\naddr = 0x428056\nsize = 0x24\n\n[[func]]\nname = \"InitQuestText\"\naddr = 0x42807A\nsize = 0x2A\n\n[[func]]\nname = \"InitQTextMsg\"\naddr = 0x4280A4\nsize = 0x60\n\n[[func]]\nname = \"DrawQTextBack\"\naddr = 0x428104\nsize = 0x5C\n\n[[func]]\nname = \"PrintQTextChr\"\naddr = 0x428160\nsize = 0xA2\n\n[[func]]\nname = \"DrawQText\"\naddr = 0x428202\nsize = 0x1BE\n\n[[func]]\nname = \"GetDamageAmt\"\naddr = 0x4283C0\nsize = 0x4F1\n\n[[func]]\nname = \"CheckBlock\"\naddr = 0x428921\nsize = 0x59\n\n[[func]]\nname = \"FindClosest\"\naddr = 0x42897A\nsize = 0x11F\n\n[[func]]\nname = \"GetSpellLevel\"\naddr = 0x428A99\nsize = 0x2B\n\n[[func]]\nname = \"GetDirection8\"\naddr = 0x428AC4\nsize = 0x62A\n\n[[func]]\nname = \"GetDirection16\"\naddr = 0x4290EE\nsize = 0x690\n\n[[func]]\nname = \"DeleteMissile\"\naddr = 0x42977E\nsize = 0x70\n\n[[func]]\nname = \"GetMissileVel\"\naddr = 0x4297EE\nsize = 0xBF\n\n[[func]]\nname = \"PutMissile\"\naddr = 0x4298AD\nsize = 0x6B\n\n[[func]]\nname = \"GetMissilePos\"\naddr = 0x429918\nsize = 0xD2\n\n[[func]]\nname = \"MoveMissilePos\"\naddr = 0x4299EA\nsize = 0x8F\n\n[[func]]\nname = \"MonsterTrapHit\"\naddr = 0x429A99\nsize = 0x1A2\n\n[[func]]\nname = \"MonsterMHit\"\naddr = 0x429C3B\nsize = 0x313\n\n[[func]]\nname = \"PlayerMHit\"\naddr = 0x429F4E\nsize = 0x3B9\n\n[[func]]\nname = \"Plr2PlrMHit\"\naddr = 0x42A307\nsize = 0x2D4\n\n[[func]]\nname = \"CheckMissileCol\"\naddr = 0x42A5DB\nsize = 0x2FA\n\n[[func]]\nname = \"SetMissAnim\"\naddr = 0x42A8D5\nsize = 0x84\n\n[[func]]\nname = \"SetMissDir\"\naddr = 0x42A959\nsize = 0x1A\n\n[[func]]\nname = \"LoadMissileGFX\"\naddr = 0x42A973\nsize = 0xE9\n\n[[func]]\nname = \"InitMissileGFX\"\naddr = 0x42AA5C\nsize = 0x2D\n\n[[func]]\nname = \"FreeMissileGFX\"\naddr = 0x42AA89\nsize = 0x69\n\n[[func]]\nname = \"FreeMissiles\"\naddr = 0x42AAF2\nsize = 0x2E\n\n[[func]]\nname = \"FreeMissiles2\"\naddr = 0x42AB20\nsize = 0x2E\n\n[[func]]\nname = \"InitMissiles\"\naddr = 0x42AB4E\nsize = 0xBE\n\n[[func]]\nname = \"AddLArrow\"\naddr = 0x42AC0C\nsize = 0xCD\n\n[[func]]\nname = \"AddArrow\"\naddr = 0x42ACD9\nsize = 0xD1\n\n[[func]]\nname = \"GetVileMissPos\"\naddr = 0x42ADAA\nsize = 0x9E\n\n[[func]]\nname = \"AddRndTeleport\"\naddr = 0x42AE48\nsize = 0x143\n\n[[func]]\nname = \"AddFirebolt\"\naddr = 0x42AF8B\nsize = 0x10F\n\n[[func]]\nname = \"AddMagmaball\"\naddr = 0x42B09A\nsize = 0x79\n\n[[func]]\nname = \"miss_null_33\"\naddr = 0x42B113\nsize = 0x46\n\n[[func]]\nname = \"AddTeleport\"\naddr = 0x42B159\nsize = 0x12B\n\n[[func]]\nname = \"AddLightball\"\naddr = 0x42B284\nsize = 0x7F\n\n[[func]]\nname = \"AddFirewall\"\naddr = 0x42B303\nsize = 0xBD\n\n[[func]]\nname = \"AddFireball\"\naddr = 0x42B3C0\nsize = 0x127\n\n[[func]]\nname = \"AddLightctrl\"\naddr = 0x42B4E7\nsize = 0x6C\n\n[[func]]\nname = \"AddLightning\"\naddr = 0x42B553\nsize = 0xCD\n\n[[func]]\nname = \"AddMisexp\"\naddr = 0x42B620\nsize = 0xF1\n\n[[func]]\nname = \"AddWeapexp\"\naddr = 0x42B711\nsize = 0x6B\n\n[[func]]\nname = \"CheckIfTrig\"\naddr = 0x42B77C\nsize = 0x63\n\n[[func]]\nname = \"AddTown\"\naddr = 0x42B7DF\nsize = 0x21D\n\n[[func]]\nname = \"AddFlash\"\naddr = 0x42B9FC\nsize = 0xC5\n\n[[func]]\nname = \"AddFlash2\"\naddr = 0x42BAC1\nsize = 0xC2\n\n[[func]]\nname = \"AddManashield\"\naddr = 0x42BB83\nsize = 0x77\n\n[[func]]\nname = \"AddFiremove\"\naddr = 0x42BBFA\nsize = 0x7C\n\n[[func]]\nname = \"AddGuardian\"\naddr = 0x42BC76\nsize = 0x222\n\n[[func]]\nname = \"AddChain\"\naddr = 0x42BE98\nsize = 0x33\n\n[[func]]\nname = \"miss_null_11\"\naddr = 0x42BECB\nsize = 0x33\n\n[[func]]\nname = \"miss_null_12\"\naddr = 0x42BEFE\nsize = 0x3D\n\n[[func]]\nname = \"miss_null_13\"\naddr = 0x42BF3B\nsize = 0x3F\n\n[[func]]\nname = \"AddRhino\"\naddr = 0x42BF7A\nsize = 0x111\n\n[[func]]\nname = \"miss_null_32\"\naddr = 0x42C08B\nsize = 0xDC\n\n[[func]]\nname = \"AddFlare\"\naddr = 0x42C167\nsize = 0x10F\n\n[[func]]\nname = \"AddAcid\"\naddr = 0x42C276\nsize = 0x78\n\n[[func]]\nname = \"miss_null_1D\"\naddr = 0x42C2EE\nsize = 0x3C\n\n[[func]]\nname = \"AddAcidpud\"\naddr = 0x42C32A\nsize = 0x64\n\n[[func]]\nname = \"AddStone\"\naddr = 0x42C38E\nsize = 0x18A\n\n[[func]]\nname = \"AddGolem\"\naddr = 0x42C518\nsize = 0xC2\n\n[[func]]\nname = \"AddEtherealize\"\naddr = 0x42C5DA\nsize = 0x8A\n\n[[func]]\nname = \"miss_null_1F\"\naddr = 0x42C664\nsize = 0x13\n\n[[func]]\nname = \"miss_null_23\"\naddr = 0x42C677\nsize = 0x62\n\n[[func]]\nname = \"AddBoom\"\naddr = 0x42C6D9\nsize = 0x53\n\n[[func]]\nname = \"AddHeal\"\naddr = 0x42C72C\nsize = 0xE0\n\n[[func]]\nname = \"AddHealOther\"\naddr = 0x42C80C\nsize = 0x33\n\n[[func]]\nname = \"AddElement\"\naddr = 0x42C83F\nsize = 0x103\n\n[[func]]\nname = \"AddIdentify\"\naddr = 0x42C942\nsize = 0x51\n\n[[func]]\nname = \"AddFirewallC\"\naddr = 0x42C993\nsize = 0x162\n\n[[func]]\nname = \"AddInfra\"\naddr = 0x42CAF5\nsize = 0x67\n\n[[func]]\nname = \"AddWave\"\naddr = 0x42CB5C\nsize = 0x4B\n\n[[func]]\nname = \"AddNova\"\naddr = 0x42CBA7\nsize = 0xF1\n\n[[func]]\nname = \"AddRepair\"\naddr = 0x42CC98\nsize = 0x51\n\n[[func]]\nname = \"AddRecharge\"\naddr = 0x42CCE9\nsize = 0x51\n\n[[func]]\nname = \"AddDisarm\"\naddr = 0x42CD3A\nsize = 0x33\n\n[[func]]\nname = \"AddApoca\"\naddr = 0x42CD6D\nsize = 0xC5\n\n[[func]]\nname = \"AddFlame\"\naddr = 0x42CE32\nsize = 0x103\n\n[[func]]\nname = \"AddFlamec\"\naddr = 0x42CF35\nsize = 0x78\n\n[[func]]\nname = \"AddCbolt\"\naddr = 0x42CFAD\nsize = 0xEB\n\n[[func]]\nname = \"AddHbolt\"\naddr = 0x42D098\nsize = 0xE0\n\n[[func]]\nname = \"AddResurrect\"\naddr = 0x42D178\nsize = 0x37\n\n[[func]]\nname = \"AddResurrectBeam\"\naddr = 0x42D1AF\nsize = 0x44\n\n[[func]]\nname = \"AddTelekinesis\"\naddr = 0x42D1F3\nsize = 0x33\n\n[[func]]\nname = \"AddBoneSpirit\"\naddr = 0x42D226\nsize = 0xEB\n\n[[func]]\nname = \"AddRportal\"\naddr = 0x42D311\nsize = 0x4A\n\n[[func]]\nname = \"AddDiabApoca\"\naddr = 0x42D35B\nsize = 0x7F\n\n[[func]]\nname = \"AddMissile\"\naddr = 0x42D3DA\nsize = 0x1C9\n\n[[func]]\nname = \"Sentfire\"\naddr = 0x42D5A3\nsize = 0xDC\n\n[[func]]\nname = \"MI_Dummy\"\naddr = 0x42D67F\nsize = 0x1\n\n[[func]]\nname = \"MI_Golem\"\naddr = 0x42D680\nsize = 0x147\n\n[[func]]\nname = \"MI_SetManashield\"\naddr = 0x42D7C7\nsize = 0xB\n\n[[func]]\nname = \"MI_LArrow\"\naddr = 0x42D7D2\nsize = 0x2FE\n\n[[func]]\nname = \"MI_Arrow\"\naddr = 0x42DAD0\nsize = 0xD1\n\n[[func]]\nname = \"MI_Firebolt\"\naddr = 0x42DBA1\nsize = 0x2B9\n\n[[func]]\nname = \"MI_Lightball\"\naddr = 0x42DE5A\nsize = 0xE8\n\n[[func]]\nname = \"mi_null_33\"\naddr = 0x42DF42\nsize = 0x69\n\n[[func]]\nname = \"MI_Acidpud\"\naddr = 0x42DFAB\nsize = 0x73\n\n[[func]]\nname = \"MI_Firewall\"\naddr = 0x42E01E\nsize = 0x171\n\n[[func]]\nname = \"MI_Fireball\"\naddr = 0x42E18F\nsize = 0x418\n\n[[func]]\nname = \"MI_Lightctrl\"\naddr = 0x42E5A7\nsize = 0x1F4\n\n[[func]]\nname = \"MI_Lightning\"\naddr = 0x42E79B\nsize = 0x85\n\n[[func]]\nname = \"MI_Town\"\naddr = 0x42E820\nsize = 0x1AB\n\n[[func]]\nname = \"MI_Flash\"\naddr = 0x42E9CB\nsize = 0x126\n\n[[func]]\nname = \"MI_Flash2\"\naddr = 0x42EAF1\nsize = 0xCE\n\n[[func]]\nname = \"MI_Manashield\"\naddr = 0x42EBBF\nsize = 0x25A\n\n[[func]]\nname = \"MI_Etherealize\"\naddr = 0x42EE19\nsize = 0xE4\n\n[[func]]\nname = \"MI_Firemove\"\naddr = 0x42EEFD\nsize = 0x1CB\n\n[[func]]\nname = \"MI_Guardian\"\naddr = 0x42F0C8\nsize = 0x1FA\n\n[[func]]\nname = \"MI_Chain\"\naddr = 0x42F2C2\nsize = 0x1B3\n\n[[func]]\nname = \"mi_null_11\"\naddr = 0x42F475\nsize = 0x34\n\n[[func]]\nname = \"MI_Weapexp\"\naddr = 0x42F4A9\nsize = 0x12D\n\n[[func]]\nname = \"MI_Misexp\"\naddr = 0x42F5D6\nsize = 0xBC\n\n[[func]]\nname = \"MI_Acidsplat\"\naddr = 0x42F692\nsize = 0x91\n\n[[func]]\nname = \"MI_Teleport\"\naddr = 0x42F723\nsize = 0x109\n\n[[func]]\nname = \"MI_Stone\"\naddr = 0x42F82C\nsize = 0xC2\n\n[[func]]\nname = \"MI_Boom\"\naddr = 0x42F8EE\nsize = 0x61\n\n[[func]]\nname = \"MI_Rhino\"\naddr = 0x42F94F\nsize = 0x181\n\n[[func]]\nname = \"mi_null_32\"\naddr = 0x42FAD0\nsize = 0x1A4\n\n[[func]]\nname = \"MI_FirewallC\"\naddr = 0x42FC74\nsize = 0x16F\n\n[[func]]\nname = \"MI_Infra\"\naddr = 0x42FDE3\nsize = 0x3D\n\n[[func]]\nname = \"MI_Apoca\"\naddr = 0x42FE20\nsize = 0xEB\n\n[[func]]\nname = \"MI_Wave\"\naddr = 0x42FF0B\nsize = 0x249\n\n[[func]]\nname = \"MI_Nova\"\naddr = 0x430154\nsize = 0x153\n\n[[func]]\nname = \"MI_Blodboil\"\naddr = 0x4302A7\nsize = 0x11\n\n[[func]]\nname = \"MI_Flame\"\naddr = 0x4302B8\nsize = 0xC6\n\n[[func]]\nname = \"MI_Flamec\"\naddr = 0x43037E\nsize = 0xDE\n\n[[func]]\nname = \"MI_Cbolt\"\naddr = 0x43045C\nsize = 0x186\n\n[[func]]\nname = \"MI_Hbolt\"\naddr = 0x4305E2\nsize = 0x13D\n\n[[func]]\nname = \"MI_Element\"\naddr = 0x43071F\nsize = 0x379\n\n[[func]]\nname = \"MI_Bonespirit\"\naddr = 0x430A98\nsize = 0x1F5\n\n[[func]]\nname = \"MI_ResurrectBeam\"\naddr = 0x430C8D\nsize = 0x1F\n\n[[func]]\nname = \"MI_Rportal\"\naddr = 0x430CAC\nsize = 0x12E\n\n[[func]]\nname = \"ProcessMissiles\"\naddr = 0x430DDA\nsize = 0x15B\n\n[[func]]\nname = \"missiles_process_charge\"\naddr = 0x430F35\nsize = 0x84\n\n[[func]]\nname = \"ClearMissileSpot\"\naddr = 0x430FB9\nsize = 0x26\n\n[[func]]\nname = \"InitMonsterTRN\"\naddr = 0x430FEF\nsize = 0x8C\n\n[[func]]\nname = \"InitLevelMonsters\"\naddr = 0x43107B\nsize = 0x54\n\n[[func]]\nname = \"AddMonsterType\"\naddr = 0x4310CF\nsize = 0x80\n\n[[func]]\nname = \"GetLevelMTypes\"\naddr = 0x43114F\nsize = 0x2AA\n\n[[func]]\nname = \"InitMonsterGFX\"\naddr = 0x4313F9\nsize = 0x2B5\n\n[[func]]\nname = \"ClearMVars\"\naddr = 0x4316AE\nsize = 0x39\n\n[[func]]\nname = \"InitMonster\"\naddr = 0x4316E7\nsize = 0x384\n\n[[func]]\nname = \"ClrAllMonsters\"\naddr = 0x431A6B\nsize = 0xA5\n\n[[func]]\nname = \"MonstPlace\"\naddr = 0x431B10\nsize = 0x4D\n\n[[func]]\nname = \"PlaceMonster\"\naddr = 0x431B5D\nsize = 0x3C\n\n[[func]]\nname = \"PlaceUniqueMonst\"\naddr = 0x431B99\nsize = 0x4EF\n\n[[func]]\nname = \"PlaceQuestMonsters\"\naddr = 0x432088\nsize = 0x272\n\n[[func]]\nname = \"PlaceGroup\"\naddr = 0x4322FA\nsize = 0x28B\n\n[[func]]\nname = \"LoadDiabMonsts\"\naddr = 0x432585\nsize = 0xB2\n\n[[func]]\nname = \"InitMonsters\"\naddr = 0x432637\nsize = 0x206\n\n[[func]]\nname = \"PlaceUniques\"\naddr = 0x43283D\nsize = 0xD1\n\n[[func]]\nname = \"SetMapMonsters\"\naddr = 0x43290E\nsize = 0x13F\n\n[[func]]\nname = \"DeleteMonster\"\naddr = 0x432A4D\nsize = 0x24\n\n[[func]]\nname = \"AddMonster\"\naddr = 0x432A71\nsize = 0x50\n\n[[func]]\nname = \"NewMonsterAnim\"\naddr = 0x432AC1\nsize = 0x3E\n\n[[func]]\nname = \"M_Ranged\"\naddr = 0x432AFF\nsize = 0x27\n\n[[func]]\nname = \"M_Talker\"\naddr = 0x432B26\nsize = 0x36\n\n[[func]]\nname = \"M_Enemy\"\naddr = 0x432B5C\nsize = 0x2B9\n\n[[func]]\nname = \"M_GetDir\"\naddr = 0x432E15\nsize = 0x28\n\n[[func]]\nname = \"M_CheckEFlag\"\naddr = 0x432E3D\nsize = 0x60\n\n[[func]]\nname = \"M_StartStand\"\naddr = 0x432E9D\nsize = 0x8C\n\n[[func]]\nname = \"M_StartDelay\"\naddr = 0x432F29\nsize = 0x26\n\n[[func]]\nname = \"M_StartSpStand\"\naddr = 0x432F4F\nsize = 0x6D\n\n[[func]]\nname = \"M_StartWalk\"\naddr = 0x432FBC\nsize = 0xD3\n\n[[func]]\nname = \"M_StartWalk2\"\naddr = 0x43308F\nsize = 0x11B\n\n[[func]]\nname = \"M_StartWalk3\"\naddr = 0x4331AA\nsize = 0x14C\n\n[[func]]\nname = \"M_StartAttack\"\naddr = 0x4332F6\nsize = 0x71\n\n[[func]]\nname = \"M_StartRAttack\"\naddr = 0x433367\nsize = 0x88\n\n[[func]]\nname = \"M_StartRSpAttack\"\naddr = 0x4333EF\nsize = 0x91\n\n[[func]]\nname = \"M_StartSpAttack\"\naddr = 0x433480\nsize = 0x74\n\n[[func]]\nname = \"M_StartEat\"\naddr = 0x4334F4\nsize = 0x68\n\n[[func]]\nname = \"M_ClearSquares\"\naddr = 0x43355C\nsize = 0xBF\n\n[[func]]\nname = \"M_GetKnockback\"\naddr = 0x43361B\nsize = 0xCA\n\n[[func]]\nname = \"M_StartHit\"\naddr = 0x4336E5\nsize = 0x175\n\n[[func]]\nname = \"M_DiabloDeath\"\naddr = 0x43385A\nsize = 0x1F2\n\n[[func]]\nname = \"M2MStartHit\"\naddr = 0x433A4C\nsize = 0x180\n\n[[func]]\nname = \"MonstStartKill\"\naddr = 0x433BCC\nsize = 0x1F6\n\n[[func]]\nname = \"M2MStartKill\"\naddr = 0x433DC2\nsize = 0x205\n\n[[func]]\nname = \"M_StartKill\"\naddr = 0x433FC7\nsize = 0x7E\n\n[[func]]\nname = \"M_SyncStartKill\"\naddr = 0x434045\nsize = 0x9B\n\n[[func]]\nname = \"M_StartFadein\"\naddr = 0x4340E0\nsize = 0xCD\n\n[[func]]\nname = \"M_StartFadeout\"\naddr = 0x4341AD\nsize = 0xC5\n\n[[func]]\nname = \"M_StartHeal\"\naddr = 0x434272\nsize = 0x98\n\n[[func]]\nname = \"M_ChangeLightOffset\"\naddr = 0x43430A\nsize = 0x6A\n\n[[func]]\nname = \"M_DoStand\"\naddr = 0x434374\nsize = 0x7F\n\n[[func]]\nname = \"M_DoWalk\"\naddr = 0x4343F3\nsize = 0x116\n\n[[func]]\nname = \"M_DoWalk2\"\naddr = 0x434509\nsize = 0xF3\n\n[[func]]\nname = \"M_DoWalk3\"\naddr = 0x4345FC\nsize = 0x126\n\n[[func]]\nname = \"M_TryM2MHit\"\naddr = 0x434722\nsize = 0x10A\n\n[[func]]\nname = \"M_TryH2HHit\"\naddr = 0x43482C\nsize = 0x40F\n\n[[func]]\nname = \"M_DoAttack\"\naddr = 0x434C3B\nsize = 0x182\n\n[[func]]\nname = \"M_DoRAttack\"\naddr = 0x434DBD\nsize = 0xF5\n\n[[func]]\nname = \"M_DoRSpAttack\"\naddr = 0x434EB2\nsize = 0x115\n\n[[func]]\nname = \"M_DoSAttack\"\naddr = 0x434FC7\nsize = 0xB7\n\n[[func]]\nname = \"M_DoFadein\"\naddr = 0x43507E\nsize = 0x65\n\n[[func]]\nname = \"M_DoFadeout\"\naddr = 0x4350E3\nsize = 0x82\n\n[[func]]\nname = \"M_DoHeal\"\naddr = 0x435165\nsize = 0x90\n\n[[func]]\nname = \"M_DoTalk\"\naddr = 0x4351F5\nsize = 0x285\n\n[[func]]\nname = \"M_Teleport\"\naddr = 0x43547A\nsize = 0x141\n\n[[func]]\nname = \"M_DoGotHit\"\naddr = 0x4355BB\nsize = 0x63\n\n[[func]]\nname = \"M_UpdateLeader\"\naddr = 0x43561E\nsize = 0x79\n\n[[func]]\nname = \"DoEnding\"\naddr = 0x435697\nsize = 0xC5\n\n[[func]]\nname = \"PrepDoEnding\"\naddr = 0x43575C\nsize = 0x83\n\n[[func]]\nname = \"M_DoDeath\"\naddr = 0x4357DF\nsize = 0x10D\n\n[[func]]\nname = \"M_DoSpStand\"\naddr = 0x4358EC\nsize = 0x7F\n\n[[func]]\nname = \"M_DoDelay\"\naddr = 0x43596B\nsize = 0xA9\n\n[[func]]\nname = \"M_DoStone\"\naddr = 0x435A14\nsize = 0x4E\n\n[[func]]\nname = \"M_WalkDir\"\naddr = 0x435A62\nsize = 0x133\n\n[[func]]\nname = \"GroupUnity\"\naddr = 0x435BB5\nsize = 0x1F3\n\n[[func]]\nname = \"M_CallWalk\"\naddr = 0x435DA8\nsize = 0x10D\n\n[[func]]\nname = \"M_PathWalk\"\naddr = 0x435EB5\nsize = 0x80\n\n[[func]]\nname = \"M_CallWalk2\"\naddr = 0x435F35\nsize = 0x85\n\n[[func]]\nname = \"M_DumbWalk\"\naddr = 0x435FBA\nsize = 0x21\n\n[[func]]\nname = \"M_RoundWalk\"\naddr = 0x435FDB\nsize = 0xD6\n\n[[func]]\nname = \"MAI_Zombie\"\naddr = 0x4360B1\nsize = 0x146\n\n[[func]]\nname = \"MAI_SkelSd\"\naddr = 0x4361F7\nsize = 0x13A\n\n[[func]]\nname = \"MAI_Path\"\naddr = 0x436331\nsize = 0xC8\n\n[[func]]\nname = \"MAI_Snake\"\naddr = 0x4363F9\nsize = 0x296\n\n[[func]]\nname = \"MAI_Bat\"\naddr = 0x43668F\nsize = 0x268\n\n[[func]]\nname = \"MAI_SkelBow\"\naddr = 0x4368F7\nsize = 0x141\n\n[[func]]\nname = \"MAI_Fat\"\naddr = 0x436A38\nsize = 0x128\n\n[[func]]\nname = \"MAI_Sneak\"\naddr = 0x436B60\nsize = 0x268\n\n[[func]]\nname = \"MAI_Fireman\"\naddr = 0x436DC8\nsize = 0x224\n\n[[func]]\nname = \"MAI_Fallen\"\naddr = 0x436FEC\nsize = 0x1EB\n\n[[func]]\nname = \"MAI_Cleaver\"\naddr = 0x4371D7\nsize = 0xAE\n\n[[func]]\nname = \"MAI_Round\"\naddr = 0x437285\nsize = 0x29B\n\n[[func]]\nname = \"MAI_GoatMc\"\naddr = 0x437520\nsize = 0x8\n\n[[func]]\nname = \"MAI_Ranged\"\naddr = 0x437528\nsize = 0x18B\n\n[[func]]\nname = \"MAI_GoatBow\"\naddr = 0x4376B3\nsize = 0xA\n\n[[func]]\nname = \"MAI_Succ\"\naddr = 0x4376BD\nsize = 0xB\n\n[[func]]\nname = \"MAI_AcidUniq\"\naddr = 0x4376C8\nsize = 0xB\n\n[[func]]\nname = \"MAI_Scav\"\naddr = 0x4376D3\nsize = 0x284\n\n[[func]]\nname = \"MAI_Garg\"\naddr = 0x437957\nsize = 0x134\n\n[[func]]\nname = \"MAI_RoundRanged\"\naddr = 0x437A8B\nsize = 0x308\n\n[[func]]\nname = \"MAI_Magma\"\naddr = 0x437D93\nsize = 0xF\n\n[[func]]\nname = \"MAI_Storm\"\naddr = 0x437DA2\nsize = 0xF\n\n[[func]]\nname = \"MAI_Acid\"\naddr = 0x437DB1\nsize = 0xF\n\n[[func]]\nname = \"MAI_Diablo\"\naddr = 0x437DC0\nsize = 0xF\n\n[[func]]\nname = \"MAI_RR2\"\naddr = 0x437DCF\nsize = 0x30F\n\n[[func]]\nname = \"MAI_Mega\"\naddr = 0x4380DE\nsize = 0xB\n\n[[func]]\nname = \"MAI_Golum\"\naddr = 0x4380E9\nsize = 0x21B\n\n[[func]]\nname = \"MAI_SkelKing\"\naddr = 0x438304\nsize = 0x329\n\n[[func]]\nname = \"MAI_Rhino\"\naddr = 0x43862D\nsize = 0x2F2\n\n[[func]]\nname = \"MAI_Counselor\"\naddr = 0x43891F\nsize = 0x35A\n\n[[func]]\nname = \"MAI_Garbud\"\naddr = 0x438C79\nsize = 0x105\n\n[[func]]\nname = \"MAI_Zhar\"\naddr = 0x438D7E\nsize = 0x144\n\n[[func]]\nname = \"MAI_SnotSpil\"\naddr = 0x438EC2\nsize = 0x154\n\n[[func]]\nname = \"MAI_Lazurus\"\naddr = 0x439016\nsize = 0x180\n\n[[func]]\nname = \"MAI_Lazhelp\"\naddr = 0x439196\nsize = 0xBD\n\n[[func]]\nname = \"MAI_Lachdanan\"\naddr = 0x439253\nsize = 0xE5\n\n[[func]]\nname = \"MAI_Warlord\"\naddr = 0x439338\nsize = 0xE1\n\n[[func]]\nname = \"DeleteMonsterList\"\naddr = 0x439419\nsize = 0x65\n\n[[func]]\nname = \"ProcessMonsters\"\naddr = 0x43947E\nsize = 0x2FF\n\n[[func]]\nname = \"FreeMonsters\"\naddr = 0x4397C5\nsize = 0x6C\n\n[[func]]\nname = \"DirOK\"\naddr = 0x439831\nsize = 0x201\n\n[[func]]\nname = \"PosOkMissile\"\naddr = 0x439A32\nsize = 0x25\n\n[[func]]\nname = \"CheckNoSolid\"\naddr = 0x439A57\nsize = 0x1A\n\n[[func]]\nname = \"LineClearF\"\naddr = 0x439A71\nsize = 0x16F\n\n[[func]]\nname = \"LineClear\"\naddr = 0x439BE0\nsize = 0x1A\n\n[[func]]\nname = \"LineClearF1\"\naddr = 0x439BFA\nsize = 0x17B\n\n[[func]]\nname = \"SyncMonsterAnim\"\naddr = 0x439D75\nsize = 0xEB\n\n[[func]]\nname = \"M_FallenFear\"\naddr = 0x439EA8\nsize = 0xEA\n\n[[func]]\nname = \"PrintMonstHistory\"\naddr = 0x439F92\nsize = 0x1A8\n\n[[func]]\nname = \"PrintUniqueHistory\"\naddr = 0x43A13A\nsize = 0x87\n\n[[func]]\nname = \"MissToMonst\"\naddr = 0x43A1C1\nsize = 0x29D\n\n[[func]]\nname = \"PosOkMonst\"\naddr = 0x43A45E\nsize = 0xE9\n\n[[func]]\nname = \"PosOkMonst2\"\naddr = 0x43A547\nsize = 0xCC\n\n[[func]]\nname = \"PosOkMonst3\"\naddr = 0x43A613\nsize = 0x128\n\n[[func]]\nname = \"IsSkel\"\naddr = 0x43A73B\nsize = 0x25\n\n[[func]]\nname = \"IsGoat\"\naddr = 0x43A760\nsize = 0x1B\n\n[[func]]\nname = \"M_SpawnSkel\"\naddr = 0x43A77B\nsize = 0xAD\n\n[[func]]\nname = \"ActivateSpawn\"\naddr = 0x43A828\nsize = 0x51\n\n[[func]]\nname = \"SpawnSkeleton\"\naddr = 0x43A879\nsize = 0x100\n\n[[func]]\nname = \"PreSpawnSkeleton\"\naddr = 0x43A979\nsize = 0x93\n\n[[func]]\nname = \"TalktoMonster\"\naddr = 0x43AA0C\nsize = 0xCE\n\n[[func]]\nname = \"SpawnGolum\"\naddr = 0x43AADA\nsize = 0x132\n\n[[func]]\nname = \"CanTalkToMonst\"\naddr = 0x43AC0C\nsize = 0x37\n\n[[func]]\nname = \"CheckMonsterHit\"\naddr = 0x43AC43\nsize = 0x72\n\n[[func]]\nname = \"encode_enemy\"\naddr = 0x43ACB5\nsize = 0x19\n\n[[func]]\nname = \"decode_enemy\"\naddr = 0x43ACCE\nsize = 0x65\n\n[[func]]\nname = \"play_movie\"\naddr = 0x43AD43\nsize = 0xFB\n\n[[func]]\nname = \"MovieWndProc\"\naddr = 0x43AE3E\nsize = 0x52\n\n[[func]]\nname = \"mpqapi_set_hidden\"\naddr = 0x43AEA0\nsize = 0x3C\n\n[[func]]\nname = \"mpqapi_store_creation_time\"\naddr = 0x43AEDC\nsize = 0x73\n\n[[func]]\nname = \"mpqapi_reg_load_modification_time\"\naddr = 0x43AF4F\nsize = 0x56\n\n[[func]]\nname = \"mpqapi_xor_buf\"\naddr = 0x43AFA5\nsize = 0x1F\n\n[[func]]\nname = \"mpqapi_reg_store_modification_time\"\naddr = 0x43AFC4\nsize = 0x39\n\n[[func]]\nname = \"mpqapi_remove_hash_entry\"\naddr = 0x43B002\nsize = 0x52\n\n[[func]]\nname = \"mpqapi_alloc_block\"\naddr = 0x43B054\nsize = 0x90\n\n[[func]]\nname = \"mpqapi_new_block\"\naddr = 0x43B0E4\nsize = 0x3F\n\n[[func]]\nname = \"FetchHandle\"\naddr = 0x43B123\nsize = 0x30\n\n[[func]]\nname = \"mpqapi_get_hash_index\"\naddr = 0x43B153\nsize = 0x6A\n\n[[func]]\nname = \"mpqapi_remove_hash_entries\"\naddr = 0x43B1BD\nsize = 0x3B\n\n[[func]]\nname = \"mpqapi_write_file\"\naddr = 0x43B1F8\nsize = 0x45\n\n[[func]]\nname = \"mpqapi_add_file\"\naddr = 0x43B23D\nsize = 0xDA\n\n[[func]]\nname = \"mpqapi_write_file_contents\"\naddr = 0x43B317\nsize = 0x205\n\n[[func]]\nname = \"mpqapi_find_free_block\"\naddr = 0x43B51C\nsize = 0x54\n\n[[func]]\nname = \"mpqapi_rename\"\naddr = 0x43B570\nsize = 0x3F\n\n[[func]]\nname = \"mpqapi_has_file\"\naddr = 0x43B5AF\nsize = 0x10\n\n[[func]]\nname = \"OpenMPQ\"\naddr = 0x43B5BF\nsize = 0x1D2\n\n[[func]]\nname = \"ParseMPQHeader\"\naddr = 0x43B791\nsize = 0xF1\n\n[[func]]\nname = \"CloseMPQ\"\naddr = 0x43B882\nsize = 0x7B\n\n[[func]]\nname = \"mpqapi_store_modified_time\"\naddr = 0x43B8FD\nsize = 0x73\n\n[[func]]\nname = \"mpqapi_flush_and_close\"\naddr = 0x43B970\nsize = 0x5A\n\n[[func]]\nname = \"WriteMPQHeader\"\naddr = 0x43B9CA\nsize = 0x96\n\n[[func]]\nname = \"mpqapi_write_block_table\"\naddr = 0x43BA60\nsize = 0x8B\n\n[[func]]\nname = \"mpqapi_write_hash_table\"\naddr = 0x43BAEB\nsize = 0x8E\n\n[[func]]\nname = \"mpqapi_can_seek\"\naddr = 0x43BB79\nsize = 0x2B\n\n[[func]]\nname = \"msg_send_drop_pkt\"\naddr = 0x43BBB4\nsize = 0x1B\n\n[[func]]\nname = \"msg_send_packet\"\naddr = 0x43BBCF\nsize = 0x62\n\n[[func]]\nname = \"msg_get_next_packet\"\naddr = 0x43BC31\nsize = 0x3C\n\n[[func]]\nname = \"msg_wait_resync\"\naddr = 0x43BC6D\nsize = 0x80\n\n[[func]]\nname = \"msg_free_packets\"\naddr = 0x43BCED\nsize = 0x2C\n\n[[func]]\nname = \"msg_wait_for_turns\"\naddr = 0x43BD19\nsize = 0xD2\n\n[[func]]\nname = \"run_delta_info\"\naddr = 0x43BDEB\nsize = 0x22\n\n[[func]]\nname = \"msg_pre_packet\"\naddr = 0x43BE0D\nsize = 0x67\n\n[[func]]\nname = \"DeltaExportData\"\naddr = 0x43BE74\nsize = 0xB7\n\n[[func]]\nname = \"DeltaExportItem\"\naddr = 0x43BF2B\nsize = 0x30\n\n[[func]]\nname = \"DeltaExportObject\"\naddr = 0x43BF5B\nsize = 0x14\n\n[[func]]\nname = \"DeltaExportMonster\"\naddr = 0x43BF6F\nsize = 0x32\n\n[[func]]\nname = \"DeltaExportJunk\"\naddr = 0x43BFA1\nsize = 0x78\n\n[[func]]\nname = \"msg_comp_level\"\naddr = 0x43C019\nsize = 0x1C\n\n[[func]]\nname = \"delta_init\"\naddr = 0x43C035\nsize = 0x47\n\n[[func]]\nname = \"delta_kill_monster\"\naddr = 0x43C07C\nsize = 0x46\n\n[[func]]\nname = \"delta_monster_hp\"\naddr = 0x43C0C2\nsize = 0x30\n\n[[func]]\nname = \"delta_sync_monster\"\naddr = 0x43C0F2\nsize = 0x42\n\n[[func]]\nname = \"delta_sync_golem\"\naddr = 0x43C134\nsize = 0x49\n\n[[func]]\nname = \"delta_leave_sync\"\naddr = 0x43C17D\nsize = 0xD2\n\n[[func]]\nname = \"delta_portal_inited\"\naddr = 0x43C24F\nsize = 0xE\n\n[[func]]\nname = \"delta_quest_inited\"\naddr = 0x43C25D\nsize = 0xE\n\n[[func]]\nname = \"DeltaAddItem\"\naddr = 0x43C26B\nsize = 0x107\n\n[[func]]\nname = \"DeltaSaveLevel\"\naddr = 0x43C372\nsize = 0x48\n\n[[func]]\nname = \"DeltaLoadLevel\"\naddr = 0x43C3BA\nsize = 0x4B9\n\n[[func]]\nname = \"NetSendCmd\"\naddr = 0x43C873\nsize = 0x1E\n\n[[func]]\nname = \"NetSendCmdGolem\"\naddr = 0x43C891\nsize = 0x36\n\n[[func]]\nname = \"NetSendCmdLoc\"\naddr = 0x43C8C7\nsize = 0x2C\n\n[[func]]\nname = \"NetSendCmdLocParam1\"\naddr = 0x43C8F3\nsize = 0x35\n\n[[func]]\nname = \"NetSendCmdLocParam2\"\naddr = 0x43C928\nsize = 0x3D\n\n[[func]]\nname = \"NetSendCmdLocParam3\"\naddr = 0x43C965\nsize = 0x46\n\n[[func]]\nname = \"NetSendCmdParam1\"\naddr = 0x43C9AB\nsize = 0x28\n\n[[func]]\nname = \"NetSendCmdParam2\"\naddr = 0x43C9D3\nsize = 0x31\n\n[[func]]\nname = \"NetSendCmdParam3\"\naddr = 0x43CA04\nsize = 0x39\n\n[[func]]\nname = \"NetSendCmdQuest\"\naddr = 0x43CA3D\nsize = 0x47\n\n[[func]]\nname = \"NetSendCmdGItem\"\naddr = 0x43CA84\nsize = 0x185\n\n[[func]]\nname = \"NetSendCmdGItem2\"\naddr = 0x43CC09\nsize = 0x6B\n\n[[func]]\nname = \"NetSendCmdReq2\"\naddr = 0x43CC74\nsize = 0x5B\n\n[[func]]\nname = \"NetSendCmdExtra\"\naddr = 0x43CCCF\nsize = 0x29\n\n[[func]]\nname = \"NetSendCmdPItem\"\naddr = 0x43CCF8\nsize = 0x163\n\n[[func]]\nname = \"NetSendCmdChItem\"\naddr = 0x43CE5B\nsize = 0x57\n\n[[func]]\nname = \"NetSendCmdDelItem\"\naddr = 0x43CEB2\nsize = 0x22\n\n[[func]]\nname = \"NetSendCmdDItem\"\naddr = 0x43CED4\nsize = 0x165\n\n[[func]]\nname = \"NetSendCmdDamage\"\naddr = 0x43D039\nsize = 0x2B\n\n[[func]]\nname = \"NetSendCmdString\"\naddr = 0x43D064\nsize = 0x39\n\n[[func]]\nname = \"delta_close_portal\"\naddr = 0x43D09D\nsize = 0x1F\n\n[[func]]\nname = \"ParseCmd\"\naddr = 0x43D0BC\nsize = 0x33F\n\n[[func]]\nname = \"On_DLEVEL\"\naddr = 0x43D56F\nsize = 0xC3\n\n[[func]]\nname = \"DeltaImportData\"\naddr = 0x43D632\nsize = 0x88\n\n[[func]]\nname = \"DeltaImportItem\"\naddr = 0x43D6BA\nsize = 0x3B\n\n[[func]]\nname = \"DeltaImportObject\"\naddr = 0x43D6F5\nsize = 0x14\n\n[[func]]\nname = \"DeltaImportMonster\"\naddr = 0x43D709\nsize = 0x3D\n\n[[func]]\nname = \"DeltaImportJunk\"\naddr = 0x43D746\nsize = 0xAB\n\n[[func]]\nname = \"On_SYNCDATA\"\naddr = 0x43D7F1\nsize = 0xB\n\n[[func]]\nname = \"On_WALKXY\"\naddr = 0x43D7FC\nsize = 0x4E\n\n[[func]]\nname = \"On_ADDSTR\"\naddr = 0x43D84A\nsize = 0x31\n\n[[func]]\nname = \"On_ADDMAG\"\naddr = 0x43D87B\nsize = 0x31\n\n[[func]]\nname = \"On_ADDDEX\"\naddr = 0x43D8AC\nsize = 0x31\n\n[[func]]\nname = \"On_ADDVIT\"\naddr = 0x43D8DD\nsize = 0x31\n\n[[func]]\nname = \"On_SBSPELL\"\naddr = 0x43D90E\nsize = 0x6F\n\n[[func]]\nname = \"msg_errorf\"\naddr = 0x43D97D\nsize = 0x47\n\n[[func]]\nname = \"On_GOTOGETITEM\"\naddr = 0x43D9C4\nsize = 0x52\n\n[[func]]\nname = \"On_REQUESTGITEM\"\naddr = 0x43DA16\nsize = 0xD0\n\n[[func]]\nname = \"i_own_level\"\naddr = 0x43DAE6\nsize = 0x47\n\n[[func]]\nname = \"On_GETITEM\"\naddr = 0x43DB2D\nsize = 0x110\n\n[[func]]\nname = \"delta_get_item\"\naddr = 0x43DC3D\nsize = 0x103\n\n[[func]]\nname = \"On_GOTOAGETITEM\"\naddr = 0x43DD40\nsize = 0x52\n\n[[func]]\nname = \"On_REQUESTAGITEM\"\naddr = 0x43DD92\nsize = 0xCE\n\n[[func]]\nname = \"On_AGETITEM\"\naddr = 0x43DE60\nsize = 0x10E\n\n[[func]]\nname = \"On_ITEMEXTRA\"\naddr = 0x43DF6E\nsize = 0x5B\n\n[[func]]\nname = \"On_PUTITEM\"\naddr = 0x43DFC9\nsize = 0x105\n\n[[func]]\nname = \"delta_put_item\"\naddr = 0x43E0CE\nsize = 0xAB\n\n[[func]]\nname = \"check_update_plr\"\naddr = 0x43E179\nsize = 0x1A\n\n[[func]]\nname = \"On_SYNCPUTITEM\"\naddr = 0x43E193\nsize = 0xF1\n\n[[func]]\nname = \"On_RESPAWNITEM\"\naddr = 0x43E284\nsize = 0xA6\n\n[[func]]\nname = \"On_ATTACKXY\"\naddr = 0x43E32A\nsize = 0x5C\n\n[[func]]\nname = \"On_SATTACKXY\"\naddr = 0x43E386\nsize = 0x4F\n\n[[func]]\nname = \"On_RATTACKXY\"\naddr = 0x43E3D5\nsize = 0x4F\n\n[[func]]\nname = \"On_SPELLXYD\"\naddr = 0x43E424\nsize = 0xAE\n\n[[func]]\nname = \"On_SPELLXY\"\naddr = 0x43E4D2\nsize = 0xA4\n\n[[func]]\nname = \"On_TSPELLXY\"\naddr = 0x43E576\nsize = 0xA4\n\n[[func]]\nname = \"On_OPOBJXY\"\naddr = 0x43E61A\nsize = 0x70\n\n[[func]]\nname = \"On_DISARMXY\"\naddr = 0x43E68A\nsize = 0x70\n\n[[func]]\nname = \"On_OPOBJT\"\naddr = 0x43E6FA\nsize = 0x38\n\n[[func]]\nname = \"On_ATTACKID\"\naddr = 0x43E732\nsize = 0xAD\n\n[[func]]\nname = \"On_ATTACKPID\"\naddr = 0x43E7DF\nsize = 0x61\n\n[[func]]\nname = \"On_RATTACKID\"\naddr = 0x43E840\nsize = 0x45\n\n[[func]]\nname = \"On_RATTACKPID\"\naddr = 0x43E885\nsize = 0x45\n\n[[func]]\nname = \"On_SPELLID\"\naddr = 0x43E8CA\nsize = 0x9A\n\n[[func]]\nname = \"On_SPELLPID\"\naddr = 0x43E964\nsize = 0x9A\n\n[[func]]\nname = \"On_TSPELLID\"\naddr = 0x43E9FE\nsize = 0x9A\n\n[[func]]\nname = \"On_TSPELLPID\"\naddr = 0x43EA98\nsize = 0x9A\n\n[[func]]\nname = \"On_KNOCKBACK\"\naddr = 0x43EB32\nsize = 0x42\n\n[[func]]\nname = \"On_RESURRECT\"\naddr = 0x43EB74\nsize = 0x30\n\n[[func]]\nname = \"On_HEALOTHER\"\naddr = 0x43EBA4\nsize = 0x31\n\n[[func]]\nname = \"On_TALKXY\"\naddr = 0x43EBD5\nsize = 0x52\n\n[[func]]\nname = \"On_NEWLVL\"\naddr = 0x43EC27\nsize = 0x34\n\n[[func]]\nname = \"On_WARP\"\naddr = 0x43EC5B\nsize = 0x5F\n\n[[func]]\nname = \"On_MONSTDEATH\"\naddr = 0x43ECBA\nsize = 0x69\n\n[[func]]\nname = \"On_KILLGOLEM\"\naddr = 0x43ED23\nsize = 0x66\n\n[[func]]\nname = \"On_AWAKEGOLEM\"\naddr = 0x43ED89\nsize = 0xB4\n\n[[func]]\nname = \"On_MONSTDAMAGE\"\naddr = 0x43EE3D\nsize = 0xB8\n\n[[func]]\nname = \"On_PLRDEAD\"\naddr = 0x43EEF5\nsize = 0x38\n\n[[func]]\nname = \"On_PLRDAMAGE\"\naddr = 0x43EF2D\nsize = 0xB0\n\n[[func]]\nname = \"On_OPENDOOR\"\naddr = 0x43EFDD\nsize = 0x56\n\n[[func]]\nname = \"delta_sync_object\"\naddr = 0x43F033\nsize = 0x25\n\n[[func]]\nname = \"On_CLOSEDOOR\"\naddr = 0x43F058\nsize = 0x56\n\n[[func]]\nname = \"On_OPERATEOBJ\"\naddr = 0x43F0AE\nsize = 0x56\n\n[[func]]\nname = \"On_PLROPOBJ\"\naddr = 0x43F104\nsize = 0x58\n\n[[func]]\nname = \"On_BREAKOBJ\"\naddr = 0x43F15C\nsize = 0x54\n\n[[func]]\nname = \"On_CHANGEPLRITEMS\"\naddr = 0x43F1B0\nsize = 0x40\n\n[[func]]\nname = \"On_DELPLRITEMS\"\naddr = 0x43F1F0\nsize = 0x2E\n\n[[func]]\nname = \"On_PLRLEVEL\"\naddr = 0x43F21E\nsize = 0x3A\n\n[[func]]\nname = \"On_DROPITEM\"\naddr = 0x43F258\nsize = 0x37\n\n[[func]]\nname = \"On_SEND_PLRINFO\"\naddr = 0x43F28F\nsize = 0x3A\n\n[[func]]\nname = \"On_ACK_PLRINFO\"\naddr = 0x43F2C9\nsize = 0x5\n\n[[func]]\nname = \"On_PLAYER_JOINLEVEL\"\naddr = 0x43F2CE\nsize = 0x17A\n\n[[func]]\nname = \"On_ACTIVATEPORTAL\"\naddr = 0x43F448\nsize = 0xD9\n\n[[func]]\nname = \"delta_open_portal\"\naddr = 0x43F521\nsize = 0x3B\n\n[[func]]\nname = \"On_DEACTIVATEPORTAL\"\naddr = 0x43F55C\nsize = 0x3E\n\n[[func]]\nname = \"On_RETOWN\"\naddr = 0x43F59A\nsize = 0x39\n\n[[func]]\nname = \"On_SETSTR\"\naddr = 0x43F5D3\nsize = 0x39\n\n[[func]]\nname = \"On_SETDEX\"\naddr = 0x43F60C\nsize = 0x39\n\n[[func]]\nname = \"On_SETMAG\"\naddr = 0x43F645\nsize = 0x39\n\n[[func]]\nname = \"On_SETVIT\"\naddr = 0x43F67E\nsize = 0x39\n\n[[func]]\nname = \"On_STRING\"\naddr = 0x43F6B7\nsize = 0x0B\n\n[[func]]\nname = \"On_STRING2\"\naddr = 0x43F6C2\nsize = 0x2A\n\n[[func]]\nname = \"On_SYNCQUEST\"\naddr = 0x43F6EC\nsize = 0x42\n\n[[func]]\nname = \"On_ENDSHIELD\"\naddr = 0x43F72E\nsize = 0x77\n\n[[func]]\nname = \"On_CHEAT_EXPERIENCE\"\naddr = 0x43F7A5\nsize = 0x4\n\n[[func]]\nname = \"On_CHEAT_SPELL_LEVEL\"\naddr = 0x43F7A5\nsize = 0x4\n\n[[func]]\nname = \"On_DEBUG\"\naddr = 0x43F7A5\nsize = 0x4\n\n[[func]]\nname = \"On_NOVA\"\naddr = 0x43F7A9\nsize = 0x6F\n\n[[func]]\nname = \"On_SETSHIELD\"\naddr = 0x43F818\nsize = 0x18\n\n[[func]]\nname = \"On_REMSHIELD\"\naddr = 0x43F830\nsize = 0x19\n\n[[func]]\nname = \"msgcmd_cmd_cleanup\"\naddr = 0x43F88D\nsize = 0xA\n\n[[func]]\nname = \"msgcmd_send_chat\"\naddr = 0x43F897\nsize = 0x3D\n\n[[func]]\nname = \"msgcmd_add_server_cmd_W\"\naddr = 0x43F8D4\nsize = 0x11\n\n[[func]]\nname = \"msgcmd_add_server_cmd\"\naddr = 0x43F8E5\nsize = 0x3B\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::TList<EXTERNMESSAGE>\"\naddr = 0x43F920\nsize = 0x16\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::DeleteAll\"\naddr = 0x43F936\nsize = 0x28\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::Remove\"\naddr = 0x43F95E\nsize = 0x3B\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::Create\"\naddr = 0x43F999\nsize = 0x4C\n\n[[func]]\nname = \"EXTERNMESSAGE::Delete\"\naddr = 0x43F9E5\nsize = 0x2F\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::Insert\"\naddr = 0x43FA14\nsize = 0x71\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::UnlinkAll\"\naddr = 0x43FA85\nsize = 0x13\n\n[[func]]\nname = \"TLink<EXTERNMESSAGE>::Unlink\"\naddr = 0x43FA98\nsize = 0x2C\n\n[[func]]\nname = \"multi_msg_add\"\naddr = 0x43FAD4\nsize = 0xE\n\n[[func]]\nname = \"NetSendLoPri\"\naddr = 0x43FAE2\nsize = 0x29\n\n[[func]]\nname = \"multi_copy_packet\"\naddr = 0x43FB0B\nsize = 0x42\n\n[[func]]\nname = \"multi_send_packet\"\naddr = 0x43FB4D\nsize = 0x68\n\n[[func]]\nname = \"NetRecvPlrData\"\naddr = 0x43FBB5\nsize = 0xBA\n\n[[func]]\nname = \"NetSendHiPri\"\naddr = 0x43FC6F\nsize = 0xB8\n\n[[func]]\nname = \"multi_recv_packet\"\naddr = 0x43FD27\nsize = 0x69\n\n[[func]]\nname = \"multi_send_msg_packet\"\naddr = 0x43FD90\nsize = 0x7E\n\n[[func]]\nname = \"multi_msg_countdown\"\naddr = 0x43FE0E\nsize = 0x2F\n\n[[func]]\nname = \"multi_parse_turn\"\naddr = 0x43FE3D\nsize = 0x48\n\n[[func]]\nname = \"multi_handle_turn_upper_bit\"\naddr = 0x43FE85\nsize = 0x32\n\n[[func]]\nname = \"multi_player_left\"\naddr = 0x43FEB7\nsize = 0x13\n\n[[func]]\nname = \"multi_clear_left_tbl\"\naddr = 0x43FECA\nsize = 0x44\n\n[[func]]\nname = \"multi_player_left_msg\"\naddr = 0x43FF0E\nsize = 0x8F\n\n[[func]]\nname = \"multi_net_ping\"\naddr = 0x43FF9D\nsize = 0x13\n\n[[func]]\nname = \"multi_handle_delta\"\naddr = 0x43FFB0\nsize = 0xA8\n\n[[func]]\nname = \"multi_check_pkt_valid\"\naddr = 0x440058\nsize = 0x8\n\n[[func]]\nname = \"multi_mon_seeds\"\naddr = 0x440060\nsize = 0x33\n\n[[func]]\nname = \"multi_begin_timeout\"\naddr = 0x440093\nsize = 0x95\n\n[[func]]\nname = \"multi_check_drop_player\"\naddr = 0x440128\nsize = 0x2B\n\n[[func]]\nname = \"multi_process_network_packets\"\naddr = 0x440153\nsize = 0x2CA\n\n[[func]]\nname = \"multi_handle_all_packets\"\naddr = 0x44041D\nsize = 0x27\n\n[[func]]\nname = \"multi_process_tmsgs\"\naddr = 0x440444\nsize = 0x33\n\n[[func]]\nname = \"multi_send_zero_packet\"\naddr = 0x440477\nsize = 0xE6\n\n[[func]]\nname = \"NetClose\"\naddr = 0x44055D\nsize = 0x47\n\n[[func]]\nname = \"multi_event_handler\"\naddr = 0x4405A4\nsize = 0x48\n\n[[func]]\nname = \"multi_handle_events\"\naddr = 0x4405EC\nsize = 0xA8\n\n[[func]]\nname = \"NetInit\"\naddr = 0x440694\nsize = 0x2FE\n\n[[func]]\nname = \"buffer_init\"\naddr = 0x440992\nsize = 0x8\n\n[[func]]\nname = \"multi_send_pinfo\"\naddr = 0x44099A\nsize = 0x3B\n\n[[func]]\nname = \"InitLevelType\"\naddr = 0x4409D5\nsize = 0x30\n\n[[func]]\nname = \"SetupLocalCoords\"\naddr = 0x440A05\nsize = 0x96\n\n[[func]]\nname = \"multi_init_single\"\naddr = 0x440A9B\nsize = 0x6E\n\n[[func]]\nname = \"multi_init_multi\"\naddr = 0x440B09\nsize = 0xD2\n\n[[func]]\nname = \"multi_upgrade\"\naddr = 0x440BDB\nsize = 0x3C\n\n[[func]]\nname = \"recv_plrinfo\"\naddr = 0x440C17\nsize = 0x197\n\n[[func]]\nname = \"nthread_terminate_game\"\naddr = 0x440DEC\nsize = 0x3C\n\n[[func]]\nname = \"nthread_send_and_recv_turn\"\naddr = 0x440E28\nsize = 0x82\n\n[[func]]\nname = \"nthread_recv_turns\"\naddr = 0x440EAA\nsize = 0xAC\n\n[[func]]\nname = \"nthread_set_turn_upper_bit\"\naddr = 0x440F56\nsize = 0xB\n\n[[func]]\nname = \"nthread_start\"\naddr = 0x440F61\nsize = 0x16E\n\n[[func]]\nname = \"nthread_handler\"\naddr = 0x4410CF\nsize = 0x76\n\n[[func]]\nname = \"nthread_cleanup\"\naddr = 0x441145\nsize = 0x7F\n\n[[func]]\nname = \"nthread_ignore_mutex\"\naddr = 0x4411C4\nsize = 0x2B\n\n[[func]]\nname = \"nthread_has_500ms_passed\"\naddr = 0x4411EF\nsize = 0x2E\n\n[[func]]\nname = \"InitObjectGFX\"\naddr = 0x44121D\nsize = 0xFA\n\n[[func]]\nname = \"FreeObjectGFX\"\naddr = 0x441317\nsize = 0x2E\n\n[[func]]\nname = \"RndLocOk\"\naddr = 0x441345\nsize = 0x5B\n\n[[func]]\nname = \"InitRndLocObj\"\naddr = 0x4413A0\nsize = 0xD7\n\n[[func]]\nname = \"InitRndLocBigObj\"\naddr = 0x441477\nsize = 0x10D\n\n[[func]]\nname = \"InitRndLocObj5x5\"\naddr = 0x441584\nsize = 0xB7\n\n[[func]]\nname = \"ClrAllObjects\"\naddr = 0x44163B\nsize = 0x6D\n\n[[func]]\nname = \"AddTortures\"\naddr = 0x4416A8\nsize = 0xF7\n\n[[func]]\nname = \"AddCandles\"\naddr = 0x44179F\nsize = 0x49\n\n[[func]]\nname = \"AddBookLever\"\naddr = 0x4417E8\nsize = 0x11C\n\n[[func]]\nname = \"InitRndBarrels\"\naddr = 0x441904\nsize = 0xFC\n\n[[func]]\nname = \"AddL1Objs\"\naddr = 0x441A00\nsize = 0x98\n\n[[func]]\nname = \"AddL2Objs\"\naddr = 0x441A98\nsize = 0x7E\n\n[[func]]\nname = \"AddL3Objs\"\naddr = 0x441B16\nsize = 0x74\n\n[[func]]\nname = \"WallTrapLocOk\"\naddr = 0x441B8A\nsize = 0x16\n\n[[func]]\nname = \"AddL2Torches\"\naddr = 0x441BA0\nsize = 0xEC\n\n[[func]]\nname = \"TorchLocOK\"\naddr = 0x441C8C\nsize = 0x27\n\n[[func]]\nname = \"AddObjTraps\"\naddr = 0x441CB3\nsize = 0x1A5\n\n[[func]]\nname = \"AddChestTraps\"\naddr = 0x441E58\nsize = 0x8C\n\n[[func]]\nname = \"LoadMapObjects\"\naddr = 0x441EE4\nsize = 0xCB\n\n[[func]]\nname = \"LoadMapObjs\"\naddr = 0x441FAF\nsize = 0x87\n\n[[func]]\nname = \"AddDiabObjs\"\naddr = 0x442036\nsize = 0xBC\n\n[[func]]\nname = \"AddStoryBooks\"\naddr = 0x4420F2\nsize = 0xD8\n\n[[func]]\nname = \"AddHookedBodies\"\naddr = 0x4421CA\nsize = 0xD5\n\n[[func]]\nname = \"AddL4Goodies\"\naddr = 0x44229F\nsize = 0x77\n\n[[func]]\nname = \"AddLazStand\"\naddr = 0x442316\nsize = 0x102\n\n[[func]]\nname = \"InitObjects\"\naddr = 0x442418\nsize = 0x3AD\n\n[[func]]\nname = \"SetMapObjects\"\naddr = 0x4427C5\nsize = 0x166\n\n[[func]]\nname = \"DeleteObject_\"\naddr = 0x44292B\nsize = 0x50\n\n[[func]]\nname = \"SetupObject\"\naddr = 0x44297B\nsize = 0x122\n\n[[func]]\nname = \"SetObjMapRange\"\naddr = 0x442A9D\nsize = 0x34\n\n[[func]]\nname = \"SetBookMsg\"\naddr = 0x442AD1\nsize = 0xA\n\n[[func]]\nname = \"AddL1Door\"\naddr = 0x442ADB\nsize = 0x51\n\n[[func]]\nname = \"AddSCambBook\"\naddr = 0x442B2C\nsize = 0x49\n\n[[func]]\nname = \"AddChest\"\naddr = 0x442B75\nsize = 0xB2\n\n[[func]]\nname = \"AddL2Door\"\naddr = 0x442C27\nsize = 0x3B\n\n[[func]]\nname = \"AddL3Door\"\naddr = 0x442C62\nsize = 0x3B\n\n[[func]]\nname = \"AddSarc\"\naddr = 0x442C9D\nsize = 0x51\n\n[[func]]\nname = \"AddFlameTrap\"\naddr = 0x442CEE\nsize = 0x28\n\n[[func]]\nname = \"AddFlameLvr\"\naddr = 0x442D16\nsize = 0x19\n\n[[func]]\nname = \"AddTrap\"\naddr = 0x442D2F\nsize = 0x5B\n\n[[func]]\nname = \"AddObjLight\"\naddr = 0x442D8A\nsize = 0x37\n\n[[func]]\nname = \"AddBarrel\"\naddr = 0x442DC1\nsize = 0x4E\n\n[[func]]\nname = \"AddShrine\"\naddr = 0x442E0F\nsize = 0xA3\n\n[[func]]\nname = \"AddBookcase\"\naddr = 0x442EB2\nsize = 0x1D\n\n[[func]]\nname = \"AddPurifyingFountain\"\naddr = 0x442ECF\nsize = 0x39\n\n[[func]]\nname = \"AddArmorStand\"\naddr = 0x442F08\nsize = 0x32\n\n[[func]]\nname = \"AddDecap\"\naddr = 0x442F3A\nsize = 0x2E\n\n[[func]]\nname = \"AddVilebook\"\naddr = 0x442F68\nsize = 0x20\n\n[[func]]\nname = \"AddMagicCircle\"\naddr = 0x442F88\nsize = 0x29\n\n[[func]]\nname = \"AddBookstand\"\naddr = 0x442FB1\nsize = 0x13\n\n[[func]]\nname = \"AddPedistal\"\naddr = 0x442FC4\nsize = 0x38\n\n[[func]]\nname = \"AddStoryBook\"\naddr = 0x442FFC\nsize = 0x92\n\n[[func]]\nname = \"AddWeaponRack\"\naddr = 0x44308E\nsize = 0x32\n\n[[func]]\nname = \"AddTorturedBody\"\naddr = 0x4430C0\nsize = 0x2E\n\n[[func]]\nname = \"GetRndObjLoc\"\naddr = 0x4430EE\nsize = 0x8A\n\n[[func]]\nname = \"AddMushPatch\"\naddr = 0x443178\nsize = 0x5C\n\n[[func]]\nname = \"AddSlainHero\"\naddr = 0x4431D4\nsize = 0x2B\n\n[[func]]\nname = \"AddObject\"\naddr = 0x4431FF\nsize = 0x1EB\n\n[[func]]\nname = \"Obj_Light\"\naddr = 0x4434CB\nsize = 0xEA\n\n[[func]]\nname = \"Obj_Circle\"\naddr = 0x4435B5\nsize = 0x172\n\n[[func]]\nname = \"Obj_StopAnim\"\naddr = 0x443727\nsize = 0x23\n\n[[func]]\nname = \"Obj_Door\"\naddr = 0x44374A\nsize = 0x83\n\n[[func]]\nname = \"Obj_Sarc\"\naddr = 0x4437CD\nsize = 0x19\n\n[[func]]\nname = \"ActivateTrapLine\"\naddr = 0x4437E6\nsize = 0x6F\n\n[[func]]\nname = \"Obj_FlameTrap\"\naddr = 0x443855\nsize = 0x111\n\n[[func]]\nname = \"Obj_Trap\"\naddr = 0x443966\nsize = 0x16F\n\n[[func]]\nname = \"Obj_BCrossDamage\"\naddr = 0x443AD5\nsize = 0xFD\n\n[[func]]\nname = \"ProcessObjects\"\naddr = 0x443BD2\nsize = 0x197\n\n[[func]]\nname = \"ObjSetMicro\"\naddr = 0x443D69\nsize = 0x81\n\n[[func]]\nname = \"objects_set_door_piece\"\naddr = 0x443DEA\nsize = 0x78\n\n[[func]]\nname = \"ObjSetMini\"\naddr = 0x443E62\nsize = 0x78\n\n[[func]]\nname = \"ObjL1Special\"\naddr = 0x443EDA\nsize = 0xEC\n\n[[func]]\nname = \"ObjL2Special\"\naddr = 0x443FC6\nsize = 0xFC\n\n[[func]]\nname = \"DoorSet\"\naddr = 0x4440C2\nsize = 0x184\n\n[[func]]\nname = \"RedoPlayerVision\"\naddr = 0x444246\nsize = 0x35\n\n[[func]]\nname = \"OperateL1RDoor\"\naddr = 0x44427B\nsize = 0x1C1\n\n[[func]]\nname = \"OperateL1LDoor\"\naddr = 0x44443C\nsize = 0x1D7\n\n[[func]]\nname = \"OperateL2RDoor\"\naddr = 0x444613\nsize = 0x162\n\n[[func]]\nname = \"OperateL2LDoor\"\naddr = 0x444775\nsize = 0x162\n\n[[func]]\nname = \"OperateL3RDoor\"\naddr = 0x4448D7\nsize = 0x165\n\n[[func]]\nname = \"OperateL3LDoor\"\naddr = 0x444A3C\nsize = 0x165\n\n[[func]]\nname = \"MonstCheckDoors\"\naddr = 0x444BA1\nsize = 0x222\n\n[[func]]\nname = \"ObjChangeMap\"\naddr = 0x444DC3\nsize = 0xDB\n\n[[func]]\nname = \"ObjChangeMapResync\"\naddr = 0x444E9E\nsize = 0xB1\n\n[[func]]\nname = \"OperateL1Door\"\naddr = 0x444F4F\nsize = 0x8F\n\n[[func]]\nname = \"OperateLever\"\naddr = 0x444FDE\nsize = 0xCE\n\n[[func]]\nname = \"OperateBook\"\naddr = 0x4450AC\nsize = 0x225\n\n[[func]]\nname = \"OperateBookLever\"\naddr = 0x4452D1\nsize = 0x1B2\n\n[[func]]\nname = \"OperateSChambBk\"\naddr = 0x445483\nsize = 0xD7\n\n[[func]]\nname = \"OperateChest\"\naddr = 0x44555A\nsize = 0x189\n\n[[func]]\nname = \"OperateMushPatch\"\naddr = 0x4456E3\nsize = 0xD5\n\n[[func]]\nname = \"OperateInnSignChest\"\naddr = 0x4457B8\nsize = 0xC8\n\n[[func]]\nname = \"OperateSlainHero\"\naddr = 0x445880\nsize = 0xD4\n\n[[func]]\nname = \"OperateTrapLvr\"\naddr = 0x445954\nsize = 0xB7\n\n[[func]]\nname = \"OperateSarc\"\naddr = 0x445A0B\nsize = 0xD1\n\n[[func]]\nname = \"OperateL2Door\"\naddr = 0x445ADC\nsize = 0x90\n\n[[func]]\nname = \"OperateL3Door\"\naddr = 0x445B6C\nsize = 0x90\n\n[[func]]\nname = \"OperatePedistal\"\naddr = 0x445BFC\nsize = 0x163\n\n[[func]]\nname = \"TryDisarm\"\naddr = 0x445D5F\nsize = 0xD4\n\n[[func]]\nname = \"ItemMiscIdIdx\"\naddr = 0x445E33\nsize = 0x18\n\n[[func]]\nname = \"OperateShrine\"\naddr = 0x445E4B\nsize = 0xFB7\n\n[[func]]\nname = \"OperateSkelBook\"\naddr = 0x446E6A\nsize = 0x9E\n\n[[func]]\nname = \"OperateBookCase\"\naddr = 0x446F08\nsize = 0xE0\n\n[[func]]\nname = \"OperateDecap\"\naddr = 0x446FE8\nsize = 0x5E\n\n[[func]]\nname = \"OperateArmorStand\"\naddr = 0x447046\nsize = 0xC6\n\n[[func]]\nname = \"FindValidShrine\"\naddr = 0x44710C\nsize = 0x53\n\n[[func]]\nname = \"OperateGoatShrine\"\naddr = 0x44715F\nsize = 0x4B\n\n[[func]]\nname = \"OperateCauldron\"\naddr = 0x4471AA\nsize = 0x52\n\n[[func]]\nname = \"OperateFountains\"\naddr = 0x4471FC\nsize = 0x2B1\n\n[[func]]\nname = \"OperateWeaponRack\"\naddr = 0x4474AD\nsize = 0xAB\n\n[[func]]\nname = \"OperateStoryBook\"\naddr = 0x447558\nsize = 0x63\n\n[[func]]\nname = \"OperateLazStand\"\naddr = 0x4475BB\nsize = 0x65\n\n[[func]]\nname = \"OperateObject\"\naddr = 0x447620\nsize = 0x249\n\n[[func]]\nname = \"SyncOpL1Door\"\naddr = 0x447932\nsize = 0x71\n\n[[func]]\nname = \"SyncOpL2Door\"\naddr = 0x4479A3\nsize = 0x72\n\n[[func]]\nname = \"SyncOpL3Door\"\naddr = 0x447A15\nsize = 0x72\n\n[[func]]\nname = \"SyncOpObject\"\naddr = 0x447A87\nsize = 0xED\n\n[[func]]\nname = \"BreakCrux\"\naddr = 0x447C2D\nsize = 0xC2\n\n[[func]]\nname = \"BreakBarrel\"\naddr = 0x447CEF\nsize = 0x274\n\n[[func]]\nname = \"BreakObject\"\naddr = 0x447F63\nsize = 0x8C\n\n[[func]]\nname = \"SyncBreakObj\"\naddr = 0x447FEF\nsize = 0x21\n\n[[func]]\nname = \"SyncL1Doors\"\naddr = 0x448010\nsize = 0xAB\n\n[[func]]\nname = \"SyncCrux\"\naddr = 0x4480BB\nsize = 0x7E\n\n[[func]]\nname = \"SyncLever\"\naddr = 0x448139\nsize = 0x2A\n\n[[func]]\nname = \"SyncQSTLever\"\naddr = 0x448163\nsize = 0x6F\n\n[[func]]\nname = \"SyncPedistal\"\naddr = 0x4481D2\nsize = 0xC6\n\n[[func]]\nname = \"SyncL2Doors\"\naddr = 0x448298\nsize = 0x86\n\n[[func]]\nname = \"SyncL3Doors\"\naddr = 0x44831E\nsize = 0x92\n\n[[func]]\nname = \"SyncObjectAnim\"\naddr = 0x4483B0\nsize = 0xAE\n\n[[func]]\nname = \"GetObjectStr\"\naddr = 0x44845E\nsize = 0x20E\n\n[[func]]\nname = \"PackPlayer\"\naddr = 0x448765\nsize = 0x1EE\n\n[[func]]\nname = \"PackItem\"\naddr = 0x448953\nsize = 0x10B\n\n[[func]]\nname = \"VerifyGoldSeeds\"\naddr = 0x448A5E\nsize = 0x72\n\n[[func]]\nname = \"UnPackPlayer\"\naddr = 0x448AD0\nsize = 0x278\n\n[[func]]\nname = \"UnPackItem\"\naddr = 0x448D48\nsize = 0xAD\n\n[[func]]\nname = \"SaveGamma\"\naddr = 0x448E05\nsize = 0x2E\n\n[[func]]\nname = \"palette_init\"\naddr = 0x448E33\nsize = 0x78\n\n[[func]]\nname = \"LoadGamma\"\naddr = 0x448EAB\nsize = 0x75\n\n[[func]]\nname = \"LoadSysPal\"\naddr = 0x448F20\nsize = 0xA9\n\n[[func]]\nname = \"LoadPalette\"\naddr = 0x448FC9\nsize = 0x5C\n\n[[func]]\nname = \"LoadRndLvlPal\"\naddr = 0x449025\nsize = 0x47\n\n[[func]]\nname = \"ResetPal\"\naddr = 0x44906C\nsize = 0x2B\n\n[[func]]\nname = \"IncreaseGamma\"\naddr = 0x449097\nsize = 0x39\n\n[[func]]\nname = \"palette_update\"\naddr = 0x4490D0\nsize = 0x37\n\n[[func]]\nname = \"ApplyGamma\"\naddr = 0x449107\nsize = 0xC9\n\n[[func]]\nname = \"DecreaseGamma\"\naddr = 0x4491D0\nsize = 0x39\n\n[[func]]\nname = \"UpdateGamma\"\naddr = 0x449209\nsize = 0x35\n\n[[func]]\nname = \"BlackPalette\"\naddr = 0x44923E\nsize = 0x7\n\n[[func]]\nname = \"SetFadeLevel\"\naddr = 0x449245\nsize = 0x6B\n\n[[func]]\nname = \"PaletteFadeIn\"\naddr = 0x4492B0\nsize = 0x56\n\n[[func]]\nname = \"PaletteFadeOut\"\naddr = 0x449306\nsize = 0x30\n\n[[func]]\nname = \"palette_update_caves\"\naddr = 0x449336\nsize = 0x62\n\n[[func]]\nname = \"palette_update_quest_palette\"\naddr = 0x449398\nsize = 0x2E\n\n[[func]]\nname = \"palette_get_color_cycling\"\naddr = 0x4493C6\nsize = 0x6\n\n[[func]]\nname = \"palette_set_color_cycling\"\naddr = 0x4493CC\nsize = 0x8\n\n[[func]]\nname = \"FindPath\"\naddr = 0x4493D4\nsize = 0xFF\n\n[[func]]\nname = \"path_get_h_cost\"\naddr = 0x4494D3\nsize = 0x31\n\n[[func]]\nname = \"path_check_equal\"\naddr = 0x449504\nsize = 0x18\n\n[[func]]\nname = \"GetNextPath\"\naddr = 0x44951C\nsize = 0x2A\n\n[[func]]\nname = \"path_solid_pieces\"\naddr = 0x449546\nsize = 0xA7\n\n[[func]]\nname = \"path_get_path\"\naddr = 0x4495ED\nsize = 0x82\n\n[[func]]\nname = \"path_parent_path\"\naddr = 0x44966F\nsize = 0x12B\n\n[[func]]\nname = \"path_get_node1\"\naddr = 0x44979A\nsize = 0x19\n\n[[func]]\nname = \"path_get_node2\"\naddr = 0x4497B3\nsize = 0x19\n\n[[func]]\nname = \"path_next_node\"\naddr = 0x4497CC\nsize = 0x2B\n\n[[func]]\nname = \"path_set_coords\"\naddr = 0x4497F7\nsize = 0x99\n\n[[func]]\nname = \"path_push_active_step\"\naddr = 0x449890\nsize = 0x13\n\n[[func]]\nname = \"path_pop_active_step\"\naddr = 0x4498A3\nsize = 0x13\n\n[[func]]\nname = \"path_new_step\"\naddr = 0x4498B6\nsize = 0x36\n\n[[func]]\nname = \"pfile_init_save_directory\"\naddr = 0x4498FC\nsize = 0x5F\n\n[[func]]\nname = \"pfile_check_available_space\"\naddr = 0x44995B\nsize = 0x68\n\n[[func]]\nname = \"pfile_write_hero\"\naddr = 0x4499C3\nsize = 0x70\n\n[[func]]\nname = \"pfile_get_save_num_from_name\"\naddr = 0x449A33\nsize = 0x28\n\n[[func]]\nname = \"pfile_encode_hero\"\naddr = 0x449A5B\nsize = 0x84\n\n[[func]]\nname = \"pfile_open_archive\"\naddr = 0x449ADF\nsize = 0x51\n\n[[func]]\nname = \"pfile_get_save_path\"\naddr = 0x449B30\nsize = 0x82\n\n[[func]]\nname = \"pfile_flush\"\naddr = 0x449BB2\nsize = 0x32\n\n[[func]]\nname = \"pfile_create_player_description\"\naddr = 0x449BE4\nsize = 0x76\n\n[[func]]\nname = \"pfile_rename_hero\"\naddr = 0x449C5A\nsize = 0xC8\n\n[[func]]\nname = \"pfile_flush_W\"\naddr = 0x449D22\nsize = 0x21\n\n[[func]]\nname = \"game_2_ui_player\"\naddr = 0x449D43\nsize = 0x8D\n\n[[func]]\nname = \"game_2_ui_class\"\naddr = 0x449DD0\nsize = 0x13\n\n[[func]]\nname = \"pfile_ui_set_hero_infos\"\naddr = 0x449DE3\nsize = 0x1C7\n\n[[func]]\nname = \"GetSaveDirectory\"\naddr = 0x449FAA\nsize = 0x8C\n\n[[func]]\nname = \"pfile_read_hero\"\naddr = 0x44A036\nsize = 0x122\n\n[[func]]\nname = \"pfile_open_save_archive\"\naddr = 0x44A158\nsize = 0x3A\n\n[[func]]\nname = \"pfile_SFileCloseArchive\"\naddr = 0x44A192\nsize = 0x7\n\n[[func]]\nname = \"pfile_archive_contains_game\"\naddr = 0x44A199\nsize = 0x33\n\n[[func]]\nname = \"pfile_ui_set_class_stats\"\naddr = 0x44A1CC\nsize = 0x44\n\n[[func]]\nname = \"pfile_get_player_class\"\naddr = 0x44A210\nsize = 0x10\n\n[[func]]\nname = \"pfile_ui_save_create\"\naddr = 0x44A220\nsize = 0xDF\n\n[[func]]\nname = \"pfile_get_file_name\"\naddr = 0x44A2FF\nsize = 0x57\n\n[[func]]\nname = \"pfile_delete_save\"\naddr = 0x44A356\nsize = 0x4A\n\n[[func]]\nname = \"pfile_read_player_from_save\"\naddr = 0x44A3A0\nsize = 0x79\n\n[[func]]\nname = \"GetTempLevelNames\"\naddr = 0x44A419\nsize = 0x4A\n\n[[func]]\nname = \"GetPermLevelNames\"\naddr = 0x44A463\nsize = 0x86\n\n[[func]]\nname = \"pfile_get_game_name\"\naddr = 0x44A4E9\nsize = 0x29\n\n[[func]]\nname = \"pfile_remove_temp_files\"\naddr = 0x44A512\nsize = 0x51\n\n[[func]]\nname = \"GetTempSaveNames\"\naddr = 0x44A563\nsize = 0x35\n\n[[func]]\nname = \"pfile_rename_temp_to_perm\"\naddr = 0x44A598\nsize = 0xAC\n\n[[func]]\nname = \"GetPermSaveNames\"\naddr = 0x44A644\nsize = 0x35\n\n[[func]]\nname = \"pfile_write_save_file\"\naddr = 0x44A679\nsize = 0xAE\n\n[[func]]\nname = \"pfile_strcpy\"\naddr = 0x44A727\nsize = 0xA\n\n[[func]]\nname = \"pfile_read\"\naddr = 0x44A731\nsize = 0x182\n\n[[func]]\nname = \"pfile_update\"\naddr = 0x44A8B3\nsize = 0x33\n\n[[func]]\nname = \"SetPlayerGPtrs\"\naddr = 0x44A8F6\nsize = 0x1B\n\n[[func]]\nname = \"LoadPlrGFX\"\naddr = 0x44A911\nsize = 0x25F\n\n[[func]]\nname = \"InitPlayerGFX\"\naddr = 0x44AB70\nsize = 0x44\n\n[[func]]\nname = \"InitPlrGFXMem\"\naddr = 0x44ABB4\nsize = 0x214\n\n[[func]]\nname = \"GetPlrGFXSize\"\naddr = 0x44ADC8\nsize = 0xC1\n\n[[func]]\nname = \"FreePlayerGFX\"\naddr = 0x44AE89\nsize = 0xAE\n\n[[func]]\nname = \"NewPlrAnim\"\naddr = 0x44AF37\nsize = 0x65\n\n[[func]]\nname = \"ClearPlrPVars\"\naddr = 0x44AF9C\nsize = 0x51\n\n[[func]]\nname = \"SetPlrAnims\"\naddr = 0x44AFED\nsize = 0x210\n\n[[func]]\nname = \"ClearPlrRVars\"\naddr = 0x44B1FD\nsize = 0x77\n\n[[func]]\nname = \"CreatePlayer\"\naddr = 0x44B274\nsize = 0x30E\n\n[[func]]\nname = \"CalcStatDiff\"\naddr = 0x44B582\nsize = 0x41\n\n[[func]]\nname = \"NextPlrLevel\"\naddr = 0x44B5C3\nsize = 0x105\n\n[[func]]\nname = \"AddPlrExperience\"\naddr = 0x44B6C8\nsize = 0x130\n\n[[func]]\nname = \"AddPlrMonstExper\"\naddr = 0x44B7F8\nsize = 0x44\n\n[[func]]\nname = \"InitPlayer\"\naddr = 0x44B83C\nsize = 0x2F7\n\n[[func]]\nname = \"InitMultiView\"\naddr = 0x44BB33\nsize = 0x3A\n\n[[func]]\nname = \"CheckEFlag\"\naddr = 0x44BB6D\nsize = 0x155\n\n[[func]]\nname = \"SolidLoc\"\naddr = 0x44BCC2\nsize = 0x29\n\n[[func]]\nname = \"PlrDirOK\"\naddr = 0x44BCEB\nsize = 0xAF\n\n[[func]]\nname = \"PlrClrTrans\"\naddr = 0x44BD9A\nsize = 0x43\n\n[[func]]\nname = \"PlrDoTrans\"\naddr = 0x44BDDD\nsize = 0x81\n\n[[func]]\nname = \"SetPlayerOld\"\naddr = 0x44BE5E\nsize = 0x37\n\n[[func]]\nname = \"FixPlayerLocation\"\naddr = 0x44BE95\nsize = 0x98\n\n[[func]]\nname = \"StartStand\"\naddr = 0x44BF2D\nsize = 0xBB\n\n[[func]]\nname = \"StartWalkStand\"\naddr = 0x44BFE8\nsize = 0x88\n\n[[func]]\nname = \"PM_ChangeLightOff\"\naddr = 0x44C070\nsize = 0xCD\n\n[[func]]\nname = \"PM_ChangeOffset\"\naddr = 0x44C13D\nsize = 0xA5\n\n[[func]]\nname = \"StartWalk\"\naddr = 0x44C1E2\nsize = 0x1CA\n\n[[func]]\nname = \"StartWalk2\"\naddr = 0x44C3AC\nsize = 0x223\n\n[[func]]\nname = \"StartWalk3\"\naddr = 0x44C5CF\nsize = 0x24F\n\n[[func]]\nname = \"StartAttack\"\naddr = 0x44C81E\nsize = 0x9D\n\n[[func]]\nname = \"StartRangeAttack\"\naddr = 0x44C8BB\nsize = 0xB8\n\n[[func]]\nname = \"StartPlrBlock\"\naddr = 0x44C973\nsize = 0xB3\n\n[[func]]\nname = \"StartSpell\"\naddr = 0x44CA26\nsize = 0x16F\n\n[[func]]\nname = \"FixPlrWalkTags\"\naddr = 0x44CB95\nsize = 0xCD\n\n[[func]]\nname = \"RemovePlrFromMap\"\naddr = 0x44CC62\nsize = 0x76\n\n[[func]]\nname = \"StartPlrHit\"\naddr = 0x44CCD8\nsize = 0x125\n\n[[func]]\nname = \"RespawnDeadItem\"\naddr = 0x44CDFD\nsize = 0xCC\n\n[[func]]\nname = \"StartPlayerKill\"\naddr = 0x44CEC9\nsize = 0x32B\n\n[[func]]\nname = \"PlrDeadItem\"\naddr = 0x44D1F4\nsize = 0xFF\n\n[[func]]\nname = \"DropHalfPlayersGold\"\naddr = 0x44D2F3\nsize = 0x418\n\n[[func]]\nname = \"SyncPlrKill\"\naddr = 0x44D70B\nsize = 0x90\n\n[[func]]\nname = \"RemovePlrMissiles\"\naddr = 0x44D7A0\nsize = 0x131\n\n[[func]]\nname = \"InitLevelChange\"\naddr = 0x44D8D1\nsize = 0xA2\n\n[[func]]\nname = \"StartNewLvl\"\naddr = 0x44D973\nsize = 0xFC\n\n[[func]]\nname = \"RestartTownLvl\"\naddr = 0x44DA6F\nsize = 0x8D\n\n[[func]]\nname = \"StartWarpLvl\"\naddr = 0x44DAFC\nsize = 0x78\n\n[[func]]\nname = \"PM_DoStand\"\naddr = 0x44DB74\nsize = 0x3\n\n[[func]]\nname = \"PM_DoWalk\"\naddr = 0x44DB77\nsize = 0x16E\n\n[[func]]\nname = \"PM_DoWalk2\"\naddr = 0x44DCE5\nsize = 0x14B\n\n[[func]]\nname = \"PM_DoWalk3\"\naddr = 0x44DE30\nsize = 0x181\n\n[[func]]\nname = \"WeaponDur\"\naddr = 0x44DFB1\nsize = 0x10B\n\n[[func]]\nname = \"PlrHitMonst\"\naddr = 0x44E0BC\nsize = 0x386\n\n[[func]]\nname = \"PlrHitPlr\"\naddr = 0x44E442\nsize = 0x227\n\n[[func]]\nname = \"PlrHitObj\"\naddr = 0x44E669\nsize = 0x3D\n\n[[func]]\nname = \"PM_DoAttack\"\naddr = 0x44E6A6\nsize = 0x212\n\n[[func]]\nname = \"PM_DoRangeAttack\"\naddr = 0x44E8B8\nsize = 0xF4\n\n[[func]]\nname = \"ShieldDur\"\naddr = 0x44E9AC\nsize = 0xA1\n\n[[func]]\nname = \"PM_DoBlock\"\naddr = 0x44EA4D\nsize = 0x79\n\n[[func]]\nname = \"PM_DoSpell\"\naddr = 0x44EAC6\nsize = 0x140\n\n[[func]]\nname = \"PM_DoGotHit\"\naddr = 0x44EC06\nsize = 0xB6\n\n[[func]]\nname = \"ArmorDur\"\naddr = 0x44ECBC\nsize = 0xBF\n\n[[func]]\nname = \"PM_DoDeath\"\naddr = 0x44ED7B\nsize = 0xA7\n\n[[func]]\nname = \"PM_DoNewLvl\"\naddr = 0x44DB74\nsize = 0x3\n\n[[func]]\nname = \"CheckNewPath\"\naddr = 0x44EE22\nsize = 0xB30\n\n[[func]]\nname = \"PlrDeathModeOK\"\naddr = 0x44F9BA\nsize = 0x42\n\n[[func]]\nname = \"ValidatePlayer\"\naddr = 0x44F9FC\nsize = 0x136\n\n[[func]]\nname = \"ProcessPlayers\"\naddr = 0x44FB32\nsize = 0x1D3\n\n[[func]]\nname = \"CheckCheatStats\"\naddr = 0x44FD31\nsize = 0x59\n\n[[func]]\nname = \"ClrPlrPath\"\naddr = 0x44FD8A\nsize = 0x30\n\n[[func]]\nname = \"PosOkPlayer\"\naddr = 0x44FDBA\nsize = 0xE4\n\n[[func]]\nname = \"MakePlrPath\"\naddr = 0x44FE9E\nsize = 0xB1\n\n[[func]]\nname = \"CheckPlrSpell\"\naddr = 0x44FF6F\nsize = 0x2A8\n\n[[func]]\nname = \"SyncPlrAnim\"\naddr = 0x450217\nsize = 0x126\n\n[[func]]\nname = \"SyncInitPlrPos\"\naddr = 0x45036D\nsize = 0x177\n\n[[func]]\nname = \"SyncInitPlr\"\naddr = 0x4504E4\nsize = 0x24\n\n[[func]]\nname = \"CheckStats\"\naddr = 0x450508\nsize = 0x119\n\n[[func]]\nname = \"ModifyPlrStr\"\naddr = 0x450621\nsize = 0xBA\n\n[[func]]\nname = \"ModifyPlrMag\"\naddr = 0x4506DB\nsize = 0xAD\n\n[[func]]\nname = \"ModifyPlrDex\"\naddr = 0x450788\nsize = 0xA4\n\n[[func]]\nname = \"ModifyPlrVit\"\naddr = 0x45082C\nsize = 0xA3\n\n[[func]]\nname = \"SetPlayerHitPoints\"\naddr = 0x4508CF\nsize = 0x4F\n\n[[func]]\nname = \"SetPlrStr\"\naddr = 0x45091E\nsize = 0x75\n\n[[func]]\nname = \"SetPlrMag\"\naddr = 0x450993\nsize = 0x4C\n\n[[func]]\nname = \"SetPlrDex\"\naddr = 0x4509DF\nsize = 0x75\n\n[[func]]\nname = \"SetPlrVit\"\naddr = 0x450A54\nsize = 0x4C\n\n[[func]]\nname = \"InitDungMsgs\"\naddr = 0x450AA0\nsize = 0x24\n\n[[func]]\nname = \"PlayDungMsgs\"\naddr = 0x450AC4\nsize = 0x26F\n\n[[func]]\nname = \"plrmsg_delay\"\naddr = 0x450D33\nsize = 0x37\n\n[[func]]\nname = \"ErrorPlrMsg\"\naddr = 0x450D6A\nsize = 0x49\n\n[[func]]\nname = \"EventPlrMsg\"\naddr = 0x450DB3\nsize = 0x47\n\n[[func]]\nname = \"SendPlrMsg\"\naddr = 0x450DFA\nsize = 0x6A\n\n[[func]]\nname = \"ClearPlrMsg\"\naddr = 0x450E64\nsize = 0x2A\n\n[[func]]\nname = \"InitPlrMsg\"\naddr = 0x450E8E\nsize = 0x1C\n\n[[func]]\nname = \"DrawPlrMsg\"\naddr = 0x450EAA\nsize = 0x8D\n\n[[func]]\nname = \"PrintPlrMsg\"\naddr = 0x450F37\nsize = 0xC7\n\n[[func]]\nname = \"InitPortals\"\naddr = 0x450FFE\nsize = 0x26\n\n[[func]]\nname = \"SetPortalStats\"\naddr = 0x451024\nsize = 0x3E\n\n[[func]]\nname = \"AddWarpMissile\"\naddr = 0x451062\nsize = 0x74\n\n[[func]]\nname = \"SyncPortals\"\naddr = 0x4510D6\nsize = 0x5B\n\n[[func]]\nname = \"AddInTownPortal\"\naddr = 0x451131\nsize = 0x14\n\n[[func]]\nname = \"ActivatePortal\"\naddr = 0x451145\nsize = 0x45\n\n[[func]]\nname = \"DeactivatePortal\"\naddr = 0x45118A\nsize = 0xC\n\n[[func]]\nname = \"PortalOnLevel\"\naddr = 0x451196\nsize = 0x22\n\n[[func]]\nname = \"RemovePortalMissile\"\naddr = 0x4511B8\nsize = 0x7C\n\n[[func]]\nname = \"SetCurrentPortal\"\naddr = 0x451234\nsize = 0x7\n\n[[func]]\nname = \"GetPortalLevel\"\naddr = 0x45123B\nsize = 0xA8\n\n[[func]]\nname = \"GetPortalLvlPos\"\naddr = 0x4512E3\nsize = 0x63\n\n[[func]]\nname = \"PosOkPortal\"\naddr = 0x451346\nsize = 0x48\n\n[[func]]\nname = \"InitQuests\"\naddr = 0x45138E\nsize = 0x1CE\n\n[[func]]\nname = \"CheckQuests\"\naddr = 0x45155C\nsize = 0x233\n\n[[func]]\nname = \"ForceQuests\"\naddr = 0x45178F\nsize = 0xA2\n\n[[func]]\nname = \"QuestStatus\"\naddr = 0x451831\nsize = 0x40\n\n[[func]]\nname = \"CheckQuestKill\"\naddr = 0x451871\nsize = 0x379\n\n[[func]]\nname = \"DrawButcher\"\naddr = 0x451BEA\nsize = 0x27\n\n[[func]]\nname = \"DrawSkelKing\"\naddr = 0x451C11\nsize = 0x21\n\n[[func]]\nname = \"DrawWarLord\"\naddr = 0x451C32\nsize = 0x90\n\n[[func]]\nname = \"DrawSChamber\"\naddr = 0x451CC2\nsize = 0xBA\n\n[[func]]\nname = \"DrawLTBanner\"\naddr = 0x451D7C\nsize = 0x8C\n\n[[func]]\nname = \"DrawBlind\"\naddr = 0x451E08\nsize = 0x8C\n\n[[func]]\nname = \"DrawBlood\"\naddr = 0x451E94\nsize = 0x8C\n\n[[func]]\nname = \"DRLG_CheckQuests\"\naddr = 0x451F20\nsize = 0x91\n\n[[func]]\nname = \"SetReturnLvlPos\"\naddr = 0x451FB1\nsize = 0xB3\n\n[[func]]\nname = \"GetReturnLvlPos\"\naddr = 0x452064\nsize = 0x39\n\n[[func]]\nname = \"ResyncMPQuests\"\naddr = 0x45209D\nsize = 0xBC\n\n[[func]]\nname = \"ResyncQuests\"\naddr = 0x452159\nsize = 0x326\n\n[[func]]\nname = \"PrintQLString\"\naddr = 0x45247F\nsize = 0x14E\n\n[[func]]\nname = \"DrawQuestLog\"\naddr = 0x4525CD\nsize = 0x8C\n\n[[func]]\nname = \"StartQuestlog\"\naddr = 0x452659\nsize = 0x70\n\n[[func]]\nname = \"QuestlogUp\"\naddr = 0x4526C9\nsize = 0x47\n\n[[func]]\nname = \"QuestlogDown\"\naddr = 0x452710\nsize = 0x4A\n\n[[func]]\nname = \"QuestlogEnter\"\naddr = 0x45275A\nsize = 0x42\n\n[[func]]\nname = \"QuestlogESC\"\naddr = 0x45279C\nsize = 0x55\n\n[[func]]\nname = \"SetMultiQuest\"\naddr = 0x4527F1\nsize = 0x40\n\n[[func]]\nname = \"SystemSupported\"\naddr = 0x452831\nsize = 0x54\n\n[[func]]\nname = \"RestrictedTest\"\naddr = 0x452885\nsize = 0x72\n\n[[func]]\nname = \"ReadOnlyTest\"\naddr = 0x4528F7\nsize = 0x7E\n\n[[func]]\nname = \"ClearCursor\"\naddr = 0x452985\nsize = 0xF\n\n[[func]]\nname = \"DrawMissile\"\naddr = 0x452994\nsize = 0x196\n\n[[func]]\nname = \"DrawClippedMissile\"\naddr = 0x452B2A\nsize = 0x196\n\n[[func]]\nname = \"DrawDeadPlayer\"\naddr = 0x452CC0\nsize = 0xE0\n\n[[func]]\nname = \"DrawPlayer\"\naddr = 0x452DA0\nsize = 0x1EB\n\n[[func]]\nname = \"DrawClippedPlayer\"\naddr = 0x452F8B\nsize = 0x1D5\n\n[[func]]\nname = \"DrawView\"\naddr = 0x453160\nsize = 0x112\n\n[[func]]\nname = \"DrawGame\"\naddr = 0x453272\nsize = 0x1E5\n\n[[func]]\nname = \"scrollrt_draw_lower\"\naddr = 0x453477\nsize = 0x46B\n\n[[func]]\nname = \"scrollrt_draw_clipped_dungeon\"\naddr = 0x4538E2\nsize = 0x5F7\n\n[[func]]\nname = \"DrawClippedMonster\"\naddr = 0x453ED9\nsize = 0xF3\n\n[[func]]\nname = \"DrawClippedObject\"\naddr = 0x453FCC\nsize = 0x119\n\n[[func]]\nname = \"scrollrt_draw_clipped_e_flag\"\naddr = 0x4540E5\nsize = 0x144\n\n[[func]]\nname = \"scrollrt_draw_lower_2\"\naddr = 0x454229\nsize = 0x3A9\n\n[[func]]\nname = \"scrollrt_draw_clipped_dungeon_2\"\naddr = 0x4545D2\nsize = 0x637\n\n[[func]]\nname = \"scrollrt_draw_clipped_e_flag_2\"\naddr = 0x454C09\nsize = 0x194\n\n[[func]]\nname = \"scrollrt_draw_upper\"\naddr = 0x454D9D\nsize = 0x47A\n\n[[func]]\nname = \"scrollrt_draw_dungeon\"\naddr = 0x455217\nsize = 0x62D\n\n[[func]]\nname = \"DrawMonster\"\naddr = 0x455844\nsize = 0xF3\n\n[[func]]\nname = \"DrawObject\"\naddr = 0x455937\nsize = 0x146\n\n[[func]]\nname = \"scrollrt_draw_e_flag\"\naddr = 0x455A7D\nsize = 0x157\n\n[[func]]\nname = \"DrawZoom\"\naddr = 0x455BD4\nsize = 0x23E\n\n[[func]]\nname = \"ClearScreenBuffer\"\naddr = 0x455E32\nsize = 0x33\n\n[[func]]\nname = \"scrollrt_draw_game_screen\"\naddr = 0x455E65\nsize = 0x62\n\n[[func]]\nname = \"scrollrt_draw_cursor_back_buffer\"\naddr = 0x455EC7\nsize = 0x8F\n\n[[func]]\nname = \"scrollrt_draw_cursor_item\"\naddr = 0x455F56\nsize = 0x1CE\n\n[[func]]\nname = \"DrawMain\"\naddr = 0x456124\nsize = 0x28F\n\n[[func]]\nname = \"DoBlitScreen\"\naddr = 0x4563B3\nsize = 0x146\n\n[[func]]\nname = \"DrawAndBlit\"\naddr = 0x4564F9\nsize = 0x12C\n\n[[func]]\nname = \"ObjIndex\"\naddr = 0x456625\nsize = 0x46\n\n[[func]]\nname = \"AddSKingObjs\"\naddr = 0x45666B\nsize = 0xAF\n\n[[func]]\nname = \"AddSChamObjs\"\naddr = 0x45671A\nsize = 0x3B\n\n[[func]]\nname = \"AddVileObjs\"\naddr = 0x456755\nsize = 0x58\n\n[[func]]\nname = \"DRLG_SetMapTrans\"\naddr = 0x4567AD\nsize = 0x6C\n\n[[func]]\nname = \"LoadSetMap\"\naddr = 0x456819\nsize = 0x1FD\n\n[[func]]\nname = \"SHA1Clear\"\naddr = 0x456A16\nsize = 0x15\n\n[[func]]\nname = \"SHA1Result\"\naddr = 0x456A2B\nsize = 0x22\n\n[[func]]\nname = \"SHA1Calculate\"\naddr = 0x456A4D\nsize = 0x26\n\n[[func]]\nname = \"SHA1Input\"\naddr = 0x456A73\nsize = 0x51\n\n[[func]]\nname = \"SHA1ProcessMessageBlock\"\naddr = 0x456AC4\nsize = 0x1BE\n\n[[func]]\nname = \"SHA1Reset\"\naddr = 0x456C82\nsize = 0xE\n\n[[func]]\nname = \"SHA1Init\"\naddr = 0x456C90\nsize = 0x2B\n\n[[func]]\nname = \"snd_update\"\naddr = 0x456CCB\nsize = 0x57\n\n[[func]]\nname = \"snd_stop_snd\"\naddr = 0x456D22\nsize = 0x12\n\n[[func]]\nname = \"snd_playing\"\naddr = 0x456D34\nsize = 0x2C\n\n[[func]]\nname = \"snd_play_snd\"\naddr = 0x456D60\nsize = 0xD9\n\n[[func]]\nname = \"sound_dup_channel\"\naddr = 0x456E39\nsize = 0x3B\n\n[[func]]\nname = \"sound_file_reload\"\naddr = 0x456E74\nsize = 0x93\n\n[[func]]\nname = \"sound_file_load\"\naddr = 0x456F07\nsize = 0xFC\n\n[[func]]\nname = \"sound_CreateSoundBuffer\"\naddr = 0x457003\nsize = 0x5D\n\n[[func]]\nname = \"sound_file_cleanup\"\naddr = 0x457060\nsize = 0x2B\n\n[[func]]\nname = \"snd_init\"\naddr = 0x45708B\nsize = 0xA0\n\n[[func]]\nname = \"snd_get_volume\"\naddr = 0x45712B\nsize = 0x51\n\n[[func]]\nname = \"sound_create_primary_buffer\"\naddr = 0x45717C\nsize = 0x102\n\n[[func]]\nname = \"sound_DirectSoundCreate\"\naddr = 0x45727E\nsize = 0x81\n\n[[func]]\nname = \"sound_cleanup\"\naddr = 0x4572FF\nsize = 0x59\n\n[[func]]\nname = \"snd_set_volume\"\naddr = 0x457358\nsize = 0xF\n\n[[func]]\nname = \"music_stop\"\naddr = 0x457367\nsize = 0x2C\n\n[[func]]\nname = \"music_start\"\naddr = 0x457393\nsize = 0x6B\n\n[[func]]\nname = \"sound_disable_music\"\naddr = 0x4573FE\nsize = 0x1A\n\n[[func]]\nname = \"sound_get_or_set_music_volume\"\naddr = 0x457418\nsize = 0x23\n\n[[func]]\nname = \"sound_get_or_set_sound_volume\"\naddr = 0x45743B\nsize = 0x13\n\n[[func]]\nname = \"GetManaAmount\"\naddr = 0x45744E\nsize = 0xEC\n\n[[func]]\nname = \"UseMana\"\naddr = 0x45753A\nsize = 0x4A\n\n[[func]]\nname = \"CheckSpell\"\naddr = 0x457584\nsize = 0x51\n\n[[func]]\nname = \"CastSpell\"\naddr = 0x4575D5\nsize = 0xDC\n\n[[func]]\nname = \"DoResurrect\"\naddr = 0x4576B1\nsize = 0x11A\n\n[[func]]\nname = \"PlacePlayer\"\naddr = 0x4577CB\nsize = 0x123\n\n[[func]]\nname = \"DoHealOther\"\naddr = 0x4578EE\nsize = 0x113\n\n[[func]]\nname = \"InitStores\"\naddr = 0x457A01\nsize = 0x86\n\n[[func]]\nname = \"SetupTownStores\"\naddr = 0x457A87\nsize = 0xBB\n\n[[func]]\nname = \"FreeStoreMem\"\naddr = 0x457B42\nsize = 0x36\n\n[[func]]\nname = \"DrawSTextBack\"\naddr = 0x457B78\nsize = 0x5E\n\n[[func]]\nname = \"PrintSString\"\naddr = 0x457BD6\nsize = 0x20C\n\n[[func]]\nname = \"DrawSLine\"\naddr = 0x457DE2\nsize = 0x80\n\n[[func]]\nname = \"DrawSSlider\"\naddr = 0x457E62\nsize = 0xF0\n\n[[func]]\nname = \"DrawSTextHelp\"\naddr = 0x457F52\nsize = 0xF\n\n[[func]]\nname = \"ClearSText\"\naddr = 0x457F61\nsize = 0x45\n\n[[func]]\nname = \"AddSLine\"\naddr = 0x457FA6\nsize = 0x25\n\n[[func]]\nname = \"AddSTextVal\"\naddr = 0x457FCB\nsize = 0xD\n\n[[func]]\nname = \"OffsetSTextY\"\naddr = 0x457FD8\nsize = 0xD\n\n[[func]]\nname = \"AddSText\"\naddr = 0x457FE5\nsize = 0x51\n\n[[func]]\nname = \"StoreAutoPlace\"\naddr = 0x458036\nsize = 0x27D\n\n[[func]]\nname = \"S_StartSmith\"\naddr = 0x4582B3\nsize = 0xCA\n\n[[func]]\nname = \"S_ScrollSBuy\"\naddr = 0x45837D\nsize = 0xBC\n\n[[func]]\nname = \"PrintStoreItem\"\naddr = 0x458439\nsize = 0x27A\n\n[[func]]\nname = \"S_StartSBuy\"\naddr = 0x4586B3\nsize = 0xC0\n\n[[func]]\nname = \"S_ScrollSPBuy\"\naddr = 0x458773\nsize = 0xDE\n\n[[func]]\nname = \"S_StartSPBuy\"\naddr = 0x458851\nsize = 0xE0\n\n[[func]]\nname = \"SmithSellOk\"\naddr = 0x458931\nsize = 0x41\n\n[[func]]\nname = \"S_ScrollSSell\"\naddr = 0x458972\nsize = 0xE7\n\n[[func]]\nname = \"S_StartSSell\"\naddr = 0x458A59\nsize = 0x1B2\n\n[[func]]\nname = \"SmithRepairOk\"\naddr = 0x458C0B\nsize = 0x43\n\n[[func]]\nname = \"S_StartSRepair\"\naddr = 0x458C4E\nsize = 0x24C\n\n[[func]]\nname = \"AddStoreHoldRepair\"\naddr = 0x458E9A\nsize = 0xA3\n\n[[func]]\nname = \"S_StartWitch\"\naddr = 0x458F3D\nsize = 0xA6\n\n[[func]]\nname = \"S_ScrollWBuy\"\naddr = 0x458FE3\nsize = 0xBC\n\n[[func]]\nname = \"S_StartWBuy\"\naddr = 0x45909F\nsize = 0xCA\n\n[[func]]\nname = \"WitchSellOk\"\naddr = 0x459169\nsize = 0x5B\n\n[[func]]\nname = \"S_StartWSell\"\naddr = 0x4591C4\nsize = 0x26D\n\n[[func]]\nname = \"WitchRechargeOk\"\naddr = 0x459431\nsize = 0x2F\n\n[[func]]\nname = \"AddStoreHoldRecharge\"\naddr = 0x459460\nsize = 0x86\n\n[[func]]\nname = \"S_StartWRecharge\"\naddr = 0x4594E6\nsize = 0x1AD\n\n[[func]]\nname = \"S_StartNoMoney\"\naddr = 0x459693\nsize = 0x3A\n\n[[func]]\nname = \"S_StartNoRoom\"\naddr = 0x4596CD\nsize = 0x33\n\n[[func]]\nname = \"S_StartConfirm\"\naddr = 0x459700\nsize = 0x173\n\n[[func]]\nname = \"S_StartBoy\"\naddr = 0x459873\nsize = 0xBD\n\n[[func]]\nname = \"S_StartBBoy\"\naddr = 0x459930\nsize = 0xCD\n\n[[func]]\nname = \"S_StartHealer\"\naddr = 0x4599FD\nsize = 0xA8\n\n[[func]]\nname = \"S_ScrollHBuy\"\naddr = 0x459AA5\nsize = 0xB0\n\n[[func]]\nname = \"S_StartHBuy\"\naddr = 0x459B55\nsize = 0xC0\n\n[[func]]\nname = \"S_StartStory\"\naddr = 0x459C15\nsize = 0x79\n\n[[func]]\nname = \"IdItemOk\"\naddr = 0x459C8E\nsize = 0x14\n\n[[func]]\nname = \"AddStoreHoldId\"\naddr = 0x459CA2\nsize = 0x44\n\n[[func]]\nname = \"S_StartSIdentify\"\naddr = 0x459CE6\nsize = 0x2AF\n\n[[func]]\nname = \"S_StartIdShow\"\naddr = 0x459F95\nsize = 0xB1\n\n[[func]]\nname = \"S_StartTalk\"\naddr = 0x45A046\nsize = 0x122\n\n[[func]]\nname = \"S_StartTavern\"\naddr = 0x45A168\nsize = 0x84\n\n[[func]]\nname = \"S_StartBarMaid\"\naddr = 0x45A1EC\nsize = 0x72\n\n[[func]]\nname = \"S_StartDrunk\"\naddr = 0x45A25E\nsize = 0x72\n\n[[func]]\nname = \"StartStore\"\naddr = 0x45A2D0\nsize = 0x163\n\n[[func]]\nname = \"DrawSText\"\naddr = 0x45A48F\nsize = 0xF5\n\n[[func]]\nname = \"STextESC\"\naddr = 0x45A584\nsize = 0xE0\n\n[[func]]\nname = \"STextUp\"\naddr = 0x45A6AF\nsize = 0xA8\n\n[[func]]\nname = \"STextDown\"\naddr = 0x45A757\nsize = 0xAD\n\n[[func]]\nname = \"STextPrior\"\naddr = 0x45A804\nsize = 0x4A\n\n[[func]]\nname = \"STextNext\"\naddr = 0x45A84E\nsize = 0x4D\n\n[[func]]\nname = \"S_SmithEnter\"\naddr = 0x45A89B\nsize = 0x69\n\n[[func]]\nname = \"SetGoldCurs\"\naddr = 0x45A904\nsize = 0x46\n\n[[func]]\nname = \"SetSpdbarGoldCurs\"\naddr = 0x45A94A\nsize = 0x46\n\n[[func]]\nname = \"TakePlrsMoney\"\naddr = 0x45A990\nsize = 0x1D9\n\n[[func]]\nname = \"SmithBuyItem\"\naddr = 0x45AB69\nsize = 0xAB\n\n[[func]]\nname = \"S_SBuyEnter\"\naddr = 0x45AC14\nsize = 0xD5\n\n[[func]]\nname = \"SmithBuyPItem\"\naddr = 0x45ACE9\nsize = 0x95\n\n[[func]]\nname = \"S_SPBuyEnter\"\naddr = 0x45AD7E\nsize = 0xF4\n\n[[func]]\nname = \"StoreGoldFit\"\naddr = 0x45AE72\nsize = 0xD6\n\n[[func]]\nname = \"PlaceStoreGold\"\naddr = 0x45AF48\nsize = 0xC8\n\n[[func]]\nname = \"StoreSellItem\"\naddr = 0x45B010\nsize = 0x150\n\n[[func]]\nname = \"S_SSellEnter\"\naddr = 0x45B160\nsize = 0x7F\n\n[[func]]\nname = \"SmithRepairItem\"\naddr = 0x45B1DF\nsize = 0xD7\n\n[[func]]\nname = \"S_SRepairEnter\"\naddr = 0x45B2B6\nsize = 0x81\n\n[[func]]\nname = \"S_WitchEnter\"\naddr = 0x45B337\nsize = 0x68\n\n[[func]]\nname = \"WitchBuyItem\"\naddr = 0x45B39F\nsize = 0xB8\n\n[[func]]\nname = \"S_WBuyEnter\"\naddr = 0x45B457\nsize = 0xD5\n\n[[func]]\nname = \"S_WSellEnter\"\naddr = 0x45B52C\nsize = 0x7F\n\n[[func]]\nname = \"WitchRechargeItem\"\naddr = 0x45B5AB\nsize = 0x89\n\n[[func]]\nname = \"S_WRechargeEnter\"\naddr = 0x45B634\nsize = 0x81\n\n[[func]]\nname = \"S_BoyEnter\"\naddr = 0x45B6B5\nsize = 0xA2\n\n[[func]]\nname = \"BoyBuyItem\"\naddr = 0x45B757\nsize = 0x3A\n\n[[func]]\nname = \"HealerBuyItem\"\naddr = 0x45B791\nsize = 0x104\n\n[[func]]\nname = \"S_BBuyEnter\"\naddr = 0x45B895\nsize = 0xD3\n\n[[func]]\nname = \"StoryIdItem\"\naddr = 0x45B968\nsize = 0xEF\n\n[[func]]\nname = \"S_ConfirmEnter\"\naddr = 0x45BA57\nsize = 0xA0\n\n[[func]]\nname = \"S_HealerEnter\"\naddr = 0x45BAF7\nsize = 0xA8\n\n[[func]]\nname = \"S_HBuyEnter\"\naddr = 0x45BB9F\nsize = 0xD5\n\n[[func]]\nname = \"S_StoryEnter\"\naddr = 0x45BC74\nsize = 0x56\n\n[[func]]\nname = \"S_SIDEnter\"\naddr = 0x45BCCA\nsize = 0x81\n\n[[func]]\nname = \"S_TalkEnter\"\naddr = 0x45BD4B\nsize = 0xFF\n\n[[func]]\nname = \"S_TavernEnter\"\naddr = 0x45BE4A\nsize = 0x4E\n\n[[func]]\nname = \"S_BarmaidEnter\"\naddr = 0x45BE98\nsize = 0x4E\n\n[[func]]\nname = \"S_DrunkEnter\"\naddr = 0x45BEE6\nsize = 0x4E\n\n[[func]]\nname = \"STextEnter\"\naddr = 0x45BF34\nsize = 0xC3\n\n[[func]]\nname = \"CheckStoreBtn\"\naddr = 0x45C053\nsize = 0x137\n\n[[func]]\nname = \"ReleaseStoreBtn\"\naddr = 0x45C18A\nsize = 0xF\n\n[[func]]\nname = \"sync_all_monsters\"\naddr = 0x45C199\nsize = 0x85\n\n[[func]]\nname = \"sync_one_monster\"\naddr = 0x45C21E\nsize = 0xA6\n\n[[func]]\nname = \"sync_monster_active\"\naddr = 0x45C2C4\nsize = 0x53\n\n[[func]]\nname = \"sync_monster_pos\"\naddr = 0x45C317\nsize = 0x6F\n\n[[func]]\nname = \"sync_monster_active2\"\naddr = 0x45C386\nsize = 0x60\n\n[[func]]\nname = \"SyncPlrInv\"\naddr = 0x45C3E6\nsize = 0x1E1\n\n[[func]]\nname = \"sync_update\"\naddr = 0x45C5C7\nsize = 0x74\n\n[[func]]\nname = \"sync_monster\"\naddr = 0x45C63B\nsize = 0x210\n\n[[func]]\nname = \"sync_init\"\naddr = 0x45C84B\nsize = 0x25\n\n[[func]]\nname = \"TFit_Shrine\"\naddr = 0x45C870\nsize = 0x123\n\n[[func]]\nname = \"TFit_Obj5\"\naddr = 0x45C993\nsize = 0xDF\n\n[[func]]\nname = \"TFit_SkelRoom\"\naddr = 0x45CA72\nsize = 0x52\n\n[[func]]\nname = \"TFit_GoatShrine\"\naddr = 0x45CAC4\nsize = 0x45\n\n[[func]]\nname = \"CheckThemeObj3\"\naddr = 0x45CB09\nsize = 0x7F\n\n[[func]]\nname = \"TFit_Obj3\"\naddr = 0x45CB88\nsize = 0x5C\n\n[[func]]\nname = \"CheckThemeReqs\"\naddr = 0x45CBE4\nsize = 0x80\n\n[[func]]\nname = \"SpecialThemeFit\"\naddr = 0x45CC64\nsize = 0xF6\n\n[[func]]\nname = \"CheckThemeRoom\"\naddr = 0x45CD9A\nsize = 0x138\n\n[[func]]\nname = \"InitThemes\"\naddr = 0x45CED2\nsize = 0x1B5\n\n[[func]]\nname = \"HoldThemeRooms\"\naddr = 0x45D087\nsize = 0x5A\n\n[[func]]\nname = \"PlaceThemeMonsts\"\naddr = 0x45D0E1\nsize = 0xE1\n\n[[func]]\nname = \"Theme_Barrel\"\naddr = 0x45D1C2\nsize = 0xD8\n\n[[func]]\nname = \"Theme_Shrine\"\naddr = 0x45D29A\nsize = 0xB3\n\n[[func]]\nname = \"Theme_MonstPit\"\naddr = 0x45D34D\nsize = 0x99\n\n[[func]]\nname = \"Theme_SkelRoom\"\naddr = 0x45D3E6\nsize = 0x1D6\n\n[[func]]\nname = \"Theme_Treasure\"\naddr = 0x45D5BC\nsize = 0x14B\n\n[[func]]\nname = \"Theme_Library\"\naddr = 0x45D707\nsize = 0x183\n\n[[func]]\nname = \"Theme_Torture\"\naddr = 0x45D88A\nsize = 0xD3\n\n[[func]]\nname = \"Theme_BloodFountain\"\naddr = 0x45D95D\nsize = 0x46\n\n[[func]]\nname = \"Theme_Decap\"\naddr = 0x45D9A3\nsize = 0xD3\n\n[[func]]\nname = \"Theme_PurifyingFountain\"\naddr = 0x45DA76\nsize = 0x46\n\n[[func]]\nname = \"Theme_ArmorStand\"\naddr = 0x45DABC\nsize = 0xF1\n\n[[func]]\nname = \"Theme_GoatShrine\"\naddr = 0x45DBAD\nsize = 0xCE\n\n[[func]]\nname = \"Theme_Cauldron\"\naddr = 0x45DC7B\nsize = 0x46\n\n[[func]]\nname = \"Theme_MurkyFountain\"\naddr = 0x45DCC1\nsize = 0x46\n\n[[func]]\nname = \"Theme_TearFountain\"\naddr = 0x45DD07\nsize = 0x46\n\n[[func]]\nname = \"Theme_BrnCross\"\naddr = 0x45DD4D\nsize = 0xD3\n\n[[func]]\nname = \"Theme_WeaponRack\"\naddr = 0x45DE20\nsize = 0xF1\n\n[[func]]\nname = \"UpdateL4Trans\"\naddr = 0x45DF11\nsize = 0x20\n\n[[func]]\nname = \"CreateThemeRooms\"\naddr = 0x45DF31\nsize = 0x117\n\n[[func]]\nname = \"tmsg_get\"\naddr = 0x45E08C\nsize = 0x4B\n\n[[func]]\nname = \"tmsg_add\"\naddr = 0x45E0D7\nsize = 0x53\n\n[[func]]\nname = \"tmsg_cleanup\"\naddr = 0x45E12A\nsize = 0x27\n\n[[func]]\nname = \"town_clear_upper_buf\"\naddr = 0x45E151\nsize = 0x66\n\n[[func]]\nname = \"town_clear_low_buf\"\naddr = 0x45E1B7\nsize = 0x6F\n\n[[func]]\nname = \"town_draw_clipped_e_flag\"\naddr = 0x45E226\nsize = 0x7F\n\n[[func]]\nname = \"town_draw_clipped_town\"\naddr = 0x45E2A5\nsize = 0x30B\n\n[[func]]\nname = \"town_draw_lower\"\naddr = 0x45E5B0\nsize = 0x2E8\n\n[[func]]\nname = \"town_draw_clipped_e_flag_2\"\naddr = 0x45E898\nsize = 0xA1\n\n[[func]]\nname = \"town_draw_clipped_town_2\"\naddr = 0x45E939\nsize = 0x310\n\n[[func]]\nname = \"town_draw_lower_2\"\naddr = 0x45EC49\nsize = 0x341\n\n[[func]]\nname = \"town_draw_e_flag\"\naddr = 0x45EF8A\nsize = 0x89\n\n[[func]]\nname = \"town_draw_town_all\"\naddr = 0x45F013\nsize = 0x310\n\n[[func]]\nname = \"town_draw_upper\"\naddr = 0x45F323\nsize = 0x33A\n\n[[func]]\nname = \"T_DrawGame\"\naddr = 0x45F65D\nsize = 0x1D9\n\n[[func]]\nname = \"T_DrawZoom\"\naddr = 0x45F856\nsize = 0x235\n\n[[func]]\nname = \"T_DrawView\"\naddr = 0x45FAAB\nsize = 0x12C\n\n[[func]]\nname = \"SetTownMicros\"\naddr = 0x45FBD7\nsize = 0xE8\n\n[[func]]\nname = \"T_FillSector\"\naddr = 0x45FCBF\nsize = 0xB6\n\n[[func]]\nname = \"T_FillTile\"\naddr = 0x45FD75\nsize = 0x71\n\n[[func]]\nname = \"T_Pass3\"\naddr = 0x45FDE6\nsize = 0x19D\n\n[[func]]\nname = \"CreateTown\"\naddr = 0x45FF83\nsize = 0x218\n\n[[func]]\nname = \"GetActiveTowner\"\naddr = 0x46019B\nsize = 0x26\n\n[[func]]\nname = \"SetTownerGPtrs\"\naddr = 0x4601C1\nsize = 0x3A\n\n[[func]]\nname = \"NewTownerAnim\"\naddr = 0x4601FB\nsize = 0x34\n\n[[func]]\nname = \"InitTownerInfo\"\naddr = 0x46022F\nsize = 0x95\n\n[[func]]\nname = \"InitQstSnds\"\naddr = 0x4602C4\nsize = 0x4D\n\n[[func]]\nname = \"InitSmith\"\naddr = 0x460311\nsize = 0x8F\n\n[[func]]\nname = \"InitBarOwner\"\naddr = 0x4603A0\nsize = 0x96\n\n[[func]]\nname = \"InitTownDead\"\naddr = 0x460436\nsize = 0x90\n\n[[func]]\nname = \"InitWitch\"\naddr = 0x4604C6\nsize = 0x8F\n\n[[func]]\nname = \"InitBarmaid\"\naddr = 0x460555\nsize = 0x8F\n\n[[func]]\nname = \"InitBoy\"\naddr = 0x4605E4\nsize = 0x96\n\n[[func]]\nname = \"InitHealer\"\naddr = 0x46067A\nsize = 0x8F\n\n[[func]]\nname = \"InitTeller\"\naddr = 0x460709\nsize = 0x8F\n\n[[func]]\nname = \"InitDrunk\"\naddr = 0x460798\nsize = 0x8F\n\n[[func]]\nname = \"InitCows\"\naddr = 0x460827\nsize = 0x14F\n\n[[func]]\nname = \"InitTowners\"\naddr = 0x460976\nsize = 0x4D\n\n[[func]]\nname = \"FreeTownerGFX\"\naddr = 0x4609C3\nsize = 0x42\n\n[[func]]\nname = \"TownCtrlMsg\"\naddr = 0x460A05\nsize = 0x73\n\n[[func]]\nname = \"TownBlackSmith\"\naddr = 0x460A78\nsize = 0xE\n\n[[func]]\nname = \"TownBarOwner\"\naddr = 0x460A86\nsize = 0xF\n\n[[func]]\nname = \"TownDead\"\naddr = 0x460A95\nsize = 0x78\n\n[[func]]\nname = \"TownHealer\"\naddr = 0x460B0D\nsize = 0xF\n\n[[func]]\nname = \"TownStory\"\naddr = 0x460B1C\nsize = 0xF\n\n[[func]]\nname = \"TownDrunk\"\naddr = 0x460B2B\nsize = 0xF\n\n[[func]]\nname = \"TownBoy\"\naddr = 0x460B3A\nsize = 0xF\n\n[[func]]\nname = \"TownWitch\"\naddr = 0x460B49\nsize = 0xF\n\n[[func]]\nname = \"TownBarMaid\"\naddr = 0x460B58\nsize = 0xF\n\n[[func]]\nname = \"TownCow\"\naddr = 0x460B67\nsize = 0xF\n\n[[func]]\nname = \"ProcessTowners\"\naddr = 0x460B76\nsize = 0xBE\n\n[[func]]\nname = \"PlrHasItem\"\naddr = 0x460C5C\nsize = 0x50\n\n[[func]]\nname = \"TownerTalk\"\naddr = 0x460CAC\nsize = 0x1D\n\n[[func]]\nname = \"TalkToTowner\"\naddr = 0x460CC9\nsize = 0xB1F\n\n[[func]]\nname = \"CowSFX\"\naddr = 0x4617E8\nsize = 0xBD\n\n[[func]]\nname = \"track_process\"\naddr = 0x4618B5\nsize = 0x9E\n\n[[func]]\nname = \"track_repeat_walk\"\naddr = 0x461953\nsize = 0x4C\n\n[[func]]\nname = \"track_isscrolling\"\naddr = 0x46199F\nsize = 0x8\n\n[[func]]\nname = \"InitNoTriggers\"\naddr = 0x4619A7\nsize = 0xF\n\n[[func]]\nname = \"InitTownTriggers\"\naddr = 0x4619B6\nsize = 0x18F\n\n[[func]]\nname = \"InitL1Triggers\"\naddr = 0x461B45\nsize = 0xA9\n\n[[func]]\nname = \"InitL2Triggers\"\naddr = 0x461BEE\nsize = 0x108\n\n[[func]]\nname = \"InitL3Triggers\"\naddr = 0x461CF6\nsize = 0xD0\n\n[[func]]\nname = \"InitL4Triggers\"\naddr = 0x461DC6\nsize = 0x144\n\n[[func]]\nname = \"InitSKingTriggers\"\naddr = 0x461F0A\nsize = 0x30\n\n[[func]]\nname = \"InitSChambTriggers\"\naddr = 0x461F3A\nsize = 0x30\n\n[[func]]\nname = \"InitPWaterTriggers\"\naddr = 0x461F6A\nsize = 0x30\n\n[[func]]\nname = \"InitVPTriggers\"\naddr = 0x461F9A\nsize = 0x30\n\n[[func]]\nname = \"ForceTownTrig\"\naddr = 0x461FCA\nsize = 0x166\n\n[[func]]\nname = \"ForceL1Trig\"\naddr = 0x462130\nsize = 0x11C\n\n[[func]]\nname = \"ForceL2Trig\"\naddr = 0x46224C\nsize = 0x203\n\n[[func]]\nname = \"ForceL3Trig\"\naddr = 0x46244F\nsize = 0x1DE\n\n[[func]]\nname = \"ForceL4Trig\"\naddr = 0x46262D\nsize = 0x249\n\n[[func]]\nname = \"Freeupstairs\"\naddr = 0x462876\nsize = 0x41\n\n[[func]]\nname = \"ForceSKingTrig\"\naddr = 0x4628B7\nsize = 0x68\n\n[[func]]\nname = \"ForceSChambTrig\"\naddr = 0x46291F\nsize = 0x68\n\n[[func]]\nname = \"ForcePWaterTrig\"\naddr = 0x462987\nsize = 0x68\n\n[[func]]\nname = \"CheckTrigForce\"\naddr = 0x4629EF\nsize = 0xAE\n\n[[func]]\nname = \"CheckTriggers\"\naddr = 0x462A9D\nsize = 0x1D0\n\n[[func]]\nname = \"WCloseFile\"\naddr = 0x462C7D\nsize = 0x7\n\n[[func]]\nname = \"WGetFileSize\"\naddr = 0x462C84\nsize = 0x2B\n\n[[func]]\nname = \"WGetFileArchive\"\naddr = 0x462CAF\nsize = 0x57\n\n[[func]]\nname = \"WOpenFile\"\naddr = 0x462D06\nsize = 0x42\n\n[[func]]\nname = \"WReadFile\"\naddr = 0x462D48\nsize = 0x52\n\n[[func]]\nname = \"WSetFilePointer\"\naddr = 0x462D9A\nsize = 0x34\n\n[[func]]\nname = \"LoadWaveFormat\"\naddr = 0x462DCE\nsize = 0x2E\n\n[[func]]\nname = \"AllocateMemFile\"\naddr = 0x462DFC\nsize = 0x49\n\n[[func]]\nname = \"FreeMemFile\"\naddr = 0x462E45\nsize = 0xE\n\n[[func]]\nname = \"ReadWaveFile\"\naddr = 0x462E53\nsize = 0xCA\n\n[[func]]\nname = \"ReadMemFile\"\naddr = 0x462F1D\nsize = 0x56\n\n[[func]]\nname = \"FillMemFile\"\naddr = 0x462F73\nsize = 0x3B\n\n[[func]]\nname = \"SeekMemFile\"\naddr = 0x462FAE\nsize = 0x1E\n\n[[func]]\nname = \"ReadWaveSection\"\naddr = 0x462FCC\nsize = 0x57\n\n[[func]]\nname = \"LoadWaveFile\"\naddr = 0x463023\nsize = 0x38\n\n[[func]]\nname = \"drawTopArchesUpperScreen\"\naddr = 0x463060\nsize = 0x162D\n\n[[func]]\nname = \"drawBottomArchesUpperScreen\"\naddr = 0x46468D\nsize = 0xC38\n\n[[func]]\nname = \"drawUpperScreen\"\naddr = 0x4652C5\nsize = 0xC73\n\n[[func]]\nname = \"drawTopArchesLowerScreen\"\naddr = 0x465F38\nsize = 0x1A11\n\n[[func]]\nname = \"drawBottomArchesLowerScreen\"\naddr = 0x467949\nsize = 0xF22\n\n[[func]]\nname = \"drawLowerScreen\"\naddr = 0x46886B\nsize = 0xE53\n\n[[func]]\nname = \"world_draw_black_tile\"\naddr = 0x4696BE\nsize = 0x5C\n"
  },
  {
    "path": "comparer-config/hellfire.toml",
    "content": "# conversion between function and file location of the functions\n# = (0x401000 - PE header offset) (0x400 for VC5 linker)\naddress_offset = 0x400C00\n\n[[func]]\nname = \"GetErrorStr\"\naddr = 0x401000\nsize = 0xAE\n\n[[func]]\nname = \"TraceErrorDD\"\naddr = 0x4010AE\nsize = 0x6D5\n\n[[func]]\nname = \"TraceErrorDS\"\naddr = 0x401848\nsize = 0x110\n\n[[func]]\nname = \"TraceLastError\"\naddr = 0x401958\nsize = 0xD\n\n[[func]]\nname = \"app_fatal\"\naddr = 0x401965\nsize = 0x32\n\n[[func]]\nname = \"MsgBox\"\naddr = 0x401998\nsize = 0x52\n\n[[func]]\nname = \"FreeDlg\"\naddr = 0x4019EA\nsize = 0x69\n\n[[func]]\nname = \"DrawDlg\"\naddr = 0x401A53\nsize = 0x35\n\n[[func]]\nname = \"DDErrMsg\"\naddr = 0x401A88\nsize = 0x23\n\n[[func]]\nname = \"DSErrMsg\"\naddr = 0x401AAB\nsize = 0x23\n\n[[func]]\nname = \"center_window\"\naddr = 0x401ACE\nsize = 0x92\n\n[[func]]\nname = \"ErrDlg\"\naddr = 0x401B60\nsize = 0x8D\n\n[[func]]\nname = \"FuncDlg\"\naddr = 0x401BED\nsize = 0x45\n\n[[func]]\nname = \"TextDlg\"\naddr = 0x401C32\nsize = 0x1F\n\n[[func]]\nname = \"FileErrDlg\"\naddr = 0x401C51\nsize = 0x45\n\n[[func]]\nname = \"DiskFreeDlg\"\naddr = 0x401C96\nsize = 0x3C\n\n[[func]]\nname = \"InsertCDDlg\"\naddr = 0x401CD2\nsize = 0x4B\n\n[[func]]\nname = \"InitAutomapOnce\"\naddr = 0x401D1D\nsize = 0x44\n\n[[func]]\nname = \"InitAutomap\"\naddr = 0x401D61\nsize = 0x148\n\n[[func]]\nname = \"StartAutomap\"\naddr = 0x401EA9\nsize = 0x19\n\n[[func]]\nname = \"AutomapUp\"\naddr = 0x401EC2\nsize = 0xD\n\n[[func]]\nname = \"AutomapDown\"\naddr = 0x401ECF\nsize = 0xD\n\n[[func]]\nname = \"AutomapLeft\"\naddr = 0x401EDC\nsize = 0xD\n\n[[func]]\nname = \"AutomapRight\"\naddr = 0x401EE9\nsize = 0xD\n\n[[func]]\nname = \"AutomapZoomIn\"\naddr = 0x401EF6\nsize = 0x3F\n\n[[func]]\nname = \"AutomapZoomOut\"\naddr = 0x401F35\nsize = 0x3D\n\n[[func]]\nname = \"DrawAutomap\"\naddr = 0x401F72\nsize = 0x284\n\n[[func]]\nname = \"DrawAutomapTile\"\naddr = 0x4021F6\nsize = 0x781\n\n[[func]]\nname = \"SearchAutomapItem\"\naddr = 0x4029A7\nsize = 0x1A3\n\n[[func]]\nname = \"DrawAutomapItem\"\naddr = 0x402B4A\nsize = 0x8E\n\n[[func]]\nname = \"DrawAutomapPlr\"\naddr = 0x402BD8\nsize = 0x3B4\n\n[[func]]\nname = \"GetAutomapType\"\naddr = 0x402FAC\nsize = 0xD4\n\n[[func]]\nname = \"DrawAutomapText\"\naddr = 0x403080\nsize = 0x109\n\n[[func]]\nname = \"SetAutomapView\"\naddr = 0x403189\nsize = 0x1A1\n\n[[func]]\nname = \"AutomapZoomReset\"\naddr = 0x40332A\nsize = 0x3E\n\n[[func]]\nname = \"CaptureScreen\"\naddr = 0x403368\nsize = 0xE9\n\n[[func]]\nname = \"CaptureHdr\"\naddr = 0x403451\nsize = 0x96\n\n[[func]]\nname = \"CapturePal\"\naddr = 0x4034E7\nsize = 0x69\n\n[[func]]\nname = \"CapturePix\"\naddr = 0x403550\nsize = 0x79\n\n[[func]]\nname = \"CaptureEnc\"\naddr = 0x4035C9\nsize = 0x3C\n\n[[func]]\nname = \"CaptureFile\"\naddr = 0x403605\nsize = 0xCA\n\n[[func]]\nname = \"RedPalette\"\naddr = 0x4036CF\nsize = 0x53\n\n[[func]]\nname = \"codec_decode\"\naddr = 0x403722\nsize = 0x106\n\n[[func]]\nname = \"codec_init_key\"\naddr = 0x40382D\nsize = 0xD4\n\n[[func]]\nname = \"codec_get_encoded_len\"\naddr = 0x403901\nsize = 0x12\n\n[[func]]\nname = \"codec_encode\"\naddr = 0x403913\nsize = 0x119\n\n[[func]]\nname = \"DrawSpellCel\"\naddr = 0x403A2C\nsize = 0xAA\n\n[[func]]\nname = \"SetSpellTrans\"\naddr = 0x403AD6\nsize = 0x11D\n\n[[func]]\nname = \"DrawSpell\"\naddr = 0x403BF3\nsize = 0xDA\n\n[[func]]\nname = \"DrawSpellList\"\naddr = 0x403CCD\nsize = 0x54C\n\n[[func]]\nname = \"SetSpell\"\naddr = 0x404219\nsize = 0x5C\n\n[[func]]\nname = \"SetSpeedSpell\"\naddr = 0x404275\nsize = 0xA2\n\n[[func]]\nname = \"ToggleSpell\"\naddr = 0x404317\nsize = 0xF5\n\n[[func]]\nname = \"PrintChar\"\naddr = 0x40440C\nsize = 0x13E\n\n[[func]]\nname = \"AddPanelString\"\naddr = 0x40454A\nsize = 0x32\n\n[[func]]\nname = \"ClearPanel\"\naddr = 0x40457C\nsize = 0xF\n\n[[func]]\nname = \"DrawPanelBox\"\naddr = 0x40458B\nsize = 0x6C\n\n[[func]]\nname = \"SetFlaskHeight\"\naddr = 0x4045FC\nsize = 0x51\n\n[[func]]\nname = \"DrawFlask\"\naddr = 0x40464D\nsize = 0x40\n\n[[func]]\nname = \"DrawLifeFlask\"\naddr = 0x40468D\nsize = 0xC5\n\n[[func]]\nname = \"UpdateLifeFlask\"\naddr = 0x404752\nsize = 0x95\n\n[[func]]\nname = \"DrawManaFlask\"\naddr = 0x4047E7\nsize = 0x80\n\n[[func]]\nname = \"control_update_life_mana\"\naddr = 0x404867\nsize = 0x92\n\n[[func]]\nname = \"UpdateManaFlask\"\naddr = 0x4048F9\nsize = 0xB5\n\n[[func]]\nname = \"InitControlPan\"\naddr = 0x4049AE\nsize = 0x358\n\n[[func]]\nname = \"DrawCtrlPan\"\naddr = 0x404D06\nsize = 0x25\n\n[[func]]\nname = \"DrawCtrlBtns\"\naddr = 0x404D2B\nsize = 0xBB\n\n[[func]]\nname = \"DoSpeedBook\"\naddr = 0x404DE6\nsize = 0x14D\n\n[[func]]\nname = \"DoPanBtn\"\naddr = 0x404F33\nsize = 0xA2\n\n[[func]]\nname = \"control_set_button_down\"\naddr = 0x404FD5\nsize = 0x15\n\n[[func]]\nname = \"control_check_btn_press\"\naddr = 0x404FEA\nsize = 0x84\n\n[[func]]\nname = \"DoAutoMap\"\naddr = 0x40506E\nsize = 0x2C\n\n[[func]]\nname = \"CheckPanelInfo\"\naddr = 0x40509A\nsize = 0x36E\n\n[[func]]\nname = \"CheckBtnUp\"\naddr = 0x405408\nsize = 0x182\n\n[[func]]\nname = \"FreeControlPan\"\naddr = 0x4055AA\nsize = 0x115\n\n[[func]]\nname = \"control_WriteStringToBuffer\"\naddr = 0x4056BF\nsize = 0x31\n\n[[func]]\nname = \"DrawInfoBox\"\naddr = 0x4056F0\nsize = 0x2C8\n\n[[func]]\nname = \"PrintInfo\"\naddr = 0x4059B8\nsize = 0x76\n\n[[func]]\nname = \"CPrintString\"\naddr = 0x405A2E\nsize = 0xBE\n\n[[func]]\nname = \"PrintGameStr\"\naddr = 0x405AEC\nsize = 0x57\n\n[[func]]\nname = \"DrawChr\"\naddr = 0x405B43\nsize = 0xA9F\n\n[[func]]\nname = \"ADD_PlrStringXY\"\naddr = 0x4065E2\nsize = 0xB7\n\n[[func]]\nname = \"MY_PlrStringXY\"\naddr = 0x406699\nsize = 0xBF\n\n[[func]]\nname = \"CheckLvlBtn\"\naddr = 0x406758\nsize = 0x36\n\n[[func]]\nname = \"ReleaseLvlBtn\"\naddr = 0x40678E\nsize = 0x34\n\n[[func]]\nname = \"DrawLevelUpIcon\"\naddr = 0x4067C2\nsize = 0x46\n\n[[func]]\nname = \"CheckChrBtns\"\naddr = 0x406808\nsize = 0xF7\n\n[[func]]\nname = \"ReleaseChrBtns\"\naddr = 0x4068FF\nsize = 0xBA\n\n[[func]]\nname = \"DrawDurIcon\"\naddr = 0x4069B9\nsize = 0x86\n\n[[func]]\nname = \"DrawDurIcon4Item\"\naddr = 0x406A3F\nsize = 0x79\n\n[[func]]\nname = \"RedBack\"\naddr = 0x406AB8\nsize = 0x8A\n\n[[func]]\nname = \"GetSBookTrans\"\naddr = 0x406B42\nsize = 0xE2\n\n[[func]]\nname = \"DrawSpellBook\"\naddr = 0x406C24\nsize = 0x2B1\n\n[[func]]\nname = \"PrintSBookStr\"\naddr = 0x406ED5\nsize = 0xBB\n\n[[func]]\nname = \"CheckSBook\"\naddr = 0x406F90\nsize = 0x148\n\n[[func]]\nname = \"get_pieces_str\"\naddr = 0x4070D8\nsize = 0x10\n\n[[func]]\nname = \"DrawGoldSplit\"\naddr = 0x4070E8\nsize = 0x12F\n\n[[func]]\nname = \"control_drop_gold\"\naddr = 0x407217\nsize = 0x12F\n\n[[func]]\nname = \"control_remove_gold\"\naddr = 0x407346\nsize = 0x114\n\n[[func]]\nname = \"control_set_gold_curs\"\naddr = 0x40745A\nsize = 0x59\n\n[[func]]\nname = \"DrawTalkPan\"\naddr = 0x4074B3\nsize = 0x20F\n\n[[func]]\nname = \"control_print_talk_msg\"\naddr = 0x4076C2\nsize = 0x83\n\n[[func]]\nname = \"control_check_talk_btn\"\naddr = 0x407745\nsize = 0x5B\n\n[[func]]\nname = \"control_release_talk_btn\"\naddr = 0x4077A0\nsize = 0x74\n\n[[func]]\nname = \"control_type_message\"\naddr = 0x407814\nsize = 0x47\n\n[[func]]\nname = \"control_reset_talk\"\naddr = 0x40785B\nsize = 0x19\n\n[[func]]\nname = \"control_talk_last_key\"\naddr = 0x407874\nsize = 0x40\n\n[[func]]\nname = \"control_presskeys\"\naddr = 0x4078B4\nsize = 0x6A\n\n[[func]]\nname = \"control_press_enter\"\naddr = 0x40791E\nsize = 0xDB\n\n[[func]]\nname = \"control_up_down\"\naddr = 0x4079F9\nsize = 0x4D\n\n[[func]]\nname = \"InitCursor\"\naddr = 0x407A46\nsize = 0x27\n\n[[func]]\nname = \"FreeCursor\"\naddr = 0x407A6D\nsize = 0x29\n\n[[func]]\nname = \"SetICursor\"\naddr = 0x407A96\nsize = 0x34\n\n[[func]]\nname = \"SetCursor_\"\naddr = 0x407ACA\nsize = 0x23\n\n[[func]]\nname = \"NewCursor\"\naddr = 0x407AED\nsize = 0x5\n\n[[func]]\nname = \"InitLevelCursor\"\naddr = 0x407AF2\nsize = 0x3D\n\n[[func]]\nname = \"CheckTown\"\naddr = 0x407B2F\nsize = 0x144\n\n[[func]]\nname = \"CheckRportal\"\naddr = 0x407C73\nsize = 0x136\n\n[[func]]\nname = \"CheckCursMove\"\naddr = 0x407DA9\nsize = 0xE2F\n\n[[func]]\nname = \"InitDead\"\naddr = 0x408BD8\nsize = 0x1B0\n\n[[func]]\nname = \"AddDead\"\naddr = 0x408D88\nsize = 0x21\n\n[[func]]\nname = \"SyncUniqDead\"\naddr = 0x408DA9\nsize = 0x84\n\n[[func]]\nname = \"LoadDebugGFX\"\naddr = 0x408E2D\nsize = 0x1B\n\n[[func]]\nname = \"FreeDebugGFX\"\naddr = 0x408E48\nsize = 0x12\n\n[[func]]\nname = \"CheckDungeonClear\"\naddr = 0x408E5A\nsize = 0x8F\n\n[[func]]\nname = \"FreeGameMem\"\naddr = 0x408EE9\nsize = 0x78\n\n[[func]]\nname = \"StartGame\"\naddr = 0x408F61\nsize = 0xB4\n\n[[func]]\nname = \"run_game_loop\"\naddr = 0x409015\nsize = 0x1A0\n\n[[func]]\nname = \"start_game\"\naddr = 0x4091B5\nsize = 0x50\n\n[[func]]\nname = \"free_game\"\naddr = 0x409205\nsize = 0x44\n\n[[func]]\nname = \"diablo_get_not_running\"\naddr = 0x409249\nsize = 0x3A\n\n[[func]]\nname = \"WinMain\"\naddr = 0x409283\nsize = 0x176\n\n[[func]]\nname = \"diablo_parse_flags\"\naddr = 0x4093F9\nsize = 0x203\n\n[[func]]\nname = \"diablo_init_screen\"\naddr = 0x4095FC\nsize = 0x50\n\n[[func]]\nname = \"diablo_TopLevelExceptionFilter\"\naddr = 0x40964C\nsize = 0x22\n\n[[func]]\nname = \"diablo_find_window\"\naddr = 0x40966E\nsize = 0x43\n\n[[func]]\nname = \"diablo_reload_process\"\naddr = 0x4096B1\nsize = 0x211\n\n[[func]]\nname = \"PressEscKey\"\naddr = 0x4098C2\nsize = 0x8F\n\n[[func]]\nname = \"DisableInputWndProc\"\naddr = 0x409951\nsize = 0xC9\n\n[[func]]\nname = \"GM_Game\"\naddr = 0x409A1A\nsize = 0x278\n\n[[func]]\nname = \"LeftMouseDown\"\naddr = 0x409C92\nsize = 0x1FA\n\n[[func]]\nname = \"LeftMouseCmd\"\naddr = 0x409E8C\nsize = 0x24D\n\n[[func]]\nname = \"TryIconCurs\"\naddr = 0x40A0D9\nsize = 0x1F0\n\n[[func]]\nname = \"LeftMouseUp\"\naddr = 0x40A2C9\nsize = 0x45\n\n[[func]]\nname = \"RightMouseDown\"\naddr = 0x40A30E\nsize = 0xE8\n\n[[func]]\nname = \"PressSysKey\"\naddr = 0x40A3FB\nsize = 0x22\n\n[[func]]\nname = \"diablo_hotkey_msg\"\naddr = 0x40A41D\nsize = 0xA1\n\n[[func]]\nname = \"ReleaseKey\"\naddr = 0x40A4BE\nsize = 0xB\n\n[[func]]\nname = \"PressKey\"\naddr = 0x40A4C9\nsize = 0x433\n\n[[func]]\nname = \"diablo_pause_game\"\naddr = 0x40A8FC\nsize = 0x3C\n\n[[func]]\nname = \"PressChar\"\naddr = 0x40A938\nsize = 0x530\n\n[[func]]\nname = \"LoadLvlGFX\"\naddr = 0x40AE68\nsize = 0x1C5\n\n[[func]]\nname = \"LoadAllGFX\"\naddr = 0x40B02D\nsize = 0x2D\n\n[[func]]\nname = \"CreateLevel\"\naddr = 0x40B05A\nsize = 0xF7\n\n[[func]]\nname = \"LoadGameLevel\"\naddr = 0x40B151\nsize = 0x5A8\n\n[[func]]\nname = \"game_loop\"\naddr = 0x40B6F9\nsize = 0x53\n\n[[func]]\nname = \"game_logic\"\naddr = 0x40B74C\nsize = 0xB4\n\n[[func]]\nname = \"timeout_cursor\"\naddr = 0x40B800\nsize = 0x84\n\n[[func]]\nname = \"diablo_color_cyc_logic\"\naddr = 0x40B884\nsize = 0x53\n\n[[func]]\nname = \"alloc_plr\"\naddr = 0x40B8D7\nsize = 0x31\n\n[[func]]\nname = \"get_plr_mem\"\naddr = 0x40B908\nsize = 0x57\n\n[[func]]\nname = \"doom_get_frame_from_time\"\naddr = 0x40B95F\nsize = 0x19\n\n[[func]]\nname = \"doom_alloc_cel\"\naddr = 0x40B9CC\nsize = 0x1E\n\n[[func]]\nname = \"doom_cleanup\"\naddr = 0x40B978\nsize = 0x1F\n\n[[func]]\nname = \"doom_load_graphics\"\naddr = 0x40B9EA\nsize = 0x2E\n\n[[func]]\nname = \"doom_init\"\naddr = 0x40B997\nsize = 0x35\n\n[[func]]\nname = \"doom_close\"\naddr = 0x40BA18\nsize = 0xC\n\n[[func]]\nname = \"doom_draw\"\naddr = 0x40BA24\nsize = 0x24\n\n[[func]]\nname = \"DRLG_Init_Globals\"\naddr = 0x40BA48\nsize = 0xB5\n\n[[func]]\nname = \"LoadL1Dungeon\"\naddr = 0x40BAFD\nsize = 0xF6\n\n[[func]]\nname = \"DRLG_L1Floor\"\naddr = 0x40BBF3\nsize = 0x4E\n\n[[func]]\nname = \"DRLG_L1Pass3\"\naddr = 0x40BC41\nsize = 0xF2\n\n[[func]]\nname = \"DRLG_InitL1Vals\"\naddr = 0x40BD33\nsize = 0xBB\n\n[[func]]\nname = \"LoadPreL1Dungeon\"\naddr = 0x40BDEE\nsize = 0xCA\n\n[[func]]\nname = \"CreateL5Dungeon\"\naddr = 0x40BEB8\nsize = 0xF1\n\n[[func]]\nname = \"DRLG_LoadL1SP\"\naddr = 0x40BFA9\nsize = 0x7E\n\n[[func]]\nname = \"DRLG_FreeL1SP\"\naddr = 0x40C027\nsize = 0x12\n\n[[func]]\nname = \"DRLG_InitL5Vals\"\naddr = 0x40C039\nsize = 0x46\n\n[[func]]\nname = \"DRLG_L5\"\naddr = 0x40C07F\nsize = 0x50F\n\n[[func]]\nname = \"DRLG_PlaceDoor\"\naddr = 0x40C58E\nsize = 0x190\n\n[[func]]\nname = \"drlg_l1_crypt_lavafloor\"\naddr = 0x40C71E\nsize = 0x1BC\n\n[[func]]\nname = \"DRLG_L1Shadows\"\naddr = 0x40CA03\nsize = 0x1ED\n\n[[func]]\nname = \"DRLG_PlaceMiniSet\"\naddr = 0x40CBF0\nsize = 0x291\n\n[[func]]\nname = \"InitL5Dungeon\"\naddr = 0x40CE81\nsize = 0x22\n\n[[func]]\nname = \"L5ClearFlags\"\naddr = 0x40CEA3\nsize = 0x1B\n\n[[func]]\nname = \"L5firstRoom\"\naddr = 0x40CEBE\nsize = 0x237\n\n[[func]]\nname = \"L5drawRoom\"\naddr = 0x40D0F5\nsize = 0x37\n\n[[func]]\nname = \"L5roomGen\"\naddr = 0x40D12C\nsize = 0x209\n\n[[func]]\nname = \"L5checkRoom\"\naddr = 0x40D335\nsize = 0x64\n\n[[func]]\nname = \"L5GetArea\"\naddr = 0x40D399\nsize = 0x22\n\n[[func]]\nname = \"L5makeDungeon\"\naddr = 0x40D3BB\nsize = 0x44\n\n[[func]]\nname = \"L5makeDmt\"\naddr = 0x40D3FF\nsize = 0x76\n\n[[func]]\nname = \"L5AddWall\"\naddr = 0x40D475\nsize = 0x15C\n\n[[func]]\nname = \"L5HWallOk\"\naddr = 0x40D5D1\nsize = 0x8F\n\n[[func]]\nname = \"L5VWallOk\"\naddr = 0x40D660\nsize = 0x7C\n\n[[func]]\nname = \"L5HorizWall\"\naddr = 0x40D6DC\nsize = 0xED\n\n[[func]]\nname = \"L5VertWall\"\naddr = 0x40D7C9\nsize = 0x106\n\n[[func]]\nname = \"L5tileFix\"\naddr = 0x40D8CF\nsize = 0x46F\n\n[[func]]\nname = \"drlg_l1_crypt_rndset\"\naddr = 0x40DD3E\nsize = 0x17E\n\n[[func]]\nname = \"DRLG_L5Subs\"\naddr = 0x40DEBC\nsize = 0xE3\n\n[[func]]\nname = \"L5FillChambers\"\naddr = 0x40DF9F\nsize = 0x76E\n\n[[func]]\nname = \"DRLG_L5GChamber\"\naddr = 0x40E70D\nsize = 0x14B\n\n[[func]]\nname = \"DRLG_L5GHall\"\naddr = 0x40E858\nsize = 0x50\n\n[[func]]\nname = \"DRLG_L5SetRoom\"\naddr = 0x40E8A8\nsize = 0x85\n\n[[func]]\nname = \"drlg_l1_set_crypt_room\"\naddr = 0x40E92D\nsize = 0xAF\n\n[[func]]\nname = \"drlg_l1_set_corner_room\"\naddr = 0x40E9DC\nsize = 0x8B\n\n[[func]]\nname = \"DRLG_L5FloodTVal\"\naddr = 0x40EA67\nsize = 0x6F\n\n[[func]]\nname = \"DRLG_L5FTVR\"\naddr = 0x40EAD6\nsize = 0x1F4\n\n[[func]]\nname = \"DRLG_L5TransFix\"\naddr = 0x40ECCA\nsize = 0x94\n\n[[func]]\nname = \"DRLG_L5DirtFix\"\naddr = 0x40ED5E\nsize = 0xB5\n\n[[func]]\nname = \"DRLG_L5CornerFix\"\naddr = 0x40EE13\nsize = 0x67\n\n[[func]]\nname = \"drlg_l1_crypt_pattern1\"\naddr = 0x40EE7A\nsize = 0x35\n\n[[func]]\nname = \"drlg_l1_crypt_pattern2\"\naddr = 0x40EEAF\nsize = 0xD1\n\n[[func]]\nname = \"drlg_l1_crypt_pattern3\"\naddr = 0x40EF80\nsize = 0xD1\n\n[[func]]\nname = \"drlg_l1_crypt_pattern4\"\naddr = 0x40F051\nsize = 0xD1\n\n[[func]]\nname = \"drlg_l1_crypt_pattern5\"\naddr = 0x40F122\nsize = 0x7D\n\n[[func]]\nname = \"drlg_l1_crypt_pattern6\"\naddr = 0x40F19F\nsize = 0x13D\n\n[[func]]\nname = \"drlg_l1_crypt_pattern7\"\naddr = 0x40F2DC\nsize = 0x35\n\n[[func]]\nname = \"InitDungeon\"\naddr = 0x40F311\nsize = 0x22\n\n[[func]]\nname = \"L2LockoutFix\"\naddr = 0x40F333\nsize = 0x150\n\n[[func]]\nname = \"L2DoorFix\"\naddr = 0x40F483\nsize = 0x35\n\n[[func]]\nname = \"LoadL2Dungeon\"\naddr = 0x40F4B8\nsize = 0x1C0\n\n[[func]]\nname = \"DRLG_L2Pass3\"\naddr = 0x40F678\nsize = 0xF2\n\n[[func]]\nname = \"LoadPreL2Dungeon\"\naddr = 0x40F76A\nsize = 0xD6\n\n[[func]]\nname = \"CreateL2Dungeon\"\naddr = 0x40F840\nsize = 0xCB\n\n[[func]]\nname = \"DRLG_LoadL2SP\"\naddr = 0x40F90B\nsize = 0x59\n\n[[func]]\nname = \"DRLG_FreeL2SP\"\naddr = 0x40F964\nsize = 0x12\n\n[[func]]\nname = \"DRLG_L2\"\naddr = 0x40F976\nsize = 0x6CF\n\n[[func]]\nname = \"DRLG_L2PlaceMiniSet\"\naddr = 0x410045\nsize = 0x25D\n\n[[func]]\nname = \"DRLG_L2PlaceRndSet\"\naddr = 0x4102A2\nsize = 0x1A7\n\n[[func]]\nname = \"DRLG_L2Subs\"\naddr = 0x410449\nsize = 0xF7\n\n[[func]]\nname = \"DRLG_L2Shadows\"\naddr = 0x410540\nsize = 0xD0\n\n[[func]]\nname = \"DRLG_L2SetRoom\"\naddr = 0x410610\nsize = 0x85\n\n[[func]]\nname = \"L2TileFix\"\naddr = 0x410695\nsize = 0x63\n\n[[func]]\nname = \"CreateDungeon\"\naddr = 0x4106F8\nsize = 0x152\n\n[[func]]\nname = \"CreateRoom\"\naddr = 0x41084A\nsize = 0x45F\n\n[[func]]\nname = \"DefineRoom\"\naddr = 0x410CA9\nsize = 0x124\n\n[[func]]\nname = \"AddHall\"\naddr = 0x410DCD\nsize = 0x8F\n\n[[func]]\nname = \"GetHall\"\naddr = 0x410E5C\nsize = 0x5D\n\n[[func]]\nname = \"ConnectHall\"\naddr = 0x410EB9\nsize = 0x35D\n\n[[func]]\nname = \"CreateDoorType\"\naddr = 0x411216\nsize = 0x61\n\n[[func]]\nname = \"PlaceHallExt\"\naddr = 0x411277\nsize = 0x18\n\n[[func]]\nname = \"DoPatternCheck\"\naddr = 0x41128F\nsize = 0x16D\n\n[[func]]\nname = \"DL2_FillVoids\"\naddr = 0x411420\nsize = 0x57A\n\n[[func]]\nname = \"DL2_Cont\"\naddr = 0x41199A\nsize = 0x46\n\n[[func]]\nname = \"DL2_NumNoChar\"\naddr = 0x4119E0\nsize = 0x22\n\n[[func]]\nname = \"DL2_DrawRoom\"\naddr = 0x411A02\nsize = 0x89\n\n[[func]]\nname = \"DL2_KnockWalls\"\naddr = 0x411A8B\nsize = 0xDB\n\n[[func]]\nname = \"DRLG_L2FloodTVal\"\naddr = 0x411B66\nsize = 0x6F\n\n[[func]]\nname = \"DRLG_L2FTVR\"\naddr = 0x411BD5\nsize = 0x1F4\n\n[[func]]\nname = \"DRLG_L2TransFix\"\naddr = 0x411DC9\nsize = 0x94\n\n[[func]]\nname = \"L2DirtFix\"\naddr = 0x411E5D\nsize = 0x6C\n\n[[func]]\nname = \"DRLG_InitL2Vals\"\naddr = 0x411EC9\nsize = 0xC2\n\n[[func]]\nname = \"AddFenceDoors\"\naddr = 0x411F8B\nsize = 0x64\n\n[[func]]\nname = \"FenceDoorFix\"\naddr = 0x411FEF\nsize = 0x113\n\n[[func]]\nname = \"DRLG_L3Anvil\"\naddr = 0x412102\nsize = 0x152\n\n[[func]]\nname = \"FixL3Warp\"\naddr = 0x412254\nsize = 0x64\n\n[[func]]\nname = \"FixL3HallofHeroes\"\naddr = 0x4122B8\nsize = 0x74\n\n[[func]]\nname = \"DRLG_L3LockRec\"\naddr = 0x41232C\nsize = 0x58\n\n[[func]]\nname = \"DRLG_L3Lockout\"\naddr = 0x412384\nsize = 0x5D\n\n[[func]]\nname = \"CreateL3Dungeon\"\naddr = 0x4123E1\nsize = 0xEA\n\n[[func]]\nname = \"DRLG_L3\"\naddr = 0x4124CB\nsize = 0x882\n\n[[func]]\nname = \"InitL3Dungeon\"\naddr = 0x412D4D\nsize = 0x36\n\n[[func]]\nname = \"DRLG_L3FillRoom\"\naddr = 0x412D83\nsize = 0x13B\n\n[[func]]\nname = \"DRLG_L3CreateBlock\"\naddr = 0x412EBE\nsize = 0x1EB\n\n[[func]]\nname = \"DRLG_L3FloorArea\"\naddr = 0x4130A9\nsize = 0x34\n\n[[func]]\nname = \"DRLG_L3FillDiags\"\naddr = 0x4130DD\nsize = 0x71\n\n[[func]]\nname = \"DRLG_L3FillSingles\"\naddr = 0x41314E\nsize = 0x5E\n\n[[func]]\nname = \"DRLG_L3FillStraights\"\naddr = 0x4131AC\nsize = 0x207\n\n[[func]]\nname = \"DRLG_L3Edges\"\naddr = 0x4133B3\nsize = 0x21\n\n[[func]]\nname = \"DRLG_L3GetFloorArea\"\naddr = 0x4133D4\nsize = 0x23\n\n[[func]]\nname = \"DRLG_L3MakeMegas\"\naddr = 0x4133F7\nsize = 0x8E\n\n[[func]]\nname = \"DRLG_L3River\"\naddr = 0x413485\nsize = 0x634\n\n[[func]]\nname = \"DRLG_L3Pool\"\naddr = 0x413AB9\nsize = 0x159\n\n[[func]]\nname = \"DRLG_L3Spawn\"\naddr = 0x413C12\nsize = 0x12F\n\n[[func]]\nname = \"DRLG_L3SpawnEdge\"\naddr = 0x413D41\nsize = 0x14A\n\n[[func]]\nname = \"DRLG_L3PoolFix\"\naddr = 0x413E8B\nsize = 0x83\n\n[[func]]\nname = \"DRLG_L3PlaceMiniSet\"\naddr = 0x413F0E\nsize = 0x20A\n\n[[func]]\nname = \"DRLG_L3PlaceRndSet\"\naddr = 0x414118\nsize = 0x17E\n\n[[func]]\nname = \"drlg_l3_hive_rnd_piece\"\naddr = 0x414296\nsize = 0x18F\n\n[[func]]\nname = \"DRLG_L3Wood\"\naddr = 0x414425\nsize = 0x42B\n\n[[func]]\nname = \"WoodVertU\"\naddr = 0x414850\nsize = 0x4D\n\n[[func]]\nname = \"WoodVertD\"\naddr = 0x41489D\nsize = 0x45\n\n[[func]]\nname = \"WoodHorizL\"\naddr = 0x4148E2\nsize = 0x4D\n\n[[func]]\nname = \"WoodHorizR\"\naddr = 0x41492F\nsize = 0x45\n\n[[func]]\nname = \"DRLG_L3Pass3\"\naddr = 0x414974\nsize = 0x108\n\n[[func]]\nname = \"LoadL3Dungeon\"\naddr = 0x414A7C\nsize = 0x14B\n\n[[func]]\nname = \"LoadPreL3Dungeon\"\naddr = 0x414BC7\nsize = 0xA6\n\n[[func]]\nname = \"DRLG_LoadL4SP\"\naddr = 0x414C6D\nsize = 0x58\n\n[[func]]\nname = \"DRLG_FreeL4SP\"\naddr = 0x414CC5\nsize = 0x12\n\n[[func]]\nname = \"DRLG_L4SetSPRoom\"\naddr = 0x414CD7\nsize = 0x85\n\n[[func]]\nname = \"L4SaveQuads\"\naddr = 0x414D5C\nsize = 0x7D\n\n[[func]]\nname = \"DRLG_L4SetRoom\"\naddr = 0x414DD9\nsize = 0x5E\n\n[[func]]\nname = \"DRLG_LoadDiabQuads\"\naddr = 0x414E37\nsize = 0x10F\n\n[[func]]\nname = \"IsDURWall\"\naddr = 0x414F46\nsize = 0x17\n\n[[func]]\nname = \"IsDLLWall\"\naddr = 0x414F5D\nsize = 0x17\n\n[[func]]\nname = \"L4FixRim\"\naddr = 0x414F74\nsize = 0x1E\n\n[[func]]\nname = \"DRLG_L4GeneralFix\"\naddr = 0x414F92\nsize = 0x35\n\n[[func]]\nname = \"CreateL4Dungeon\"\naddr = 0x414FC7\nsize = 0x51\n\n[[func]]\nname = \"DRLG_L4\"\naddr = 0x415018\nsize = 0x443\n\n[[func]]\nname = \"DRLG_L4Shadows\"\naddr = 0x41545B\nsize = 0x59\n\n[[func]]\nname = \"InitL4Dungeon\"\naddr = 0x4154B4\nsize = 0x4A\n\n[[func]]\nname = \"L4makeDmt\"\naddr = 0x4154FE\nsize = 0x5C\n\n[[func]]\nname = \"L4AddWall\"\naddr = 0x41555A\nsize = 0x2F7\n\n[[func]]\nname = \"L4HWallOk\"\naddr = 0x415851\nsize = 0x97\n\n[[func]]\nname = \"L4VWallOk\"\naddr = 0x4158E8\nsize = 0x9B\n\n[[func]]\nname = \"L4HorizWall\"\naddr = 0x415983\nsize = 0xD4\n\n[[func]]\nname = \"L4VertWall\"\naddr = 0x415A57\nsize = 0xE4\n\n[[func]]\nname = \"L4tileFix\"\naddr = 0x415B3B\nsize = 0x113B\n\n[[func]]\nname = \"DRLG_L4Subs\"\naddr = 0x416C76\nsize = 0xC6\n\n[[func]]\nname = \"L4makeDungeon\"\naddr = 0x416D3C\nsize = 0x119\n\n[[func]]\nname = \"uShape\"\naddr = 0x416E55\nsize = 0x12D\n\n[[func]]\nname = \"GetArea\"\naddr = 0x416F82\nsize = 0x22\n\n[[func]]\nname = \"L4firstRoom\"\naddr = 0x416FA4\nsize = 0x131\n\n[[func]]\nname = \"L4drawRoom\"\naddr = 0x4170D5\nsize = 0x37\n\n[[func]]\nname = \"L4roomGen\"\naddr = 0x41710C\nsize = 0x209\n\n[[func]]\nname = \"L4checkRoom\"\naddr = 0x417315\nsize = 0x6C\n\n[[func]]\nname = \"DRLG_L4PlaceMiniSet\"\naddr = 0x417381\nsize = 0x262\n\n[[func]]\nname = \"DRLG_L4FloodTVal\"\naddr = 0x4175E3\nsize = 0x6F\n\n[[func]]\nname = \"DRLG_L4FTVR\"\naddr = 0x417652\nsize = 0x1F4\n\n[[func]]\nname = \"DRLG_L4TransFix\"\naddr = 0x417846\nsize = 0xCB\n\n[[func]]\nname = \"DRLG_L4Corners\"\naddr = 0x417911\nsize = 0x35\n\n[[func]]\nname = \"DRLG_L4Pass3\"\naddr = 0x417946\nsize = 0x108\n\n[[func]]\nname = \"dthread_remove_player\"\naddr = 0x417A7C\nsize = 0x33\n\n[[func]]\nname = \"dthread_send_delta\"\naddr = 0x417AAF\nsize = 0x7D\n\n[[func]]\nname = \"dthread_start\"\naddr = 0x417B2C\nsize = 0x6D\n\n[[func]]\nname = \"dthread_handler\"\naddr = 0x417B99\nsize = 0xCD\n\n[[func]]\nname = \"dthread_cleanup\"\naddr = 0x417C66\nsize = 0xA2\n\n[[func]]\nname = \"dx_init\"\naddr = 0x417D36\nsize = 0x116\n\n[[func]]\nname = \"dx_create_back_buffer\"\naddr = 0x417E4C\nsize = 0x10D\n\n[[func]]\nname = \"dx_create_primary_surface\"\naddr = 0x417F59\nsize = 0x58\n\n[[func]]\nname = \"dx_DirectDrawCreate\"\naddr = 0x417FB1\nsize = 0x7B\n\n[[func]]\nname = \"lock_buf\"\naddr = 0x41802C\nsize = 0x5\n\n[[func]]\nname = \"lock_buf_priv\"\naddr = 0x418031\nsize = 0x8D\n\n[[func]]\nname = \"unlock_buf\"\naddr = 0x4180BE\nsize = 0x5\n\n[[func]]\nname = \"unlock_buf_priv\"\naddr = 0x4180C3\nsize = 0x7B\n\n[[func]]\nname = \"dx_cleanup\"\naddr = 0x41813E\nsize = 0xA8\n\n[[func]]\nname = \"dx_reinit\"\naddr = 0x4181E6\nsize = 0x60\n\n[[func]]\nname = \"effect_is_playing\"\naddr = 0x41824B\nsize = 0x2D\n\n[[func]]\nname = \"stream_stop\"\naddr = 0x418278\nsize = 0x29\n\n[[func]]\nname = \"InitMonsterSND\"\naddr = 0x4182A1\nsize = 0xE5\n\n[[func]]\nname = \"FreeMonsterSnd\"\naddr = 0x418386\nsize = 0x6A\n\n[[func]]\nname = \"PlayEffect\"\naddr = 0x4183F0\nsize = 0xA3\n\n[[func]]\nname = \"calc_snd_position\"\naddr = 0x418493\nsize = 0x7A\n\n[[func]]\nname = \"PlaySFX\"\naddr = 0x41850D\nsize = 0x18\n\n[[func]]\nname = \"PlaySFX_priv\"\naddr = 0x418525\nsize = 0xC0\n\n[[func]]\nname = \"stream_play\"\naddr = 0x4185E5\nsize = 0x6D\n\n[[func]]\nname = \"RndSFX\"\naddr = 0x418652\nsize = 0x72\n\n[[func]]\nname = \"PlaySfxLoc\"\naddr = 0x4186C4\nsize = 0x38\n\n[[func]]\nname = \"sound_stop\"\naddr = 0x4186FC\nsize = 0x61\n\n[[func]]\nname = \"sfx_stop\"\naddr = 0x41875D\nsize = 0x20\n\n[[func]]\nname = \"sound_update\"\naddr = 0x41877D\nsize = 0x16\n\n[[func]]\nname = \"stream_update\"\naddr = 0x418793\nsize = 0x2F\n\n[[func]]\nname = \"effects_cleanup_sfx\"\naddr = 0x4187C2\nsize = 0x26\n\n[[func]]\nname = \"sound_init\"\naddr = 0x4187E8\nsize = 0x65\n\n[[func]]\nname = \"priv_sound_init\"\naddr = 0x41884D\nsize = 0x57\n\n[[func]]\nname = \"ui_sound_init\"\naddr = 0x4188A4\nsize = 0x7\n\n[[func]]\nname = \"effects_play_sound\"\naddr = 0x4188AB\nsize = 0x65\n\n[[func]]\nname = \"Decrypt\"\naddr = 0x418910\nsize = 0x56\n\n[[func]]\nname = \"Encrypt\"\naddr = 0x418966\nsize = 0x5A\n\n[[func]]\nname = \"Hash\"\naddr = 0x4189C0\nsize = 0x4F\n\n[[func]]\nname = \"InitHash\"\naddr = 0x418A0F\nsize = 0x6F\n\n[[func]]\nname = \"PkwareCompress\"\naddr = 0x418A7E\nsize = 0x96\n\n[[func]]\nname = \"PkwareBufferRead\"\naddr = 0x418B14\nsize = 0x34\n\n[[func]]\nname = \"PkwareBufferWrite\"\naddr = 0x418B48\nsize = 0x27\n\n[[func]]\nname = \"PkwareDecompress\"\naddr = 0x418B6F\nsize = 0x71\n\n[[func]]\nname = \"CelBlit\"\naddr = 0x418BE0\nsize = 0x68\n\n[[func]]\nname = \"CelDraw\"\naddr = 0x418C48\nsize = 0x44\n\n[[func]]\nname = \"CelBlitFrame\"\naddr = 0x418C8C\nsize = 0x26\n\n[[func]]\nname = \"CelClippedDraw\"\naddr = 0x418CB2\nsize = 0x7F\n\n[[func]]\nname = \"CelClippedBlit\"\naddr = 0x418D31\nsize = 0x57\n\n[[func]]\nname = \"CelBlitLight\"\naddr = 0x418D88\nsize = 0xDC\n\n[[func]]\nname = \"CelBlitLightTrans\"\naddr = 0x418E64\nsize = 0xDD\n\n[[func]]\nname = \"CelDrawLight\"\naddr = 0x418F41\nsize = 0x58\n\n[[func]]\nname = \"CelClippedDrawLight\"\naddr = 0x418F99\nsize = 0x92\n\n[[func]]\nname = \"CelClippedBlitLightTrans\"\naddr = 0x41902B\nsize = 0x7C\n\n[[func]]\nname = \"CelDrawLightRed\"\naddr = 0x4190A7\nsize = 0x120\n\n[[func]]\nname = \"CelBlitSafe\"\naddr = 0x4191C7\nsize = 0x7F\n\n[[func]]\nname = \"CelClippedDrawSafe\"\naddr = 0x419246\nsize = 0x7F\n\n[[func]]\nname = \"CelClippedBlitSafe\"\naddr = 0x4192C5\nsize = 0x55\n\n[[func]]\nname = \"CelBlitLightSafe\"\naddr = 0x41931A\nsize = 0xF7\n\n[[func]]\nname = \"CelBlitLightTransSafe\"\naddr = 0x419411\nsize = 0xF8\n\n[[func]]\nname = \"CelDrawLightSafe\"\naddr = 0x419509\nsize = 0x90\n\n[[func]]\nname = \"CelClippedBlitLightTransSafe\"\naddr = 0x419599\nsize = 0x76\n\n[[func]]\nname = \"CelDrawLightRedSafe\"\naddr = 0x41960F\nsize = 0x125\n\n[[func]]\nname = \"CelBlitWidth\"\naddr = 0x419734\nsize = 0x8A\n\n[[func]]\nname = \"CelBlitOutline\"\naddr = 0x4197BE\nsize = 0xFA\n\n[[func]]\nname = \"CelBlitOutlineSafe\"\naddr = 0x4198B8\nsize = 0x12F\n\n[[func]]\nname = \"ENG_set_pixel\"\naddr = 0x4199E7\nsize = 0x45\n\n[[func]]\nname = \"engine_draw_pixel\"\naddr = 0x419A2C\nsize = 0x83\n\n[[func]]\nname = \"DrawLine\"\naddr = 0x419AAF\nsize = 0x40B\n\n[[func]]\nname = \"GetDirection\"\naddr = 0x419EBA\nsize = 0x6D\n\n[[func]]\nname = \"SetRndSeed\"\naddr = 0x419F27\nsize = 0x14\n\n[[func]]\nname = \"GetRndSeed\"\naddr = 0x419F3B\nsize = 0x1F\n\n[[func]]\nname = \"random_\"\naddr = 0x419F5A\nsize = 0x29\n\n[[func]]\nname = \"engine_debug_trap\"\naddr = 0x419FB1\nsize = 0x1\n\n[[func]]\nname = \"DiabloAllocPtr\"\naddr = 0x419FB2\nsize = 0x4D\n\n[[func]]\nname = \"mem_free_dbg\"\naddr = 0x419FFF\nsize = 0x30\n\n[[func]]\nname = \"LoadFileInMem\"\naddr = 0x41A02F\nsize = 0x5B\n\n[[func]]\nname = \"LoadFileWithMem\"\naddr = 0x41A08A\nsize = 0x5F\n\n[[func]]\nname = \"Cl2ApplyTrans\"\naddr = 0x41A0E9\nsize = 0x84\n\n[[func]]\nname = \"Cl2Draw\"\naddr = 0x41A16D\nsize = 0x7F\n\n[[func]]\nname = \"Cl2Blit\"\naddr = 0x41A1EC\nsize = 0x88\n\n[[func]]\nname = \"Cl2DrawOutline\"\naddr = 0x41A274\nsize = 0x83\n\n[[func]]\nname = \"Cl2BlitOutline\"\naddr = 0x41A2F7\nsize = 0xBC\n\n[[func]]\nname = \"Cl2DrawLightTbl\"\naddr = 0x41A3B3\nsize = 0xC7\n\n[[func]]\nname = \"Cl2BlitLight\"\naddr = 0x41A47A\nsize = 0xA5\n\n[[func]]\nname = \"Cl2DrawLight\"\naddr = 0x41A51F\nsize = 0xA2\n\n[[func]]\nname = \"Cl2DrawSafe\"\naddr = 0x41A5C1\nsize = 0x7F\n\n[[func]]\nname = \"Cl2BlitSafe\"\naddr = 0x41A640\nsize = 0x9C\n\n[[func]]\nname = \"Cl2DrawOutlineSafe\"\naddr = 0x41A6DC\nsize = 0x93\n\n[[func]]\nname = \"Cl2BlitOutlineSafe\"\naddr = 0x41A76F\nsize = 0xD0\n\n[[func]]\nname = \"Cl2DrawLightTblSafe\"\naddr = 0x41A83F\nsize = 0xC7\n\n[[func]]\nname = \"Cl2BlitLightSafe\"\naddr = 0x41A906\nsize = 0xBD\n\n[[func]]\nname = \"Cl2DrawLightSafe\"\naddr = 0x41A9C3\nsize = 0xA2\n\n[[func]]\nname = \"PlayInGameMovie\"\naddr = 0x41AA65\nsize = 0x3C\n\n[[func]]\nname = \"InitDiabloMsg\"\naddr = 0x41AAA1\nsize = 0x41\n\n[[func]]\nname = \"ClrDiabloMsg\"\naddr = 0x41AAE2\nsize = 0x1B\n\n[[func]]\nname = \"DrawDiabloMsg\"\naddr = 0x41AAFD\nsize = 0x203\n\n[[func]]\nname = \"fault_init_filter\"\naddr = 0x41AD0A\nsize = 0xA\n\n[[func]]\nname = \"log_create\"\naddr = 0x41AD2A\nsize = 0xBF\n\n[[func]]\nname = \"TopLevelExceptionFilter\"\naddr = 0x41ADE9\nsize = 0x134\n\n[[func]]\nname = \"log_printf\"\naddr = 0x41AF1D\nsize = 0x36\n\n[[func]]\nname = \"fault_unknown_module\"\naddr = 0x41AF53\nsize = 0x8F\n\n[[func]]\nname = \"fault_call_stack\"\naddr = 0x41AFE2\nsize = 0xB7\n\n[[func]]\nname = \"fault_get_error_type\"\naddr = 0x41B099\nsize = 0x14C\n\n[[func]]\nname = \"log_reset\"\naddr = 0x41B20D\nsize = 0x5F\n\n[[func]]\nname = \"fault_reset_filter\"\naddr = 0x41B26C\nsize = 0xD\n\n[[func]]\nname = \"gamemenu_on\"\naddr = 0x41B279\nsize = 0x29\n\n[[func]]\nname = \"gamemenu_update_single\"\naddr = 0x41B2A2\nsize = 0x3E\n\n[[func]]\nname = \"gamemenu_update_multi\"\naddr = 0x41B2E0\nsize = 0x10\n\n[[func]]\nname = \"gamemenu_off\"\naddr = 0x41B2F0\nsize = 0x9\n\n[[func]]\nname = \"gamemenu_handle_previous\"\naddr = 0x41B2F9\nsize = 0x13\n\n[[func]]\nname = \"gamemenu_previous\"\naddr = 0x41B30C\nsize = 0x5\n\n[[func]]\nname = \"gamemenu_new_game\"\naddr = 0x41B311\nsize = 0x54\n\n[[func]]\nname = \"gamemenu_quit_game\"\naddr = 0x41B365\nsize = 0xD\n\n[[func]]\nname = \"gamemenu_load_game\"\naddr = 0x41B372\nsize = 0x7E\n\n[[func]]\nname = \"gamemenu_save_game\"\naddr = 0x41B3F0\nsize = 0x9B\n\n[[func]]\nname = \"gamemenu_restart_town\"\naddr = 0x41B48B\nsize = 0xA\n\n[[func]]\nname = \"gamemenu_options\"\naddr = 0x41B495\nsize = 0x20\n\n[[func]]\nname = \"gamemenu_get_music\"\naddr = 0x41B4B5\nsize = 0x19\n\n[[func]]\nname = \"gamemenu_sound_music_toggle\"\naddr = 0x41B4CE\nsize = 0x41\n\n[[func]]\nname = \"gamemenu_get_sound\"\naddr = 0x41B50F\nsize = 0x19\n\n[[func]]\nname = \"gamemenu_jogging\"\naddr = 0x41B528\nsize = 0x3A\n\n[[func]]\nname = \"gamemenu_get_gamma\"\naddr = 0x41B562\nsize = 0x26\n\n[[func]]\nname = \"gamemenu_music_volume\"\naddr = 0x41B588\nsize = 0x9E\n\n[[func]]\nname = \"gamemenu_slider_music_sound\"\naddr = 0x41B626\nsize = 0xD\n\n[[func]]\nname = \"gamemenu_sound_volume\"\naddr = 0x41B633\nsize = 0x81\n\n[[func]]\nname = \"gamemenu_loadjog\"\naddr = 0x41B6B4\nsize = 0x3A\n\n[[func]]\nname = \"gamemenu_gamma\"\naddr = 0x41B6EE\nsize = 0x2F\n\n[[func]]\nname = \"gamemenu_slider_gamma\"\naddr = 0x41B71D\nsize = 0x10\n\n[[func]]\nname = \"FillSolidBlockTbls\"\naddr = 0x41B72D\nsize = 0x13C\n\n[[func]]\nname = \"MakeSpeedCels\"\naddr = 0x41B869\nsize = 0x436\n\n[[func]]\nname = \"SortTiles\"\naddr = 0x41BC9F\nsize = 0x3F\n\n[[func]]\nname = \"SwapTile\"\naddr = 0x41BCDE\nsize = 0x8C\n\n[[func]]\nname = \"IsometricCoord\"\naddr = 0x41BD6A\nsize = 0x48\n\n[[func]]\nname = \"SetSpeedCels\"\naddr = 0x41BDB2\nsize = 0x49\n\n[[func]]\nname = \"SetDungeonMicros\"\naddr = 0x41BDFB\nsize = 0x149\n\n[[func]]\nname = \"DRLG_InitTrans\"\naddr = 0x41BF44\nsize = 0x30\n\n[[func]]\nname = \"DRLG_MRectTrans\"\naddr = 0x41BF74\nsize = 0x59\n\n[[func]]\nname = \"DRLG_RectTrans\"\naddr = 0x41BFCD\nsize = 0x45\n\n[[func]]\nname = \"DRLG_CopyTrans\"\naddr = 0x41C012\nsize = 0x1F\n\n[[func]]\nname = \"DRLG_ListTrans\"\naddr = 0x41C031\nsize = 0x33\n\n[[func]]\nname = \"DRLG_AreaTrans\"\naddr = 0x41C064\nsize = 0x3F\n\n[[func]]\nname = \"DRLG_InitSetPC\"\naddr = 0x41C0A3\nsize = 0x17\n\n[[func]]\nname = \"DRLG_SetPC\"\naddr = 0x41C0BA\nsize = 0x54\n\n[[func]]\nname = \"Make_SetPC\"\naddr = 0x41C10E\nsize = 0x4F\n\n[[func]]\nname = \"DRLG_WillThemeRoomFit\"\naddr = 0x41C15D\nsize = 0x19C\n\n[[func]]\nname = \"DRLG_CreateThemeRoom\"\naddr = 0x41C2F9\nsize = 0x40F\n\n[[func]]\nname = \"DRLG_PlaceThemeRooms\"\naddr = 0x41C708\nsize = 0x18C\n\n[[func]]\nname = \"DRLG_HoldThemeRooms\"\naddr = 0x41C894\nsize = 0x9A\n\n[[func]]\nname = \"SkipThemeRoom\"\naddr = 0x41C92E\nsize = 0x52\n\n[[func]]\nname = \"InitLevels\"\naddr = 0x41C980\nsize = 0x1A\n\n[[func]]\nname = \"gmenu_draw_pause\"\naddr = 0x41C99A\nsize = 0x33\n\n[[func]]\nname = \"gmenu_print_text\"\naddr = 0x41C9CD\nsize = 0x59\n\n[[func]]\nname = \"FreeGMenu\"\naddr = 0x41CA26\nsize = 0x5A\n\n[[func]]\nname = \"gmenu_init_menu\"\naddr = 0x41CA80\nsize = 0x7F\n\n[[func]]\nname = \"gmenu_is_active\"\naddr = 0x41CAFF\nsize = 0xC\n\n[[func]]\nname = \"gmenu_set_items\"\naddr = 0x41CB0B\nsize = 0x5A\n\n[[func]]\nname = \"gmenu_up_down\"\naddr = 0x41CB65\nsize = 0x6D\n\n[[func]]\nname = \"gmenu_draw\"\naddr = 0x41CBD2\nsize = 0xC1\n\n[[func]]\nname = \"gmenu_draw_menu_item\"\naddr = 0x41CC93\nsize = 0xF4\n\n[[func]]\nname = \"gmenu_clear_buffer\"\naddr = 0x41CD87\nsize = 0x3F\n\n[[func]]\nname = \"gmenu_get_lfont\"\naddr = 0x41CDC6\nsize = 0x3C\n\n[[func]]\nname = \"gmenu_presskeys\"\naddr = 0x41CE02\nsize = 0x7C\n\n[[func]]\nname = \"gmenu_left_right\"\naddr = 0x41CE7E\nsize = 0x50\n\n[[func]]\nname = \"gmenu_on_mouse_move\"\naddr = 0x41CECE\nsize = 0x58\n\n[[func]]\nname = \"gmenu_get_mouse_slider\"\naddr = 0x41CF26\nsize = 0x2F\n\n[[func]]\nname = \"gmenu_left_mouse\"\naddr = 0x41CF55\nsize = 0xB2\n\n[[func]]\nname = \"gmenu_enable\"\naddr = 0x41D007\nsize = 0xE\n\n[[func]]\nname = \"gmenu_slider_set\"\naddr = 0x41D015\nsize = 0x42\n\n[[func]]\nname = \"gmenu_slider_get\"\naddr = 0x41D057\nsize = 0x3D\n\n[[func]]\nname = \"gmenu_slider_steps\"\naddr = 0x41D094\nsize = 0x15\n\n[[func]]\nname = \"InitHelp\"\naddr = 0x41D0A9\nsize = 0x12\n\n[[func]]\nname = \"DrawHelp\"\naddr = 0x41D0BB\nsize = 0x18B\n\n[[func]]\nname = \"DrawHelpLine\"\naddr = 0x41D246\nsize = 0x79\n\n[[func]]\nname = \"DisplayHelp\"\naddr = 0x41D2BF\nsize = 0x1C\n\n[[func]]\nname = \"HelpScrollUp\"\naddr = 0x41D2DB\nsize = 0x10\n\n[[func]]\nname = \"HelpScrollDown\"\naddr = 0x41D2EB\nsize = 0x14\n\n[[func]]\nname = \"init_cleanup\"\naddr = 0x41D2FF\nsize = 0x11D\n\n[[func]]\nname = \"init_run_office_from_start_menu\"\naddr = 0x41D41C\nsize = 0x6D\n\n[[func]]\nname = \"init_run_office\"\naddr = 0x41D489\nsize = 0x179\n\n[[func]]\nname = \"init_disable_screensaver\"\naddr = 0x41D602\nsize = 0x9C\n\n[[func]]\nname = \"init_create_window\"\naddr = 0x41D69E\nsize = 0x143\n\n[[func]]\nname = \"init_kill_mom_parent\"\naddr = 0x41D7E1\nsize = 0x21\n\n[[func]]\nname = \"init_find_mom_parent\"\naddr = 0x41D802\nsize = 0x50\n\n[[func]]\nname = \"init_await_mom_parent_exit\"\naddr = 0x41D852\nsize = 0x2E\n\n[[func]]\nname = \"init_archives\"\naddr = 0x41D880\nsize = 0x1AC\n\n[[func]]\nname = \"init_test_access\"\naddr = 0x41DA2C\nsize = 0x1B3\n\n[[func]]\nname = \"init_strip_trailing_slash\"\naddr = 0x41DBDF\nsize = 0x18\n\n[[func]]\nname = \"init_read_test_file\"\naddr = 0x41DBF7\nsize = 0x95\n\n[[func]]\nname = \"init_get_file_info\"\naddr = 0x41DC8C\nsize = 0xA0\n\n[[func]]\nname = \"MainWndProc\"\naddr = 0x41DD2C\nsize = 0x9E\n\n[[func]]\nname = \"init_activate_window\"\naddr = 0x41DDCA\nsize = 0x5A\n\n[[func]]\nname = \"WindowProc\"\naddr = 0x41DE24\nsize = 0x25\n\n[[func]]\nname = \"SetWindowProc\"\naddr = 0x41DE49\nsize = 0xC\n\n[[func]]\nname = \"interface_msg_pump\"\naddr = 0x41DE55\nsize = 0x48\n\n[[func]]\nname = \"IncProgress\"\naddr = 0x41DE9D\nsize = 0x39\n\n[[func]]\nname = \"DrawCutscene\"\naddr = 0x41DED6\nsize = 0x76\n\n[[func]]\nname = \"DrawProgress\"\naddr = 0x41DF4C\nsize = 0x29\n\n[[func]]\nname = \"ShowProgress\"\naddr = 0x41DF75\nsize = 0x326\n\n[[func]]\nname = \"FreeInterface\"\naddr = 0x41E2C3\nsize = 0x12\n\n[[func]]\nname = \"InitCutscene\"\naddr = 0x41E2D5\nsize = 0x287\n\n[[func]]\nname = \"FreeInvGFX\"\naddr = 0x41E584\nsize = 0x12\n\n[[func]]\nname = \"InitInv\"\naddr = 0x41E596\nsize = 0x62\n\n[[func]]\nname = \"InvDrawSlotBack\"\naddr = 0x41E5F8\nsize = 0x53\n\n[[func]]\nname = \"DrawInv\"\naddr = 0x41E64B\nsize = 0xAFC\n\n[[func]]\nname = \"DrawInvBelt\"\naddr = 0x41F147\nsize = 0x22C\n\n[[func]]\nname = \"AutoPlace\"\naddr = 0x41F373\nsize = 0x192\n\n[[func]]\nname = \"SpecialAutoPlace\"\naddr = 0x41F505\nsize = 0x1C6\n\n[[func]]\nname = \"GoldAutoPlace\"\naddr = 0x41F6CB\nsize = 0x2E4\n\n[[func]]\nname = \"WeaponAutoPlace\"\naddr = 0x41F9AF\nsize = 0xE9\n\n[[func]]\nname = \"SwapItem\"\naddr = 0x41FA98\nsize = 0x3D\n\n[[func]]\nname = \"CheckInvPaste\"\naddr = 0x41FAD5\nsize = 0xE07\n\n[[func]]\nname = \"CheckInvSwap\"\naddr = 0x4208FC\nsize = 0xAA\n\n[[func]]\nname = \"CheckInvCut\"\naddr = 0x4209A6\nsize = 0x490\n\n[[func]]\nname = \"inv_update_rem_item\"\naddr = 0x420E36\nsize = 0x49\n\n[[func]]\nname = \"RemoveInvItem\"\naddr = 0x420E7F\nsize = 0x151\n\n[[func]]\nname = \"inv_diablo_to_hellfire\"\naddr = 0x420FD0\nsize = 0x152\n\n[[func]]\nname = \"RemoveSpdBarItem\"\naddr = 0x421122\nsize = 0x69\n\n[[func]]\nname = \"CheckInvItem\"\naddr = 0x42118B\nsize = 0x27\n\n[[func]]\nname = \"CheckInvScrn\"\naddr = 0x4211B2\nsize = 0x2C\n\n[[func]]\nname = \"CheckItemStats\"\naddr = 0x4211DE\nsize = 0x4D\n\n[[func]]\nname = \"CheckBookLevel\"\naddr = 0x42122B\nsize = 0xB7\n\n[[func]]\nname = \"CheckQuestItem\"\naddr = 0x4212E2\nsize = 0x4F9\n\n[[func]]\nname = \"InvGetItem\"\naddr = 0x4217DB\nsize = 0x19D\n\n[[func]]\nname = \"AutoGetItem\"\naddr = 0x421978\nsize = 0x555\n\n[[func]]\nname = \"FindGetItem\"\naddr = 0x421ECD\nsize = 0x5E\n\n[[func]]\nname = \"SyncGetItem\"\naddr = 0x421F2B\nsize = 0x121\n\n[[func]]\nname = \"CanPut\"\naddr = 0x42204C\nsize = 0xD7\n\n[[func]]\nname = \"TryInvPut\"\naddr = 0x422123\nsize = 0xFE\n\n[[func]]\nname = \"DrawInvMsg\"\naddr = 0x422221\nsize = 0x27\n\n[[func]]\nname = \"InvPutItem\"\naddr = 0x422248\nsize = 0x373\n\n[[func]]\nname = \"SyncPutItem\"\naddr = 0x4225BB\nsize = 0x33A\n\n[[func]]\nname = \"CheckInvHLight\"\naddr = 0x4228F5\nsize = 0x22E\n\n[[func]]\nname = \"RemoveScroll\"\naddr = 0x422B23\nsize = 0xA6\n\n[[func]]\nname = \"UseScroll\"\naddr = 0x422BC9\nsize = 0xC0\n\n[[func]]\nname = \"UseStaffCharge\"\naddr = 0x422C89\nsize = 0x60\n\n[[func]]\nname = \"UseStaff\"\naddr = 0x422CE9\nsize = 0x53\n\n[[func]]\nname = \"StartGoldDrop\"\naddr = 0x422D3C\nsize = 0x76\n\n[[func]]\nname = \"UseInvItem\"\naddr = 0x422DB2\nsize = 0x31B\n\n[[func]]\nname = \"DoTelekinesis\"\naddr = 0x4230CD\nsize = 0x72\n\n[[func]]\nname = \"CalculateGold\"\naddr = 0x42313F\nsize = 0x5D\n\n[[func]]\nname = \"DropItemBeforeTrig\"\naddr = 0x42319C\nsize = 0x2E\n\n[[func]]\nname = \"get_ring_max_value\"\naddr = 0x4231CA\nsize = 0x66\n\n[[func]]\nname = \"get_bow_max_value\"\naddr = 0x423230\nsize = 0x66\n\n[[func]]\nname = \"get_staff_max_value\"\naddr = 0x423296\nsize = 0x66\n\n[[func]]\nname = \"get_sword_max_value\"\naddr = 0x4232FC\nsize = 0x66\n\n[[func]]\nname = \"get_helm_max_value\"\naddr = 0x423362\nsize = 0x66\n\n[[func]]\nname = \"get_shield_max_value\"\naddr = 0x4233C8\nsize = 0x66\n\n[[func]]\nname = \"get_armor_max_value\"\naddr = 0x42342E\nsize = 0x84\n\n[[func]]\nname = \"get_mace_max_value\"\naddr = 0x4234B2\nsize = 0x66\n\n[[func]]\nname = \"get_amulet_max_value\"\naddr = 0x423518\nsize = 0x66\n\n[[func]]\nname = \"get_axe_max_value\"\naddr = 0x42357E\nsize = 0x66\n\n[[func]]\nname = \"items_get_currlevel\"\naddr = 0x4235F6\nsize = 0x26\n\n[[func]]\nname = \"InitItemGFX\"\naddr = 0x42361C\nsize = 0x52\n\n[[func]]\nname = \"ItemPlace\"\naddr = 0x42366E\nsize = 0x4D\n\n[[func]]\nname = \"AddInitItems\"\naddr = 0x4236BB\nsize = 0x12C\n\n[[func]]\nname = \"InitItems\"\naddr = 0x4237E7\nsize = 0x128\n\n[[func]]\nname = \"SpawnNote\"\naddr = 0x42390F\nsize = 0x56\n\n[[func]]\nname = \"CalcPlrItemVals\"\naddr = 0x423965\nsize = 0xCD9\n\n[[func]]\nname = \"CalcPlrScrolls\"\naddr = 0x42463E\nsize = 0x131\n\n[[func]]\nname = \"CalcPlrStaff\"\naddr = 0x42476F\nsize = 0x5D\n\n[[func]]\nname = \"CalcSelfItems\"\naddr = 0x4247CC\nsize = 0xFA\n\n[[func]]\nname = \"CalcPlrItemMin\"\naddr = 0x4248C6\nsize = 0x69\n\n[[func]]\nname = \"ItemMinStats\"\naddr = 0x42492F\nsize = 0x36\n\n[[func]]\nname = \"CalcPlrBookVals\"\naddr = 0x424965\nsize = 0x15A\n\n[[func]]\nname = \"CalcPlrInv\"\naddr = 0x424ABF\nsize = 0x58\n\n[[func]]\nname = \"SetPlrHandItem\"\naddr = 0x424B17\nsize = 0x104\n\n[[func]]\nname = \"GetPlrHandSeed\"\naddr = 0x424C1B\nsize = 0xC\n\n[[func]]\nname = \"GetGoldSeed\"\naddr = 0x424C27\nsize = 0x86\n\n[[func]]\nname = \"SetPlrHandSeed\"\naddr = 0x424CAD\nsize = 0x3\n\n[[func]]\nname = \"SetPlrHandGoldCurs\"\naddr = 0x424CB0\nsize = 0x35\n\n[[func]]\nname = \"CreatePlrItems\"\naddr = 0x424CE5\nsize = 0x2B2\n\n[[func]]\nname = \"ItemSpaceOk\"\naddr = 0x424F97\nsize = 0xF2\n\n[[func]]\nname = \"GetItemSpace\"\naddr = 0x425089\nsize = 0xFB\n\n[[func]]\nname = \"GetSuperItemSpace\"\naddr = 0x425184\nsize = 0x99\n\n[[func]]\nname = \"GetSuperItemLoc\"\naddr = 0x42521D\nsize = 0x6A\n\n[[func]]\nname = \"CalcItemValue\"\naddr = 0x425287\nsize = 0x4C\n\n[[func]]\nname = \"GetBookSpell\"\naddr = 0x4252D3\nsize = 0x102\n\n[[func]]\nname = \"GetStaffPower\"\naddr = 0x4253D5\nsize = 0x1DF\n\n[[func]]\nname = \"GetStaffSpell\"\naddr = 0x4255B4\nsize = 0x14B\n\n[[func]]\nname = \"GetOilType\"\naddr = 0x4256FF\nsize = 0xB5\n\n[[func]]\nname = \"GetItemAttrs\"\naddr = 0x4257B4\nsize = 0x2C2\n\n[[func]]\nname = \"RndPL\"\naddr = 0x425A76\nsize = 0x11\n\n[[func]]\nname = \"PLVal\"\naddr = 0x425A87\nsize = 0x40\n\n[[func]]\nname = \"SaveItemPower\"\naddr = 0x425AC7\nsize = 0xBB1\n\n[[func]]\nname = \"GetItemPower\"\naddr = 0x4267F0\nsize = 0x342\n\n[[func]]\nname = \"GetItemBonus\"\naddr = 0x426B32\nsize = 0xAE\n\n[[func]]\nname = \"SetupItem\"\naddr = 0x426BE0\nsize = 0x9C\n\n[[func]]\nname = \"RndItem\"\naddr = 0x426C7C\nsize = 0x10F\n\n[[func]]\nname = \"RndUItem\"\naddr = 0x426D8B\nsize = 0x115\n\n[[func]]\nname = \"RndAllItems\"\naddr = 0x426EA0\nsize = 0xA3\n\n[[func]]\nname = \"RndTypeItems\"\naddr = 0x426F43\nsize = 0x9A\n\n[[func]]\nname = \"CheckUnique\"\naddr = 0x426FDD\nsize = 0xD1\n\n[[func]]\nname = \"GetUniqueItem\"\naddr = 0x4270AE\nsize = 0x14B\n\n[[func]]\nname = \"SpawnUnique\"\naddr = 0x4271F9\nsize = 0x93\n\n[[func]]\nname = \"ItemRndDur\"\naddr = 0x42728C\nsize = 0x42\n\n[[func]]\nname = \"SetupAllItems\"\naddr = 0x4272CE\nsize = 0x160\n\n[[func]]\nname = \"SpawnItem\"\naddr = 0x42742E\nsize = 0x116\n\n[[func]]\nname = \"CreateItem\"\naddr = 0x427544\nsize = 0xA0\n\n[[func]]\nname = \"CreateRndItem\"\naddr = 0x4275E4\nsize = 0xA9\n\n[[func]]\nname = \"SetupAllUseful\"\naddr = 0x42768D\nsize = 0x7E\n\n[[func]]\nname = \"CreateRndUseful\"\naddr = 0x42770B\nsize = 0x6F\n\n[[func]]\nname = \"CreateTypeItem\"\naddr = 0x42777A\nsize = 0xAA\n\n[[func]]\nname = \"RecreateItem\"\naddr = 0x427824\nsize = 0x115\n\n[[func]]\nname = \"RecreateEar\"\naddr = 0x427939\nsize = 0x139\n\n[[func]]\nname = \"CornerstoneSave\"\naddr = 0x427A72\nsize = 0x48\n\n[[func]]\nname = \"CornerstoneLoad\"\naddr = 0x427ABA\nsize = 0x114\n\n[[func]]\nname = \"SpawnQuestItem\"\naddr = 0x427BCE\nsize = 0x120\n\n[[func]]\nname = \"SpawnRock\"\naddr = 0x427CEE\nsize = 0xD8\n\n[[func]]\nname = \"SpawnItem\"\naddr = 0x427DC6\nsize = 0x9B\n\n[[func]]\nname = \"SpawnMapOfDoom\"\naddr = 0x427E61\nsize = 0xE\n\n[[func]]\nname = \"SpawnRuneBomb\"\naddr = 0x427E6F\nsize = 0xE\n\n[[func]]\nname = \"SpawnTheodore\"\naddr = 0x427E7D\nsize = 0xE\n\n[[func]]\nname = \"RespawnItem\"\naddr = 0x427E8B\nsize = 0xDD\n\n[[func]]\nname = \"DeleteItem\"\naddr = 0x427F68\nsize = 0x34\n\n[[func]]\nname = \"ItemDoppel\"\naddr = 0x427F9C\nsize = 0x5D\n\n[[func]]\nname = \"ProcessItems\"\naddr = 0x427FF9\nsize = 0xE0\n\n[[func]]\nname = \"FreeItemGFX\"\naddr = 0x4280D9\nsize = 0x1D\n\n[[func]]\nname = \"GetItemFrm\"\naddr = 0x4280F6\nsize = 0x21\n\n[[func]]\nname = \"GetItemStr\"\naddr = 0x428117\nsize = 0x73\n\n[[func]]\nname = \"CheckIdentify\"\naddr = 0x42818A\nsize = 0x46\n\n[[func]]\nname = \"DoRepair\"\naddr = 0x4281D0\nsize = 0x5A\n\n[[func]]\nname = \"RepairItem\"\naddr = 0x42822A\nsize = 0x78\n\n[[func]]\nname = \"DoRecharge\"\naddr = 0x4282A2\nsize = 0x74\n\n[[func]]\nname = \"RechargeItem\"\naddr = 0x428316\nsize = 0x47\n\n[[func]]\nname = \"DoOil\"\naddr = 0x42835D\nsize = 0x58\n\n[[func]]\nname = \"OilItem\"\naddr = 0x4283B5\nsize = 0x1FD\n\n[[func]]\nname = \"PrintItemOil\"\naddr = 0x4285DA\nsize = 0x213\n\n[[func]]\nname = \"PrintItemPower\"\naddr = 0x42889B\nsize = 0x5CC\n\n[[func]]\nname = \"DrawUTextBack\"\naddr = 0x428FDF\nsize = 0x5C\n\n[[func]]\nname = \"PrintUString\"\naddr = 0x42903B\nsize = 0xCE\n\n[[func]]\nname = \"DrawULine\"\naddr = 0x429109\nsize = 0x4B\n\n[[func]]\nname = \"DrawUniqueInfo\"\naddr = 0x429154\nsize = 0x136\n\n[[func]]\nname = \"PrintItemMisc\"\naddr = 0x42928A\nsize = 0x191\n\n[[func]]\nname = \"PrintItemDetails\"\naddr = 0x42941B\nsize = 0x25A\n\n[[func]]\nname = \"PrintItemDur\"\naddr = 0x429675\nsize = 0x22E\n\n[[func]]\nname = \"UseItem\"\naddr = 0x4298A3\nsize = 0x7C7\n\n[[func]]\nname = \"StoreStatOk\"\naddr = 0x42A06A\nsize = 0x49\n\n[[func]]\nname = \"SmithItemOk\"\naddr = 0x42A0B3\nsize = 0x3F\n\n[[func]]\nname = \"RndSmithItem\"\naddr = 0x42A0F2\nsize = 0x88\n\n[[func]]\nname = \"BubbleSwapItem\"\naddr = 0x42A17A\nsize = 0x34\n\n[[func]]\nname = \"SortSmith\"\naddr = 0x42A1AE\nsize = 0x63\n\n[[func]]\nname = \"SpawnSmith\"\naddr = 0x42A211\nsize = 0xE4\n\n[[func]]\nname = \"PremiumItemOk\"\naddr = 0x42A2F5\nsize = 0x3B\n\n[[func]]\nname = \"RndPremiumItem\"\naddr = 0x42A330\nsize = 0x7D\n\n[[func]]\nname = \"SpawnPremium\"\naddr = 0x42A3AD\nsize = 0x18F\n\n[[func]]\nname = \"SpawnOnePremium\"\naddr = 0x42A53C\nsize = 0x24F\n\n[[func]]\nname = \"WitchItemOk\"\naddr = 0x42A7BF\nsize = 0x6B\n\n[[func]]\nname = \"RndWitchItem\"\naddr = 0x42A82A\nsize = 0x75\n\n[[func]]\nname = \"SortWitch\"\naddr = 0x42A89F\nsize = 0x67\n\n[[func]]\nname = \"WitchBookLevel\"\naddr = 0x42A906\nsize = 0x98\n\n[[func]]\nname = \"SpawnWitch\"\naddr = 0x42A99E\nsize = 0x281\n\n[[func]]\nname = \"RndBoyItem\"\naddr = 0x42AC1F\nsize = 0x75\n\n[[func]]\nname = \"SpawnBoy\"\naddr = 0x42AC94\nsize = 0x2AF\n\n[[func]]\nname = \"HealerItemOk\"\naddr = 0x42AFEF\nsize = 0x135\n\n[[func]]\nname = \"RndHealerItem\"\naddr = 0x42B124\nsize = 0x75\n\n[[func]]\nname = \"SortHealer\"\naddr = 0x42B199\nsize = 0x67\n\n[[func]]\nname = \"SpawnHealer\"\naddr = 0x42B200\nsize = 0x14B\n\n[[func]]\nname = \"SpawnStoreGold\"\naddr = 0x42B34B\nsize = 0x29\n\n[[func]]\nname = \"RecreateSmithItem\"\naddr = 0x42B374\nsize = 0x51\n\n[[func]]\nname = \"RecreatePremiumItem\"\naddr = 0x42B3C5\nsize = 0x6D\n\n[[func]]\nname = \"RecreateBoyItem\"\naddr = 0x42B432\nsize = 0x6B\n\n[[func]]\nname = \"RecreateWitchItem\"\naddr = 0x42B49D\nsize = 0xE8\n\n[[func]]\nname = \"RecreateHealerItem\"\naddr = 0x42B585\nsize = 0x67\n\n[[func]]\nname = \"RecreateTownItem\"\naddr = 0x42B5EC\nsize = 0x67\n\n[[func]]\nname = \"RecalcStoreStats\"\naddr = 0x42B653\nsize = 0xA1\n\n[[func]]\nname = \"ItemNoFlippy\"\naddr = 0x42B6F4\nsize = 0x2F\n\n[[func]]\nname = \"CreateSpellBook\"\naddr = 0x42B723\nsize = 0xE0\n\n[[func]]\nname = \"CreateMagicArmor\"\naddr = 0x42B803\nsize = 0xD9\n\n[[func]]\nname = \"CreateAmulet\"\naddr = 0x42B8DC\nsize = 0xC7\n\n[[func]]\nname = \"CreateMagicWeapon\"\naddr = 0x42B9A3\nsize = 0xEF\n\n[[func]]\nname = \"GetItemRecord\"\naddr = 0x42BA92\nsize = 0xA3\n\n[[func]]\nname = \"NextItemRecord\"\naddr = 0x42BB35\nsize = 0x46\n\n[[func]]\nname = \"SetItemRecord\"\naddr = 0x42BB7B\nsize = 0x47\n\n[[func]]\nname = \"PutItemRecord\"\naddr = 0x42BBC2\nsize = 0xA5\n\n[[func]]\nname = \"RotateRadius\"\naddr = 0x42BC67\nsize = 0x77\n\n[[func]]\nname = \"DoLighting\"\naddr = 0x42BCDE\nsize = 0x37E\n\n[[func]]\nname = \"DoUnLight\"\naddr = 0x42C05C\nsize = 0x6B\n\n[[func]]\nname = \"DoUnVision\"\naddr = 0x42C0C7\nsize = 0x5A\n\n[[func]]\nname = \"DoVision\"\naddr = 0x42C121\nsize = 0x2AA\n\n[[func]]\nname = \"FreeLightTable\"\naddr = 0x42C3CB\nsize = 0x12\n\n[[func]]\nname = \"InitLightTable\"\naddr = 0x42C3DD\nsize = 0x10\n\n[[func]]\nname = \"MakeLightTable\"\naddr = 0x42C3ED\nsize = 0x453\n\n[[func]]\nname = \"InitLightMax\"\naddr = 0x42C840\nsize = 0x16\n\n[[func]]\nname = \"InitLighting\"\naddr = 0x42C856\nsize = 0x1E\n\n[[func]]\nname = \"AddLight\"\naddr = 0x42C874\nsize = 0x6F\n\n[[func]]\nname = \"AddUnLight\"\naddr = 0x42C8E3\nsize = 0x20\n\n[[func]]\nname = \"ChangeLightRadius\"\naddr = 0x42C903\nsize = 0x53\n\n[[func]]\nname = \"ChangeLightXY\"\naddr = 0x42C956\nsize = 0x5F\n\n[[func]]\nname = \"ChangeLightOff\"\naddr = 0x42C9B5\nsize = 0x5B\n\n[[func]]\nname = \"ChangeLight\"\naddr = 0x42CA10\nsize = 0x6C\n\n[[func]]\nname = \"ProcessLightList\"\naddr = 0x42CA7C\nsize = 0x10A\n\n[[func]]\nname = \"SavePreLighting\"\naddr = 0x42CB86\nsize = 0x18\n\n[[func]]\nname = \"InitVision\"\naddr = 0x42CB9E\nsize = 0x3B\n\n[[func]]\nname = \"AddVision\"\naddr = 0x42CBD9\nsize = 0x72\n\n[[func]]\nname = \"ChangeVisionRadius\"\naddr = 0x42CC4B\nsize = 0x41\n\n[[func]]\nname = \"ChangeVisionXY\"\naddr = 0x42CC8C\nsize = 0x4A\n\n[[func]]\nname = \"ProcessVisionList\"\naddr = 0x42CCD6\nsize = 0x101\n\n[[func]]\nname = \"lighting_color_cycling\"\naddr = 0x42CDD7\nsize = 0x5B\n\n[[func]]\nname = \"LoadGame\"\naddr = 0x42CE32\nsize = 0x552\n\n[[func]]\nname = \"BLoad\"\naddr = 0x42D384\nsize = 0xE\n\n[[func]]\nname = \"WLoad\"\naddr = 0x42D392\nsize = 0x3C\n\n[[func]]\nname = \"ILoad\"\naddr = 0x42D3CE\nsize = 0x3C\n\n[[func]]\nname = \"OLoad\"\naddr = 0x42D40A\nsize = 0x17\n\n[[func]]\nname = \"LoadPlayer\"\naddr = 0x42D421\nsize = 0x2A\n\n[[func]]\nname = \"LoadMonster\"\naddr = 0x42D44B\nsize = 0x36\n\n[[func]]\nname = \"LoadMissile\"\naddr = 0x42D481\nsize = 0x2A\n\n[[func]]\nname = \"LoadObject\"\naddr = 0x42D4AB\nsize = 0x22\n\n[[func]]\nname = \"LoadItem\"\naddr = 0x42D4CD\nsize = 0x36\n\n[[func]]\nname = \"LoadPremium\"\naddr = 0x42D503\nsize = 0x2A\n\n[[func]]\nname = \"LoadQuest\"\naddr = 0x42D52D\nsize = 0x54\n\n[[func]]\nname = \"LoadLighting\"\naddr = 0x42D581\nsize = 0x22\n\n[[func]]\nname = \"LoadVision\"\naddr = 0x42D5A3\nsize = 0x22\n\n[[func]]\nname = \"LoadPortal\"\naddr = 0x42D5C5\nsize = 0x23\n\n[[func]]\nname = \"SaveGame\"\naddr = 0x42D5E8\nsize = 0x4D0\n\n[[func]]\nname = \"BSave\"\naddr = 0x42DAB8\nsize = 0xE\n\n[[func]]\nname = \"WSave\"\naddr = 0x42DAC6\nsize = 0x47\n\n[[func]]\nname = \"ISave\"\naddr = 0x42DB0D\nsize = 0x47\n\n[[func]]\nname = \"OSave\"\naddr = 0x42DB54\nsize = 0x18\n\n[[func]]\nname = \"SavePlayer\"\naddr = 0x42DB6C\nsize = 0x2A\n\n[[func]]\nname = \"SaveMonster\"\naddr = 0x42DB96\nsize = 0x2A\n\n[[func]]\nname = \"SaveMissile\"\naddr = 0x42DBC0\nsize = 0x2A\n\n[[func]]\nname = \"SaveObject\"\naddr = 0x42DBEA\nsize = 0x22\n\n[[func]]\nname = \"SaveItem\"\naddr = 0x42DC0C\nsize = 0x2A\n\n[[func]]\nname = \"SavePremium\"\naddr = 0x42DC36\nsize = 0x2A\n\n[[func]]\nname = \"SaveQuest\"\naddr = 0x42DC60\nsize = 0x58\n\n[[func]]\nname = \"SaveLighting\"\naddr = 0x42DCB8\nsize = 0x22\n\n[[func]]\nname = \"SaveVision\"\naddr = 0x42DCDA\nsize = 0x22\n\n[[func]]\nname = \"SavePortal\"\naddr = 0x42DCFC\nsize = 0x23\n\n[[func]]\nname = \"SaveLevel\"\naddr = 0x42DD1F\nsize = 0x2E8\n\n[[func]]\nname = \"LoadLevel\"\naddr = 0x42E007\nsize = 0x2E6\n\n[[func]]\nname = \"mainmenu_refresh_music\"\naddr = 0x42E2ED\nsize = 0x27\n\n[[func]]\nname = \"mainmenu_loop\"\naddr = 0x42E314\nsize = 0x90\n\n[[func]]\nname = \"mainmenu_single_player\"\naddr = 0x42E3A4\nsize = 0x95\n\n[[func]]\nname = \"mainmenu_init_menu\"\naddr = 0x42E439\nsize = 0x36\n\n[[func]]\nname = \"mainmenu_multi_player\"\naddr = 0x42E46F\nsize = 0x6F\n\n[[func]]\nname = \"mainmenu_play_intro\"\naddr = 0x42E4DE\nsize = 0x17\n\n[[func]]\nname = \"FreeQuestText\"\naddr = 0x42E4F5\nsize = 0x24\n\n[[func]]\nname = \"InitQuestText\"\naddr = 0x42E519\nsize = 0x2A\n\n[[func]]\nname = \"InitQTextMsg\"\naddr = 0x42E543\nsize = 0x61\n\n[[func]]\nname = \"DrawQTextBack\"\naddr = 0x42E5A4\nsize = 0x5C\n\n[[func]]\nname = \"PrintQTextChr\"\naddr = 0x42E600\nsize = 0xA2\n\n[[func]]\nname = \"DrawQText\"\naddr = 0x42E6A2\nsize = 0x1B4\n\n[[func]]\nname = \"GetDamageAmt\"\naddr = 0x42E856\nsize = 0x639\n\n[[func]]\nname = \"CheckBlock\"\naddr = 0x42EF52\nsize = 0x59\n\n[[func]]\nname = \"FindClosest\"\naddr = 0x42EFAB\nsize = 0xAA\n\n[[func]]\nname = \"GetSpellLevel\"\naddr = 0x42F055\nsize = 0x36\n\n[[func]]\nname = \"DeleteMissile\"\naddr = 0x42F08B\nsize = 0x34\n\n[[func]]\nname = \"MonsterTrapHit\"\naddr = 0x42F0BF\nsize = 0x1BE\n\n[[func]]\nname = \"MonsterMHit\"\naddr = 0x42F27D\nsize = 0x392\n\n[[func]]\nname = \"PlayerMHit\"\naddr = 0x42F60F\nsize = 0x477\n\n[[func]]\nname = \"SetMissDir\"\naddr = 0x42FA86\nsize = 0x1A\n\n[[func]]\nname = \"SetMissAnim\"\naddr = 0x42FAA0\nsize = 0x84\n\n[[func]]\nname = \"LoadMissileGFX\"\naddr = 0x42FB24\nsize = 0xEE\n\n[[func]]\nname = \"InitMissileGFX\"\naddr = 0x42FC12\nsize = 0x2D\n\n[[func]]\nname = \"FreeMissiles\"\naddr = 0x42FC3F\nsize = 0x2E\n\n[[func]]\nname = \"FreeMissileGFX\"\naddr = 0x42FC6D\nsize = 0x69\n\n[[func]]\nname = \"FreeMissiles2\"\naddr = 0x42FCD6\nsize = 0x2E\n\n[[func]]\nname = \"InitMissiles\"\naddr = 0x42FD04\nsize = 0x22F\n\n[[func]]\nname = \"missiles_hive_explosion\"\naddr = 0x42FF33\nsize = 0x95\n\n[[func]]\nname = \"missiles_fire_rune\"\naddr = 0x42FFC8\nsize = 0x80\n\n[[func]]\nname = \"missiles_found_target\"\naddr = 0x430048\nsize = 0xF6\n\n[[func]]\nname = \"missiles_light_rune\"\naddr = 0x43013E\nsize = 0x80\n\n[[func]]\nname = \"missiles_great_light_rune\"\naddr = 0x4301BE\nsize = 0x80\n\n[[func]]\nname = \"missiles_immolation_rune\"\naddr = 0x43023E\nsize = 0x80\n\n[[func]]\nname = \"missiles_stone_rune\"\naddr = 0x4302BE\nsize = 0x80\n\n[[func]]\nname = \"missiles_reflection\"\naddr = 0x43033E\nsize = 0x6A\n\n[[func]]\nname = \"missiles_berserk\"\naddr = 0x4303A8\nsize = 0x27C\n\n[[func]]\nname = \"missiles_hork_spawn\"\naddr = 0x430624\nsize = 0x3D\n\n[[func]]\nname = \"GetMissileVel\"\naddr = 0x430661\nsize = 0x99\n\n[[func]]\nname = \"PutMissile\"\naddr = 0x4306FA\nsize = 0x70\n\n[[func]]\nname = \"missiles_jester\"\naddr = 0x43076A\nsize = 0x9B\n\n[[func]]\nname = \"missiles_steal_pots\"\naddr = 0x43082D\nsize = 0x24B\n\n[[func]]\nname = \"missiles_mana_trap\"\naddr = 0x430A78\nsize = 0x111\n\n[[func]]\nname = \"AddLArrow\"\naddr = 0x430B89\nsize = 0x10A\n\n[[func]]\nname = \"GetDirection16\"\naddr = 0x430C93\nsize = 0x690\n\n[[func]]\nname = \"AddArrow\"\naddr = 0x431323\nsize = 0x111\n\n[[func]]\nname = \"missiles_spec_arrow\"\naddr = 0x431434\nsize = 0xA9\n\n[[func]]\nname = \"GetVileMissPos\"\naddr = 0x4314DD\nsize = 0x9E\n\n[[func]]\nname = \"AddRndTeleport\"\naddr = 0x43157B\nsize = 0x157\n\n[[func]]\nname = \"missiles_warp\"\naddr = 0x4316D2\nsize = 0x131\n\n[[func]]\nname = \"AddFirebolt\"\naddr = 0x431803\nsize = 0x119\n\n[[func]]\nname = \"AddMagmaball\"\naddr = 0x43191C\nsize = 0x97\n\n[[func]]\nname = \"GetMissilePos\"\naddr = 0x4319B3\nsize = 0xDC\n\n[[func]]\nname = \"miss_null_33\"\naddr = 0x431A8F\nsize = 0x46\n\n[[func]]\nname = \"AddTeleport\"\naddr = 0x431AD5\nsize = 0x100\n\n[[func]]\nname = \"AddLightball\"\naddr = 0x431BD5\nsize = 0x81\n\n[[func]]\nname = \"missiles_light_wall\"\naddr = 0x431C56\nsize = 0x8A\n\n[[func]]\nname = \"AddFirewall\"\naddr = 0x431CE0\nsize = 0xEA\n\n[[func]]\nname = \"AddFireball\"\naddr = 0x431DCA\nsize = 0x13E\n\n[[func]]\nname = \"missiles_rune_explosion\"\naddr = 0x431F08\nsize = 0x1C6\n\n[[func]]\nname = \"CheckMissileCol\"\naddr = 0x4320CE\nsize = 0x392\n\n[[func]]\nname = \"Plr2PlrMHit\"\naddr = 0x432460\nsize = 0x369\n\n[[func]]\nname = \"missiles_immo_1\"\naddr = 0x4327C9\nsize = 0x14D\n\n[[func]]\nname = \"missiles_immo_2\"\naddr = 0x432916\nsize = 0xC4\n\n[[func]]\nname = \"AddLightctrl\"\naddr = 0x4329DA\nsize = 0x6C\n\n[[func]]\nname = \"missiles_larrow\"\naddr = 0x432A46\nsize = 0x9F\n\n[[func]]\nname = \"AddLightning\"\naddr = 0x432AE5\nsize = 0xD1\n\n[[func]]\nname = \"AddMisexp\"\naddr = 0x432BB6\nsize = 0xDB\n\n[[func]]\nname = \"AddWeapexp\"\naddr = 0x432C91\nsize = 0x6B\n\n[[func]]\nname = \"CheckIfTrig\"\naddr = 0x432CFC\nsize = 0x63\n\n[[func]]\nname = \"AddTown\"\naddr = 0x432D5F\nsize = 0x1FA\n\n[[func]]\nname = \"AddFlash\"\naddr = 0x432F59\nsize = 0xE4\n\n[[func]]\nname = \"missiles_43303D\"\naddr = 0x43303D\nsize = 0x3\n\n[[func]]\nname = \"missiles_433040\"\naddr = 0x433040\nsize = 0x5C\n\n[[func]]\nname = \"AddFlash2\"\naddr = 0x43309C\nsize = 0xDC\n\n[[func]]\nname = \"AddManashield\"\naddr = 0x433178\nsize = 0x62\n\n[[func]]\nname = \"AddFiremove\"\naddr = 0x4331DA\nsize = 0x83\n\n[[func]]\nname = \"AddGuardian\"\naddr = 0x43325D\nsize = 0x21C\n\n[[func]]\nname = \"AddChain\"\naddr = 0x433479\nsize = 0x33\n\n[[func]]\nname = \"miss_null_11\"\naddr = 0x4334AC\nsize = 0x33\n\n[[func]]\nname = \"miss_null_12\"\naddr = 0x4334DF\nsize = 0x3D\n\n[[func]]\nname = \"miss_null_13\"\naddr = 0x43351C\nsize = 0x3F\n\n[[func]]\nname = \"AddRhino\"\naddr = 0x43355B\nsize = 0x111\n\n[[func]]\nname = \"miss_null_32\"\naddr = 0x43366C\nsize = 0xDE\n\n[[func]]\nname = \"AddFlare\"\naddr = 0x43374A\nsize = 0x182\n\n[[func]]\nname = \"AddAcid\"\naddr = 0x4338CC\nsize = 0x99\n\n[[func]]\nname = \"miss_null_1D\"\naddr = 0x433965\nsize = 0x3C\n\n[[func]]\nname = \"AddAcidpud\"\naddr = 0x4339A1\nsize = 0x64\n\n[[func]]\nname = \"AddStone\"\naddr = 0x433A05\nsize = 0x1A2\n\n[[func]]\nname = \"AddGolem\"\naddr = 0x433BA7\nsize = 0xC9\n\n[[func]]\nname = \"AddEtherealize\"\naddr = 0x433C70\nsize = 0x9A\n\n[[func]]\nname = \"miss_null_1F\"\naddr = 0x433D0A\nsize = 0x13\n\n[[func]]\nname = \"miss_null_23\"\naddr = 0x433D1D\nsize = 0x66\n\n[[func]]\nname = \"AddBoom\"\naddr = 0x433D83\nsize = 0x53\n\n[[func]]\nname = \"AddHeal\"\naddr = 0x433DD6\nsize = 0x123\n\n[[func]]\nname = \"missiles_rech_mana\"\naddr = 0x433EF9\nsize = 0x11A\n\n[[func]]\nname = \"missiles_magi\"\naddr = 0x434013\nsize = 0x59\n\n[[func]]\nname = \"AddHealOther\"\naddr = 0x43406C\nsize = 0x33\n\n[[func]]\nname = \"AddElement\"\naddr = 0x43409F\nsize = 0x119\n\n[[func]]\nname = \"GetDirection8\"\naddr = 0x4341B8\nsize = 0x636\n\n[[func]]\nname = \"AddIdentify\"\naddr = 0x4347EE\nsize = 0x51\n\n[[func]]\nname = \"AddFirewallC\"\naddr = 0x43483F\nsize = 0x13C\n\n[[func]]\nname = \"missiles_ring\"\naddr = 0x43497B\nsize = 0x75\n\n[[func]]\nname = \"missiles_search\"\naddr = 0x4349F0\nsize = 0x101\n\n[[func]]\nname = \"AddInfra\"\naddr = 0x434AF1\nsize = 0x73\n\n[[func]]\nname = \"AddWave\"\naddr = 0x434B64\nsize = 0x4B\n\n[[func]]\nname = \"AddNova\"\naddr = 0x434BAF\nsize = 0x106\n\n[[func]]\nname = \"AddBlodboil\"\naddr = 0x434CB5\nsize = 0x122\n\n[[func]]\nname = \"AddRepair\"\naddr = 0x434DD7\nsize = 0x51\n\n[[func]]\nname = \"AddRecharge\"\naddr = 0x434E28\nsize = 0x51\n\n[[func]]\nname = \"AddDisarm\"\naddr = 0x434E79\nsize = 0x33\n\n[[func]]\nname = \"AddApoca\"\naddr = 0x434EAC\nsize = 0xF5\n\n[[func]]\nname = \"AddFlame\"\naddr = 0x434FA1\nsize = 0x111\n\n[[func]]\nname = \"AddFlamec\"\naddr = 0x4350B2\nsize = 0x78\n\n[[func]]\nname = \"AddCbolt\"\naddr = 0x43512A\nsize = 0xFB\n\n[[func]]\nname = \"missiles_cbolt_arrow\"\naddr = 0x435225\nsize = 0xDA\n\n[[func]]\nname = \"AddHbolt\"\naddr = 0x4352FF\nsize = 0xE7\n\n[[func]]\nname = \"missiles_hbolt_arrow\"\naddr = 0x4353E6\nsize = 0xAC\n\n[[func]]\nname = \"AddResurrect\"\naddr = 0x435492\nsize = 0x37\n\n[[func]]\nname = \"AddResurrectBeam\"\naddr = 0x4354C9\nsize = 0x4E\n\n[[func]]\nname = \"AddTelekinesis\"\naddr = 0x435517\nsize = 0x33\n\n[[func]]\nname = \"AddBoneSpirit\"\naddr = 0x43554A\nsize = 0x10F\n\n[[func]]\nname = \"AddRportal\"\naddr = 0x435659\nsize = 0x4A\n\n[[func]]\nname = \"AddDiabApoca\"\naddr = 0x4356A3\nsize = 0x8C\n\n[[func]]\nname = \"AddMissile\"\naddr = 0x43572F\nsize = 0x192\n\n[[func]]\nname = \"Sentfire\"\naddr = 0x4358C1\nsize = 0xDF\n\n[[func]]\nname = \"mi_hork_spawn\"\naddr = 0x4359A0\nsize = 0x138\n\n[[func]]\nname = \"MI_Rune\"\naddr = 0x435AD8\nsize = 0xDB\n\n[[func]]\nname = \"MI_Golem\"\naddr = 0x435BB3\nsize = 0x126\n\n[[func]]\nname = \"MI_SetManashield\"\naddr = 0x435CD9\nsize = 0xB\n\n[[func]]\nname = \"MI_LArrow\"\naddr = 0x435CE4\nsize = 0x32B\n\n[[func]]\nname = \"MI_Arrow\"\naddr = 0x43600F\nsize = 0xD9\n\n[[func]]\nname = \"MI_Firebolt\"\naddr = 0x4360E8\nsize = 0x351\n\n[[func]]\nname = \"MI_Lightball\"\naddr = 0x436439\nsize = 0xE8\n\n[[func]]\nname = \"mi_light_wall\"\naddr = 0x436521\nsize = 0x62\n\n[[func]]\nname = \"mi_null_33\"\naddr = 0x436583\nsize = 0x6A\n\n[[func]]\nname = \"MI_Acidpud\"\naddr = 0x4365ED\nsize = 0x74\n\n[[func]]\nname = \"MI_Firewall\"\naddr = 0x436661\nsize = 0x171\n\n[[func]]\nname = \"MI_Fireball\"\naddr = 0x4367D2\nsize = 0x413\n\n[[func]]\nname = \"mi_hive_explode\"\naddr = 0x436BE5\nsize = 0x3E\n\n[[func]]\nname = \"mi_immolation\"\naddr = 0x436C23\nsize = 0x46D\n\n[[func]]\nname = \"MI_Lightctrl\"\naddr = 0x4370B0\nsize = 0x20B\n\n[[func]]\nname = \"mi_light_arrow\"\naddr = 0x4372BB\nsize = 0x183\n\n[[func]]\nname = \"MI_Lightning\"\naddr = 0x43743E\nsize = 0x86\n\n[[func]]\nname = \"MI_Town\"\naddr = 0x4374C4\nsize = 0x1B3\n\n[[func]]\nname = \"MI_Flash\"\naddr = 0x437677\nsize = 0x134\n\n[[func]]\nname = \"mi_flashfr\"\naddr = 0x4377AB\nsize = 0x9A\n\n[[func]]\nname = \"mi_flashbk\"\naddr = 0x437845\nsize = 0x66\n\n[[func]]\nname = \"MI_Flash2\"\naddr = 0x4378AB\nsize = 0xDC\n\n[[func]]\nname = \"mi_reflect\"\naddr = 0x437987\nsize = 0xCD\n\n[[func]]\nname = \"MI_Manashield\"\naddr = 0x437A54\nsize = 0x26C\n\n[[func]]\nname = \"MI_Etherealize\"\naddr = 0x437CC0\nsize = 0xD9\n\n[[func]]\nname = \"MI_Firemove\"\naddr = 0x437D99\nsize = 0x1D7\n\n[[func]]\nname = \"MI_Guardian\"\naddr = 0x437F70\nsize = 0x1FD\n\n[[func]]\nname = \"MI_Chain\"\naddr = 0x43816D\nsize = 0x131\n\n[[func]]\nname = \"mi_null_11\"\naddr = 0x43829E\nsize = 0x35\n\n[[func]]\nname = \"MI_Weapexp\"\naddr = 0x4382D3\nsize = 0x14C\n\n[[func]]\nname = \"MI_Misexp\"\naddr = 0x43841F\nsize = 0xCC\n\n[[func]]\nname = \"MI_Acidsplat\"\naddr = 0x4384EB\nsize = 0x91\n\n[[func]]\nname = \"MI_Teleport\"\naddr = 0x43857C\nsize = 0x14F\n\n[[func]]\nname = \"MI_Stone\"\naddr = 0x4386CB\nsize = 0xB3\n\n[[func]]\nname = \"MI_Boom\"\naddr = 0x43877E\nsize = 0x62\n\n[[func]]\nname = \"MI_Rhino\"\naddr = 0x4387E0\nsize = 0x181\n\n[[func]]\nname = \"MoveMissilePos\"\naddr = 0x438961\nsize = 0x8F\n\n[[func]]\nname = \"mi_null_32\"\naddr = 0x438A10\nsize = 0x1BD\n\n[[func]]\nname = \"MI_FirewallC\"\naddr = 0x438BCD\nsize = 0x176\n\n[[func]]\nname = \"mi_fire_ring\"\naddr = 0x438D43\nsize = 0x150\n\n[[func]]\nname = \"mi_light_ring\"\naddr = 0x438E93\nsize = 0x150\n\n[[func]]\nname = \"mi_search\"\naddr = 0x438FE3\nsize = 0x42\n\n[[func]]\nname = \"mi_lightning_wall\"\naddr = 0x439025\nsize = 0x1BE\n\n[[func]]\nname = \"MI_Infra\"\naddr = 0x4391E3\nsize = 0x49\n\n[[func]]\nname = \"MI_Apoca\"\naddr = 0x43922C\nsize = 0x11D\n\n[[func]]\nname = \"MI_Wave\"\naddr = 0x439349\nsize = 0x269\n\n[[func]]\nname = \"MI_Nova\"\naddr = 0x4395B2\nsize = 0x15E\n\n[[func]]\nname = \"mi_fire_nova\"\naddr = 0x439710\nsize = 0x15E\n\n[[func]]\nname = \"mi_spec_arrow\"\naddr = 0x43986E\nsize = 0x124\n\n[[func]]\nname = \"MI_Blodboil\"\naddr = 0x439992\nsize = 0x1D3\n\n[[func]]\nname = \"MI_Flame\"\naddr = 0x439B65\nsize = 0xC9\n\n[[func]]\nname = \"MI_Flamec\"\naddr = 0x439C2E\nsize = 0xDE\n\n[[func]]\nname = \"MI_Cbolt\"\naddr = 0x439D0C\nsize = 0x18A\n\n[[func]]\nname = \"MI_Hbolt\"\naddr = 0x439E96\nsize = 0x149\n\n[[func]]\nname = \"MI_Element\"\naddr = 0x439FDF\nsize = 0x378\n\n[[func]]\nname = \"MI_Bonespirit\"\naddr = 0x43A357\nsize = 0x201\n\n[[func]]\nname = \"MI_ResurrectBeam\"\naddr = 0x43A558\nsize = 0x1F\n\n[[func]]\nname = \"MI_Rportal\"\naddr = 0x43A577\nsize = 0x12E\n\n[[func]]\nname = \"ProcessMissiles\"\naddr = 0x43A6A5\nsize = 0x1AC\n\n[[func]]\nname = \"missiles_process_charge\"\naddr = 0x43A851\nsize = 0x8C\n\n[[func]]\nname = \"ClearMissileSpot\"\naddr = 0x43A8DD\nsize = 0x28\n\n[[func]]\nname = \"InitLevelMonsters\"\naddr = 0x43A905\nsize = 0x59\n\n[[func]]\nname = \"AddMonsterType\"\naddr = 0x43A95E\nsize = 0x7D\n\n[[func]]\nname = \"GetLevelMTypes\"\naddr = 0x43A9DB\nsize = 0x35E\n\n[[func]]\nname = \"InitMonsterGFX\"\naddr = 0x43AD39\nsize = 0x392\n\n[[func]]\nname = \"InitMonsterTRN\"\naddr = 0x43B0CB\nsize = 0x8E\n\n[[func]]\nname = \"InitMonster\"\naddr = 0x43B159\nsize = 0x3FB\n\n[[func]]\nname = \"ClrAllMonsters\"\naddr = 0x43B554\nsize = 0xAD\n\n[[func]]\nname = \"ClearMVars\"\naddr = 0x43B601\nsize = 0x39\n\n[[func]]\nname = \"MonstPlace\"\naddr = 0x43B63A\nsize = 0x48\n\n[[func]]\nname = \"monster_some_crypt\"\naddr = 0x43B682\nsize = 0x63\n\n[[func]]\nname = \"LoadDiabMonsts\"\naddr = 0x43B6E5\nsize = 0xB3\n\n[[func]]\nname = \"InitMonsters\"\naddr = 0x43B798\nsize = 0x218\n\n[[func]]\nname = \"PlaceUniques\"\naddr = 0x43B9B0\nsize = 0xC8\n\n[[func]]\nname = \"PlaceUniqueMonst\"\naddr = 0x43BA78\nsize = 0x55D\n\n[[func]]\nname = \"PlaceMonster\"\naddr = 0x43BFD5\nsize = 0x82\n\n[[func]]\nname = \"PlaceQuestMonsters\"\naddr = 0x43C057\nsize = 0x2E6\n\n[[func]]\nname = \"PlaceGroup\"\naddr = 0x43C33D\nsize = 0x28F\n\n[[func]]\nname = \"SetMapMonsters\"\naddr = 0x43C5CC\nsize = 0x140\n\n[[func]]\nname = \"DeleteMonster\"\naddr = 0x43C70C\nsize = 0x29\n\n[[func]]\nname = \"AddMonster\"\naddr = 0x43C735\nsize = 0x50\n\n[[func]]\nname = \"AddDoppelganger\"\naddr = 0x43C785\nsize = 0xEC\n\n[[func]]\nname = \"M_Ranged\"\naddr = 0x43C871\nsize = 0x27\n\n[[func]]\nname = \"M_Talker\"\naddr = 0x43C898\nsize = 0x36\n\n[[func]]\nname = \"M_Enemy\"\naddr = 0x43C8CE\nsize = 0x32F\n\n[[func]]\nname = \"M_StartStand\"\naddr = 0x43CBFD\nsize = 0x9D\n\n[[func]]\nname = \"NewMonsterAnim\"\naddr = 0x43CC9A\nsize = 0x3E\n\n[[func]]\nname = \"M_CheckEFlag\"\naddr = 0x43CCD8\nsize = 0x5A\n\n[[func]]\nname = \"M_ClearSquares\"\naddr = 0x43CD32\nsize = 0x8F\n\n[[func]]\nname = \"M_GetKnockback\"\naddr = 0x43CDC1\nsize = 0xEE\n\n[[func]]\nname = \"M_StartHit\"\naddr = 0x43CEAF\nsize = 0x1B5\n\n[[func]]\nname = \"M_GetDir\"\naddr = 0x43D064\nsize = 0x28\n\n[[func]]\nname = \"M_StartKill\"\naddr = 0x43D08C\nsize = 0x7D\n\n[[func]]\nname = \"MonstStartKill\"\naddr = 0x43D109\nsize = 0x1A8\n\n[[func]]\nname = \"M_DiabloDeath\"\naddr = 0x43D2B1\nsize = 0x230\n\n[[func]]\nname = \"SpawnLoot\"\naddr = 0x43D4E1\nsize = 0x174\n\n[[func]]\nname = \"M_SyncStartKill\"\naddr = 0x43D655\nsize = 0x73\n\n[[func]]\nname = \"M_DoStand\"\naddr = 0x43D6C8\nsize = 0x58\n\n[[func]]\nname = \"M_DoWalk\"\naddr = 0x43D720\nsize = 0x12D\n\n[[func]]\nname = \"M_ChangeLightOffset\"\naddr = 0x43D84D\nsize = 0x5F\n\n[[func]]\nname = \"M_DoWalk2\"\naddr = 0x43D8AC\nsize = 0x10A\n\n[[func]]\nname = \"M_DoWalk3\"\naddr = 0x43D9B6\nsize = 0x13E\n\n[[func]]\nname = \"M_TryM2MHit\"\naddr = 0x43DAF4\nsize = 0xEA\n\n[[func]]\nname = \"M2MStartHit\"\naddr = 0x43DBDE\nsize = 0x1AC\n\n[[func]]\nname = \"M2MStartKill\"\naddr = 0x43DD8A\nsize = 0x214\n\n[[func]]\nname = \"M_DoAttack\"\naddr = 0x43DF9E\nsize = 0x14E\n\n[[func]]\nname = \"M_TryH2HHit\"\naddr = 0x43E0EC\nsize = 0x619\n\n[[func]]\nname = \"M_DoRAttack\"\naddr = 0x43E705\nsize = 0xD0\n\n[[func]]\nname = \"M_DoRSpAttack\"\naddr = 0x43E7D5\nsize = 0x106\n\n[[func]]\nname = \"M_DoSAttack\"\naddr = 0x43E8DB\nsize = 0x77\n\n[[func]]\nname = \"M_DoFadein\"\naddr = 0x43E952\nsize = 0x52\n\n[[func]]\nname = \"M_DoFadeout\"\naddr = 0x43E9A4\nsize = 0x70\n\n[[func]]\nname = \"M_DoHeal\"\naddr = 0x43EA14\nsize = 0x71\n\n[[func]]\nname = \"M_DoTalk\"\naddr = 0x43EA85\nsize = 0x27B\n\n[[func]]\nname = \"M_Teleport\"\naddr = 0x43ED00\nsize = 0x133\n\n[[func]]\nname = \"M_DoGotHit\"\naddr = 0x43EE33\nsize = 0x39\n\n[[func]]\nname = \"M_UpdateLeader\"\naddr = 0x43EE6C\nsize = 0x72\n\n[[func]]\nname = \"DoEnding\"\naddr = 0x43EEDE\nsize = 0xDA\n\n[[func]]\nname = \"PrepDoEnding\"\naddr = 0x43EFB8\nsize = 0xB6\n\n[[func]]\nname = \"M_DoDeath\"\naddr = 0x43F06E\nsize = 0xFA\n\n[[func]]\nname = \"M_DoSpStand\"\naddr = 0x43F168\nsize = 0x5C\n\n[[func]]\nname = \"M_DoDelay\"\naddr = 0x43F1C4\nsize = 0x94\n\n[[func]]\nname = \"M_DoStone\"\naddr = 0x43F258\nsize = 0x3E\n\n[[func]]\nname = \"M_WalkDir\"\naddr = 0x43F296\nsize = 0x123\n\n[[func]]\nname = \"M_StartWalk\"\naddr = 0x43F3D9\nsize = 0xCD\n\n[[func]]\nname = \"M_StartWalk2\"\naddr = 0x43F4A6\nsize = 0x136\n\n[[func]]\nname = \"M_StartWalk3\"\naddr = 0x43F5DC\nsize = 0x159\n\n[[func]]\nname = \"GroupUnity\"\naddr = 0x43F735\nsize = 0x202\n\n[[func]]\nname = \"M_CallWalk\"\naddr = 0x43F937\nsize = 0x111\n\n[[func]]\nname = \"M_PathWalk\"\naddr = 0x43FA48\nsize = 0x73\n\n[[func]]\nname = \"M_CallWalk2\"\naddr = 0x43FABB\nsize = 0x89\n\n[[func]]\nname = \"M_DumbWalk\"\naddr = 0x43FB44\nsize = 0x21\n\n[[func]]\nname = \"M_RoundWalk\"\naddr = 0x43FB65\nsize = 0xD1\n\n[[func]]\nname = \"MAI_Zombie\"\naddr = 0x43FC36\nsize = 0x13D\n\n[[func]]\nname = \"M_StartAttack\"\naddr = 0x43FD73\nsize = 0x82\n\n[[func]]\nname = \"MAI_SkelSd\"\naddr = 0x43FDF5\nsize = 0x131\n\n[[func]]\nname = \"M_StartDelay\"\naddr = 0x43FF26\nsize = 0x26\n\n[[func]]\nname = \"MAI_Path\"\naddr = 0x43FF4C\nsize = 0xBF\n\n[[func]]\nname = \"MAI_Snake\"\naddr = 0x44000B\nsize = 0x28D\n\n[[func]]\nname = \"MAI_Bat\"\naddr = 0x440298\nsize = 0x25F\n\n[[func]]\nname = \"MAI_SkelBow\"\naddr = 0x4404F7\nsize = 0x135\n\n[[func]]\nname = \"M_StartRAttack\"\naddr = 0x44062C\nsize = 0x98\n\n[[func]]\nname = \"MAI_Fat\"\naddr = 0x4406C4\nsize = 0x11C\n\n[[func]]\nname = \"M_StartSpAttack\"\naddr = 0x4407E0\nsize = 0x85\n\n[[func]]\nname = \"MAI_Sneak\"\naddr = 0x440865\nsize = 0x275\n\n[[func]]\nname = \"M_StartFadein\"\naddr = 0x440ADA\nsize = 0xBB\n\n[[func]]\nname = \"M_StartFadeout\"\naddr = 0x440B95\nsize = 0xAA\n\n[[func]]\nname = \"MAI_Fireman\"\naddr = 0x440C3F\nsize = 0x220\n\n[[func]]\nname = \"MAI_Fallen\"\naddr = 0x440E5F\nsize = 0x1FA\n\n[[func]]\nname = \"M_StartSpStand\"\naddr = 0x441059\nsize = 0x7E\n\n[[func]]\nname = \"MAI_Cleaver\"\naddr = 0x4410D7\nsize = 0xA5\n\n[[func]]\nname = \"MAI_Round\"\naddr = 0x44117C\nsize = 0x292\n\n[[func]]\nname = \"MAI_GoatMc\"\naddr = 0x44140E\nsize = 0x8\n\n[[func]]\nname = \"MAI_Ranged\"\naddr = 0x441416\nsize = 0x17D\n\n[[func]]\nname = \"M_StartRSpAttack\"\naddr = 0x441593\nsize = 0xA1\n\n[[func]]\nname = \"MAI_GoatBow\"\naddr = 0x441634\nsize = 0xA\n\n[[func]]\nname = \"MAI_Succ\"\naddr = 0x44163E\nsize = 0xB\n\n[[func]]\nname = \"MAI_Lich\"\naddr = 0x441649\nsize = 0xB\n\n[[func]]\nname = \"MAI_ArchLich\"\naddr = 0x441654\nsize = 0xB\n\n[[func]]\nname = \"MAI_Psychorb\"\naddr = 0x44165F\nsize = 0xB\n\n[[func]]\nname = \"MAI_Necromorb\"\naddr = 0x44166A\nsize = 0xB\n\n[[func]]\nname = \"MAI_AcidUniq\"\naddr = 0x441675\nsize = 0xB\n\n[[func]]\nname = \"MAI_Firebat\"\naddr = 0x441680\nsize = 0xB\n\n[[func]]\nname = \"MAI_Torchant\"\naddr = 0x44168B\nsize = 0xB\n\n[[func]]\nname = \"MAI_Scav\"\naddr = 0x441696\nsize = 0x2DD\n\n[[func]]\nname = \"M_StartEat\"\naddr = 0x441973\nsize = 0x79\n\n[[func]]\nname = \"MAI_Garg\"\naddr = 0x4419EC\nsize = 0x123\n\n[[func]]\nname = \"M_StartHeal\"\naddr = 0x441B0F\nsize = 0x73\n\n[[func]]\nname = \"MAI_RoundRanged\"\naddr = 0x441B82\nsize = 0x300\n\n[[func]]\nname = \"MAI_Magma\"\naddr = 0x441E82\nsize = 0xF\n\n[[func]]\nname = \"MAI_Storm\"\naddr = 0x441E91\nsize = 0xF\n\n[[func]]\nname = \"MAI_BoneDemon\"\naddr = 0x441EA0\nsize = 0xF\n\n[[func]]\nname = \"MAI_Acid\"\naddr = 0x441EAF\nsize = 0xF\n\n[[func]]\nname = \"MAI_Diablo\"\naddr = 0x441EBE\nsize = 0xF\n\n[[func]]\nname = \"MAI_RR2\"\naddr = 0x441ECD\nsize = 0x308\n\n[[func]]\nname = \"MAI_Mega\"\naddr = 0x4421D5\nsize = 0xB\n\n[[func]]\nname = \"MAI_Golum\"\naddr = 0x4421E0\nsize = 0x219\n\n[[func]]\nname = \"MAI_SkelKing\"\naddr = 0x4423F9\nsize = 0x321\n\n[[func]]\nname = \"MAI_Rhino\"\naddr = 0x44271A\nsize = 0x2EA\n\n[[func]]\nname = \"MAI_HorkDemon\"\naddr = 0x442A04\nsize = 0x2B1\n\n[[func]]\nname = \"MAI_Counselor\"\naddr = 0x442CB5\nsize = 0x36B\n\n[[func]]\nname = \"MAI_Garbud\"\naddr = 0x443020\nsize = 0x101\n\n[[func]]\nname = \"MAI_Zhar\"\naddr = 0x443121\nsize = 0x13F\n\n[[func]]\nname = \"MAI_SnotSpil\"\naddr = 0x443260\nsize = 0x14B\n\n[[func]]\nname = \"MAI_Lazurus\"\naddr = 0x4433AB\nsize = 0x170\n\n[[func]]\nname = \"MAI_Lazhelp\"\naddr = 0x44351B\nsize = 0xBA\n\n[[func]]\nname = \"MAI_Lachdanan\"\naddr = 0x4435D5\nsize = 0xDC\n\n[[func]]\nname = \"MAI_Warlord\"\naddr = 0x4436B1\nsize = 0xD8\n\n[[func]]\nname = \"DeleteMonsterList\"\naddr = 0x443789\nsize = 0x65\n\n[[func]]\nname = \"ProcessMonsters\"\naddr = 0x4437EE\nsize = 0x362\n\n[[func]]\nname = \"FreeMonsters\"\naddr = 0x443B98\nsize = 0x6A\n\n[[func]]\nname = \"DirOK\"\naddr = 0x443C02\nsize = 0x1F6\n\n[[func]]\nname = \"PosOkMissile\"\naddr = 0x443DF8\nsize = 0x26\n\n[[func]]\nname = \"CheckNoSolid\"\naddr = 0x443E1E\nsize = 0x1A\n\n[[func]]\nname = \"LineClearF\"\naddr = 0x443E38\nsize = 0x18F\n\n[[func]]\nname = \"LineClear\"\naddr = 0x443FC7\nsize = 0x1A\n\n[[func]]\nname = \"LineClearF1\"\naddr = 0x443FE1\nsize = 0x19B\n\n[[func]]\nname = \"SyncMonsterAnim\"\naddr = 0x44417C\nsize = 0x132\n\n[[func]]\nname = \"M_FallenFear\"\naddr = 0x4442F6\nsize = 0xE6\n\n[[func]]\nname = \"PrintMonstHistory\"\naddr = 0x44440C\nsize = 0x1BE\n\n[[func]]\nname = \"PrintUniqueHistory\"\naddr = 0x4445CA\nsize = 0x8C\n\n[[func]]\nname = \"MissToMonst\"\naddr = 0x444656\nsize = 0x2AB\n\n[[func]]\nname = \"PosOkMonst\"\naddr = 0x444901\nsize = 0x80\n\n[[func]]\nname = \"monster_posok\"\naddr = 0x444981\nsize = 0x11F\n\n[[func]]\nname = \"PosOkMonst2\"\naddr = 0x444AA0\nsize = 0x5F\n\n[[func]]\nname = \"PosOkMonst3\"\naddr = 0x444AFF\nsize = 0xB9\n\n[[func]]\nname = \"IsSkel\"\naddr = 0x444BB8\nsize = 0x25\n\n[[func]]\nname = \"IsGoat\"\naddr = 0x444BDD\nsize = 0x1B\n\n[[func]]\nname = \"M_SpawnSkel\"\naddr = 0x444BF8\nsize = 0xB0\n\n[[func]]\nname = \"ActivateSpawn\"\naddr = 0x444CA8\nsize = 0x51\n\n[[func]]\nname = \"SpawnSkeleton\"\naddr = 0x444CF9\nsize = 0x104\n\n[[func]]\nname = \"PreSpawnSkeleton\"\naddr = 0x444DFD\nsize = 0x9A\n\n[[func]]\nname = \"TalktoMonster\"\naddr = 0x444E97\nsize = 0xC5\n\n[[func]]\nname = \"SpawnGolum\"\naddr = 0x444F5C\nsize = 0x130\n\n[[func]]\nname = \"CanTalkToMonst\"\naddr = 0x44508C\nsize = 0x29\n\n[[func]]\nname = \"CheckMonsterHit\"\naddr = 0x4450B5\nsize = 0x63\n\n[[func]]\nname = \"encode_enemy\"\naddr = 0x445118\nsize = 0x20\n\n[[func]]\nname = \"decode_enemy\"\naddr = 0x445138\nsize = 0x6B\n\n[[func]]\nname = \"play_movie\"\naddr = 0x4451A3\nsize = 0xFB\n\n[[func]]\nname = \"MovieWndProc\"\naddr = 0x44529E\nsize = 0x54\n\n[[func]]\nname = \"mpqapi_set_hidden\"\naddr = 0x4452F2\nsize = 0x3C\n\n[[func]]\nname = \"mpqapi_store_creation_time\"\naddr = 0x44532E\nsize = 0x73\n\n[[func]]\nname = \"mpqapi_reg_load_modification_time\"\naddr = 0x4453A1\nsize = 0x56\n\n[[func]]\nname = \"mpqapi_xor_buf\"\naddr = 0x4453F7\nsize = 0x1F\n\n[[func]]\nname = \"mpqapi_reg_store_modification_time\"\naddr = 0x445416\nsize = 0x39\n\n[[func]]\nname = \"mpqapi_remove_hash_entry\"\naddr = 0x445454\nsize = 0x52\n\n[[func]]\nname = \"mpqapi_alloc_block\"\naddr = 0x4454A6\nsize = 0x90\n\n[[func]]\nname = \"mpqapi_new_block\"\naddr = 0x445536\nsize = 0x3F\n\n[[func]]\nname = \"FetchHandle\"\naddr = 0x445575\nsize = 0x30\n\n[[func]]\nname = \"mpqapi_get_hash_index\"\naddr = 0x4455A5\nsize = 0x6E\n\n[[func]]\nname = \"mpqapi_remove_hash_entries\"\naddr = 0x445613\nsize = 0x3B\n\n[[func]]\nname = \"mpqapi_write_file\"\naddr = 0x44564E\nsize = 0x45\n\n[[func]]\nname = \"mpqapi_add_file\"\naddr = 0x445693\nsize = 0xD6\n\n[[func]]\nname = \"mpqapi_write_file_contents\"\naddr = 0x445769\nsize = 0x208\n\n[[func]]\nname = \"mpqapi_find_free_block\"\naddr = 0x445971\nsize = 0x58\n\n[[func]]\nname = \"mpqapi_rename\"\naddr = 0x4459C9\nsize = 0x3F\n\n[[func]]\nname = \"mpqapi_has_file\"\naddr = 0x445A08\nsize = 0x10\n\n[[func]]\nname = \"OpenMPQ\"\naddr = 0x445A18\nsize = 0x1D2\n\n[[func]]\nname = \"ParseMPQHeader\"\naddr = 0x445BEA\nsize = 0xF1\n\n[[func]]\nname = \"CloseMPQ\"\naddr = 0x445CDB\nsize = 0x7B\n\n[[func]]\nname = \"mpqapi_store_modified_time\"\naddr = 0x445D56\nsize = 0x73\n\n[[func]]\nname = \"mpqapi_flush_and_close\"\naddr = 0x445DC9\nsize = 0x5C\n\n[[func]]\nname = \"WriteMPQHeader\"\naddr = 0x445E25\nsize = 0x96\n\n[[func]]\nname = \"mpqapi_write_block_table\"\naddr = 0x445EBB\nsize = 0x8B\n\n[[func]]\nname = \"mpqapi_write_hash_table\"\naddr = 0x445F46\nsize = 0x8E\n\n[[func]]\nname = \"mpqapi_can_seek\"\naddr = 0x445FD4\nsize = 0x2B\n\n[[func]]\nname = \"msg_send_drop_pkt\"\naddr = 0x445FFF\nsize = 0x1B\n\n[[func]]\nname = \"msg_send_packet\"\naddr = 0x44601A\nsize = 0x62\n\n[[func]]\nname = \"msg_get_next_packet\"\naddr = 0x44607C\nsize = 0x3C\n\n[[func]]\nname = \"msg_wait_resync\"\naddr = 0x4460B8\nsize = 0x80\n\n[[func]]\nname = \"msg_free_packets\"\naddr = 0x446138\nsize = 0x2C\n\n[[func]]\nname = \"msg_wait_for_turns\"\naddr = 0x446164\nsize = 0xD0\n\n[[func]]\nname = \"run_delta_info\"\naddr = 0x446234\nsize = 0x22\n\n[[func]]\nname = \"msg_pre_packet\"\naddr = 0x446256\nsize = 0x67\n\n[[func]]\nname = \"DeltaExportData\"\naddr = 0x4462BD\nsize = 0xB7\n\n[[func]]\nname = \"DeltaExportItem\"\naddr = 0x446374\nsize = 0x2B\n\n[[func]]\nname = \"DeltaExportObject\"\naddr = 0x44639F\nsize = 0x14\n\n[[func]]\nname = \"DeltaExportMonster\"\naddr = 0x4463B3\nsize = 0x27\n\n[[func]]\nname = \"DeltaExportJunk\"\naddr = 0x4463DA\nsize = 0x6C\n\n[[func]]\nname = \"msg_comp_level\"\naddr = 0x446446\nsize = 0x1E\n\n[[func]]\nname = \"delta_init\"\naddr = 0x446464\nsize = 0x4D\n\n[[func]]\nname = \"delta_kill_monster\"\naddr = 0x4464B1\nsize = 0x4B\n\n[[func]]\nname = \"delta_monster_hp\"\naddr = 0x4464FC\nsize = 0x34\n\n[[func]]\nname = \"delta_sync_monster\"\naddr = 0x446530\nsize = 0x46\n\n[[func]]\nname = \"delta_sync_golem\"\naddr = 0x446576\nsize = 0x49\n\n[[func]]\nname = \"delta_leave_sync\"\naddr = 0x4465BF\nsize = 0xDE\n\n[[func]]\nname = \"delta_portal_inited\"\naddr = 0x44669D\nsize = 0xE\n\n[[func]]\nname = \"delta_quest_inited\"\naddr = 0x4466AB\nsize = 0xE\n\n[[func]]\nname = \"DeltaAddItem\"\naddr = 0x4466B9\nsize = 0x144\n\n[[func]]\nname = \"DeltaSaveLevel\"\naddr = 0x4467FD\nsize = 0x5E\n\n[[func]]\nname = \"DeltaLoadLevel\"\naddr = 0x44685B\nsize = 0x523\n\n[[func]]\nname = \"NetSendCmd\"\naddr = 0x446D7E\nsize = 0x1E\n\n[[func]]\nname = \"NetSendCmdGolem\"\naddr = 0x446D9C\nsize = 0x36\n\n[[func]]\nname = \"NetSendCmdLoc\"\naddr = 0x446DD2\nsize = 0x2C\n\n[[func]]\nname = \"NetSendCmdLocParam1\"\naddr = 0x446DFE\nsize = 0x35\n\n[[func]]\nname = \"NetSendCmdLocParam2\"\naddr = 0x446E33\nsize = 0x3D\n\n[[func]]\nname = \"NetSendCmdLocParam3\"\naddr = 0x446E70\nsize = 0x46\n\n[[func]]\nname = \"NetSendCmdParam1\"\naddr = 0x446EB6\nsize = 0x28\n\n[[func]]\nname = \"NetSendCmdParam2\"\naddr = 0x446EDE\nsize = 0x31\n\n[[func]]\nname = \"NetSendCmdParam3\"\naddr = 0x446F0F\nsize = 0x39\n\n[[func]]\nname = \"NetSendCmdQuest\"\naddr = 0x446F48\nsize = 0x44\n\n[[func]]\nname = \"NetSendCmdGItem\"\naddr = 0x446F8C\nsize = 0x1CC\n\n[[func]]\nname = \"NetSendCmdReq2\"\naddr = 0x447158\nsize = 0x53\n\n[[func]]\nname = \"NetSendCmdExtra\"\naddr = 0x4471AB\nsize = 0x2A\n\n[[func]]\nname = \"NetSendCmdPItem\"\naddr = 0x4471D5\nsize = 0x1AD\n\n[[func]]\nname = \"NetSendCmdChItem\"\naddr = 0x447382\nsize = 0x5F\n\n[[func]]\nname = \"NetSendCmdDelItem\"\naddr = 0x4473E1\nsize = 0x22\n\n[[func]]\nname = \"NetSendCmdDItem\"\naddr = 0x447403\nsize = 0x1A9\n\n[[func]]\nname = \"NetSendCmdDamage\"\naddr = 0x4475AC\nsize = 0x2B\n\n[[func]]\nname = \"NetSendCmdMonDmg\"\naddr = 0x4475D7\nsize = 0x2C\n\n[[func]]\nname = \"NetSendCmdString\"\naddr = 0x447603\nsize = 0x39\n\n[[func]]\nname = \"delta_close_portal\"\naddr = 0x44763C\nsize = 0x1F\n\n[[func]]\nname = \"ParseCmd\"\naddr = 0x44765B\nsize = 0x395\n\n[[func]]\nname = \"On_DLEVEL\"\naddr = 0x447B88\nsize = 0xBE\n\n[[func]]\nname = \"DeltaImportData\"\naddr = 0x447C46\nsize = 0x88\n\n[[func]]\nname = \"DeltaImportItem\"\naddr = 0x447CCE\nsize = 0x48\n\n[[func]]\nname = \"DeltaImportObject\"\naddr = 0x447D16\nsize = 0x14\n\n[[func]]\nname = \"DeltaImportMonster\"\naddr = 0x447D2A\nsize = 0x44\n\n[[func]]\nname = \"DeltaImportJunk\"\naddr = 0x447D6E\nsize = 0xB9\n\n[[func]]\nname = \"On_SYNCDATA\"\naddr = 0x447E27\nsize = 0xB\n\n[[func]]\nname = \"On_WALKXY\"\naddr = 0x447E32\nsize = 0x55\n\n[[func]]\nname = \"On_ADDSTR\"\naddr = 0x447E87\nsize = 0x31\n\n[[func]]\nname = \"On_ADDMAG\"\naddr = 0x447EB8\nsize = 0x31\n\n[[func]]\nname = \"On_ADDDEX\"\naddr = 0x447EE9\nsize = 0x31\n\n[[func]]\nname = \"On_ADDVIT\"\naddr = 0x447F1A\nsize = 0x31\n\n[[func]]\nname = \"On_SBSPELL\"\naddr = 0x447F4B\nsize = 0x93\n\n[[func]]\nname = \"msg_errorf\"\naddr = 0x447FDE\nsize = 0x47\n\n[[func]]\nname = \"On_GOTOGETITEM\"\naddr = 0x448025\nsize = 0x5D\n\n[[func]]\nname = \"On_REQUESTGITEM\"\naddr = 0x448082\nsize = 0xD3\n\n[[func]]\nname = \"NetSendCmdGItem2\"\naddr = 0x448155\nsize = 0x64\n\n[[func]]\nname = \"i_own_level\"\naddr = 0x4481B9\nsize = 0x4A\n\n[[func]]\nname = \"On_GETITEM\"\naddr = 0x448203\nsize = 0x134\n\n[[func]]\nname = \"delta_get_item\"\naddr = 0x448337\nsize = 0x131\n\n[[func]]\nname = \"On_GOTOAGETITEM\"\naddr = 0x448468\nsize = 0x5D\n\n[[func]]\nname = \"On_REQUESTAGITEM\"\naddr = 0x4484C5\nsize = 0xD1\n\n[[func]]\nname = \"On_AGETITEM\"\naddr = 0x448596\nsize = 0x132\n\n[[func]]\nname = \"On_ITEMEXTRA\"\naddr = 0x4486C8\nsize = 0x5F\n\n[[func]]\nname = \"On_PUTITEM\"\naddr = 0x448727\nsize = 0x129\n\n[[func]]\nname = \"delta_put_item\"\naddr = 0x448850\nsize = 0xAC\n\n[[func]]\nname = \"check_update_plr\"\naddr = 0x4488FC\nsize = 0x1A\n\n[[func]]\nname = \"On_SYNCPUTITEM\"\naddr = 0x448916\nsize = 0x10F\n\n[[func]]\nname = \"On_RESPAWNITEM\"\naddr = 0x448A25\nsize = 0xCF\n\n[[func]]\nname = \"On_ATTACKXY\"\naddr = 0x448AF4\nsize = 0x6B\n\n[[func]]\nname = \"On_SATTACKXY\"\naddr = 0x448B5F\nsize = 0x5E\n\n[[func]]\nname = \"On_RATTACKXY\"\naddr = 0x448BBD\nsize = 0x5E\n\n[[func]]\nname = \"On_SPELLXYD\"\naddr = 0x448C1B\nsize = 0xE1\n\n[[func]]\nname = \"On_SPELLXY\"\naddr = 0x448CFC\nsize = 0xD3\n\n[[func]]\nname = \"On_TSPELLXY\"\naddr = 0x448DCF\nsize = 0xD3\n\n[[func]]\nname = \"On_OPOBJXY\"\naddr = 0x448EA2\nsize = 0x7B\n\n[[func]]\nname = \"On_DISARMXY\"\naddr = 0x448F1D\nsize = 0x7B\n\n[[func]]\nname = \"On_OPOBJT\"\naddr = 0x448F98\nsize = 0x40\n\n[[func]]\nname = \"On_ATTACKID\"\naddr = 0x448FD8\nsize = 0xBD\n\n[[func]]\nname = \"On_ATTACKPID\"\naddr = 0x449095\nsize = 0x68\n\n[[func]]\nname = \"On_RATTACKID\"\naddr = 0x4490FD\nsize = 0x50\n\n[[func]]\nname = \"On_RATTACKPID\"\naddr = 0x44914D\nsize = 0x50\n\n[[func]]\nname = \"On_SPELLID\"\naddr = 0x44919D\nsize = 0xC5\n\n[[func]]\nname = \"On_SPELLPID\"\naddr = 0x449262\nsize = 0xC5\n\n[[func]]\nname = \"On_TSPELLID\"\naddr = 0x449327\nsize = 0xC5\n\n[[func]]\nname = \"On_TSPELLPID\"\naddr = 0x4493EC\nsize = 0xC5\n\n[[func]]\nname = \"On_KNOCKBACK\"\naddr = 0x4494B1\nsize = 0x46\n\n[[func]]\nname = \"On_RESURRECT\"\naddr = 0x4494F7\nsize = 0x30\n\n[[func]]\nname = \"On_HEALOTHER\"\naddr = 0x449527\nsize = 0x37\n\n[[func]]\nname = \"On_TALKXY\"\naddr = 0x44955E\nsize = 0x5D\n\n[[func]]\nname = \"On_NEWLVL\"\naddr = 0x4495BB\nsize = 0x34\n\n[[func]]\nname = \"On_WARP\"\naddr = 0x4495EF\nsize = 0x66\n\n[[func]]\nname = \"On_MONSTDEATH\"\naddr = 0x449655\nsize = 0x72\n\n[[func]]\nname = \"On_KILLGOLEM\"\naddr = 0x4496C7\nsize = 0x6A\n\n[[func]]\nname = \"On_AWAKEGOLEM\"\naddr = 0x449731\nsize = 0xB4\n\n[[func]]\nname = \"On_MONSTDAMAGE\"\naddr = 0x4497E5\nsize = 0xC1\n\n[[func]]\nname = \"On_PLRDEAD\"\naddr = 0x4498A6\nsize = 0x38\n\n[[func]]\nname = \"On_PLRDAMAGE\"\naddr = 0x4498DE\nsize = 0x115\n\n[[func]]\nname = \"On_OPENDOOR\"\naddr = 0x4499F3\nsize = 0x61\n\n[[func]]\nname = \"delta_sync_object\"\naddr = 0x449A54\nsize = 0x25\n\n[[func]]\nname = \"On_CLOSEDOOR\"\naddr = 0x449A79\nsize = 0x61\n\n[[func]]\nname = \"On_OPERATEOBJ\"\naddr = 0x449ADA\nsize = 0x61\n\n[[func]]\nname = \"On_PLROPOBJ\"\naddr = 0x449B3B\nsize = 0x61\n\n[[func]]\nname = \"On_BREAKOBJ\"\naddr = 0x449B9C\nsize = 0x5D\n\n[[func]]\nname = \"On_CHANGEPLRITEMS\"\naddr = 0x449BF9\nsize = 0x40\n\n[[func]]\nname = \"On_DELPLRITEMS\"\naddr = 0x449C39\nsize = 0x2E\n\n[[func]]\nname = \"On_PLRLEVEL\"\naddr = 0x449C67\nsize = 0x41\n\n[[func]]\nname = \"On_DROPITEM\"\naddr = 0x449CA8\nsize = 0x3B\n\n[[func]]\nname = \"On_SEND_PLRINFO\"\naddr = 0x449CE3\nsize = 0x3C\n\n[[func]]\nname = \"On_ACK_PLRINFO\"\naddr = 0x449D1F\nsize = 0x5\n\n[[func]]\nname = \"On_PLAYER_JOINLEVEL\"\naddr = 0x449D24\nsize = 0x1D8\n\n[[func]]\nname = \"On_ACTIVATEPORTAL\"\naddr = 0x449EFC\nsize = 0xDF\n\n[[func]]\nname = \"delta_open_portal\"\naddr = 0x449FDB\nsize = 0x3B\n\n[[func]]\nname = \"On_DEACTIVATEPORTAL\"\naddr = 0x44A016\nsize = 0x3E\n\n[[func]]\nname = \"On_RETOWN\"\naddr = 0x44A054\nsize = 0x39\n\n[[func]]\nname = \"On_SETSTR\"\naddr = 0x44A08D\nsize = 0x39\n\n[[func]]\nname = \"On_SETDEX\"\naddr = 0x44A0C6\nsize = 0x39\n\n[[func]]\nname = \"On_SETMAG\"\naddr = 0x44A0FF\nsize = 0x39\n\n[[func]]\nname = \"On_SETVIT\"\naddr = 0x44A138\nsize = 0x39\n\n[[func]]\nname = \"On_STRING\"\naddr = 0x44A171\nsize = 0xB\n\n[[func]]\nname = \"On_STRING2\"\naddr = 0x44A17C\nsize = 0x2A\n\n[[func]]\nname = \"On_SYNCQUEST\"\naddr = 0x44A1A6\nsize = 0x42\n\n[[func]]\nname = \"On_ENDSHIELD\"\naddr = 0x44A1E8\nsize = 0x87\n\n[[func]]\nname = \"On_ENDREFLECT\"\naddr = 0x44A26F\nsize = 0x87\n\n[[func]]\nname = \"On_DEBUG\"\naddr = 0x44A2F6\nsize = 0x4\n\n[[func]]\nname = \"On_CHEAT_EXPERIENCE\"\naddr = 0x44A2F6\nsize = 0x4\n\n[[func]]\nname = \"On_CHEAT_SPELL_LEVEL\"\naddr = 0x44A2F6\nsize = 0x4\n\n[[func]]\nname = \"On_NAKRUL\"\naddr = 0x44A2FA\nsize = 0x28\n\n[[func]]\nname = \"On_OPENHIVE\"\naddr = 0x44A322\nsize = 0x32\n\n[[func]]\nname = \"On_OPENCRYPT\"\naddr = 0x44A354\nsize = 0x28\n\n[[func]]\nname = \"multi_msg_add\"\naddr = 0x44A37C\nsize = 0xE\n\n[[func]]\nname = \"NetSendLoPri\"\naddr = 0x44A38A\nsize = 0x2E\n\n[[func]]\nname = \"multi_copy_packet\"\naddr = 0x44A3B8\nsize = 0x42\n\n[[func]]\nname = \"multi_send_packet\"\naddr = 0x44A3FA\nsize = 0x68\n\n[[func]]\nname = \"NetRecvPlrData\"\naddr = 0x44A462\nsize = 0xED\n\n[[func]]\nname = \"NetSendHiPri\"\naddr = 0x44A54F\nsize = 0xBA\n\n[[func]]\nname = \"multi_recv_packet\"\naddr = 0x44A609\nsize = 0x69\n\n[[func]]\nname = \"multi_send_msg_packet\"\naddr = 0x44A672\nsize = 0x81\n\n[[func]]\nname = \"multi_msg_countdown\"\naddr = 0x44A6F3\nsize = 0x37\n\n[[func]]\nname = \"multi_parse_turn\"\naddr = 0x44A72A\nsize = 0x4D\n\n[[func]]\nname = \"multi_handle_turn_upper_bit\"\naddr = 0x44A777\nsize = 0x39\n\n[[func]]\nname = \"multi_player_left\"\naddr = 0x44A7B0\nsize = 0x13\n\n[[func]]\nname = \"multi_clear_left_tbl\"\naddr = 0x44A7C3\nsize = 0x49\n\n[[func]]\nname = \"multi_player_left_msg\"\naddr = 0x44A80C\nsize = 0xA6\n\n[[func]]\nname = \"multi_net_ping\"\naddr = 0x44A8B2\nsize = 0x13\n\n[[func]]\nname = \"multi_handle_delta\"\naddr = 0x44A8C5\nsize = 0xAC\n\n[[func]]\nname = \"multi_check_pkt_valid\"\naddr = 0x44A971\nsize = 0x8\n\n[[func]]\nname = \"multi_mon_seeds\"\naddr = 0x44A979\nsize = 0x33\n\n[[func]]\nname = \"multi_begin_timeout\"\naddr = 0x44A9AC\nsize = 0xA8\n\n[[func]]\nname = \"multi_check_drop_player\"\naddr = 0x44AA54\nsize = 0x33\n\n[[func]]\nname = \"multi_process_network_packets\"\naddr = 0x44AA87\nsize = 0x3AE\n\n[[func]]\nname = \"multi_handle_all_packets\"\naddr = 0x44AE35\nsize = 0x27\n\n[[func]]\nname = \"multi_process_tmsgs\"\naddr = 0x44AE5C\nsize = 0x33\n\n[[func]]\nname = \"multi_send_zero_packet\"\naddr = 0x44AE8F\nsize = 0xE4\n\n[[func]]\nname = \"NetClose\"\naddr = 0x44AF73\nsize = 0x42\n\n[[func]]\nname = \"multi_event_handler\"\naddr = 0x44AFB5\nsize = 0x4A\n\n[[func]]\nname = \"multi_handle_events\"\naddr = 0x44AFFF\nsize = 0xA8\n\n[[func]]\nname = \"NetInit\"\naddr = 0x44B0A7\nsize = 0x446\n\n[[func]]\nname = \"buffer_init\"\naddr = 0x44B4ED\nsize = 0x8\n\n[[func]]\nname = \"multi_send_pinfo\"\naddr = 0x44B4F5\nsize = 0x39\n\n[[func]]\nname = \"InitLevelType\"\naddr = 0x44B52E\nsize = 0x52\n\n[[func]]\nname = \"SetupLocalCoords\"\naddr = 0x44B580\nsize = 0x13D\n\n[[func]]\nname = \"multi_upgrade\"\naddr = 0x44B6BD\nsize = 0x3C\n\n[[func]]\nname = \"recv_plrinfo\"\naddr = 0x44B6F9\nsize = 0x1D5\n\n[[func]]\nname = \"nthread_terminate_game\"\naddr = 0x44B8FC\nsize = 0x3D\n\n[[func]]\nname = \"nthread_send_and_recv_turn\"\naddr = 0x44B939\nsize = 0x85\n\n[[func]]\nname = \"nthread_recv_turns\"\naddr = 0x44B9BE\nsize = 0xAD\n\n[[func]]\nname = \"nthread_set_turn_upper_bit\"\naddr = 0x44BA6B\nsize = 0xB\n\n[[func]]\nname = \"nthread_start\"\naddr = 0x44BA76\nsize = 0x16D\n\n[[func]]\nname = \"nthread_handler\"\naddr = 0x44BBE3\nsize = 0x76\n\n[[func]]\nname = \"nthread_cleanup\"\naddr = 0x44BC59\nsize = 0x7F\n\n[[func]]\nname = \"nthread_ignore_mutex\"\naddr = 0x44BCD8\nsize = 0x2B\n\n[[func]]\nname = \"nthread_has_500ms_passed\"\naddr = 0x44BD03\nsize = 0x2E\n\n[[func]]\nname = \"InitObjectGFX\"\naddr = 0x44BD31\nsize = 0x17A\n\n[[func]]\nname = \"FreeObjectGFX\"\naddr = 0x44BEAB\nsize = 0x31\n\n[[func]]\nname = \"InitRndLocObj\"\naddr = 0x44BEDC\nsize = 0xF0\n\n[[func]]\nname = \"RndLocOk\"\naddr = 0x44BFCC\nsize = 0x56\n\n[[func]]\nname = \"AddL1Objs\"\naddr = 0x44C022\nsize = 0x98\n\n[[func]]\nname = \"add_crypt_objs\"\naddr = 0x44C0BA\nsize = 0x6E\n\n[[func]]\nname = \"AddL2Objs\"\naddr = 0x44C128\nsize = 0x7E\n\n[[func]]\nname = \"InitObjects\"\naddr = 0x44C1A6\nsize = 0x461\n\n[[func]]\nname = \"InitRndLocBigObj\"\naddr = 0x44C607\nsize = 0x129\n\n[[func]]\nname = \"InitRndLocObj5x5\"\naddr = 0x44C730\nsize = 0xB2\n\n[[func]]\nname = \"ClrAllObjects\"\naddr = 0x44C7E2\nsize = 0x58\n\n[[func]]\nname = \"AddTortures\"\naddr = 0x44C83A\nsize = 0xF7\n\n[[func]]\nname = \"AddCandles\"\naddr = 0x44C931\nsize = 0x49\n\n[[func]]\nname = \"AddBookLever\"\naddr = 0x44C97A\nsize = 0x11E\n\n[[func]]\nname = \"InitRndBarrels\"\naddr = 0x44CA98\nsize = 0xFE\n\n[[func]]\nname = \"AddL3Objs\"\naddr = 0x44CB96\nsize = 0x74\n\n[[func]]\nname = \"AddL2Torches\"\naddr = 0x44CC0A\nsize = 0xED\n\n[[func]]\nname = \"WallTrapLocOk\"\naddr = 0x44CCF7\nsize = 0x12\n\n[[func]]\nname = \"AddObjTraps\"\naddr = 0x44CD09\nsize = 0x18E\n\n[[func]]\nname = \"TorchLocOK\"\naddr = 0x44CE97\nsize = 0x24\n\n[[func]]\nname = \"AddChestTraps\"\naddr = 0x44CEBB\nsize = 0x94\n\n[[func]]\nname = \"LoadMapObjs\"\naddr = 0x44CF4F\nsize = 0x87\n\n[[func]]\nname = \"AddDiabObjs\"\naddr = 0x44CFD6\nsize = 0xBD\n\n[[func]]\nname = \"LoadMapObjects\"\naddr = 0x44D093\nsize = 0xD8\n\n[[func]]\nname = \"AddCryptStoryBook\"\naddr = 0x44D16B\nsize = 0xDE\n\n[[func]]\nname = \"AddStoryBooks\"\naddr = 0x44D249\nsize = 0xD9\n\n[[func]]\nname = \"AddL4Goodies\"\naddr = 0x44D322\nsize = 0x77\n\n[[func]]\nname = \"AddHookedBodies\"\naddr = 0x44D399\nsize = 0xD8\n\n[[func]]\nname = \"AddLazStand\"\naddr = 0x44D471\nsize = 0x109\n\n[[func]]\nname = \"SetMapObjects\"\naddr = 0x44D57A\nsize = 0x168\n\n[[func]]\nname = \"SetObjMapRange\"\naddr = 0x44D6E2\nsize = 0x34\n\n[[func]]\nname = \"SetBookMsg\"\naddr = 0x44D716\nsize = 0xA\n\n[[func]]\nname = \"AddVilebook\"\naddr = 0x44D720\nsize = 0x20\n\n[[func]]\nname = \"AddMagicCircle\"\naddr = 0x44D740\nsize = 0x29\n\n[[func]]\nname = \"AddBrnCross\"\naddr = 0x44D769\nsize = 0x13\n\n[[func]]\nname = \"AddPedistal\"\naddr = 0x44D77C\nsize = 0x38\n\n[[func]]\nname = \"AddMushPatch\"\naddr = 0x44D7B4\nsize = 0x5C\n\n[[func]]\nname = \"GetRndObjLoc\"\naddr = 0x44D810\nsize = 0x8A\n\n[[func]]\nname = \"AddSlainHero\"\naddr = 0x44D89A\nsize = 0x2B\n\n[[func]]\nname = \"AddCryptBook\"\naddr = 0x44D8C5\nsize = 0x81\n\n[[func]]\nname = \"SetupObject\"\naddr = 0x44D946\nsize = 0x122\n\n[[func]]\nname = \"AddCryptObject\"\naddr = 0x44DA68\nsize = 0x20D\n\n[[func]]\nname = \"AddObject\"\naddr = 0x44DC75\nsize = 0x24E\n\n[[func]]\nname = \"AddL1Door\"\naddr = 0x44DF7B\nsize = 0x5F\n\n[[func]]\nname = \"AddSCambBook\"\naddr = 0x44DFDA\nsize = 0x49\n\n[[func]]\nname = \"AddChest\"\naddr = 0x44E023\nsize = 0xB6\n\n[[func]]\nname = \"AddL2Door\"\naddr = 0x44E0D9\nsize = 0x3B\n\n[[func]]\nname = \"AddL3Door\"\naddr = 0x44E114\nsize = 0x3B\n\n[[func]]\nname = \"AddSarc\"\naddr = 0x44E14F\nsize = 0x51\n\n[[func]]\nname = \"AddFlameTrap\"\naddr = 0x44E1A0\nsize = 0x28\n\n[[func]]\nname = \"AddFlameLvr\"\naddr = 0x44E1C8\nsize = 0x19\n\n[[func]]\nname = \"AddTrap\"\naddr = 0x44E1E1\nsize = 0x7E\n\n[[func]]\nname = \"AddObjLight\"\naddr = 0x44E25F\nsize = 0x37\n\n[[func]]\nname = \"AddBarrel\"\naddr = 0x44E296\nsize = 0x4E\n\n[[func]]\nname = \"AddShrine\"\naddr = 0x44E2E4\nsize = 0xB0\n\n[[func]]\nname = \"AddBookcase\"\naddr = 0x44E394\nsize = 0x1D\n\n[[func]]\nname = \"AddBookstand\"\naddr = 0x44E3B1\nsize = 0x13\n\n[[func]]\nname = \"AddArmorStand\"\naddr = 0x44E3C4\nsize = 0x32\n\n[[func]]\nname = \"AddPurifyingFountain\"\naddr = 0x44E3F6\nsize = 0x39\n\n[[func]]\nname = \"AddDecap\"\naddr = 0x44E42F\nsize = 0x2E\n\n[[func]]\nname = \"AddStoryBook\"\naddr = 0x44E45D\nsize = 0x95\n\n[[func]]\nname = \"AddWeaponRack\"\naddr = 0x44E4F2\nsize = 0x32\n\n[[func]]\nname = \"AddTorturedBody\"\naddr = 0x44E524\nsize = 0x2E\n\n[[func]]\nname = \"Obj_Light\"\naddr = 0x44E552\nsize = 0xF0\n\n[[func]]\nname = \"Obj_Circle\"\naddr = 0x44E642\nsize = 0x17A\n\n[[func]]\nname = \"Obj_StopAnim\"\naddr = 0x44E7BC\nsize = 0x23\n\n[[func]]\nname = \"Obj_Door\"\naddr = 0x44E7DF\nsize = 0x91\n\n[[func]]\nname = \"Obj_Sarc\"\naddr = 0x44E870\nsize = 0x19\n\n[[func]]\nname = \"ActivateTrapLine\"\naddr = 0x44E889\nsize = 0x7F\n\n[[func]]\nname = \"Obj_FlameTrap\"\naddr = 0x44E908\nsize = 0x12B\n\n[[func]]\nname = \"Obj_Trap\"\naddr = 0x44EA33\nsize = 0x15D\n\n[[func]]\nname = \"ProcessObjects\"\naddr = 0x44EB90\nsize = 0x1BF\n\n[[func]]\nname = \"DeleteObject_\"\naddr = 0x44ED4F\nsize = 0x50\n\n[[func]]\nname = \"Obj_BCrossDamage\"\naddr = 0x44ED9F\nsize = 0x15C\n\n[[func]]\nname = \"ObjSetMicro\"\naddr = 0x44EEFB\nsize = 0x83\n\n[[func]]\nname = \"RedoPlayerVision\"\naddr = 0x44EF7E\nsize = 0x3D\n\n[[func]]\nname = \"OperateL1RDoor\"\naddr = 0x44EFBB\nsize = 0x260\n\n[[func]]\nname = \"objects_set_door_piece\"\naddr = 0x44F21B\nsize = 0x78\n\n[[func]]\nname = \"DoorSet\"\naddr = 0x44F293\nsize = 0x2B7\n\n[[func]]\nname = \"OperateL1LDoor\"\naddr = 0x44F54A\nsize = 0x275\n\n[[func]]\nname = \"OperateL2LDoor\"\naddr = 0x44F7BF\nsize = 0x175\n\n[[func]]\nname = \"MonstCheckDoors\"\naddr = 0x44F934\nsize = 0x230\n\n[[func]]\nname = \"OperateL2RDoor\"\naddr = 0x44FB64\nsize = 0x175\n\n[[func]]\nname = \"OperateL3RDoor\"\naddr = 0x44FCD9\nsize = 0x178\n\n[[func]]\nname = \"OperateL3LDoor\"\naddr = 0x44FE51\nsize = 0x178\n\n[[func]]\nname = \"ObjChangeMap\"\naddr = 0x44FFC9\nsize = 0xEA\n\n[[func]]\nname = \"ObjSetMini\"\naddr = 0x4500B3\nsize = 0x78\n\n[[func]]\nname = \"ObjL1Special\"\naddr = 0x45012B\nsize = 0xEC\n\n[[func]]\nname = \"ObjL2Special\"\naddr = 0x450217\nsize = 0xFC\n\n[[func]]\nname = \"ObjChangeMapResync\"\naddr = 0x450313\nsize = 0xBE\n\n[[func]]\nname = \"TryDisarm\"\naddr = 0x4503D1\nsize = 0xC9\n\n[[func]]\nname = \"ItemMiscIdIdx\"\naddr = 0x45049A\nsize = 0x18\n\n[[func]]\nname = \"OperateObject\"\naddr = 0x4504B2\nsize = 0x2C0\n\n[[func]]\nname = \"OperateL1Door\"\naddr = 0x4507F7\nsize = 0x97\n\n[[func]]\nname = \"OperateLever\"\naddr = 0x45088E\nsize = 0xF4\n\n[[func]]\nname = \"OperateBook\"\naddr = 0x450982\nsize = 0x260\n\n[[func]]\nname = \"OperateBookLever\"\naddr = 0x450BE2\nsize = 0x1B2\n\n[[func]]\nname = \"OperateSChambBk\"\naddr = 0x450D94\nsize = 0x100\n\n[[func]]\nname = \"OperateChest\"\naddr = 0x450E94\nsize = 0x1AD\n\n[[func]]\nname = \"OperateMushPatch\"\naddr = 0x451041\nsize = 0xF7\n\n[[func]]\nname = \"OperateInnSignChest\"\naddr = 0x451138\nsize = 0xE4\n\n[[func]]\nname = \"OperateSlainHero\"\naddr = 0x45121C\nsize = 0x18A\n\n[[func]]\nname = \"OperateTrapLvr\"\naddr = 0x4513A6\nsize = 0xBF\n\n[[func]]\nname = \"OperateSarc\"\naddr = 0x451465\nsize = 0xD7\n\n[[func]]\nname = \"OperateL2Door\"\naddr = 0x45153C\nsize = 0x9A\n\n[[func]]\nname = \"OperateL3Door\"\naddr = 0x4515D6\nsize = 0x98\n\n[[func]]\nname = \"OperatePedistal\"\naddr = 0x45166E\nsize = 0x166\n\n[[func]]\nname = \"OperateShrine\"\naddr = 0x4517D4\nsize = 0x189F\n\n[[func]]\nname = \"OperateSkelBook\"\naddr = 0x4530FB\nsize = 0xA0\n\n[[func]]\nname = \"OperateBookCase\"\naddr = 0x45319B\nsize = 0xE2\n\n[[func]]\nname = \"OperateDecap\"\naddr = 0x45327D\nsize = 0x64\n\n[[func]]\nname = \"OperateArmorStand\"\naddr = 0x4532E1\nsize = 0xD7\n\n[[func]]\nname = \"OperateGoatShrine\"\naddr = 0x4533B8\nsize = 0x4B\n\n[[func]]\nname = \"FindValidShrine\"\naddr = 0x453403\nsize = 0x63\n\n[[func]]\nname = \"OperateCauldron\"\naddr = 0x453466\nsize = 0x52\n\n[[func]]\nname = \"OperateFountains\"\naddr = 0x4534B8\nsize = 0x30D\n\n[[func]]\nname = \"OperateWeaponRack\"\naddr = 0x4537C5\nsize = 0xAC\n\n[[func]]\nname = \"OperateStoryBook\"\naddr = 0x453871\nsize = 0xCD\n\n[[func]]\nname = \"OperateLazStand\"\naddr = 0x45393E\nsize = 0x65\n\n[[func]]\nname = \"SyncOpObject\"\naddr = 0x4539A3\nsize = 0x1D5\n\n[[func]]\nname = \"SyncOpL1Door\"\naddr = 0x453B78\nsize = 0x74\n\n[[func]]\nname = \"SyncOpL2Door\"\naddr = 0x453BEC\nsize = 0x74\n\n[[func]]\nname = \"SyncOpL3Door\"\naddr = 0x453C60\nsize = 0x74\n\n[[func]]\nname = \"BreakObject\"\naddr = 0x453CD4\nsize = 0xA3\n\n[[func]]\nname = \"BreakCrux\"\naddr = 0x453D77\nsize = 0xC3\n\n[[func]]\nname = \"BreakBarrel\"\naddr = 0x453E3A\nsize = 0x2DE\n\n[[func]]\nname = \"SyncBreakObj\"\naddr = 0x454118\nsize = 0x21\n\n[[func]]\nname = \"SyncObjectAnim\"\naddr = 0x454139\nsize = 0xC2\n\n[[func]]\nname = \"SyncL1Doors\"\naddr = 0x4541FB\nsize = 0x106\n\n[[func]]\nname = \"SyncCrux\"\naddr = 0x454301\nsize = 0x7D\n\n[[func]]\nname = \"SyncLever\"\naddr = 0x45437E\nsize = 0x2A\n\n[[func]]\nname = \"SyncQSTLever\"\naddr = 0x4543A8\nsize = 0x6F\n\n[[func]]\nname = \"SyncPedistal\"\naddr = 0x454417\nsize = 0xC5\n\n[[func]]\nname = \"SyncL2Doors\"\naddr = 0x4544DC\nsize = 0x9D\n\n[[func]]\nname = \"SyncL3Doors\"\naddr = 0x454579\nsize = 0x92\n\n[[func]]\nname = \"GetObjectStr\"\naddr = 0x45460B\nsize = 0x293\n\n[[func]]\nname = \"AddNakrulGate\"\naddr = 0x454963\nsize = 0x18D\n\n[[func]]\nname = \"AddNakrulBook\"\naddr = 0x454AF0\nsize = 0x14\n\n[[func]]\nname = \"OperateNakrulBook\"\naddr = 0x454B04\nsize = 0x42\n\n[[func]]\nname = \"OperateNakrulLever\"\naddr = 0x454B46\nsize = 0x62\n\n[[func]]\nname = \"SyncNakrulRoom\"\naddr = 0x454BA8\nsize = 0x42\n\n[[func]]\nname = \"AddNakrulLeaver\"\naddr = 0x454BEA\nsize = 0xD5\n\n[[func]]\nname = \"PackItem\"\naddr = 0x454CBF\nsize = 0x110\n\n[[func]]\nname = \"PackPlayer\"\naddr = 0x454DCF\nsize = 0x207\n\n[[func]]\nname = \"UnPackItem\"\naddr = 0x454FD6\nsize = 0xAD\n\n[[func]]\nname = \"VerifyGoldSeeds\"\naddr = 0x455083\nsize = 0x6F\n\n[[func]]\nname = \"UnPackPlayer\"\naddr = 0x4550F2\nsize = 0x2A4\n\n[[func]]\nname = \"SaveGamma\"\naddr = 0x455396\nsize = 0x18\n\n[[func]]\nname = \"palette_init\"\naddr = 0x4553AE\nsize = 0x78\n\n[[func]]\nname = \"LoadGamma\"\naddr = 0x455426\nsize = 0x52\n\n[[func]]\nname = \"LoadSysPal\"\naddr = 0x455478\nsize = 0xB3\n\n[[func]]\nname = \"LoadPalette\"\naddr = 0x45552B\nsize = 0x5C\n\n[[func]]\nname = \"LoadRndLvlPal\"\naddr = 0x455587\nsize = 0x90\n\n[[func]]\nname = \"ResetPal\"\naddr = 0x455617\nsize = 0x2B\n\n[[func]]\nname = \"IncreaseGamma\"\naddr = 0x455642\nsize = 0x39\n\n[[func]]\nname = \"palette_update\"\naddr = 0x45567B\nsize = 0x3B\n\n[[func]]\nname = \"ApplyGamma\"\naddr = 0x4556B6\nsize = 0xD1\n\n[[func]]\nname = \"DecreaseGamma\"\naddr = 0x455787\nsize = 0x39\n\n[[func]]\nname = \"UpdateGamma\"\naddr = 0x4557C0\nsize = 0x35\n\n[[func]]\nname = \"BlackPalette\"\naddr = 0x4557F5\nsize = 0x7\n\n[[func]]\nname = \"SetFadeLevel\"\naddr = 0x4557FC\nsize = 0x6B\n\n[[func]]\nname = \"PaletteFadeIn\"\naddr = 0x455867\nsize = 0x56\n\n[[func]]\nname = \"PaletteFadeOut\"\naddr = 0x4558BD\nsize = 0x30\n\n[[func]]\nname = \"palette_update_caves\"\naddr = 0x4558ED\nsize = 0x4C\n\n[[func]]\nname = \"palette_update_crypt\"\naddr = 0x455939\nsize = 0xCE\n\n[[func]]\nname = \"palette_update_hive\"\naddr = 0x455A07\nsize = 0xCB\n\n[[func]]\nname = \"palette_update_quest_palette\"\naddr = 0x455AD2\nsize = 0x2E\n\n[[func]]\nname = \"FindPath\"\naddr = 0x455B00\nsize = 0x110\n\n[[func]]\nname = \"path_get_h_cost\"\naddr = 0x455C10\nsize = 0x33\n\n[[func]]\nname = \"path_check_equal\"\naddr = 0x455C43\nsize = 0x18\n\n[[func]]\nname = \"GetNextPath\"\naddr = 0x455C5B\nsize = 0x2A\n\n[[func]]\nname = \"path_solid_pieces\"\naddr = 0x455C85\nsize = 0xA7\n\n[[func]]\nname = \"path_get_path\"\naddr = 0x455D2C\nsize = 0x89\n\n[[func]]\nname = \"path_parent_path\"\naddr = 0x455DB5\nsize = 0x12B\n\n[[func]]\nname = \"path_get_node1\"\naddr = 0x455EE0\nsize = 0x1A\n\n[[func]]\nname = \"path_get_node2\"\naddr = 0x455EFA\nsize = 0x1A\n\n[[func]]\nname = \"path_next_node\"\naddr = 0x455F14\nsize = 0x31\n\n[[func]]\nname = \"path_set_coords\"\naddr = 0x455F45\nsize = 0x93\n\n[[func]]\nname = \"path_push_active_step\"\naddr = 0x455FD8\nsize = 0x13\n\n[[func]]\nname = \"path_pop_active_step\"\naddr = 0x455FEB\nsize = 0x13\n\n[[func]]\nname = \"path_new_step\"\naddr = 0x455FFE\nsize = 0x36\n\n[[func]]\nname = \"pfile_init_save_directory\"\naddr = 0x456034\nsize = 0x5F\n\n[[func]]\nname = \"pfile_check_available_space\"\naddr = 0x456093\nsize = 0x77\n\n[[func]]\nname = \"pfile_write_hero\"\naddr = 0x45610A\nsize = 0x69\n\n[[func]]\nname = \"pfile_get_save_num_from_name\"\naddr = 0x456173\nsize = 0x2B\n\n[[func]]\nname = \"pfile_encode_hero\"\naddr = 0x45619E\nsize = 0x89\n\n[[func]]\nname = \"pfile_open_archive\"\naddr = 0x456227\nsize = 0x5D\n\n[[func]]\nname = \"pfile_get_save_path\"\naddr = 0x456284\nsize = 0xAB\n\n[[func]]\nname = \"pfile_flush\"\naddr = 0x45632F\nsize = 0x34\n\n[[func]]\nname = \"pfile_flush_W\"\naddr = 0x456363\nsize = 0x27\n\n[[func]]\nname = \"game_2_ui_player\"\naddr = 0x45638A\nsize = 0x90\n\n[[func]]\nname = \"game_2_ui_class\"\naddr = 0x45641A\nsize = 0x26\n\n[[func]]\nname = \"pfile_ui_set_hero_infos\"\naddr = 0x456440\nsize = 0xA4\n\n[[func]]\nname = \"pfile_read_hero\"\naddr = 0x4564E4\nsize = 0xD1\n\n[[func]]\nname = \"pfile_update\"\naddr = 0x456DAF\nsize = 0x32\n\n[[func]]\nname = \"pfile_open_save_archive\"\naddr = 0x4565B5\nsize = 0x3C\n\n[[func]]\nname = \"pfile_SFileCloseArchive\"\naddr = 0x4565F1\nsize = 0x7\n\n[[func]]\nname = \"pfile_archive_contains_game\"\naddr = 0x4565F8\nsize = 0x10C\n\n[[func]]\nname = \"pfile_ui_set_class_stats\"\naddr = 0x456704\nsize = 0x44\n\n[[func]]\nname = \"pfile_get_player_class\"\naddr = 0x456748\nsize = 0x2A\n\n[[func]]\nname = \"pfile_ui_save_create\"\naddr = 0x456772\nsize = 0xEB\n\n[[func]]\nname = \"pfile_get_file_name\"\naddr = 0x45685d\nsize = 0x57\n\n[[func]]\nname = \"pfile_delete_save\"\naddr = 0x4568B4\nsize = 0x4C\n\n[[func]]\nname = \"pfile_read_player_from_save\"\naddr = 0x456900\nsize = 0x79\n\n[[func]]\nname = \"GetTempLevelNames\"\naddr = 0x456979\nsize = 0x50\n\n[[func]]\nname = \"GetPermLevelNames\"\naddr = 0x4569C9\nsize = 0x8B\n\n[[func]]\nname = \"pfile_get_game_name\"\naddr = 0x456A54\nsize = 0x2F\n\n[[func]]\nname = \"pfile_remove_temp_files\"\naddr = 0x456A83\nsize = 0x57\n\n[[func]]\nname = \"GetTempSaveNames\"\naddr = 0x456ADA\nsize = 0x35\n\n[[func]]\nname = \"pfile_rename_temp_to_perm\"\naddr = 0x456B0F\nsize = 0xB2\n\n[[func]]\nname = \"GetPermSaveNames\"\naddr = 0x456BC1\nsize = 0x35\n\n[[func]]\nname = \"pfile_write_save_file\"\naddr = 0x456BF6\nsize = 0xA9\n\n[[func]]\nname = \"pfile_read\"\naddr = 0x456C9F\nsize = 0x110\n\n[[func]]\nname = \"SetPlayerGPtrs\"\naddr = 0x456DE1\nsize = 0x1B\n\n[[func]]\nname = \"LoadPlrGFX\"\naddr = 0x456DFC\nsize = 0x2C4\n\n[[func]]\nname = \"InitPlayerGFX\"\naddr = 0x4570C0\nsize = 0x4A\n\n[[func]]\nname = \"InitPlrGFXMem\"\naddr = 0x45710A\nsize = 0x35A\n\n[[func]]\nname = \"GetPlrGFXSize\"\naddr = 0x457464\nsize = 0x12A\n\n[[func]]\nname = \"FreePlayerGFX\"\naddr = 0x45758E\nsize = 0x117\n\n[[func]]\nname = \"NewPlrAnim\"\naddr = 0x4576A5\nsize = 0x93\n\n[[func]]\nname = \"ClearPlrPVars\"\naddr = 0x457738\nsize = 0x89\n\n[[func]]\nname = \"SetPlrAnims\"\naddr = 0x4577C1\nsize = 0x497\n\n[[func]]\nname = \"ClearPlrRVars\"\naddr = 0x457C58\nsize = 0x6A\n\n[[func]]\nname = \"CreatePlayer\"\naddr = 0x457CC2\nsize = 0x5DD\n\n[[func]]\nname = \"CalcStatDiff\"\naddr = 0x45829F\nsize = 0x48\n\n[[func]]\nname = \"NextPlrLevel\"\naddr = 0x4582E7\nsize = 0x1AB\n\n[[func]]\nname = \"AddPlrExperience\"\naddr = 0x458492\nsize = 0x16C\n\n[[func]]\nname = \"AddPlrMonstExper\"\naddr = 0x4585FE\nsize = 0x44\n\n[[func]]\nname = \"InitPlayer\"\naddr = 0x458642\nsize = 0x400\n\n[[func]]\nname = \"InitMultiView\"\naddr = 0x458A42\nsize = 0x3C\n\n[[func]]\nname = \"CheckEFlag\"\naddr = 0x458A7E\nsize = 0x15D\n\n[[func]]\nname = \"SolidLoc\"\naddr = 0x458BDB\nsize = 0x14\n\n[[func]]\nname = \"PlrDirOK\"\naddr = 0x458BEF\nsize = 0xC1\n\n[[func]]\nname = \"PlrClrTrans\"\naddr = 0x458CB0\nsize = 0x43\n\n[[func]]\nname = \"PlrDoTrans\"\naddr = 0x458CF3\nsize = 0x81\n\n[[func]]\nname = \"SetPlayerOld\"\naddr = 0x458D74\nsize = 0x3C\n\n[[func]]\nname = \"FixPlayerLocation\"\naddr = 0x458DB0\nsize = 0xB4\n\n[[func]]\nname = \"StartStand\"\naddr = 0x458E64\nsize = 0xCD\n\n[[func]]\nname = \"StartWalkStand\"\naddr = 0x458F31\nsize = 0x94\n\n[[func]]\nname = \"PM_ChangeLightOff\"\naddr = 0x458FC5\nsize = 0xC5\n\n[[func]]\nname = \"PM_ChangeOffset\"\naddr = 0x45908A\nsize = 0x110\n\n[[func]]\nname = \"StartWalk\"\naddr = 0x45919A\nsize = 0x21A\n\n[[func]]\nname = \"StartWalk2\"\naddr = 0x4593B4\nsize = 0x284\n\n[[func]]\nname = \"StartWalk3\"\naddr = 0x459638\nsize = 0x2B7\n\n[[func]]\nname = \"StartAttack\"\naddr = 0x4598EF\nsize = 0xAD\n\n[[func]]\nname = \"StartRangeAttack\"\naddr = 0x45999C\nsize = 0xD6\n\n[[func]]\nname = \"StartPlrBlock\"\naddr = 0x459A72\nsize = 0xC3\n\n[[func]]\nname = \"StartSpell\"\naddr = 0x459B35\nsize = 0x1CB\n\n[[func]]\nname = \"FixPlrWalkTags\"\naddr = 0x459D00\nsize = 0xCD\n\n[[func]]\nname = \"RemovePlrFromMap\"\naddr = 0x459DCD\nsize = 0x7B\n\n[[func]]\nname = \"StartPlrHit\"\naddr = 0x459E48\nsize = 0x19F\n\n[[func]]\nname = \"RespawnDeadItem\"\naddr = 0x459FE7\nsize = 0xCC\n\n[[func]]\nname = \"StartPlayerKill\"\naddr = 0x45A0B3\nsize = 0x374\n\n[[func]]\nname = \"PlrDeadItem\"\naddr = 0x45A427\nsize = 0x11D\n\n[[func]]\nname = \"DropHalfPlayersGold\"\naddr = 0x45A544\nsize = 0x550\n\n[[func]]\nname = \"StripTopGold\"\naddr = 0x45AA94\nsize = 0x143\n\n[[func]]\nname = \"SyncPlrKill\"\naddr = 0x45ABD7\nsize = 0x9B\n\n[[func]]\nname = \"RemovePlrMissiles\"\naddr = 0x45AC77\nsize = 0x149\n\n[[func]]\nname = \"InitLevelChange\"\naddr = 0x45ADC0\nsize = 0xBC\n\n[[func]]\nname = \"StartNewLvl\"\naddr = 0x45AE7C\nsize = 0x103\n\n[[func]]\nname = \"RestartTownLvl\"\naddr = 0x45AF7F\nsize = 0xB1\n\n[[func]]\nname = \"StartWarpLvl\"\naddr = 0x45B030\nsize = 0x88\n\n[[func]]\nname = \"PM_DoStand\"\naddr = 0x45B0B8\nsize = 0x3\n\n[[func]]\nname = \"PM_DoNewLvl\"\naddr = 0x45B0B8\nsize = 0x3\n\n[[func]]\nname = \"PM_DoWalk\"\naddr = 0x45B0BB\nsize = 0x1CE\n\n[[func]]\nname = \"PM_DoWalk2\"\naddr = 0x45B289\nsize = 0x1B1\n\n[[func]]\nname = \"PM_DoWalk3\"\naddr = 0x45B43A\nsize = 0x1EC\n\n[[func]]\nname = \"WeaponDur\"\naddr = 0x45B626\nsize = 0x222\n\n[[func]]\nname = \"PlrHitMonst\"\naddr = 0x45B848\nsize = 0x61E\n\n[[func]]\nname = \"PlrHitPlr\"\naddr = 0x45BE66\nsize = 0x29A\n\n[[func]]\nname = \"PlrHitObj\"\naddr = 0x45C100\nsize = 0x3D\n\n[[func]]\nname = \"PM_DoAttack\"\naddr = 0x45C13D\nsize = 0x402\n\n[[func]]\nname = \"PM_DoRangeAttack\"\naddr = 0x45C53F\nsize = 0x1F5\n\n[[func]]\nname = \"ShieldDur\"\naddr = 0x45C734\nsize = 0xDC\n\n[[func]]\nname = \"PM_DoBlock\"\naddr = 0x45C810\nsize = 0x8A\n\n[[func]]\nname = \"PM_DoSpell\"\naddr = 0x45C89A\nsize = 0x177\n\n[[func]]\nname = \"PM_DoGotHit\"\naddr = 0x45CA11\nsize = 0xCE\n\n[[func]]\nname = \"ArmorDur\"\naddr = 0x45CADF\nsize = 0xC5\n\n[[func]]\nname = \"PM_DoDeath\"\naddr = 0x45CBA4\nsize = 0xC3\n\n[[func]]\nname = \"CheckNewPath\"\naddr = 0x45CC67\nsize = 0xB9C\n\n[[func]]\nname = \"PlrDeathModeOK\"\naddr = 0x45D86B\nsize = 0x44\n\n[[func]]\nname = \"ValidatePlayer\"\naddr = 0x45D8AF\nsize = 0x228\n\n[[func]]\nname = \"ProcessPlayers\"\naddr = 0x45DAD7\nsize = 0x29B\n\n[[func]]\nname = \"CheckCheatStats\"\naddr = 0x45DD9E\nsize = 0x95\n\n[[func]]\nname = \"ClrPlrPath\"\naddr = 0x45DE33\nsize = 0x33\n\n[[func]]\nname = \"PosOkPlayer\"\naddr = 0x45DE66\nsize = 0xBE\n\n[[func]]\nname = \"MakePlrPath\"\naddr = 0x45DF24\nsize = 0xBF\n\n[[func]]\nname = \"CheckPlrSpell\"\naddr = 0x45E003\nsize = 0x336\n\n[[func]]\nname = \"SyncPlrAnim\"\naddr = 0x45E339\nsize = 0x133\n\n[[func]]\nname = \"SyncInitPlrPos\"\naddr = 0x45E49C\nsize = 0xBD\n\n[[func]]\nname = \"SyncInitPlr\"\naddr = 0x45E559\nsize = 0x25\n\n[[func]]\nname = \"CheckStats\"\naddr = 0x45E57E\nsize = 0x10E\n\n[[func]]\nname = \"ModifyPlrStr\"\naddr = 0x45E68C\nsize = 0x98\n\n[[func]]\nname = \"ModifyPlrMag\"\naddr = 0x45E724\nsize = 0xFE\n\n[[func]]\nname = \"ModifyPlrDex\"\naddr = 0x45E822\nsize = 0x98\n\n[[func]]\nname = \"ModifyPlrVit\"\naddr = 0x45E8BA\nsize = 0xF2\n\n[[func]]\nname = \"SetPlayerHitPoints\"\naddr = 0x45E9AC\nsize = 0x5E\n\n[[func]]\nname = \"SetPlrStr\"\naddr = 0x45EA0A\nsize = 0x3A\n\n[[func]]\nname = \"SetPlrMag\"\naddr = 0x45EA44\nsize = 0x72\n\n[[func]]\nname = \"SetPlrDex\"\naddr = 0x45EAB6\nsize = 0x3A\n\n[[func]]\nname = \"SetPlrVit\"\naddr = 0x45EAF0\nsize = 0x69\n\n[[func]]\nname = \"InitDungMsgs\"\naddr = 0x45EB59\nsize = 0x3B\n\n[[func]]\nname = \"PlayDungMsgs\"\naddr = 0x45EB94\nsize = 0x40D\n\n[[func]]\nname = \"get_max_strength\"\naddr = 0x45EFA1\nsize = 0xA\n\n[[func]]\nname = \"get_max_magic\"\naddr = 0x45EFAB\nsize = 0xA\n\n[[func]]\nname = \"get_max_dexterity\"\naddr = 0x45EFB5\nsize = 0xA\n\n[[func]]\nname = \"plrmsg_delay\"\naddr = 0x45EFBF\nsize = 0x37\n\n[[func]]\nname = \"ErrorPlrMsg\"\naddr = 0x45EFF6\nsize = 0x49\n\n[[func]]\nname = \"EventPlrMsg\"\naddr = 0x45F03F\nsize = 0x48\n\n[[func]]\nname = \"SendPlrMsg\"\naddr = 0x45F087\nsize = 0x7E\n\n[[func]]\nname = \"ClearPlrMsg\"\naddr = 0x45F105\nsize = 0x2A\n\n[[func]]\nname = \"InitPlrMsg\"\naddr = 0x45F12F\nsize = 0x1C\n\n[[func]]\nname = \"DrawPlrMsg\"\naddr = 0x45F14B\nsize = 0x8D\n\n[[func]]\nname = \"PrintPlrMsg\"\naddr = 0x45F1D8\nsize = 0xC7\n\n[[func]]\nname = \"InitPortals\"\naddr = 0x45F29F\nsize = 0x26\n\n[[func]]\nname = \"SetPortalStats\"\naddr = 0x45F2C5\nsize = 0x3E\n\n[[func]]\nname = \"AddWarpMissile\"\naddr = 0x45F303\nsize = 0x74\n\n[[func]]\nname = \"SyncPortals\"\naddr = 0x45F377\nsize = 0x5B\n\n[[func]]\nname = \"AddInTownPortal\"\naddr = 0x45F3D2\nsize = 0x14\n\n[[func]]\nname = \"ActivatePortal\"\naddr = 0x45F3E6\nsize = 0x45\n\n[[func]]\nname = \"DeactivatePortal\"\naddr = 0x45F42B\nsize = 0xC\n\n[[func]]\nname = \"PortalOnLevel\"\naddr = 0x45F437\nsize = 0x22\n\n[[func]]\nname = \"RemovePortalMissile\"\naddr = 0x45F459\nsize = 0x8F\n\n[[func]]\nname = \"SetCurrentPortal\"\naddr = 0x45F4E8\nsize = 0x7\n\n[[func]]\nname = \"GetPortalLevel\"\naddr = 0x45F4EF\nsize = 0xB5\n\n[[func]]\nname = \"GetPortalLvlPos\"\naddr = 0x45F5A4\nsize = 0x63\n\n[[func]]\nname = \"InitQuests\"\naddr = 0x45F607\nsize = 0x1B5\n\n[[func]]\nname = \"CheckQuests\"\naddr = 0x45F7BC\nsize = 0x236\n\n[[func]]\nname = \"ForceQuests\"\naddr = 0x45F9F2\nsize = 0xA1\n\n[[func]]\nname = \"QuestStatus\"\naddr = 0x45FA93\nsize = 0x3F\n\n[[func]]\nname = \"CheckQuestKill\"\naddr = 0x45FAD2\nsize = 0x487\n\n[[func]]\nname = \"DrawButcher\"\naddr = 0x45FF59\nsize = 0x27\n\n[[func]]\nname = \"DrawSkelKing\"\naddr = 0x45FF80\nsize = 0x1E\n\n[[func]]\nname = \"DrawWarLord\"\naddr = 0x45FF9E\nsize = 0x91\n\n[[func]]\nname = \"DrawSChamber\"\naddr = 0x46002F\nsize = 0xB8\n\n[[func]]\nname = \"DrawLTBanner\"\naddr = 0x4600E7\nsize = 0x8D\n\n[[func]]\nname = \"DrawBlind\"\naddr = 0x460174\nsize = 0x8D\n\n[[func]]\nname = \"DrawBlood\"\naddr = 0x460201\nsize = 0x8D\n\n[[func]]\nname = \"DRLG_CheckQuests\"\naddr = 0x46028E\nsize = 0x91\n\n[[func]]\nname = \"SetReturnLvlPos\"\naddr = 0x46031F\nsize = 0xBF\n\n[[func]]\nname = \"GetReturnLvlPos\"\naddr = 0x4603DE\nsize = 0x39\n\n[[func]]\nname = \"ResyncMPQuests\"\naddr = 0x460417\nsize = 0x168\n\n[[func]]\nname = \"ResyncQuests\"\naddr = 0x46057F\nsize = 0x333\n\n[[func]]\nname = \"PrintQLString\"\naddr = 0x4608B2\nsize = 0x14D\n\n[[func]]\nname = \"DrawQuestLog\"\naddr = 0x4609FF\nsize = 0x91\n\n[[func]]\nname = \"StartQuestlog\"\naddr = 0x460A90\nsize = 0x71\n\n[[func]]\nname = \"QuestlogUp\"\naddr = 0x460B01\nsize = 0x47\n\n[[func]]\nname = \"QuestlogDown\"\naddr = 0x460B48\nsize = 0x4A\n\n[[func]]\nname = \"QuestlogEnter\"\naddr = 0x460B92\nsize = 0x40\n\n[[func]]\nname = \"QuestlogESC\"\naddr = 0x460BD2\nsize = 0x55\n\n[[func]]\nname = \"SetMultiQuest\"\naddr = 0x460C27\nsize = 0x41\n\n[[func]]\nname = \"drawTopArchesUpperScreen\"\naddr = 0x460C68\nsize = 0x162D\n\n[[func]]\nname = \"drawBottomArchesUpperScreen\"\naddr = 0x462295\nsize = 0xC38\n\n[[func]]\nname = \"drawUpperScreen\"\naddr = 0x462ECD\nsize = 0xC73\n\n[[func]]\nname = \"drawTopArchesLowerScreen\"\naddr = 0x463B40\nsize = 0x1A11\n\n[[func]]\nname = \"drawBottomArchesLowerScreen\"\naddr = 0x465551\nsize = 0xF22\n\n[[func]]\nname = \"drawLowerScreen\"\naddr = 0x466473\nsize = 0xE53\n\n[[func]]\nname = \"world_draw_black_tile\"\naddr = 0x4672C6\nsize = 0x5C\n\n[[func]]\nname = \"ClearCursor\"\naddr = 0x467322\nsize = 0xF\n\n[[func]]\nname = \"DrawMissile\"\naddr = 0x467331\nsize = 0x1A4\n\n[[func]]\nname = \"DrawClippedMissile\"\naddr = 0x4674D5\nsize = 0x1A4\n\n[[func]]\nname = \"DrawDeadPlayer\"\naddr = 0x467679\nsize = 0xE2\n\n[[func]]\nname = \"DrawPlayer\"\naddr = 0x46775B\nsize = 0x142\n\n[[func]]\nname = \"DrawClippedPlayer\"\naddr = 0x46789D\nsize = 0x12C\n\n[[func]]\nname = \"DrawView\"\naddr = 0x4679C9\nsize = 0x11A\n\n[[func]]\nname = \"DrawGame\"\naddr = 0x467AE3\nsize = 0x1E5\n\n[[func]]\nname = \"scrollrt_draw_lower\"\naddr = 0x467CE8\nsize = 0x480\n\n[[func]]\nname = \"scrollrt_draw_clipped_dungeon\"\naddr = 0x468168\nsize = 0x63C\n\n[[func]]\nname = \"DrawClippedMonster\"\naddr = 0x4687A4\nsize = 0xFA\n\n[[func]]\nname = \"DrawClippedObject\"\naddr = 0x46889E\nsize = 0x119\n\n[[func]]\nname = \"scrollrt_draw_clipped_e_flag\"\naddr = 0x4689B7\nsize = 0x144\n\n[[func]]\nname = \"scrollrt_draw_lower_2\"\naddr = 0x468AFB\nsize = 0x3D8\n\n[[func]]\nname = \"scrollrt_draw_clipped_dungeon_2\"\naddr = 0x468ED3\nsize = 0x66C\n\n[[func]]\nname = \"scrollrt_draw_clipped_e_flag_2\"\naddr = 0x46953F\nsize = 0x194\n\n[[func]]\nname = \"scrollrt_draw_upper\"\naddr = 0x4696D3\nsize = 0x4B9\n\n[[func]]\nname = \"scrollrt_draw_dungeon\"\naddr = 0x469B8C\nsize = 0x66F\n\n[[func]]\nname = \"DrawMonster\"\naddr = 0x46A1FB\nsize = 0xFA\n\n[[func]]\nname = \"DrawObject\"\naddr = 0x46A2F5\nsize = 0x14E\n\n[[func]]\nname = \"scrollrt_draw_e_flag\"\naddr = 0x46A443\nsize = 0x158\n\n[[func]]\nname = \"DrawZoom\"\naddr = 0x46A59B\nsize = 0x245\n\n[[func]]\nname = \"ClearScreenBuffer\"\naddr = 0x46A800\nsize = 0x34\n\n[[func]]\nname = \"scrollrt_draw_game_screen\"\naddr = 0x46A834\nsize = 0x62\n\n[[func]]\nname = \"scrollrt_draw_cursor_back_buffer\"\naddr = 0x46A896\nsize = 0x8F\n\n[[func]]\nname = \"scrollrt_draw_cursor_item\"\naddr = 0x46A925\nsize = 0x271\n\n[[func]]\nname = \"DrawMain\"\naddr = 0x46AB96\nsize = 0x28F\n\n[[func]]\nname = \"DoBlitScreen\"\naddr = 0x46AE25\nsize = 0x141\n\n[[func]]\nname = \"DrawAndBlit\"\naddr = 0x46AF66\nsize = 0x12C\n\n[[func]]\nname = \"ObjIndex\"\naddr = 0x46B092\nsize = 0x4B\n\n[[func]]\nname = \"AddSKingObjs\"\naddr = 0x46B0DD\nsize = 0xAF\n\n[[func]]\nname = \"AddSChamObjs\"\naddr = 0x46B18C\nsize = 0x3B\n\n[[func]]\nname = \"AddVileObjs\"\naddr = 0x46B1C7\nsize = 0x58\n\n[[func]]\nname = \"DRLG_SetMapTrans\"\naddr = 0x46B21F\nsize = 0x6D\n\n[[func]]\nname = \"LoadSetMap\"\naddr = 0x46B28C\nsize = 0x200\n\n[[func]]\nname = \"SHA1Clear\"\naddr = 0x46B48C\nsize = 0x15\n\n[[func]]\nname = \"SHA1Result\"\naddr = 0x46B4A1\nsize = 0x22\n\n[[func]]\nname = \"SHA1Calculate\"\naddr = 0x46B4C3\nsize = 0x26\n\n[[func]]\nname = \"SHA1Input\"\naddr = 0x46B4E9\nsize = 0x51\n\n[[func]]\nname = \"SHA1ProcessMessageBlock\"\naddr = 0x46B53A\nsize = 0x1FD\n\n[[func]]\nname = \"SHA1Reset\"\naddr = 0x46B737\nsize = 0xE\n\n[[func]]\nname = \"SHA1Init\"\naddr = 0x46B745\nsize = 0x2B\n\n[[func]]\nname = \"snd_update\"\naddr = 0x46B770\nsize = 0x4D\n\n[[func]]\nname = \"snd_stop_snd\"\naddr = 0x46B7BD\nsize = 0x12\n\n[[func]]\nname = \"snd_playing\"\naddr = 0x46B7CF\nsize = 0x2C\n\n[[func]]\nname = \"snd_play_snd\"\naddr = 0x46B7FB\nsize = 0xD9\n\n[[func]]\nname = \"sound_dup_channel\"\naddr = 0x46B8D4\nsize = 0x42\n\n[[func]]\nname = \"sound_file_reload\"\naddr = 0x46B916\nsize = 0x93\n\n[[func]]\nname = \"sound_file_load\"\naddr = 0x46B9A9\nsize = 0xFC\n\n[[func]]\nname = \"sound_CreateSoundBuffer\"\naddr = 0x46BAA5\nsize = 0x5D\n\n[[func]]\nname = \"sound_file_cleanup\"\naddr = 0x46BB02\nsize = 0x2A\n\n[[func]]\nname = \"snd_init\"\naddr = 0x46BB2C\nsize = 0xA6\n\n[[func]]\nname = \"snd_get_volume\"\naddr = 0x46BBD2\nsize = 0x51\n\n[[func]]\nname = \"sound_create_primary_buffer\"\naddr = 0x46BC23\nsize = 0x102\n\n[[func]]\nname = \"sound_DirectSoundCreate\"\naddr = 0x46BD25\nsize = 0x81\n\n[[func]]\nname = \"sound_cleanup\"\naddr = 0x46BDA6\nsize = 0x59\n\n[[func]]\nname = \"snd_set_volume\"\naddr = 0x46BDFF\nsize = 0xF\n\n[[func]]\nname = \"music_stop\"\naddr = 0x46BE0E\nsize = 0x2C\n\n[[func]]\nname = \"music_start\"\naddr = 0x46BE3A\nsize = 0x6B\n\n[[func]]\nname = \"sound_disable_music\"\naddr = 0x46BEA5\nsize = 0x1A\n\n[[func]]\nname = \"sound_get_or_set_music_volume\"\naddr = 0x46BEBF\nsize = 0x23\n\n[[func]]\nname = \"sound_get_or_set_sound_volume\"\naddr = 0x46BEE2\nsize = 0x13\n\n[[func]]\nname = \"GetManaAmount\"\naddr = 0x46BEF5\nsize = 0x107\n\n[[func]]\nname = \"UseMana\"\naddr = 0x46BFFC\nsize = 0x73\n\n[[func]]\nname = \"CheckSpell\"\naddr = 0x46C06F\nsize = 0x58\n\n[[func]]\nname = \"CastSpell\"\naddr = 0x46C0C7\nsize = 0xE7\n\n[[func]]\nname = \"DoResurrect\"\naddr = 0x46C1AE\nsize = 0x131\n\n[[func]]\nname = \"DoHealOther\"\naddr = 0x46C2DF\nsize = 0x15E\n\n[[func]]\nname = \"InitStores\"\naddr = 0x46C43D\nsize = 0x86\n\n[[func]]\nname = \"SetupTownStores\"\naddr = 0x46C4C3\nsize = 0xC5\n\n[[func]]\nname = \"FreeStoreMem\"\naddr = 0x46C588\nsize = 0x36\n\n[[func]]\nname = \"DrawSTextBack\"\naddr = 0x46C5BE\nsize = 0x5E\n\n[[func]]\nname = \"PrintSString\"\naddr = 0x46C61C\nsize = 0x20E\n\n[[func]]\nname = \"DrawSLine\"\naddr = 0x46C82A\nsize = 0x8A\n\n[[func]]\nname = \"DrawSSlider\"\naddr = 0x46C8B4\nsize = 0xF1\n\n[[func]]\nname = \"DrawSTextHelp\"\naddr = 0x46C9A5\nsize = 0xF\n\n[[func]]\nname = \"ClearSText\"\naddr = 0x46C9B4\nsize = 0x45\n\n[[func]]\nname = \"AddSLine\"\naddr = 0x46C9F9\nsize = 0x25\n\n[[func]]\nname = \"AddSTextVal\"\naddr = 0x46CA1E\nsize = 0xD\n\n[[func]]\nname = \"OffsetSTextY\"\naddr = 0x46CA2B\nsize = 0xD\n\n[[func]]\nname = \"AddSText\"\naddr = 0x46CA38\nsize = 0x51\n\n[[func]]\nname = \"StoreAutoPlace\"\naddr = 0x46CA89\nsize = 0x2A1\n\n[[func]]\nname = \"S_StartSmith\"\naddr = 0x46CD2A\nsize = 0xCA\n\n[[func]]\nname = \"S_ScrollSBuy\"\naddr = 0x46CDF4\nsize = 0xBC\n\n[[func]]\nname = \"PrintStoreItem\"\naddr = 0x46CEB0\nsize = 0x275\n\n[[func]]\nname = \"S_StartSBuy\"\naddr = 0x46D125\nsize = 0xC7\n\n[[func]]\nname = \"S_ScrollSPBuy\"\naddr = 0x46D1EC\nsize = 0xE9\n\n[[func]]\nname = \"S_StartSPBuy\"\naddr = 0x46D2D5\nsize = 0xEA\n\n[[func]]\nname = \"SmithSellOk\"\naddr = 0x46D3BF\nsize = 0x99\n\n[[func]]\nname = \"S_ScrollSSell\"\naddr = 0x46D458\nsize = 0xE7\n\n[[func]]\nname = \"S_StartSSell\"\naddr = 0x46D53F\nsize = 0x2C7\n\n[[func]]\nname = \"SmithRepairOk\"\naddr = 0x46D806\nsize = 0x4C\n\n[[func]]\nname = \"S_StartSRepair\"\naddr = 0x46D852\nsize = 0x267\n\n[[func]]\nname = \"AddStoreHoldRepair\"\naddr = 0x46DAB9\nsize = 0xA5\n\n[[func]]\nname = \"S_StartWitch\"\naddr = 0x46DB5E\nsize = 0xA6\n\n[[func]]\nname = \"S_ScrollWBuy\"\naddr = 0x46DC04\nsize = 0xBC\n\n[[func]]\nname = \"S_StartWBuy\"\naddr = 0x46DCC0\nsize = 0xD1\n\n[[func]]\nname = \"WitchSellOk\"\naddr = 0x46DD91\nsize = 0x9E\n\n[[func]]\nname = \"S_StartWSell\"\naddr = 0x46DE2F\nsize = 0x300\n\n[[func]]\nname = \"WitchRechargeOk\"\naddr = 0x46E12F\nsize = 0x5E\n\n[[func]]\nname = \"AddStoreHoldRecharge\"\naddr = 0x46E18D\nsize = 0x86\n\n[[func]]\nname = \"S_StartWRecharge\"\naddr = 0x46E213\nsize = 0x1EC\n\n[[func]]\nname = \"S_StartNoMoney\"\naddr = 0x46E3FF\nsize = 0x3A\n\n[[func]]\nname = \"S_StartNoRoom\"\naddr = 0x46E439\nsize = 0x33\n\n[[func]]\nname = \"S_StartConfirm\"\naddr = 0x46E46C\nsize = 0x197\n\n[[func]]\nname = \"S_StartBoy\"\naddr = 0x46E603\nsize = 0xBF\n\n[[func]]\nname = \"S_StartBBoy\"\naddr = 0x46E6C2\nsize = 0xD7\n\n[[func]]\nname = \"S_StartHealer\"\naddr = 0x46E799\nsize = 0x105\n\n[[func]]\nname = \"S_ScrollHBuy\"\naddr = 0x46E89E\nsize = 0xB0\n\n[[func]]\nname = \"S_StartHBuy\"\naddr = 0x46E94E\nsize = 0xC7\n\n[[func]]\nname = \"S_StartStory\"\naddr = 0x46EA15\nsize = 0x7A\n\n[[func]]\nname = \"IdItemOk\"\naddr = 0x46EA8F\nsize = 0x18\n\n[[func]]\nname = \"AddStoreHoldId\"\naddr = 0x46EAA7\nsize = 0x44\n\n[[func]]\nname = \"S_StartSIdentify\"\naddr = 0x46EAEB\nsize = 0x3FA\n\n[[func]]\nname = \"S_StartIdShow\"\naddr = 0x46EEE5\nsize = 0xC7\n\n[[func]]\nname = \"S_StartTalk\"\naddr = 0x46EFAC\nsize = 0x12A\n\n[[func]]\nname = \"S_StartTavern\"\naddr = 0x46F0D6\nsize = 0x84\n\n[[func]]\nname = \"S_StartBarMaid\"\naddr = 0x46F15A\nsize = 0x72\n\n[[func]]\nname = \"S_StartDrunk\"\naddr = 0x46F1CC\nsize = 0x72\n\n[[func]]\nname = \"StartStore\"\naddr = 0x46F23E\nsize = 0x165\n\n[[func]]\nname = \"DrawSText\"\naddr = 0x46F3FF\nsize = 0xFC\n\n[[func]]\nname = \"STextESC\"\naddr = 0x46F4FB\nsize = 0xD9\n\n[[func]]\nname = \"STextUp\"\naddr = 0x46F630\nsize = 0xA8\n\n[[func]]\nname = \"STextDown\"\naddr = 0x46F6D8\nsize = 0xAD\n\n[[func]]\nname = \"STextPrior\"\naddr = 0x46F785\nsize = 0x4A\n\n[[func]]\nname = \"STextNext\"\naddr = 0x46F7CF\nsize = 0x4D\n\n[[func]]\nname = \"S_SmithEnter\"\naddr = 0x46F81C\nsize = 0x77\n\n[[func]]\nname = \"SetGoldCurs\"\naddr = 0x46F893\nsize = 0x4D\n\n[[func]]\nname = \"SetSpdbarGoldCurs\"\naddr = 0x46F8E0\nsize = 0x4D\n\n[[func]]\nname = \"TakePlrsMoney\"\naddr = 0x46F92D\nsize = 0x23B\n\n[[func]]\nname = \"SmithBuyItem\"\naddr = 0x46FB68\nsize = 0xBB\n\n[[func]]\nname = \"S_SBuyEnter\"\naddr = 0x46FC23\nsize = 0xF5\n\n[[func]]\nname = \"SmithBuyPItem\"\naddr = 0x46FD18\nsize = 0x99\n\n[[func]]\nname = \"S_SPBuyEnter\"\naddr = 0x46FDB1\nsize = 0x115\n\n[[func]]\nname = \"StoreGoldFit\"\naddr = 0x46FEC6\nsize = 0xDB\n\n[[func]]\nname = \"PlaceStoreGold\"\naddr = 0x46FFA1\nsize = 0x11C\n\n[[func]]\nname = \"StoreSellItem\"\naddr = 0x4700BD\nsize = 0x17C\n\n[[func]]\nname = \"S_SSellEnter\"\naddr = 0x470239\nsize = 0x88\n\n[[func]]\nname = \"SmithRepairItem\"\naddr = 0x4702C1\nsize = 0x113\n\n[[func]]\nname = \"S_SRepairEnter\"\naddr = 0x4703D4\nsize = 0x9D\n\n[[func]]\nname = \"S_WitchEnter\"\naddr = 0x470471\nsize = 0x71\n\n[[func]]\nname = \"WitchBuyItem\"\naddr = 0x4704E2\nsize = 0xC2\n\n[[func]]\nname = \"S_WBuyEnter\"\naddr = 0x4705A4\nsize = 0xF5\n\n[[func]]\nname = \"S_WSellEnter\"\naddr = 0x470699\nsize = 0x88\n\n[[func]]\nname = \"WitchRechargeItem\"\naddr = 0x470721\nsize = 0xA9\n\n[[func]]\nname = \"S_WRechargeEnter\"\naddr = 0x4707CA\nsize = 0x9D\n\n[[func]]\nname = \"S_BoyEnter\"\naddr = 0x470867\nsize = 0xAB\n\n[[func]]\nname = \"BoyBuyItem\"\naddr = 0x470912\nsize = 0x41\n\n[[func]]\nname = \"HealerBuyItem\"\naddr = 0x470953\nsize = 0x114\n\n[[func]]\nname = \"S_BBuyEnter\"\naddr = 0x470A67\nsize = 0x107\n\n[[func]]\nname = \"StoryIdItem\"\naddr = 0x470B6E\nsize = 0x163\n\n[[func]]\nname = \"S_ConfirmEnter\"\naddr = 0x470CD1\nsize = 0xA5\n\n[[func]]\nname = \"S_HealerEnter\"\naddr = 0x470D76\nsize = 0x58\n\n[[func]]\nname = \"S_HBuyEnter\"\naddr = 0x470DCE\nsize = 0xF5\n\n[[func]]\nname = \"S_StoryEnter\"\naddr = 0x470EC3\nsize = 0x59\n\n[[func]]\nname = \"S_SIDEnter\"\naddr = 0x470F1C\nsize = 0x9D\n\n[[func]]\nname = \"S_TalkEnter\"\naddr = 0x470FB9\nsize = 0xF5\n\n[[func]]\nname = \"S_TavernEnter\"\naddr = 0x4710AE\nsize = 0x4E\n\n[[func]]\nname = \"S_BarmaidEnter\"\naddr = 0x4710FC\nsize = 0x4E\n\n[[func]]\nname = \"S_DrunkEnter\"\naddr = 0x47114A\nsize = 0x4E\n\n[[func]]\nname = \"STextEnter\"\naddr = 0x471198\nsize = 0xC3\n\n[[func]]\nname = \"CheckStoreBtn\"\naddr = 0x4712B7\nsize = 0x153\n\n[[func]]\nname = \"ReleaseStoreBtn\"\naddr = 0x47140A\nsize = 0xF\n\n[[func]]\nname = \"sync_all_monsters\"\naddr = 0x471419\nsize = 0x87\n\n[[func]]\nname = \"sync_one_monster\"\naddr = 0x4714A0\nsize = 0xC7\n\n[[func]]\nname = \"sync_monster_active\"\naddr = 0x471567\nsize = 0x5C\n\n[[func]]\nname = \"sync_monster_pos\"\naddr = 0x4715C3\nsize = 0x6F\n\n[[func]]\nname = \"sync_monster_active2\"\naddr = 0x471632\nsize = 0x60\n\n[[func]]\nname = \"SyncPlrInv\"\naddr = 0x471692\nsize = 0x1EE\n\n[[func]]\nname = \"sync_update\"\naddr = 0x471880\nsize = 0x73\n\n[[func]]\nname = \"sync_monster\"\naddr = 0x4718F3\nsize = 0x21B\n\n[[func]]\nname = \"sync_init\"\naddr = 0x471B0E\nsize = 0x25\n\n[[func]]\nname = \"TFit_Shrine\"\naddr = 0x471B33\nsize = 0x124\n\n[[func]]\nname = \"TFit_Obj5\"\naddr = 0x471C57\nsize = 0xDE\n\n[[func]]\nname = \"TFit_SkelRoom\"\naddr = 0x471D35\nsize = 0x50\n\n[[func]]\nname = \"TFit_GoatShrine\"\naddr = 0x471D85\nsize = 0x43\n\n[[func]]\nname = \"CheckThemeObj3\"\naddr = 0x471DC8\nsize = 0x7F\n\n[[func]]\nname = \"TFit_Obj3\"\naddr = 0x471E47\nsize = 0x5C\n\n[[func]]\nname = \"CheckThemeReqs\"\naddr = 0x471EA3\nsize = 0x80\n\n[[func]]\nname = \"SpecialThemeFit\"\naddr = 0x471F23\nsize = 0xFC\n\n[[func]]\nname = \"CheckThemeRoom\"\naddr = 0x47205F\nsize = 0x134\n\n[[func]]\nname = \"InitThemes\"\naddr = 0x472193\nsize = 0x1B3\n\n[[func]]\nname = \"HoldThemeRooms\"\naddr = 0x472346\nsize = 0x5A\n\n[[func]]\nname = \"PlaceThemeMonsts\"\naddr = 0x4723A0\nsize = 0xE5\n\n[[func]]\nname = \"Theme_Barrel\"\naddr = 0x472485\nsize = 0xD8\n\n[[func]]\nname = \"Theme_Shrine\"\naddr = 0x47255D\nsize = 0xB3\n\n[[func]]\nname = \"Theme_MonstPit\"\naddr = 0x472610\nsize = 0x9C\n\n[[func]]\nname = \"Theme_SkelRoom\"\naddr = 0x4726AC\nsize = 0x1D6\n\n[[func]]\nname = \"Theme_Treasure\"\naddr = 0x472882\nsize = 0x152\n\n[[func]]\nname = \"Theme_Library\"\naddr = 0x4729D4\nsize = 0x194\n\n[[func]]\nname = \"Theme_Torture\"\naddr = 0x472B68\nsize = 0xD3\n\n[[func]]\nname = \"Theme_BloodFountain\"\naddr = 0x472C3B\nsize = 0x46\n\n[[func]]\nname = \"Theme_Decap\"\naddr = 0x472C81\nsize = 0xD3\n\n[[func]]\nname = \"Theme_PurifyingFountain\"\naddr = 0x472D54\nsize = 0x46\n\n[[func]]\nname = \"Theme_ArmorStand\"\naddr = 0x472D9A\nsize = 0xF1\n\n[[func]]\nname = \"Theme_GoatShrine\"\naddr = 0x472E8B\nsize = 0xCE\n\n[[func]]\nname = \"Theme_Cauldron\"\naddr = 0x472F59\nsize = 0x46\n\n[[func]]\nname = \"Theme_MurkyFountain\"\naddr = 0x472F9F\nsize = 0x46\n\n[[func]]\nname = \"Theme_TearFountain\"\naddr = 0x472FE5\nsize = 0x46\n\n[[func]]\nname = \"Theme_BrnCross\"\naddr = 0x47302B\nsize = 0xD3\n\n[[func]]\nname = \"Theme_WeaponRack\"\naddr = 0x4730FE\nsize = 0xF1\n\n[[func]]\nname = \"UpdateL4Trans\"\naddr = 0x4731EF\nsize = 0x20\n\n[[func]]\nname = \"CreateThemeRooms\"\naddr = 0x47320F\nsize = 0x11B\n\n[[func]]\nname = \"tmsg_get\"\naddr = 0x47336E\nsize = 0x4B\n\n[[func]]\nname = \"tmsg_add\"\naddr = 0x4733B9\nsize = 0x53\n\n[[func]]\nname = \"tmsg_cleanup\"\naddr = 0x47340C\nsize = 0x27\n\n[[func]]\nname = \"town_clear_upper_buf\"\naddr = 0x473433\nsize = 0x66\n\n[[func]]\nname = \"town_clear_low_buf\"\naddr = 0x473499\nsize = 0x6F\n\n[[func]]\nname = \"town_draw_clipped_e_flag\"\naddr = 0x473508\nsize = 0x7D\n\n[[func]]\nname = \"town_draw_clipped_town\"\naddr = 0x473585\nsize = 0x333\n\n[[func]]\nname = \"town_draw_lower\"\naddr = 0x4738B8\nsize = 0x2FB\n\n[[func]]\nname = \"town_draw_clipped_e_flag_2\"\naddr = 0x473BB3\nsize = 0xB1\n\n[[func]]\nname = \"town_draw_clipped_town_2\"\naddr = 0x473C64\nsize = 0x347\n\n[[func]]\nname = \"town_draw_lower_2\"\naddr = 0x473FAB\nsize = 0x377\n\n[[func]]\nname = \"town_draw_e_flag\"\naddr = 0x474322\nsize = 0x89\n\n[[func]]\nname = \"town_draw_town_all\"\naddr = 0x4743AB\nsize = 0x338\n\n[[func]]\nname = \"town_draw_upper\"\naddr = 0x4746E3\nsize = 0x340\n\n[[func]]\nname = \"T_DrawGame\"\naddr = 0x474A23\nsize = 0x1D8\n\n[[func]]\nname = \"T_DrawZoom\"\naddr = 0x474C1F\nsize = 0x23F\n\n[[func]]\nname = \"T_DrawView\"\naddr = 0x474E82\nsize = 0x134\n\n[[func]]\nname = \"SetTownMicros\"\naddr = 0x474FB6\nsize = 0xE9\n\n[[func]]\nname = \"T_FillSector\"\naddr = 0x47509F\nsize = 0xB6\n\n[[func]]\nname = \"T_FillTile\"\naddr = 0x475155\nsize = 0x71\n\n[[func]]\nname = \"TownOpenHive\"\naddr = 0x4751C6\nsize = 0x1B3\n\n[[func]]\nname = \"TownCloseHive\"\naddr = 0x475379\nsize = 0x1B3\n\n[[func]]\nname = \"TownCloseGrave\"\naddr = 0x47552C\nsize = 0x69\n\n[[func]]\nname = \"TownOpenGrave\"\naddr = 0x475595\nsize = 0x69\n\n[[func]]\nname = \"T_Pass3\"\naddr = 0x4755FE\nsize = 0x27E\n\n[[func]]\nname = \"CreateTown\"\naddr = 0x47587C\nsize = 0x264\n\n[[func]]\nname = \"GetActiveTowner\"\naddr = 0x475AE0\nsize = 0x26\n\n[[func]]\nname = \"SetTownerGPtrs\"\naddr = 0x475B06\nsize = 0x3A\n\n[[func]]\nname = \"NewTownerAnim\"\naddr = 0x475B40\nsize = 0x33\n\n[[func]]\nname = \"InitTownerInfo\"\naddr = 0x475B73\nsize = 0x92\n\n[[func]]\nname = \"InitQstSnds\"\naddr = 0x475C05\nsize = 0x4D\n\n[[func]]\nname = \"InitSmith\"\naddr = 0x475C52\nsize = 0x97\n\n[[func]]\nname = \"InitBarOwner\"\naddr = 0x475CE9\nsize = 0x9E\n\n[[func]]\nname = \"InitTownDead\"\naddr = 0x475D87\nsize = 0x98\n\n[[func]]\nname = \"InitWitch\"\naddr = 0x475E1F\nsize = 0x97\n\n[[func]]\nname = \"InitBarmaid\"\naddr = 0x475EB6\nsize = 0x97\n\n[[func]]\nname = \"InitBoy\"\naddr = 0x475F4D\nsize = 0x9E\n\n[[func]]\nname = \"InitHealer\"\naddr = 0x475FEB\nsize = 0x97\n\n[[func]]\nname = \"InitTeller\"\naddr = 0x476082\nsize = 0x97\n\n[[func]]\nname = \"InitDrunk\"\naddr = 0x476119\nsize = 0x97\n\n[[func]]\nname = \"InitCows\"\naddr = 0x4761B0\nsize = 0x158\n\n[[func]]\nname = \"InitFarmer\"\naddr = 0x476308\nsize = 0x97\n\n[[func]]\nname = \"InitCowFarmer\"\naddr = 0x47639F\nsize = 0xAC\n\n[[func]]\nname = \"InitGirl\"\naddr = 0x47644B\nsize = 0xAC\n\n[[func]]\nname = \"InitTowners\"\naddr = 0x4764F7\nsize = 0x87\n\n[[func]]\nname = \"FreeTownerGFX\"\naddr = 0x47657E\nsize = 0x43\n\n[[func]]\nname = \"TownCtrlMsg\"\naddr = 0x4765C1\nsize = 0x6E\n\n[[func]]\nname = \"TownBlackSmith\"\naddr = 0x47662F\nsize = 0xE\n\n[[func]]\nname = \"TownBarOwner\"\naddr = 0x47663D\nsize = 0xF\n\n[[func]]\nname = \"TownDead\"\naddr = 0x47664C\nsize = 0x72\n\n[[func]]\nname = \"TownHealer\"\naddr = 0x4766BE\nsize = 0xF\n\n[[func]]\nname = \"TownStory\"\naddr = 0x4766CD\nsize = 0xF\n\n[[func]]\nname = \"TownDrunk\"\naddr = 0x4766DC\nsize = 0xF\n\n[[func]]\nname = \"TownBoy\"\naddr = 0x4766EB\nsize = 0xF\n\n[[func]]\nname = \"TownWitch\"\naddr = 0x4766FA\nsize = 0xF\n\n[[func]]\nname = \"TownBarMaid\"\naddr = 0x476709\nsize = 0xF\n\n[[func]]\nname = \"TownCow\"\naddr = 0x476718\nsize = 0xF\n\n[[func]]\nname = \"TownFarmer\"\naddr = 0x476727\nsize = 0xF\n\n[[func]]\nname = \"TownCowFarmer\"\naddr = 0x476736\nsize = 0xF\n\n[[func]]\nname = \"TownGirl\"\naddr = 0x476745\nsize = 0xF\n\n[[func]]\nname = \"ProcessTowners\"\naddr = 0x476754\nsize = 0xD5\n\n[[func]]\nname = \"PlrHasItem\"\naddr = 0x47685D\nsize = 0x64\n\n[[func]]\nname = \"TownerTalk\"\naddr = 0x4768C1\nsize = 0x1D\n\n[[func]]\nname = \"TalkToTowner\"\naddr = 0x4768DE\nsize = 0x10F2\n\n[[func]]\nname = \"CowSFX\"\naddr = 0x4779D0\nsize = 0xC5\n\n[[func]]\nname = \"track_process\"\naddr = 0x477A95\nsize = 0x9E\n\n[[func]]\nname = \"track_repeat_walk\"\naddr = 0x477B33\nsize = 0x4C\n\n[[func]]\nname = \"track_isscrolling\"\naddr = 0x477B7F\nsize = 0x8\n\n[[func]]\nname = \"InitNoTriggers\"\naddr = 0x477B87\nsize = 0xF\n\n[[func]]\nname = \"InitTownTriggers\"\naddr = 0x477B96\nsize = 0x24E\n\n[[func]]\nname = \"InitL1Triggers\"\naddr = 0x477DE4\nsize = 0x198\n\n[[func]]\nname = \"InitL2Triggers\"\naddr = 0x477F7C\nsize = 0x108\n\n[[func]]\nname = \"InitL3Triggers\"\naddr = 0x478084\nsize = 0x1A8\n\n[[func]]\nname = \"InitL4Triggers\"\naddr = 0x47822C\nsize = 0x145\n\n[[func]]\nname = \"InitSKingTriggers\"\naddr = 0x478371\nsize = 0x30\n\n[[func]]\nname = \"InitSChambTriggers\"\naddr = 0x4783A1\nsize = 0x30\n\n[[func]]\nname = \"InitPWaterTriggers\"\naddr = 0x4783D1\nsize = 0x30\n\n[[func]]\nname = \"InitVPTriggers\"\naddr = 0x478401\nsize = 0x30\n\n[[func]]\nname = \"ForceTownTrig\"\naddr = 0x478431\nsize = 0x220\n\n[[func]]\nname = \"ForceL1Trig\"\naddr = 0x478651\nsize = 0x30E\n\n[[func]]\nname = \"ForceL2Trig\"\naddr = 0x47895F\nsize = 0x206\n\n[[func]]\nname = \"ForceL3Trig\"\naddr = 0x478B65\nsize = 0x384\n\n[[func]]\nname = \"ForceL4Trig\"\naddr = 0x478EE9\nsize = 0x245\n\n[[func]]\nname = \"Freeupstairs\"\naddr = 0x47912E\nsize = 0x48\n\n[[func]]\nname = \"ForceSKingTrig\"\naddr = 0x479176\nsize = 0x69\n\n[[func]]\nname = \"ForceSChambTrig\"\naddr = 0x4791DF\nsize = 0x69\n\n[[func]]\nname = \"ForcePWaterTrig\"\naddr = 0x479248\nsize = 0x69\n\n[[func]]\nname = \"CheckTrigForce\"\naddr = 0x4792B1\nsize = 0xAD\n\n[[func]]\nname = \"CheckTriggers\"\naddr = 0x47935E\nsize = 0x1F5\n\n[[func]]\nname = \"WCloseFile\"\naddr = 0x479553\nsize = 0x7\n\n[[func]]\nname = \"WGetFileSize\"\naddr = 0x47955A\nsize = 0x2A\n\n[[func]]\nname = \"WGetFileArchive\"\naddr = 0x479584\nsize = 0x57\n\n[[func]]\nname = \"WOpenFile\"\naddr = 0x4795DB\nsize = 0x43\n\n[[func]]\nname = \"WReadFile\"\naddr = 0x47961E\nsize = 0x52\n\n[[func]]\nname = \"WSetFilePointer\"\naddr = 0x479670\nsize = 0x34\n\n[[func]]\nname = \"LoadWaveFormat\"\naddr = 0x4796A4\nsize = 0x2E\n\n[[func]]\nname = \"AllocateMemFile\"\naddr = 0x4796D2\nsize = 0x49\n\n[[func]]\nname = \"FreeMemFile\"\naddr = 0x47971B\nsize = 0xE\n\n[[func]]\nname = \"ReadWaveFile\"\naddr = 0x479729\nsize = 0xCA\n\n[[func]]\nname = \"ReadMemFile\"\naddr = 0x4797F3\nsize = 0x56\n\n[[func]]\nname = \"FillMemFile\"\naddr = 0x479849\nsize = 0x3B\n\n[[func]]\nname = \"SeekMemFile\"\naddr = 0x479884\nsize = 0x1E\n\n[[func]]\nname = \"ReadWaveSection\"\naddr = 0x4798A2\nsize = 0x5B\n\n[[func]]\nname = \"LoadWaveFile\"\naddr = 0x4798FD\nsize = 0x38\n"
  },
  {
    "path": "comparer-config/spawn.toml",
    "content": "# conversion between function and file location of the functions\n# = (0x401000 - PE header offset) (0x400 for VC5 linker)\naddress_offset = 0x400C00\n\n[[func]]\nname = \"operator delete\"\naddr = 0x401010\nsize = 0x1A\n\n[[func]]\nname = \"GetErrorStr\"\naddr = 0x40102A\nsize = 0xA4\n\n[[func]]\nname = \"TraceErrorDD\"\naddr = 0x4010CE\nsize = 0x6B8\n\n[[func]]\nname = \"TraceErrorDS\"\naddr = 0x401831\nsize = 0x109\n\n[[func]]\nname = \"TraceLastError\"\naddr = 0x40193A\nsize = 0xD\n\n[[func]]\nname = \"app_fatal\"\naddr = 0x401947\nsize = 0x24\n\n[[func]]\nname = \"MsgBox\"\naddr = 0x401975\nsize = 0x52\n\n[[func]]\nname = \"FreeDlg\"\naddr = 0x4019C7\nsize = 0x69\n\n[[func]]\nname = \"DrawDlg\"\naddr = 0x401A30\nsize = 0x35\n\n[[func]]\nname = \"DDErrMsg\"\naddr = 0x401A65\nsize = 0x23\n\n[[func]]\nname = \"DSErrMsg\"\naddr = 0x401A88\nsize = 0x23\n\n[[func]]\nname = \"center_window\"\naddr = 0x401AAB\nsize = 0x92\n\n[[func]]\nname = \"ErrDlg\"\naddr = 0x401B3D\nsize = 0x8D\n\n[[func]]\nname = \"FuncDlg\"\naddr = 0x401BCA\nsize = 0x45\n\n[[func]]\nname = \"TextDlg\"\naddr = 0x401C0F\nsize = 0x1F\n\n[[func]]\nname = \"ErrOkDlg\"\naddr = 0x401C2E\nsize = 0x6E\n\n[[func]]\nname = \"FileErrDlg\"\naddr = 0x401C9C\nsize = 0x45\n\n[[func]]\nname = \"DiskFreeDlg\"\naddr = 0x401CE1\nsize = 0x3C\n\n[[func]]\nname = \"InsertCDDlg\"\naddr = 0x401D1D\nsize = 0x4B\n\n[[func]]\nname = \"DirErrorDlg\"\naddr = 0x401D68\nsize = 0x3C\n\n[[func]]\nname = \"InitAutomapOnce\"\naddr = 0x401DA4\nsize = 0x44\n\n[[func]]\nname = \"InitAutomap\"\naddr = 0x401DE8\nsize = 0x10C\n\n[[func]]\nname = \"StartAutomap\"\naddr = 0x401EF4\nsize = 0x19\n\n[[func]]\nname = \"AutomapUp\"\naddr = 0x401F0D\nsize = 0xD\n\n[[func]]\nname = \"AutomapDown\"\naddr = 0x401F1A\nsize = 0xD\n\n[[func]]\nname = \"AutomapLeft\"\naddr = 0x401F27\nsize = 0xD\n\n[[func]]\nname = \"AutomapRight\"\naddr = 0x401F34\nsize = 0xD\n\n[[func]]\nname = \"AutomapZoomIn\"\naddr = 0x401F41\nsize = 0x3F\n\n[[func]]\nname = \"AutomapZoomOut\"\naddr = 0x401F80\nsize = 0x3D\n\n[[func]]\nname = \"DrawAutomap\"\naddr = 0x401FBD\nsize = 0x276\n\n[[func]]\nname = \"DrawAutomapTile\"\naddr = 0x402233\nsize = 0x745\n\n[[func]]\nname = \"DrawAutomapPlr\"\naddr = 0x4029A8\nsize = 0x3BB\n\n[[func]]\nname = \"GetAutomapType\"\naddr = 0x402D83\nsize = 0xC7\n\n[[func]]\nname = \"DrawAutomapText\"\naddr = 0x402E4A\nsize = 0xDD\n\n[[func]]\nname = \"SetAutomapView\"\naddr = 0x402F27\nsize = 0x1B6\n\n[[func]]\nname = \"AutomapZoomReset\"\naddr = 0x4030DD\nsize = 0x3E\n\n[[func]]\nname = \"CaptureScreen\"\naddr = 0x40311B\nsize = 0xE9\n\n[[func]]\nname = \"CaptureHdr\"\naddr = 0x403204\nsize = 0x90\n\n[[func]]\nname = \"CapturePal\"\naddr = 0x403294\nsize = 0x69\n\n[[func]]\nname = \"CapturePix\"\naddr = 0x4032FD\nsize = 0x6D\n\n[[func]]\nname = \"CaptureEnc\"\naddr = 0x40336A\nsize = 0x3E\n\n[[func]]\nname = \"CaptureFile\"\naddr = 0x4033A8\nsize = 0xC8\n\n[[func]]\nname = \"RedPalette\"\naddr = 0x403470\nsize = 0x69\n\n[[func]]\nname = \"codec_decode\"\naddr = 0x4034D9\nsize = 0xFD\n\n[[func]]\nname = \"codec_init_key\"\naddr = 0x4035DB\nsize = 0xD1\n\n[[func]]\nname = \"codec_get_encoded_len\"\naddr = 0x4036AC\nsize = 0x12\n\n[[func]]\nname = \"codec_encode\"\naddr = 0x4036BE\nsize = 0x116\n\n[[func]]\nname = \"DrawSpellCel\"\naddr = 0x4037D4\nsize = 0xAA\n\n[[func]]\nname = \"SetSpellTrans\"\naddr = 0x40387E\nsize = 0x149\n\n[[func]]\nname = \"DrawSpell\"\naddr = 0x4039C7\nsize = 0xC7\n\n[[func]]\nname = \"DrawSpellList\"\naddr = 0x403A8E\nsize = 0x4DB\n\n[[func]]\nname = \"SetSpell\"\naddr = 0x403F69\nsize = 0x43\n\n[[func]]\nname = \"SetSpeedSpell\"\naddr = 0x403FAC\nsize = 0x6B\n\n[[func]]\nname = \"ToggleSpell\"\naddr = 0x404017\nsize = 0xC3\n\n[[func]]\nname = \"PrintChar\"\naddr = 0x4040DA\nsize = 0x13E\n\n[[func]]\nname = \"AddPanelString\"\naddr = 0x404218\nsize = 0x32\n\n[[func]]\nname = \"ClearPanel\"\naddr = 0x40424A\nsize = 0xF\n\n[[func]]\nname = \"DrawPanelBox\"\naddr = 0x404259\nsize = 0x6C\n\n[[func]]\nname = \"SetFlaskHeight\"\naddr = 0x4042CA\nsize = 0x51\n\n[[func]]\nname = \"DrawFlask\"\naddr = 0x40431B\nsize = 0x40\n\n[[func]]\nname = \"DrawLifeFlask\"\naddr = 0x40435B\nsize = 0x99\n\n[[func]]\nname = \"UpdateLifeFlask\"\naddr = 0x4043F4\nsize = 0x81\n\n[[func]]\nname = \"DrawManaFlask\"\naddr = 0x404475\nsize = 0x81\n\n[[func]]\nname = \"control_update_life_mana\"\naddr = 0x4044F6\nsize = 0x74\n\n[[func]]\nname = \"UpdateManaFlask\"\naddr = 0x40456A\nsize = 0xAC\n\n[[func]]\nname = \"InitControlPan\"\naddr = 0x404616\nsize = 0x2FC\n\n[[func]]\nname = \"DrawCtrlPan\"\naddr = 0x404912\nsize = 0x25\n\n[[func]]\nname = \"DrawCtrlBtns\"\naddr = 0x404937\nsize = 0xB1\n\n[[func]]\nname = \"DoSpeedBook\"\naddr = 0x4049E8\nsize = 0x148\n\n[[func]]\nname = \"DoPanBtn\"\naddr = 0x404B30\nsize = 0x99\n\n[[func]]\nname = \"control_set_button_down\"\naddr = 0x404BC9\nsize = 0x15\n\n[[func]]\nname = \"control_check_btn_press\"\naddr = 0x404BDE\nsize = 0x74\n\n[[func]]\nname = \"DoAutoMap\"\naddr = 0x404C52\nsize = 0x2C\n\n[[func]]\nname = \"CheckPanelInfo\"\naddr = 0x404C7E\nsize = 0x344\n\n[[func]]\nname = \"CheckBtnUp\"\naddr = 0x404FC2\nsize = 0x17D\n\n[[func]]\nname = \"FreeControlPan\"\naddr = 0x40515F\nsize = 0x114\n\n[[func]]\nname = \"control_WriteStringToBuffer\"\naddr = 0x405273\nsize = 0x33\n\n[[func]]\nname = \"DrawInfoBox\"\naddr = 0x4052A6\nsize = 0x289\n\n[[func]]\nname = \"PrintInfo\"\naddr = 0x40552F\nsize = 0x6B\n\n[[func]]\nname = \"CPrintString\"\naddr = 0x40559A\nsize = 0xC5\n\n[[func]]\nname = \"PrintGameStr\"\naddr = 0x40565F\nsize = 0x57\n\n[[func]]\nname = \"DrawChr\"\naddr = 0x4056B6\nsize = 0x968\n\n[[func]]\nname = \"ADD_PlrStringXY\"\naddr = 0x40601E\nsize = 0xB7\n\n[[func]]\nname = \"MY_PlrStringXY\"\naddr = 0x4060D5\nsize = 0xBB\n\n[[func]]\nname = \"CheckLvlBtn\"\naddr = 0x406190\nsize = 0x36\n\n[[func]]\nname = \"ReleaseLvlBtn\"\naddr = 0x4061C6\nsize = 0x34\n\n[[func]]\nname = \"DrawLevelUpIcon\"\naddr = 0x4061FA\nsize = 0x46\n\n[[func]]\nname = \"CheckChrBtns\"\naddr = 0x406240\nsize = 0xEC\n\n[[func]]\nname = \"ReleaseChrBtns\"\naddr = 0x40632C\nsize = 0xA2\n\n[[func]]\nname = \"DrawDurIcon\"\naddr = 0x4063CE\nsize = 0x86\n\n[[func]]\nname = \"DrawDurIcon4Item\"\naddr = 0x406454\nsize = 0x7A\n\n[[func]]\nname = \"RedBack\"\naddr = 0x4064CE\nsize = 0x8A\n\n[[func]]\nname = \"GetSBookTrans\"\naddr = 0x406558\nsize = 0xD5\n\n[[func]]\nname = \"DrawSpellBook\"\naddr = 0x40662D\nsize = 0x28D\n\n[[func]]\nname = \"PrintSBookStr\"\naddr = 0x4068BA\nsize = 0xC2\n\n[[func]]\nname = \"CheckSBook\"\naddr = 0x40697C\nsize = 0x142\n\n[[func]]\nname = \"get_pieces_str\"\naddr = 0x406ABE\nsize = 0x10\n\n[[func]]\nname = \"DrawGoldSplit\"\naddr = 0x406ACE\nsize = 0x138\n\n[[func]]\nname = \"control_drop_gold\"\naddr = 0x406C06\nsize = 0x12E\n\n[[func]]\nname = \"control_remove_gold\"\naddr = 0x406D34\nsize = 0xB6\n\n[[func]]\nname = \"control_set_gold_curs\"\naddr = 0x406DEA\nsize = 0x46\n\n[[func]]\nname = \"DrawTalkPan\"\naddr = 0x406E30\nsize = 0x207\n\n[[func]]\nname = \"control_print_talk_msg\"\naddr = 0x407037\nsize = 0x82\n\n[[func]]\nname = \"control_check_talk_btn\"\naddr = 0x4070B9\nsize = 0x5A\n\n[[func]]\nname = \"control_release_talk_btn\"\naddr = 0x407113\nsize = 0x73\n\n[[func]]\nname = \"control_reset_talk_msg\"\naddr = 0x407186\nsize = 0x3A\n\n[[func]]\nname = \"control_type_message\"\naddr = 0x4071C0\nsize = 0x47\n\n[[func]]\nname = \"control_reset_talk\"\naddr = 0x407207\nsize = 0x19\n\n[[func]]\nname = \"control_talk_last_key\"\naddr = 0x407220\nsize = 0x40\n\n[[func]]\nname = \"control_presskeys\"\naddr = 0x407260\nsize = 0x6A\n\n[[func]]\nname = \"control_press_enter\"\naddr = 0x4072CA\nsize = 0xBE\n\n[[func]]\nname = \"control_up_down\"\naddr = 0x407388\nsize = 0x48\n\n[[func]]\nname = \"InitCursor\"\naddr = 0x4073D0\nsize = 0x16\n\n[[func]]\nname = \"FreeCursor\"\naddr = 0x4073E6\nsize = 0x17\n\n[[func]]\nname = \"SetICursor\"\naddr = 0x4073FD\nsize = 0x34\n\n[[func]]\nname = \"SetCursor_\"\naddr = 0x407431\nsize = 0x23\n\n[[func]]\nname = \"NewCursor\"\naddr = 0x407454\nsize = 0x5\n\n[[func]]\nname = \"InitLevelCursor\"\naddr = 0x407459\nsize = 0x3D\n\n[[func]]\nname = \"CheckTown\"\naddr = 0x407496\nsize = 0x12D\n\n[[func]]\nname = \"CheckRportal\"\naddr = 0x4075C3\nsize = 0x12C\n\n[[func]]\nname = \"CheckCursMove\"\naddr = 0x4076EF\nsize = 0xD7D\n\n[[func]]\nname = \"InitDead\"\naddr = 0x40846C\nsize = 0x1B6\n\n[[func]]\nname = \"AddDead\"\naddr = 0x408622\nsize = 0x21\n\n[[func]]\nname = \"SyncUniqDead\"\naddr = 0x408643\nsize = 0x77\n\n[[func]]\nname = \"LoadDebugGFX\"\naddr = 0x4086BA\nsize = 0x1B\n\n[[func]]\nname = \"FreeDebugGFX\"\naddr = 0x4086D5\nsize = 0x12\n\n[[func]]\nname = \"CheckDungeonClear\"\naddr = 0x4086E7\nsize = 0x90\n\n[[func]]\nname = \"FreeGameMem\"\naddr = 0x408787\nsize = 0x77\n\n[[func]]\nname = \"StartGame\"\naddr = 0x4087FE\nsize = 0xAA\n\n[[func]]\nname = \"run_game_loop\"\naddr = 0x4088A8\nsize = 0x1AA\n\n[[func]]\nname = \"start_game\"\naddr = 0x408A52\nsize = 0x4F\n\n[[func]]\nname = \"free_game\"\naddr = 0x408AA1\nsize = 0x43\n\n[[func]]\nname = \"diablo_get_not_running\"\naddr = 0x408AE4\nsize = 0x2C\n\n[[func]]\nname = \"WinMain\"\naddr = 0x408B10\nsize = 0x11A\n\n[[func]]\nname = \"diablo_parse_flags\"\naddr = 0x408C2A\nsize = 0xB0\n\n[[func]]\nname = \"diablo_init_screen\"\naddr = 0x408CDA\nsize = 0x50\n\n[[func]]\nname = \"diablo_find_window\"\naddr = 0x408D2A\nsize = 0x43\n\n[[func]]\nname = \"diablo_reload_process\"\naddr = 0x408D6D\nsize = 0x1DB\n\n[[func]]\nname = \"PressEscKey\"\naddr = 0x408F48\nsize = 0x8F\n\n[[func]]\nname = \"DisableInputWndProc\"\naddr = 0x408FD7\nsize = 0xD3\n\n[[func]]\nname = \"GM_Game\"\naddr = 0x4090AA\nsize = 0x281\n\n[[func]]\nname = \"LeftMouseDown\"\naddr = 0x40932B\nsize = 0x1F3\n\n[[func]]\nname = \"LeftMouseCmd\"\naddr = 0x40951E\nsize = 0x247\n\n[[func]]\nname = \"TryIconCurs\"\naddr = 0x409765\nsize = 0x177\n\n[[func]]\nname = \"LeftMouseUp\"\naddr = 0x4098DC\nsize = 0x45\n\n[[func]]\nname = \"RightMouseDown\"\naddr = 0x409921\nsize = 0xE1\n\n[[func]]\nname = \"PressSysKey\"\naddr = 0x409A07\nsize = 0x22\n\n[[func]]\nname = \"diablo_hotkey_msg\"\naddr = 0x409A29\nsize = 0xA1\n\n[[func]]\nname = \"ReleaseKey\"\naddr = 0x409ACA\nsize = 0xB\n\n[[func]]\nname = \"PressKey\"\naddr = 0x409AD5\nsize = 0x3E7\n\n[[func]]\nname = \"diablo_pause_game\"\naddr = 0x409EBC\nsize = 0x3C\n\n[[func]]\nname = \"PressChar\"\naddr = 0x409EF8\nsize = 0x364\n\n[[func]]\nname = \"LoadLvlGFX\"\naddr = 0x40A30A\nsize = 0x95\n\n[[func]]\nname = \"LoadAllGFX\"\naddr = 0x40A39F\nsize = 0x2D\n\n[[func]]\nname = \"CreateLevel\"\naddr = 0x40A3CC\nsize = 0x50\n\n[[func]]\nname = \"LoadGameLevel\"\naddr = 0x40A41C\nsize = 0x445\n\n[[func]]\nname = \"game_loop\"\naddr = 0x40A861\nsize = 0x50\n\n[[func]]\nname = \"game_logic\"\naddr = 0x40A8B1\nsize = 0xB4\n\n[[func]]\nname = \"timeout_cursor\"\naddr = 0x40A965\nsize = 0x84\n\n[[func]]\nname = \"diablo_color_cyc_logic\"\naddr = 0x40A9E9\nsize = 0x42\n\n[[func]]\nname = \"doom_get_frame_from_time\"\naddr = 0x40AA2B\nsize = 0x19\n\n[[func]]\nname = \"doom_alloc_cel\"\naddr = 0x40AA44\nsize = 0x10\n\n[[func]]\nname = \"doom_cleanup\"\naddr = 0x40AA54\nsize = 0x12\n\n[[func]]\nname = \"doom_load_graphics\"\naddr = 0x40AA66\nsize = 0x4C\n\n[[func]]\nname = \"doom_init\"\naddr = 0x40AAB2\nsize = 0x2A\n\n[[func]]\nname = \"doom_close\"\naddr = 0x40AADC\nsize = 0x16\n\n[[func]]\nname = \"doom_draw\"\naddr = 0x40AAF2\nsize = 0x62\n\n[[func]]\nname = \"DRLG_Init_Globals\"\naddr = 0x40AB54\nsize = 0xA3\n\n[[func]]\nname = \"DRLG_L1Floor\"\naddr = 0x40ABF7\nsize = 0x4E\n\n[[func]]\nname = \"DRLG_L1Pass3\"\naddr = 0x40AC45\nsize = 0xF2\n\n[[func]]\nname = \"DRLG_InitL1Vals\"\naddr = 0x40AD37\nsize = 0xBB\n\n[[func]]\nname = \"CreateL5Dungeon\"\naddr = 0x40ADF2\nsize = 0x4D\n\n[[func]]\nname = \"DRLG_LoadL1SP\"\naddr = 0x40AE3F\nsize = 0x7E\n\n[[func]]\nname = \"DRLG_FreeL1SP\"\naddr = 0x40AEBD\nsize = 0x12\n\n[[func]]\nname = \"DRLG_L5\"\naddr = 0x40AECF\nsize = 0x269\n\n[[func]]\nname = \"DRLG_PlaceDoor\"\naddr = 0x40B138\nsize = 0x12A\n\n[[func]]\nname = \"DRLG_L1Shadows\"\naddr = 0x40B262\nsize = 0x1E8\n\n[[func]]\nname = \"DRLG_PlaceMiniSet\"\naddr = 0x40B44A\nsize = 0x275\n\n[[func]]\nname = \"InitL5Dungeon\"\naddr = 0x40B6BF\nsize = 0x22\n\n[[func]]\nname = \"L5ClearFlags\"\naddr = 0x40B6E1\nsize = 0x1B\n\n[[func]]\nname = \"L5firstRoom\"\naddr = 0x40B6FC\nsize = 0x233\n\n[[func]]\nname = \"L5drawRoom\"\naddr = 0x40B92F\nsize = 0x37\n\n[[func]]\nname = \"L5roomGen\"\naddr = 0x40B966\nsize = 0x207\n\n[[func]]\nname = \"L5checkRoom\"\naddr = 0x40BB6D\nsize = 0x64\n\n[[func]]\nname = \"L5GetArea\"\naddr = 0x40BBD1\nsize = 0x22\n\n[[func]]\nname = \"L5makeDungeon\"\naddr = 0x40BBF3\nsize = 0x44\n\n[[func]]\nname = \"L5makeDmt\"\naddr = 0x40BC37\nsize = 0x72\n\n[[func]]\nname = \"L5AddWall\"\naddr = 0x40BCA9\nsize = 0x15C\n\n[[func]]\nname = \"L5HWallOk\"\naddr = 0x40BE05\nsize = 0xA0\n\n[[func]]\nname = \"L5VWallOk\"\naddr = 0x40BEA5\nsize = 0x7F\n\n[[func]]\nname = \"L5HorizWall\"\naddr = 0x40BF24\nsize = 0xEE\n\n[[func]]\nname = \"L5VertWall\"\naddr = 0x40C012\nsize = 0x108\n\n[[func]]\nname = \"L5tileFix\"\naddr = 0x40C11A\nsize = 0x36F\n\n[[func]]\nname = \"DRLG_L5Subs\"\naddr = 0x40C489\nsize = 0xDD\n\n[[func]]\nname = \"L5FillChambers\"\naddr = 0x40C566\nsize = 0x3E9\n\n[[func]]\nname = \"DRLG_L5GChamber\"\naddr = 0x40C94F\nsize = 0x141\n\n[[func]]\nname = \"DRLG_L5GHall\"\naddr = 0x40CA90\nsize = 0x50\n\n[[func]]\nname = \"DRLG_L5SetRoom\"\naddr = 0x40CAE0\nsize = 0x85\n\n[[func]]\nname = \"DRLG_L5FloodTVal\"\naddr = 0x40CB65\nsize = 0x6F\n\n[[func]]\nname = \"DRLG_L5FTVR\"\naddr = 0x40CBD4\nsize = 0x1F0\n\n[[func]]\nname = \"DRLG_L5TransFix\"\naddr = 0x40CDC4\nsize = 0x88\n\n[[func]]\nname = \"DRLG_L5DirtFix\"\naddr = 0x40CE4C\nsize = 0x6C\n\n[[func]]\nname = \"DRLG_L5CornerFix\"\naddr = 0x40CEB8\nsize = 0x68\n\n[[func]]\nname = \"dthread_remove_player\"\naddr = 0x40CF5E\nsize = 0x33\n\n[[func]]\nname = \"dthread_send_delta\"\naddr = 0x40CF91\nsize = 0x7D\n\n[[func]]\nname = \"dthread_start\"\naddr = 0x40D00E\nsize = 0x6D\n\n[[func]]\nname = \"dthread_handler\"\naddr = 0x40D07B\nsize = 0xCD\n\n[[func]]\nname = \"dthread_cleanup\"\naddr = 0x40D148\nsize = 0xA2\n\n[[func]]\nname = \"dx_init\"\naddr = 0x40D228\nsize = 0x115\n\n[[func]]\nname = \"dx_create_back_buffer\"\naddr = 0x40D33D\nsize = 0x10D\n\n[[func]]\nname = \"dx_create_primary_surface\"\naddr = 0x40D44A\nsize = 0x58\n\n[[func]]\nname = \"dx_DirectDrawCreate\"\naddr = 0x40D4A2\nsize = 0x7B\n\n[[func]]\nname = \"lock_buf\"\naddr = 0x40D51D\nsize = 0x5\n\n[[func]]\nname = \"lock_buf_priv\"\naddr = 0x40D522\nsize = 0x86\n\n[[func]]\nname = \"unlock_buf\"\naddr = 0x40D5A8\nsize = 0x5\n\n[[func]]\nname = \"unlock_buf_priv\"\naddr = 0x40D5AD\nsize = 0x7B\n\n[[func]]\nname = \"dx_cleanup\"\naddr = 0x40D628\nsize = 0xA8\n\n[[func]]\nname = \"dx_reinit\"\naddr = 0x40D6D0\nsize = 0x5C\n\n[[func]]\nname = \"effect_is_playing\"\naddr = 0x40D741\nsize = 0x29\n\n[[func]]\nname = \"stream_stop\"\naddr = 0x40D76A\nsize = 0x29\n\n[[func]]\nname = \"InitMonsterSND\"\naddr = 0x40D793\nsize = 0xD0\n\n[[func]]\nname = \"FreeMonsterSnd\"\naddr = 0x40D863\nsize = 0x6A\n\n[[func]]\nname = \"PlayEffect\"\naddr = 0x40D8CD\nsize = 0x9C\n\n[[func]]\nname = \"calc_snd_position\"\naddr = 0x40D969\nsize = 0x78\n\n[[func]]\nname = \"PlaySFX\"\naddr = 0x40D9E1\nsize = 0x18\n\n[[func]]\nname = \"PlaySFX_priv\"\naddr = 0x40D9F9\nsize = 0xB9\n\n[[func]]\nname = \"stream_play\"\naddr = 0x40DAB2\nsize = 0x6D\n\n[[func]]\nname = \"RndSFX\"\naddr = 0x40DB1F\nsize = 0x52\n\n[[func]]\nname = \"PlaySfxLoc\"\naddr = 0x40DB71\nsize = 0x38\n\n[[func]]\nname = \"sound_stop\"\naddr = 0x40DBA9\nsize = 0x61\n\n[[func]]\nname = \"sfx_stop\"\naddr = 0x40DC0A\nsize = 0x20\n\n[[func]]\nname = \"sound_update\"\naddr = 0x40DC2A\nsize = 0x16\n\n[[func]]\nname = \"stream_update\"\naddr = 0x40DC40\nsize = 0x2F\n\n[[func]]\nname = \"effects_cleanup_sfx\"\naddr = 0x40DC6F\nsize = 0x2B\n\n[[func]]\nname = \"sound_init\"\naddr = 0x40DC9A\nsize = 0x4D\n\n[[func]]\nname = \"priv_sound_init\"\naddr = 0x40DCE7\nsize = 0x61\n\n[[func]]\nname = \"ui_sound_init\"\naddr = 0x40DD48\nsize = 0x7\n\n[[func]]\nname = \"effects_play_sound\"\naddr = 0x40DD4F\nsize = 0x64\n\n[[func]]\nname = \"Decrypt\"\naddr = 0x40DDB3\nsize = 0x4C\n\n[[func]]\nname = \"Encrypt\"\naddr = 0x40DDFF\nsize = 0x50\n\n[[func]]\nname = \"Hash\"\naddr = 0x40DE4F\nsize = 0x4F\n\n[[func]]\nname = \"InitHash\"\naddr = 0x40DE9E\nsize = 0x6F\n\n[[func]]\nname = \"PkwareCompress\"\naddr = 0x40DF0D\nsize = 0x96\n\n[[func]]\nname = \"PkwareBufferRead\"\naddr = 0x40DFA3\nsize = 0x34\n\n[[func]]\nname = \"PkwareBufferWrite\"\naddr = 0x40DFD7\nsize = 0x27\n\n[[func]]\nname = \"PkwareDecompress\"\naddr = 0x40DFFE\nsize = 0x6E\n\n[[func]]\nname = \"CelBlit\"\naddr = 0x40E07C\nsize = 0x68\n\n[[func]]\nname = \"CelDraw\"\naddr = 0x40E0E4\nsize = 0x44\n\n[[func]]\nname = \"CelBlitFrame\"\naddr = 0x40E128\nsize = 0x26\n\n[[func]]\nname = \"CelClippedDraw\"\naddr = 0x40E14E\nsize = 0x7B\n\n[[func]]\nname = \"CelClippedBlit\"\naddr = 0x40E1C9\nsize = 0x53\n\n[[func]]\nname = \"CelBlitLight\"\naddr = 0x40E21C\nsize = 0xDC\n\n[[func]]\nname = \"CelBlitLightTrans\"\naddr = 0x40E2F8\nsize = 0xDD\n\n[[func]]\nname = \"CelDrawLight\"\naddr = 0x40E3D5\nsize = 0x58\n\n[[func]]\nname = \"CelClippedDrawLight\"\naddr = 0x40E42D\nsize = 0x8E\n\n[[func]]\nname = \"CelClippedBlitLightTrans\"\naddr = 0x40E4BB\nsize = 0x74\n\n[[func]]\nname = \"CelDrawLightRed\"\naddr = 0x40E52F\nsize = 0x11C\n\n[[func]]\nname = \"CelBlitSafe\"\naddr = 0x40E64B\nsize = 0x7F\n\n[[func]]\nname = \"CelClippedDrawSafe\"\naddr = 0x40E6CA\nsize = 0x7B\n\n[[func]]\nname = \"CelClippedBlitSafe\"\naddr = 0x40E745\nsize = 0x55\n\n[[func]]\nname = \"CelBlitLightSafe\"\naddr = 0x40E79A\nsize = 0xF7\n\n[[func]]\nname = \"CelBlitLightTransSafe\"\naddr = 0x40E891\nsize = 0xF8\n\n[[func]]\nname = \"CelDrawLightSafe\"\naddr = 0x40E989\nsize = 0x90\n\n[[func]]\nname = \"CelClippedBlitLightTransSafe\"\naddr = 0x40EA19\nsize = 0x72\n\n[[func]]\nname = \"CelDrawLightRedSafe\"\naddr = 0x40EA8B\nsize = 0x121\n\n[[func]]\nname = \"CelBlitWidth\"\naddr = 0x40EBAC\nsize = 0x8A\n\n[[func]]\nname = \"CelBlitOutline\"\naddr = 0x40EC36\nsize = 0xFA\n\n[[func]]\nname = \"CelBlitOutlineSafe\"\naddr = 0x40ED30\nsize = 0x12F\n\n[[func]]\nname = \"ENG_set_pixel\"\naddr = 0x40EE5F\nsize = 0x45\n\n[[func]]\nname = \"engine_draw_pixel\"\naddr = 0x40EEA4\nsize = 0x89\n\n[[func]]\nname = \"DrawLine\"\naddr = 0x40EF2D\nsize = 0x3F6\n\n[[func]]\nname = \"GetDirection\"\naddr = 0x40F323\nsize = 0x65\n\n[[func]]\nname = \"SetRndSeed\"\naddr = 0x40F388\nsize = 0x14\n\n[[func]]\nname = \"GetRndSeed\"\naddr = 0x40F39C\nsize = 0x1F\n\n[[func]]\nname = \"random_\"\naddr = 0x40F3BB\nsize = 0x22\n\n[[func]]\nname = \"DiabloAllocPtr\"\naddr = 0x40F40B\nsize = 0x4D\n\n[[func]]\nname = \"mem_free_dbg\"\naddr = 0x40F458\nsize = 0x30\n\n[[func]]\nname = \"LoadFileInMem\"\naddr = 0x40F488\nsize = 0x5B\n\n[[func]]\nname = \"LoadFileWithMem\"\naddr = 0x40F4E3\nsize = 0x5F\n\n[[func]]\nname = \"Cl2ApplyTrans\"\naddr = 0x40F542\nsize = 0x73\n\n[[func]]\nname = \"Cl2Draw\"\naddr = 0x40F5B5\nsize = 0x7A\n\n[[func]]\nname = \"Cl2Blit\"\naddr = 0x40F62F\nsize = 0x88\n\n[[func]]\nname = \"Cl2DrawOutline\"\naddr = 0x40F6B7\nsize = 0x7E\n\n[[func]]\nname = \"Cl2BlitOutline\"\naddr = 0x40F735\nsize = 0xBC\n\n[[func]]\nname = \"Cl2DrawLightTbl\"\naddr = 0x40F7F1\nsize = 0xC3\n\n[[func]]\nname = \"Cl2BlitLight\"\naddr = 0x40F8B4\nsize = 0xA5\n\n[[func]]\nname = \"Cl2DrawLight\"\naddr = 0x40F959\nsize = 0x9A\n\n[[func]]\nname = \"Cl2DrawSafe\"\naddr = 0x40F9F3\nsize = 0x7A\n\n[[func]]\nname = \"Cl2BlitSafe\"\naddr = 0x40FA6D\nsize = 0x9C\n\n[[func]]\nname = \"Cl2DrawOutlineSafe\"\naddr = 0x40FB09\nsize = 0x8F\n\n[[func]]\nname = \"Cl2BlitOutlineSafe\"\naddr = 0x40FB98\nsize = 0xD0\n\n[[func]]\nname = \"Cl2DrawLightTblSafe\"\naddr = 0x40FC68\nsize = 0xC3\n\n[[func]]\nname = \"Cl2BlitLightSafe\"\naddr = 0x40FD2B\nsize = 0xBD\n\n[[func]]\nname = \"Cl2DrawLightSafe\"\naddr = 0x40FDE8\nsize = 0x9A\n\n[[func]]\nname = \"PlayInGameMovie\"\naddr = 0x40FE82\nsize = 0x3C\n\n[[func]]\nname = \"InitDiabloMsg\"\naddr = 0x40FEBE\nsize = 0x41\n\n[[func]]\nname = \"ClrDiabloMsg\"\naddr = 0x40FEFF\nsize = 0x1B\n\n[[func]]\nname = \"DrawDiabloMsg\"\naddr = 0x40FF1A\nsize = 0x203\n\n[[func]]\nname = \"fault_init_filter\"\naddr = 0x410127\nsize = 0xA\n\n[[func]]\nname = \"fault_cleanup_filter_atexit\"\naddr = 0x410131\nsize = 0xC\n\n[[func]]\nname = \"fault_cleanup_filter\"\naddr = 0x41013D\nsize = 0xA\n\n[[func]]\nname = \"TopLevelExceptionFilter\"\naddr = 0x410147\nsize = 0x17E\n\n[[func]]\nname = \"fault_hex_format\"\naddr = 0x4102C5\nsize = 0xC3\n\n[[func]]\nname = \"fault_unknown_module\"\naddr = 0x410388\nsize = 0xE7\n\n[[func]]\nname = \"fault_call_stack\"\naddr = 0x41046F\nsize = 0x89\n\n[[func]]\nname = \"fault_get_error_type\"\naddr = 0x4104F8\nsize = 0x190\n\n[[func]]\nname = \"fault_set_filter\"\naddr = 0x4106AC\nsize = 0x17\n\n[[func]]\nname = \"fault_reset_filter\"\naddr = 0x4106C3\nsize = 0xD\n\n[[func]]\nname = \"fault_get_filter\"\naddr = 0x4106D0\nsize = 0x6\n\n[[func]]\nname = \"gamemenu_on\"\naddr = 0x4106D6\nsize = 0x29\n\n[[func]]\nname = \"gamemenu_update_single\"\naddr = 0x4106FF\nsize = 0x39\n\n[[func]]\nname = \"gamemenu_update_multi\"\naddr = 0x410738\nsize = 0x10\n\n[[func]]\nname = \"gamemenu_off\"\naddr = 0x410748\nsize = 0x9\n\n[[func]]\nname = \"gamemenu_handle_previous\"\naddr = 0x410751\nsize = 0x13\n\n[[func]]\nname = \"gamemenu_previous\"\naddr = 0x410764\nsize = 0x5\n\n[[func]]\nname = \"gamemenu_new_game\"\naddr = 0x410769\nsize = 0x42\n\n[[func]]\nname = \"gamemenu_quit_game\"\naddr = 0x4107AB\nsize = 0xD\n\n[[func]]\nname = \"gamemenu_load_game\"\naddr = 0x4107B8\nsize = 0x76\n\n[[func]]\nname = \"gamemenu_save_game\"\naddr = 0x41082E\nsize = 0x84\n\n[[func]]\nname = \"gamemenu_restart_town\"\naddr = 0x4108B2\nsize = 0xA\n\n[[func]]\nname = \"gamemenu_options\"\naddr = 0x4108BC\nsize = 0x20\n\n[[func]]\nname = \"gamemenu_get_music\"\naddr = 0x4108DC\nsize = 0x19\n\n[[func]]\nname = \"gamemenu_sound_music_toggle\"\naddr = 0x4108F5\nsize = 0x41\n\n[[func]]\nname = \"gamemenu_get_sound\"\naddr = 0x410936\nsize = 0x19\n\n[[func]]\nname = \"gamemenu_get_color_cycling\"\naddr = 0x41094F\nsize = 0x15\n\n[[func]]\nname = \"gamemenu_get_gamma\"\naddr = 0x410964\nsize = 0x26\n\n[[func]]\nname = \"gamemenu_music_volume\"\naddr = 0x41098A\nsize = 0x89\n\n[[func]]\nname = \"gamemenu_slider_music_sound\"\naddr = 0x410A13\nsize = 0xD\n\n[[func]]\nname = \"gamemenu_sound_volume\"\naddr = 0x410A20\nsize = 0x80\n\n[[func]]\nname = \"gamemenu_gamma\"\naddr = 0x410AA0\nsize = 0x2A\n\n[[func]]\nname = \"gamemenu_slider_gamma\"\naddr = 0x410ACA\nsize = 0x10\n\n[[func]]\nname = \"gamemenu_color_cycling\"\naddr = 0x410ADA\nsize = 0x21\n\n[[func]]\nname = \"FillSolidBlockTbls\"\naddr = 0x410AFB\nsize = 0x106\n\n[[func]]\nname = \"MakeSpeedCels\"\naddr = 0x410C01\nsize = 0x42E\n\n[[func]]\nname = \"SortTiles\"\naddr = 0x41102F\nsize = 0x3C\n\n[[func]]\nname = \"SwapTile\"\naddr = 0x41106B\nsize = 0x7F\n\n[[func]]\nname = \"IsometricCoord\"\naddr = 0x4110EA\nsize = 0x48\n\n[[func]]\nname = \"SetSpeedCels\"\naddr = 0x411132\nsize = 0x49\n\n[[func]]\nname = \"SetDungeonMicros\"\naddr = 0x41117B\nsize = 0x13F\n\n[[func]]\nname = \"DRLG_InitTrans\"\naddr = 0x4112BA\nsize = 0x2D\n\n[[func]]\nname = \"DRLG_MRectTrans\"\naddr = 0x4112E7\nsize = 0x59\n\n[[func]]\nname = \"DRLG_RectTrans\"\naddr = 0x411340\nsize = 0x45\n\n[[func]]\nname = \"DRLG_CopyTrans\"\naddr = 0x411385\nsize = 0x1F\n\n[[func]]\nname = \"DRLG_InitSetPC\"\naddr = 0x4113A4\nsize = 0x17\n\n[[func]]\nname = \"DRLG_SetPC\"\naddr = 0x4113BB\nsize = 0x53\n\n[[func]]\nname = \"DRLG_HoldThemeRooms\"\naddr = 0x41140E\nsize = 0x8D\n\n[[func]]\nname = \"SkipThemeRoom\"\naddr = 0x41149B\nsize = 0x52\n\n[[func]]\nname = \"InitLevels\"\naddr = 0x4114ED\nsize = 0x1A\n\n[[func]]\nname = \"gmenu_draw_pause\"\naddr = 0x411507\nsize = 0x33\n\n[[func]]\nname = \"gmenu_print_text\"\naddr = 0x41153A\nsize = 0x59\n\n[[func]]\nname = \"FreeGMenu\"\naddr = 0x411593\nsize = 0x59\n\n[[func]]\nname = \"gmenu_init_menu\"\naddr = 0x4115EC\nsize = 0x78\n\n[[func]]\nname = \"gmenu_is_active\"\naddr = 0x411664\nsize = 0xC\n\n[[func]]\nname = \"gmenu_set_items\"\naddr = 0x411670\nsize = 0x5A\n\n[[func]]\nname = \"gmenu_up_down\"\naddr = 0x4116CA\nsize = 0x68\n\n[[func]]\nname = \"gmenu_draw\"\naddr = 0x411732\nsize = 0x8F\n\n[[func]]\nname = \"gmenu_draw_menu_item\"\naddr = 0x4117C1\nsize = 0xF4\n\n[[func]]\nname = \"gmenu_clear_buffer\"\naddr = 0x4118B5\nsize = 0x39\n\n[[func]]\nname = \"gmenu_get_lfont\"\naddr = 0x4118EE\nsize = 0x3C\n\n[[func]]\nname = \"gmenu_presskeys\"\naddr = 0x41192A\nsize = 0x7C\n\n[[func]]\nname = \"gmenu_left_right\"\naddr = 0x4119A6\nsize = 0x50\n\n[[func]]\nname = \"gmenu_on_mouse_move\"\naddr = 0x4119F6\nsize = 0x58\n\n[[func]]\nname = \"gmenu_get_mouse_slider\"\naddr = 0x411A4E\nsize = 0x2F\n\n[[func]]\nname = \"gmenu_left_mouse\"\naddr = 0x411A7D\nsize = 0xB7\n\n[[func]]\nname = \"gmenu_enable\"\naddr = 0x411B34\nsize = 0xE\n\n[[func]]\nname = \"gmenu_slider_set\"\naddr = 0x411B42\nsize = 0x42\n\n[[func]]\nname = \"gmenu_slider_get\"\naddr = 0x411B84\nsize = 0x3D\n\n[[func]]\nname = \"gmenu_slider_steps\"\naddr = 0x411BC1\nsize = 0xE\n\n[[func]]\nname = \"InitHelp\"\naddr = 0x411BCF\nsize = 0x12\n\n[[func]]\nname = \"DrawHelp\"\naddr = 0x411BE1\nsize = 0x195\n\n[[func]]\nname = \"DrawHelpLine\"\naddr = 0x411D76\nsize = 0x79\n\n[[func]]\nname = \"DisplayHelp\"\naddr = 0x411DEF\nsize = 0x1C\n\n[[func]]\nname = \"HelpScrollUp\"\naddr = 0x411E0B\nsize = 0x10\n\n[[func]]\nname = \"HelpScrollDown\"\naddr = 0x411E1B\nsize = 0x14\n\n[[func]]\nname = \"init_cleanup\"\naddr = 0x411E3F\nsize = 0x89\n\n[[func]]\nname = \"init_run_office_from_start_menu\"\naddr = 0x411EC8\nsize = 0x6D\n\n[[func]]\nname = \"init_run_office\"\naddr = 0x411F35\nsize = 0x173\n\n[[func]]\nname = \"init_disable_screensaver\"\naddr = 0x4120A8\nsize = 0x99\n\n[[func]]\nname = \"init_create_window\"\naddr = 0x412141\nsize = 0x13B\n\n[[func]]\nname = \"init_kill_mom_parent\"\naddr = 0x41227C\nsize = 0x21\n\n[[func]]\nname = \"init_find_mom_parent\"\naddr = 0x41229D\nsize = 0x50\n\n[[func]]\nname = \"init_await_mom_parent_exit\"\naddr = 0x4122ED\nsize = 0x30\n\n[[func]]\nname = \"init_archives\"\naddr = 0x41231D\nsize = 0xB0\n\n[[func]]\nname = \"init_test_access\"\naddr = 0x4123CD\nsize = 0x1B0\n\n[[func]]\nname = \"init_strip_trailing_slash\"\naddr = 0x41257D\nsize = 0x18\n\n[[func]]\nname = \"init_read_test_file\"\naddr = 0x412595\nsize = 0x94\n\n[[func]]\nname = \"init_get_file_info\"\naddr = 0x412629\nsize = 0x9E\n\n[[func]]\nname = \"MainWndProc\"\naddr = 0x4126C7\nsize = 0x99\n\n[[func]]\nname = \"init_activate_window\"\naddr = 0x412760\nsize = 0x5A\n\n[[func]]\nname = \"WindowProc\"\naddr = 0x4127BA\nsize = 0x25\n\n[[func]]\nname = \"SetWindowProc\"\naddr = 0x4127DF\nsize = 0xC\n\n[[func]]\nname = \"interface_msg_pump\"\naddr = 0x4127FB\nsize = 0x3F\n\n[[func]]\nname = \"IncProgress\"\naddr = 0x41283A\nsize = 0x39\n\n[[func]]\nname = \"DrawCutscene\"\naddr = 0x412873\nsize = 0x75\n\n[[func]]\nname = \"DrawProgress\"\naddr = 0x4128E8\nsize = 0x29\n\n[[func]]\nname = \"ShowProgress\"\naddr = 0x412911\nsize = 0x317\n\n[[func]]\nname = \"FreeInterface\"\naddr = 0x412C50\nsize = 0x12\n\n[[func]]\nname = \"InitCutscene\"\naddr = 0x412C62\nsize = 0x1E5\n\n[[func]]\nname = \"FreeInvGFX\"\naddr = 0x412E6F\nsize = 0x12\n\n[[func]]\nname = \"InitInv\"\naddr = 0x412E81\nsize = 0x34\n\n[[func]]\nname = \"InvDrawSlotBack\"\naddr = 0x412EB5\nsize = 0x53\n\n[[func]]\nname = \"DrawInv\"\naddr = 0x412F08\nsize = 0x79C\n\n[[func]]\nname = \"DrawInvBelt\"\naddr = 0x4136A4\nsize = 0x1DF\n\n[[func]]\nname = \"AutoPlace\"\naddr = 0x413883\nsize = 0x134\n\n[[func]]\nname = \"SpecialAutoPlace\"\naddr = 0x4139B7\nsize = 0x16D\n\n[[func]]\nname = \"GoldAutoPlace\"\naddr = 0x413B24\nsize = 0x1C9\n\n[[func]]\nname = \"WeaponAutoPlace\"\naddr = 0x413CED\nsize = 0x9D\n\n[[func]]\nname = \"SwapItem\"\naddr = 0x413D8A\nsize = 0x3D\n\n[[func]]\nname = \"CheckInvPaste\"\naddr = 0x413DC7\nsize = 0xB14\n\n[[func]]\nname = \"CheckInvSwap\"\naddr = 0x4148FB\nsize = 0xA9\n\n[[func]]\nname = \"CheckInvCut\"\naddr = 0x4149A4\nsize = 0x373\n\n[[func]]\nname = \"inv_update_rem_item\"\naddr = 0x414D17\nsize = 0x37\n\n[[func]]\nname = \"RemoveInvItem\"\naddr = 0x414D4E\nsize = 0xEE\n\n[[func]]\nname = \"RemoveSpdBarItem\"\naddr = 0x414E3C\nsize = 0x5C\n\n[[func]]\nname = \"CheckInvItem\"\naddr = 0x414E98\nsize = 0x27\n\n[[func]]\nname = \"CheckInvScrn\"\naddr = 0x414EBF\nsize = 0x2C\n\n[[func]]\nname = \"CheckItemStats\"\naddr = 0x414EEB\nsize = 0x4C\n\n[[func]]\nname = \"CheckBookLevel\"\naddr = 0x414F37\nsize = 0x74\n\n[[func]]\nname = \"CheckQuestItem\"\naddr = 0x414FAB\nsize = 0x7B\n\n[[func]]\nname = \"InvGetItem\"\naddr = 0x415026\nsize = 0x119\n\n[[func]]\nname = \"AutoGetItem\"\naddr = 0x41513F\nsize = 0x43B\n\n[[func]]\nname = \"FindGetItem\"\naddr = 0x41557A\nsize = 0x55\n\n[[func]]\nname = \"SyncGetItem\"\naddr = 0x4155CF\nsize = 0xCA\n\n[[func]]\nname = \"CanPut\"\naddr = 0x415699\nsize = 0xD7\n\n[[func]]\nname = \"TryInvPut\"\naddr = 0x415770\nsize = 0xC3\n\n[[func]]\nname = \"DrawInvMsg\"\naddr = 0x415833\nsize = 0x28\n\n[[func]]\nname = \"InvPutItem\"\naddr = 0x41585B\nsize = 0x255\n\n[[func]]\nname = \"SyncPutItem\"\naddr = 0x415AB0\nsize = 0x2A4\n\n[[func]]\nname = \"CheckInvHLight\"\naddr = 0x415D54\nsize = 0x20D\n\n[[func]]\nname = \"RemoveScroll\"\naddr = 0x415F61\nsize = 0xA1\n\n[[func]]\nname = \"UseScroll\"\naddr = 0x416002\nsize = 0xB7\n\n[[func]]\nname = \"UseStaffCharge\"\naddr = 0x4160B9\nsize = 0x3D\n\n[[func]]\nname = \"UseStaff\"\naddr = 0x4160F6\nsize = 0x44\n\n[[func]]\nname = \"StartGoldDrop\"\naddr = 0x41613A\nsize = 0x66\n\n[[func]]\nname = \"UseInvItem\"\naddr = 0x4161A0\nsize = 0x1F5\n\n[[func]]\nname = \"DoTelekinesis\"\naddr = 0x416395\nsize = 0x72\n\n[[func]]\nname = \"CalculateGold\"\naddr = 0x416407\nsize = 0x55\n\n[[func]]\nname = \"DropItemBeforeTrig\"\naddr = 0x41645C\nsize = 0x2E\n\n[[func]]\nname = \"InitItemGFX\"\naddr = 0x41648A\nsize = 0x52\n\n[[func]]\nname = \"ItemPlace\"\naddr = 0x4164DC\nsize = 0x52\n\n[[func]]\nname = \"AddInitItems\"\naddr = 0x41652E\nsize = 0x114\n\n[[func]]\nname = \"InitItems\"\naddr = 0x416642\nsize = 0xD2\n\n[[func]]\nname = \"CalcPlrItemVals\"\naddr = 0x416714\nsize = 0x60E\n\n[[func]]\nname = \"CalcPlrScrolls\"\naddr = 0x416D22\nsize = 0xF7\n\n[[func]]\nname = \"CalcPlrStaff\"\naddr = 0x416E19\nsize = 0x4D\n\n[[func]]\nname = \"CalcSelfItems\"\naddr = 0x416E66\nsize = 0xFA\n\n[[func]]\nname = \"CalcPlrItemMin\"\naddr = 0x416F60\nsize = 0x65\n\n[[func]]\nname = \"ItemMinStats\"\naddr = 0x416FC5\nsize = 0x36\n\n[[func]]\nname = \"CalcPlrBookVals\"\naddr = 0x416FFB\nsize = 0x112\n\n[[func]]\nname = \"CalcPlrInv\"\naddr = 0x41710D\nsize = 0x5A\n\n[[func]]\nname = \"SetPlrHandItem\"\naddr = 0x417167\nsize = 0x100\n\n[[func]]\nname = \"GetPlrHandSeed\"\naddr = 0x417267\nsize = 0xC\n\n[[func]]\nname = \"GetGoldSeed\"\naddr = 0x417273\nsize = 0x72\n\n[[func]]\nname = \"SetPlrHandSeed\"\naddr = 0x4172E5\nsize = 0x3\n\n[[func]]\nname = \"SetPlrHandGoldCurs\"\naddr = 0x4172E8\nsize = 0x35\n\n[[func]]\nname = \"CreatePlrItems\"\naddr = 0x41731D\nsize = 0x14E\n\n[[func]]\nname = \"ItemSpaceOk\"\naddr = 0x41746B\nsize = 0xFA\n\n[[func]]\nname = \"GetItemSpace\"\naddr = 0x417565\nsize = 0xF6\n\n[[func]]\nname = \"GetSuperItemSpace\"\naddr = 0x41765B\nsize = 0x8E\n\n[[func]]\nname = \"GetSuperItemLoc\"\naddr = 0x4176E9\nsize = 0x6A\n\n[[func]]\nname = \"CalcItemValue\"\naddr = 0x417753\nsize = 0x4C\n\n[[func]]\nname = \"GetBookSpell\"\naddr = 0x41779F\nsize = 0xF0\n\n[[func]]\nname = \"GetStaffPower\"\naddr = 0x41788F\nsize = 0x1D1\n\n[[func]]\nname = \"GetStaffSpell\"\naddr = 0x417A60\nsize = 0x171\n\n[[func]]\nname = \"GetItemAttrs\"\naddr = 0x417BD1\nsize = 0x2CD\n\n[[func]]\nname = \"RndPL\"\naddr = 0x417E9E\nsize = 0x11\n\n[[func]]\nname = \"PLVal\"\naddr = 0x417EAF\nsize = 0x40\n\n[[func]]\nname = \"SaveItemPower\"\naddr = 0x417EEF\nsize = 0x947\n\n[[func]]\nname = \"GetItemPower\"\naddr = 0x418976\nsize = 0x32D\n\n[[func]]\nname = \"GetItemBonus\"\naddr = 0x418CA3\nsize = 0x7C\n\n[[func]]\nname = \"SetupItem\"\naddr = 0x418D48\nsize = 0x8A\n\n[[func]]\nname = \"RndItem\"\naddr = 0x418DD2\nsize = 0xE7\n\n[[func]]\nname = \"RndUItem\"\naddr = 0x418EB9\nsize = 0xF8\n\n[[func]]\nname = \"RndAllItems\"\naddr = 0x418FB1\nsize = 0x8D\n\n[[func]]\nname = \"RndTypeItems\"\naddr = 0x41903E\nsize = 0x8A\n\n[[func]]\nname = \"CheckUnique\"\naddr = 0x4190C8\nsize = 0xD0\n\n[[func]]\nname = \"GetUniqueItem\"\naddr = 0x419198\nsize = 0x14B\n\n[[func]]\nname = \"SpawnUnique\"\naddr = 0x4192E3\nsize = 0x8A\n\n[[func]]\nname = \"ItemRndDur\"\naddr = 0x41936D\nsize = 0x3E\n\n[[func]]\nname = \"SetupAllItems\"\naddr = 0x4193AB\nsize = 0x156\n\n[[func]]\nname = \"SpawnItem\"\naddr = 0x419501\nsize = 0x116\n\n[[func]]\nname = \"CreateItem\"\naddr = 0x419617\nsize = 0x9B\n\n[[func]]\nname = \"CreateRndItem\"\naddr = 0x4196B2\nsize = 0xA5\n\n[[func]]\nname = \"SetupAllUseful\"\naddr = 0x419757\nsize = 0x6D\n\n[[func]]\nname = \"CreateRndUseful\"\naddr = 0x4197C4\nsize = 0x69\n\n[[func]]\nname = \"CreateTypeItem\"\naddr = 0x41982D\nsize = 0xA4\n\n[[func]]\nname = \"RecreateItem\"\naddr = 0x4198D1\nsize = 0x112\n\n[[func]]\nname = \"RecreateEar\"\naddr = 0x4199E3\nsize = 0x139\n\n[[func]]\nname = \"SpawnQuestItem\"\naddr = 0x419B1C\nsize = 0x11C\n\n[[func]]\nname = \"SpawnRock\"\naddr = 0x419C38\nsize = 0xD8\n\n[[func]]\nname = \"RespawnItem\"\naddr = 0x419D10\nsize = 0xC7\n\n[[func]]\nname = \"DeleteItem\"\naddr = 0x419DD7\nsize = 0x34\n\n[[func]]\nname = \"ItemDoppel\"\naddr = 0x419E0B\nsize = 0x5A\n\n[[func]]\nname = \"ProcessItems\"\naddr = 0x419E65\nsize = 0xD4\n\n[[func]]\nname = \"FreeItemGFX\"\naddr = 0x419F39\nsize = 0x1D\n\n[[func]]\nname = \"GetItemFrm\"\naddr = 0x419F56\nsize = 0x21\n\n[[func]]\nname = \"GetItemStr\"\naddr = 0x419F77\nsize = 0x73\n\n[[func]]\nname = \"CheckIdentify\"\naddr = 0x419FEA\nsize = 0x39\n\n[[func]]\nname = \"DoRepair\"\naddr = 0x41A023\nsize = 0x5A\n\n[[func]]\nname = \"RepairItem\"\naddr = 0x41A07D\nsize = 0x76\n\n[[func]]\nname = \"DoRecharge\"\naddr = 0x41A0F3\nsize = 0x71\n\n[[func]]\nname = \"RechargeItem\"\naddr = 0x41A164\nsize = 0x37\n\n[[func]]\nname = \"PrintItemOil\"\naddr = 0x41A19B\nsize = 0x98\n\n[[func]]\nname = \"PrintItemPower\"\naddr = 0x41A27B\nsize = 0x4FC\n\n[[func]]\nname = \"DrawUTextBack\"\naddr = 0x41A8B7\nsize = 0x5C\n\n[[func]]\nname = \"PrintUString\"\naddr = 0x41A913\nsize = 0xCF\n\n[[func]]\nname = \"DrawULine\"\naddr = 0x41A9E2\nsize = 0x4B\n\n[[func]]\nname = \"DrawUniqueInfo\"\naddr = 0x41AA2D\nsize = 0x136\n\n[[func]]\nname = \"PrintItemMisc\"\naddr = 0x41AB63\nsize = 0xF8\n\n[[func]]\nname = \"PrintItemDetails\"\naddr = 0x41AC5B\nsize = 0x20D\n\n[[func]]\nname = \"PrintItemDur\"\naddr = 0x41AE68\nsize = 0x1FF\n\n[[func]]\nname = \"UseItem\"\naddr = 0x41B067\nsize = 0x4F7\n\n[[func]]\nname = \"StoreStatOk\"\naddr = 0x41B55E\nsize = 0x45\n\n[[func]]\nname = \"SmithItemOk\"\naddr = 0x41B5A3\nsize = 0x36\n\n[[func]]\nname = \"RndSmithItem\"\naddr = 0x41B5D9\nsize = 0x6F\n\n[[func]]\nname = \"BubbleSwapItem\"\naddr = 0x41B648\nsize = 0x34\n\n[[func]]\nname = \"SortSmith\"\naddr = 0x41B67C\nsize = 0x5C\n\n[[func]]\nname = \"SpawnSmith\"\naddr = 0x41B6D8\nsize = 0xCF\n\n[[func]]\nname = \"PremiumItemOk\"\naddr = 0x41B7A7\nsize = 0x3F\n\n[[func]]\nname = \"RndPremiumItem\"\naddr = 0x41B7E6\nsize = 0x67\n\n[[func]]\nname = \"SpawnOnePremium\"\naddr = 0x41B84D\nsize = 0xDA\n\n[[func]]\nname = \"SpawnPremium\"\naddr = 0x41B927\nsize = 0xCC\n\n[[func]]\nname = \"WitchItemOk\"\naddr = 0x41B9F3\nsize = 0x66\n\n[[func]]\nname = \"RndWitchItem\"\naddr = 0x41BA59\nsize = 0x63\n\n[[func]]\nname = \"SortWitch\"\naddr = 0x41BABC\nsize = 0x60\n\n[[func]]\nname = \"WitchBookLevel\"\naddr = 0x41BB1C\nsize = 0x80\n\n[[func]]\nname = \"SpawnWitch\"\naddr = 0x41BB9C\nsize = 0x18F\n\n[[func]]\nname = \"RndBoyItem\"\naddr = 0x41BD2B\nsize = 0x5F\n\n[[func]]\nname = \"SpawnBoy\"\naddr = 0x41BD8A\nsize = 0x98\n\n[[func]]\nname = \"HealerItemOk\"\naddr = 0x41BE22\nsize = 0xAE\n\n[[func]]\nname = \"RndHealerItem\"\naddr = 0x41BED0\nsize = 0x63\n\n[[func]]\nname = \"SortHealer\"\naddr = 0x41BF33\nsize = 0x60\n\n[[func]]\nname = \"SpawnHealer\"\naddr = 0x41BF93\nsize = 0x14B\n\n[[func]]\nname = \"SpawnStoreGold\"\naddr = 0x41C0DE\nsize = 0x29\n\n[[func]]\nname = \"RecreateSmithItem\"\naddr = 0x41C107\nsize = 0x51\n\n[[func]]\nname = \"RecreatePremiumItem\"\naddr = 0x41C158\nsize = 0x6B\n\n[[func]]\nname = \"RecreateBoyItem\"\naddr = 0x41C1C3\nsize = 0x65\n\n[[func]]\nname = \"RecreateWitchItem\"\naddr = 0x41C228\nsize = 0xB1\n\n[[func]]\nname = \"RecreateHealerItem\"\naddr = 0x41C2D9\nsize = 0x66\n\n[[func]]\nname = \"RecreateTownItem\"\naddr = 0x41C33F\nsize = 0x67\n\n[[func]]\nname = \"RecalcStoreStats\"\naddr = 0x41C3A6\nsize = 0xA1\n\n[[func]]\nname = \"ItemNoFlippy\"\naddr = 0x41C447\nsize = 0x2F\n\n[[func]]\nname = \"CreateSpellBook\"\naddr = 0x41C476\nsize = 0xC9\n\n[[func]]\nname = \"CreateMagicArmor\"\naddr = 0x41C53F\nsize = 0xB6\n\n[[func]]\nname = \"CreateMagicWeapon\"\naddr = 0x41C53F\nsize = 0xB6\n\n[[func]]\nname = \"GetItemRecord\"\naddr = 0x41C5F5\nsize = 0xA3\n\n[[func]]\nname = \"NextItemRecord\"\naddr = 0x41C698\nsize = 0x46\n\n[[func]]\nname = \"SetItemRecord\"\naddr = 0x41C6DE\nsize = 0x47\n\n[[func]]\nname = \"PutItemRecord\"\naddr = 0x41C725\nsize = 0xA5\n\n[[func]]\nname = \"RotateRadius\"\naddr = 0x41C7CA\nsize = 0x77\n\n[[func]]\nname = \"DoLighting\"\naddr = 0x41C841\nsize = 0x3F6\n\n[[func]]\nname = \"DoUnLight\"\naddr = 0x41CC37\nsize = 0x80\n\n[[func]]\nname = \"DoUnVision\"\naddr = 0x41CCB7\nsize = 0x5A\n\n[[func]]\nname = \"DoVision\"\naddr = 0x41CD11\nsize = 0x289\n\n[[func]]\nname = \"FreeLightTable\"\naddr = 0x41CF9A\nsize = 0x12\n\n[[func]]\nname = \"InitLightTable\"\naddr = 0x41CFAC\nsize = 0x10\n\n[[func]]\nname = \"MakeLightTable\"\naddr = 0x41CFBC\nsize = 0x383\n\n[[func]]\nname = \"InitLightMax\"\naddr = 0x41D33F\nsize = 0x16\n\n[[func]]\nname = \"InitLighting\"\naddr = 0x41D355\nsize = 0x1E\n\n[[func]]\nname = \"AddLight\"\naddr = 0x41D373\nsize = 0x6A\n\n[[func]]\nname = \"AddUnLight\"\naddr = 0x41D3DD\nsize = 0x20\n\n[[func]]\nname = \"ChangeLightRadius\"\naddr = 0x41D3FD\nsize = 0x4F\n\n[[func]]\nname = \"ChangeLightXY\"\naddr = 0x41D44C\nsize = 0x5B\n\n[[func]]\nname = \"ChangeLightOff\"\naddr = 0x41D4A7\nsize = 0x5B\n\n[[func]]\nname = \"ChangeLight\"\naddr = 0x41D502\nsize = 0x6C\n\n[[func]]\nname = \"ProcessLightList\"\naddr = 0x41D56E\nsize = 0xF9\n\n[[func]]\nname = \"SavePreLighting\"\naddr = 0x41D667\nsize = 0x18\n\n[[func]]\nname = \"InitVision\"\naddr = 0x41D67F\nsize = 0x3B\n\n[[func]]\nname = \"AddVision\"\naddr = 0x41D6BA\nsize = 0x6D\n\n[[func]]\nname = \"ChangeVisionRadius\"\naddr = 0x41D727\nsize = 0x41\n\n[[func]]\nname = \"ChangeVisionXY\"\naddr = 0x41D768\nsize = 0x4A\n\n[[func]]\nname = \"ProcessVisionList\"\naddr = 0x41D7B2\nsize = 0xF4\n\n[[func]]\nname = \"lighting_color_cycling\"\naddr = 0x41D8A6\nsize = 0x45\n\n[[func]]\nname = \"LoadGame\"\naddr = 0x41D8EB\nsize = 0x57E\n\n[[func]]\nname = \"BLoad\"\naddr = 0x41DE69\nsize = 0xE\n\n[[func]]\nname = \"WLoad\"\naddr = 0x41DE77\nsize = 0x3C\n\n[[func]]\nname = \"ILoad\"\naddr = 0x41DEB3\nsize = 0x3C\n\n[[func]]\nname = \"OLoad\"\naddr = 0x41DEEF\nsize = 0x17\n\n[[func]]\nname = \"LoadPlayer\"\naddr = 0x41DF06\nsize = 0x2A\n\n[[func]]\nname = \"LoadMonster\"\naddr = 0x41DF30\nsize = 0x35\n\n[[func]]\nname = \"LoadMissile\"\naddr = 0x41DF65\nsize = 0x2A\n\n[[func]]\nname = \"LoadObject\"\naddr = 0x41DF8F\nsize = 0x22\n\n[[func]]\nname = \"LoadItem\"\naddr = 0x41DFB1\nsize = 0x35\n\n[[func]]\nname = \"LoadPremium\"\naddr = 0x41DFE6\nsize = 0x2A\n\n[[func]]\nname = \"LoadQuest\"\naddr = 0x41E010\nsize = 0x55\n\n[[func]]\nname = \"LoadLighting\"\naddr = 0x41E065\nsize = 0x22\n\n[[func]]\nname = \"LoadVision\"\naddr = 0x41E087\nsize = 0x22\n\n[[func]]\nname = \"LoadPortal\"\naddr = 0x41E0A9\nsize = 0x23\n\n[[func]]\nname = \"SaveGame\"\naddr = 0x41E0CC\nsize = 0x4BE\n\n[[func]]\nname = \"BSave\"\naddr = 0x41E58A\nsize = 0xE\n\n[[func]]\nname = \"WSave\"\naddr = 0x41E598\nsize = 0x47\n\n[[func]]\nname = \"ISave\"\naddr = 0x41E5DF\nsize = 0x47\n\n[[func]]\nname = \"OSave\"\naddr = 0x41E626\nsize = 0x18\n\n[[func]]\nname = \"SavePlayer\"\naddr = 0x41E63E\nsize = 0x2A\n\n[[func]]\nname = \"SaveMonster\"\naddr = 0x41E668\nsize = 0x2A\n\n[[func]]\nname = \"SaveMissile\"\naddr = 0x41E692\nsize = 0x2A\n\n[[func]]\nname = \"SaveObject\"\naddr = 0x41E6BC\nsize = 0x22\n\n[[func]]\nname = \"SaveItem\"\naddr = 0x41E6DE\nsize = 0x2A\n\n[[func]]\nname = \"SavePremium\"\naddr = 0x41E708\nsize = 0x2A\n\n[[func]]\nname = \"SaveQuest\"\naddr = 0x41E732\nsize = 0x59\n\n[[func]]\nname = \"SaveLighting\"\naddr = 0x41E78B\nsize = 0x22\n\n[[func]]\nname = \"SaveVision\"\naddr = 0x41E7AD\nsize = 0x22\n\n[[func]]\nname = \"SavePortal\"\naddr = 0x41E7CF\nsize = 0x23\n\n[[func]]\nname = \"SaveLevel\"\naddr = 0x41E7F2\nsize = 0x2C4\n\n[[func]]\nname = \"LoadLevel\"\naddr = 0x41EAB6\nsize = 0x2C3\n\n[[func]]\nname = \"log_flush\"\naddr = 0x41EDB7\nsize = 0x92\n\n[[func]]\nname = \"log_create\"\naddr = 0x41EE49\nsize = 0x156\n\n[[func]]\nname = \"log_get_version\"\naddr = 0x41EF9F\nsize = 0xB1\n\n[[func]]\nname = \"log_printf\"\naddr = 0x41F050\nsize = 0xAC\n\n[[func]]\nname = \"log_dump_computer_info\"\naddr = 0x41F0FC\nsize = 0x99\n\n[[func]]\nname = \"mainmenu_refresh_music\"\naddr = 0x41F1A5\nsize = 0xB\n\n[[func]]\nname = \"mainmenu_change_name\"\naddr = 0x41F1B0\nsize = 0x1D\n\n[[func]]\nname = \"mainmenu_select_hero_dialog\"\naddr = 0x41F1CD\nsize = 0x114\n\n[[func]]\nname = \"mainmenu_loop\"\naddr = 0x41F2E1\nsize = 0x65\n\n[[func]]\nname = \"mainmenu_single_player\"\naddr = 0x41F346\nsize = 0xE\n\n[[func]]\nname = \"mainmenu_init_menu\"\naddr = 0x41F354\nsize = 0x36\n\n[[func]]\nname = \"mainmenu_multi_player\"\naddr = 0x41F38A\nsize = 0xF\n\n[[func]]\nname = \"FreeQuestText\"\naddr = 0x41F399\nsize = 0x24\n\n[[func]]\nname = \"InitQuestText\"\naddr = 0x41F3BD\nsize = 0x2A\n\n[[func]]\nname = \"InitQTextMsg\"\naddr = 0x41F3E7\nsize = 0x60\n\n[[func]]\nname = \"DrawQTextBack\"\naddr = 0x41F447\nsize = 0x5C\n\n[[func]]\nname = \"PrintQTextChr\"\naddr = 0x41F4A3\nsize = 0xA2\n\n[[func]]\nname = \"DrawQText\"\naddr = 0x41F545\nsize = 0x1BE\n\n[[func]]\nname = \"GetDamageAmt\"\naddr = 0x41F703\nsize = 0x4F1\n\n[[func]]\nname = \"CheckBlock\"\naddr = 0x41FC64\nsize = 0x59\n\n[[func]]\nname = \"FindClosest\"\naddr = 0x41FCBD\nsize = 0x11F\n\n[[func]]\nname = \"GetSpellLevel\"\naddr = 0x41FDDC\nsize = 0x2B\n\n[[func]]\nname = \"GetDirection8\"\naddr = 0x41FE07\nsize = 0x62A\n\n[[func]]\nname = \"GetDirection16\"\naddr = 0x420431\nsize = 0x690\n\n[[func]]\nname = \"DeleteMissile\"\naddr = 0x420AC1\nsize = 0x70\n\n[[func]]\nname = \"GetMissileVel\"\naddr = 0x420B31\nsize = 0xBF\n\n[[func]]\nname = \"PutMissile\"\naddr = 0x420BF0\nsize = 0x6B\n\n[[func]]\nname = \"GetMissilePos\"\naddr = 0x420C5B\nsize = 0xD2\n\n[[func]]\nname = \"MoveMissilePos\"\naddr = 0x420D2D\nsize = 0x8F\n\n[[func]]\nname = \"MonsterTrapHit\"\naddr = 0x420DDC\nsize = 0x1A2\n\n[[func]]\nname = \"MonsterMHit\"\naddr = 0x420F7E\nsize = 0x313\n\n[[func]]\nname = \"PlayerMHit\"\naddr = 0x421291\nsize = 0x3A2\n\n[[func]]\nname = \"Plr2PlrMHit\"\naddr = 0x421633\nsize = 0x2BD\n\n[[func]]\nname = \"CheckMissileCol\"\naddr = 0x4218F0\nsize = 0x2FA\n\n[[func]]\nname = \"SetMissAnim\"\naddr = 0x421BEA\nsize = 0x84\n\n[[func]]\nname = \"SetMissDir\"\naddr = 0x421C6E\nsize = 0x1A\n\n[[func]]\nname = \"LoadMissileGFX\"\naddr = 0x421C88\nsize = 0xE9\n\n[[func]]\nname = \"InitMissileGFX\"\naddr = 0x421D71\nsize = 0x2D\n\n[[func]]\nname = \"FreeMissileGFX\"\naddr = 0x421D9E\nsize = 0x69\n\n[[func]]\nname = \"FreeMissiles\"\naddr = 0x421E07\nsize = 0x2E\n\n[[func]]\nname = \"FreeMissiles2\"\naddr = 0x421E35\nsize = 0x2E\n\n[[func]]\nname = \"InitMissiles\"\naddr = 0x421E63\nsize = 0xBE\n\n[[func]]\nname = \"AddLArrow\"\naddr = 0x421F21\nsize = 0xCD\n\n[[func]]\nname = \"AddArrow\"\naddr = 0x421FEE\nsize = 0xD1\n\n[[func]]\nname = \"GetVileMissPos\"\naddr = 0x4220BF\nsize = 0x9E\n\n[[func]]\nname = \"AddRndTeleport\"\naddr = 0x42215D\nsize = 0x143\n\n[[func]]\nname = \"AddFirebolt\"\naddr = 0x4222A0\nsize = 0x10F\n\n[[func]]\nname = \"AddMagmaball\"\naddr = 0x4223AF\nsize = 0x79\n\n[[func]]\nname = \"miss_null_33\"\naddr = 0x422428\nsize = 0x46\n\n[[func]]\nname = \"AddTeleport\"\naddr = 0x42246E\nsize = 0x12B\n\n[[func]]\nname = \"AddLightball\"\naddr = 0x422599\nsize = 0x7F\n\n[[func]]\nname = \"AddFirewall\"\naddr = 0x422618\nsize = 0xBD\n\n[[func]]\nname = \"AddFireball\"\naddr = 0x4226D5\nsize = 0x127\n\n[[func]]\nname = \"AddLightctrl\"\naddr = 0x4227FC\nsize = 0x6C\n\n[[func]]\nname = \"AddLightning\"\naddr = 0x422868\nsize = 0xCD\n\n[[func]]\nname = \"AddMisexp\"\naddr = 0x422935\nsize = 0xF1\n\n[[func]]\nname = \"AddWeapexp\"\naddr = 0x422A26\nsize = 0x6B\n\n[[func]]\nname = \"CheckIfTrig\"\naddr = 0x422A91\nsize = 0x63\n\n[[func]]\nname = \"AddTown\"\naddr = 0x422AF4\nsize = 0x21D\n\n[[func]]\nname = \"AddFlash\"\naddr = 0x422D11\nsize = 0xC5\n\n[[func]]\nname = \"AddFlash2\"\naddr = 0x422DD6\nsize = 0xC2\n\n[[func]]\nname = \"AddManashield\"\naddr = 0x422E98\nsize = 0x77\n\n[[func]]\nname = \"AddFiremove\"\naddr = 0x422F0F\nsize = 0x7C\n\n[[func]]\nname = \"AddGuardian\"\naddr = 0x422F8B\nsize = 0x222\n\n[[func]]\nname = \"AddChain\"\naddr = 0x4231AD\nsize = 0x33\n\n[[func]]\nname = \"miss_null_11\"\naddr = 0x4231E0\nsize = 0x33\n\n[[func]]\nname = \"miss_null_12\"\naddr = 0x423213\nsize = 0x3D\n\n[[func]]\nname = \"miss_null_13\"\naddr = 0x423250\nsize = 0x3F\n\n[[func]]\nname = \"AddRhino\"\naddr = 0x42328F\nsize = 0x111\n\n[[func]]\nname = \"miss_null_32\"\naddr = 0x4233A0\nsize = 0xDC\n\n[[func]]\nname = \"AddFlare\"\naddr = 0x42347C\nsize = 0x10F\n\n[[func]]\nname = \"AddAcid\"\naddr = 0x42358B\nsize = 0x78\n\n[[func]]\nname = \"miss_null_1D\"\naddr = 0x423603\nsize = 0x3C\n\n[[func]]\nname = \"AddAcidpud\"\naddr = 0x42363F\nsize = 0x64\n\n[[func]]\nname = \"AddStone\"\naddr = 0x4236A3\nsize = 0x18A\n\n[[func]]\nname = \"AddGolem\"\naddr = 0x42382D\nsize = 0xC2\n\n[[func]]\nname = \"AddEtherealize\"\naddr = 0x4238EF\nsize = 0x8A\n\n[[func]]\nname = \"miss_null_1F\"\naddr = 0x423F9A\nsize = 0x13\n\n[[func]]\nname = \"miss_null_23\"\naddr = 0x423979\nsize = 0x62\n\n[[func]]\nname = \"AddBoom\"\naddr = 0x4239DB\nsize = 0x53\n\n[[func]]\nname = \"AddHeal\"\naddr = 0x423A2E\nsize = 0xE0\n\n[[func]]\nname = \"AddHealOther\"\naddr = 0x423B0E\nsize = 0x33\n\n[[func]]\nname = \"AddElement\"\naddr = 0x423B41\nsize = 0x103\n\n[[func]]\nname = \"AddIdentify\"\naddr = 0x423C44\nsize = 0x51\n\n[[func]]\nname = \"AddFirewallC\"\naddr = 0x423C95\nsize = 0x162\n\n[[func]]\nname = \"AddInfra\"\naddr = 0x423DF7\nsize = 0x67\n\n[[func]]\nname = \"AddWave\"\naddr = 0x423E5E\nsize = 0x4B\n\n[[func]]\nname = \"AddNova\"\naddr = 0x423EA9\nsize = 0xF1\n\n[[func]]\nname = \"AddRepair\"\naddr = 0x423FAD\nsize = 0x51\n\n[[func]]\nname = \"AddRecharge\"\naddr = 0x423FFE\nsize = 0x51\n\n[[func]]\nname = \"AddDisarm\"\naddr = 0x42404F\nsize = 0x33\n\n[[func]]\nname = \"AddApoca\"\naddr = 0x424082\nsize = 0xC5\n\n[[func]]\nname = \"AddFlame\"\naddr = 0x424147\nsize = 0x103\n\n[[func]]\nname = \"AddFlamec\"\naddr = 0x42424A\nsize = 0x78\n\n[[func]]\nname = \"AddCbolt\"\naddr = 0x4242C2\nsize = 0xEB\n\n[[func]]\nname = \"AddHbolt\"\naddr = 0x4243AD\nsize = 0xE0\n\n[[func]]\nname = \"AddResurrect\"\naddr = 0x42448D\nsize = 0x37\n\n[[func]]\nname = \"AddResurrectBeam\"\naddr = 0x4244C4\nsize = 0x44\n\n[[func]]\nname = \"AddTelekinesis\"\naddr = 0x424508\nsize = 0x33\n\n[[func]]\nname = \"AddBoneSpirit\"\naddr = 0x42453B\nsize = 0xEB\n\n[[func]]\nname = \"AddRportal\"\naddr = 0x424626\nsize = 0x4A\n\n[[func]]\nname = \"AddDiabApoca\"\naddr = 0x424670\nsize = 0x7F\n\n[[func]]\nname = \"AddMissile\"\naddr = 0x4246EF\nsize = 0x1C9\n\n[[func]]\nname = \"Sentfire\"\naddr = 0x4248B8\nsize = 0xDC\n\n[[func]]\nname = \"MI_Dummy\"\naddr = 0x44777C\nsize = 0x1\n\n[[func]]\nname = \"MI_Golem\"\naddr = 0x424994\nsize = 0x147\n\n[[func]]\nname = \"MI_SetManashield\"\naddr = 0x424ADB\nsize = 0xB\n\n[[func]]\nname = \"MI_LArrow\"\naddr = 0x424AE6\nsize = 0x2FE\n\n[[func]]\nname = \"MI_Arrow\"\naddr = 0x424DE4\nsize = 0xD1\n\n[[func]]\nname = \"MI_Firebolt\"\naddr = 0x424EB5\nsize = 0x2B9\n\n[[func]]\nname = \"MI_Lightball\"\naddr = 0x42516E\nsize = 0xE8\n\n[[func]]\nname = \"mi_null_33\"\naddr = 0x425256\nsize = 0x69\n\n[[func]]\nname = \"MI_Acidpud\"\naddr = 0x4252BF\nsize = 0x73\n\n[[func]]\nname = \"MI_Firewall\"\naddr = 0x425332\nsize = 0x171\n\n[[func]]\nname = \"MI_Fireball\"\naddr = 0x4254A3\nsize = 0x418\n\n[[func]]\nname = \"MI_Lightctrl\"\naddr = 0x4258BB\nsize = 0x1F4\n\n[[func]]\nname = \"MI_Lightning\"\naddr = 0x425AAF\nsize = 0x85\n\n[[func]]\nname = \"MI_Town\"\naddr = 0x425B34\nsize = 0x1AB\n\n[[func]]\nname = \"MI_Flash\"\naddr = 0x425CDF\nsize = 0x126\n\n[[func]]\nname = \"MI_Flash2\"\naddr = 0x425E05\nsize = 0xCE\n\n[[func]]\nname = \"MI_Manashield\"\naddr = 0x425ED3\nsize = 0x25A\n\n[[func]]\nname = \"MI_Etherealize\"\naddr = 0x42612D\nsize = 0xE4\n\n[[func]]\nname = \"MI_Firemove\"\naddr = 0x426211\nsize = 0x1CB\n\n[[func]]\nname = \"MI_Guardian\"\naddr = 0x4263DC\nsize = 0x1FA\n\n[[func]]\nname = \"MI_Chain\"\naddr = 0x4265D6\nsize = 0x1B3\n\n[[func]]\nname = \"mi_null_11\"\naddr = 0x426789\nsize = 0x34\n\n[[func]]\nname = \"MI_Weapexp\"\naddr = 0x4267BD\nsize = 0x12D\n\n[[func]]\nname = \"MI_Misexp\"\naddr = 0x4268EA\nsize = 0xBC\n\n[[func]]\nname = \"MI_Acidsplat\"\naddr = 0x4269A6\nsize = 0x91\n\n[[func]]\nname = \"MI_Teleport\"\naddr = 0x426A37\nsize = 0x109\n\n[[func]]\nname = \"MI_Stone\"\naddr = 0x426B40\nsize = 0xC2\n\n[[func]]\nname = \"MI_Boom\"\naddr = 0x426C02\nsize = 0x61\n\n[[func]]\nname = \"MI_Rhino\"\naddr = 0x426C63\nsize = 0x181\n\n[[func]]\nname = \"mi_null_32\"\naddr = 0x426DE4\nsize = 0x1A4\n\n[[func]]\nname = \"MI_FirewallC\"\naddr = 0x426F88\nsize = 0x16F\n\n[[func]]\nname = \"MI_Infra\"\naddr = 0x4270F7\nsize = 0x3D\n\n[[func]]\nname = \"MI_Apoca\"\naddr = 0x427134\nsize = 0xEB\n\n[[func]]\nname = \"MI_Wave\"\naddr = 0x42721F\nsize = 0x249\n\n[[func]]\nname = \"MI_Nova\"\naddr = 0x427468\nsize = 0x153\n\n[[func]]\nname = \"MI_Blodboil\"\naddr = 0x4275BB\nsize = 0x11\n\n[[func]]\nname = \"MI_Flame\"\naddr = 0x4275CC\nsize = 0xC6\n\n[[func]]\nname = \"MI_Flamec\"\naddr = 0x427692\nsize = 0xDE\n\n[[func]]\nname = \"MI_Cbolt\"\naddr = 0x427770\nsize = 0x186\n\n[[func]]\nname = \"MI_Hbolt\"\naddr = 0x4278F6\nsize = 0x13D\n\n[[func]]\nname = \"MI_Element\"\naddr = 0x427A33\nsize = 0x379\n\n[[func]]\nname = \"MI_Bonespirit\"\naddr = 0x427DAC\nsize = 0x1F5\n\n[[func]]\nname = \"MI_ResurrectBeam\"\naddr = 0x427FA1\nsize = 0x1F\n\n[[func]]\nname = \"MI_Rportal\"\naddr = 0x427FC0\nsize = 0x12E\n\n[[func]]\nname = \"ProcessMissiles\"\naddr = 0x4280EE\nsize = 0x15B\n\n[[func]]\nname = \"missiles_process_charge\"\naddr = 0x428249\nsize = 0x84\n\n[[func]]\nname = \"ClearMissileSpot\"\naddr = 0x4282CD\nsize = 0x26\n\n[[func]]\nname = \"InitMonsterTRN\"\naddr = 0x428303\nsize = 0x8C\n\n[[func]]\nname = \"InitLevelMonsters\"\naddr = 0x42838F\nsize = 0x54\n\n[[func]]\nname = \"AddMonsterType\"\naddr = 0x4283E3\nsize = 0x80\n\n[[func]]\nname = \"GetLevelMTypes\"\naddr = 0x428463\nsize = 0x2AA\n\n[[func]]\nname = \"InitMonsterGFX\"\naddr = 0x42870D\nsize = 0x2B5\n\n[[func]]\nname = \"ClearMVars\"\naddr = 0x4289C2\nsize = 0x39\n\n[[func]]\nname = \"InitMonster\"\naddr = 0x4289FB\nsize = 0x384\n\n[[func]]\nname = \"ClrAllMonsters\"\naddr = 0x428D7F\nsize = 0xA5\n\n[[func]]\nname = \"MonstPlace\"\naddr = 0x428E24\nsize = 0x4D\n\n[[func]]\nname = \"PlaceMonster\"\naddr = 0x428E71\nsize = 0x3C\n\n[[func]]\nname = \"PlaceGroup\"\naddr = 0x428EAD\nsize = 0x28B\n\n[[func]]\nname = \"InitMonsters\"\naddr = 0x429138\nsize = 0x1E5\n\n[[func]]\nname = \"DeleteMonster\"\naddr = 0x42931D\nsize = 0x24\n\n[[func]]\nname = \"AddMonster\"\naddr = 0x429341\nsize = 0x50\n\n[[func]]\nname = \"NewMonsterAnim\"\naddr = 0x429391\nsize = 0x3E\n\n[[func]]\nname = \"M_Ranged\"\naddr = 0x4293CF\nsize = 0x27\n\n[[func]]\nname = \"M_Talker\"\naddr = 0x4293F6\nsize = 0x36\n\n[[func]]\nname = \"M_Enemy\"\naddr = 0x42942C\nsize = 0x2B9\n\n[[func]]\nname = \"M_GetDir\"\naddr = 0x4296E5\nsize = 0x28\n\n[[func]]\nname = \"M_CheckEFlag\"\naddr = 0x42970D\nsize = 0x60\n\n[[func]]\nname = \"M_StartStand\"\naddr = 0x42976D\nsize = 0x8C\n\n[[func]]\nname = \"M_StartDelay\"\naddr = 0x4297F9\nsize = 0x26\n\n[[func]]\nname = \"M_StartSpStand\"\naddr = 0x42981F\nsize = 0x6D\n\n[[func]]\nname = \"M_StartWalk\"\naddr = 0x42988C\nsize = 0xD3\n\n[[func]]\nname = \"M_StartWalk2\"\naddr = 0x42995F\nsize = 0x11B\n\n[[func]]\nname = \"M_StartWalk3\"\naddr = 0x429A7A\nsize = 0x14C\n\n[[func]]\nname = \"M_StartAttack\"\naddr = 0x429BC6\nsize = 0x71\n\n[[func]]\nname = \"M_StartRAttack\"\naddr = 0x429C37\nsize = 0x88\n\n[[func]]\nname = \"M_StartRSpAttack\"\naddr = 0x429CBF\nsize = 0x91\n\n[[func]]\nname = \"M_StartSpAttack\"\naddr = 0x429D50\nsize = 0x74\n\n[[func]]\nname = \"M_StartEat\"\naddr = 0x429DC4\nsize = 0x68\n\n[[func]]\nname = \"M_ClearSquares\"\naddr = 0x429E2C\nsize = 0xBF\n\n[[func]]\nname = \"M_GetKnockback\"\naddr = 0x429EEB\nsize = 0xCA\n\n[[func]]\nname = \"M_StartHit\"\naddr = 0x429FB5\nsize = 0x175\n\n[[func]]\nname = \"M_DiabloDeath\"\naddr = 0x42A12A\nsize = 0x1E6\n\n[[func]]\nname = \"M2MStartHit\"\naddr = 0x42A310\nsize = 0x180\n\n[[func]]\nname = \"MonstStartKill\"\naddr = 0x42A490\nsize = 0x1F6\n\n[[func]]\nname = \"M2MStartKill\"\naddr = 0x42A686\nsize = 0x205\n\n[[func]]\nname = \"M_StartKill\"\naddr = 0x42A88B\nsize = 0x7E\n\n[[func]]\nname = \"M_SyncStartKill\"\naddr = 0x42A909\nsize = 0x9B\n\n[[func]]\nname = \"M_StartFadein\"\naddr = 0x42A9A4\nsize = 0xCD\n\n[[func]]\nname = \"M_StartFadeout\"\naddr = 0x42AA71\nsize = 0xC5\n\n[[func]]\nname = \"M_StartHeal\"\naddr = 0x42AB36\nsize = 0x98\n\n[[func]]\nname = \"M_ChangeLightOffset\"\naddr = 0x42ABCE\nsize = 0x6A\n\n[[func]]\nname = \"M_DoStand\"\naddr = 0x42AC38\nsize = 0x7F\n\n[[func]]\nname = \"M_DoWalk\"\naddr = 0x42ACB7\nsize = 0x116\n\n[[func]]\nname = \"M_DoWalk2\"\naddr = 0x42ADCD\nsize = 0xF3\n\n[[func]]\nname = \"M_DoWalk3\"\naddr = 0x42AEC0\nsize = 0x126\n\n[[func]]\nname = \"M_TryM2MHit\"\naddr = 0x42AFE6\nsize = 0x10A\n\n[[func]]\nname = \"M_TryH2HHit\"\naddr = 0x42B0F0\nsize = 0x40F\n\n[[func]]\nname = \"M_DoAttack\"\naddr = 0x42B4FF\nsize = 0x182\n\n[[func]]\nname = \"M_DoRAttack\"\naddr = 0x42B681\nsize = 0xF5\n\n[[func]]\nname = \"M_DoRSpAttack\"\naddr = 0x42B776\nsize = 0x115\n\n[[func]]\nname = \"M_DoSAttack\"\naddr = 0x42B88B\nsize = 0xB7\n\n[[func]]\nname = \"M_DoFadein\"\naddr = 0x42B942\nsize = 0x65\n\n[[func]]\nname = \"M_DoFadeout\"\naddr = 0x42B9A7\nsize = 0x82\n\n[[func]]\nname = \"M_DoHeal\"\naddr = 0x42BA29\nsize = 0x90\n\n[[func]]\nname = \"M_DoTalk\"\naddr = 0x42BAB9\nsize = 0x285\n\n[[func]]\nname = \"M_Teleport\"\naddr = 0x42BD3E\nsize = 0x141\n\n[[func]]\nname = \"M_DoGotHit\"\naddr = 0x42BE7F\nsize = 0x63\n\n[[func]]\nname = \"M_UpdateLeader\"\naddr = 0x42BEE2\nsize = 0x79\n\n[[func]]\nname = \"DoEnding\"\naddr = 0x42BF5B\nsize = 0x2D\n\n[[func]]\nname = \"PrepDoEnding\"\naddr = 0x42BF88\nsize = 0x83\n\n[[func]]\nname = \"M_DoDeath\"\naddr = 0x42C00B\nsize = 0x10D\n\n[[func]]\nname = \"M_DoSpStand\"\naddr = 0x42C118\nsize = 0x7F\n\n[[func]]\nname = \"M_DoDelay\"\naddr = 0x42C197\nsize = 0xA9\n\n[[func]]\nname = \"M_DoStone\"\naddr = 0x42C240\nsize = 0x4E\n\n[[func]]\nname = \"M_WalkDir\"\naddr = 0x42C28E\nsize = 0x133\n\n[[func]]\nname = \"GroupUnity\"\naddr = 0x42C3E1\nsize = 0x1F3\n\n[[func]]\nname = \"M_CallWalk\"\naddr = 0x42C5D4\nsize = 0x10D\n\n[[func]]\nname = \"M_PathWalk\"\naddr = 0x42C6E1\nsize = 0x80\n\n[[func]]\nname = \"M_CallWalk2\"\naddr = 0x42C761\nsize = 0x85\n\n[[func]]\nname = \"M_DumbWalk\"\naddr = 0x42C7E6\nsize = 0x21\n\n[[func]]\nname = \"M_RoundWalk\"\naddr = 0x42C807\nsize = 0xD6\n\n[[func]]\nname = \"MAI_Zombie\"\naddr = 0x42C8DD\nsize = 0x146\n\n[[func]]\nname = \"MAI_SkelSd\"\naddr = 0x42CA23\nsize = 0x13A\n\n[[func]]\nname = \"MAI_Path\"\naddr = 0x42CB5D\nsize = 0xC8\n\n[[func]]\nname = \"MAI_Snake\"\naddr = 0x42CC25\nsize = 0x296\n\n[[func]]\nname = \"MAI_Bat\"\naddr = 0x42CEBB\nsize = 0x268\n\n[[func]]\nname = \"MAI_SkelBow\"\naddr = 0x42D123\nsize = 0x141\n\n[[func]]\nname = \"MAI_Fat\"\naddr = 0x42D264\nsize = 0x128\n\n[[func]]\nname = \"MAI_Sneak\"\naddr = 0x42D38C\nsize = 0x268\n\n[[func]]\nname = \"MAI_Fireman\"\naddr = 0x42D5F4\nsize = 0x224\n\n[[func]]\nname = \"MAI_Fallen\"\naddr = 0x42D818\nsize = 0x1EB\n\n[[func]]\nname = \"MAI_Cleaver\"\naddr = 0x42DA03\nsize = 0xAE\n\n[[func]]\nname = \"MAI_Round\"\naddr = 0x42DAB1\nsize = 0x29B\n\n[[func]]\nname = \"MAI_GoatMc\"\naddr = 0x42DD4C\nsize = 0x8\n\n[[func]]\nname = \"MAI_Ranged\"\naddr = 0x42DD54\nsize = 0x18B\n\n[[func]]\nname = \"MAI_GoatBow\"\naddr = 0x42DEDF\nsize = 0xA\n\n[[func]]\nname = \"MAI_Succ\"\naddr = 0x42DEE9\nsize = 0xB\n\n[[func]]\nname = \"MAI_AcidUniq\"\naddr = 0x42DEF4\nsize = 0xB\n\n[[func]]\nname = \"MAI_Scav\"\naddr = 0x42DEFF\nsize = 0x284\n\n[[func]]\nname = \"MAI_Garg\"\naddr = 0x42E183\nsize = 0x134\n\n[[func]]\nname = \"MAI_RoundRanged\"\naddr = 0x42E2B7\nsize = 0x308\n\n[[func]]\nname = \"MAI_Magma\"\naddr = 0x42E5BF\nsize = 0xF\n\n[[func]]\nname = \"MAI_Storm\"\naddr = 0x42E5CE\nsize = 0xF\n\n[[func]]\nname = \"MAI_Acid\"\naddr = 0x42E5DD\nsize = 0xF\n\n[[func]]\nname = \"MAI_Diablo\"\naddr = 0x42E5EC\nsize = 0xF\n\n[[func]]\nname = \"MAI_RR2\"\naddr = 0x42E5FB\nsize = 0x30F\n\n[[func]]\nname = \"MAI_Mega\"\naddr = 0x42E90A\nsize = 0xB\n\n[[func]]\nname = \"MAI_Golum\"\naddr = 0x42E915\nsize = 0x21B\n\n[[func]]\nname = \"MAI_SkelKing\"\naddr = 0x42EB30\nsize = 0x329\n\n[[func]]\nname = \"MAI_Rhino\"\naddr = 0x42EE59\nsize = 0x2F2\n\n[[func]]\nname = \"MAI_Counselor\"\naddr = 0x42F14B\nsize = 0x35A\n\n[[func]]\nname = \"MAI_Garbud\"\naddr = 0x42F4A5\nsize = 0xC4\n\n[[func]]\nname = \"MAI_Zhar\"\naddr = 0x42F569\nsize = 0x10E\n\n[[func]]\nname = \"MAI_SnotSpil\"\naddr = 0x42F677\nsize = 0xE5\n\n[[func]]\nname = \"MAI_Lazurus\"\naddr = 0x42F75C\nsize = 0x129\n\n[[func]]\nname = \"MAI_Lazhelp\"\naddr = 0x42F885\nsize = 0xBD\n\n[[func]]\nname = \"MAI_Lachdanan\"\naddr = 0x42F942\nsize = 0x53\n\n[[func]]\nname = \"MAI_Warlord\"\naddr = 0x42F995\nsize = 0xAC\n\n[[func]]\nname = \"DeleteMonsterList\"\naddr = 0x42FA41\nsize = 0x65\n\n[[func]]\nname = \"ProcessMonsters\"\naddr = 0x42FAA6\nsize = 0x2E5\n\n[[func]]\nname = \"FreeMonsters\"\naddr = 0x42FDD3\nsize = 0x6C\n\n[[func]]\nname = \"DirOK\"\naddr = 0x42FE3F\nsize = 0x201\n\n[[func]]\nname = \"PosOkMissile\"\naddr = 0x430040\nsize = 0x25\n\n[[func]]\nname = \"CheckNoSolid\"\naddr = 0x430065\nsize = 0x1A\n\n[[func]]\nname = \"LineClearF\"\naddr = 0x43007F\nsize = 0x16F\n\n[[func]]\nname = \"LineClear\"\naddr = 0x4301EE\nsize = 0x1A\n\n[[func]]\nname = \"LineClearF1\"\naddr = 0x430208\nsize = 0x17B\n\n[[func]]\nname = \"SyncMonsterAnim\"\naddr = 0x430383\nsize = 0xEB\n\n[[func]]\nname = \"M_FallenFear\"\naddr = 0x4304B6\nsize = 0xEA\n\n[[func]]\nname = \"PrintMonstHistory\"\naddr = 0x4305A0\nsize = 0x1A8\n\n[[func]]\nname = \"PrintUniqueHistory\"\naddr = 0x430748\nsize = 0x87\n\n[[func]]\nname = \"MissToMonst\"\naddr = 0x4307CF\nsize = 0x29D\n\n[[func]]\nname = \"PosOkMonst\"\naddr = 0x430A6C\nsize = 0xE9\n\n[[func]]\nname = \"PosOkMonst2\"\naddr = 0x430B55\nsize = 0xCC\n\n[[func]]\nname = \"PosOkMonst3\"\naddr = 0x430C21\nsize = 0x128\n\n[[func]]\nname = \"IsSkel\"\naddr = 0x430D49\nsize = 0x25\n\n[[func]]\nname = \"IsGoat\"\naddr = 0x430D6E\nsize = 0x1B\n\n[[func]]\nname = \"M_SpawnSkel\"\naddr = 0x430D89\nsize = 0xAD\n\n[[func]]\nname = \"ActivateSpawn\"\naddr = 0x430E36\nsize = 0x51\n\n[[func]]\nname = \"SpawnSkeleton\"\naddr = 0x430E87\nsize = 0x100\n\n[[func]]\nname = \"PreSpawnSkeleton\"\naddr = 0x430F87\nsize = 0x93\n\n[[func]]\nname = \"TalktoMonster\"\naddr = 0x43101A\nsize = 0xCE\n\n[[func]]\nname = \"SpawnGolum\"\naddr = 0x4310E8\nsize = 0x132\n\n[[func]]\nname = \"CanTalkToMonst\"\naddr = 0x43121A\nsize = 0x37\n\n[[func]]\nname = \"CheckMonsterHit\"\naddr = 0x431251\nsize = 0x72\n\n[[func]]\nname = \"encode_enemy\"\naddr = 0x4312C3\nsize = 0x19\n\n[[func]]\nname = \"decode_enemy\"\naddr = 0x4312DC\nsize = 0x65\n\n[[func]]\nname = \"play_movie\"\naddr = 0x431351\nsize = 0xFB\n\n[[func]]\nname = \"MovieWndProc\"\naddr = 0x43144C\nsize = 0x52\n\n[[func]]\nname = \"mpqapi_set_hidden\"\naddr = 0x4314AE\nsize = 0x3C\n\n[[func]]\nname = \"mpqapi_store_creation_time\"\naddr = 0x4314EA\nsize = 0x73\n\n[[func]]\nname = \"mpqapi_reg_load_modification_time\"\naddr = 0x43155D\nsize = 0x56\n\n[[func]]\nname = \"mpqapi_xor_buf\"\naddr = 0x4315B3\nsize = 0x1F\n\n[[func]]\nname = \"mpqapi_reg_store_modification_time\"\naddr = 0x4315D2\nsize = 0x39\n\n[[func]]\nname = \"mpqapi_remove_hash_entry\"\naddr = 0x431610\nsize = 0x52\n\n[[func]]\nname = \"mpqapi_alloc_block\"\naddr = 0x431662\nsize = 0x90\n\n[[func]]\nname = \"mpqapi_new_block\"\naddr = 0x4316F2\nsize = 0x3F\n\n[[func]]\nname = \"FetchHandle\"\naddr = 0x431731\nsize = 0x30\n\n[[func]]\nname = \"mpqapi_get_hash_index\"\naddr = 0x431761\nsize = 0x6A\n\n[[func]]\nname = \"mpqapi_remove_hash_entries\"\naddr = 0x4317CB\nsize = 0x3B\n\n[[func]]\nname = \"mpqapi_write_file\"\naddr = 0x431806\nsize = 0x45\n\n[[func]]\nname = \"mpqapi_add_file\"\naddr = 0x43184B\nsize = 0xDA\n\n[[func]]\nname = \"mpqapi_write_file_contents\"\naddr = 0x431925\nsize = 0x205\n\n[[func]]\nname = \"mpqapi_find_free_block\"\naddr = 0x431B2A\nsize = 0x54\n\n[[func]]\nname = \"mpqapi_rename\"\naddr = 0x431B7E\nsize = 0x3F\n\n[[func]]\nname = \"mpqapi_has_file\"\naddr = 0x431BBD\nsize = 0x10\n\n[[func]]\nname = \"OpenMPQ\"\naddr = 0x431BCD\nsize = 0x1D2\n\n[[func]]\nname = \"ParseMPQHeader\"\naddr = 0x431D9F\nsize = 0xF1\n\n[[func]]\nname = \"CloseMPQ\"\naddr = 0x431E90\nsize = 0x7B\n\n[[func]]\nname = \"mpqapi_store_modified_time\"\naddr = 0x431F0B\nsize = 0x73\n\n[[func]]\nname = \"mpqapi_flush_and_close\"\naddr = 0x431F7E\nsize = 0x5A\n\n[[func]]\nname = \"WriteMPQHeader\"\naddr = 0x431FD8\nsize = 0x96\n\n[[func]]\nname = \"mpqapi_write_block_table\"\naddr = 0x43206E\nsize = 0x8B\n\n[[func]]\nname = \"mpqapi_write_hash_table\"\naddr = 0x4320F9\nsize = 0x8E\n\n[[func]]\nname = \"mpqapi_can_seek\"\naddr = 0x432187\nsize = 0x2B\n\n[[func]]\nname = \"msg_send_drop_pkt\"\naddr = 0x4321C2\nsize = 0x1B\n\n[[func]]\nname = \"msg_send_packet\"\naddr = 0x4321DD\nsize = 0x62\n\n[[func]]\nname = \"msg_get_next_packet\"\naddr = 0x43223F\nsize = 0x3C\n\n[[func]]\nname = \"msg_wait_resync\"\naddr = 0x43227B\nsize = 0x80\n\n[[func]]\nname = \"msg_free_packets\"\naddr = 0x4322FB\nsize = 0x2C\n\n[[func]]\nname = \"msg_wait_for_turns\"\naddr = 0x432327\nsize = 0xD2\n\n[[func]]\nname = \"run_delta_info\"\naddr = 0x4323F9\nsize = 0x22\n\n[[func]]\nname = \"msg_pre_packet\"\naddr = 0x43241B\nsize = 0x67\n\n[[func]]\nname = \"DeltaExportData\"\naddr = 0x432482\nsize = 0xB7\n\n[[func]]\nname = \"DeltaExportItem\"\naddr = 0x432539\nsize = 0x30\n\n[[func]]\nname = \"DeltaExportObject\"\naddr = 0x432569\nsize = 0x14\n\n[[func]]\nname = \"DeltaExportMonster\"\naddr = 0x43257D\nsize = 0x32\n\n[[func]]\nname = \"DeltaExportJunk\"\naddr = 0x4325AF\nsize = 0x78\n\n[[func]]\nname = \"msg_comp_level\"\naddr = 0x432627\nsize = 0x1C\n\n[[func]]\nname = \"delta_init\"\naddr = 0x432643\nsize = 0x47\n\n[[func]]\nname = \"delta_kill_monster\"\naddr = 0x43268A\nsize = 0x46\n\n[[func]]\nname = \"delta_monster_hp\"\naddr = 0x4326D0\nsize = 0x30\n\n[[func]]\nname = \"delta_sync_monster\"\naddr = 0x432700\nsize = 0x42\n\n[[func]]\nname = \"delta_sync_golem\"\naddr = 0x432742\nsize = 0x49\n\n[[func]]\nname = \"delta_leave_sync\"\naddr = 0x43278B\nsize = 0xD2\n\n[[func]]\nname = \"delta_portal_inited\"\naddr = 0x43285D\nsize = 0xE\n\n[[func]]\nname = \"delta_quest_inited\"\naddr = 0x43286B\nsize = 0xE\n\n[[func]]\nname = \"DeltaAddItem\"\naddr = 0x432879\nsize = 0x107\n\n[[func]]\nname = \"DeltaSaveLevel\"\naddr = 0x432980\nsize = 0x48\n\n[[func]]\nname = \"DeltaLoadLevel\"\naddr = 0x4329C8\nsize = 0x4B9\n\n[[func]]\nname = \"NetSendCmd\"\naddr = 0x432E81\nsize = 0x1E\n\n[[func]]\nname = \"NetSendCmdGolem\"\naddr = 0x432E9F\nsize = 0x36\n\n[[func]]\nname = \"NetSendCmdLoc\"\naddr = 0x432ED5\nsize = 0x2C\n\n[[func]]\nname = \"NetSendCmdLocParam1\"\naddr = 0x432F01\nsize = 0x35\n\n[[func]]\nname = \"NetSendCmdLocParam2\"\naddr = 0x432F36\nsize = 0x3D\n\n[[func]]\nname = \"NetSendCmdLocParam3\"\naddr = 0x432F73\nsize = 0x46\n\n[[func]]\nname = \"NetSendCmdParam1\"\naddr = 0x432FB9\nsize = 0x28\n\n[[func]]\nname = \"NetSendCmdParam2\"\naddr = 0x432FE1\nsize = 0x31\n\n[[func]]\nname = \"NetSendCmdParam3\"\naddr = 0x433012\nsize = 0x39\n\n[[func]]\nname = \"NetSendCmdQuest\"\naddr = 0x43304B\nsize = 0x47\n\n[[func]]\nname = \"NetSendCmdGItem\"\naddr = 0x433092\nsize = 0x185\n\n[[func]]\nname = \"NetSendCmdGItem2\"\naddr = 0x433217\nsize = 0x6B\n\n[[func]]\nname = \"NetSendCmdReq2\"\naddr = 0x433282\nsize = 0x5B\n\n[[func]]\nname = \"NetSendCmdExtra\"\naddr = 0x4332DD\nsize = 0x29\n\n[[func]]\nname = \"NetSendCmdPItem\"\naddr = 0x433306\nsize = 0x163\n\n[[func]]\nname = \"NetSendCmdChItem\"\naddr = 0x433469\nsize = 0x57\n\n[[func]]\nname = \"NetSendCmdDelItem\"\naddr = 0x4334C0\nsize = 0x22\n\n[[func]]\nname = \"NetSendCmdDItem\"\naddr = 0x4334E2\nsize = 0x165\n\n[[func]]\nname = \"NetSendCmdDamage\"\naddr = 0x433647\nsize = 0x2B\n\n[[func]]\nname = \"NetSendCmdString\"\naddr = 0x433672\nsize = 0x39\n\n[[func]]\nname = \"delta_close_portal\"\naddr = 0x4336AB\nsize = 0x1F\n\n[[func]]\nname = \"ParseCmd\"\naddr = 0x4336CA\nsize = 0x33F\n\n[[func]]\nname = \"On_DLEVEL\"\naddr = 0x433B7D\nsize = 0xC3\n\n[[func]]\nname = \"DeltaImportData\"\naddr = 0x433C40\nsize = 0x88\n\n[[func]]\nname = \"DeltaImportItem\"\naddr = 0x433CC8\nsize = 0x3B\n\n[[func]]\nname = \"DeltaImportObject\"\naddr = 0x433D03\nsize = 0x14\n\n[[func]]\nname = \"DeltaImportMonster\"\naddr = 0x433D17\nsize = 0x3D\n\n[[func]]\nname = \"DeltaImportJunk\"\naddr = 0x433D54\nsize = 0xAB\n\n[[func]]\nname = \"On_SYNCDATA\"\naddr = 0x433DFF\nsize = 0xB\n\n[[func]]\nname = \"On_WALKXY\"\naddr = 0x433E0A\nsize = 0x4E\n\n[[func]]\nname = \"On_ADDSTR\"\naddr = 0x433E58\nsize = 0x31\n\n[[func]]\nname = \"On_ADDMAG\"\naddr = 0x433E89\nsize = 0x31\n\n[[func]]\nname = \"On_ADDDEX\"\naddr = 0x433EBA\nsize = 0x31\n\n[[func]]\nname = \"On_ADDVIT\"\naddr = 0x433EEB\nsize = 0x31\n\n[[func]]\nname = \"On_SBSPELL\"\naddr = 0x433F1C\nsize = 0x6F\n\n[[func]]\nname = \"msg_errorf\"\naddr = 0x433F8B\nsize = 0x47\n\n[[func]]\nname = \"On_GOTOGETITEM\"\naddr = 0x433FD2\nsize = 0x52\n\n[[func]]\nname = \"On_REQUESTGITEM\"\naddr = 0x434024\nsize = 0xD0\n\n[[func]]\nname = \"i_own_level\"\naddr = 0x4340F4\nsize = 0x47\n\n[[func]]\nname = \"On_GETITEM\"\naddr = 0x43413B\nsize = 0x110\n\n[[func]]\nname = \"delta_get_item\"\naddr = 0x43424B\nsize = 0x103\n\n[[func]]\nname = \"On_GOTOAGETITEM\"\naddr = 0x43434E\nsize = 0x52\n\n[[func]]\nname = \"On_REQUESTAGITEM\"\naddr = 0x4343A0\nsize = 0xCE\n\n[[func]]\nname = \"On_AGETITEM\"\naddr = 0x43446E\nsize = 0x10E\n\n[[func]]\nname = \"On_ITEMEXTRA\"\naddr = 0x43457C\nsize = 0x5B\n\n[[func]]\nname = \"On_PUTITEM\"\naddr = 0x4345D7\nsize = 0x105\n\n[[func]]\nname = \"delta_put_item\"\naddr = 0x4346DC\nsize = 0xAB\n\n[[func]]\nname = \"check_update_plr\"\naddr = 0x434787\nsize = 0x1A\n\n[[func]]\nname = \"On_SYNCPUTITEM\"\naddr = 0x4347A1\nsize = 0xF1\n\n[[func]]\nname = \"On_RESPAWNITEM\"\naddr = 0x434892\nsize = 0xA6\n\n[[func]]\nname = \"On_ATTACKXY\"\naddr = 0x434938\nsize = 0x5C\n\n[[func]]\nname = \"On_SATTACKXY\"\naddr = 0x434994\nsize = 0x4F\n\n[[func]]\nname = \"On_RATTACKXY\"\naddr = 0x4349E3\nsize = 0x4F\n\n[[func]]\nname = \"On_SPELLXYD\"\naddr = 0x434A32\nsize = 0xAE\n\n[[func]]\nname = \"On_SPELLXY\"\naddr = 0x434AE0\nsize = 0xA4\n\n[[func]]\nname = \"On_TSPELLXY\"\naddr = 0x434B84\nsize = 0xA4\n\n[[func]]\nname = \"On_OPOBJXY\"\naddr = 0x434C28\nsize = 0x70\n\n[[func]]\nname = \"On_DISARMXY\"\naddr = 0x434C98\nsize = 0x70\n\n[[func]]\nname = \"On_OPOBJT\"\naddr = 0x434D08\nsize = 0x38\n\n[[func]]\nname = \"On_ATTACKID\"\naddr = 0x434D40\nsize = 0xAD\n\n[[func]]\nname = \"On_ATTACKPID\"\naddr = 0x434DED\nsize = 0x61\n\n[[func]]\nname = \"On_RATTACKID\"\naddr = 0x434E4E\nsize = 0x45\n\n[[func]]\nname = \"On_RATTACKPID\"\naddr = 0x434E93\nsize = 0x45\n\n[[func]]\nname = \"On_SPELLID\"\naddr = 0x434ED8\nsize = 0x9A\n\n[[func]]\nname = \"On_SPELLPID\"\naddr = 0x434F72\nsize = 0x9A\n\n[[func]]\nname = \"On_TSPELLID\"\naddr = 0x43500C\nsize = 0x9A\n\n[[func]]\nname = \"On_TSPELLPID\"\naddr = 0x4350A6\nsize = 0x9A\n\n[[func]]\nname = \"On_KNOCKBACK\"\naddr = 0x435140\nsize = 0x42\n\n[[func]]\nname = \"On_RESURRECT\"\naddr = 0x435182\nsize = 0x30\n\n[[func]]\nname = \"On_HEALOTHER\"\naddr = 0x4351B2\nsize = 0x31\n\n[[func]]\nname = \"On_TALKXY\"\naddr = 0x4351E3\nsize = 0x52\n\n[[func]]\nname = \"On_NEWLVL\"\naddr = 0x435235\nsize = 0x34\n\n[[func]]\nname = \"On_WARP\"\naddr = 0x435269\nsize = 0x5F\n\n[[func]]\nname = \"On_MONSTDEATH\"\naddr = 0x4352C8\nsize = 0x69\n\n[[func]]\nname = \"On_KILLGOLEM\"\naddr = 0x435331\nsize = 0x66\n\n[[func]]\nname = \"On_AWAKEGOLEM\"\naddr = 0x435397\nsize = 0xB4\n\n[[func]]\nname = \"On_MONSTDAMAGE\"\naddr = 0x43544B\nsize = 0xB8\n\n[[func]]\nname = \"On_PLRDEAD\"\naddr = 0x435503\nsize = 0x38\n\n[[func]]\nname = \"On_PLRDAMAGE\"\naddr = 0x43553B\nsize = 0xB0\n\n[[func]]\nname = \"On_OPENDOOR\"\naddr = 0x4355EB\nsize = 0x56\n\n[[func]]\nname = \"delta_sync_object\"\naddr = 0x435641\nsize = 0x25\n\n[[func]]\nname = \"On_CLOSEDOOR\"\naddr = 0x435666\nsize = 0x56\n\n[[func]]\nname = \"On_OPERATEOBJ\"\naddr = 0x4356BC\nsize = 0x56\n\n[[func]]\nname = \"On_PLROPOBJ\"\naddr = 0x435712\nsize = 0x58\n\n[[func]]\nname = \"On_BREAKOBJ\"\naddr = 0x43576A\nsize = 0x54\n\n[[func]]\nname = \"On_CHANGEPLRITEMS\"\naddr = 0x4357BE\nsize = 0x40\n\n[[func]]\nname = \"On_DELPLRITEMS\"\naddr = 0x4357FE\nsize = 0x2E\n\n[[func]]\nname = \"On_PLRLEVEL\"\naddr = 0x43582C\nsize = 0x3A\n\n[[func]]\nname = \"On_DROPITEM\"\naddr = 0x435866\nsize = 0x37\n\n[[func]]\nname = \"On_SEND_PLRINFO\"\naddr = 0x43589D\nsize = 0x3A\n\n[[func]]\nname = \"On_ACK_PLRINFO\"\naddr = 0x4358D7\nsize = 0x5\n\n[[func]]\nname = \"On_PLAYER_JOINLEVEL\"\naddr = 0x4358DC\nsize = 0x17A\n\n[[func]]\nname = \"On_ACTIVATEPORTAL\"\naddr = 0x435A56\nsize = 0xD9\n\n[[func]]\nname = \"delta_open_portal\"\naddr = 0x435B2F\nsize = 0x3B\n\n[[func]]\nname = \"On_DEACTIVATEPORTAL\"\naddr = 0x435B6A\nsize = 0x3E\n\n[[func]]\nname = \"On_RETOWN\"\naddr = 0x435BA8\nsize = 0x39\n\n[[func]]\nname = \"On_SETSTR\"\naddr = 0x435BE1\nsize = 0x39\n\n[[func]]\nname = \"On_SETDEX\"\naddr = 0x435C1A\nsize = 0x39\n\n[[func]]\nname = \"On_SETMAG\"\naddr = 0x435C53\nsize = 0x39\n\n[[func]]\nname = \"On_SETVIT\"\naddr = 0x435C8C\nsize = 0x39\n\n[[func]]\nname = \"On_STRING\"\naddr = 0x435CC5\nsize = 0xB\n\n[[func]]\nname = \"On_STRING2\"\naddr = 0x435CD0\nsize = 0x2A\n\n[[func]]\nname = \"On_SYNCQUEST\"\naddr = 0x435CFA\nsize = 0x42\n\n[[func]]\nname = \"On_ENDSHIELD\"\naddr = 0x435D3C\nsize = 0x77\n\n[[func]]\nname = \"On_CHEAT_EXPERIENCE\"\naddr = 0x435E53\nsize = 0x4\n\n[[func]]\nname = \"On_CHEAT_SPELL_LEVEL\"\naddr = 0x435E53\nsize = 0x4\n\n[[func]]\nname = \"On_DEBUG\"\naddr = 0x435E53\nsize = 0x4\n\n[[func]]\nname = \"On_NOVA\"\naddr = 0x435DB3\nsize = 0x6F\n\n[[func]]\nname = \"On_SETSHIELD\"\naddr = 0x435E22\nsize = 0x18\n\n[[func]]\nname = \"On_REMSHIELD\"\naddr = 0x435E3A\nsize = 0x19\n\n[[func]]\nname = \"msgcmd_cmd_cleanup\"\naddr = 0x435E9B\nsize = 0xA\n\n[[func]]\nname = \"msgcmd_send_chat\"\naddr = 0x435EA5\nsize = 0x3D\n\n[[func]]\nname = \"msgcmd_add_server_cmd_W\"\naddr = 0x435EE2\nsize = 0x11\n\n[[func]]\nname = \"msgcmd_add_server_cmd\"\naddr = 0x435EF3\nsize = 0x3B\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::TList<EXTERNMESSAGE>\"\naddr = 0x435F2E\nsize = 0x16\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::DeleteAll\"\naddr = 0x435F44\nsize = 0x28\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::Remove\"\naddr = 0x435F6C\nsize = 0x3B\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::Create\"\naddr = 0x435FA7\nsize = 0x4C\n\n[[func]]\nname = \"EXTERNMESSAGE::Delete\"\naddr = 0x435FF3\nsize = 0x2F\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::Insert\"\naddr = 0x436022\nsize = 0x71\n\n[[func]]\nname = \"TList<EXTERNMESSAGE>::UnlinkAll\"\naddr = 0x436093\nsize = 0x13\n\n[[func]]\nname = \"TLink<EXTERNMESSAGE>::Unlink\"\naddr = 0x4360A6\nsize = 0x2C\n\n[[func]]\nname = \"multi_msg_add\"\naddr = 0x4360E2\nsize = 0xE\n\n[[func]]\nname = \"NetSendLoPri\"\naddr = 0x4360F0\nsize = 0x29\n\n[[func]]\nname = \"multi_copy_packet\"\naddr = 0x436119\nsize = 0x42\n\n[[func]]\nname = \"multi_send_packet\"\naddr = 0x43615B\nsize = 0x68\n\n[[func]]\nname = \"NetRecvPlrData\"\naddr = 0x4361C3\nsize = 0xBA\n\n[[func]]\nname = \"NetSendHiPri\"\naddr = 0x43627D\nsize = 0xB8\n\n[[func]]\nname = \"multi_recv_packet\"\naddr = 0x436335\nsize = 0x69\n\n[[func]]\nname = \"multi_send_msg_packet\"\naddr = 0x43639E\nsize = 0x7E\n\n[[func]]\nname = \"multi_msg_countdown\"\naddr = 0x43641C\nsize = 0x2F\n\n[[func]]\nname = \"multi_parse_turn\"\naddr = 0x43644B\nsize = 0x48\n\n[[func]]\nname = \"multi_handle_turn_upper_bit\"\naddr = 0x436493\nsize = 0x32\n\n[[func]]\nname = \"multi_player_left\"\naddr = 0x4364C5\nsize = 0x13\n\n[[func]]\nname = \"multi_clear_left_tbl\"\naddr = 0x4364D8\nsize = 0x44\n\n[[func]]\nname = \"multi_player_left_msg\"\naddr = 0x43651C\nsize = 0x8F\n\n[[func]]\nname = \"multi_net_ping\"\naddr = 0x4365AB\nsize = 0x13\n\n[[func]]\nname = \"multi_handle_delta\"\naddr = 0x4365BE\nsize = 0xA8\n\n[[func]]\nname = \"multi_check_pkt_valid\"\naddr = 0x436666\nsize = 0x8\n\n[[func]]\nname = \"multi_mon_seeds\"\naddr = 0x43666E\nsize = 0x33\n\n[[func]]\nname = \"multi_begin_timeout\"\naddr = 0x4366A1\nsize = 0x95\n\n[[func]]\nname = \"multi_check_drop_player\"\naddr = 0x436736\nsize = 0x2B\n\n[[func]]\nname = \"multi_process_network_packets\"\naddr = 0x436761\nsize = 0x2CA\n\n[[func]]\nname = \"multi_handle_all_packets\"\naddr = 0x436A2B\nsize = 0x27\n\n[[func]]\nname = \"multi_process_tmsgs\"\naddr = 0x436A52\nsize = 0x33\n\n[[func]]\nname = \"multi_send_zero_packet\"\naddr = 0x436A85\nsize = 0xE6\n\n[[func]]\nname = \"NetClose\"\naddr = 0x436B6B\nsize = 0x47\n\n[[func]]\nname = \"multi_event_handler\"\naddr = 0x436BB2\nsize = 0x48\n\n[[func]]\nname = \"multi_handle_events\"\naddr = 0x436BFA\nsize = 0xA8\n\n[[func]]\nname = \"NetInit\"\naddr = 0x436CA2\nsize = 0x2FE\n\n[[func]]\nname = \"buffer_init\"\naddr = 0x436FA0\nsize = 0x8\n\n[[func]]\nname = \"multi_send_pinfo\"\naddr = 0x436FA8\nsize = 0x3B\n\n[[func]]\nname = \"InitLevelType\"\naddr = 0x436FE3\nsize = 0x30\n\n[[func]]\nname = \"SetupLocalCoords\"\naddr = 0x437013\nsize = 0x96\n\n[[func]]\nname = \"multi_init_single\"\naddr = 0x4370A9\nsize = 0x6E\n\n[[func]]\nname = \"multi_init_multi\"\naddr = 0x437117\nsize = 0xD2\n\n[[func]]\nname = \"multi_upgrade\"\naddr = 0x4371E9\nsize = 0x3C\n\n[[func]]\nname = \"recv_plrinfo\"\naddr = 0x437225\nsize = 0x197\n\n[[func]]\nname = \"nthread_terminate_game\"\naddr = 0x4373FA\nsize = 0x3C\n\n[[func]]\nname = \"nthread_send_and_recv_turn\"\naddr = 0x437436\nsize = 0x82\n\n[[func]]\nname = \"nthread_recv_turns\"\naddr = 0x4374B8\nsize = 0xAC\n\n[[func]]\nname = \"nthread_set_turn_upper_bit\"\naddr = 0x437564\nsize = 0xB\n\n[[func]]\nname = \"nthread_start\"\naddr = 0x43756F\nsize = 0x16E\n\n[[func]]\nname = \"nthread_handler\"\naddr = 0x4376DD\nsize = 0x76\n\n[[func]]\nname = \"nthread_cleanup\"\naddr = 0x437753\nsize = 0x7F\n\n[[func]]\nname = \"nthread_ignore_mutex\"\naddr = 0x4377D2\nsize = 0x2B\n\n[[func]]\nname = \"nthread_has_500ms_passed\"\naddr = 0x4377FD\nsize = 0x2E\n\n[[func]]\nname = \"InitObjectGFX\"\naddr = 0x43782B\nsize = 0xFA\n\n[[func]]\nname = \"FreeObjectGFX\"\naddr = 0x437925\nsize = 0x2E\n\n[[func]]\nname = \"RndLocOk\"\naddr = 0x437953\nsize = 0x5B\n\n[[func]]\nname = \"InitRndLocObj\"\naddr = 0x4379AE\nsize = 0xD7\n\n[[func]]\nname = \"InitRndLocBigObj\"\naddr = 0x437A85\nsize = 0x10D\n\n[[func]]\nname = \"InitRndLocObj5x5\"\naddr = 0x437B92\nsize = 0xB7\n\n[[func]]\nname = \"ClrAllObjects\"\naddr = 0x437C49\nsize = 0x6D\n\n[[func]]\nname = \"AddTortures\"\naddr = 0x437CB6\nsize = 0xF7\n\n[[func]]\nname = \"AddCandles\"\naddr = 0x437DAD\nsize = 0x49\n\n[[func]]\nname = \"AddBookLever\"\naddr = 0x437DF6\nsize = 0x11C\n\n[[func]]\nname = \"InitRndBarrels\"\naddr = 0x437F12\nsize = 0xFC\n\n[[func]]\nname = \"AddL1Objs\"\naddr = 0x43800E\nsize = 0x98\n\n[[func]]\nname = \"AddL2Objs\"\naddr = 0x4380A6\nsize = 0x7E\n\n[[func]]\nname = \"AddL3Objs\"\naddr = 0x438124\nsize = 0x74\n\n[[func]]\nname = \"WallTrapLocOk\"\naddr = 0x438198\nsize = 0x16\n\n[[func]]\nname = \"AddL2Torches\"\naddr = 0x4381AE\nsize = 0xEC\n\n[[func]]\nname = \"TorchLocOK\"\naddr = 0x43829A\nsize = 0x27\n\n[[func]]\nname = \"AddObjTraps\"\naddr = 0x4382C1\nsize = 0x1A5\n\n[[func]]\nname = \"AddChestTraps\"\naddr = 0x438466\nsize = 0x8C\n\n[[func]]\nname = \"LoadMapObjects\"\naddr = 0x4384F2\nsize = 0xCB\n\n[[func]]\nname = \"LoadMapObjs\"\naddr = 0x4385BD\nsize = 0x87\n\n[[func]]\nname = \"AddDiabObjs\"\naddr = 0x438644\nsize = 0xBC\n\n[[func]]\nname = \"AddStoryBooks\"\naddr = 0x438700\nsize = 0xD8\n\n[[func]]\nname = \"AddHookedBodies\"\naddr = 0x4387D8\nsize = 0xD5\n\n[[func]]\nname = \"AddL4Goodies\"\naddr = 0x4388AD\nsize = 0x77\n\n[[func]]\nname = \"AddLazStand\"\naddr = 0x438924\nsize = 0x102\n\n[[func]]\nname = \"InitObjects\"\naddr = 0x438A26\nsize = 0x3AD\n\n[[func]]\nname = \"DeleteObject_\"\naddr = 0x438DD3\nsize = 0x50\n\n[[func]]\nname = \"SetupObject\"\naddr = 0x438E23\nsize = 0x122\n\n[[func]]\nname = \"SetObjMapRange\"\naddr = 0x438F45\nsize = 0x34\n\n[[func]]\nname = \"SetBookMsg\"\naddr = 0x438F79\nsize = 0xA\n\n[[func]]\nname = \"AddL1Door\"\naddr = 0x438F83\nsize = 0x51\n\n[[func]]\nname = \"AddSCambBook\"\naddr = 0x438FD4\nsize = 0x49\n\n[[func]]\nname = \"AddChest\"\naddr = 0x43901D\nsize = 0xB2\n\n[[func]]\nname = \"AddL2Door\"\naddr = 0x4390CF\nsize = 0x3B\n\n[[func]]\nname = \"AddL3Door\"\naddr = 0x43910A\nsize = 0x3B\n\n[[func]]\nname = \"AddSarc\"\naddr = 0x439145\nsize = 0x51\n\n[[func]]\nname = \"AddFlameTrap\"\naddr = 0x439196\nsize = 0x28\n\n[[func]]\nname = \"AddFlameLvr\"\naddr = 0x4391BE\nsize = 0x19\n\n[[func]]\nname = \"AddTrap\"\naddr = 0x4391D7\nsize = 0x5B\n\n[[func]]\nname = \"AddObjLight\"\naddr = 0x439232\nsize = 0x37\n\n[[func]]\nname = \"AddBarrel\"\naddr = 0x439269\nsize = 0x4E\n\n[[func]]\nname = \"AddShrine\"\naddr = 0x4392B7\nsize = 0xA3\n\n[[func]]\nname = \"AddBookcase\"\naddr = 0x43935A\nsize = 0x1D\n\n[[func]]\nname = \"AddPurifyingFountain\"\naddr = 0x43938A\nsize = 0x39\n\n[[func]]\nname = \"AddArmorStand\"\naddr = 0x4393C3\nsize = 0x32\n\n[[func]]\nname = \"AddDecap\"\naddr = 0x4393F5\nsize = 0x2E\n\n[[func]]\nname = \"AddVilebook\"\naddr = 0x439423\nsize = 0x20\n\n[[func]]\nname = \"AddMagicCircle\"\naddr = 0x439443\nsize = 0x29\n\n[[func]]\nname = \"AddBookstand\"\naddr = 0x439377\nsize = 0x13\n\n[[func]]\nname = \"AddPedistal\"\naddr = 0x43946C\nsize = 0x38\n\n[[func]]\nname = \"AddStoryBook\"\naddr = 0x4394A4\nsize = 0x92\n\n[[func]]\nname = \"AddWeaponRack\"\naddr = 0x439536\nsize = 0x32\n\n[[func]]\nname = \"AddTorturedBody\"\naddr = 0x439568\nsize = 0x2E\n\n[[func]]\nname = \"GetRndObjLoc\"\naddr = 0x439596\nsize = 0x8A\n\n[[func]]\nname = \"AddMushPatch\"\naddr = 0x439620\nsize = 0x5C\n\n[[func]]\nname = \"AddSlainHero\"\naddr = 0x43967C\nsize = 0x2B\n\n[[func]]\nname = \"AddObject\"\naddr = 0x4396A7\nsize = 0x1EB\n\n[[func]]\nname = \"Obj_Light\"\naddr = 0x439973\nsize = 0xEA\n\n[[func]]\nname = \"Obj_Circle\"\naddr = 0x439A5D\nsize = 0x172\n\n[[func]]\nname = \"Obj_StopAnim\"\naddr = 0x439BCF\nsize = 0x23\n\n[[func]]\nname = \"Obj_Door\"\naddr = 0x439BF2\nsize = 0x83\n\n[[func]]\nname = \"Obj_Sarc\"\naddr = 0x439C75\nsize = 0x19\n\n[[func]]\nname = \"ActivateTrapLine\"\naddr = 0x439C8E\nsize = 0x6F\n\n[[func]]\nname = \"Obj_FlameTrap\"\naddr = 0x439CFD\nsize = 0x111\n\n[[func]]\nname = \"Obj_Trap\"\naddr = 0x439E0E\nsize = 0x16F\n\n[[func]]\nname = \"Obj_BCrossDamage\"\naddr = 0x439F7D\nsize = 0xE7\n\n[[func]]\nname = \"ProcessObjects\"\naddr = 0x43A064\nsize = 0x197\n\n[[func]]\nname = \"ObjSetMicro\"\naddr = 0x43A1FB\nsize = 0x81\n\n[[func]]\nname = \"objects_set_door_piece\"\naddr = 0x43A27C\nsize = 0x78\n\n[[func]]\nname = \"ObjSetMini\"\naddr = 0x43A2F4\nsize = 0x78\n\n[[func]]\nname = \"ObjL1Special\"\naddr = 0x43A36C\nsize = 0xEC\n\n[[func]]\nname = \"ObjL2Special\"\naddr = 0x43A458\nsize = 0xFC\n\n[[func]]\nname = \"DoorSet\"\naddr = 0x43A554\nsize = 0x184\n\n[[func]]\nname = \"RedoPlayerVision\"\naddr = 0x43A6D8\nsize = 0x35\n\n[[func]]\nname = \"OperateL1RDoor\"\naddr = 0x43A70D\nsize = 0x1C1\n\n[[func]]\nname = \"OperateL1LDoor\"\naddr = 0x43A8CE\nsize = 0x1D7\n\n[[func]]\nname = \"OperateL2RDoor\"\naddr = 0x43AAA5\nsize = 0x162\n\n[[func]]\nname = \"OperateL2LDoor\"\naddr = 0x43AC07\nsize = 0x162\n\n[[func]]\nname = \"OperateL3RDoor\"\naddr = 0x43AD69\nsize = 0x165\n\n[[func]]\nname = \"OperateL3LDoor\"\naddr = 0x43AECE\nsize = 0x165\n\n[[func]]\nname = \"MonstCheckDoors\"\naddr = 0x43B033\nsize = 0x222\n\n[[func]]\nname = \"ObjChangeMap\"\naddr = 0x43B255\nsize = 0xDB\n\n[[func]]\nname = \"ObjChangeMapResync\"\naddr = 0x43B330\nsize = 0xB1\n\n[[func]]\nname = \"OperateL1Door\"\naddr = 0x43B3E1\nsize = 0x8F\n\n[[func]]\nname = \"OperateLever\"\naddr = 0x43B470\nsize = 0xCE\n\n[[func]]\nname = \"OperateBook\"\naddr = 0x43B53E\nsize = 0x225\n\n[[func]]\nname = \"OperateBookLever\"\naddr = 0x43B763\nsize = 0x1B2\n\n[[func]]\nname = \"OperateSChambBk\"\naddr = 0x43B915\nsize = 0xD7\n\n[[func]]\nname = \"OperateChest\"\naddr = 0x43B9EC\nsize = 0x189\n\n[[func]]\nname = \"OperateMushPatch\"\naddr = 0x43BB75\nsize = 0xBD\n\n[[func]]\nname = \"OperateInnSignChest\"\naddr = 0x43BC32\nsize = 0xB0\n\n[[func]]\nname = \"OperateSlainHero\"\naddr = 0x43BCE2\nsize = 0xA5\n\n[[func]]\nname = \"OperateTrapLvr\"\naddr = 0x43BD87\nsize = 0xB7\n\n[[func]]\nname = \"OperateSarc\"\naddr = 0x43BE3E\nsize = 0xD1\n\n[[func]]\nname = \"OperateL2Door\"\naddr = 0x43BF0F\nsize = 0x90\n\n[[func]]\nname = \"OperateL3Door\"\naddr = 0x43BF9F\nsize = 0x90\n\n[[func]]\nname = \"OperatePedistal\"\naddr = 0x43C02F\nsize = 0x163\n\n[[func]]\nname = \"TryDisarm\"\naddr = 0x43C192\nsize = 0xD4\n\n[[func]]\nname = \"ItemMiscIdIdx\"\naddr = 0x43C266\nsize = 0x18\n\n[[func]]\nname = \"OperateShrine\"\naddr = 0x43C27E\nsize = 0xFB7\n\n[[func]]\nname = \"OperateSkelBook\"\naddr = 0x43D29D\nsize = 0x9E\n\n[[func]]\nname = \"OperateBookCase\"\naddr = 0x43D33B\nsize = 0xE0\n\n[[func]]\nname = \"OperateDecap\"\naddr = 0x43D41B\nsize = 0x5E\n\n[[func]]\nname = \"OperateArmorStand\"\naddr = 0x43D479\nsize = 0xC6\n\n[[func]]\nname = \"FindValidShrine\"\naddr = 0x43D53F\nsize = 0x53\n\n[[func]]\nname = \"OperateGoatShrine\"\naddr = 0x43D592\nsize = 0x4B\n\n[[func]]\nname = \"OperateCauldron\"\naddr = 0x43D5DD\nsize = 0x52\n\n[[func]]\nname = \"OperateFountains\"\naddr = 0x43D62F\nsize = 0x2B1\n\n[[func]]\nname = \"OperateWeaponRack\"\naddr = 0x43D8E0\nsize = 0xAB\n\n[[func]]\nname = \"OperateStoryBook\"\naddr = 0x43D98B\nsize = 0x63\n\n[[func]]\nname = \"OperateLazStand\"\naddr = 0x43D9EE\nsize = 0x65\n\n[[func]]\nname = \"OperateObject\"\naddr = 0x43DA53\nsize = 0x249\n\n[[func]]\nname = \"SyncOpL1Door\"\naddr = 0x43DD65\nsize = 0x71\n\n[[func]]\nname = \"SyncOpL2Door\"\naddr = 0x43DDD6\nsize = 0x72\n\n[[func]]\nname = \"SyncOpL3Door\"\naddr = 0x43DE48\nsize = 0x72\n\n[[func]]\nname = \"SyncOpObject\"\naddr = 0x43DEBA\nsize = 0xED\n\n[[func]]\nname = \"BreakCrux\"\naddr = 0x43E060\nsize = 0xC2\n\n[[func]]\nname = \"BreakBarrel\"\naddr = 0x43E122\nsize = 0x274\n\n[[func]]\nname = \"BreakObject\"\naddr = 0x43E396\nsize = 0x8C\n\n[[func]]\nname = \"SyncBreakObj\"\naddr = 0x43E422\nsize = 0x21\n\n[[func]]\nname = \"SyncL1Doors\"\naddr = 0x43E443\nsize = 0xAB\n\n[[func]]\nname = \"SyncCrux\"\naddr = 0x43E4EE\nsize = 0x7E\n\n[[func]]\nname = \"SyncLever\"\naddr = 0x43E56C\nsize = 0x2A\n\n[[func]]\nname = \"SyncQSTLever\"\naddr = 0x43E596\nsize = 0x6F\n\n[[func]]\nname = \"SyncPedistal\"\naddr = 0x43E605\nsize = 0xC6\n\n[[func]]\nname = \"SyncL2Doors\"\naddr = 0x43E6CB\nsize = 0x86\n\n[[func]]\nname = \"SyncL3Doors\"\naddr = 0x43E751\nsize = 0x92\n\n[[func]]\nname = \"SyncObjectAnim\"\naddr = 0x43E7E3\nsize = 0xAE\n\n[[func]]\nname = \"GetObjectStr\"\naddr = 0x43E891\nsize = 0x20E\n\n[[func]]\nname = \"PackPlayer\"\naddr = 0x43EB98\nsize = 0x1EE\n\n[[func]]\nname = \"PackItem\"\naddr = 0x43ED86\nsize = 0x10B\n\n[[func]]\nname = \"VerifyGoldSeeds\"\naddr = 0x43EE91\nsize = 0x72\n\n[[func]]\nname = \"UnPackPlayer\"\naddr = 0x43EF03\nsize = 0x278\n\n[[func]]\nname = \"UnPackItem\"\naddr = 0x43F17B\nsize = 0xAD\n\n[[func]]\nname = \"SaveGamma\"\naddr = 0x43F238\nsize = 0x2E\n\n[[func]]\nname = \"palette_init\"\naddr = 0x43F266\nsize = 0x78\n\n[[func]]\nname = \"LoadGamma\"\naddr = 0x43F2DE\nsize = 0x75\n\n[[func]]\nname = \"LoadSysPal\"\naddr = 0x43F353\nsize = 0xA9\n\n[[func]]\nname = \"LoadPalette\"\naddr = 0x43F3FC\nsize = 0x5C\n\n[[func]]\nname = \"LoadRndLvlPal\"\naddr = 0x43F458\nsize = 0x47\n\n[[func]]\nname = \"ResetPal\"\naddr = 0x43F49F\nsize = 0x2B\n\n[[func]]\nname = \"IncreaseGamma\"\naddr = 0x43F4CA\nsize = 0x39\n\n[[func]]\nname = \"palette_update\"\naddr = 0x43F503\nsize = 0x37\n\n[[func]]\nname = \"ApplyGamma\"\naddr = 0x43F53A\nsize = 0xC9\n\n[[func]]\nname = \"DecreaseGamma\"\naddr = 0x43F603\nsize = 0x39\n\n[[func]]\nname = \"UpdateGamma\"\naddr = 0x43F63C\nsize = 0x35\n\n[[func]]\nname = \"BlackPalette\"\naddr = 0x43F671\nsize = 0x7\n\n[[func]]\nname = \"SetFadeLevel\"\naddr = 0x43F678\nsize = 0x6B\n\n[[func]]\nname = \"PaletteFadeIn\"\naddr = 0x43F6E3\nsize = 0x56\n\n[[func]]\nname = \"PaletteFadeOut\"\naddr = 0x43F739\nsize = 0x30\n\n[[func]]\nname = \"palette_update_caves\"\naddr = 0x43F769\nsize = 0x62\n\n[[func]]\nname = \"palette_get_colour_cycling\"\naddr = 0x43F7CB\nsize = 0x6\n\n[[func]]\nname = \"palette_set_color_cycling\"\naddr = 0x43F7D1\nsize = 0x8\n\n[[func]]\nname = \"FindPath\"\naddr = 0x43F7D9\nsize = 0xFF\n\n[[func]]\nname = \"path_get_h_cost\"\naddr = 0x43F8D8\nsize = 0x31\n\n[[func]]\nname = \"path_check_equal\"\naddr = 0x43F909\nsize = 0x18\n\n[[func]]\nname = \"GetNextPath\"\naddr = 0x43F921\nsize = 0x2A\n\n[[func]]\nname = \"path_solid_pieces\"\naddr = 0x43F94B\nsize = 0xA7\n\n[[func]]\nname = \"path_get_path\"\naddr = 0x43F9F2\nsize = 0x82\n\n[[func]]\nname = \"path_parent_path\"\naddr = 0x43FA74\nsize = 0x12B\n\n[[func]]\nname = \"path_get_node1\"\naddr = 0x43FB9F\nsize = 0x19\n\n[[func]]\nname = \"path_get_node2\"\naddr = 0x43FBB8\nsize = 0x19\n\n[[func]]\nname = \"path_next_node\"\naddr = 0x43FBD1\nsize = 0x2B\n\n[[func]]\nname = \"path_set_coords\"\naddr = 0x43FBFC\nsize = 0x99\n\n[[func]]\nname = \"path_push_active_step\"\naddr = 0x43FC95\nsize = 0x13\n\n[[func]]\nname = \"path_pop_active_step\"\naddr = 0x43FCA8\nsize = 0x13\n\n[[func]]\nname = \"path_new_step\"\naddr = 0x43FCBB\nsize = 0x36\n\n[[func]]\nname = \"pfile_init_save_directory\"\naddr = 0x43FD01\nsize = 0x5F\n\n[[func]]\nname = \"pfile_check_available_space\"\naddr = 0x43FD60\nsize = 0x68\n\n[[func]]\nname = \"pfile_write_hero\"\naddr = 0x43FDC8\nsize = 0x70\n\n[[func]]\nname = \"pfile_get_save_num_from_name\"\naddr = 0x43FE38\nsize = 0x28\n\n[[func]]\nname = \"pfile_encode_hero\"\naddr = 0x43FE60\nsize = 0x84\n\n[[func]]\nname = \"pfile_open_archive\"\naddr = 0x43FEE4\nsize = 0x51\n\n[[func]]\nname = \"pfile_get_save_path\"\naddr = 0x43FF35\nsize = 0x82\n\n[[func]]\nname = \"pfile_flush\"\naddr = 0x43FFB7\nsize = 0x32\n\n[[func]]\nname = \"pfile_create_player_description\"\naddr = 0x43FFE9\nsize = 0x76\n\n[[func]]\nname = \"pfile_rename_hero\"\naddr = 0x44005F\nsize = 0xC8\n\n[[func]]\nname = \"pfile_flush_W\"\naddr = 0x440127\nsize = 0x21\n\n[[func]]\nname = \"game_2_ui_player\"\naddr = 0x440148\nsize = 0x90\n\n[[func]]\nname = \"game_2_ui_class\"\naddr = 0x4401D8\nsize = 0x13\n\n[[func]]\nname = \"pfile_ui_set_hero_infos\"\naddr = 0x4401EB\nsize = 0x1C7\n\n[[func]]\nname = \"GetSaveDirectory\"\naddr = 0x4403B2\nsize = 0x8C\n\n[[func]]\nname = \"pfile_read_hero\"\naddr = 0x44043E\nsize = 0x122\n\n[[func]]\nname = \"pfile_open_save_archive\"\naddr = 0x440560\nsize = 0x3A\n\n[[func]]\nname = \"pfile_SFileCloseArchive\"\naddr = 0x44059A\nsize = 0x7\n\n[[func]]\nname = \"pfile_archive_contains_game\"\naddr = 0x4405A1\nsize = 0x33\n\n[[func]]\nname = \"pfile_ui_set_class_stats\"\naddr = 0x4405D4\nsize = 0x44\n\n[[func]]\nname = \"pfile_get_player_class\"\naddr = 0x440618\nsize = 0x10\n\n[[func]]\nname = \"pfile_ui_save_create\"\naddr = 0x440628\nsize = 0xDF\n\n[[func]]\nname = \"pfile_get_file_name\"\naddr = 0x440707\nsize = 0x57\n\n[[func]]\nname = \"pfile_delete_save\"\naddr = 0x44075E\nsize = 0x4A\n\n[[func]]\nname = \"pfile_read_player_from_save\"\naddr = 0x4407A8\nsize = 0x79\n\n[[func]]\nname = \"GetTempLevelNames\"\naddr = 0x440821\nsize = 0x4A\n\n[[func]]\nname = \"GetPermLevelNames\"\naddr = 0x44086B\nsize = 0x86\n\n[[func]]\nname = \"pfile_get_game_name\"\naddr = 0x4408F1\nsize = 0x29\n\n[[func]]\nname = \"pfile_remove_temp_files\"\naddr = 0x44091A\nsize = 0x51\n\n[[func]]\nname = \"GetTempSaveNames\"\naddr = 0x44096B\nsize = 0x35\n\n[[func]]\nname = \"pfile_rename_temp_to_perm\"\naddr = 0x4409A0\nsize = 0xAC\n\n[[func]]\nname = \"GetPermSaveNames\"\naddr = 0x440A4C\nsize = 0x35\n\n[[func]]\nname = \"pfile_write_save_file\"\naddr = 0x440A81\nsize = 0xAE\n\n[[func]]\nname = \"pfile_strcpy\"\naddr = 0x440B2F\nsize = 0xA\n\n[[func]]\nname = \"pfile_read\"\naddr = 0x440B39\nsize = 0x182\n\n[[func]]\nname = \"pfile_update\"\naddr = 0x440CBB\nsize = 0x33\n\n[[func]]\nname = \"SetPlayerGPtrs\"\naddr = 0x440CFE\nsize = 0x1B\n\n[[func]]\nname = \"LoadPlrGFX\"\naddr = 0x440D19\nsize = 0x25F\n\n[[func]]\nname = \"InitPlayerGFX\"\naddr = 0x440F78\nsize = 0x44\n\n[[func]]\nname = \"InitPlrGFXMem\"\naddr = 0x440FBC\nsize = 0x214\n\n[[func]]\nname = \"GetPlrGFXSize\"\naddr = 0x4411D0\nsize = 0xC9\n\n[[func]]\nname = \"FreePlayerGFX\"\naddr = 0x441299\nsize = 0xAE\n\n[[func]]\nname = \"NewPlrAnim\"\naddr = 0x441347\nsize = 0x65\n\n[[func]]\nname = \"ClearPlrPVars\"\naddr = 0x4413AC\nsize = 0x51\n\n[[func]]\nname = \"SetPlrAnims\"\naddr = 0x4413FD\nsize = 0x172\n\n[[func]]\nname = \"ClearPlrRVars\"\naddr = 0x44156F\nsize = 0x77\n\n[[func]]\nname = \"CreatePlayer\"\naddr = 0x4415E6\nsize = 0x2CB\n\n[[func]]\nname = \"CalcStatDiff\"\naddr = 0x4418B1\nsize = 0x41\n\n[[func]]\nname = \"NextPlrLevel\"\naddr = 0x4418F2\nsize = 0x105\n\n[[func]]\nname = \"AddPlrExperience\"\naddr = 0x4419F7\nsize = 0x130\n\n[[func]]\nname = \"AddPlrMonstExper\"\naddr = 0x441B27\nsize = 0x44\n\n[[func]]\nname = \"InitPlayer\"\naddr = 0x441B6B\nsize = 0x2D2\n\n[[func]]\nname = \"InitMultiView\"\naddr = 0x441E3D\nsize = 0x3A\n\n[[func]]\nname = \"CheckEFlag\"\naddr = 0x441E77\nsize = 0x155\n\n[[func]]\nname = \"SolidLoc\"\naddr = 0x441FCC\nsize = 0x29\n\n[[func]]\nname = \"PlrDirOK\"\naddr = 0x441FF5\nsize = 0xAF\n\n[[func]]\nname = \"PlrClrTrans\"\naddr = 0x4420A4\nsize = 0x43\n\n[[func]]\nname = \"PlrDoTrans\"\naddr = 0x4420E7\nsize = 0x81\n\n[[func]]\nname = \"SetPlayerOld\"\naddr = 0x442168\nsize = 0x37\n\n[[func]]\nname = \"FixPlayerLocation\"\naddr = 0x44219F\nsize = 0x98\n\n[[func]]\nname = \"StartStand\"\naddr = 0x442237\nsize = 0xBB\n\n[[func]]\nname = \"StartWalkStand\"\naddr = 0x4422F2\nsize = 0x88\n\n[[func]]\nname = \"PM_ChangeLightOff\"\naddr = 0x44237A\nsize = 0xCD\n\n[[func]]\nname = \"PM_ChangeOffset\"\naddr = 0x442447\nsize = 0xA5\n\n[[func]]\nname = \"StartWalk\"\naddr = 0x4424EC\nsize = 0x1CA\n\n[[func]]\nname = \"StartWalk2\"\naddr = 0x4426B6\nsize = 0x223\n\n[[func]]\nname = \"StartWalk3\"\naddr = 0x4428D9\nsize = 0x24F\n\n[[func]]\nname = \"StartAttack\"\naddr = 0x442B28\nsize = 0x9D\n\n[[func]]\nname = \"StartRangeAttack\"\naddr = 0x442BC5\nsize = 0xB8\n\n[[func]]\nname = \"StartPlrBlock\"\naddr = 0x442C7D\nsize = 0xB3\n\n[[func]]\nname = \"StartSpell\"\naddr = 0x442D30\nsize = 0x16F\n\n[[func]]\nname = \"FixPlrWalkTags\"\naddr = 0x442E9F\nsize = 0xCD\n\n[[func]]\nname = \"RemovePlrFromMap\"\naddr = 0x442F6C\nsize = 0x76\n\n[[func]]\nname = \"StartPlrHit\"\naddr = 0x442FE2\nsize = 0x10E\n\n[[func]]\nname = \"RespawnDeadItem\"\naddr = 0x4430F0\nsize = 0xCC\n\n[[func]]\nname = \"StartPlayerKill\"\naddr = 0x4431BC\nsize = 0x30E\n\n[[func]]\nname = \"PlrDeadItem\"\naddr = 0x4434CA\nsize = 0xFF\n\n[[func]]\nname = \"DropHalfPlayersGold\"\naddr = 0x4435C9\nsize = 0x418\n\n[[func]]\nname = \"SyncPlrKill\"\naddr = 0x4439E1\nsize = 0x90\n\n[[func]]\nname = \"RemovePlrMissiles\"\naddr = 0x443A76\nsize = 0x131\n\n[[func]]\nname = \"InitLevelChange\"\naddr = 0x443BA7\nsize = 0xA2\n\n[[func]]\nname = \"StartNewLvl\"\naddr = 0x443C49\nsize = 0xFC\n\n[[func]]\nname = \"RestartTownLvl\"\naddr = 0x443D45\nsize = 0x8D\n\n[[func]]\nname = \"StartWarpLvl\"\naddr = 0x443DD2\nsize = 0x78\n\n[[func]]\nname = \"PM_DoStand\"\naddr = 0x443E4A\nsize = 0x3\n\n[[func]]\nname = \"PM_DoWalk\"\naddr = 0x443E4D\nsize = 0x16E\n\n[[func]]\nname = \"PM_DoWalk2\"\naddr = 0x443FBB\nsize = 0x14B\n\n[[func]]\nname = \"PM_DoWalk3\"\naddr = 0x444106\nsize = 0x181\n\n[[func]]\nname = \"WeaponDur\"\naddr = 0x444287\nsize = 0x10B\n\n[[func]]\nname = \"PlrHitMonst\"\naddr = 0x444392\nsize = 0x386\n\n[[func]]\nname = \"PlrHitPlr\"\naddr = 0x444718\nsize = 0x227\n\n[[func]]\nname = \"PlrHitObj\"\naddr = 0x44493F\nsize = 0x3D\n\n[[func]]\nname = \"PM_DoAttack\"\naddr = 0x44497C\nsize = 0x212\n\n[[func]]\nname = \"PM_DoRangeAttack\"\naddr = 0x444B8E\nsize = 0xF4\n\n[[func]]\nname = \"ShieldDur\"\naddr = 0x444C82\nsize = 0xA1\n\n[[func]]\nname = \"PM_DoBlock\"\naddr = 0x444D23\nsize = 0x79\n\n[[func]]\nname = \"PM_DoSpell\"\naddr = 0x444D9C\nsize = 0x140\n\n[[func]]\nname = \"PM_DoGotHit\"\naddr = 0x444EDC\nsize = 0xB6\n\n[[func]]\nname = \"ArmorDur\"\naddr = 0x444F92\nsize = 0xBF\n\n[[func]]\nname = \"PM_DoDeath\"\naddr = 0x445051\nsize = 0xA7\n\n[[func]]\nname = \"PM_DoNewLvl\"\naddr = 0x443E4A\nsize = 0x3\n\n[[func]]\nname = \"CheckNewPath\"\naddr = 0x4450F8\nsize = 0xB30\n\n[[func]]\nname = \"PlrDeathModeOK\"\naddr = 0x445C90\nsize = 0x42\n\n[[func]]\nname = \"ValidatePlayer\"\naddr = 0x445CD2\nsize = 0x136\n\n[[func]]\nname = \"ProcessPlayers\"\naddr = 0x445E08\nsize = 0x1D3\n\n[[func]]\nname = \"CheckCheatStats\"\naddr = 0x446007\nsize = 0x59\n\n[[func]]\nname = \"ClrPlrPath\"\naddr = 0x446060\nsize = 0x30\n\n[[func]]\nname = \"PosOkPlayer\"\naddr = 0x446090\nsize = 0xE4\n\n[[func]]\nname = \"MakePlrPath\"\naddr = 0x446174\nsize = 0xB1\n\n[[func]]\nname = \"CheckPlrSpell\"\naddr = 0x446245\nsize = 0x255\n\n[[func]]\nname = \"SyncPlrAnim\"\naddr = 0x44649A\nsize = 0x126\n\n[[func]]\nname = \"SyncInitPlrPos\"\naddr = 0x4465F0\nsize = 0x177\n\n[[func]]\nname = \"SyncInitPlr\"\naddr = 0x446767\nsize = 0x24\n\n[[func]]\nname = \"CheckStats\"\naddr = 0x44678B\nsize = 0x119\n\n[[func]]\nname = \"ModifyPlrStr\"\naddr = 0x4468A4\nsize = 0xBA\n\n[[func]]\nname = \"ModifyPlrMag\"\naddr = 0x44695E\nsize = 0xAD\n\n[[func]]\nname = \"ModifyPlrDex\"\naddr = 0x446A0B\nsize = 0xA4\n\n[[func]]\nname = \"ModifyPlrVit\"\naddr = 0x446AAF\nsize = 0xA3\n\n[[func]]\nname = \"SetPlayerHitPoints\"\naddr = 0x446B52\nsize = 0x4F\n\n[[func]]\nname = \"SetPlrStr\"\naddr = 0x446BA1\nsize = 0x75\n\n[[func]]\nname = \"SetPlrMag\"\naddr = 0x446C16\nsize = 0x4C\n\n[[func]]\nname = \"SetPlrDex\"\naddr = 0x446C62\nsize = 0x75\n\n[[func]]\nname = \"SetPlrVit\"\naddr = 0x446CD7\nsize = 0x4C\n\n[[func]]\nname = \"InitDungMsgs\"\naddr = 0x446D23\nsize = 0x24\n\n[[func]]\nname = \"PlayDungMsgs\"\naddr = 0x446D47\nsize = 0x1BA\n\n[[func]]\nname = \"plrmsg_delay\"\naddr = 0x446F01\nsize = 0x37\n\n[[func]]\nname = \"ErrorPlrMsg\"\naddr = 0x446F38\nsize = 0x49\n\n[[func]]\nname = \"EventPlrMsg\"\naddr = 0x446F81\nsize = 0x47\n\n[[func]]\nname = \"SendPlrMsg\"\naddr = 0x446FC8\nsize = 0x6A\n\n[[func]]\nname = \"ClearPlrMsg\"\naddr = 0x447032\nsize = 0x2A\n\n[[func]]\nname = \"InitPlrMsg\"\naddr = 0x44705C\nsize = 0x1C\n\n[[func]]\nname = \"DrawPlrMsg\"\naddr = 0x447078\nsize = 0x8D\n\n[[func]]\nname = \"PrintPlrMsg\"\naddr = 0x447105\nsize = 0xC7\n\n[[func]]\nname = \"InitPortals\"\naddr = 0x4471CC\nsize = 0x26\n\n[[func]]\nname = \"SetPortalStats\"\naddr = 0x4471F2\nsize = 0x3E\n\n[[func]]\nname = \"AddWarpMissile\"\naddr = 0x447230\nsize = 0x74\n\n[[func]]\nname = \"SyncPortals\"\naddr = 0x4472A4\nsize = 0x5B\n\n[[func]]\nname = \"AddInTownPortal\"\naddr = 0x4472FF\nsize = 0x14\n\n[[func]]\nname = \"ActivatePortal\"\naddr = 0x447313\nsize = 0x45\n\n[[func]]\nname = \"DeactivatePortal\"\naddr = 0x447358\nsize = 0xC\n\n[[func]]\nname = \"PortalOnLevel\"\naddr = 0x447364\nsize = 0x22\n\n[[func]]\nname = \"RemovePortalMissile\"\naddr = 0x447386\nsize = 0x7C\n\n[[func]]\nname = \"SetCurrentPortal\"\naddr = 0x447402\nsize = 0x7\n\n[[func]]\nname = \"GetPortalLevel\"\naddr = 0x447409\nsize = 0xA8\n\n[[func]]\nname = \"GetPortalLvlPos\"\naddr = 0x4474B1\nsize = 0x63\n\n[[func]]\nname = \"PosOkPortal\"\naddr = 0x447514\nsize = 0x48\n\n[[func]]\nname = \"InitQuests\"\naddr = 0x44755C\nsize = 0x1E0\n\n[[func]]\nname = \"CheckQuests\"\naddr = 0x44777C\nsize = 0x1\n\n[[func]]\nname = \"ForceQuests\"\naddr = 0x443E4A\nsize = 0x3\n\n[[func]]\nname = \"QuestStatus\"\naddr = 0x44773C\nsize = 0x40\n\n[[func]]\nname = \"CheckQuestKill\"\naddr = 0x44777C\nsize = 0x1\n\n[[func]]\nname = \"DrawButcher\"\naddr = 0x44777D\nsize = 0x27\n\n[[func]]\nname = \"DrawSkelKing\"\naddr = 0x4477A4\nsize = 0x21\n\n[[func]]\nname = \"DrawWarLord\"\naddr = 0x4477C5\nsize = 0x90\n\n[[func]]\nname = \"DrawSChamber\"\naddr = 0x447855\nsize = 0xBA\n\n[[func]]\nname = \"DrawLTBanner\"\naddr = 0x44790F\nsize = 0x8C\n\n[[func]]\nname = \"DrawBlind\"\naddr = 0x44799B\nsize = 0x8C\n\n[[func]]\nname = \"DrawBlood\"\naddr = 0x447A27\nsize = 0x8C\n\n[[func]]\nname = \"DRLG_CheckQuests\"\naddr = 0x447AB3\nsize = 0x91\n\n[[func]]\nname = \"SetReturnLvlPos\"\naddr = 0x447B44\nsize = 0xB3\n\n[[func]]\nname = \"GetReturnLvlPos\"\naddr = 0x447BF7\nsize = 0x39\n\n[[func]]\nname = \"ResyncMPQuests\"\naddr = 0x44777C\nsize = 0x1\n\n[[func]]\nname = \"ResyncQuests\"\naddr = 0x44777C\nsize = 0x1\n\n[[func]]\nname = \"PrintQLString\"\naddr = 0x447C30\nsize = 0x14E\n\n[[func]]\nname = \"DrawQuestLog\"\naddr = 0x447D7E\nsize = 0x8C\n\n[[func]]\nname = \"StartQuestlog\"\naddr = 0x447E0A\nsize = 0x70\n\n[[func]]\nname = \"QuestlogUp\"\naddr = 0x447E7A\nsize = 0x47\n\n[[func]]\nname = \"QuestlogDown\"\naddr = 0x447EC1\nsize = 0x4A\n\n[[func]]\nname = \"QuestlogEnter\"\naddr = 0x447F0B\nsize = 0x42\n\n[[func]]\nname = \"QuestlogESC\"\naddr = 0x447F4D\nsize = 0x55\n\n[[func]]\nname = \"SetMultiQuest\"\naddr = 0x447FA2\nsize = 0x3\n\n[[func]]\nname = \"SystemSupported\"\naddr = 0x447FA5\nsize = 0x54\n\n[[func]]\nname = \"RestrictedTest\"\naddr = 0x447FF9\nsize = 0x72\n\n[[func]]\nname = \"ReadOnlyTest\"\naddr = 0x44806B\nsize = 0x7E\n\n[[func]]\nname = \"ClearCursor\"\naddr = 0x4480F9\nsize = 0xF\n\n[[func]]\nname = \"DrawMissile\"\naddr = 0x448108\nsize = 0x196\n\n[[func]]\nname = \"DrawClippedMissile\"\naddr = 0x44829E\nsize = 0x196\n\n[[func]]\nname = \"DrawDeadPlayer\"\naddr = 0x448434\nsize = 0xE0\n\n[[func]]\nname = \"DrawPlayer\"\naddr = 0x448514\nsize = 0x1EB\n\n[[func]]\nname = \"DrawClippedPlayer\"\naddr = 0x4486FF\nsize = 0x1D5\n\n[[func]]\nname = \"DrawView\"\naddr = 0x4488D4\nsize = 0x112\n\n[[func]]\nname = \"DrawGame\"\naddr = 0x4489E6\nsize = 0x1E5\n\n[[func]]\nname = \"scrollrt_draw_lower\"\naddr = 0x448BEB\nsize = 0x46B\n\n[[func]]\nname = \"scrollrt_draw_clipped_dungeon\"\naddr = 0x449056\nsize = 0x5F7\n\n[[func]]\nname = \"DrawClippedMonster\"\naddr = 0x44964D\nsize = 0xF3\n\n[[func]]\nname = \"DrawClippedObject\"\naddr = 0x449740\nsize = 0x119\n\n[[func]]\nname = \"scrollrt_draw_clipped_e_flag\"\naddr = 0x449859\nsize = 0x144\n\n[[func]]\nname = \"scrollrt_draw_lower_2\"\naddr = 0x44999D\nsize = 0x3A9\n\n[[func]]\nname = \"scrollrt_draw_clipped_dungeon_2\"\naddr = 0x449D46\nsize = 0x637\n\n[[func]]\nname = \"scrollrt_draw_clipped_e_flag_2\"\naddr = 0x44A37D\nsize = 0x194\n\n[[func]]\nname = \"scrollrt_draw_upper\"\naddr = 0x44A511\nsize = 0x47A\n\n[[func]]\nname = \"scrollrt_draw_dungeon\"\naddr = 0x44A98B\nsize = 0x62D\n\n[[func]]\nname = \"DrawMonster\"\naddr = 0x44AFB8\nsize = 0xF3\n\n[[func]]\nname = \"DrawObject\"\naddr = 0x44B0AB\nsize = 0x146\n\n[[func]]\nname = \"scrollrt_draw_e_flag\"\naddr = 0x44B1F1\nsize = 0x157\n\n[[func]]\nname = \"DrawZoom\"\naddr = 0x44B348\nsize = 0x23E\n\n[[func]]\nname = \"ClearScreenBuffer\"\naddr = 0x44B5A6\nsize = 0x33\n\n[[func]]\nname = \"scrollrt_draw_game_screen\"\naddr = 0x44B5D9\nsize = 0x62\n\n[[func]]\nname = \"scrollrt_draw_cursor_back_buffer\"\naddr = 0x44B63B\nsize = 0x8F\n\n[[func]]\nname = \"scrollrt_draw_cursor_item\"\naddr = 0x44B6CA\nsize = 0x1CE\n\n[[func]]\nname = \"DrawMain\"\naddr = 0x44B898\nsize = 0x28F\n\n[[func]]\nname = \"DoBlitScreen\"\naddr = 0x44BB27\nsize = 0x146\n\n[[func]]\nname = \"DrawAndBlit\"\naddr = 0x44BC6D\nsize = 0x12C\n\n[[func]]\nname = \"ObjIndex\"\naddr = 0x44BD99\nsize = 0x46\n\n[[func]]\nname = \"SHA1Clear\"\naddr = 0x44BDDF\nsize = 0x15\n\n[[func]]\nname = \"SHA1Result\"\naddr = 0x44BDF4\nsize = 0x22\n\n[[func]]\nname = \"SHA1Calculate\"\naddr = 0x44BE16\nsize = 0x26\n\n[[func]]\nname = \"SHA1Input\"\naddr = 0x44BE3C\nsize = 0x51\n\n[[func]]\nname = \"SHA1ProcessMessageBlock\"\naddr = 0x44BE8D\nsize = 0x1BE\n\n[[func]]\nname = \"SHA1Reset\"\naddr = 0x44C04B\nsize = 0xE\n\n[[func]]\nname = \"SHA1Init\"\naddr = 0x44C059\nsize = 0x2B\n\n[[func]]\nname = \"snd_update\"\naddr = 0x44C094\nsize = 0x57\n\n[[func]]\nname = \"snd_stop_snd\"\naddr = 0x44C0EB\nsize = 0x12\n\n[[func]]\nname = \"snd_playing\"\naddr = 0x44C0FD\nsize = 0x2C\n\n[[func]]\nname = \"snd_play_snd\"\naddr = 0x44C129\nsize = 0xD9\n\n[[func]]\nname = \"sound_dup_channel\"\naddr = 0x44C202\nsize = 0x3B\n\n[[func]]\nname = \"sound_file_reload\"\naddr = 0x44C23D\nsize = 0x93\n\n[[func]]\nname = \"sound_file_load\"\naddr = 0x44C2D0\nsize = 0xFC\n\n[[func]]\nname = \"sound_CreateSoundBuffer\"\naddr = 0x44C3CC\nsize = 0x5D\n\n[[func]]\nname = \"sound_file_cleanup\"\naddr = 0x44C429\nsize = 0x2B\n\n[[func]]\nname = \"snd_init\"\naddr = 0x44C454\nsize = 0xA0\n\n[[func]]\nname = \"snd_get_volume\"\naddr = 0x44C4F4\nsize = 0x51\n\n[[func]]\nname = \"sound_create_primary_buffer\"\naddr = 0x44C545\nsize = 0x102\n\n[[func]]\nname = \"sound_DirectSoundCreate\"\naddr = 0x44C647\nsize = 0x81\n\n[[func]]\nname = \"sound_cleanup\"\naddr = 0x44C6C8\nsize = 0x59\n\n[[func]]\nname = \"snd_set_volume\"\naddr = 0x44C721\nsize = 0xF\n\n[[func]]\nname = \"music_stop\"\naddr = 0x44C730\nsize = 0x2C\n\n[[func]]\nname = \"music_start\"\naddr = 0x44C75C\nsize = 0x6B\n\n[[func]]\nname = \"sound_disable_music\"\naddr = 0x44C7C7\nsize = 0x1A\n\n[[func]]\nname = \"sound_get_or_set_music_volume\"\naddr = 0x44C7E1\nsize = 0x23\n\n[[func]]\nname = \"sound_get_or_set_sound_volume\"\naddr = 0x44C804\nsize = 0x13\n\n[[func]]\nname = \"GetManaAmount\"\naddr = 0x44C817\nsize = 0xEC\n\n[[func]]\nname = \"UseMana\"\naddr = 0x44C903\nsize = 0x4A\n\n[[func]]\nname = \"CheckSpell\"\naddr = 0x44C94D\nsize = 0x51\n\n[[func]]\nname = \"CastSpell\"\naddr = 0x44C99E\nsize = 0xDC\n\n[[func]]\nname = \"DoResurrect\"\naddr = 0x44CA7A\nsize = 0x11A\n\n[[func]]\nname = \"PlacePlayer\"\naddr = 0x44CB94\nsize = 0x123\n\n[[func]]\nname = \"DoHealOther\"\naddr = 0x44CCB7\nsize = 0x113\n\n[[func]]\nname = \"InitStores\"\naddr = 0x44CDCA\nsize = 0x86\n\n[[func]]\nname = \"SetupTownStores\"\naddr = 0x44CE50\nsize = 0xBB\n\n[[func]]\nname = \"FreeStoreMem\"\naddr = 0x44CF0B\nsize = 0x36\n\n[[func]]\nname = \"DrawSTextBack\"\naddr = 0x44CF41\nsize = 0x5E\n\n[[func]]\nname = \"PrintSString\"\naddr = 0x44CF9F\nsize = 0x20C\n\n[[func]]\nname = \"DrawSLine\"\naddr = 0x44D1AB\nsize = 0x80\n\n[[func]]\nname = \"DrawSSlider\"\naddr = 0x44D22B\nsize = 0xF0\n\n[[func]]\nname = \"DrawSTextHelp\"\naddr = 0x44D31B\nsize = 0xF\n\n[[func]]\nname = \"ClearSText\"\naddr = 0x44D32A\nsize = 0x45\n\n[[func]]\nname = \"AddSLine\"\naddr = 0x44D36F\nsize = 0x25\n\n[[func]]\nname = \"AddSTextVal\"\naddr = 0x44D394\nsize = 0xD\n\n[[func]]\nname = \"OffsetSTextY\"\naddr = 0x44D3A1\nsize = 0xD\n\n[[func]]\nname = \"AddSText\"\naddr = 0x44D3AE\nsize = 0x51\n\n[[func]]\nname = \"StoreAutoPlace\"\naddr = 0x44D3FF\nsize = 0x27D\n\n[[func]]\nname = \"S_StartSmith\"\naddr = 0x44D67C\nsize = 0xCA\n\n[[func]]\nname = \"S_ScrollSBuy\"\naddr = 0x44D746\nsize = 0xBC\n\n[[func]]\nname = \"PrintStoreItem\"\naddr = 0x44D802\nsize = 0x27A\n\n[[func]]\nname = \"S_StartSBuy\"\naddr = 0x44DA7C\nsize = 0xC0\n\n[[func]]\nname = \"S_ScrollSPBuy\"\naddr = 0x44DB3C\nsize = 0xDE\n\n[[func]]\nname = \"S_StartSPBuy\"\naddr = 0x44DC1A\nsize = 0xE0\n\n[[func]]\nname = \"SmithSellOk\"\naddr = 0x44DCFA\nsize = 0x41\n\n[[func]]\nname = \"S_ScrollSSell\"\naddr = 0x44DD3B\nsize = 0xE7\n\n[[func]]\nname = \"S_StartSSell\"\naddr = 0x44DE22\nsize = 0x1B2\n\n[[func]]\nname = \"SmithRepairOk\"\naddr = 0x44DFD4\nsize = 0x43\n\n[[func]]\nname = \"S_StartSRepair\"\naddr = 0x44E017\nsize = 0x24C\n\n[[func]]\nname = \"AddStoreHoldRepair\"\naddr = 0x44E263\nsize = 0xA3\n\n[[func]]\nname = \"S_StartWitch\"\naddr = 0x44E306\nsize = 0xA6\n\n[[func]]\nname = \"S_ScrollWBuy\"\naddr = 0x44E3AC\nsize = 0xBC\n\n[[func]]\nname = \"S_StartWBuy\"\naddr = 0x44E468\nsize = 0xCA\n\n[[func]]\nname = \"WitchSellOk\"\naddr = 0x44E532\nsize = 0x5B\n\n[[func]]\nname = \"S_StartWSell\"\naddr = 0x44E58D\nsize = 0x26D\n\n[[func]]\nname = \"WitchRechargeOk\"\naddr = 0x44E7FA\nsize = 0x2F\n\n[[func]]\nname = \"AddStoreHoldRecharge\"\naddr = 0x44E829\nsize = 0x86\n\n[[func]]\nname = \"S_StartWRecharge\"\naddr = 0x44E8AF\nsize = 0x1AD\n\n[[func]]\nname = \"S_StartNoMoney\"\naddr = 0x44EA5C\nsize = 0x3A\n\n[[func]]\nname = \"S_StartNoRoom\"\naddr = 0x44EA96\nsize = 0x33\n\n[[func]]\nname = \"S_StartConfirm\"\naddr = 0x44EAC9\nsize = 0x173\n\n[[func]]\nname = \"S_StartBoy\"\naddr = 0x44EC3C\nsize = 0xBD\n\n[[func]]\nname = \"S_StartBBoy\"\naddr = 0x44ECF9\nsize = 0xCD\n\n[[func]]\nname = \"S_StartHealer\"\naddr = 0x44EDC6\nsize = 0xA8\n\n[[func]]\nname = \"S_ScrollHBuy\"\naddr = 0x44EE6E\nsize = 0xB0\n\n[[func]]\nname = \"S_StartHBuy\"\naddr = 0x44EF1E\nsize = 0xC0\n\n[[func]]\nname = \"S_StartStory\"\naddr = 0x44EFDE\nsize = 0x79\n\n[[func]]\nname = \"IdItemOk\"\naddr = 0x44F057\nsize = 0x14\n\n[[func]]\nname = \"AddStoreHoldId\"\naddr = 0x44F06B\nsize = 0x44\n\n[[func]]\nname = \"S_StartSIdentify\"\naddr = 0x44F0AF\nsize = 0x2AF\n\n[[func]]\nname = \"S_StartIdShow\"\naddr = 0x44F35E\nsize = 0xB1\n\n[[func]]\nname = \"S_StartTalk\"\naddr = 0x44F40F\nsize = 0xBE\n\n[[func]]\nname = \"S_StartTavern\"\naddr = 0x44F4CD\nsize = 0x84\n\n[[func]]\nname = \"S_StartBarMaid\"\naddr = 0x44F551\nsize = 0x72\n\n[[func]]\nname = \"S_StartDrunk\"\naddr = 0x44F5C3\nsize = 0x72\n\n[[func]]\nname = \"StartStore\"\naddr = 0x44F635\nsize = 0x163\n\n[[func]]\nname = \"DrawSText\"\naddr = 0x44F7F4\nsize = 0xF5\n\n[[func]]\nname = \"STextESC\"\naddr = 0x44F8E9\nsize = 0xE0\n\n[[func]]\nname = \"STextUp\"\naddr = 0x44FA14\nsize = 0xA8\n\n[[func]]\nname = \"STextDown\"\naddr = 0x44FABC\nsize = 0xAD\n\n[[func]]\nname = \"STextPrior\"\naddr = 0x44FB69\nsize = 0x4A\n\n[[func]]\nname = \"STextNext\"\naddr = 0x44FBB3\nsize = 0x4D\n\n[[func]]\nname = \"S_SmithEnter\"\naddr = 0x44FC00\nsize = 0x69\n\n[[func]]\nname = \"SetGoldCurs\"\naddr = 0x44FC69\nsize = 0x46\n\n[[func]]\nname = \"SetSpdbarGoldCurs\"\naddr = 0x44FCAF\nsize = 0x46\n\n[[func]]\nname = \"TakePlrsMoney\"\naddr = 0x44FCF5\nsize = 0x1D9\n\n[[func]]\nname = \"SmithBuyItem\"\naddr = 0x44FECE\nsize = 0xAB\n\n[[func]]\nname = \"S_SBuyEnter\"\naddr = 0x44FF79\nsize = 0xD5\n\n[[func]]\nname = \"SmithBuyPItem\"\naddr = 0x45004E\nsize = 0x95\n\n[[func]]\nname = \"S_SPBuyEnter\"\naddr = 0x4500E3\nsize = 0xF4\n\n[[func]]\nname = \"StoreGoldFit\"\naddr = 0x4501D7\nsize = 0xD6\n\n[[func]]\nname = \"PlaceStoreGold\"\naddr = 0x4502AD\nsize = 0xC8\n\n[[func]]\nname = \"StoreSellItem\"\naddr = 0x450375\nsize = 0x150\n\n[[func]]\nname = \"S_SSellEnter\"\naddr = 0x4504C5\nsize = 0x7F\n\n[[func]]\nname = \"SmithRepairItem\"\naddr = 0x450544\nsize = 0xD7\n\n[[func]]\nname = \"S_SRepairEnter\"\naddr = 0x45061B\nsize = 0x81\n\n[[func]]\nname = \"S_WitchEnter\"\naddr = 0x45069C\nsize = 0x68\n\n[[func]]\nname = \"WitchBuyItem\"\naddr = 0x450704\nsize = 0xB8\n\n[[func]]\nname = \"S_WBuyEnter\"\naddr = 0x4507BC\nsize = 0xD5\n\n[[func]]\nname = \"S_WSellEnter\"\naddr = 0x450891\nsize = 0x7F\n\n[[func]]\nname = \"WitchRechargeItem\"\naddr = 0x450910\nsize = 0x89\n\n[[func]]\nname = \"S_WRechargeEnter\"\naddr = 0x450999\nsize = 0x81\n\n[[func]]\nname = \"S_BoyEnter\"\naddr = 0x450A1A\nsize = 0xA2\n\n[[func]]\nname = \"BoyBuyItem\"\naddr = 0x450ABC\nsize = 0x3A\n\n[[func]]\nname = \"HealerBuyItem\"\naddr = 0x450AF6\nsize = 0x104\n\n[[func]]\nname = \"S_BBuyEnter\"\naddr = 0x450BFA\nsize = 0xD3\n\n[[func]]\nname = \"StoryIdItem\"\naddr = 0x450CCD\nsize = 0xEF\n\n[[func]]\nname = \"S_ConfirmEnter\"\naddr = 0x450DBC\nsize = 0xA0\n\n[[func]]\nname = \"S_HealerEnter\"\naddr = 0x450E5C\nsize = 0xA8\n\n[[func]]\nname = \"S_HBuyEnter\"\naddr = 0x450F04\nsize = 0xD5\n\n[[func]]\nname = \"S_StoryEnter\"\naddr = 0x450FD9\nsize = 0x56\n\n[[func]]\nname = \"S_SIDEnter\"\naddr = 0x45102F\nsize = 0x81\n\n[[func]]\nname = \"S_TalkEnter\"\naddr = 0x4510B0\nsize = 0xFF\n\n[[func]]\nname = \"S_TavernEnter\"\naddr = 0x4511AF\nsize = 0x4E\n\n[[func]]\nname = \"S_BarmaidEnter\"\naddr = 0x4511FD\nsize = 0x4E\n\n[[func]]\nname = \"S_DrunkEnter\"\naddr = 0x45124B\nsize = 0x4E\n\n[[func]]\nname = \"STextEnter\"\naddr = 0x451299\nsize = 0x85\n\n[[func]]\nname = \"CheckStoreBtn\"\naddr = 0x4513B8\nsize = 0x137\n\n[[func]]\nname = \"ReleaseStoreBtn\"\naddr = 0x4514EF\nsize = 0xF\n\n[[func]]\nname = \"sync_all_monsters\"\naddr = 0x4514FE\nsize = 0x85\n\n[[func]]\nname = \"sync_one_monster\"\naddr = 0x451583\nsize = 0xA6\n\n[[func]]\nname = \"sync_monster_active\"\naddr = 0x451629\nsize = 0x53\n\n[[func]]\nname = \"sync_monster_pos\"\naddr = 0x45167C\nsize = 0x6F\n\n[[func]]\nname = \"sync_monster_active2\"\naddr = 0x4516EB\nsize = 0x60\n\n[[func]]\nname = \"SyncPlrInv\"\naddr = 0x45174B\nsize = 0x1E1\n\n[[func]]\nname = \"sync_update\"\naddr = 0x45192C\nsize = 0x74\n\n[[func]]\nname = \"sync_monster\"\naddr = 0x4519A0\nsize = 0x210\n\n[[func]]\nname = \"sync_init\"\naddr = 0x451BB0\nsize = 0x25\n\n[[func]]\nname = \"TFit_Shrine\"\naddr = 0x451BD5\nsize = 0x123\n\n[[func]]\nname = \"TFit_Obj5\"\naddr = 0x451CF8\nsize = 0xDF\n\n[[func]]\nname = \"TFit_SkelRoom\"\naddr = 0x451DD7\nsize = 0x52\n\n[[func]]\nname = \"TFit_GoatShrine\"\naddr = 0x451E29\nsize = 0x45\n\n[[func]]\nname = \"CheckThemeObj3\"\naddr = 0x451E6E\nsize = 0x7F\n\n[[func]]\nname = \"TFit_Obj3\"\naddr = 0x451EED\nsize = 0x5C\n\n[[func]]\nname = \"CheckThemeReqs\"\naddr = 0x451F49\nsize = 0x80\n\n[[func]]\nname = \"SpecialThemeFit\"\naddr = 0x451FC9\nsize = 0xF6\n\n[[func]]\nname = \"CheckThemeRoom\"\naddr = 0x4520FF\nsize = 0x138\n\n[[func]]\nname = \"InitThemes\"\naddr = 0x452237\nsize = 0x1B5\n\n[[func]]\nname = \"HoldThemeRooms\"\naddr = 0x4523EC\nsize = 0x5A\n\n[[func]]\nname = \"PlaceThemeMonsts\"\naddr = 0x452446\nsize = 0xE1\n\n[[func]]\nname = \"Theme_Barrel\"\naddr = 0x452527\nsize = 0xD8\n\n[[func]]\nname = \"Theme_Shrine\"\naddr = 0x4525FF\nsize = 0xB3\n\n[[func]]\nname = \"Theme_MonstPit\"\naddr = 0x4526B2\nsize = 0x99\n\n[[func]]\nname = \"Theme_SkelRoom\"\naddr = 0x45274B\nsize = 0x1D6\n\n[[func]]\nname = \"Theme_Treasure\"\naddr = 0x452921\nsize = 0x14B\n\n[[func]]\nname = \"Theme_Library\"\naddr = 0x452A6C\nsize = 0x183\n\n[[func]]\nname = \"Theme_Torture\"\naddr = 0x452BEF\nsize = 0xD3\n\n[[func]]\nname = \"Theme_BloodFountain\"\naddr = 0x452CC2\nsize = 0x46\n\n[[func]]\nname = \"Theme_Decap\"\naddr = 0x452D08\nsize = 0xD3\n\n[[func]]\nname = \"Theme_PurifyingFountain\"\naddr = 0x452DDB\nsize = 0x46\n\n[[func]]\nname = \"Theme_ArmorStand\"\naddr = 0x452E21\nsize = 0xF1\n\n[[func]]\nname = \"Theme_GoatShrine\"\naddr = 0x452F12\nsize = 0xCE\n\n[[func]]\nname = \"Theme_Cauldron\"\naddr = 0x452FE0\nsize = 0x46\n\n[[func]]\nname = \"Theme_MurkyFountain\"\naddr = 0x453026\nsize = 0x46\n\n[[func]]\nname = \"Theme_TearFountain\"\naddr = 0x45306C\nsize = 0x46\n\n[[func]]\nname = \"Theme_BrnCross\"\naddr = 0x4530B2\nsize = 0xD3\n\n[[func]]\nname = \"Theme_WeaponRack\"\naddr = 0x453185\nsize = 0xF1\n\n[[func]]\nname = \"UpdateL4Trans\"\naddr = 0x453276\nsize = 0x20\n\n[[func]]\nname = \"CreateThemeRooms\"\naddr = 0x453296\nsize = 0x117\n\n[[func]]\nname = \"tmsg_get\"\naddr = 0x4533F1\nsize = 0x4B\n\n[[func]]\nname = \"tmsg_add\"\naddr = 0x45343C\nsize = 0x53\n\n[[func]]\nname = \"tmsg_cleanup\"\naddr = 0x45348F\nsize = 0x27\n\n[[func]]\nname = \"town_clear_upper_buf\"\naddr = 0x4534B6\nsize = 0x66\n\n[[func]]\nname = \"town_clear_low_buf\"\naddr = 0x45351C\nsize = 0x6F\n\n[[func]]\nname = \"town_draw_clipped_e_flag\"\naddr = 0x45358B\nsize = 0x7F\n\n[[func]]\nname = \"town_draw_clipped_town\"\naddr = 0x45360A\nsize = 0x30B\n\n[[func]]\nname = \"town_draw_lower\"\naddr = 0x453915\nsize = 0x2E8\n\n[[func]]\nname = \"town_draw_clipped_e_flag_2\"\naddr = 0x453BFD\nsize = 0xA1\n\n[[func]]\nname = \"town_draw_clipped_town_2\"\naddr = 0x453C9E\nsize = 0x310\n\n[[func]]\nname = \"town_draw_lower_2\"\naddr = 0x453FAE\nsize = 0x341\n\n[[func]]\nname = \"town_draw_e_flag\"\naddr = 0x4542EF\nsize = 0x89\n\n[[func]]\nname = \"town_draw_town_all\"\naddr = 0x454378\nsize = 0x310\n\n[[func]]\nname = \"town_draw_upper\"\naddr = 0x454688\nsize = 0x33A\n\n[[func]]\nname = \"T_DrawGame\"\naddr = 0x4549C2\nsize = 0x1D9\n\n[[func]]\nname = \"T_DrawZoom\"\naddr = 0x454BBB\nsize = 0x235\n\n[[func]]\nname = \"T_DrawView\"\naddr = 0x454E10\nsize = 0x12C\n\n[[func]]\nname = \"SetTownMicros\"\naddr = 0x454F3C\nsize = 0xE8\n\n[[func]]\nname = \"T_FillSector\"\naddr = 0x455024\nsize = 0xB6\n\n[[func]]\nname = \"T_FillTile\"\naddr = 0x4550DA\nsize = 0x71\n\n[[func]]\nname = \"T_Pass3\"\naddr = 0x45514B\nsize = 0x14E\n\n[[func]]\nname = \"CreateTown\"\naddr = 0x455299\nsize = 0x218\n\n[[func]]\nname = \"GetActiveTowner\"\naddr = 0x4554B1\nsize = 0x26\n\n[[func]]\nname = \"SetTownerGPtrs\"\naddr = 0x4554D7\nsize = 0x3A\n\n[[func]]\nname = \"NewTownerAnim\"\naddr = 0x455511\nsize = 0x34\n\n[[func]]\nname = \"InitTownerInfo\"\naddr = 0x455545\nsize = 0x95\n\n[[func]]\nname = \"InitQstSnds\"\naddr = 0x4555DA\nsize = 0x4D\n\n[[func]]\nname = \"InitSmith\"\naddr = 0x455627\nsize = 0x8F\n\n[[func]]\nname = \"InitBarOwner\"\naddr = 0x4556B6\nsize = 0x96\n\n[[func]]\nname = \"InitTownDead\"\naddr = 0x45574C\nsize = 0x90\n\n[[func]]\nname = \"InitWitch\"\naddr = 0x4557DC\nsize = 0x8F\n\n[[func]]\nname = \"InitBarmaid\"\naddr = 0x45586B\nsize = 0x8F\n\n[[func]]\nname = \"InitBoy\"\naddr = 0x4558FA\nsize = 0x96\n\n[[func]]\nname = \"InitHealer\"\naddr = 0x455990\nsize = 0x8F\n\n[[func]]\nname = \"InitTeller\"\naddr = 0x455A1F\nsize = 0x8F\n\n[[func]]\nname = \"InitDrunk\"\naddr = 0x455AAE\nsize = 0x8F\n\n[[func]]\nname = \"InitCows\"\naddr = 0x455B3D\nsize = 0x14F\n\n[[func]]\nname = \"InitTowners\"\naddr = 0x455C8C\nsize = 0x4D\n\n[[func]]\nname = \"FreeTownerGFX\"\naddr = 0x455CD9\nsize = 0x42\n\n[[func]]\nname = \"TownCtrlMsg\"\naddr = 0x455D1B\nsize = 0x73\n\n[[func]]\nname = \"TownBlackSmith\"\naddr = 0x455D8E\nsize = 0xE\n\n[[func]]\nname = \"TownBarOwner\"\naddr = 0x455D9C\nsize = 0xF\n\n[[func]]\nname = \"TownDead\"\naddr = 0x455DAB\nsize = 0x78\n\n[[func]]\nname = \"TownHealer\"\naddr = 0x455E23\nsize = 0xF\n\n[[func]]\nname = \"TownStory\"\naddr = 0x455E32\nsize = 0xF\n\n[[func]]\nname = \"TownDrunk\"\naddr = 0x455E41\nsize = 0xF\n\n[[func]]\nname = \"TownBoy\"\naddr = 0x455E50\nsize = 0xF\n\n[[func]]\nname = \"TownWitch\"\naddr = 0x455E5F\nsize = 0xF\n\n[[func]]\nname = \"TownBarMaid\"\naddr = 0x455E6E\nsize = 0xF\n\n[[func]]\nname = \"TownCow\"\naddr = 0x455E7D\nsize = 0xF\n\n[[func]]\nname = \"ProcessTowners\"\naddr = 0x455E8C\nsize = 0xBE\n\n[[func]]\nname = \"PlrHasItem\"\naddr = 0x455F72\nsize = 0x50\n\n[[func]]\nname = \"TownerTalk\"\naddr = 0x455FC2\nsize = 0x1D\n\n[[func]]\nname = \"TalkToTowner\"\naddr = 0x455FDF\nsize = 0xAB6\n\n[[func]]\nname = \"CowSFX\"\naddr = 0x456A95\nsize = 0x5A\n\n[[func]]\nname = \"track_process\"\naddr = 0x456AFF\nsize = 0x9E\n\n[[func]]\nname = \"track_repeat_walk\"\naddr = 0x456B9D\nsize = 0x4C\n\n[[func]]\nname = \"track_isscrolling\"\naddr = 0x456BE9\nsize = 0x8\n\n[[func]]\nname = \"InitTownTriggers\"\naddr = 0x456BF1\nsize = 0x3C\n\n[[func]]\nname = \"InitL1Triggers\"\naddr = 0x456C2D\nsize = 0xA9\n\n[[func]]\nname = \"ForceTownTrig\"\naddr = 0x456CD6\nsize = 0x166\n\n[[func]]\nname = \"ForceL1Trig\"\naddr = 0x456E3C\nsize = 0x11C\n\n[[func]]\nname = \"ForceL2Trig\"\naddr = 0x456F58\nsize = 0x203\n\n[[func]]\nname = \"ForceL3Trig\"\naddr = 0x45715B\nsize = 0x1DE\n\n[[func]]\nname = \"ForceL4Trig\"\naddr = 0x457339\nsize = 0x249\n\n[[func]]\nname = \"Freeupstairs\"\naddr = 0x457582\nsize = 0x41\n\n[[func]]\nname = \"ForceSKingTrig\"\naddr = 0x4575C3\nsize = 0x68\n\n[[func]]\nname = \"ForceSChambTrig\"\naddr = 0x45762B\nsize = 0x68\n\n[[func]]\nname = \"ForcePWaterTrig\"\naddr = 0x457693\nsize = 0x68\n\n[[func]]\nname = \"CheckTrigForce\"\naddr = 0x4576FB\nsize = 0xAE\n\n[[func]]\nname = \"CheckTriggers\"\naddr = 0x4577A9\nsize = 0x1F2\n\n[[func]]\nname = \"WCloseFile\"\naddr = 0x4579AB\nsize = 0x7\n\n[[func]]\nname = \"WGetFileSize\"\naddr = 0x4579B2\nsize = 0x2B\n\n[[func]]\nname = \"WGetFileArchive\"\naddr = 0x4579DD\nsize = 0x57\n\n[[func]]\nname = \"WOpenFile\"\naddr = 0x457A34\nsize = 0x42\n\n[[func]]\nname = \"WReadFile\"\naddr = 0x457A76\nsize = 0x52\n\n[[func]]\nname = \"WSetFilePointer\"\naddr = 0x457AC8\nsize = 0x34\n\n[[func]]\nname = \"LoadWaveFormat\"\naddr = 0x457AFC\nsize = 0x2E\n\n[[func]]\nname = \"AllocateMemFile\"\naddr = 0x457B2A\nsize = 0x49\n\n[[func]]\nname = \"FreeMemFile\"\naddr = 0x457B73\nsize = 0xE\n\n[[func]]\nname = \"ReadWaveFile\"\naddr = 0x457B81\nsize = 0xCA\n\n[[func]]\nname = \"ReadMemFile\"\naddr = 0x457C4B\nsize = 0x56\n\n[[func]]\nname = \"FillMemFile\"\naddr = 0x457CA1\nsize = 0x3B\n\n[[func]]\nname = \"SeekMemFile\"\naddr = 0x457CDC\nsize = 0x1E\n\n[[func]]\nname = \"ReadWaveSection\"\naddr = 0x457CFA\nsize = 0x57\n\n[[func]]\nname = \"LoadWaveFile\"\naddr = 0x457D51\nsize = 0x38\n\n[[func]]\nname = \"drawTopArchesUpperScreen\"\naddr = 0x457D90\nsize = 0x162D\n\n[[func]]\nname = \"drawBottomArchesUpperScreen\"\naddr = 0x4593BD\nsize = 0xC38\n\n[[func]]\nname = \"drawUpperScreen\"\naddr = 0x459FF5\nsize = 0xC73\n\n[[func]]\nname = \"drawTopArchesLowerScreen\"\naddr = 0x45AC68\nsize = 0x1A11\n\n[[func]]\nname = \"drawBottomArchesLowerScreen\"\naddr = 0x45C679\nsize = 0xF22\n\n[[func]]\nname = \"drawLowerScreen\"\naddr = 0x45D59B\nsize = 0xE53\n\n[[func]]\nname = \"world_draw_black_tile\"\naddr = 0x45E3EE\nsize = 0x5C\n"
  },
  {
    "path": "defs.h",
    "content": "/**\r\n * @file defs.h\r\n *\r\n * Global definitions and Macros.\r\n */\r\n\r\n#ifdef HELLFIRE\r\n#define DIABOOL\t\t\t\t\tBOOLEAN\r\n#define GAME_NAME\t\t\t\t\"HELLFIRE\"\r\n#define APP_NAME\t\t\t\t\"Hellfire\"\r\n#else\r\n#define DIABOOL\t\t\t\t\tBOOL\r\n#define GAME_NAME\t\t\t\t\"DIABLO\"\r\n#define APP_NAME\t\t\t\t\"Diablo\"\r\n#endif\r\n\r\n#ifdef HELLFIRE\r\n#define HFAND &&\r\n#define DERROR\t\t\t\t\tGetLastError\r\n#else\r\n#define HFAND &\r\n#define DERROR\t\t\t\t\tSErrGetLastError\r\n#endif\r\n\r\n#define DMAXX\t\t\t\t\t40\r\n#define DMAXY\t\t\t\t\t40\r\n\r\n#define LIGHTSIZE\t\t\t\t6912 // 27 * 256\r\n\r\n#define GMENU_SLIDER\t\t\t0x40000000\r\n#define GMENU_ENABLED\t\t\t0x80000000\r\n\r\n// must be unsigned to generate unsigned comparisons with pnum\r\n#define MAX_PLRS\t\t\t\t4\r\n\r\n#define MAX_CHARACTERS\t\t\t10\r\n#ifdef HELLFIRE\r\n#define MAX_LVLS\t\t\t\t24\r\n#define MAX_LVLMTYPES\t\t\t24\r\n#define MAX_SPELLS\t\t\t\t52\r\n#else\r\n#define MAX_LVLS\t\t\t\t16\r\n#define MAX_LVLMTYPES\t\t\t16\r\n#define MAX_SPELLS\t\t\t\t37\r\n#endif\r\n#define MAX_SPELL_LEVEL\t\t\t15\r\n#define SPELLBIT(s) ((__int64)1 << (s - 1))\r\n\r\n#define MAX_CHUNKS\t\t\t\t(MAX_LVLS + 5)\r\n\r\n// #define MAX_PATH\t\t\t\t260\r\n#define MAX_SEND_STR_LEN\t\t80\r\n\r\n#define MAXDEAD\t\t\t\t\t31\r\n#define MAXDUNX\t\t\t\t\t112\r\n#define MAXDUNY\t\t\t\t\t112\r\n#define MAXITEMS\t\t\t\t127\r\n#define MAXBELTITEMS\t\t\t8\r\n#define MAXLIGHTS\t\t\t\t32\r\n#define MAXMISSILES\t\t\t\t125\r\n#define MAXMONSTERS\t\t\t\t200\r\n#define MAXOBJECTS\t\t\t\t127\r\n#define MAXPORTAL\t\t\t\t4\r\n#ifdef HELLFIRE\r\n#define MAXQUESTS\t\t\t\t24\r\n#define MAXMULTIQUESTS\t\t\t10\r\n#else\r\n#define MAXQUESTS\t\t\t\t16\r\n#define MAXMULTIQUESTS\t\t\t4\r\n#endif\r\n#define MAXTHEMES\t\t\t\t50\r\n#define MAXTILES\t\t\t\t2048\r\n#ifdef HELLFIRE\r\n#define MAXTRIGGERS\t\t\t\t7\r\n#else\r\n#define MAXTRIGGERS\t\t\t\t5\r\n#endif\r\n#define MAXVISION\t\t\t\t32\r\n#define MDMAXX\t\t\t\t\t40\r\n#define MDMAXY\t\t\t\t\t40\r\n#define MAXCHARLEVEL\t\t\t51\r\n#ifdef HELLFIRE\r\n#define ITEMTYPES\t\t\t\t43\r\n#else\r\n#define ITEMTYPES\t\t\t\t35\r\n#endif\r\n\r\n// number of inventory grid cells\r\n#define NUM_INV_GRID_ELEM\t\t40\r\n#define INV_SLOT_SIZE_PX\t\t28\r\n\r\n// Item indestructible durability\r\n#define DUR_INDESTRUCTIBLE\t\t255\r\n\r\n#define VOLUME_MIN\t\t\t\t-1600\r\n#define VOLUME_MAX\t\t\t\t0\r\n\r\n#define NUM_TOWNERS\t\t\t\t16\r\n\r\n// todo: enums\r\n#ifdef HELLFIRE\r\n#define NUMLEVELS\t\t\t\t25\r\n#define BOY_MAX_VALUE\t\t\t200000\r\n#define WITCH_ITEMS\t\t\t\t25\r\n#define WITCH_MAX_VALUE\t\t\t200000\r\n#define SMITH_ITEMS\t\t\t\t25\r\n#define SMITH_PREMIUM_ITEMS\t\t15\r\n#define SMITH_MAX_VALUE\t\t\t200000\r\n#define SMITH_MAX_PREMIUM_VALUE 200000\r\n#define STORE_LINES\t\t\t\t104\r\n#else\r\n#define NUMLEVELS\t\t\t\t17\r\n#define BOY_MAX_VALUE\t\t\t90000\r\n#define WITCH_ITEMS\t\t\t\t20\r\n#define WITCH_MAX_VALUE\t\t\t140000\r\n#define SMITH_ITEMS\t\t\t\t20\r\n#define SMITH_PREMIUM_ITEMS\t\t6\r\n#define SMITH_MAX_VALUE\t\t\t140000\r\n#define SMITH_MAX_PREMIUM_VALUE 140000\r\n#define STORE_LINES\t\t\t\t24\r\n#endif\r\n\r\n// from diablo 2 beta\r\n#define MAXEXP\t\t\t\t\t2000000000\r\n#define MAXRESIST\t\t\t\t75\r\n\r\n#define GOLD_SMALL_LIMIT\t\t1000\r\n#define GOLD_MEDIUM_LIMIT\t\t2500\r\n#define GOLD_MAX_LIMIT\t\t\t5000\r\n\r\n#define PLR_NAME_LEN\t\t\t32\r\n\r\n#define MAXPATHNODES\t\t\t300\r\n\r\n#define MAX_PATH_LENGTH\t\t\t25\r\n\r\n// 256 kilobytes + 3 bytes (demo leftover) for file magic (262147)\r\n// final game uses 4-byte magic instead of 3\r\n#define FILEBUFF\t\t\t\t((256 * 1024) + 3)\r\n\r\n#define PMSG_COUNT\t\t\t\t8\r\n\r\n// Diablo Retail Version Game ID\r\n#ifdef HELLFIRE\r\n#define GAME_ID\t\t\t\t\t((int)'HRTL')\r\n#define GAME_VERSION\t\t\t34\r\n#define PROGRAM_NAME\t\t\t\"Hellfire Retail\"\r\n#else\r\n#define GAME_ID\t\t\t\t\t((int)'DRTL')\r\n#define GAME_VERSION\t\t\t42\r\n#define PROGRAM_NAME\t\t\t\"Diablo Retail\"\r\n#endif\r\n\r\n// Diablo uses a 256 color palette\r\n// Entry 0-127 (0x00-0x7F) are level specific\r\n// Entry 128-255 (0x80-0xFF) are global\r\n\r\n// standard palette for all levels\r\n// 8 or 16 shades per color\r\n// example (dark blue): PAL16_BLUE+14, PAL8_BLUE+7\r\n// example (light red): PAL16_RED+2, PAL8_RED\r\n// example (orange): PAL16_ORANGE+8, PAL8_ORANGE+4\r\n#define PAL8_BLUE\t\t128\r\n#define PAL8_RED\t\t136\r\n#define PAL8_YELLOW\t\t144\r\n#define PAL8_ORANGE\t\t152\r\n#define PAL16_BEIGE\t\t160\r\n#define PAL16_BLUE\t\t176\r\n#define PAL16_YELLOW\t192\r\n#define PAL16_ORANGE\t208\r\n#define PAL16_RED\t\t224\r\n#define PAL16_GRAY\t\t240\r\n\r\n#define SCREEN_WIDTH\t640\r\n#define SCREEN_HEIGHT\t480\r\n\r\n#define ZOOM_WIDTH\t\t(SCREEN_WIDTH / 2 + TILE_WIDTH)\r\n#define ZOOM_HEIGHT\t\t(VIEWPORT_HEIGHT / 2 + TILE_HEIGHT + TILE_HEIGHT / 2)\r\n\r\n// If defined, use 32-bit colors instead of 8-bit [Default -> Undefined]\r\n//#define RGBMODE\r\n\r\n#ifndef RGBMODE\r\n#define SCREEN_BPP\t\t8\r\n#else\r\n#define SCREEN_BPP\t\t32\r\n#endif\r\n\r\n#define BORDER_LEFT\t\t64\r\n#define BORDER_TOP\t\t160\r\n#define BORDER_RIGHT\t64\r\n#define BORDER_BOTTOM\t16\r\n\r\n#define SCREEN_X\t\tBORDER_LEFT\r\n#define SCREEN_Y\t\tBORDER_TOP\r\n\r\n#define BUFFER_WIDTH\t(BORDER_LEFT + SCREEN_WIDTH + BORDER_RIGHT)\r\n#define BUFFER_HEIGHT\t(BORDER_TOP + SCREEN_HEIGHT + BORDER_BOTTOM)\r\n\r\n#define TILE_WIDTH\t\t64\r\n#define TILE_HEIGHT\t\t32\r\n\r\n#define PANEL_WIDTH     640\r\n#define PANEL_HEIGHT    128\r\n#define PANEL_TOP\t\t(SCREEN_HEIGHT - PANEL_HEIGHT)\r\n#define PANEL_LEFT\t\t(SCREEN_WIDTH - PANEL_WIDTH) / 2\r\n#define PANEL_X\t\t\t(SCREEN_X + PANEL_LEFT)\r\n#define PANEL_Y\t\t\t(SCREEN_Y + PANEL_TOP)\r\n\r\n#define SPANEL_WIDTH\t 320\r\n#define SPANEL_HEIGHT\t 352\r\n\r\n#define RIGHT_PANEL\t\t(SCREEN_WIDTH - SPANEL_WIDTH)\r\n#define RIGHT_PANEL_X\t(SCREEN_X + RIGHT_PANEL)\r\n\r\n#if SCREEN_WIDTH <= PANEL_WIDTH\r\n#define VIEWPORT_HEIGHT\t(SCREEN_HEIGHT - PANEL_HEIGHT)\r\n#else\r\n#define VIEWPORT_HEIGHT\tSCREEN_HEIGHT\r\n#endif\r\n\r\n#define DIALOG_TOP\t\t((SCREEN_HEIGHT - PANEL_HEIGHT) / 2 - 18)\r\n#define DIALOG_Y\t\t(SCREEN_Y + DIALOG_TOP)\r\n\r\n#define SCREENXY(x, y) ((x) + SCREEN_X + ((y) + SCREEN_Y) * BUFFER_WIDTH)\r\n\r\n#define MemFreeDbg(p)       \\\r\n\t{                       \\\r\n\t\tvoid *p__p;         \\\r\n\t\tp__p = p;           \\\r\n\t\tp    = NULL;        \\\r\n\t\tmem_free_dbg(p__p); \\\r\n\t}\r\n\r\n#undef assert\r\n\r\n#ifndef _DEBUG\r\n#define assert(exp) ((void)(exp))\r\n#else\r\n#define assert(exp) (void)((exp) || (assert_fail(__LINE__, __FILE__, #exp), 0))\r\n#endif\r\n\r\n#ifndef INVALID_FILE_ATTRIBUTES\r\n#define INVALID_FILE_ATTRIBUTES ((DWORD)-1)\r\n#endif\r\n\r\n// Typedef for the function pointer\r\ntypedef void (*_PVFV)(void);\r\n\r\n#if defined(_MSC_VER) && !defined(__APPLE__)\r\n// Define our segment names\r\n#define SEGMENT_C_INIT \".CRT$XCU\"\r\n\r\n// Build our various function tables and insert them into the correct segments.\r\n#pragma data_seg(SEGMENT_C_INIT)\r\n#pragma data_seg() // Switch back to the default segment\r\n// Call function pointer arrays and place them in the segments created above\r\n#define SEG_ALLOCATE(SEGMENT) __declspec(allocate(SEGMENT))\r\n#else\r\n#define SEG_ALLOCATE(SEGMENT)\r\n#endif\r\n\r\n// To apply to certain functions which have local variables aligned by 1 for unknown yet reason\r\n#if (_MSC_VER == 1200)\r\n#define ALIGN_BY_1 __declspec(align(1))\r\n#else\r\n#define ALIGN_BY_1\r\n#endif\r\n\r\n#if (_MSC_VER == 1200)\r\n#define __FINLINE __forceinline\r\n#else\r\n#define __FINLINE\r\n#endif\r\n\r\n#ifndef _BIG_ENDIAN_\r\n#define SwapLE32\r\n#else\r\n#define SwapLE32(value) (value << 24 | (value & 0xFF00) << 8 | (value & 0xFF0000) >> 8 | value >> 24);\r\n#endif\r\n"
  },
  {
    "path": "docs/BACKGROUND.md",
    "content": "# Project background\n\nTo give further background, the Devilution team has primarily relied on these resources:\n\n1. The Japanese Playstation port with debug symbols contained in `DIABPSX.SYM`. (see [[1]]).\n\nExample debug info of the Cathedral dungeon generation algorithm:\n\n```cpp\n// address: 0x801259D0\n// line start: 612\n// line end:   624\nvoid DRLG_L1Floor__Fv() {\n// register: 19\nregister int i;\n// register: 20\nregister int j;\n// register: 3\nregister long rv;\n}\n```\n\n2. The debug release of the PE executable, which contained assert strings (see [[2]]).\n\nExample assert string:\n\n```cpp\n\"plr[myplr].InvGrid[i] <= plr[myplr]._pNumInv\"\n```\n\n3. The Rich header of the PE executable, which details the exact version of the original compilers and linkers used to build `Diablo.exe` (see [[3]], [[4]]).\n\nExample information recovered from the Rich header of `Diablo.exe`:\n\n```\nId  Build  Count  Name       Description\n 0      0    155  Unknown    [---] Number of imported functions (old)\n 1      0    229  Import0    [---] Number of imported functions\n 6   1668      1  Cvtres500  [RES] VS97 (5.0) SP3 cvtres 5.00.1668\n 2   7303     29  Linker510  [IMP] VS97 (5.0) SP3 link 5.10.7303\n 3   7303      1  Cvtomf510        VS97 (5.0) SP3 cvtomf 5.10.7303\n 4   8447      2  Linker600  [LNK] VC++ 6.0 SP3,SP4,SP5,SP6 link 6.00.8447\n48   9044     72  Utc12_2_C  [---] VC++ 6.0 SP5 Processor Pack\n19   9049     12  Linker512        Microsoft LINK 5.12.9049\n```\n\n4. Discovery of the original set of compiler flags used to build `Diablo.exe` (see [[5]]).\n\nPrimarily \"/O1\" was used, but there are also peculiarities such as the use of both Microsoft Visual Studio 6 and Microsoft Visual Code 5 for linking the game.\n\n5. The heartfelt dedication of a team of people. GalaXyHaXz did the initial heavy lifting and succeeded in the tremendous task of getting the decompiled source code of Diablo 1 compiling with the original toolchain. Later on she released the project open source and a community of open source collaborators formed. Most of us have never met in real life prior to joining the project, which stands to show that there is strength in online collaboration that transcend both culture and borders.\n\n6. The Beta release and the Alpha4 release of Diablo 1 has also proved invaluable resources for cross-validation as the compiler optimization level was not set to release mode for these binaries.\n\nInterestingly, in the process a number of bugs in the original implementation of Diablo 1 were discovered. These have been documented in the source code of Devilution with `// BUGFIX: foo` comments, and have also been detailed in [[6]].\n\nTo track the progress of the project, the \"Binary identical functions\" milestone has been used in tandem with an assembly diffing tool developed in Rust (see [[7]], [[8]]).\n\nAnecdotally, it was an incredible moment when we first managed to run the cross-platform port of Diablo 1 (DevilutionX, see [[9]]) natively on Linux and succeeded in playing a multiplayer game connecting our computers in Korea and Denmark. It is equally thrilling to see the modding and porting community picking up the torch and already succeeding in porting Diablo 1 to Nintendo Switch!\n\nThe main reason for conducting this bit of software archeology is to preserve the classic title that is Diablo 1, for generations to come. And to revive it for modern hardware platforms and make it more mod-friendly in the age of open source software.\n\nHappy coding! - The Devilution Team\n\nP.S. the project README explicitly states that to play the game, you still need to have access to the original game assets released on the Diablo 1 CD. To acquire a legal copy, please refer to https://www.gog.com/game/diablo\n\nP.P.S. for the verification process, there have been proposals that are both ambitious at a level of PhD research (see [[10]]) and that made us feel warm and fuzzy <3 In the end, many of the techniques outlined were discussed mostly on a design level, some were included as Proof of Concepts, but most of the work in reverse engineering Diablo 1 was from tender labour of a team that care for Diablo 1 the way you would your firstborn child.\n\nP.P.P.S. you can also view our presentation slides here: https://docs.google.com/presentation/d/1ghmOFFgA3MfuJALMo8hmfNCL6pWWaW3plAbRtmSwfXY/edit?usp=sharing\n\n[1]: https://github.com/diasurgical/scalpel/blob/master/psx/_dump_/_dump_merge_c_src_/diabpsx/source/drlg_l1.cpp\n\n[2]: http://diablo1.se/notes/debug.html\n\n[3]: https://github.com/diasurgical/devilution/issues/111#issuecomment-426059660\n\n[4]: http://bytepointer.com/articles/the_microsoft_rich_header.htm\n\n[5]: https://github.com/diasurgical/devilution/issues/111\n\n[6]: https://github.com/diasurgical/devilution/issues/64\n\n[7]: https://github.com/diasurgical/devilution/milestone/3\n\n[8]: https://github.com/diasurgical/devilution-comparer\n\n[9]: https://github.com/diasurgical/devilutionX\n\n[10]: https://github.com/diasurgical/devilution/issues/171\n"
  },
  {
    "path": "docs/CHANGELOG.md",
    "content": "# Changelog\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)\nand this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).\n\n## [0.10.0](https://github.com/diasurgical/devilution/compare/0.9.6...0.10.0)\n### June 22, 2019\n- [All functions are now binary identical](https://github.com/diasurgical/devilution/milestone/3) to the 1.09b version\n- Fix buying from Wirt\n- Replace many magic numbers with constants\n- Fix a handful of minor issues\n- Add toggle fullscreen with alt+enter in debug builds\n\n### June 21, 2019\n- All functions are now [binary identical](https://github.com/diasurgical/devilution/milestone/3) to Diablo 1.09b\n\n### June 1, 2019\n- MVG posts [a video about the project](https://www.youtube.com/watch?v=5tADL_fmsHQ) and releases a Nintendo Switch port\n\n## [0.9.6](https://github.com/diasurgical/devilution/compare/0.9.0...0.9.6)\n### May 19, 2019\n- [96% of functions are now binary identical](https://github.com/diasurgical/devilution/milestone/3) to the 1.09b version\n- Fix several item corruption issues introduced in 0.9.0\n\n## [0.9.0](https://github.com/diasurgical/devilution/compare/0.8.0...0.9.0)\n### May 2, 2019\n- [90% of functions are now binary identical](https://github.com/diasurgical/devilution/milestone/3) to the 1.09b version\n- Mute buttons now work correctly\n\n### April 15, 2019\n- Code is once again compiled as C++ as some parts appear to require despite the indications in Rich header\n\n## [0.8.0](https://github.com/diasurgical/devilution/compare/0.7.0...0.8.0)\n### April 12, 2019\n- [80% of functions are now binary identical](https://github.com/diasurgical/devilution/milestone/3) to the 1.09b version\n- Fixes a few minor issues with generated items\n\n## [0.7.0](https://github.com/diasurgical/devilution/compare/0.6.0...0.7.0)\n### April 9, 2019\n- [70% of functions are now binary identical](https://github.com/diasurgical/devilution/milestone/3) to the 1.09b version\n\n### April 9, 2019\n- The last of the compiler flags are figured out\n\n### March 22, 2019\n- Devilution appears on [Phoronix](https://www.phoronix.com/scan.php?page=news_item&px=DeviluitionX-Open-Diablo)\n\n## [0.6.0](https://github.com/diasurgical/devilution/compare/v0.5.0...0.6.0)\n### March 19, 2019\n- [60% of functions are now binary identical](https://github.com/diasurgical/devilution/milestone/3) to the 1.09b version\n- Added a guide for people wanting to join in [Cleaning the code](https://github.com/diasurgical/devilution/wiki/Cleaning-Code)\n- File size is now only 968 bytes (0.13%) larger than the original Diablo 1.09b.\n\n### March 7, 2019\n- [GOG re-release Diablo](https://www.gog.com/news/release_diablo)\n\n## [0.5.0](https://github.com/diasurgical/devilution/compare/0.4...v0.5.0)\n### January 14, 2019\n- [50% of functions are now binary identical](https://github.com/diasurgical/devilution/milestone/3) to the 1.09b version\n- [#456](https://github.com/diasurgical/devilution/pull/456) Assets can now be loaded directly form disk (no need for MPQ-files when modding)\n- [#528](https://github.com/diasurgical/devilution/pull/528) Code ported to C (can still be compiled as C++)\n- [#111](https://github.com/diasurgical/devilution/pull/111) Rich Header no longer contains incorrect sections\n- [#182](https://github.com/diasurgical/devilution/pull/182) defined a [Code Style](https://github.com/diasurgical/devilution/wiki/Code-style-guide) with accompanying clang-format definition\n- `Diabloui.dll` is now also part of the source tree\n- Added [Contribution Guide](https://github.com/diasurgical/devilution/blob/master/docs/CONTRIBUTING.md)\n- Added PDB build option for comparing with [devilution-comparer](https://github.com/diasurgical/devilution-comparer)\n- CI now runs the original build chain\n- Most magic numbers are now replaced by enums\n- The code was reduced by 10,000 lines\n- Fix a few issues, mostly relating to multiplayer\n\n### November 17, 2018\n- An older and more original PSX symbol file is discovered\n\n### October 1, 2018\n- Compiler version is confirmed to be correct by discovery of the [Rich header](http://bytepointer.com/articles/the_microsoft_rich_header.htm)\n\n### September 18, 2018\n- Merge nightly back in to devilution\n\n### September 3, 2018\n- Travis is configured to report the overall project delta to 1.09b on every change\n\n### September 1, 2018\n- Devilution-comparer is developed for comparing binary diff in compiled functions\n\n### August 28, 2018\n- The correct compiler combination is found by trial and error plus a bit of luck\n\n## [0.4.0](https://github.com/diasurgical/devilution/compare/0.3...0.4)\n### September 16, 2018\n- Fix crash\n- Get the first functions bin exact\n- Fix render issues\n- Introduce debug functions from the 1.00 debug release\n- Fix missiles\n- More consts, sizeof and defines\n- Fix several issues with dungeon generation code\n- Fix multiplayer\n- Fix error messages\n- Correct names based on PSX symbols and DX SDK\n\n### August 20, 2018\n- Created nightly fork where code clean up can take place until major bugs are fixed in the main project\n\n### July 6, 2018\n- Setup a Discord channel\n\n### July 1, 2018\n- Diablo 1.09b is determined to have been compiled with the /O1 flag\n\n## [0.3.0](https://github.com/diasurgical/devilution/compare/0.1.0...0.3)\n### June 28, 2018\n- Windows binary can now be compiled under Linux and Mac OS X\n- Windows binary can now be compiled under VS 5.10\n- Fix multiple crashes\n- Remove cheesy copyright notice\n- Set up continuous building via Travis and AppVeyor\n- Icon added\n- Fix Zhar quest, monster squelching and golems\n- Use consts for various values\n\n### June 20, 2018\n- The [media](https://www.pcgamer.com/a-coder-spent-1200-hours-reverse-engineering-diablos-source-code/) catches wind and [several](https://bloody-disgusting.com/video-games/3505673/fan-completes-reverse-engineering-source-code-diablo/) [articles](https://kotaku.com/coder-spends-1-200-hours-piecing-together-diablos-sourc-1827001247) [appear](https://www.diabloii.net/blog/comments/reverse-engineered-diablo-source-code-released)\n\n### June 18, 2018\n- Devilution gets posted on [Y Combinator](https://news.ycombinator.com/item?id=17338886)\n\n## 0.1.0\n### June 6, 2018\n- Devilution is unleashed upon the world! Version 0.1.0!\n\n### June 3, 2018\n- Polishing things up for final release\n- Added a cheesy fake copyright notice to dissuade monetary gain\n- Properly integrated Storm and DiabloUI into the project\n\n### May 28, 2018\n- Fixed bugs with save files\n- You can now load Devilution saves in the vanilla game\n\n### May 25, 2018\n- Finally! Figured it out and now monsters spawn correctly\n- The game can be completed from start to finish with a few tricks\n\n### May 21, 2018\n- Took a week break, begin working on monster code again\n- Nearly all quests work now\n- Fixed a bug with Adria\n\n### May 8, 2018\n- Fix bugs with character drawing\n- Fix bugs relating to item affix generation\n- Towners no longer crash the game\n\n### May 7, 2018\n- Port debugging functions from the debug release\n- Still can't figure out the zombie problem\n\n### May 5, 2018\n- Begin fixing quest code and testing completion\n\n### April 26, 2018\n- Zombies are spawning in all dungeon types... sigh\n\n### April 20, 2018\n- Split code from IDA's C file into separate CPP files\n- All dungeon types can now be entered\n- Objects are now mostly working\n- Begin uncommenting monster code and fixing them\n\n### April 11, 2018\n- Begin fixing up dungeon generation and objects\n\n### April 4, 2018\n- Fixed many crashing bugs when in town and dungeon\n- Items, missiles, and spells are now drawn\n\n### April 1, 2018\n- Finally fixed the render bug, everything draws correctly!\n- Character animation now draws correctly\n- The cathedral is now mostly working\n\n### March 29, 2018\n- Fixed tons of bugs\n- You can now walk around in town\n- Entering the dungeon almost always crashes\n\n### March 27, 2018\n- Uncommented and fixed lots of broken code\n- The game screen now appears, although very glitchy\n\n### March 22, 2018\n- Control panel and inventory now work almost flawlessly\n\n### March 21, 2018\n- Temporarily commented out tons of broken code\n- You can now get past the loading screen and into town\n- Music also works\n- Control panel mostly works but game screen is black\n\n### March 18, 2018\n- The title screen now works\n- Freezes during the loading screen\n\n### March 16, 2018\n- Fixed enough bugs that you can now launch binary\n- Crashes during title screen\n\n### March 14, 2018\n- Fix remaining errors in code\n- Code now compiles and produces a non-working binary\n\n### March 13, 2018 -- *!  SPECIAL DAY  !*\n- Dump the database to C code via IDA\n\n### March 8, 2018\n- Correct various function signatures\n- Correct struct names and types\n- Plug in enumerates\n- Finish correcting and documenting data sections\n\n### February 26, 2018\n- Finish documenting functions\n- Begin correcting names to match PSX\n\n### February 18, 2018\n- Begin adding enumerates\n- Add more minor structs\n- Clean up data sections\n\n### February 15, 2018\n- Almost finished adding every function\n- Begin working on major structs\n\n### February 8, 2018\n- Add more functions\n- Begin adding data from Sanctuary project\n\n### February 4, 2018\n- IDA disassembly begin\n- Start adding function names from [Sanctuary project](https://github.com/sanctuary/notes)\n\n### January 15, 2018\n- The concept of Devilution is born\n- Research into Diablo's code and mechanics\n- Research from [Jarulf's guide](http://www.bigd-online.com/JG/JGFrame.html)\n"
  },
  {
    "path": "docs/CONTRIBUTING.md",
    "content": "# Contribution Guide\n\nThis guide outlines useful resources, tools and processes for contribution to\nDevilution.\n\n## Code style guide\n\n[The code style guide](https://github.com/diasurgical/devilution/wiki/Code-Style) is evolving with the project.\n\n## Useful Repos\n\n* [diasurgical/scalpel](https://github.com/diasurgical/scalpel) - uploaded .SYM files from each release of Diablo 1 on Playstation\n* [diasurgical/devilution-comparer](https://github.com/diasurgical/devilution-comparer) - small helper tool to aid comparing functions between devilution and the original binary\n* [sanctuary/notes](https://github.com/sanctuary/notes) - documented Windows-specific Diablo code\n* [sanctuary/psx](https://github.com/sanctuary/psx) - .SYM files converted to C headers\n\n## Software and Utils\n\n* A clean installation of Diablo patched to version 1.09b (Diablo.exe)\n* Download IDA (Interactive Disassembler) [Hex-Rays](https://www.hex-rays.com/products/ida/support/download_freeware.shtml)\n* Download IDC script from sanctuary/notes repository: [notes.idc](http://sanctuary.github.io/notes/notes.idc)\n\n## How To...\n\nDescribed below are steps for using the IDA and SYM files to reverse the Diablo\nsource.\n\n### Understanding Devilution and Sanctuary Notes\n\nBoth Devilution and the Sanctuary Notes repo have the intended aim to get as\nclose as possible to document the original game. Devilution is closer in the\nsense that the same names have been used for functions as based on the SYM\ndebug info. The notes repo has tried to use consistent naming for functions,\ne.g. prefix with source file name.\n\nSee for instance [drlg_l1_load_dun](http://sanctuary.github.io/notes/#function/drlg_l1_load_dun),\nwhich is defined in `drlg_l1.cpp`. This function has the PSX signature\n`void LoadL1Dungeon__FPcii(char *sFileName, int vx, int vy)`, but is documented\nin the Sanctuary Notes repo as follows for consistency:\n\n```cpp\n/// address: 0x40AE79\n///\n/// drlg_l1_load_dun loads tile IDs, monsters and objects from the given\n/// dungeon file.\n///\n/// PSX ref: 0x8013CF64\n/// PSX def: void LoadL1Dungeon__FPcii(char *sFileName, int vx, int vy)\nvoid __fastcall drlg_l1_load_dun(char *dun_path, int view_x, int view_y);\n```\n\n### Interactive Disassembler Usage\n\n* Open the `Diablo.exe` (version 1.09b in IDA) and wait for it to finish\n  analysis\n  * Open as \"Portable Executable\"\n  * Processor type i386 (80386)\n* Run the IDC script in IDA on the fresh IDB database to import names for\n  variables and functions, type definitions, etc. (Note: run the IDC script\n  **only** on new IDB databases as it removes all variable names before adding new\n  ones.); for more info, see [#79 (comment)](https://github.com/diasurgical/devilution/pull/79#issuecomment-400536087)\n* Example: search for `drlg_l1_load_dun`\n  * Starting memory address `0x40AE79`\n  * Function name `drlg_l1_load_dun`\n  * Function arguments `(char *dun_path, int view_x, int view_y)`\n  * #TODO what else can be inferred from below?\n\n```asm\n; drlg_l1_load_dun loads tile IDs, monsters and objects from the given\n; dungeon file.\n; Attributes: bp-based frame\n\n; void __fastcall drlg_l1_load_dun(char *dun_path, int view_x, int view_y)\ndrlg_l1_load_dun proc near\n\nvar_C= dword ptr -0Ch\nvar_8= dword ptr -8\nvar_4= dword ptr -4\nview_y= dword ptr  8\n\npush    ebp\nmov     ebp, esp\nsub     esp, 0Ch\npush    ebx\npush    esi\npush    edi\npush    10h\npop     eax\nmov     [ebp+var_C], edx\npush    60h\nmov     dword_5D2458, eax\nmov     dword_5D245C, eax\npop     eax\nmov     esi, ecx\nmov     dword_5CF328, eax\nmov     dword_5CF32C, eax\ncall    gendung_init_transparency\nxor     edx, edx        ; size\nmov     ecx, esi        ; file_path\ncall    engine_mem_load_file\nmov     esi, eax\nxor     ecx, ecx\n```\n\n### About the SYM\n\nThe [diasurgical/scalpel](https://github.com/diasurgical/scalpel) repository includes a copy of a symbolic file that was\naccidentally left on the Japanese release of Diablo on Playstation 1. The CD\ncontained debug information in a .SYM file, the format of which has been\nreversed, so we can recover type information, variable names, etc, for the PSX\nrelease.\n\n* Download and open [jap_05291998.out](https://raw.githubusercontent.com/diasurgical/scalpel/master/psx/symbols/jap_05291998.out)\n* Example: search for `LoadL1Dungeon__FPcii`\n  * Starting memory address `0x8013CF64`\n  * Function name `LoadL1Dungeon`\n  * Function arguments `(*char sFilename, int vx, int, vy)`\n  * #TODO what else can be inferred from below?\n\n```\n135ea8: $8013cf64 8c Function_start\n    fp = 29\n    fsize = 48\n    retreg = 31\n    mask = $80070000\n    maskoffs = -4\n    line = 905\n    file = C:\\diabpsx\\SOURCE\\DRLG_L1.CPP\n    name = LoadL1Dungeon__FPcii\n135ef4: $00000010 94 Def class REGPARM type PTR CHAR size 0 name sFileName\n135f0b: $00000011 94 Def class REGPARM type INT size 0 name vx\n135f1b: $00000012 94 Def class REGPARM type INT size 0 name vy\n135f2b: $8013cf64 90 Block_start  line = 1\n135f34: $00000005 94 Def class REG type INT size 0 name i\n135f43: $00000007 94 Def class REG type INT size 0 name j\n135f52: $0000000b 94 Def class REG type INT size 0 name rw\n135f62: $0000000c 94 Def class REG type INT size 0 name rh\n135f72: $00000010 94 Def class REG type PTR UCHAR size 0 name pLevelMap\n135f89: $00000008 94 Def class REG type PTR UCHAR size 0 name lm\n135f99: $8013d0c4 90 Block_start  line = 44\n135fa2: $8013d11c 92 Block_end  line = 60\n135fab: $8013d11c 92 Block_end  line = 60\n135fb4: $8013d138 8e Function_end\n```\n\n## Comparing a function with the original exe\n\n### Using Riivaaja\n\n* Step 1:\nhttps://docs.docker.com/install/\n* Step 2:\nDownload latest devilution-comparer: https://github.com/diasurgical/devilution-comparer/releases (build from src if on Mac)\n* Step 3:\nGet the Diablo 1.09 exe\n* Step 4:\nIf not on Windows Devilution-comparer requires Wine, either install Wine or use Riivaaja as a proxy (more on this later if you would like to go this route).\n* Step 5:\n\n#### To get a function for comparison\n\nBuild:\n`docker run --rm -v $(pwd):/root/devilution -e MAKE_BUILD=pdb diasurgical/riivaaja`\nGenerate diff:\n`devilution-comparer Diablo_original.exe Diablo.exe <function_name>`\nYou can add `--no-mem-disp` if you want a cleaner output but this can also hide valuable details\nThis will generate an `orig.asm` and `compare.asm` that you can compare in your favorit `diff` application, in the folder that you can the command from.\n\nTo use Riivaaja instead of installing Wine, create `wine` in your `$PATH` and add this content:\n\n```bash\n#!/bin/sh\ndocker run --rm -v $(pwd):/root/devilution --entrypoint \"/usr/bin/wine\" diasurgical/riivaaja:stable $(basename $1) $2 $3\n```\n\n(Don't forget to also set exec permissions on the file)\n\n### Using devilution-comparer with Wine\n\nInstall dependencies:\n1. Install Wine if not on Windows (e.g. `sudo pacman -S wine`)\n2. Install MS VC+ 5 + SP3 and MS VC+ 6 + SP5 + PP. (for more information see the [building instructions](https://github.com/diasurgical/devilution/#compiling) of the readme)\n\nInstall `devililution-comparer` from release (or from source below):\n1. Download and extract the latest release from https://github.com/diasurgical/devilution-comparer/releases\n\nOr install `devililution-comparer` from source:\n1. `git clone https://github.com/diasurgical/devililution-comparer`\n2. `cd devililution-comparer`\n3. `cargo build --release`\n4. `cp cvdump.exe target/release/`\n5. `cp comparer-config.toml target/release/`\n\nClone Devilution nightly, build and compare against the original Diablo binary:\n1. `git clone https://github.com/diasurgical/devil-nightly`\n2. `make MAKE_BUILD=pdb -f MakefileVC`\n3. `cp /path/to/diablo-v1.09b.exe .`\n4. `../devilution-comparer/target/debug/devilution-comparer diablo-v1.09b.exe Diablo.exe <function name>` (replace `<function name>` with e.g. `InitMonsterTRN`)\n5. `code --diff orig.asm compare.asm` (or `diff -u orig.asm compare.asm`)\n\nTo watch build directory for changes use the `-w` command line flag:\n\n```bash\n$ ./devilution-comparer -w diablo-v1.09b.exe Diablo.exe InitMonsterTRN\nFound InitMonsterTRN at 0x4322EC, size: 0x8C; orig size: 0x8C\nStarted watching Diablo.pdb for changes. CTRL+C to quit.\n```\n"
  },
  {
    "path": "docs/INSTALL_linux.md",
    "content": "# Installation\n\n## Dependencies\n\nUbuntu\n```bash\nsudo apt install g++-mingw-w64-i686\n```\n\nArch Linux\n```bash\npacman -S mingw-w64-gcc mingw-w64-binutils\n```\n\nFedora 28:\n```bash\nsudo dnf install mingw32-gcc-c++ wine\n```\n\nelementary OS:\n```bash\nsudo apt install mingw-w64 wine\n```\n\n\n## Building\n\n```bash\ngit clone https://github.com/galaxyhaxz/devilution\ncd devilution\ncp /path/to/diablo_game_dir/diabloui.dll .\ncp /path/to/diablo_game_dir/storm.dll .\nmake\n```\n\nOn a 32-bit host, `$ make MINGW32=mingw32` should be used, to specify the 32-bit\ntoolchain.\n\n## Install\n\n```bash\ncp devilution.exe /path/to/diablo_game_dir/\n```\n\n## Run\n\n```bash\nwine devilution.exe\n```\n"
  },
  {
    "path": "docs/INSTALL_mac.md",
    "content": "# Installation\n\n## Dependencies\n\n[Homebrew](https://brew.sh/)\n\n```bash\nbrew install wine\nbrew install mingw-w64\n```\n\n## Building\n\n```bash\ngit clone https://github.com/galaxyhaxz/devilution\ncd devilution\ncp /path/to/diablo_game_dir/diabloui.dll .\ncp /path/to/diablo_game_dir/Storm.dll .\nmake\n```\n\n## Install\n\n```bash\ncp devilution.exe /path/to/diablo_game_dir/\n```\n\n## Run\n\n```bash\nwine devilution.exe\n```\n"
  },
  {
    "path": "docs/INSTALL_windows.md",
    "content": "# Installation\n\n## Dependencies and Initial Environment Configuration\n\n* Install [MSYS2](https://www.msys2.org/)\n\n```bash\n# Start the *MSYS2 MinGW 32-bit* terminal.\n\n# If this is the first time, go ahead and update all of your components, and\n# follow and instructions about restarting the terminal and running the update again:\npacman -Syu\n\n# After everything is updated, let's download all of the components needed\n# to build it and set up any dependency symlinks:\npacman -Sy git make mingw-w64-i686-gcc mingw-w64-i686-binutils\n\nln -s /mingw32/i686-w64-mingw32/bin/dlltool.exe /usr/bin/i686-w64-mingw32-dlltool.exe\nln -s /mingw32/i686-w64-mingw32/bin/as.exe /usr/bin/i686-w64-mingw32-as.exe\nln -s /mingw32/bin/windres.exe /usr/bin/i686-w64-mingw32-windres.exe\n```\n\n## Building\n\n```bash\ngit clone https://github.com/galaxyhaxz/devilution\ncd devilution\ncp /path/to/diablo_game_dir/diabloui.dll .\ncp /path/to/diablo_game_dir/storm.dll .\n\n# If you only have a single core machine or if building in parallel\n# causes issues, simply run the following command:\nmake\n\n# If you want to compile faster, then use the following command (Substitute # for\n# your number of processors + 1. So if you have an 8 core processor, use 9:\nmake -j#\n```\n\n## Install\n\n```bash\n# The Devilution executable will be placed in the root of your Devilution repository.\n# Simply copy this over to your Diablo installation folder:\ncp devilution.exe /path/to/diablo_game_dir/\n```"
  },
  {
    "path": "docs/TODO.md",
    "content": "### Comments\n- `BUGFIX` known bugs in original (vanilla) code\n- `/* */` block comments are things to be fixed/checked\n- `FIX_ME` bad data\n\nCode issues (incorrect code that still works)\n- Critical sections should be constructors using `CCritSect`\n- Some functions/structures have incorrect signing (signed/unsigned BYTE)\n"
  },
  {
    "path": "docs/compatibility_matrix.md",
    "content": "# Compatibility Matrix, Compilations, Platform Statuses, Etc\n\nPlease use UTC times for all entries. The Z ending represents UTC time.\n\n## Status Cheat Sheet\n\n[Modeled after Wine HQ's Rating System](https://wiki.winehq.org/AppDB_Rating_Definitions)\n\n| Rank | Description |\n| --- | --- |\n| Platinum | Works perfectly right after compilation either better or equal to Native Diablo Executable. |\n| Gold | Works right after compilation with no crashes during gameplay but workarounds needed. |\n| Silver | Works right after compilation with no crashes during gameplay but issues exist where no workarounds exist. |\n| Bronze | Mostly works but there are still some problems remaining that prevent a full playthrough.| \n| Trash | Game has severe problems and cannot be played. |\n\n## Windows\n\n| Date | Status | OS | Bitness | Version (OS) | Build (OS) | Compiler | Build Platform | User | Workaround |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| 2018-06-24 @ 17:05 Z| Gold | 10 | x64 | 1803 | 17134.112 | i686-w64-mingw32-gcc-7.3.0 | MSYS 2 i686 | fearedbliss | Needed to use ddraw patch. |\n| 2018-06-24 @ 12:52 Z| Platinum | 7 | x64 | 6.1 | 7601 | Visual C++ 6.0 | VC++ | Sergi4UA | None |\n| 2018-06-24 @ 01:00 Z| Platinum | 7 | x64 | 6.1 | 7601 | Visual C++ 5.10 | VC++ | galaxyhaxz | None |\n| 2018-06-24 @ 18:00 Z| Gold | 10 | x64 | 1803 | 17134.112 | Visual Studio 2017 (Community) | VC++ | MadHed | Disable DEP in linker options |\n| 2018-06-24 @ 16:00 Z| Gold | 7 | x64 | 6.1 | 7601 | Visual Studio 2017 (Community) | VC++ | StephenCWills | Disable DEP in linker options |\n| 2018-06-26 @ 19:30 Z| Platinum | 7 | x64 | 6.1 | 7601 | i686-w64-mingw32-g++ (GCC) 6.4.0 | Cygwin | StephenCWills | None |\n| 2018-07-05 @ 23:54 Z| Gold | 10 | x64 | 1803 | 17134.112 | Visual Studio 2017 (Community) | VC++ | fearedbliss | Disable DEP in linker options |\n\n## Linux\n\n| Date | Status | OS | Bitness | Version (OS) | Build (OS) | Compiler | Build Platform | User | Workaround |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| 2018-08-20 @ 12:05 Z| Gold | Ubuntu (WSL) | x64 | xenial | 16.04.4 LTS | i686-w64-mingw32-g++ (GCC) 5.3.1 20160211 | Mingw64-x86 | ChaosMarc | Needed to use ddraw patch. |\n| 2018-08-20 @ 12:05 Z| Trash | Ubuntu (WSL) | x64 | bionic | 18.04 LTS | i686-w64-mingw32-g++ (GCC) 7.3-win32 20180312 | Mingw64-x86 | ChaosMarc | Crashes on startup (#107) |\n\n## Mac OS X\n\n| Date | Status | OS | Bitness | Version (OS) | Build (OS) | Compiler | Build Platform | User | Workaround |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n"
  },
  {
    "path": "docs/debug.md",
    "content": "There are debug features available through both in-game and through the command-line. These have been ported from the 12-21-96 debug build. Note that not all of them are available yet.\n\nCommand-line parameters\n- `-^` : enable god mode and debug tools\n- `-$` : enable god mode with less stuff (further documenting needed) [NOT YET IMPLEMENTED]\n- `-b` : enable item drop log [NOT YET IMPLEMENTED]\n- `-d` : disable startup video + increased item drops [PARTIALLY IMPLEMENTED]\n- `-f` : display frames per second\n- `-i` : disable network timeout\n- `-n` : disable startup video\n- `-s` : unused\n- `-v` : draw yellow debug tiles\n- `-w` : enable cheats\n- `-x` : disable exclusive DirectDraw access [NOT YET IMPLEMENTED]\n- `-j <##>` : init trigger at level [NOT YET IMPLEMENTED]\n- `-l <#> <##>` : start in level as type\n- `-m <###>` : add debug monster, up to 10 allowed\n- `-q <#>` : force a certain quest\n- `-r <##########>` : set map seed to\n- `-t <##>` : sets current quest level\n\nIn-game hotkeys\n- `?` -> enter quest text mode [NOT YET IMPLEMENTED]\n  - `-`/`_` -> decrease message number/speed\n  - `+`/`=` -> increase message number/speed\n  - `Enter` -> play selected message\n  - `Esc` -> stop quest text mode\n- `Shift` -> while holding, use the mouse to scroll screen\n- `F2` -> display dungeon information [NOT YET IMPLEMENTED]\n- `F3` -> display number of items on the ground/cursor item\n- `F4` -> display quest status information\n- `0`/`)` -> cycle between regular/magic arrows\n- `8`/`*` -> level up character\n- `~` -> refresh vendor items (Griswold premium and Adria)\n- `]` -> all spells level 10\n- `:` -> all spells preset level\n- `[` -> delete all gold in inventory\n- `|` -> fill inventory with gold (5000 piece piles)\n- `.` -> display dungeon Y/sum [NOT YET IMPLEMENTED]\n- `a` -> increase level of the last spell casted and enable `Teleport` in town\n- `A` -> display \"Mid\" monster related\n- `d` -> print debug player info\n- `D` -> switch current debug player\n- `e` -> display \"EFlag\"\n- `l`/`L` -> toggle lighting in dungeon\n- `m` -> print debug monster info\n- `M` -> switch current debug monster\n- `r`/`R` -> display game seeds\n- `t`/`T` -> display player and cursor coordinates\n\nMultiplayer hotkeys [NOT YET IMPLEMENTED]\n- `Ctrl`+`C` -> trigger breakpoint\n- `Ctrl`+`P` -> print mouse clicks and frame counter for each player\n- `Ctrl`+`S` -> sleep the network thread\n"
  },
  {
    "path": "docs/troubleshooting.md",
    "content": "# Troubleshooting\n\nWhile Devilution should produce a binary close to the original (compatible with Windows 95/NT), it may cause issues on newer systems. It has been reported to frequently crash on some setups, although for many it appears to be running flawless otherwise. Windows 7, Linux-WINE, and Windows 10 have all reported success.\n\nNote that newer compilers may need to be tweaked to properly produce an executable. Currently this is being worked on to provide multiple Makefiles for a variety of systems. To ensure the best results, either MinGW or Visual Studio 2003/older should be used for the time being.\n\n## Compilations with Different Toolchains\nCompiling with different compilers (Visual C++, MinGW, Etc) will lead lead to different\nresults with how the executable interacts with the operating system, and may lead to either\nweird crashes or different types of problems either during startup or runtime.\n\nFor example, for fearedbliss, on his Windows 10 x64 machine where he compiled Devilution\nwith MSYS2/MinGW32, he was getting the following messages:\n\n![Screenshot 1: Windows 2000 Advisory](https://i.imgur.com/ScFLGu5.png)\n\n![Screenshot 2: DirectDraw Error ](https://i.imgur.com/kiWkBuk.png)\n\nFor the first issue, it is annoying but doesn't seem to stop you from playing the game.\n\nThe second issue simply requires you to use the DirectDraw patch (ddraw.dll). Once the\ndll is placed in your Diablo directory, and all of it's dependencies are installed\n(DirectX 9 Runtime, and VC++ 2010 x86 Redistributable), it will work."
  },
  {
    "path": "doxygen.config",
    "content": "PROJECT_NAME           = \"Devilution\"\nPROJECT_BRIEF          = \"Diablo devolved - magic behind the 1996 computer game\"\nUSE_MDFILE_AS_MAINPAGE = README.md\nOUTPUT_DIRECTORY       = docs\nINPUT                  = ./ ./Source ./docs\nINPUT_ENCODING         = UTF-8\nFILE_PATTERNS          = *.c \\\n                         *.cpp \\\n                         *.h \\\n                         *.inc \\\n                         *.md\n\nGENERATE_LATEX         = NO\nWARNINGS               = YES\nSOURCE_BROWSER         = YES\nEXTRACT_STATIC         = YES\nJAVADOC_AUTOBRIEF      = YES\nOPTIMIZE_OUTPUT_FOR_C  = YES\nSEPARATE_MEMBER_PAGES  = YES\nDOT_IMAGE_FORMAT       = svg\nINTERACTIVE_SVG        = YES\nHTML_COLORSTYLE_HUE    = 0\nHTML_COLORSTYLE_SAT    = 125\nHTML_COLORSTYLE_GAMMA  = 200\n\n# Call graphces alows logical navigation of the docs\nCALL_GRAPH             = YES\nCALLER_GRAPH           = YES\n\n# all.h includes everything and everything inclues it so the graph is usless past depth 1\nMAX_DOT_GRAPH_DEPTH    = 1\n\n# Not all files are documented yet\nEXTRACT_ALL            = YES\n\n"
  },
  {
    "path": "enums.h",
    "content": "/**\r\n * @file enums.h\r\n *\r\n * Various global enumerators.\r\n */\r\n\r\ntypedef enum item_quality {\r\n\tITEM_QUALITY_NORMAL = 0,\r\n\tITEM_QUALITY_MAGIC  = 1,\r\n\tITEM_QUALITY_UNIQUE = 2,\r\n} item_quality;\r\n\r\ntypedef enum unique_base_item {\r\n\tUITYPE_NONE        = 0x0,\r\n\tUITYPE_SHORTBOW    = 0x1,\r\n\tUITYPE_LONGBOW     = 0x2,\r\n\tUITYPE_HUNTBOW     = 0x3,\r\n\tUITYPE_COMPBOW     = 0x4,\r\n\tUITYPE_WARBOW      = 0x5,\r\n\tUITYPE_BATTLEBOW   = 0x6,\r\n\tUITYPE_DAGGER      = 0x7,\r\n\tUITYPE_FALCHION    = 0x8,\r\n\tUITYPE_CLAYMORE    = 0x9,\r\n\tUITYPE_BROADSWR    = 0xA,\r\n\tUITYPE_SABRE       = 0xB,\r\n\tUITYPE_SCIMITAR    = 0xC,\r\n\tUITYPE_LONGSWR     = 0xD,\r\n\tUITYPE_BASTARDSWR  = 0xE,\r\n\tUITYPE_TWOHANDSWR  = 0xF,\r\n\tUITYPE_GREATSWR    = 0x10,\r\n\tUITYPE_CLEAVER     = 0x11,\r\n\tUITYPE_LARGEAXE    = 0x12,\r\n\tUITYPE_BROADAXE    = 0x13,\r\n\tUITYPE_SMALLAXE    = 0x14,\r\n\tUITYPE_BATTLEAXE   = 0x15,\r\n\tUITYPE_GREATAXE    = 0x16,\r\n\tUITYPE_MACE        = 0x17,\r\n\tUITYPE_MORNSTAR    = 0x18,\r\n\tUITYPE_SPIKCLUB    = 0x19,\r\n\tUITYPE_MAUL        = 0x1A,\r\n\tUITYPE_WARHAMMER   = 0x1B,\r\n\tUITYPE_FLAIL       = 0x1C,\r\n\tUITYPE_LONGSTAFF   = 0x1D,\r\n\tUITYPE_SHORTSTAFF  = 0x1E,\r\n\tUITYPE_COMPSTAFF   = 0x1F,\r\n\tUITYPE_QUARSTAFF   = 0x20,\r\n\tUITYPE_WARSTAFF    = 0x21,\r\n\tUITYPE_SKULLCAP    = 0x22,\r\n\tUITYPE_HELM        = 0x23,\r\n\tUITYPE_GREATHELM   = 0x24,\r\n\tUITYPE_CROWN       = 0x25,\r\n\tUITYPE_38          = 0x26,\r\n\tUITYPE_RAGS        = 0x27,\r\n\tUITYPE_STUDARMOR   = 0x28,\r\n\tUITYPE_CLOAK       = 0x29,\r\n\tUITYPE_ROBE        = 0x2A,\r\n\tUITYPE_CHAINMAIL   = 0x2B,\r\n\tUITYPE_LEATHARMOR  = 0x2C,\r\n\tUITYPE_BREASTPLATE = 0x2D,\r\n\tUITYPE_CAPE        = 0x2E,\r\n\tUITYPE_PLATEMAIL   = 0x2F,\r\n\tUITYPE_FULLPLATE   = 0x30,\r\n\tUITYPE_BUCKLER     = 0x31,\r\n\tUITYPE_SMALLSHIELD = 0x32,\r\n\tUITYPE_LARGESHIELD = 0x33,\r\n\tUITYPE_KITESHIELD  = 0x34,\r\n\tUITYPE_GOTHSHIELD  = 0x35,\r\n\tUITYPE_RING        = 0x36,\r\n\tUITYPE_55          = 0x37,\r\n\tUITYPE_AMULET      = 0x38,\r\n\tUITYPE_SKCROWN     = 0x39,\r\n\tUITYPE_INFRARING   = 0x3A,\r\n\tUITYPE_OPTAMULET   = 0x3B,\r\n\tUITYPE_TRING       = 0x3C,\r\n\tUITYPE_HARCREST    = 0x3D,\r\n\tUITYPE_MAPOFDOOM   = 0x3E,\r\n\tUITYPE_ELIXIR      = 0x3F,\r\n\tUITYPE_ARMOFVAL    = 0x40,\r\n\tUITYPE_STEELVEIL   = 0x41,\r\n\tUITYPE_GRISWOLD    = 0x42,\r\n\tUITYPE_LGTFORGE    = 0x43,\r\n\tUITYPE_LAZSTAFF    = 0x44,\r\n#ifdef HELLFIRE\r\n\tUITYPE_BOVINE      = 0x45,\r\n#endif\r\n\tUITYPE_INVALID     = -1,\r\n} unique_base_item;\r\n\r\ntypedef enum item_effect_type {\r\n\tIPL_TOHIT            = 0x0,\r\n\tIPL_TOHIT_CURSE      = 0x1,\r\n\tIPL_DAMP             = 0x2,\r\n\tIPL_DAMP_CURSE       = 0x3,\r\n\tIPL_TOHIT_DAMP       = 0x4,\r\n\tIPL_TOHIT_DAMP_CURSE = 0x5,\r\n\tIPL_ACP              = 0x6,\r\n\tIPL_ACP_CURSE        = 0x7,\r\n\tIPL_FIRERES          = 0x8,\r\n\tIPL_LIGHTRES         = 0x9,\r\n\tIPL_MAGICRES         = 0xA,\r\n\tIPL_ALLRES           = 0xB,\r\n\tIPL_SPLCOST          = 0xC, /* only used in beta */\r\n\tIPL_SPLDUR           = 0xD, /* only used in beta */\r\n\tIPL_SPLLVLADD        = 0xE,\r\n\tIPL_CHARGES          = 0xF,\r\n\tIPL_FIREDAM          = 0x10,\r\n\tIPL_LIGHTDAM         = 0x11,\r\n\tIPL_STR              = 0x13,\r\n\tIPL_STR_CURSE        = 0x14,\r\n\tIPL_MAG              = 0x15,\r\n\tIPL_MAG_CURSE        = 0x16,\r\n\tIPL_DEX              = 0x17,\r\n\tIPL_DEX_CURSE        = 0x18,\r\n\tIPL_VIT              = 0x19,\r\n\tIPL_VIT_CURSE        = 0x1A,\r\n\tIPL_ATTRIBS          = 0x1B,\r\n\tIPL_ATTRIBS_CURSE    = 0x1C,\r\n\tIPL_GETHIT_CURSE     = 0x1D,\r\n\tIPL_GETHIT           = 0x1E,\r\n\tIPL_LIFE             = 0x1F,\r\n\tIPL_LIFE_CURSE       = 0x20,\r\n\tIPL_MANA             = 0x21,\r\n\tIPL_MANA_CURSE       = 0x22,\r\n\tIPL_DUR              = 0x23,\r\n\tIPL_DUR_CURSE        = 0x24,\r\n\tIPL_INDESTRUCTIBLE   = 0x25,\r\n\tIPL_LIGHT            = 0x26,\r\n\tIPL_LIGHT_CURSE      = 0x27,\r\n\tIPL_MULT_ARROWS      = 0x29, /* only used in hellfire */\r\n\tIPL_FIRE_ARROWS      = 0x2A,\r\n\tIPL_LIGHT_ARROWS     = 0x2B,\r\n\tIPL_INVCURS          = 0x2C,\r\n\tIPL_THORNS           = 0x2D,\r\n\tIPL_NOMANA           = 0x2E,\r\n\tIPL_NOHEALPLR        = 0x2F,\r\n\tIPL_FIREBALL         = 0x32, /* only used in hellfire */\r\n\tIPL_ABSHALFTRAP      = 0x34,\r\n\tIPL_KNOCKBACK        = 0x35,\r\n\tIPL_NOHEALMON        = 0x36,\r\n\tIPL_STEALMANA        = 0x37,\r\n\tIPL_STEALLIFE        = 0x38,\r\n\tIPL_TARGAC           = 0x39,\r\n\tIPL_FASTATTACK       = 0x3A,\r\n\tIPL_FASTRECOVER      = 0x3B,\r\n\tIPL_FASTBLOCK        = 0x3C,\r\n\tIPL_DAMMOD           = 0x3D,\r\n\tIPL_RNDARROWVEL      = 0x3E,\r\n\tIPL_SETDAM           = 0x3F,\r\n\tIPL_SETDUR           = 0x40,\r\n\tIPL_NOMINSTR         = 0x41,\r\n\tIPL_SPELL            = 0x42,\r\n\tIPL_FASTSWING        = 0x43,\r\n\tIPL_ONEHAND          = 0x44,\r\n\tIPL_3XDAMVDEM        = 0x45,\r\n\tIPL_ALLRESZERO       = 0x46,\r\n\tIPL_DRAINLIFE        = 0x48,\r\n\tIPL_RNDSTEALLIFE     = 0x49,\r\n\tIPL_INFRAVISION      = 0x4A,\r\n\tIPL_SETAC            = 0x4B,\r\n\tIPL_ADDACLIFE        = 0x4C,\r\n\tIPL_ADDMANAAC        = 0x4D,\r\n\tIPL_FIRERESCLVL      = 0x4E,\r\n\tIPL_AC_CURSE         = 0x4F,\r\n#ifdef HELLFIRE\r\n\tIPL_FIRERES_CURSE    = 0x50,\r\n\tIPL_LIGHTRES_CURSE   = 0x51,\r\n\tIPL_MAGICRES_CURSE   = 0x52,\r\n\tIPL_ALLRES_CURSE     = 0x53,\r\n\tIPL_DEVASTATION      = 0x54,\r\n\tIPL_DECAY            = 0x55,\r\n\tIPL_PERIL            = 0x56,\r\n\tIPL_JESTERS          = 0x57,\r\n\tIPL_CRYSTALLINE      = 0x58,\r\n\tIPL_DOPPELGANGER     = 0x59,\r\n\tIPL_ACDEMON          = 0x5A,\r\n\tIPL_ACUNDEAD         = 0x5B,\r\n\tIPL_MANATOLIFE       = 0x5C,\r\n\tIPL_LIFETOMANA       = 0x5D,\r\n#endif\r\n\tIPL_INVALID          = -1,\r\n} item_effect_type;\r\n\r\ntypedef enum affix_item_type {\r\n\tPLT_MISC  = 0x1,\r\n\tPLT_BOW   = 0x10,\r\n\tPLT_STAFF = 0x100,\r\n\tPLT_WEAP  = 0x1000,\r\n\tPLT_SHLD  = 0x10000,\r\n\tPLT_ARMO  = 0x100000,\r\n} affix_item_type;\r\n\r\n/// Item graphic IDs; frame_num-11 of objcurs.cel.\r\ntypedef enum item_cursor_graphic {\r\n\tICURS_POTION_OF_FULL_MANA         = 0,\r\n\tICURS_SCROLL_OF                   = 1,\r\n\tICURS_GOLD_SMALL                  = 4,\r\n\tICURS_GOLD_MEDIUM                 = 5,\r\n\tICURS_GOLD_LARGE                  = 6,\r\n\tICURS_RING_OF_TRUTH               = 10,\r\n\tICURS_RING                        = 12,\r\n\tICURS_SPECTRAL_ELIXIR             = 15,\r\n\tICURS_GOLDEN_ELIXIR               = 17,\r\n\tICURS_EMPYREAN_BAND               = 18,\r\n\tICURS_EAR_SORCEROR                = 19,\r\n\tICURS_EAR_WARRIOR                 = 20,\r\n\tICURS_EAR_ROGUE                   = 21,\r\n\tICURS_BLOOD_STONE                 = 25,\r\n#ifdef HELLFIRE\r\n\tICURS_OIL                         = 30,\r\n#endif\r\n\tICURS_ELIXIR_OF_VITALITY          = 31,\r\n\tICURS_POTION_OF_HEALING           = 32,\r\n\tICURS_POTION_OF_FULL_REJUVENATION = 33,\r\n\tICURS_ELIXIR_OF_MAGIC             = 34,\r\n\tICURS_POTION_OF_FULL_HEALING      = 35,\r\n\tICURS_ELIXIR_OF_DEXTERITY         = 36,\r\n\tICURS_POTION_OF_REJUVENATION      = 37,\r\n\tICURS_ELIXIR_OF_STRENGTH          = 38,\r\n\tICURS_POTION_OF_MANA              = 39,\r\n\tICURS_BRAIN                       = 40,\r\n\tICURS_OPTIC_AMULET                = 44,\r\n\tICURS_AMULET                      = 45,\r\n\tICURS_DAGGER                      = 51,\r\n\tICURS_BLADE                       = 56,\r\n\tICURS_BASTARD_SWORD               = 57,\r\n\tICURS_MACE                        = 59,\r\n\tICURS_LONG_SWORD                  = 60,\r\n\tICURS_BROAD_SWORD                 = 61,\r\n\tICURS_FALCHION                    = 62,\r\n\tICURS_MORNING_STAR                = 63,\r\n\tICURS_SHORT_SWORD                 = 64,\r\n\tICURS_CLAYMORE                    = 65,\r\n\tICURS_CLUB                        = 66,\r\n\tICURS_SABRE                       = 67,\r\n\tICURS_SPIKED_CLUB                 = 70,\r\n\tICURS_SCIMITAR                    = 72,\r\n\tICURS_FULL_HELM                   = 75,\r\n\tICURS_MAGIC_ROCK                  = 76,\r\n\tICURS_THE_UNDEAD_CROWN            = 78,\r\n\tICURS_HELM                        = 82,\r\n\tICURS_BUCKLER                     = 83,\r\n\tICURS_VIEL_OF_STEEL               = 85,\r\n\tICURS_BOOK_GREY                   = 86,\r\n\tICURS_BOOK_RED                    = 87,\r\n\tICURS_BOOK_BLUE                   = 88,\r\n\tICURS_BLACK_MUSHROOM              = 89,\r\n\tICURS_SKULL_CAP                   = 90,\r\n\tICURS_CAP                         = 91,\r\n\tICURS_HARLEQUIN_CREST             = 93,\r\n\tICURS_CROWN                       = 95,\r\n\tICURS_MAP_OF_THE_STARS            = 96,\r\n\tICURS_FUNGAL_TOME                 = 97,\r\n\tICURS_GREAT_HELM                  = 98,\r\n\tICURS_BATTLE_AXE                  = 101,\r\n\tICURS_HUNTERS_BOW                 = 102,\r\n\tICURS_FIELD_PLATE                 = 103,\r\n\tICURS_SMALL_SHIELD                = 105,\r\n\tICURS_CLEAVER                     = 106,\r\n\tICURS_STUDDED_LEATHER_ARMOR       = 107,\r\n\tICURS_SHORT_STAFF                 = 109,\r\n\tICURS_TWO_HANDED_SWORD            = 110,\r\n\tICURS_CHAIN_MAIL                  = 111,\r\n\tICURS_SMALL_AXE                   = 112,\r\n\tICURS_KITE_SHIELD                 = 113,\r\n\tICURS_SCALE_MAIL                  = 114,\r\n\tICURS_SHORT_BOW                   = 118,\r\n\tICURS_LONG_WAR_BOW                = 119,\r\n\tICURS_WAR_HAMMER                  = 121,\r\n\tICURS_MAUL                        = 122,\r\n\tICURS_LONG_STAFF                  = 123,\r\n\tICURS_WAR_STAFF                   = 124,\r\n\tICURS_TAVERN_SIGN                 = 126,\r\n\tICURS_HARD_LEATHER_ARMOR          = 127,\r\n\tICURS_RAGS                        = 128,\r\n\tICURS_QUILTED_ARMOR               = 129,\r\n\tICURS_FLAIL                       = 131,\r\n\tICURS_TOWER_SHIELD                = 132,\r\n\tICURS_COMPOSITE_BOW               = 133,\r\n\tICURS_GREAT_SWORD                 = 134,\r\n\tICURS_LEATHER_ARMOR               = 135,\r\n\tICURS_SPLINT_MAIL                 = 136,\r\n\tICURS_ROBE                        = 137,\r\n\tICURS_ANVIL_OF_FURY               = 140,\r\n\tICURS_BROAD_AXE                   = 141,\r\n\tICURS_LARGE_AXE                   = 142,\r\n\tICURS_GREAT_AXE                   = 143,\r\n\tICURS_AXE                         = 144,\r\n\tICURS_LARGE_SHIELD                = 147,\r\n\tICURS_GOTHIC_SHIELD               = 148,\r\n\tICURS_CLOAK                       = 149,\r\n\tICURS_CAPE                        = 150,\r\n\tICURS_FULL_PLATE_MAIL             = 151,\r\n\tICURS_GOTHIC_PLATE                = 152,\r\n\tICURS_BREAST_PLATE                = 153,\r\n\tICURS_RING_MAIL                   = 154,\r\n\tICURS_STAFF_OF_LAZARUS            = 155,\r\n\tICURS_ARKAINES_VALOR              = 157,\r\n\tICURS_SHORT_WAR_BOW               = 165,\r\n\tICURS_COMPOSITE_STAFF             = 166,\r\n\tICURS_SHORT_BATTLE_BOW            = 167,\r\n\tICURS_GOLD                        = 168,\r\n#ifdef HELLFIRE\r\n\tICURS_AURIC_AMULET                = 180,\r\n\tICURS_RUNE_BOMB                   = 187,\r\n\tICURS_THEODORE                    = 188,\r\n\tICURS_TORN_NOTE_1                 = 189,\r\n\tICURS_TORN_NOTE_2                 = 190,\r\n\tICURS_TORN_NOTE_3                 = 191,\r\n\tICURS_RECONSTRUCTED_NOTE          = 192,\r\n\tICURS_RUNE_OF_FIRE                = 193,\r\n\tICURS_GREATER_RUNE_OF_FIRE        = 194,\r\n\tICURS_RUNE_OF_LIGHTNING           = 195,\r\n\tICURS_GREATER_RUNE_OF_LIGHTNING   = 196,\r\n\tICURS_RUNE_OF_STONE               = 197,\r\n\tICURS_GREY_SUIT                   = 198,\r\n\tICURS_BROWN_SUIT                  = 199,\r\n\tICURS_BOVINE                      = 226,\r\n#endif\r\n} item_cursor_graphic;\r\n\r\ntypedef enum _sfx_id {\r\n\tPS_WALK1,\r\n\tPS_WALK2,\r\n\tPS_WALK3,\r\n\tPS_WALK4,\r\n\tPS_BFIRE,\r\n\tPS_FMAG,\r\n\tPS_TMAG,\r\n\tPS_LGHIT,\r\n\tPS_LGHIT1,\r\n\tPS_SWING,\r\n\tPS_SWING2,\r\n\tPS_DEAD,\r\n#ifdef HELLFIRE\r\n\tIS_STING1,\r\n\tIS_FBALLBOW,\r\n#endif\r\n\tIS_QUESTDN,\r\n\tIS_ARMRFKD,\r\n\tIS_BARLFIRE,\r\n\tIS_BARREL,\r\n#ifdef HELLFIRE\r\n\tIS_POPPOP8,\r\n\tIS_POPPOP5,\r\n\tIS_POPPOP3,\r\n\tIS_POPPOP2,\r\n#endif\r\n\tIS_BHIT,\r\n\tIS_BHIT1,\r\n\tIS_CHEST,\r\n\tIS_DOORCLOS,\r\n\tIS_DOOROPEN,\r\n\tIS_FANVL,\r\n\tIS_FAXE,\r\n\tIS_FBLST,\r\n\tIS_FBODY,\r\n\tIS_FBOOK,\r\n\tIS_FBOW,\r\n\tIS_FCAP,\r\n\tIS_FHARM,\r\n\tIS_FLARM,\r\n\tIS_FMAG,\r\n\tIS_FMAG1,\r\n\tIS_FMUSH,\r\n\tIS_FPOT,\r\n\tIS_FRING,\r\n\tIS_FROCK,\r\n\tIS_FSCRL,\r\n\tIS_FSHLD,\r\n\tIS_FSIGN,\r\n\tIS_FSTAF,\r\n\tIS_FSWOR,\r\n\tIS_GOLD,\r\n\tIS_HLMTFKD,\r\n\tIS_IANVL,\r\n\tIS_IAXE,\r\n\tIS_IBLST,\r\n\tIS_IBODY,\r\n\tIS_IBOOK,\r\n\tIS_IBOW,\r\n\tIS_ICAP,\r\n\tIS_IGRAB,\r\n\tIS_IHARM,\r\n\tIS_ILARM,\r\n\tIS_IMUSH,\r\n\tIS_IPOT,\r\n\tIS_IRING,\r\n\tIS_IROCK,\r\n\tIS_ISCROL,\r\n\tIS_ISHIEL,\r\n\tIS_ISIGN,\r\n\tIS_ISTAF,\r\n\tIS_ISWORD,\r\n\tIS_LEVER,\r\n\tIS_MAGIC,\r\n\tIS_MAGIC1,\r\n\tIS_RBOOK,\r\n\tIS_SARC,\r\n\tIS_SHLDFKD,\r\n\tIS_SWRDFKD,\r\n\tIS_TITLEMOV,\r\n\tIS_TITLSLCT,\r\n\tSFX_SILENCE,\r\n\tIS_TRAP,\r\n\tIS_CAST1,\r\n\tIS_CAST10,\r\n\tIS_CAST12,\r\n\tIS_CAST2,\r\n\tIS_CAST3,\r\n\tIS_CAST4,\r\n\tIS_CAST5,\r\n\tIS_CAST6,\r\n\tIS_CAST7,\r\n\tIS_CAST8,\r\n\tIS_CAST9,\r\n\tLS_HEALING,\r\n\tIS_REPAIR,\r\n\tLS_ACID,\r\n\tLS_ACIDS,\r\n\tLS_APOC,\r\n\tLS_ARROWALL,\r\n\tLS_BLODBOIL,\r\n\tLS_BLODSTAR,\r\n\tLS_BLSIMPT,\r\n\tLS_BONESP,\r\n\tLS_BSIMPCT,\r\n\tLS_CALDRON,\r\n\tLS_CBOLT,\r\n\tLS_CHLTNING,\r\n\tLS_DSERP,\r\n\tLS_ELECIMP1,\r\n\tLS_ELEMENTL,\r\n\tLS_ETHEREAL,\r\n\tLS_FBALL,\r\n\tLS_FBOLT1,\r\n\tLS_FBOLT2,\r\n\tLS_FIRIMP1,\r\n\tLS_FIRIMP2,\r\n\tLS_FLAMWAVE,\r\n\tLS_FLASH,\r\n\tLS_FOUNTAIN,\r\n\tLS_GOLUM,\r\n\tLS_GOLUMDED,\r\n\tLS_GSHRINE,\r\n\tLS_GUARD,\r\n\tLS_GUARDLAN,\r\n\tLS_HOLYBOLT,\r\n\tLS_HYPER,\r\n\tLS_INFRAVIS,\r\n\tLS_INVISIBL,\r\n\tLS_INVPOT,\r\n\tLS_LNING1,\r\n\tLS_LTNING,\r\n\tLS_MSHIELD,\r\n#ifdef HELLFIRE\r\n\tLS_NESTXPLD,\r\n#endif\r\n\tLS_NOVA,\r\n\tLS_PORTAL,\r\n\tLS_PUDDLE,\r\n\tLS_RESUR,\r\n\tLS_SCURSE,\r\n\tLS_SCURIMP,\r\n\tLS_SENTINEL,\r\n\tLS_SHATTER,\r\n\tLS_SOULFIRE,\r\n\tLS_SPOUTLOP,\r\n\tLS_SPOUTSTR,\r\n\tLS_STORM,\r\n\tLS_TRAPDIS,\r\n\tLS_TELEPORT,\r\n\tLS_VTHEFT,\r\n\tLS_WALLLOOP,\r\n\tLS_WALLSTRT,\r\n#ifdef HELLFIRE\r\n\tLS_LMAG,\r\n#endif\r\n#ifndef SPAWN\r\n\tTSFX_BMAID1,\r\n\tTSFX_BMAID2,\r\n\tTSFX_BMAID3,\r\n\tTSFX_BMAID4,\r\n\tTSFX_BMAID5,\r\n\tTSFX_BMAID6,\r\n\tTSFX_BMAID7,\r\n\tTSFX_BMAID8,\r\n\tTSFX_BMAID9,\r\n\tTSFX_BMAID10,\r\n\tTSFX_BMAID11,\r\n\tTSFX_BMAID12,\r\n\tTSFX_BMAID13,\r\n\tTSFX_BMAID14,\r\n\tTSFX_BMAID15,\r\n\tTSFX_BMAID16,\r\n\tTSFX_BMAID17,\r\n\tTSFX_BMAID18,\r\n\tTSFX_BMAID19,\r\n\tTSFX_BMAID20,\r\n\tTSFX_BMAID21,\r\n\tTSFX_BMAID22,\r\n\tTSFX_BMAID23,\r\n\tTSFX_BMAID24,\r\n\tTSFX_BMAID25,\r\n\tTSFX_BMAID26,\r\n\tTSFX_BMAID27,\r\n\tTSFX_BMAID28,\r\n\tTSFX_BMAID29,\r\n\tTSFX_BMAID30,\r\n#endif\r\n\tTSFX_BMAID31,\r\n#ifndef SPAWN\r\n\tTSFX_BMAID32,\r\n\tTSFX_BMAID33,\r\n\tTSFX_BMAID34,\r\n\tTSFX_BMAID35,\r\n\tTSFX_BMAID36,\r\n\tTSFX_BMAID37,\r\n\tTSFX_BMAID38,\r\n\tTSFX_BMAID39,\r\n\tTSFX_BMAID40,\r\n\tTSFX_SMITH1,\r\n\tTSFX_SMITH2,\r\n\tTSFX_SMITH3,\r\n\tTSFX_SMITH4,\r\n\tTSFX_SMITH5,\r\n\tTSFX_SMITH6,\r\n\tTSFX_SMITH7,\r\n\tTSFX_SMITH8,\r\n\tTSFX_SMITH9,\r\n\tTSFX_SMITH10,\r\n\tTSFX_SMITH11,\r\n\tTSFX_SMITH12,\r\n\tTSFX_SMITH13,\r\n\tTSFX_SMITH14,\r\n\tTSFX_SMITH15,\r\n\tTSFX_SMITH16,\r\n\tTSFX_SMITH17,\r\n\tTSFX_SMITH18,\r\n\tTSFX_SMITH19,\r\n\tTSFX_SMITH20,\r\n\tTSFX_SMITH21,\r\n\tTSFX_SMITH22,\r\n\tTSFX_SMITH23,\r\n\tTSFX_SMITH24,\r\n\tTSFX_SMITH25,\r\n\tTSFX_SMITH26,\r\n\tTSFX_SMITH27,\r\n\tTSFX_SMITH28,\r\n\tTSFX_SMITH29,\r\n\tTSFX_SMITH30,\r\n\tTSFX_SMITH31,\r\n\tTSFX_SMITH32,\r\n\tTSFX_SMITH33,\r\n\tTSFX_SMITH34,\r\n\tTSFX_SMITH35,\r\n\tTSFX_SMITH36,\r\n\tTSFX_SMITH37,\r\n\tTSFX_SMITH38,\r\n\tTSFX_SMITH39,\r\n\tTSFX_SMITH40,\r\n\tTSFX_SMITH41,\r\n\tTSFX_SMITH42,\r\n\tTSFX_SMITH43,\r\n#endif\r\n\tTSFX_SMITH44,\r\n#ifndef SPAWN\r\n\tTSFX_SMITH45,\r\n\tTSFX_SMITH46,\r\n\tTSFX_SMITH47,\r\n\tTSFX_SMITH48,\r\n\tTSFX_SMITH49,\r\n\tTSFX_SMITH50,\r\n\tTSFX_SMITH51,\r\n\tTSFX_SMITH52,\r\n\tTSFX_SMITH53,\r\n\tTSFX_SMITH54,\r\n\tTSFX_SMITH55,\r\n\tTSFX_SMITH56,\r\n#endif\r\n\tTSFX_COW1,\r\n\tTSFX_COW2,\r\n#ifdef HELLFIRE\r\n\tTSFX_COW7,\r\n\tTSFX_COW8,\r\n#endif\r\n#ifndef SPAWN\r\n\tTSFX_DEADGUY,\r\n\tTSFX_DRUNK1,\r\n\tTSFX_DRUNK2,\r\n\tTSFX_DRUNK3,\r\n\tTSFX_DRUNK4,\r\n\tTSFX_DRUNK5,\r\n\tTSFX_DRUNK6,\r\n\tTSFX_DRUNK7,\r\n\tTSFX_DRUNK8,\r\n\tTSFX_DRUNK9,\r\n\tTSFX_DRUNK10,\r\n\tTSFX_DRUNK11,\r\n\tTSFX_DRUNK12,\r\n\tTSFX_DRUNK13,\r\n\tTSFX_DRUNK14,\r\n\tTSFX_DRUNK15,\r\n\tTSFX_DRUNK16,\r\n\tTSFX_DRUNK17,\r\n\tTSFX_DRUNK18,\r\n\tTSFX_DRUNK19,\r\n\tTSFX_DRUNK20,\r\n\tTSFX_DRUNK21,\r\n\tTSFX_DRUNK22,\r\n\tTSFX_DRUNK23,\r\n\tTSFX_DRUNK24,\r\n\tTSFX_DRUNK25,\r\n\tTSFX_DRUNK26,\r\n#endif\r\n\tTSFX_DRUNK27,\r\n#ifndef SPAWN\r\n\tTSFX_DRUNK28,\r\n\tTSFX_DRUNK29,\r\n\tTSFX_DRUNK30,\r\n\tTSFX_DRUNK31,\r\n\tTSFX_DRUNK32,\r\n\tTSFX_DRUNK33,\r\n\tTSFX_DRUNK34,\r\n\tTSFX_DRUNK35,\r\n\tTSFX_HEALER1,\r\n\tTSFX_HEALER2,\r\n\tTSFX_HEALER3,\r\n\tTSFX_HEALER4,\r\n\tTSFX_HEALER5,\r\n\tTSFX_HEALER6,\r\n\tTSFX_HEALER7,\r\n\tTSFX_HEALER8,\r\n\tTSFX_HEALER9,\r\n\tTSFX_HEALER10,\r\n\tTSFX_HEALER11,\r\n\tTSFX_HEALER12,\r\n\tTSFX_HEALER13,\r\n\tTSFX_HEALER14,\r\n\tTSFX_HEALER15,\r\n\tTSFX_HEALER16,\r\n\tTSFX_HEALER17,\r\n\tTSFX_HEALER18,\r\n\tTSFX_HEALER19,\r\n\tTSFX_HEALER20,\r\n\tTSFX_HEALER21,\r\n\tTSFX_HEALER22,\r\n\tTSFX_HEALER23,\r\n\tTSFX_HEALER24,\r\n\tTSFX_HEALER25,\r\n\tTSFX_HEALER26,\r\n\tTSFX_HEALER27,\r\n\tTSFX_HEALER28,\r\n\tTSFX_HEALER29,\r\n\tTSFX_HEALER30,\r\n\tTSFX_HEALER31,\r\n\tTSFX_HEALER32,\r\n\tTSFX_HEALER33,\r\n\tTSFX_HEALER34,\r\n\tTSFX_HEALER35,\r\n\tTSFX_HEALER36,\r\n#endif\r\n\tTSFX_HEALER37,\r\n#ifndef SPAWN\r\n\tTSFX_HEALER38,\r\n\tTSFX_HEALER39,\r\n\tTSFX_HEALER40,\r\n\tTSFX_HEALER41,\r\n\tTSFX_HEALER42,\r\n\tTSFX_HEALER43,\r\n\tTSFX_HEALER44,\r\n\tTSFX_HEALER45,\r\n\tTSFX_HEALER46,\r\n\tTSFX_HEALER47,\r\n\tTSFX_PEGBOY1,\r\n\tTSFX_PEGBOY2,\r\n\tTSFX_PEGBOY3,\r\n\tTSFX_PEGBOY4,\r\n\tTSFX_PEGBOY5,\r\n\tTSFX_PEGBOY6,\r\n\tTSFX_PEGBOY7,\r\n\tTSFX_PEGBOY8,\r\n\tTSFX_PEGBOY9,\r\n\tTSFX_PEGBOY10,\r\n\tTSFX_PEGBOY11,\r\n\tTSFX_PEGBOY12,\r\n\tTSFX_PEGBOY13,\r\n\tTSFX_PEGBOY14,\r\n\tTSFX_PEGBOY15,\r\n\tTSFX_PEGBOY16,\r\n\tTSFX_PEGBOY17,\r\n\tTSFX_PEGBOY18,\r\n\tTSFX_PEGBOY19,\r\n\tTSFX_PEGBOY20,\r\n\tTSFX_PEGBOY21,\r\n\tTSFX_PEGBOY22,\r\n\tTSFX_PEGBOY23,\r\n\tTSFX_PEGBOY24,\r\n\tTSFX_PEGBOY25,\r\n\tTSFX_PEGBOY26,\r\n\tTSFX_PEGBOY27,\r\n\tTSFX_PEGBOY28,\r\n\tTSFX_PEGBOY29,\r\n\tTSFX_PEGBOY30,\r\n\tTSFX_PEGBOY31,\r\n#endif\r\n\tTSFX_PEGBOY32,\r\n#ifndef SPAWN\r\n\tTSFX_PEGBOY33,\r\n\tTSFX_PEGBOY34,\r\n\tTSFX_PEGBOY35,\r\n\tTSFX_PEGBOY36,\r\n\tTSFX_PEGBOY37,\r\n\tTSFX_PEGBOY38,\r\n\tTSFX_PEGBOY39,\r\n\tTSFX_PEGBOY40,\r\n\tTSFX_PEGBOY41,\r\n\tTSFX_PEGBOY42,\r\n\tTSFX_PEGBOY43,\r\n\tTSFX_PRIEST0,\r\n\tTSFX_PRIEST1,\r\n\tTSFX_PRIEST2,\r\n\tTSFX_PRIEST3,\r\n\tTSFX_PRIEST4,\r\n\tTSFX_PRIEST5,\r\n\tTSFX_PRIEST6,\r\n\tTSFX_PRIEST7,\r\n\tTSFX_STORY0,\r\n\tTSFX_STORY1,\r\n\tTSFX_STORY2,\r\n\tTSFX_STORY3,\r\n\tTSFX_STORY4,\r\n\tTSFX_STORY5,\r\n\tTSFX_STORY6,\r\n\tTSFX_STORY7,\r\n\tTSFX_STORY8,\r\n\tTSFX_STORY9,\r\n\tTSFX_STORY10,\r\n\tTSFX_STORY11,\r\n\tTSFX_STORY12,\r\n\tTSFX_STORY13,\r\n\tTSFX_STORY14,\r\n\tTSFX_STORY15,\r\n\tTSFX_STORY16,\r\n\tTSFX_STORY17,\r\n\tTSFX_STORY18,\r\n\tTSFX_STORY19,\r\n\tTSFX_STORY20,\r\n\tTSFX_STORY21,\r\n\tTSFX_STORY22,\r\n\tTSFX_STORY23,\r\n\tTSFX_STORY24,\r\n#endif\r\n\tTSFX_STORY25,\r\n#ifndef SPAWN\r\n\tTSFX_STORY26,\r\n\tTSFX_STORY27,\r\n\tTSFX_STORY28,\r\n\tTSFX_STORY29,\r\n\tTSFX_STORY30,\r\n\tTSFX_STORY31,\r\n\tTSFX_STORY32,\r\n\tTSFX_STORY33,\r\n\tTSFX_STORY34,\r\n\tTSFX_STORY35,\r\n\tTSFX_STORY36,\r\n\tTSFX_STORY37,\r\n\tTSFX_STORY38,\r\n#endif\r\n\tTSFX_TAVERN0,\r\n#ifndef SPAWN\r\n\tTSFX_TAVERN1,\r\n\tTSFX_TAVERN2,\r\n\tTSFX_TAVERN3,\r\n\tTSFX_TAVERN4,\r\n\tTSFX_TAVERN5,\r\n\tTSFX_TAVERN6,\r\n\tTSFX_TAVERN7,\r\n\tTSFX_TAVERN8,\r\n\tTSFX_TAVERN9,\r\n\tTSFX_TAVERN10,\r\n\tTSFX_TAVERN11,\r\n\tTSFX_TAVERN12,\r\n\tTSFX_TAVERN13,\r\n\tTSFX_TAVERN14,\r\n\tTSFX_TAVERN15,\r\n\tTSFX_TAVERN16,\r\n\tTSFX_TAVERN17,\r\n\tTSFX_TAVERN18,\r\n\tTSFX_TAVERN19,\r\n\tTSFX_TAVERN20,\r\n\tTSFX_TAVERN21,\r\n\tTSFX_TAVERN22,\r\n\tTSFX_TAVERN23,\r\n\tTSFX_TAVERN24,\r\n\tTSFX_TAVERN25,\r\n\tTSFX_TAVERN26,\r\n\tTSFX_TAVERN27,\r\n\tTSFX_TAVERN28,\r\n\tTSFX_TAVERN29,\r\n\tTSFX_TAVERN30,\r\n\tTSFX_TAVERN31,\r\n\tTSFX_TAVERN32,\r\n\tTSFX_TAVERN33,\r\n\tTSFX_TAVERN34,\r\n\tTSFX_TAVERN35,\r\n#endif\r\n\tTSFX_TAVERN36,\r\n#ifndef SPAWN\r\n\tTSFX_TAVERN37,\r\n\tTSFX_TAVERN38,\r\n\tTSFX_TAVERN39,\r\n\tTSFX_TAVERN40,\r\n\tTSFX_TAVERN41,\r\n\tTSFX_TAVERN42,\r\n\tTSFX_TAVERN43,\r\n\tTSFX_TAVERN44,\r\n\tTSFX_TAVERN45,\r\n\tTSFX_WITCH1,\r\n\tTSFX_WITCH2,\r\n\tTSFX_WITCH3,\r\n\tTSFX_WITCH4,\r\n\tTSFX_WITCH5,\r\n\tTSFX_WITCH6,\r\n\tTSFX_WITCH7,\r\n\tTSFX_WITCH8,\r\n\tTSFX_WITCH9,\r\n\tTSFX_WITCH10,\r\n\tTSFX_WITCH11,\r\n\tTSFX_WITCH12,\r\n\tTSFX_WITCH13,\r\n\tTSFX_WITCH14,\r\n\tTSFX_WITCH15,\r\n\tTSFX_WITCH16,\r\n\tTSFX_WITCH17,\r\n\tTSFX_WITCH18,\r\n\tTSFX_WITCH19,\r\n\tTSFX_WITCH20,\r\n\tTSFX_WITCH21,\r\n\tTSFX_WITCH22,\r\n\tTSFX_WITCH23,\r\n\tTSFX_WITCH24,\r\n\tTSFX_WITCH25,\r\n\tTSFX_WITCH26,\r\n\tTSFX_WITCH27,\r\n\tTSFX_WITCH28,\r\n\tTSFX_WITCH29,\r\n\tTSFX_WITCH30,\r\n\tTSFX_WITCH31,\r\n\tTSFX_WITCH32,\r\n\tTSFX_WITCH33,\r\n\tTSFX_WITCH34,\r\n\tTSFX_WITCH35,\r\n\tTSFX_WITCH36,\r\n\tTSFX_WITCH37,\r\n#endif\r\n\tTSFX_WITCH38,\r\n#ifndef SPAWN\r\n\tTSFX_WITCH39,\r\n\tTSFX_WITCH40,\r\n\tTSFX_WITCH41,\r\n\tTSFX_WITCH42,\r\n\tTSFX_WITCH43,\r\n\tTSFX_WITCH44,\r\n\tTSFX_WITCH45,\r\n\tTSFX_WITCH46,\r\n\tTSFX_WITCH47,\r\n\tTSFX_WITCH48,\r\n\tTSFX_WITCH49,\r\n\tTSFX_WITCH50,\r\n\tTSFX_WOUND,\r\n\tPS_MAGE1,\r\n\tPS_MAGE2,\r\n\tPS_MAGE3,\r\n\tPS_MAGE4,\r\n\tPS_MAGE5,\r\n\tPS_MAGE6,\r\n\tPS_MAGE7,\r\n\tPS_MAGE8,\r\n\tPS_MAGE9,\r\n\tPS_MAGE10,\r\n\tPS_MAGE11,\r\n\tPS_MAGE12,\r\n\tPS_MAGE13,\r\n\tPS_MAGE14,\r\n\tPS_MAGE15,\r\n\tPS_MAGE16,\r\n\tPS_MAGE17,\r\n\tPS_MAGE18,\r\n\tPS_MAGE19,\r\n\tPS_MAGE20,\r\n\tPS_MAGE21,\r\n\tPS_MAGE22,\r\n\tPS_MAGE23,\r\n\tPS_MAGE24,\r\n\tPS_MAGE25,\r\n\tPS_MAGE26,\r\n\tPS_MAGE27,\r\n\tPS_MAGE28,\r\n\tPS_MAGE29,\r\n\tPS_MAGE30,\r\n\tPS_MAGE31,\r\n\tPS_MAGE32,\r\n\tPS_MAGE33,\r\n\tPS_MAGE34,\r\n\tPS_MAGE35,\r\n\tPS_MAGE36,\r\n\tPS_MAGE37,\r\n\tPS_MAGE38,\r\n\tPS_MAGE39,\r\n\tPS_MAGE40,\r\n\tPS_MAGE41,\r\n\tPS_MAGE42,\r\n\tPS_MAGE43,\r\n\tPS_MAGE44,\r\n\tPS_MAGE45,\r\n\tPS_MAGE46,\r\n\tPS_MAGE47,\r\n\tPS_MAGE48,\r\n\tPS_MAGE49,\r\n\tPS_MAGE50,\r\n\tPS_MAGE51,\r\n\tPS_MAGE52,\r\n\tPS_MAGE53,\r\n\tPS_MAGE54,\r\n\tPS_MAGE55,\r\n\tPS_MAGE56,\r\n\tPS_MAGE57,\r\n\tPS_MAGE58,\r\n\tPS_MAGE59,\r\n\tPS_MAGE60,\r\n\tPS_MAGE61,\r\n\tPS_MAGE62,\r\n\tPS_MAGE63,\r\n\tPS_MAGE64,\r\n\tPS_MAGE65,\r\n\tPS_MAGE66,\r\n\tPS_MAGE67,\r\n\tPS_MAGE68,\r\n\tPS_MAGE69,\r\n\tPS_MAGE69B,\r\n\tPS_MAGE70,\r\n\tPS_MAGE71,\r\n\tPS_MAGE72,\r\n\tPS_MAGE73,\r\n\tPS_MAGE74,\r\n\tPS_MAGE75,\r\n\tPS_MAGE76,\r\n\tPS_MAGE77,\r\n\tPS_MAGE78,\r\n\tPS_MAGE79,\r\n\tPS_MAGE80,\r\n\tPS_MAGE81,\r\n\tPS_MAGE82,\r\n\tPS_MAGE83,\r\n\tPS_MAGE84,\r\n\tPS_MAGE85,\r\n\tPS_MAGE86,\r\n\tPS_MAGE87,\r\n\tPS_MAGE88,\r\n\tPS_MAGE89,\r\n\tPS_MAGE90,\r\n\tPS_MAGE91,\r\n\tPS_MAGE92,\r\n\tPS_MAGE93,\r\n\tPS_MAGE94,\r\n\tPS_MAGE95,\r\n\tPS_MAGE96,\r\n\tPS_MAGE97,\r\n\tPS_MAGE98,\r\n\tPS_MAGE99,\r\n\tPS_MAGE100,\r\n\tPS_MAGE101,\r\n\tPS_MAGE102,\r\n\tPS_ROGUE1,\r\n\tPS_ROGUE2,\r\n\tPS_ROGUE3,\r\n\tPS_ROGUE4,\r\n\tPS_ROGUE5,\r\n\tPS_ROGUE6,\r\n\tPS_ROGUE7,\r\n\tPS_ROGUE8,\r\n\tPS_ROGUE9,\r\n\tPS_ROGUE10,\r\n\tPS_ROGUE11,\r\n\tPS_ROGUE12,\r\n\tPS_ROGUE13,\r\n\tPS_ROGUE14,\r\n\tPS_ROGUE15,\r\n\tPS_ROGUE16,\r\n\tPS_ROGUE17,\r\n\tPS_ROGUE18,\r\n\tPS_ROGUE19,\r\n\tPS_ROGUE20,\r\n\tPS_ROGUE21,\r\n\tPS_ROGUE22,\r\n\tPS_ROGUE23,\r\n\tPS_ROGUE24,\r\n\tPS_ROGUE25,\r\n\tPS_ROGUE26,\r\n\tPS_ROGUE27,\r\n\tPS_ROGUE28,\r\n\tPS_ROGUE29,\r\n\tPS_ROGUE30,\r\n\tPS_ROGUE31,\r\n\tPS_ROGUE32,\r\n\tPS_ROGUE33,\r\n\tPS_ROGUE34,\r\n\tPS_ROGUE35,\r\n\tPS_ROGUE36,\r\n\tPS_ROGUE37,\r\n\tPS_ROGUE38,\r\n\tPS_ROGUE39,\r\n\tPS_ROGUE40,\r\n\tPS_ROGUE41,\r\n\tPS_ROGUE42,\r\n\tPS_ROGUE43,\r\n\tPS_ROGUE44,\r\n\tPS_ROGUE45,\r\n\tPS_ROGUE46,\r\n\tPS_ROGUE47,\r\n\tPS_ROGUE48,\r\n\tPS_ROGUE49,\r\n\tPS_ROGUE50,\r\n\tPS_ROGUE51,\r\n\tPS_ROGUE52,\r\n\tPS_ROGUE53,\r\n\tPS_ROGUE54,\r\n\tPS_ROGUE55,\r\n\tPS_ROGUE56,\r\n\tPS_ROGUE57,\r\n\tPS_ROGUE58,\r\n\tPS_ROGUE59,\r\n\tPS_ROGUE60,\r\n\tPS_ROGUE61,\r\n\tPS_ROGUE62,\r\n\tPS_ROGUE63,\r\n\tPS_ROGUE64,\r\n\tPS_ROGUE65,\r\n\tPS_ROGUE66,\r\n\tPS_ROGUE67,\r\n\tPS_ROGUE68,\r\n\tPS_ROGUE69,\r\n\tPS_ROGUE69B,\r\n\tPS_ROGUE70,\r\n\tPS_ROGUE71,\r\n\tPS_ROGUE72,\r\n\tPS_ROGUE73,\r\n\tPS_ROGUE74,\r\n\tPS_ROGUE75,\r\n\tPS_ROGUE76,\r\n\tPS_ROGUE77,\r\n\tPS_ROGUE78,\r\n\tPS_ROGUE79,\r\n\tPS_ROGUE80,\r\n\tPS_ROGUE81,\r\n\tPS_ROGUE82,\r\n\tPS_ROGUE83,\r\n\tPS_ROGUE84,\r\n\tPS_ROGUE85,\r\n\tPS_ROGUE86,\r\n\tPS_ROGUE87,\r\n\tPS_ROGUE88,\r\n\tPS_ROGUE89,\r\n\tPS_ROGUE90,\r\n\tPS_ROGUE91,\r\n\tPS_ROGUE92,\r\n\tPS_ROGUE93,\r\n\tPS_ROGUE94,\r\n\tPS_ROGUE95,\r\n\tPS_ROGUE96,\r\n\tPS_ROGUE97,\r\n\tPS_ROGUE98,\r\n\tPS_ROGUE99,\r\n\tPS_ROGUE100,\r\n\tPS_ROGUE101,\r\n\tPS_ROGUE102,\r\n\tPS_WARR1,\r\n\tPS_WARR2,\r\n\tPS_WARR3,\r\n\tPS_WARR4,\r\n\tPS_WARR5,\r\n\tPS_WARR6,\r\n\tPS_WARR7,\r\n\tPS_WARR8,\r\n\tPS_WARR9,\r\n\tPS_WARR10,\r\n\tPS_WARR11,\r\n\tPS_WARR12,\r\n#endif\r\n\tPS_WARR13,\r\n\tPS_WARR14,\r\n\tPS_WARR14B,\r\n\tPS_WARR14C,\r\n\tPS_WARR15,\r\n\tPS_WARR15B,\r\n\tPS_WARR15C,\r\n\tPS_WARR16,\r\n\tPS_WARR16B,\r\n\tPS_WARR16C,\r\n\tPS_WARR17,\r\n\tPS_WARR18,\r\n\tPS_WARR19,\r\n\tPS_WARR20,\r\n\tPS_WARR21,\r\n\tPS_WARR22,\r\n\tPS_WARR23,\r\n\tPS_WARR24,\r\n\tPS_WARR25,\r\n\tPS_WARR26,\r\n\tPS_WARR27,\r\n\tPS_WARR28,\r\n\tPS_WARR29,\r\n\tPS_WARR30,\r\n\tPS_WARR31,\r\n\tPS_WARR32,\r\n\tPS_WARR33,\r\n\tPS_WARR34,\r\n\tPS_WARR35,\r\n\tPS_WARR36,\r\n\tPS_WARR37,\r\n\tPS_WARR38,\r\n\tPS_WARR39,\r\n\tPS_WARR40,\r\n\tPS_WARR41,\r\n\tPS_WARR42,\r\n\tPS_WARR43,\r\n\tPS_WARR44,\r\n\tPS_WARR45,\r\n\tPS_WARR46,\r\n\tPS_WARR47,\r\n\tPS_WARR48,\r\n\tPS_WARR49,\r\n\tPS_WARR50,\r\n\tPS_WARR51,\r\n\tPS_WARR52,\r\n\tPS_WARR53,\r\n\tPS_WARR54,\r\n\tPS_WARR55,\r\n\tPS_WARR56,\r\n\tPS_WARR57,\r\n\tPS_WARR58,\r\n\tPS_WARR59,\r\n\tPS_WARR60,\r\n\tPS_WARR61,\r\n\tPS_WARR62,\r\n\tPS_WARR63,\r\n\tPS_WARR64,\r\n\tPS_WARR65,\r\n\tPS_WARR66,\r\n\tPS_WARR67,\r\n\tPS_WARR68,\r\n\tPS_WARR69,\r\n\tPS_WARR69B,\r\n\tPS_WARR70,\r\n\tPS_WARR71,\r\n\tPS_WARR72,\r\n\tPS_WARR73,\r\n\tPS_WARR74,\r\n\tPS_WARR75,\r\n\tPS_WARR76,\r\n\tPS_WARR77,\r\n\tPS_WARR78,\r\n\tPS_WARR79,\r\n#ifndef SPAWN\r\n\tPS_WARR80,\r\n\tPS_WARR81,\r\n\tPS_WARR82,\r\n\tPS_WARR83,\r\n\tPS_WARR84,\r\n\tPS_WARR85,\r\n\tPS_WARR86,\r\n\tPS_WARR87,\r\n\tPS_WARR88,\r\n\tPS_WARR89,\r\n\tPS_WARR90,\r\n\tPS_WARR91,\r\n\tPS_WARR92,\r\n\tPS_WARR93,\r\n\tPS_WARR94,\r\n\tPS_WARR95,\r\n\tPS_WARR95B,\r\n\tPS_WARR95C,\r\n\tPS_WARR95D,\r\n\tPS_WARR95E,\r\n\tPS_WARR95F,\r\n#endif\r\n\tPS_WARR96B,\r\n\tPS_WARR97,\r\n\tPS_WARR98,\r\n\tPS_WARR99,\r\n#ifndef SPAWN\r\n\tPS_WARR100,\r\n\tPS_WARR101,\r\n\tPS_WARR102,\r\n#endif\r\n#ifdef HELLFIRE\r\n\tPS_MONK1,\r\n\tPS_MONK2,\r\n\tPS_MONK3,\r\n\tPS_MONK4,\r\n\tPS_MONK5,\r\n\tPS_MONK6,\r\n\tPS_MONK7,\r\n\tPS_MONK8,\r\n\tPS_MONK9,\r\n\tPS_MONK10,\r\n\tPS_MONK11,\r\n\tPS_MONK12,\r\n\tPS_MONK13,\r\n\tPS_MONK14,\r\n\tPS_MONK15,\r\n\tPS_MONK16,\r\n\tPS_MONK17,\r\n\tPS_MONK18,\r\n\tPS_MONK19,\r\n\tPS_MONK20,\r\n\tPS_MONK21,\r\n\tPS_MONK22,\r\n\tPS_MONK23,\r\n\tPS_MONK24,\r\n\tPS_MONK25,\r\n\tPS_MONK26,\r\n\tPS_MONK27,\r\n\tPS_MONK28,\r\n\tPS_MONK29,\r\n\tPS_MONK30,\r\n\tPS_MONK31,\r\n\tPS_MONK32,\r\n\tPS_MONK33,\r\n\tPS_MONK34,\r\n\tPS_MONK35,\r\n\tPS_MONK36,\r\n\tPS_MONK37,\r\n\tPS_MONK38,\r\n\tPS_MONK39,\r\n\tPS_MONK40,\r\n\tPS_MONK41,\r\n\tPS_MONK42,\r\n\tPS_MONK43,\r\n\tPS_MONK44,\r\n\tPS_MONK45,\r\n\tPS_MONK46,\r\n\tPS_MONK47,\r\n\tPS_MONK48,\r\n\tPS_MONK49,\r\n\tPS_MONK50,\r\n\tPS_MONK51,\r\n\tPS_MONK52,\r\n\tPS_MONK53,\r\n\tPS_MONK54,\r\n\tPS_MONK55,\r\n\tPS_MONK56,\r\n\tPS_MONK57,\r\n\tPS_MONK58,\r\n\tPS_MONK59,\r\n\tPS_MONK60,\r\n\tPS_MONK61,\r\n\tPS_MONK62,\r\n\tPS_MONK63,\r\n\tPS_MONK64,\r\n\tPS_MONK65,\r\n\tPS_MONK66,\r\n\tPS_MONK67,\r\n\tPS_MONK68,\r\n\tPS_MONK69,\r\n\tPS_MONK69B,\r\n\tPS_MONK70,\r\n\tPS_MONK71,\r\n\tPS_MONK72,\r\n\tPS_MONK73,\r\n\tPS_MONK74,\r\n\tPS_MONK75,\r\n\tPS_MONK76,\r\n\tPS_MONK77,\r\n\tPS_MONK78,\r\n\tPS_MONK79,\r\n\tPS_MONK80,\r\n\tPS_MONK81,\r\n\tPS_MONK82,\r\n\tPS_MONK83,\r\n\tPS_MONK84,\r\n\tPS_MONK85,\r\n\tPS_MONK86,\r\n\tPS_MONK87,\r\n\tPS_MONK88,\r\n\tPS_MONK89,\r\n\tPS_MONK90,\r\n\tPS_MONK91,\r\n\tPS_MONK92,\r\n\tPS_MONK93,\r\n\tPS_MONK94,\r\n\tPS_MONK95,\r\n\tPS_MONK96,\r\n\tPS_MONK97,\r\n\tPS_MONK98,\r\n\tPS_MONK99,\r\n\tPS_MONK100,\r\n\tPS_MONK101,\r\n\tPS_MONK102,\r\n#endif\r\n#ifndef SPAWN\r\n\tPS_NAR1,\r\n\tPS_NAR2,\r\n\tPS_NAR3,\r\n\tPS_NAR4,\r\n\tPS_NAR5,\r\n\tPS_NAR6,\r\n\tPS_NAR7,\r\n\tPS_NAR8,\r\n\tPS_NAR9,\r\n\tPS_DIABLVLINT,\r\n\tUSFX_CLEAVER,\r\n\tUSFX_GARBUD1,\r\n\tUSFX_GARBUD2,\r\n\tUSFX_GARBUD3,\r\n\tUSFX_GARBUD4,\r\n\tUSFX_IZUAL1,\r\n\tUSFX_LACH1,\r\n\tUSFX_LACH2,\r\n\tUSFX_LACH3,\r\n\tUSFX_LAZ1,\r\n\tUSFX_LAZ2,\r\n\tUSFX_SKING1,\r\n\tUSFX_SNOT1,\r\n\tUSFX_SNOT2,\r\n\tUSFX_SNOT3,\r\n\tUSFX_WARLRD1,\r\n\tUSFX_WLOCK1,\r\n\tUSFX_ZHAR1,\r\n\tUSFX_ZHAR2,\r\n\tUSFX_DIABLOD,\r\n#endif\r\n#ifdef HELLFIRE\r\n\tTSFX_FARMER1,\r\n\tTSFX_FARMER2,\r\n\tTSFX_FARMER2A,\r\n\tTSFX_FARMER3,\r\n\tTSFX_FARMER4,\r\n\tTSFX_FARMER5,\r\n\tTSFX_FARMER6,\r\n\tTSFX_FARMER7,\r\n\tTSFX_FARMER8,\r\n\tTSFX_FARMER9,\r\n\tTSFX_TEDDYBR1,\r\n\tTSFX_TEDDYBR2,\r\n\tTSFX_TEDDYBR3,\r\n\tTSFX_TEDDYBR4,\r\n\tUSFX_DEFILER1,\r\n\tUSFX_DEFILER2,\r\n\tUSFX_DEFILER3,\r\n\tUSFX_DEFILER4,\r\n\tUSFX_DEFILER8,\r\n\tUSFX_DEFILER6,\r\n\tUSFX_DEFILER7,\r\n\tUSFX_NAKRUL1,\r\n\tUSFX_NAKRUL2,\r\n\tUSFX_NAKRUL3,\r\n\tUSFX_NAKRUL4,\r\n\tUSFX_NAKRUL5,\r\n\tUSFX_NAKRUL6,\r\n\tPS_NARATR3,\r\n\tTSFX_COWSUT1,\r\n\tTSFX_COWSUT2,\r\n\tTSFX_COWSUT3,\r\n\tTSFX_COWSUT4,\r\n\tTSFX_COWSUT4A,\r\n\tTSFX_COWSUT5,\r\n\tTSFX_COWSUT6,\r\n\tTSFX_COWSUT7,\r\n\tTSFX_COWSUT8,\r\n\tTSFX_COWSUT9,\r\n\tTSFX_COWSUT10,\r\n\tTSFX_COWSUT11,\r\n\tTSFX_COWSUT12,\r\n\tUSFX_SKLJRN1,\r\n\tPS_NARATR6,\r\n\tPS_NARATR7,\r\n\tPS_NARATR8,\r\n\tPS_NARATR5,\r\n\tPS_NARATR9,\r\n\tPS_NARATR4,\r\n\tTSFX_TRADER1,\r\n\tIS_CROPEN,\r\n\tIS_CRCLOS,\r\n#endif\r\n} _sfx_id;\r\n\r\ntypedef enum sfx_flag {\r\n\tsfx_STREAM   = 0x01,\r\n\tsfx_MISC     = 0x02,\r\n\tsfx_UI       = 0x04,\r\n\tsfx_MONK     = 0x08,\r\n\tsfx_ROGUE    = 0x10,\r\n\tsfx_WARRIOR  = 0x20,\r\n\tsfx_SORCEROR = 0x40,\r\n\tsfx_LOADED   = 0x80,\r\n} sfx_flag;\r\n\r\ntypedef enum item_equip_type {\r\n\tILOC_NONE        = 0x0,\r\n\tILOC_ONEHAND     = 0x1,\r\n\tILOC_TWOHAND     = 0x2,\r\n\tILOC_ARMOR       = 0x3,\r\n\tILOC_HELM        = 0x4,\r\n\tILOC_RING        = 0x5,\r\n\tILOC_AMULET      = 0x6,\r\n\tILOC_UNEQUIPABLE = 0x7,\r\n\tILOC_BELT        = 0x8,\r\n\tILOC_INVALID     = -1,\r\n} item_equip_type;\r\n\r\ntypedef enum missile_id {\r\n\tMIS_ARROW         = 0x0,\r\n\tMIS_FIREBOLT      = 0x1,\r\n\tMIS_GUARDIAN      = 0x2,\r\n\tMIS_RNDTELEPORT   = 0x3,\r\n\tMIS_LIGHTBALL     = 0x4,\r\n\tMIS_FIREWALL      = 0x5,\r\n\tMIS_FIREBALL      = 0x6,\r\n\tMIS_LIGHTCTRL     = 0x7,\r\n\tMIS_LIGHTNING     = 0x8,\r\n\tMIS_MISEXP        = 0x9,\r\n\tMIS_TOWN          = 0xA,\r\n\tMIS_FLASH         = 0xB,\r\n\tMIS_FLASH2        = 0xC,\r\n\tMIS_MANASHIELD    = 0xD,\r\n\tMIS_FIREMOVE      = 0xE,\r\n\tMIS_CHAIN         = 0xF,\r\n\tMIS_SENTINAL      = 0x10, // TODO: Check beta\r\n\tMIS_BLODSTAR      = 0x11, // TODO: Check beta\r\n\tMIS_BONE          = 0x12, // TODO: Check beta\r\n\tMIS_METLHIT       = 0x13, // TODO: Check beta\r\n\tMIS_RHINO         = 0x14,\r\n\tMIS_MAGMABALL     = 0x15,\r\n\tMIS_LIGHTCTRL2    = 0x16,\r\n\tMIS_LIGHTNING2    = 0x17,\r\n\tMIS_FLARE         = 0x18,\r\n\tMIS_MISEXP2       = 0x19,\r\n\tMIS_TELEPORT      = 0x1A,\r\n\tMIS_FARROW        = 0x1B,\r\n\tMIS_DOOMSERP      = 0x1C,\r\n\tMIS_FIREWALLA     = 0x1D, // TODO: Check beta\r\n\tMIS_STONE         = 0x1E,\r\n\tMIS_NULL_1F       = 0x1F,\r\n\tMIS_INVISIBL      = 0x20,\r\n\tMIS_GOLEM         = 0x21,\r\n\tMIS_ETHEREALIZE   = 0x22,\r\n\tMIS_BLODBUR       = 0x23, // TODO: Check beta\r\n\tMIS_BOOM          = 0x24,\r\n\tMIS_HEAL          = 0x25,\r\n\tMIS_FIREWALLC     = 0x26,\r\n\tMIS_INFRA         = 0x27,\r\n\tMIS_IDENTIFY      = 0x28,\r\n\tMIS_WAVE          = 0x29,\r\n\tMIS_NOVA          = 0x2A,\r\n\tMIS_BLODBOIL      = 0x2B,\r\n\tMIS_APOCA         = 0x2C,\r\n\tMIS_REPAIR        = 0x2D,\r\n\tMIS_RECHARGE      = 0x2E,\r\n\tMIS_DISARM        = 0x2F,\r\n\tMIS_FLAME         = 0x30,\r\n\tMIS_FLAMEC        = 0x31,\r\n\tMIS_FIREMAN       = 0x32, // TODO: Check beta\r\n\tMIS_KRULL         = 0x33, // TODO: Check beta\r\n\tMIS_CBOLT         = 0x34,\r\n\tMIS_HBOLT         = 0x35,\r\n\tMIS_RESURRECT     = 0x36,\r\n\tMIS_TELEKINESIS   = 0x37,\r\n\tMIS_LARROW        = 0x38,\r\n\tMIS_ACID          = 0x39,\r\n\tMIS_MISEXP3       = 0x3A,\r\n\tMIS_ACIDPUD       = 0x3B,\r\n\tMIS_HEALOTHER     = 0x3C,\r\n\tMIS_ELEMENT       = 0x3D,\r\n\tMIS_RESURRECTBEAM = 0x3E,\r\n\tMIS_BONESPIRIT    = 0x3F,\r\n\tMIS_WEAPEXP       = 0x40,\r\n\tMIS_RPORTAL       = 0x41,\r\n\tMIS_BOOM2         = 0x42,\r\n\tMIS_DIABAPOCA     = 0x43,\r\n#ifdef HELLFIRE\r\n\tMIS_MANA          = 0x44,\r\n\tMIS_MAGI          = 0x45,\r\n\tMIS_LIGHTWALL     = 0x46,\r\n\tMIS_LIGHTNINGWALL = 0x47,\r\n\tMIS_IMMOLATION    = 0x48,\r\n\tMIS_SPECARROW     = 0x49,\r\n\tMIS_FIRENOVA      = 0x4A,\r\n\tMIS_LIGHTARROW    = 0x4B,\r\n\tMIS_CBOLTARROW    = 0x4C,\r\n\tMIS_HBOLTARROW    = 0x4D,\r\n\tMIS_WARP          = 0x4E,\r\n\tMIS_REFLECT       = 0x4F,\r\n\tMIS_BERSERK       = 0x50,\r\n\tMIS_FIRERING      = 0x51,\r\n\tMIS_STEALPOTS     = 0x52,\r\n\tMIS_MANATRAP      = 0x53,\r\n\tMIS_LIGHTRING     = 0x54,\r\n\tMIS_SEARCH        = 0x55,\r\n\tMIS_FLASHFR       = 0x56,\r\n\tMIS_FLASHBK       = 0x57,\r\n\tMIS_IMMOLATION2   = 0x58,\r\n\tMIS_RUNEFIRE      = 0x59,\r\n\tMIS_RUNELIGHT     = 0x5A,\r\n\tMIS_RUNENOVA      = 0x5B,\r\n\tMIS_RUNEIMMOLAT   = 0x5C,\r\n\tMIS_RUNESTONE     = 0x5D,\r\n\tMIS_HIVEEXP       = 0x5E,\r\n\tMIS_HORKDMN       = 0x5F,\r\n\tMIS_JESTER        = 0x60,\r\n\tMIS_HIVEEXP2      = 0x61,\r\n\tMIS_LICH          = 0x62,\r\n\tMIS_PSYCHORB      = 0x63,\r\n\tMIS_NECROMORB     = 0x64,\r\n\tMIS_ARCHLICH      = 0x65,\r\n\tMIS_BONEDEMON     = 0x66,\r\n\tMIS_EXYEL2        = 0x67,\r\n\tMIS_EXRED3        = 0x68,\r\n\tMIS_EXBL2         = 0x69,\r\n\tMIS_EXBL3         = 0x6A,\r\n\tMIS_EXORA1        = 0x6B,\r\n#endif\r\n} missile_id;\r\n\r\ntypedef enum missile_graphic_id {\r\n\tMFILE_ARROWS,\r\n\tMFILE_FIREBA,\r\n\tMFILE_GUARD,\r\n\tMFILE_LGHNING,\r\n\tMFILE_FIREWAL,\r\n\tMFILE_MAGBLOS,\r\n\tMFILE_PORTAL,\r\n\tMFILE_BLUEXFR,\r\n\tMFILE_BLUEXBK,\r\n\tMFILE_MANASHLD,\r\n\tMFILE_BLOOD,\r\n\tMFILE_BONE,\r\n\tMFILE_METLHIT,\r\n\tMFILE_FARROW,\r\n\tMFILE_DOOM,\r\n\tMFILE_0F,\r\n\tMFILE_BLODBUR,\r\n\tMFILE_NEWEXP,\r\n\tMFILE_SHATTER1,\r\n\tMFILE_BIGEXP,\r\n\tMFILE_INFERNO,\r\n\tMFILE_THINLGHT,\r\n\tMFILE_FLARE,\r\n\tMFILE_FLAREEXP,\r\n\tMFILE_MAGBALL,\r\n\tMFILE_KRULL,\r\n\tMFILE_MINILTNG,\r\n\tMFILE_HOLY,\r\n\tMFILE_HOLYEXPL,\r\n\tMFILE_LARROW,\r\n\tMFILE_FIRARWEX,\r\n\tMFILE_ACIDBF,\r\n\tMFILE_ACIDSPLA,\r\n\tMFILE_ACIDPUD,\r\n\tMFILE_ETHRSHLD,\r\n\tMFILE_FIRERUN,\r\n\tMFILE_RESSUR1,\r\n\tMFILE_SKLBALL,\r\n\tMFILE_RPORTAL,\r\n\tMFILE_FIREPLAR,\r\n\tMFILE_SCUBMISB,\r\n\tMFILE_SCBSEXPB,\r\n\tMFILE_SCUBMISC,\r\n\tMFILE_SCBSEXPC,\r\n\tMFILE_SCUBMISD,\r\n\tMFILE_SCBSEXPD,\r\n#ifdef HELLFIRE\r\n\tMFILE_SPAWNS,\r\n\tMFILE_REFLECT,\r\n\tMFILE_LICH,\r\n\tMFILE_MSBLA,\r\n\tMFILE_NECROMORB,\r\n\tMFILE_ARCHLICH,\r\n\tMFILE_RUNE,\r\n\tMFILE_EXYEL2,\r\n\tMFILE_EXBL2,\r\n\tMFILE_EXRED3,\r\n\tMFILE_BONEDEMON,\r\n\tMFILE_EXORA1,\r\n\tMFILE_EXBL3,\r\n#endif\r\n\tMFILE_NULL,\r\n\tMFILE_NONE = 0xFF, // BUGFIX: should be `MFILE_NONE = MFILE_SCBSEXPD+1`, i.e. MFILE_NULL, since there would otherwise be an out-of-bounds in SetMissAnim when accessing misfiledata for any of the missiles that have MFILE_NONE as mFileNum in missiledata.\r\n} missile_graphic_id;\r\n\r\ntypedef enum _mai_id {\r\n\tAI_ZOMBIE   = 0,\r\n\tAI_FAT      = 1,\r\n\tAI_SKELSD   = 2,\r\n\tAI_SKELBOW  = 3,\r\n\tAI_SCAV     = 4,\r\n\tAI_RHINO    = 5,\r\n\tAI_GOATMC   = 6,\r\n\tAI_GOATBOW  = 7,\r\n\tAI_FALLEN   = 8,\r\n\tAI_MAGMA    = 9,\r\n\tAI_SKELKING = 10,\r\n\tAI_BAT      = 11,\r\n\tAI_GARG     = 12,\r\n\tAI_CLEAVER  = 13,\r\n\tAI_SUCC     = 14,\r\n\tAI_SNEAK    = 15,\r\n\tAI_STORM    = 16,\r\n\tAI_FIREMAN  = 17,\r\n\tAI_GARBUD   = 18,\r\n\tAI_ACID     = 19,\r\n\tAI_ACIDUNIQ = 20,\r\n\tAI_GOLUM    = 21,\r\n\tAI_ZHAR     = 22,\r\n\tAI_SNOTSPIL = 23,\r\n\tAI_SNAKE    = 24,\r\n\tAI_COUNSLR  = 25,\r\n\tAI_MEGA     = 26,\r\n\tAI_DIABLO   = 27,\r\n\tAI_LAZURUS  = 28,\r\n\tAI_LAZHELP  = 29,\r\n\tAI_LACHDAN  = 30,\r\n\tAI_WARLORD  = 31,\r\n#ifdef HELLFIRE\r\n\tAI_FIREBAT   = 32,\r\n\tAI_TORCHANT  = 33,\r\n\tAI_HORKDMN   = 34,\r\n\tAI_LICH      = 35,\r\n\tAI_ARCHLICH  = 36,\r\n\tAI_PSYCHORB  = 37,\r\n\tAI_NECROMORB = 38,\r\n\tAI_BONEDEMON = 39,\r\n#endif\r\n} _mai_id;\r\n\r\ntypedef enum _mc_id {\r\n\tMC_UNDEAD = 0,\r\n\tMC_DEMON  = 1,\r\n\tMC_ANIMAL = 2,\r\n} _mc_id;\r\n\r\ntypedef enum FILE_SYSTEM {\r\n\tFS_PC = 0,\r\n\tFS_CD = 1,\r\n} FILE_SYSTEM;\r\n\r\ntypedef enum _artfonts {\r\n\tAF_SMALL     = 0,\r\n\tAF_SMALLGRAY = 1,\r\n\tAF_MED       = 2,\r\n\tAF_MEDGRAY   = 3,\r\n\tAF_BIG       = 4,\r\n\tAF_BIGGRAY   = 5,\r\n\tAF_HUGE      = 6,\r\n\tAF_HUGEGRAY  = 7,\r\n} _artfonts;\r\n\r\ntypedef enum _monster_id {\r\n\tMT_NZOMBIE  = 0x0,\r\n\tMT_BZOMBIE  = 0x1,\r\n\tMT_GZOMBIE  = 0x2,\r\n\tMT_YZOMBIE  = 0x3,\r\n\tMT_RFALLSP  = 0x4,\r\n\tMT_DFALLSP  = 0x5,\r\n\tMT_YFALLSP  = 0x6,\r\n\tMT_BFALLSP  = 0x7,\r\n\tMT_WSKELAX  = 0x8,\r\n\tMT_TSKELAX  = 0x9,\r\n\tMT_RSKELAX  = 0xA,\r\n\tMT_XSKELAX  = 0xB,\r\n\tMT_RFALLSD  = 0xC,\r\n\tMT_DFALLSD  = 0xD,\r\n\tMT_YFALLSD  = 0xE,\r\n\tMT_BFALLSD  = 0xF,\r\n\tMT_NSCAV    = 0x10,\r\n\tMT_BSCAV    = 0x11,\r\n\tMT_WSCAV    = 0x12,\r\n\tMT_YSCAV    = 0x13,\r\n\tMT_WSKELBW  = 0x14,\r\n\tMT_TSKELBW  = 0x15,\r\n\tMT_RSKELBW  = 0x16,\r\n\tMT_XSKELBW  = 0x17,\r\n\tMT_WSKELSD  = 0x18,\r\n\tMT_TSKELSD  = 0x19,\r\n\tMT_RSKELSD  = 0x1A,\r\n\tMT_XSKELSD  = 0x1B,\r\n\tMT_INVILORD = 0x1C,\r\n\tMT_SNEAK    = 0x1D,\r\n\tMT_STALKER  = 0x1E,\r\n\tMT_UNSEEN   = 0x1F,\r\n\tMT_ILLWEAV  = 0x20,\r\n\tMT_LRDSAYTR = 0x21,\r\n\tMT_NGOATMC  = 0x22,\r\n\tMT_BGOATMC  = 0x23,\r\n\tMT_RGOATMC  = 0x24,\r\n\tMT_GGOATMC  = 0x25,\r\n\tMT_FIEND    = 0x26,\r\n\tMT_BLINK    = 0x27,\r\n\tMT_GLOOM    = 0x28,\r\n\tMT_FAMILIAR = 0x29,\r\n\tMT_NGOATBW  = 0x2A,\r\n\tMT_BGOATBW  = 0x2B,\r\n\tMT_RGOATBW  = 0x2C,\r\n\tMT_GGOATBW  = 0x2D,\r\n\tMT_NACID    = 0x2E,\r\n\tMT_RACID    = 0x2F,\r\n\tMT_BACID    = 0x30,\r\n\tMT_XACID    = 0x31,\r\n\tMT_SKING    = 0x32,\r\n\tMT_CLEAVER  = 0x33,\r\n\tMT_FAT      = 0x34,\r\n\tMT_MUDMAN   = 0x35,\r\n\tMT_TOAD     = 0x36,\r\n\tMT_FLAYED   = 0x37,\r\n\tMT_WYRM     = 0x38,\r\n\tMT_CAVSLUG  = 0x39,\r\n\tMT_DVLWYRM  = 0x3A,\r\n\tMT_DEVOUR   = 0x3B,\r\n\tMT_NMAGMA   = 0x3C,\r\n\tMT_YMAGMA   = 0x3D,\r\n\tMT_BMAGMA   = 0x3E,\r\n\tMT_WMAGMA   = 0x3F,\r\n\tMT_HORNED   = 0x40,\r\n\tMT_MUDRUN   = 0x41,\r\n\tMT_FROSTC   = 0x42,\r\n\tMT_OBLORD   = 0x43,\r\n\tMT_BONEDMN  = 0x44,\r\n\tMT_REDDTH   = 0x45,\r\n\tMT_LTCHDMN  = 0x46,\r\n\tMT_UDEDBLRG = 0x47,\r\n\tMT_INCIN    = 0x48,\r\n\tMT_FLAMLRD  = 0x49,\r\n\tMT_DOOMFIRE = 0x4A,\r\n\tMT_HELLBURN = 0x4B,\r\n\tMT_STORM    = 0x4C,\r\n\tMT_RSTORM   = 0x4D,\r\n\tMT_STORML   = 0x4E,\r\n\tMT_MAEL     = 0x4F,\r\n\tMT_BIGFALL  = 0x50,\r\n\tMT_WINGED   = 0x51,\r\n\tMT_GARGOYLE = 0x52,\r\n\tMT_BLOODCLW = 0x53,\r\n\tMT_DEATHW   = 0x54,\r\n\tMT_MEGA     = 0x55,\r\n\tMT_GUARD    = 0x56,\r\n\tMT_VTEXLRD  = 0x57,\r\n\tMT_BALROG   = 0x58,\r\n\tMT_NSNAKE   = 0x59,\r\n\tMT_RSNAKE   = 0x5A,\r\n\tMT_BSNAKE   = 0x5B,\r\n\tMT_GSNAKE   = 0x5C,\r\n\tMT_NBLACK   = 0x5D,\r\n\tMT_RTBLACK  = 0x5E,\r\n\tMT_BTBLACK  = 0x5F,\r\n\tMT_RBLACK   = 0x60,\r\n\tMT_UNRAV    = 0x61,\r\n\tMT_HOLOWONE = 0x62,\r\n\tMT_PAINMSTR = 0x63,\r\n\tMT_REALWEAV = 0x64,\r\n\tMT_SUCCUBUS = 0x65,\r\n\tMT_SNOWWICH = 0x66,\r\n\tMT_HLSPWN   = 0x67,\r\n\tMT_SOLBRNR  = 0x68,\r\n\tMT_COUNSLR  = 0x69,\r\n\tMT_MAGISTR  = 0x6A,\r\n\tMT_CABALIST = 0x6B,\r\n\tMT_ADVOCATE = 0x6C,\r\n\tMT_GOLEM    = 0x6D,\r\n\tMT_DIABLO   = 0x6E,\r\n\tMT_DARKMAGE = 0x6F,\r\n#ifdef HELLFIRE\r\n\tMT_HELLBOAR = 0x70,\r\n\tMT_STINGER  = 0x71,\r\n\tMT_PSYCHORB = 0x72,\r\n\tMT_ARACHNON = 0x73,\r\n\tMT_FELLTWIN = 0x74,\r\n\tMT_HORKSPWN = 0x75,\r\n\tMT_VENMTAIL = 0x76,\r\n\tMT_NECRMORB = 0x77,\r\n\tMT_SPIDLORD = 0x78,\r\n\tMT_LASHWORM = 0x79,\r\n\tMT_TORCHANT = 0x7A,\r\n\tMT_HORKDMN  = 0x7B,\r\n\tMT_DEFILER  = 0x7C,\r\n\tMT_GRAVEDIG = 0x7D,\r\n\tMT_TOMBRAT  = 0x7E,\r\n\tMT_FIREBAT  = 0x7F,\r\n\tMT_SKLWING  = 0x80,\r\n\tMT_LICH     = 0x81,\r\n\tMT_CRYPTDMN = 0x82,\r\n\tMT_HELLBAT  = 0x83,\r\n\tMT_BONEDEMN = 0x84,\r\n\tMT_ARCHLICH = 0x85,\r\n\tMT_BICLOPS  = 0x86,\r\n\tMT_FLESTHNG = 0x87,\r\n\tMT_REAPER   = 0x88,\r\n\tMT_NAKRUL   = 0x89,\r\n\tNUM_MTYPES,\r\n#else\r\n\tNUM_MTYPES  = 0x6F, /// BUGFIX the count is off by one\r\n#endif\r\n} _monster_id;\r\n\r\n// this enum contains indexes from UniqMonst array for special unique monsters (usually quest related)\r\ntypedef enum {\r\n\tUMT_GARBUD    = 0,\r\n\tUMT_SKELKING  = 1,\r\n\tUMT_ZHAR      = 2,\r\n\tUMT_SNOTSPIL  = 3,\r\n\tUMT_LAZURUS   = 4,\r\n\tUMT_RED_VEX   = 5,\r\n\tUMT_BLACKJADE = 6,\r\n\tUMT_LACHDAN   = 7,\r\n\tUMT_WARLORD   = 8,\r\n\tUMT_BUTCHER   = 9,\r\n#ifdef HELLFIRE\r\n\tUMT_HORKDMN   = 10,\r\n\tUMT_DEFILER   = 11,\r\n\tUMT_NAKRUL    = 12,\r\n#endif\r\n} _uniq_monsterid;\r\n\r\ntypedef enum monster_flag {\r\n\tMFLAG_HIDDEN          = 0x01,\r\n\tMFLAG_LOCK_ANIMATION  = 0x02,\r\n\tMFLAG_ALLOW_SPECIAL   = 0x04,\r\n\tMFLAG_NOHEAL          = 0x08,\r\n\tMFLAG_TARGETS_MONSTER = 0x10,\r\n\tMFLAG_GOLEM           = 0x20,\r\n\tMFLAG_QUEST_COMPLETE  = 0x40,\r\n\tMFLAG_KNOCKBACK       = 0x80,\r\n\tMFLAG_SEARCH          = 0x100,\r\n\tMFLAG_CAN_OPEN_DOOR   = 0x200,\r\n\tMFLAG_NO_ENEMY        = 0x400,\r\n\tMFLAG_BERSERK         = 0x800,\r\n\tMFLAG_NOLIFESTEAL     = 0x1000\r\n} monster_flag;\r\n\r\ntypedef enum monster_goal {\r\n\tMGOAL_NORMAL    = 1,\r\n\tMGOAL_RETREAT   = 2,\r\n\tMGOAL_HEALING   = 3,\r\n\tMGOAL_MOVE      = 4,\r\n\tMGOAL_ATTACK2   = 5,\r\n\tMGOAL_INQUIRING = 6,\r\n\tMGOAL_TALKING   = 7,\r\n} monster_goal;\r\n\r\ntypedef enum monster_resistance {\r\n\tRESIST_MAGIC     = 0x01,\r\n\tRESIST_FIRE      = 0x02,\r\n\tRESIST_LIGHTNING = 0x04,\r\n\tIMMUNE_MAGIC     = 0x08,\r\n\tIMMUNE_FIRE      = 0x10,\r\n\tIMMUNE_LIGHTNING = 0x20,\r\n\tIMMUNE_NULL_40   = 0x40,\r\n\tIMMUNE_ACID      = 0x80,\r\n} monster_resistance;\r\n\r\ntypedef enum missile_resistance {\r\n\tMISR_NONE      = 0,\r\n\tMISR_FIRE      = 1,\r\n\tMISR_LIGHTNING = 2,\r\n\tMISR_MAGIC     = 3,\r\n\tMISR_ACID      = 4,\r\n} missile_resistance;\r\n\r\ntypedef enum _speech_id {\r\n\tTEXT_KING1      = 0x0,\r\n\tTEXT_KING2      = 0x1,\r\n\tTEXT_KING3      = 0x2,\r\n\tTEXT_KING4      = 0x3,\r\n\tTEXT_KING5      = 0x4,\r\n\tTEXT_KING6      = 0x5,\r\n\tTEXT_KING7      = 0x6,\r\n\tTEXT_KING8      = 0x7,\r\n\tTEXT_KING9      = 0x8,\r\n\tTEXT_KING10     = 0x9,\r\n\tTEXT_KING11     = 0xA,\r\n\tTEXT_BANNER1    = 0xB,\r\n\tTEXT_BANNER2    = 0xC,\r\n\tTEXT_BANNER3    = 0xD,\r\n\tTEXT_BANNER4    = 0xE,\r\n\tTEXT_BANNER5    = 0xF,\r\n\tTEXT_BANNER6    = 0x10,\r\n\tTEXT_BANNER7    = 0x11,\r\n\tTEXT_BANNER8    = 0x12,\r\n\tTEXT_BANNER9    = 0x13,\r\n\tTEXT_BANNER10   = 0x14,\r\n\tTEXT_BANNER11   = 0x15,\r\n\tTEXT_BANNER12   = 0x16,\r\n\tTEXT_VILE1      = 0x17,\r\n\tTEXT_VILE2      = 0x18,\r\n\tTEXT_VILE3      = 0x19,\r\n\tTEXT_VILE4      = 0x1A,\r\n\tTEXT_VILE5      = 0x1B,\r\n\tTEXT_VILE6      = 0x1C,\r\n\tTEXT_VILE7      = 0x1D,\r\n\tTEXT_VILE8      = 0x1E,\r\n\tTEXT_VILE9      = 0x1F,\r\n\tTEXT_VILE10     = 0x20,\r\n\tTEXT_VILE11     = 0x21,\r\n\tTEXT_VILE12     = 0x22,\r\n\tTEXT_VILE13     = 0x23,\r\n\tTEXT_VILE14     = 0x24,\r\n\tTEXT_POISON1    = 0x25,\r\n\tTEXT_POISON2    = 0x26,\r\n\tTEXT_POISON3    = 0x27,\r\n\tTEXT_POISON4    = 0x28,\r\n\tTEXT_POISON5    = 0x29,\r\n\tTEXT_POISON6    = 0x2A,\r\n\tTEXT_POISON7    = 0x2B,\r\n\tTEXT_POISON8    = 0x2C,\r\n\tTEXT_POISON9    = 0x2D,\r\n\tTEXT_POISON10   = 0x2E,\r\n\tTEXT_BONE1      = 0x2F,\r\n\tTEXT_BONE2      = 0x30,\r\n\tTEXT_BONE3      = 0x31,\r\n\tTEXT_BONE4      = 0x32,\r\n\tTEXT_BONE5      = 0x33,\r\n\tTEXT_BONE6      = 0x34,\r\n\tTEXT_BONE7      = 0x35,\r\n\tTEXT_BONE8      = 0x36,\r\n\tTEXT_BUTCH1     = 0x37,\r\n\tTEXT_BUTCH2     = 0x38,\r\n\tTEXT_BUTCH3     = 0x39,\r\n\tTEXT_BUTCH4     = 0x3A,\r\n\tTEXT_BUTCH5     = 0x3B,\r\n\tTEXT_BUTCH6     = 0x3C,\r\n\tTEXT_BUTCH7     = 0x3D,\r\n\tTEXT_BUTCH8     = 0x3E,\r\n\tTEXT_BUTCH9     = 0x3F,\r\n\tTEXT_BUTCH10    = 0x40,\r\n\tTEXT_BLIND1     = 0x41,\r\n\tTEXT_BLIND2     = 0x42,\r\n\tTEXT_BLIND3     = 0x43,\r\n\tTEXT_BLIND4     = 0x44,\r\n\tTEXT_BLIND5     = 0x45,\r\n\tTEXT_BLIND6     = 0x46,\r\n\tTEXT_BLIND7     = 0x47,\r\n\tTEXT_BLIND8     = 0x48,\r\n\tTEXT_VEIL1      = 0x49,\r\n\tTEXT_VEIL2      = 0x4A,\r\n\tTEXT_VEIL3      = 0x4B,\r\n\tTEXT_VEIL4      = 0x4C,\r\n\tTEXT_VEIL5      = 0x4D,\r\n\tTEXT_VEIL6      = 0x4E,\r\n\tTEXT_VEIL7      = 0x4F,\r\n\tTEXT_VEIL8      = 0x50,\r\n\tTEXT_VEIL9      = 0x51,\r\n\tTEXT_VEIL10     = 0x52,\r\n\tTEXT_VEIL11     = 0x53,\r\n\tTEXT_ANVIL1     = 0x54,\r\n\tTEXT_ANVIL2     = 0x55,\r\n\tTEXT_ANVIL3     = 0x56,\r\n\tTEXT_ANVIL4     = 0x57,\r\n\tTEXT_ANVIL5     = 0x58,\r\n\tTEXT_ANVIL6     = 0x59,\r\n\tTEXT_ANVIL7     = 0x5A,\r\n\tTEXT_ANVIL8     = 0x5B,\r\n\tTEXT_ANVIL9     = 0x5C,\r\n\tTEXT_ANVIL10    = 0x5D,\r\n\tTEXT_BLOOD1     = 0x5E,\r\n\tTEXT_BLOOD2     = 0x5F,\r\n\tTEXT_BLOOD3     = 0x60,\r\n\tTEXT_BLOOD4     = 0x61,\r\n\tTEXT_BLOOD5     = 0x62,\r\n\tTEXT_BLOOD6     = 0x63,\r\n\tTEXT_BLOOD7     = 0x64,\r\n\tTEXT_BLOOD8     = 0x65,\r\n\tTEXT_WARLRD1    = 0x66,\r\n\tTEXT_WARLRD2    = 0x67,\r\n\tTEXT_WARLRD3    = 0x68,\r\n\tTEXT_WARLRD4    = 0x69,\r\n\tTEXT_WARLRD5    = 0x6A,\r\n\tTEXT_WARLRD6    = 0x6B,\r\n\tTEXT_WARLRD7    = 0x6C,\r\n\tTEXT_WARLRD8    = 0x6D,\r\n\tTEXT_WARLRD9    = 0x6E,\r\n\tTEXT_INFRA1     = 0x6F,\r\n\tTEXT_INFRA2     = 0x70,\r\n\tTEXT_INFRA3     = 0x71,\r\n\tTEXT_INFRA4     = 0x72,\r\n\tTEXT_INFRA5     = 0x73,\r\n\tTEXT_INFRA6     = 0x74,\r\n\tTEXT_INFRA7     = 0x75,\r\n\tTEXT_INFRA8     = 0x76,\r\n\tTEXT_INFRA9     = 0x77,\r\n\tTEXT_INFRA10    = 0x78,\r\n\tTEXT_MUSH1      = 0x79,\r\n\tTEXT_MUSH2      = 0x7A,\r\n\tTEXT_MUSH3      = 0x7B,\r\n\tTEXT_MUSH4      = 0x7C,\r\n\tTEXT_MUSH5      = 0x7D,\r\n\tTEXT_MUSH6      = 0x7E,\r\n\tTEXT_MUSH7      = 0x7F,\r\n\tTEXT_MUSH8      = 0x80,\r\n\tTEXT_MUSH9      = 0x81,\r\n\tTEXT_MUSH10     = 0x82,\r\n\tTEXT_MUSH11     = 0x83,\r\n\tTEXT_MUSH12     = 0x84,\r\n\tTEXT_MUSH13     = 0x85,\r\n\tTEXT_DOOM1      = 0x86,\r\n\tTEXT_DOOM2      = 0x87,\r\n\tTEXT_DOOM3      = 0x88,\r\n\tTEXT_DOOM4      = 0x89,\r\n\tTEXT_DOOM5      = 0x8A,\r\n\tTEXT_DOOM6      = 0x8B,\r\n\tTEXT_DOOM7      = 0x8C,\r\n\tTEXT_DOOM8      = 0x8D,\r\n\tTEXT_DOOM9      = 0x8E,\r\n\tTEXT_DOOM10     = 0x8F,\r\n\tTEXT_GARBUD1    = 0x90,\r\n\tTEXT_GARBUD2    = 0x91,\r\n\tTEXT_GARBUD3    = 0x92,\r\n\tTEXT_GARBUD4    = 0x93,\r\n\tTEXT_ZHAR1      = 0x94,\r\n\tTEXT_ZHAR2      = 0x95,\r\n\tTEXT_STORY1     = 0x96,\r\n\tTEXT_STORY2     = 0x97,\r\n\tTEXT_STORY3     = 0x98,\r\n\tTEXT_STORY4     = 0x99,\r\n\tTEXT_STORY5     = 0x9A,\r\n\tTEXT_STORY6     = 0x9B,\r\n\tTEXT_STORY7     = 0x9C,\r\n\tTEXT_STORY9     = 0x9D,\r\n\tTEXT_STORY10    = 0x9E,\r\n\tTEXT_STORY11    = 0x9F,\r\n\tTEXT_OGDEN1     = 0xA0,\r\n\tTEXT_OGDEN2     = 0xA1,\r\n\tTEXT_OGDEN3     = 0xA2,\r\n\tTEXT_OGDEN4     = 0xA3,\r\n\tTEXT_OGDEN5     = 0xA4,\r\n\tTEXT_OGDEN6     = 0xA5,\r\n\tTEXT_OGDEN8     = 0xA6,\r\n\tTEXT_OGDEN9     = 0xA7,\r\n\tTEXT_OGDEN10    = 0xA8,\r\n\tTEXT_PEPIN1     = 0xA9,\r\n\tTEXT_PEPIN2     = 0xAA,\r\n\tTEXT_PEPIN3     = 0xAB,\r\n\tTEXT_PEPIN4     = 0xAC,\r\n\tTEXT_PEPIN5     = 0xAD,\r\n\tTEXT_PEPIN6     = 0xAE,\r\n\tTEXT_PEPIN7     = 0xAF,\r\n\tTEXT_PEPIN9     = 0xB0,\r\n\tTEXT_PEPIN10    = 0xB1,\r\n\tTEXT_PEPIN11    = 0xB2,\r\n\tTEXT_GILLIAN1   = 0xB3,\r\n\tTEXT_GILLIAN2   = 0xB4,\r\n\tTEXT_GILLIAN3   = 0xB5,\r\n\tTEXT_GILLIAN4   = 0xB6,\r\n\tTEXT_GILLIAN5   = 0xB7,\r\n\tTEXT_GILLIAN6   = 0xB8,\r\n\tTEXT_GILLIAN7   = 0xB9,\r\n\tTEXT_GILLIAN9   = 0xBA,\r\n\tTEXT_GILLIAN10  = 0xBB,\r\n\tTEXT_GRISWOLD1  = 0xBC,\r\n\tTEXT_GRISWOLD2  = 0xBD,\r\n\tTEXT_GRISWOLD3  = 0xBE,\r\n\tTEXT_GRISWOLD4  = 0xBF,\r\n\tTEXT_GRISWOLD5  = 0xC0,\r\n\tTEXT_GRISWOLD6  = 0xC1,\r\n\tTEXT_GRISWOLD7  = 0xC2,\r\n\tTEXT_GRISWOLD8  = 0xC3,\r\n\tTEXT_GRISWOLD9  = 0xC4,\r\n\tTEXT_GRISWOLD10 = 0xC5,\r\n\tTEXT_GRISWOLD12 = 0xC6,\r\n\tTEXT_GRISWOLD13 = 0xC7,\r\n\tTEXT_FARNHAM1   = 0xC8,\r\n\tTEXT_FARNHAM2   = 0xC9,\r\n\tTEXT_FARNHAM3   = 0xCA,\r\n\tTEXT_FARNHAM4   = 0xCB,\r\n\tTEXT_FARNHAM5   = 0xCC,\r\n\tTEXT_FARNHAM6   = 0xCD,\r\n\tTEXT_FARNHAM8   = 0xCE,\r\n\tTEXT_FARNHAM9   = 0xCF,\r\n\tTEXT_FARNHAM10  = 0xD0,\r\n\tTEXT_FARNHAM11  = 0xD1,\r\n\tTEXT_FARNHAM12  = 0xD2,\r\n\tTEXT_FARNHAM13  = 0xD3,\r\n\tTEXT_ADRIA1     = 0xD4,\r\n\tTEXT_ADRIA2     = 0xD5,\r\n\tTEXT_ADRIA3     = 0xD6,\r\n\tTEXT_ADRIA4     = 0xD7,\r\n\tTEXT_ADRIA5     = 0xD8,\r\n\tTEXT_ADRIA6     = 0xD9,\r\n\tTEXT_ADRIA7     = 0xDA,\r\n\tTEXT_ADRIA8     = 0xDB,\r\n\tTEXT_ADRIA9     = 0xDC,\r\n\tTEXT_ADRIA10    = 0xDD,\r\n\tTEXT_ADRIA12    = 0xDE,\r\n\tTEXT_ADRIA13    = 0xDF,\r\n\tTEXT_WIRT1      = 0xE0,\r\n\tTEXT_WIRT2      = 0xE1,\r\n\tTEXT_WIRT3      = 0xE2,\r\n\tTEXT_WIRT4      = 0xE3,\r\n\tTEXT_WIRT5      = 0xE4,\r\n\tTEXT_WIRT6      = 0xE5,\r\n\tTEXT_WIRT7      = 0xE6,\r\n\tTEXT_WIRT8      = 0xE7,\r\n\tTEXT_WIRT9      = 0xE8,\r\n\tTEXT_WIRT11     = 0xE9,\r\n\tTEXT_WIRT12     = 0xEA,\r\n\tTEXT_BONER      = 0xEB,\r\n\tTEXT_BLOODY     = 0xEC,\r\n\tTEXT_BLINDING   = 0xED,\r\n\tTEXT_BLOODWAR   = 0xEE,\r\n\tTEXT_MBONER     = 0xEF,\r\n\tTEXT_MBLOODY    = 0xF0,\r\n\tTEXT_MBLINDING  = 0xF1,\r\n\tTEXT_MBLOODWAR  = 0xF2,\r\n\tTEXT_RBONER     = 0xF3,\r\n\tTEXT_RBLOODY    = 0xF4,\r\n\tTEXT_RBLINDING  = 0xF5,\r\n\tTEXT_RBLOODWAR  = 0xF6,\r\n\tTEXT_COW1       = 0xF7,\r\n\tTEXT_COW2       = 0xF8,\r\n\tTEXT_BOOK11     = 0xF9,\r\n\tTEXT_BOOK12     = 0xFA,\r\n\tTEXT_BOOK13     = 0xFB,\r\n\tTEXT_BOOK21     = 0xFC,\r\n\tTEXT_BOOK22     = 0xFD,\r\n\tTEXT_BOOK23     = 0xFE,\r\n\tTEXT_BOOK31     = 0xFF,\r\n\tTEXT_BOOK32     = 0x100,\r\n\tTEXT_BOOK33     = 0x101,\r\n\tTEXT_INTRO      = 0x102,\r\n#ifdef HELLFIRE\r\n\tTEXT_HBONER    = 0x103,\r\n\tTEXT_HBLOODY   = 0x104,\r\n\tTEXT_HBLINDING = 0x105,\r\n\tTEXT_HBLOODWAR = 0x106,\r\n\tTEXT_BBONER    = 0x107,\r\n\tTEXT_BBLOODY   = 0x108,\r\n\tTEXT_BBLINDING = 0x109,\r\n\tTEXT_BBLOODWAR = 0x10A,\r\n\tTEXT_GRAVE1    = 0x10B,\r\n\tTEXT_GRAVE2    = 0x10C,\r\n\tTEXT_GRAVE3    = 0x10D,\r\n\tTEXT_GRAVE4    = 0x10E,\r\n\tTEXT_GRAVE5    = 0x10F,\r\n\tTEXT_GRAVE6    = 0x110,\r\n\tTEXT_GRAVE7    = 0x111,\r\n\tTEXT_GRAVE8    = 0x112,\r\n\tTEXT_GRAVE9    = 0x113,\r\n\tTEXT_GRAVE10   = 0x114,\r\n\tTEXT_FARMER1   = 0x115,\r\n\tTEXT_FARMER2   = 0x116,\r\n\tTEXT_FARMER3   = 0x117,\r\n\tTEXT_FARMER4   = 0x118,\r\n\tTEXT_FARMER5   = 0x119,\r\n\tTEXT_GIRL1     = 0x11A,\r\n\tTEXT_GIRL2     = 0x11B,\r\n\tTEXT_GIRL3     = 0x11C,\r\n\tTEXT_GIRL4     = 0x11D,\r\n\tTEXT_DEFILER1  = 0x11E,\r\n\tTEXT_DEFILER2  = 0x11F,\r\n\tTEXT_DEFILER3  = 0x120,\r\n\tTEXT_DEFILER4  = 0x121,\r\n\tTEXT_DEFILER5  = 0x122,\r\n\tTEXT_NAKRUL1   = 0x123,\r\n\tTEXT_NAKRUL2   = 0x124,\r\n\tTEXT_NAKRUL3   = 0x125,\r\n\tTEXT_NAKRUL4   = 0x126,\r\n\tTEXT_NAKRUL5   = 0x127,\r\n\tTEXT_CORNSTN   = 0x128,\r\n\tTEXT_JERSEY1   = 0x129,\r\n\tTEXT_JERSEY2   = 0x12A,\r\n\tTEXT_JERSEY3   = 0x12B,\r\n\tTEXT_JERSEY4   = 0x12C,\r\n\tTEXT_JERSEY5   = 0x12D,\r\n\tTEXT_JERSEY6   = 0x12E,\r\n\tTEXT_JERSEY7   = 0x12F,\r\n\tTEXT_JERSEY8   = 0x130,\r\n\tTEXT_JERSEY9   = 0x131,\r\n\tTEXT_TRADER    = 0x132,\r\n\tTEXT_FARMER6   = 0x133,\r\n\tTEXT_FARMER7   = 0x134,\r\n\tTEXT_FARMER8   = 0x135,\r\n\tTEXT_FARMER9   = 0x136,\r\n\tTEXT_FARMER10  = 0x137,\r\n\tTEXT_JERSEY10  = 0x138,\r\n\tTEXT_JERSEY11  = 0x139,\r\n\tTEXT_JERSEY12  = 0x13A,\r\n\tTEXT_JERSEY13  = 0x13B,\r\n\tTEXT_SKLJRN    = 0x13C,\r\n\tTEXT_BOOK4     = 0x13D,\r\n\tTEXT_BOOK5     = 0x13E,\r\n\tTEXT_BOOK6     = 0x13F,\r\n\tTEXT_BOOK7     = 0x140,\r\n\tTEXT_BOOK8     = 0x141,\r\n\tTEXT_BOOK9     = 0x142,\r\n\tTEXT_BOOKA     = 0x143,\r\n\tTEXT_BOOKB     = 0x144,\r\n\tTEXT_BOOKC     = 0x145,\r\n\tTEXT_OBOOKA    = 0x146,\r\n\tTEXT_OBOOKB    = 0x147,\r\n\tTEXT_OBOOKC    = 0x148,\r\n\tTEXT_MBOOKA    = 0x149,\r\n\tTEXT_MBOOKB    = 0x14A,\r\n\tTEXT_MBOOKC    = 0x14B,\r\n\tTEXT_RBOOKA    = 0x14C,\r\n\tTEXT_RBOOKB    = 0x14D,\r\n\tTEXT_RBOOKC    = 0x14E,\r\n\tTEXT_BBOOKA    = 0x14F,\r\n\tTEXT_BBOOKB    = 0x150,\r\n\tTEXT_BBOOKC    = 0x151,\r\n#endif\r\n} _speech_id;\r\n\r\ntypedef enum object_graphic_id {\r\n\tOFILE_L1BRAZ   = 0x0,\r\n\tOFILE_L1DOORS  = 0x1,\r\n\tOFILE_LEVER    = 0x2,\r\n\tOFILE_CHEST1   = 0x3,\r\n\tOFILE_CHEST2   = 0x4,\r\n\tOFILE_BANNER   = 0x5,\r\n\tOFILE_SKULPILE = 0x6,\r\n\tOFILE_SKULFIRE = 0x7,\r\n\tOFILE_SKULSTIK = 0x8,\r\n\tOFILE_CRUXSK1  = 0x9,\r\n\tOFILE_CRUXSK2  = 0xA,\r\n\tOFILE_CRUXSK3  = 0xB,\r\n\tOFILE_BOOK1    = 0xC,\r\n\tOFILE_BOOK2    = 0xD,\r\n\tOFILE_ROCKSTAN = 0xE,\r\n\tOFILE_ANGEL    = 0xF,\r\n\tOFILE_CHEST3   = 0x10,\r\n\tOFILE_BURNCROS = 0x11,\r\n\tOFILE_CANDLE2  = 0x12,\r\n\tOFILE_NUDE2    = 0x13,\r\n\tOFILE_SWITCH4  = 0x14,\r\n\tOFILE_TNUDEM   = 0x15,\r\n\tOFILE_TNUDEW   = 0x16,\r\n\tOFILE_TSOUL    = 0x17,\r\n\tOFILE_L2DOORS  = 0x18,\r\n\tOFILE_WTORCH4  = 0x19,\r\n\tOFILE_WTORCH3  = 0x1A,\r\n\tOFILE_SARC     = 0x1B,\r\n\tOFILE_FLAME1   = 0x1C,\r\n\tOFILE_PRSRPLT1 = 0x1D,\r\n\tOFILE_TRAPHOLE = 0x1E,\r\n\tOFILE_MINIWATR = 0x1F,\r\n\tOFILE_WTORCH2  = 0x20,\r\n\tOFILE_WTORCH1  = 0x21,\r\n\tOFILE_BCASE    = 0x22,\r\n\tOFILE_BSHELF   = 0x23,\r\n\tOFILE_WEAPSTND = 0x24,\r\n\tOFILE_BARREL   = 0x25,\r\n\tOFILE_BARRELEX = 0x26,\r\n\tOFILE_LSHRINEG = 0x27,\r\n\tOFILE_RSHRINEG = 0x28,\r\n\tOFILE_BLOODFNT = 0x29,\r\n\tOFILE_DECAP    = 0x2A,\r\n\tOFILE_PEDISTL  = 0x2B,\r\n\tOFILE_L3DOORS  = 0x2C,\r\n\tOFILE_PFOUNTN  = 0x2D,\r\n\tOFILE_ARMSTAND = 0x2E,\r\n\tOFILE_GOATSHRN = 0x2F,\r\n\tOFILE_CAULDREN = 0x30,\r\n\tOFILE_MFOUNTN  = 0x31,\r\n\tOFILE_TFOUNTN  = 0x32,\r\n\tOFILE_ALTBOY   = 0x33,\r\n\tOFILE_MCIRL    = 0x34,\r\n\tOFILE_BKSLBRNT = 0x35,\r\n\tOFILE_MUSHPTCH = 0x36,\r\n\tOFILE_LZSTAND  = 0x37,\r\n} object_graphic_id;\r\n\r\ntypedef enum dungeon_type {\r\n\tDTYPE_TOWN      = 0x0,\r\n\tDTYPE_CATHEDRAL = 0x1,\r\n\tDTYPE_CATACOMBS = 0x2,\r\n\tDTYPE_CAVES     = 0x3,\r\n\tDTYPE_HELL      = 0x4,\r\n#ifdef HELLFIRE\r\n\tDTYPE_NEST      = 0x5,\r\n\tDTYPE_CRYPT     = 0x6,\r\n#endif\r\n\tDTYPE_NONE      = 0xFF,\r\n} dungeon_type;\r\n\r\ntypedef enum dflag {\r\n\tBFLAG_MISSILE     = 0x01,\r\n\tBFLAG_VISIBLE     = 0x02,\r\n\tBFLAG_DEAD_PLAYER = 0x04,\r\n\tBFLAG_POPULATED   = 0x08,\r\n\tBFLAG_MONSTLR     = 0x10,\r\n\tBFLAG_PLAYERLR    = 0x20,\r\n\tBFLAG_LIT         = 0x40,\r\n\tBFLAG_EXPLORED    = 0x80,\r\n} dflag;\r\n\r\ntypedef enum clicktype {\r\n\tCLICK_NONE  = 0,\r\n\tCLICK_LEFT  = 1,\r\n\tCLICK_RIGHT = 2,\r\n} clicktype;\r\n\r\ntypedef enum placeflag {\r\n\tPLACE_SCATTER = 1,\r\n\tPLACE_SPECIAL = 2,\r\n\tPLACE_UNIQUE  = 4,\r\n} placeflag;\r\n\r\ntypedef enum mienemy_type {\r\n\tTARGET_MONSTERS = 0,\r\n\tTARGET_PLAYERS  = 1,\r\n\tTARGET_BOTH     = 2,\r\n} mienemy_type;\r\n\r\n/*\r\nLooks like someone treated hex values as binary, so 0x10 came after 0x01, that's why we have 1 and 16, they did the same thing with affix_item_type\r\n*/\r\ntypedef enum goodorevil {\r\n\tGOE_ANY  = 0x00,\r\n\tGOE_EVIL = 0x01,\r\n\tGOE_GOOD = 0x10,\r\n} goodorevil;\r\n\r\n/*\r\n First 5 bits store level\r\n 6th bit stores onlygood flag\r\n 7th bit stores uper15 flag - uper means unique percent, this flag is true for unique monsters and loot from them has 15% to become unique\r\n 8th bit stores uper1 flag - this is loot from normal monsters, which has 1% to become unique\r\n 9th bit stores info if item is unique\r\n 10th bit stores info if item is a basic one from griswold\r\n 11th bit stores info if item is a premium one from griswold\r\n 12th bit stores info if item is from wirt\r\n 13th bit stores info if item is from adria\r\n 14th bit stores info if item is from pepin\r\n 15th bit stores pregen flag\r\n\r\n combining CF_UPER15 and CF_UPER1 flags (CF_USEFUL) is used to mark potions and town portal scrolls created on the ground\r\n CF_TOWN is combining all store flags and indicates if item has been bought from a NPC\r\n */\r\ntypedef enum icreateinfo_flag {\r\n\tCF_LEVEL        = (1 << 6) - 1,\r\n\tCF_ONLYGOOD     = 1 << 6,\r\n\tCF_UPER15       = 1 << 7,\r\n\tCF_UPER1        = 1 << 8,\r\n\tCF_UNIQUE       = 1 << 9,\r\n\tCF_SMITH        = 1 << 10,\r\n\tCF_SMITHPREMIUM = 1 << 11,\r\n\tCF_BOY          = 1 << 12,\r\n\tCF_WITCH        = 1 << 13,\r\n\tCF_HEALER       = 1 << 14,\r\n\tCF_PREGEN       = 1 << 15,\r\n\r\n\tCF_USEFUL = CF_UPER15 | CF_UPER1,\r\n\tCF_TOWN   = CF_SMITH | CF_SMITHPREMIUM | CF_BOY | CF_WITCH | CF_HEALER,\r\n} icreateinfo_flag;\r\n\r\ntypedef enum dungeon_message {\r\n\tDMSG_CATHEDRAL = 1 << 0,\r\n\tDMSG_CATACOMBS = 1 << 1,\r\n\tDMSG_CAVES     = 1 << 2,\r\n\tDMSG_HELL      = 1 << 3,\r\n\tDMSG_DIABLO    = 1 << 4,\r\n} dungeon_message;\r\n\r\ntypedef enum diablo_message {\r\n\tEMSG_NONE                   = 0,\r\n\tEMSG_NO_AUTOMAP_IN_TOWN     = 1,\r\n\tEMSG_NO_MULTIPLAYER_IN_DEMO = 2,\r\n\tEMSG_DIRECT_SOUND_FAILED    = 3,\r\n\tEMSG_NOT_IN_SHAREWARE       = 4,\r\n\tEMSG_NO_SPACE_TO_SAVE       = 5,\r\n\tEMSG_NO_PAUSE_IN_TOWN       = 6,\r\n\tEMSG_COPY_TO_HDD            = 7,\r\n\tEMSG_DESYNC                 = 8,\r\n\tEMSG_NO_PAUSE_IN_MP         = 9,\r\n\tEMSG_LOADING                = 10,\r\n\tEMSG_SAVING                 = 11,\r\n\tEMSG_SHRINE_MYSTERIOUS      = 12,\r\n\tEMSG_SHRINE_HIDDEN          = 13,\r\n\tEMSG_SHRINE_GLOOMY          = 14,\r\n\tEMSG_SHRINE_WEIRD           = 15,\r\n\tEMSG_SHRINE_MAGICAL         = 16,\r\n\tEMSG_SHRINE_STONE           = 17,\r\n\tEMSG_SHRINE_RELIGIOUS       = 18,\r\n\tEMSG_SHRINE_ENCHANTED       = 19,\r\n\tEMSG_SHRINE_THAUMATURGIC    = 20,\r\n\tEMSG_SHRINE_FASCINATING     = 21,\r\n\tEMSG_SHRINE_CRYPTIC         = 22,\r\n\tEMSG_SHRINE_UNUSED          = 23,\r\n\tEMSG_SHRINE_ELDRITCH        = 24,\r\n\tEMSG_SHRINE_EERIE           = 25,\r\n\tEMSG_SHRINE_DIVINE          = 26,\r\n\tEMSG_SHRINE_HOLY            = 27,\r\n\tEMSG_SHRINE_SACRED          = 28,\r\n\tEMSG_SHRINE_SPIRITUAL       = 29,\r\n\tEMSG_SHRINE_SPOOKY1         = 30,\r\n\tEMSG_SHRINE_SPOOKY2         = 31,\r\n\tEMSG_SHRINE_ABANDONED       = 32,\r\n\tEMSG_SHRINE_CREEPY          = 33,\r\n\tEMSG_SHRINE_QUIET           = 34,\r\n\tEMSG_SHRINE_SECLUDED        = 35,\r\n\tEMSG_SHRINE_ORNATE          = 36,\r\n\tEMSG_SHRINE_GLIMMERING      = 37,\r\n\tEMSG_SHRINE_TAINTED1        = 38,\r\n\tEMSG_SHRINE_TAINTED2        = 39,\r\n\tEMSG_REQUIRES_LVL_8         = 40,\r\n\tEMSG_REQUIRES_LVL_13        = 41,\r\n\tEMSG_REQUIRES_LVL_17        = 42,\r\n\tEMSG_BONECHAMB              = 43,\r\n#ifdef HELLFIRE\r\n\tEMSG_SHRINE_OILY            = 44,\r\n\tEMSG_SHRINE_GLOWING         = 45,\r\n\tEMSG_SHRINE_MENDICANT       = 46,\r\n\tEMSG_SHRINE_SPARKLING       = 47,\r\n\tEMSG_SHRINE_TOWN            = 48,\r\n\tEMSG_SHRINE_SHIMMERING      = 49,\r\n\tEMSG_SHRINE_SOLAR1          = 50,\r\n\tEMSG_SHRINE_SOLAR2          = 51,\r\n\tEMSG_SHRINE_SOLAR3          = 52,\r\n\tEMSG_SHRINE_SOLAR4          = 53,\r\n\tEMSG_SHRINE_MURPHYS         = 54,\r\n#endif\r\n} diablo_message;\r\n\r\ntypedef enum magic_type {\r\n\tSTYPE_FIRE      = 0x0,\r\n\tSTYPE_LIGHTNING = 0x1,\r\n\tSTYPE_MAGIC     = 0x2,\r\n} magic_type;\r\n\r\ntypedef enum theme_id {\r\n\tTHEME_BARREL            = 0x0,\r\n\tTHEME_SHRINE            = 0x1,\r\n\tTHEME_MONSTPIT          = 0x2,\r\n\tTHEME_SKELROOM          = 0x3,\r\n\tTHEME_TREASURE          = 0x4,\r\n\tTHEME_LIBRARY           = 0x5,\r\n\tTHEME_TORTURE           = 0x6,\r\n\tTHEME_BLOODFOUNTAIN     = 0x7,\r\n\tTHEME_DECAPITATED       = 0x8,\r\n\tTHEME_PURIFYINGFOUNTAIN = 0x9,\r\n\tTHEME_ARMORSTAND        = 0xA,\r\n\tTHEME_GOATSHRINE        = 0xB,\r\n\tTHEME_CAULDRON          = 0xC,\r\n\tTHEME_MURKYFOUNTAIN     = 0xD,\r\n\tTHEME_TEARFOUNTAIN      = 0xE,\r\n\tTHEME_BRNCROSS          = 0xF,\r\n\tTHEME_WEAPONRACK        = 0x10,\r\n\tTHEME_NONE              = -1,\r\n} theme_id;\r\n\r\ntypedef enum event_type {\r\n\tEVENT_TYPE_PLAYER_CREATE_GAME = 1,\r\n\tEVENT_TYPE_2                  = 2,\r\n\tEVENT_TYPE_PLAYER_LEAVE_GAME  = 3,\r\n\tEVENT_TYPE_PLAYER_MESSAGE     = 4,\r\n\tEVENT_TYPE_5                  = 5,\r\n\tEVENT_TYPE_6                  = 6,\r\n\tEVENT_TYPE_7                  = 7,\r\n\tEVENT_TYPE_8                  = 8,\r\n\tEVENT_TYPE_9                  = 9,\r\n\tEVENT_TYPE_10                 = 10,\r\n\tEVENT_TYPE_11                 = 11,\r\n\tEVENT_TYPE_12                 = 12,\r\n\tEVENT_TYPE_13                 = 13,\r\n\tEVENT_TYPE_14                 = 14,\r\n\tEVENT_TYPE_15                 = 15,\r\n} event_type;\r\n\r\ntypedef enum _copyprot_results {\r\n\tCOPYPROT_OK     = 1,\r\n\tCOPYPROT_CANCEL = 2,\r\n} _copyprot_results;\r\n\r\ntypedef enum text_color {\r\n\tCOL_WHITE = 0x0,\r\n\tCOL_BLUE  = 0x1,\r\n\tCOL_RED   = 0x2,\r\n\tCOL_GOLD  = 0x3,\r\n} text_color;\r\n\r\ntypedef enum item_color {\r\n\tICOL_WHITE = PAL16_YELLOW + 5,\r\n\tICOL_BLUE  = PAL16_BLUE + 5,\r\n\tICOL_RED   = PAL16_RED + 5,\r\n} item_color;\r\n\r\ntypedef enum _difficulty {\r\n\tDIFF_NORMAL      = 0x0,\r\n\tDIFF_NIGHTMARE   = 0x1,\r\n\tDIFF_HELL        = 0x2,\r\n\tNUM_DIFFICULTIES = 0x3,\r\n} _difficulty;\r\n\r\ntypedef enum MON_MODE {\r\n\tMM_STAND     = 0,\r\n\tMM_WALK      = 1,\r\n\tMM_WALK2     = 2,\r\n\tMM_WALK3     = 3,\r\n\tMM_ATTACK    = 4,\r\n\tMM_GOTHIT    = 5,\r\n\tMM_DEATH     = 6,\r\n\tMM_SATTACK   = 7,\r\n\tMM_FADEIN    = 8,\r\n\tMM_FADEOUT   = 9,\r\n\tMM_RATTACK   = 10,\r\n\tMM_SPSTAND   = 11,\r\n\tMM_RSPATTACK = 12,\r\n\tMM_DELAY     = 13,\r\n\tMM_CHARGE    = 14,\r\n\tMM_STONE     = 15,\r\n\tMM_HEAL      = 16,\r\n\tMM_TALK      = 17,\r\n} MON_MODE;\r\n\r\ntypedef enum MON_ANIM {\r\n\tMA_STAND   = 0,\r\n\tMA_WALK    = 1,\r\n\tMA_ATTACK  = 2,\r\n\tMA_GOTHIT  = 3,\r\n\tMA_DEATH   = 4,\r\n\tMA_SPECIAL = 5,\r\n} MON_ANIM;\r\n\r\ntypedef enum PLR_MODE {\r\n\tPM_STAND   = 0,\r\n\tPM_WALK    = 1,\r\n\tPM_WALK2   = 2,\r\n\tPM_WALK3   = 3,\r\n\tPM_ATTACK  = 4,\r\n\tPM_RATTACK = 5,\r\n\tPM_BLOCK   = 6,\r\n\tPM_GOTHIT  = 7,\r\n\tPM_DEATH   = 8,\r\n\tPM_SPELL   = 9,\r\n\tPM_NEWLVL  = 10,\r\n\tPM_QUIT    = 11,\r\n} PLR_MODE;\r\n\r\ntypedef enum spell_type {\r\n\tRSPLTYPE_SKILL   = 0x0,\r\n\tRSPLTYPE_SPELL   = 0x1,\r\n\tRSPLTYPE_SCROLL  = 0x2,\r\n\tRSPLTYPE_CHARGES = 0x3,\r\n\tRSPLTYPE_INVALID = 0x4,\r\n} spell_type;\r\n\r\ntypedef enum cursor_id {\r\n\tCURSOR_NONE        = 0x0,\r\n\tCURSOR_HAND        = 0x1,\r\n\tCURSOR_IDENTIFY    = 0x2,\r\n\tCURSOR_REPAIR      = 0x3,\r\n\tCURSOR_RECHARGE    = 0x4,\r\n\tCURSOR_DISARM      = 0x5,\r\n\tCURSOR_OIL         = 0x6,\r\n\tCURSOR_TELEKINESIS = 0x7,\r\n\tCURSOR_RESURRECT   = 0x8,\r\n\tCURSOR_TELEPORT    = 0x9,\r\n\tCURSOR_HEALOTHER   = 0xA,\r\n\tCURSOR_HOURGLASS   = 0xB,\r\n\tCURSOR_FIRSTITEM   = 0xC,\r\n} cursor_id;\r\n\r\ntypedef enum direction {\r\n\tDIR_S    = 0x0,\r\n\tDIR_SW   = 0x1,\r\n\tDIR_W    = 0x2,\r\n\tDIR_NW   = 0x3,\r\n\tDIR_N    = 0x4,\r\n\tDIR_NE   = 0x5,\r\n\tDIR_E    = 0x6,\r\n\tDIR_SE   = 0x7,\r\n\tDIR_OMNI = 0x8,\r\n} direction;\r\n\r\ntypedef enum _scroll_direction {\r\n\tSDIR_NONE = 0x0,\r\n\tSDIR_N    = 0x1,\r\n\tSDIR_NE   = 0x2,\r\n\tSDIR_E    = 0x3,\r\n\tSDIR_SE   = 0x4,\r\n\tSDIR_S    = 0x5,\r\n\tSDIR_SW   = 0x6,\r\n\tSDIR_W    = 0x7,\r\n\tSDIR_NW   = 0x8,\r\n} _scroll_direction;\r\n\r\ntypedef enum interface_mode {\r\n\tWM_DIABNEXTLVL  = 0x402, // WM_USER+2\r\n\tWM_DIABPREVLVL  = 0x403,\r\n\tWM_DIABRTNLVL   = 0x404,\r\n\tWM_DIABSETLVL   = 0x405,\r\n\tWM_DIABWARPLVL  = 0x406,\r\n\tWM_DIABTOWNWARP = 0x407,\r\n\tWM_DIABTWARPUP  = 0x408,\r\n\tWM_DIABRETOWN   = 0x409,\r\n\tWM_DIABNEWGAME  = 0x40A,\r\n\tWM_DIABLOADGAME = 0x40B\r\n\t// WM_LEIGHSKIP = 0x40C, // psx only\r\n\t// WM_DIAVNEWLVL = 0x40D, // psx only\r\n} interface_mode;\r\n\r\ntypedef enum lvl_entry {\r\n\tENTRY_MAIN    = 0,\r\n\tENTRY_PREV    = 1,\r\n\tENTRY_SETLVL  = 2,\r\n\tENTRY_RTNLVL  = 3,\r\n\tENTRY_LOAD    = 4,\r\n\tENTRY_WARPLVL = 5,\r\n\tENTRY_TWARPDN = 6,\r\n\tENTRY_TWARPUP = 7,\r\n} lvl_entry;\r\n\r\ntypedef enum game_info {\r\n\tGAMEINFO_NAME         = 1,\r\n\tGAMEINFO_PASSWORD     = 2,\r\n\tGAMEINFO_STATS        = 3,\r\n\tGAMEINFO_MODEFLAG     = 4,\r\n\tGAMEINFO_GAMETEMPLATE = 5,\r\n\tGAMEINFO_PLAYERS      = 6,\r\n} game_info;\r\n\r\ntypedef enum spell_id {\r\n\tSPL_NULL        = 0x0,\r\n\tSPL_FIREBOLT    = 0x1,\r\n\tSPL_HEAL        = 0x2,\r\n\tSPL_LIGHTNING   = 0x3,\r\n\tSPL_FLASH       = 0x4,\r\n\tSPL_IDENTIFY    = 0x5,\r\n\tSPL_FIREWALL    = 0x6,\r\n\tSPL_TOWN        = 0x7,\r\n\tSPL_STONE       = 0x8,\r\n\tSPL_INFRA       = 0x9,\r\n\tSPL_RNDTELEPORT = 0xA,\r\n\tSPL_MANASHIELD  = 0xB,\r\n\tSPL_FIREBALL    = 0xC,\r\n\tSPL_GUARDIAN    = 0xD,\r\n\tSPL_CHAIN       = 0xE,\r\n\tSPL_WAVE        = 0xF,\r\n\tSPL_DOOMSERP    = 0x10,\r\n\tSPL_BLODRIT     = 0x11,\r\n\tSPL_NOVA        = 0x12,\r\n\tSPL_INVISIBIL   = 0x13,\r\n\tSPL_FLAME       = 0x14,\r\n\tSPL_GOLEM       = 0x15,\r\n\tSPL_BLODBOIL    = 0x16,\r\n\tSPL_TELEPORT    = 0x17,\r\n\tSPL_APOCA       = 0x18,\r\n\tSPL_ETHEREALIZE = 0x19,\r\n\tSPL_REPAIR      = 0x1A,\r\n\tSPL_RECHARGE    = 0x1B,\r\n\tSPL_DISARM      = 0x1C,\r\n\tSPL_ELEMENT     = 0x1D,\r\n\tSPL_CBOLT       = 0x1E,\r\n\tSPL_HBOLT       = 0x1F,\r\n\tSPL_RESURRECT   = 0x20,\r\n\tSPL_TELEKINESIS = 0x21,\r\n\tSPL_HEALOTHER   = 0x22,\r\n\tSPL_FLARE       = 0x23,\r\n\tSPL_BONESPIRIT  = 0x24,\r\n#ifdef HELLFIRE\r\n\tSPL_MANA        = 0x25,\r\n\tSPL_MAGI        = 0x26,\r\n\tSPL_JESTER      = 0x27,\r\n\tSPL_LIGHTWALL   = 0x28,\r\n\tSPL_IMMOLAT     = 0x29,\r\n\tSPL_WARP        = 0x2A,\r\n\tSPL_REFLECT     = 0x2B,\r\n\tSPL_BERSERK     = 0x2C,\r\n\tSPL_FIRERING    = 0x2D,\r\n\tSPL_SEARCH      = 0x2E,\r\n\tSPL_RUNEFIRE    = 0x2F,\r\n\tSPL_RUNELIGHT   = 0x30,\r\n\tSPL_RUNENOVA    = 0x31,\r\n\tSPL_RUNEIMMOLAT = 0x32,\r\n\tSPL_RUNESTONE   = 0x33,\r\n#endif\r\n\tSPL_INVALID     = -1,\r\n} spell_id;\r\n\r\ntypedef enum _cmd_id {\r\n\tCMD_STAND,\r\n\tCMD_WALKXY,\r\n\tCMD_ACK_PLRINFO,\r\n\tCMD_ADDSTR,\r\n\tCMD_ADDMAG,\r\n\tCMD_ADDDEX,\r\n\tCMD_ADDVIT,\r\n\tCMD_SBSPELL,\r\n\tCMD_GETITEM,\r\n\tCMD_AGETITEM,\r\n\tCMD_PUTITEM,\r\n\tCMD_RESPAWNITEM,\r\n\tCMD_ATTACKXY,\r\n\tCMD_RATTACKXY,\r\n\tCMD_SPELLXY,\r\n\tCMD_TSPELLXY,\r\n\tCMD_OPOBJXY,\r\n\tCMD_DISARMXY,\r\n\tCMD_ATTACKID,\r\n\tCMD_ATTACKPID,\r\n\tCMD_RATTACKID,\r\n\tCMD_RATTACKPID,\r\n\tCMD_SPELLID,\r\n\tCMD_SPELLPID,\r\n\tCMD_TSPELLID,\r\n\tCMD_TSPELLPID,\r\n\tCMD_RESURRECT,\r\n\tCMD_OPOBJT,\r\n\tCMD_KNOCKBACK,\r\n\tCMD_TALKXY,\r\n\tCMD_NEWLVL,\r\n\tCMD_WARP,\r\n\tCMD_CHEAT_EXPERIENCE,\r\n\tCMD_CHEAT_SPELL_LEVEL,\r\n\tCMD_DEBUG,\r\n\tCMD_SYNCDATA,\r\n\tCMD_MONSTDEATH,\r\n\tCMD_MONSTDAMAGE,\r\n\tCMD_PLRDEAD,\r\n\tCMD_REQUESTGITEM,\r\n\tCMD_REQUESTAGITEM,\r\n\tCMD_GOTOGETITEM,\r\n\tCMD_GOTOAGETITEM,\r\n\tCMD_OPENDOOR,\r\n\tCMD_CLOSEDOOR,\r\n\tCMD_OPERATEOBJ,\r\n\tCMD_PLROPOBJ,\r\n\tCMD_BREAKOBJ,\r\n\tCMD_CHANGEPLRITEMS,\r\n\tCMD_DELPLRITEMS,\r\n\tCMD_PLRDAMAGE,\r\n\tCMD_PLRLEVEL,\r\n\tCMD_DROPITEM,\r\n\tCMD_PLAYER_JOINLEVEL,\r\n\tCMD_SEND_PLRINFO,\r\n\tCMD_SATTACKXY,\r\n\tCMD_ACTIVATEPORTAL,\r\n\tCMD_DEACTIVATEPORTAL,\r\n\tCMD_DLEVEL_0,\r\n\tCMD_DLEVEL_1,\r\n\tCMD_DLEVEL_2,\r\n\tCMD_DLEVEL_3,\r\n\tCMD_DLEVEL_4,\r\n\tCMD_DLEVEL_5,\r\n\tCMD_DLEVEL_6,\r\n\tCMD_DLEVEL_7,\r\n\tCMD_DLEVEL_8,\r\n\tCMD_DLEVEL_9,\r\n\tCMD_DLEVEL_10,\r\n\tCMD_DLEVEL_11,\r\n\tCMD_DLEVEL_12,\r\n\tCMD_DLEVEL_13,\r\n\tCMD_DLEVEL_14,\r\n\tCMD_DLEVEL_15,\r\n\tCMD_DLEVEL_16,\r\n#ifdef HELLFIRE\r\n\tCMD_DLEVEL_17,\r\n\tCMD_DLEVEL_18,\r\n\tCMD_DLEVEL_19,\r\n\tCMD_DLEVEL_20,\r\n\tCMD_DLEVEL_21,\r\n\tCMD_DLEVEL_22,\r\n\tCMD_DLEVEL_23,\r\n\tCMD_DLEVEL_24,\r\n#endif\r\n\tCMD_DLEVEL_JUNK,\r\n\tCMD_DLEVEL_END,\r\n\tCMD_HEALOTHER,\r\n\tCMD_STRING,\r\n\tCMD_SETSTR,\r\n\tCMD_SETMAG,\r\n\tCMD_SETDEX,\r\n\tCMD_SETVIT,\r\n\tCMD_RETOWN,\r\n\tCMD_SPELLXYD,\r\n\tCMD_ITEMEXTRA,\r\n\tCMD_SYNCPUTITEM,\r\n\tCMD_KILLGOLEM,\r\n\tCMD_SYNCQUEST,\r\n\tCMD_ENDSHIELD,\r\n\tCMD_AWAKEGOLEM,\r\n#ifdef HELLFIRE\r\n\tCMD_REFLECT,\r\n\tCMD_NAKRUL,\r\n\tCMD_OPENHIVE,\r\n\tCMD_OPENCRYPT,\r\n#else\r\n\tCMD_NOVA,\r\n\tCMD_SETSHIELD,\r\n\tCMD_REMSHIELD,\r\n#endif\r\n\tFAKE_CMD_SETID,\r\n\tFAKE_CMD_DROPID,\r\n\tNUM_CMDS,\r\n} _cmd_id;\r\n\r\ntypedef enum _talker_id {\r\n\tTOWN_SMITH   = 0x0,\r\n\tTOWN_HEALER  = 0x1,\r\n\tTOWN_DEADGUY = 0x2,\r\n\tTOWN_TAVERN  = 0x3,\r\n\tTOWN_STORY   = 0x4,\r\n\tTOWN_DRUNK   = 0x5,\r\n\tTOWN_WITCH   = 0x6,\r\n\tTOWN_BMAID   = 0x7,\r\n\tTOWN_PEGBOY  = 0x8,\r\n\tTOWN_COW     = 0x9,\r\n#ifdef HELLFIRE\r\n\tTOWN_FARMER  = 0xA,\r\n\tTOWN_GIRL    = 0xB,\r\n\tTOWN_COWFARM = 0xC,\r\n#else\r\n\tTOWN_PRIEST  = 0xA,\r\n#endif\r\n} _talker_id;\r\n\r\ntypedef enum _music_id {\r\n\tTMUSIC_TOWN,\r\n\tTMUSIC_L1,\r\n\tTMUSIC_L2,\r\n\tTMUSIC_L3,\r\n\tTMUSIC_L4,\r\n#ifdef HELLFIRE\r\n\tTMUSIC_L5,\r\n\tTMUSIC_L6,\r\n#endif\r\n\tTMUSIC_INTRO,\r\n\tNUM_MUSIC,\r\n} _music_id;\r\n\r\ntypedef enum _mainmenu_selections {\r\n\tMAINMENU_SINGLE_PLAYER = 1,\r\n\tMAINMENU_MULTIPLAYER,\r\n\tMAINMENU_REPLAY_INTRO,\r\n#ifdef HELLFIRE\r\n\tMAINMENU_SHOW_SUPPORT,\r\n#endif\r\n\tMAINMENU_SHOW_CREDITS,\r\n\tMAINMENU_EXIT_DIABLO,\r\n\tMAINMENU_ATTRACT_MODE,\r\n} _mainmenu_selections;\r\n\r\ntypedef enum _selhero_selections {\r\n\tSELHERO_NEW_DUNGEON = 1,\r\n\tSELHERO_CONTINUE    = 2,\r\n\tSELHERO_CONNECT     = 3,\r\n\tSELHERO_PREVIOUS    = 4\r\n} _selhero_selections;\r\n\r\ntypedef enum panel_button_id {\r\n\tPANBTN_CHARINFO  = 0,\r\n\tPANBTN_QLOG      = 1,\r\n\tPANBTN_AUTOMAP   = 2,\r\n\tPANBTN_MAINMENU  = 3,\r\n\tPANBTN_INVENTORY = 4,\r\n\tPANBTN_SPELLBOOK = 5,\r\n\tPANBTN_SENDMSG   = 6,\r\n\tPANBTN_FRIENDLY  = 7,\r\n} panel_button_id;\r\n\r\ntypedef enum attribute_id {\r\n\tATTRIB_STR = 0,\r\n\tATTRIB_MAG = 1,\r\n\tATTRIB_DEX = 2,\r\n\tATTRIB_VIT = 3,\r\n} attribute_id;\r\n\r\ntypedef enum _object_id {\r\n\tOBJ_L1LIGHT      = 0x0,\r\n\tOBJ_L1LDOOR      = 0x1,\r\n\tOBJ_L1RDOOR      = 0x2,\r\n\tOBJ_SKFIRE       = 0x3,\r\n\tOBJ_LEVER        = 0x4,\r\n\tOBJ_CHEST1       = 0x5,\r\n\tOBJ_CHEST2       = 0x6,\r\n\tOBJ_CHEST3       = 0x7,\r\n\tOBJ_CANDLE1      = 0x8,\r\n\tOBJ_CANDLE2      = 0x9,\r\n\tOBJ_CANDLEO      = 0xA,\r\n\tOBJ_BANNERL      = 0xB,\r\n\tOBJ_BANNERM      = 0xC,\r\n\tOBJ_BANNERR      = 0xD,\r\n\tOBJ_SKPILE       = 0xE,\r\n\tOBJ_SKSTICK1     = 0xF,\r\n\tOBJ_SKSTICK2     = 0x10,\r\n\tOBJ_SKSTICK3     = 0x11,\r\n\tOBJ_SKSTICK4     = 0x12,\r\n\tOBJ_SKSTICK5     = 0x13,\r\n\tOBJ_CRUX1        = 0x14,\r\n\tOBJ_CRUX2        = 0x15,\r\n\tOBJ_CRUX3        = 0x16,\r\n\tOBJ_STAND        = 0x17,\r\n\tOBJ_ANGEL        = 0x18,\r\n\tOBJ_BOOK2L       = 0x19,\r\n\tOBJ_BCROSS       = 0x1A,\r\n\tOBJ_NUDEW2R      = 0x1B,\r\n\tOBJ_SWITCHSKL    = 0x1C,\r\n\tOBJ_TNUDEM1      = 0x1D,\r\n\tOBJ_TNUDEM2      = 0x1E,\r\n\tOBJ_TNUDEM3      = 0x1F,\r\n\tOBJ_TNUDEM4      = 0x20,\r\n\tOBJ_TNUDEW1      = 0x21,\r\n\tOBJ_TNUDEW2      = 0x22,\r\n\tOBJ_TNUDEW3      = 0x23,\r\n\tOBJ_TORTURE1     = 0x24,\r\n\tOBJ_TORTURE2     = 0x25,\r\n\tOBJ_TORTURE3     = 0x26,\r\n\tOBJ_TORTURE4     = 0x27,\r\n\tOBJ_TORTURE5     = 0x28,\r\n\tOBJ_BOOK2R       = 0x29,\r\n\tOBJ_L2LDOOR      = 0x2A,\r\n\tOBJ_L2RDOOR      = 0x2B,\r\n\tOBJ_TORCHL       = 0x2C,\r\n\tOBJ_TORCHR       = 0x2D,\r\n\tOBJ_TORCHL2      = 0x2E,\r\n\tOBJ_TORCHR2      = 0x2F,\r\n\tOBJ_SARC         = 0x30,\r\n\tOBJ_FLAMEHOLE    = 0x31,\r\n\tOBJ_FLAMELVR     = 0x32,\r\n\tOBJ_WATER        = 0x33,\r\n\tOBJ_BOOKLVR      = 0x34,\r\n\tOBJ_TRAPL        = 0x35,\r\n\tOBJ_TRAPR        = 0x36,\r\n\tOBJ_BOOKSHELF    = 0x37,\r\n\tOBJ_WEAPRACK     = 0x38,\r\n\tOBJ_BARREL       = 0x39,\r\n\tOBJ_BARRELEX     = 0x3A,\r\n\tOBJ_SHRINEL      = 0x3B,\r\n\tOBJ_SHRINER      = 0x3C,\r\n\tOBJ_SKELBOOK     = 0x3D,\r\n\tOBJ_BOOKCASEL    = 0x3E,\r\n\tOBJ_BOOKCASER    = 0x3F,\r\n\tOBJ_BOOKSTAND    = 0x40,\r\n\tOBJ_BOOKCANDLE   = 0x41,\r\n\tOBJ_BLOODFTN     = 0x42,\r\n\tOBJ_DECAP        = 0x43,\r\n\tOBJ_TCHEST1      = 0x44,\r\n\tOBJ_TCHEST2      = 0x45,\r\n\tOBJ_TCHEST3      = 0x46,\r\n\tOBJ_BLINDBOOK    = 0x47,\r\n\tOBJ_BLOODBOOK    = 0x48,\r\n\tOBJ_PEDISTAL     = 0x49,\r\n\tOBJ_L3LDOOR      = 0x4A,\r\n\tOBJ_L3RDOOR      = 0x4B,\r\n\tOBJ_PURIFYINGFTN = 0x4C,\r\n\tOBJ_ARMORSTAND   = 0x4D,\r\n\tOBJ_ARMORSTANDN  = 0x4E,\r\n\tOBJ_GOATSHRINE   = 0x4F,\r\n\tOBJ_CAULDRON     = 0x50,\r\n\tOBJ_MURKYFTN     = 0x51,\r\n\tOBJ_TEARFTN      = 0x52,\r\n\tOBJ_ALTBOY       = 0x53,\r\n\tOBJ_MCIRCLE1     = 0x54,\r\n\tOBJ_MCIRCLE2     = 0x55,\r\n\tOBJ_STORYBOOK    = 0x56,\r\n\tOBJ_STORYCANDLE  = 0x57,\r\n\tOBJ_STEELTOME    = 0x58,\r\n\tOBJ_WARARMOR     = 0x59,\r\n\tOBJ_WARWEAP      = 0x5A,\r\n\tOBJ_TBCROSS      = 0x5B,\r\n\tOBJ_WEAPONRACK   = 0x5C,\r\n\tOBJ_WEAPONRACKN  = 0x5D,\r\n\tOBJ_MUSHPATCH    = 0x5E,\r\n\tOBJ_LAZSTAND     = 0x5F,\r\n\tOBJ_SLAINHERO    = 0x60,\r\n\tOBJ_SIGNCHEST    = 0x61,\r\n\tOBJ_NULL_98      = 0x62,\r\n} _object_id;\r\n\r\ntypedef enum item_misc_id {\r\n\tIMISC_NONE      = 0x0,\r\n\tIMISC_USEFIRST  = 0x1,\r\n\tIMISC_FULLHEAL  = 0x2,\r\n\tIMISC_HEAL      = 0x3,\r\n\tIMISC_OLDHEAL   = 0x4,\r\n\tIMISC_DEADHEAL  = 0x5,\r\n\tIMISC_MANA      = 0x6,\r\n\tIMISC_FULLMANA  = 0x7,\r\n\tIMISC_POTEXP    = 0x8, /* add experience */\r\n\tIMISC_POTFORG   = 0x9, /* remove experience */\r\n\tIMISC_ELIXSTR   = 0xA,\r\n\tIMISC_ELIXMAG   = 0xB,\r\n\tIMISC_ELIXDEX   = 0xC,\r\n\tIMISC_ELIXVIT   = 0xD,\r\n\tIMISC_ELIXWEAK  = 0xE, /* double check with alpha */\r\n\tIMISC_ELIXDIS   = 0xF,\r\n\tIMISC_ELIXCLUM  = 0x10,\r\n\tIMISC_ELIXSICK  = 0x11,\r\n\tIMISC_REJUV     = 0x12,\r\n\tIMISC_FULLREJUV = 0x13,\r\n\tIMISC_USELAST   = 0x14,\r\n\tIMISC_SCROLL    = 0x15,\r\n\tIMISC_SCROLLT   = 0x16,\r\n\tIMISC_STAFF     = 0x17,\r\n\tIMISC_BOOK      = 0x18,\r\n\tIMISC_RING      = 0x19,\r\n\tIMISC_AMULET    = 0x1A,\r\n\tIMISC_UNIQUE    = 0x1B,\r\n\tIMISC_FOOD      = 0x1C, /* from demo/PSX */\r\n\tIMISC_OILFIRST  = 0x1D,\r\n\tIMISC_OILOF     = 0x1E, /* oils are beta or hellfire only */\r\n\tIMISC_OILACC    = 0x1F,\r\n\tIMISC_OILMAST   = 0x20,\r\n\tIMISC_OILSHARP  = 0x21,\r\n\tIMISC_OILDEATH  = 0x22,\r\n\tIMISC_OILSKILL  = 0x23,\r\n\tIMISC_OILBSMTH  = 0x24,\r\n\tIMISC_OILFORT   = 0x25,\r\n\tIMISC_OILPERM   = 0x26,\r\n\tIMISC_OILHARD   = 0x27,\r\n\tIMISC_OILIMP    = 0x28,\r\n\tIMISC_OILLAST   = 0x29,\r\n\tIMISC_MAPOFDOOM = 0x2A,\r\n\tIMISC_EAR       = 0x2B,\r\n\tIMISC_SPECELIX  = 0x2C,\r\n#ifdef HELLFIRE\r\n\tIMISC_RUNEFIRST = 0x2E,\r\n\tIMISC_RUNEF     = 0x2F,\r\n\tIMISC_RUNEL     = 0x30,\r\n\tIMISC_GR_RUNEL  = 0x31,\r\n\tIMISC_GR_RUNEF  = 0x32,\r\n\tIMISC_RUNES     = 0x33,\r\n\tIMISC_RUNELAST  = 0x34,\r\n\tIMISC_AURIC     = 0x35,\r\n\tIMISC_NOTE      = 0x36,\r\n#endif\r\n\tIMISC_INVALID   = -1,\r\n} item_misc_id;\r\n\r\ntypedef enum item_type {\r\n\tITYPE_MISC   = 0x0,\r\n\tITYPE_SWORD  = 0x1,\r\n\tITYPE_AXE    = 0x2,\r\n\tITYPE_BOW    = 0x3,\r\n\tITYPE_MACE   = 0x4,\r\n\tITYPE_SHIELD = 0x5,\r\n\tITYPE_LARMOR = 0x6,\r\n\tITYPE_HELM   = 0x7,\r\n\tITYPE_MARMOR = 0x8,\r\n\tITYPE_HARMOR = 0x9,\r\n\tITYPE_STAFF  = 0xA,\r\n\tITYPE_GOLD   = 0xB,\r\n\tITYPE_RING   = 0xC,\r\n\tITYPE_AMULET = 0xD,\r\n\tITYPE_FOOD   = 0xE, /* used in demo */\r\n\tITYPE_NONE   = -1,\r\n} item_type;\r\n\r\ntypedef enum _item_indexes {\r\n\tIDI_GOLD,\r\n\tIDI_WARRIOR,\r\n\tIDI_WARRSHLD,\r\n\tIDI_WARRCLUB,\r\n\tIDI_ROGUE,\r\n\tIDI_SORCEROR,\r\n\tIDI_CLEAVER,\r\n\tIDI_FIRSTQUEST = IDI_CLEAVER,\r\n\tIDI_SKCROWN,\r\n\tIDI_INFRARING,\r\n\tIDI_ROCK,\r\n\tIDI_OPTAMULET,\r\n\tIDI_TRING,\r\n\tIDI_BANNER,\r\n\tIDI_HARCREST,\r\n\tIDI_STEELVEIL,\r\n\tIDI_GLDNELIX,\r\n\tIDI_ANVIL,\r\n\tIDI_MUSHROOM,\r\n\tIDI_BRAIN,\r\n\tIDI_FUNGALTM,\r\n\tIDI_SPECELIX,\r\n\tIDI_BLDSTONE,\r\n\tIDI_MAPOFDOOM,\r\n\tIDI_LASTQUEST = IDI_MAPOFDOOM,\r\n\tIDI_EAR,\r\n\tIDI_HEAL,\r\n\tIDI_MANA,\r\n\tIDI_IDENTIFY,\r\n\tIDI_PORTAL,\r\n\tIDI_ARMOFVAL,\r\n\tIDI_FULLHEAL,\r\n\tIDI_FULLMANA,\r\n\tIDI_GRISWOLD,\r\n\tIDI_LGTFORGE,\r\n\tIDI_LAZSTAFF,\r\n\tIDI_RESURRECT,\r\n#ifdef HELLFIRE\r\n\tIDI_OIL,\r\n\tIDI_SHORTSTAFF,\r\n\tIDI_BARDSWORD,\r\n\tIDI_BARDDAGGER,\r\n\tIDI_RUNEBOMB,\r\n\tIDI_THEODORE,\r\n\tIDI_AURIC,\r\n\tIDI_NOTE1,\r\n\tIDI_NOTE2,\r\n\tIDI_NOTE3,\r\n\tIDI_FULLNOTE,\r\n\tIDI_BROWNSUIT,\r\n\tIDI_GREYSUIT,\r\n#endif\r\n} _item_indexes;\r\n\r\ntypedef enum _setlevels {\r\n\t//SL_BUTCHCHAMB = 0x0,\r\n\tSL_SKELKING     = 0x1,\r\n\tSL_BONECHAMB    = 0x2,\r\n\tSL_MAZE         = 0x3,\r\n\tSL_POISONWATER  = 0x4,\r\n\tSL_VILEBETRAYER = 0x5,\r\n} _setlevels;\r\n\r\ntypedef enum quest_id {\r\n\tQ_ROCK     = 0x00,\r\n\tQ_MUSHROOM = 0x01,\r\n\tQ_GARBUD   = 0x02,\r\n\tQ_ZHAR     = 0x03,\r\n\tQ_VEIL     = 0x04,\r\n\tQ_DIABLO   = 0x05,\r\n\tQ_BUTCHER  = 0x06,\r\n\tQ_LTBANNER = 0x07,\r\n\tQ_BLIND    = 0x08,\r\n\tQ_BLOOD    = 0x09,\r\n\tQ_ANVIL    = 0x0A,\r\n\tQ_WARLORD  = 0x0B,\r\n\tQ_SKELKING = 0x0C,\r\n\tQ_PWATER   = 0x0D,\r\n\tQ_SCHAMB   = 0x0E,\r\n\tQ_BETRAYER = 0x0F,\r\n#ifdef HELLFIRE\r\n\tQ_GRAVE    = 0x10,\r\n\tQ_FARMER   = 0x11,\r\n\tQ_GIRL     = 0x12,\r\n\tQ_TRADER   = 0x13,\r\n\tQ_DEFILER  = 0x14,\r\n\tQ_NAKRUL   = 0x15,\r\n\tQ_CORNSTN  = 0x16,\r\n\tQ_JERSEY   = 0x17,\r\n#endif\r\n\tQ_INVALID  = -1,\r\n} quest_id;\r\n\r\ntypedef enum quest_state {\r\n\tQUEST_NOTAVAIL = 0,\r\n\tQUEST_INIT     = 1,\r\n\tQUEST_ACTIVE   = 2,\r\n\tQUEST_DONE     = 3\r\n} quest_state;\r\n\r\ntypedef enum quest_gametype {\r\n\tQUEST_SINGLE = 0,\r\n\tQUEST_ANY    = 1,\r\n\tQUEST_MULTI  = 2,\r\n} quest_gametype;\r\n\r\ntypedef enum quest_mush_state {\r\n\tQS_INIT         = 0,\r\n\tQS_TOMESPAWNED  = 1,\r\n\tQS_TOMEGIVEN    = 2,\r\n\tQS_MUSHSPAWNED  = 3,\r\n\tQS_MUSHPICKED   = 4,\r\n\tQS_MUSHGIVEN    = 5,\r\n\tQS_BRAINSPAWNED = 6,\r\n\tQS_BRAINGIVEN   = 7,\r\n} quest_mush_state;\r\n\r\ntypedef enum talk_id {\r\n\tSTORE_NONE      = 0x0,\r\n\tSTORE_SMITH     = 0x1,\r\n\tSTORE_SBUY      = 0x2,\r\n\tSTORE_SSELL     = 0x3,\r\n\tSTORE_SREPAIR   = 0x4,\r\n\tSTORE_WITCH     = 0x5,\r\n\tSTORE_WBUY      = 0x6,\r\n\tSTORE_WSELL     = 0x7,\r\n\tSTORE_WRECHARGE = 0x8,\r\n\tSTORE_NOMONEY   = 0x9,\r\n\tSTORE_NOROOM    = 0xA,\r\n\tSTORE_CONFIRM   = 0xB,\r\n\tSTORE_BOY       = 0xC,\r\n\tSTORE_BBOY      = 0xD,\r\n\tSTORE_HEALER    = 0xE,\r\n\tSTORE_STORY     = 0xF,\r\n\tSTORE_HBUY      = 0x10,\r\n\tSTORE_SIDENTIFY = 0x11,\r\n\tSTORE_SPBUY     = 0x12,\r\n\tSTORE_GOSSIP    = 0x13,\r\n\tSTORE_IDSHOW    = 0x14,\r\n\tSTORE_TAVERN    = 0x15,\r\n\tSTORE_DRUNK     = 0x16,\r\n\tSTORE_BARMAID   = 0x17,\r\n} talk_id;\r\n\r\ntypedef enum _unique_items {\r\n\tUITEM_CLEAVER      = 0x0,\r\n\tUITEM_SKCROWN      = 0x1,\r\n\tUITEM_INFRARING    = 0x2,\r\n\tUITEM_OPTAMULET    = 0x3,\r\n\tUITEM_TRING        = 0x4,\r\n\tUITEM_HARCREST     = 0x5,\r\n\tUITEM_STEELVEIL    = 0x6,\r\n\tUITEM_ARMOFVAL     = 0x7,\r\n\tUITEM_GRISWOLD     = 0x8,\r\n#ifndef HELLFIRE\r\n\tUITEM_LGTFORGE     = 0x9,\r\n#else\r\n\tUITEM_BOVINE       = 0x9,\r\n#endif\r\n\tUITEM_RIFTBOW      = 0xA,\r\n\tUITEM_NEEDLER      = 0xB,\r\n\tUITEM_CELESTBOW    = 0xC,\r\n\tUITEM_DEADLYHUNT   = 0xD,\r\n\tUITEM_BOWOFDEAD    = 0xE,\r\n\tUITEM_BLKOAKBOW    = 0xF,\r\n\tUITEM_FLAMEDART    = 0x10,\r\n\tUITEM_FLESHSTING   = 0x11,\r\n\tUITEM_WINDFORCE    = 0x12,\r\n\tUITEM_EAGLEHORN    = 0x13,\r\n\tUITEM_GONNAGALDIRK = 0x14,\r\n\tUITEM_DEFENDER     = 0x15,\r\n\tUITEM_GRYPHONCLAW  = 0x16,\r\n\tUITEM_BLACKRAZOR   = 0x17,\r\n\tUITEM_GIBBOUSMOON  = 0x18,\r\n\tUITEM_ICESHANK     = 0x19,\r\n\tUITEM_EXECUTIONER  = 0x1A,\r\n\tUITEM_BONESAW      = 0x1B,\r\n\tUITEM_SHADHAWK     = 0x1C,\r\n\tUITEM_WIZSPIKE     = 0x1D,\r\n\tUITEM_LGTSABRE     = 0x1E,\r\n\tUITEM_FALCONTALON  = 0x1F,\r\n\tUITEM_INFERNO      = 0x20,\r\n\tUITEM_DOOMBRINGER  = 0x21,\r\n\tUITEM_GRIZZLY      = 0x22,\r\n\tUITEM_GRANDFATHER  = 0x23,\r\n\tUITEM_MANGLER      = 0x24,\r\n\tUITEM_SHARPBEAK    = 0x25,\r\n\tUITEM_BLOODLSLAYER = 0x26,\r\n\tUITEM_CELESTAXE    = 0x27,\r\n\tUITEM_WICKEDAXE    = 0x28,\r\n\tUITEM_STONECLEAV   = 0x29,\r\n\tUITEM_AGUHATCHET   = 0x2A,\r\n\tUITEM_HELLSLAYER   = 0x2B,\r\n\tUITEM_MESSERREAVER = 0x2C,\r\n\tUITEM_CRACKRUST    = 0x2D,\r\n\tUITEM_JHOLMHAMM    = 0x2E,\r\n\tUITEM_CIVERBS      = 0x2F,\r\n\tUITEM_CELESTSTAR   = 0x30,\r\n\tUITEM_BARANSTAR    = 0x31,\r\n\tUITEM_GNARLROOT    = 0x32,\r\n\tUITEM_CRANBASH     = 0x33,\r\n\tUITEM_SCHAEFHAMM   = 0x34,\r\n\tUITEM_DREAMFLANGE  = 0x35,\r\n\tUITEM_STAFFOFSHAD  = 0x36,\r\n\tUITEM_IMMOLATOR    = 0x37,\r\n\tUITEM_STORMSPIRE   = 0x38,\r\n\tUITEM_GLEAMSONG    = 0x39,\r\n\tUITEM_THUNDERCALL  = 0x3A,\r\n\tUITEM_PROTECTOR    = 0x3B,\r\n\tUITEM_NAJPUZZLE    = 0x3C,\r\n\tUITEM_MINDCRY      = 0x3D,\r\n\tUITEM_RODOFONAN    = 0x3E,\r\n\tUITEM_SPIRITSHELM  = 0x3F,\r\n\tUITEM_THINKINGCAP  = 0x40,\r\n\tUITEM_OVERLORDHELM = 0x41,\r\n\tUITEM_FOOLSCREST   = 0x42,\r\n\tUITEM_GOTTERDAM    = 0x43,\r\n\tUITEM_ROYCIRCLET   = 0x44,\r\n\tUITEM_TORNFLESH    = 0x45,\r\n\tUITEM_GLADBANE     = 0x46,\r\n\tUITEM_RAINCLOAK    = 0x47,\r\n\tUITEM_LEATHAUT     = 0x48,\r\n\tUITEM_WISDWRAP     = 0x49,\r\n\tUITEM_SPARKMAIL    = 0x4A,\r\n\tUITEM_SCAVCARAP    = 0x4B,\r\n\tUITEM_NIGHTSCAPE   = 0x4C,\r\n\tUITEM_NAJPLATE     = 0x4D,\r\n\tUITEM_DEMONSPIKE   = 0x4E,\r\n\tUITEM_DEFLECTOR    = 0x4F,\r\n\tUITEM_SKULLSHLD    = 0x50,\r\n\tUITEM_DRAGONBRCH   = 0x51,\r\n\tUITEM_BLKOAKSHLD   = 0x52,\r\n\tUITEM_HOLYDEF      = 0x53,\r\n\tUITEM_STORMSHLD    = 0x54,\r\n\tUITEM_BRAMBLE      = 0x55,\r\n\tUITEM_REGHA        = 0x56,\r\n\tUITEM_BLEEDER      = 0x57,\r\n\tUITEM_CONSTRICT    = 0x58,\r\n\tUITEM_ENGAGE       = 0x59,\r\n\tUITEM_INVALID      = 0x5A,\r\n} _unique_items;\r\n\r\ntypedef enum plr_class {\r\n\tPC_WARRIOR  = 0x0,\r\n\tPC_ROGUE    = 0x1,\r\n\tPC_SORCERER = 0x2,\r\n#ifdef HELLFIRE\r\n\tPC_MONK      = 0x3,\r\n\tPC_BARD      = 0x4,\r\n\tPC_BARBARIAN = 0x5,\r\n#endif\r\n\tNUM_CLASSES\r\n} plr_class;\r\n\r\ntypedef enum _ui_classes {\r\n\tUI_WARRIOR     = 0x0,\r\n\tUI_ROGUE       = 0x1,\r\n\tUI_SORCERER    = 0x2,\r\n#ifdef HELLFIRE\r\n\tUI_MONK        = 0x3,\r\n\tUI_BARD        = 0x4,\r\n\tUI_BARBARIAN   = 0x5,\r\n#endif\r\n\tUI_NUM_CLASSES,\r\n} _ui_classes;\r\n\r\ntypedef enum _walk_path {\r\n\tWALK_NE   = 0x1,\r\n\tWALK_NW   = 0x2,\r\n\tWALK_SE   = 0x3,\r\n\tWALK_SW   = 0x4,\r\n\tWALK_N    = 0x5,\r\n\tWALK_E    = 0x6,\r\n\tWALK_S    = 0x7,\r\n\tWALK_W    = 0x8,\r\n\tWALK_NONE = -1,\r\n} _walk_path;\r\n\r\ntypedef enum player_weapon_type {\r\n\tWT_MELEE  = 0,\r\n\tWT_RANGED = 1,\r\n} player_weapon_type;\r\n\r\ntypedef enum item_class {\r\n\tICLASS_NONE   = 0,\r\n\tICLASS_WEAPON = 1,\r\n\tICLASS_ARMOR  = 2,\r\n\tICLASS_MISC   = 3,\r\n\tICLASS_GOLD   = 4,\r\n\tICLASS_QUEST  = 5,\r\n} item_class;\r\n\r\ntypedef enum item_drop_rate {\r\n\tIDROP_NEVER   = 0,\r\n\tIDROP_REGULAR = 1,\r\n\tIDROP_DOUBLE  = 2,\r\n} item_drop_rate;\r\n\r\ntypedef enum item_special_effect {\r\n\tISPL_NONE           = 0x00000000,\r\n\tISPL_INFRAVISION    = 0x00000001,\r\n\tISPL_RNDSTEALLIFE   = 0x00000002,\r\n\tISPL_RNDARROWVEL    = 0x00000004,\r\n\tISPL_FIRE_ARROWS    = 0x00000008,\r\n\tISPL_FIREDAM        = 0x00000010,\r\n\tISPL_LIGHTDAM       = 0x00000020,\r\n\tISPL_DRAINLIFE      = 0x00000040,\r\n\tISPL_UNKNOWN_1      = 0x00000080,\r\n\tISPL_NOHEALPLR      = 0x00000100,\r\n\tISPL_MULT_ARROWS    = 0x00000200,\r\n\tISPL_UNKNOWN_3      = 0x00000400,\r\n\tISPL_KNOCKBACK      = 0x00000800,\r\n\tISPL_NOHEALMON      = 0x00001000,\r\n\tISPL_STEALMANA_3    = 0x00002000,\r\n\tISPL_STEALMANA_5    = 0x00004000,\r\n\tISPL_STEALLIFE_3    = 0x00008000,\r\n\tISPL_STEALLIFE_5    = 0x00010000,\r\n\tISPL_QUICKATTACK    = 0x00020000,\r\n\tISPL_FASTATTACK     = 0x00040000,\r\n\tISPL_FASTERATTACK   = 0x00080000,\r\n\tISPL_FASTESTATTACK  = 0x00100000,\r\n\tISPL_FASTRECOVER    = 0x00200000,\r\n\tISPL_FASTERRECOVER  = 0x00400000,\r\n\tISPL_FASTESTRECOVER = 0x00800000,\r\n\tISPL_FASTBLOCK      = 0x01000000,\r\n\tISPL_LIGHT_ARROWS   = 0x02000000,\r\n\tISPL_THORNS         = 0x04000000,\r\n\tISPL_NOMANA         = 0x08000000,\r\n\tISPL_ABSHALFTRAP    = 0x10000000,\r\n\tISPL_UNKNOWN_4      = 0x20000000,\r\n\tISPL_3XDAMVDEM      = 0x40000000,\r\n\tISPL_ALLRESZERO     = 0x80000000,\r\n} item_special_effect;\r\n\r\ntypedef enum item_special_effect_hf {\r\n    ISPLHF_DEVASTATION  = 0x01,\r\n    ISPLHF_DECAY        = 0x02,\r\n    ISPLHF_PERIL        = 0x04,\r\n    ISPLHF_JESTERS      = 0x08,\r\n    ISPLHF_DOPPELGANGER = 0x10,\r\n    ISPLHF_ACDEMON      = 0x20,\r\n    ISPLHF_ACUNDEAD     = 0x40,\r\n} item_special_effect_hf;\r\n\r\n// Logical equipment locations\r\ntypedef enum inv_body_loc {\r\n\tINVLOC_HEAD       = 0,\r\n\tINVLOC_RING_LEFT  = 1,\r\n\tINVLOC_RING_RIGHT = 2,\r\n\tINVLOC_AMULET     = 3,\r\n\tINVLOC_HAND_LEFT  = 4,\r\n\tINVLOC_HAND_RIGHT = 5,\r\n\tINVLOC_CHEST      = 6,\r\n\tNUM_INVLOC,\r\n} inv_body_loc;\r\n\r\ntypedef enum inv_item {\r\n\tINVITEM_HEAD       = 0,\r\n\tINVITEM_RING_LEFT  = 1,\r\n\tINVITEM_RING_RIGHT = 2,\r\n\tINVITEM_AMULET     = 3,\r\n\tINVITEM_HAND_LEFT  = 4,\r\n\tINVITEM_HAND_RIGHT = 5,\r\n\tINVITEM_CHEST      = 6,\r\n\tINVITEM_INV_FIRST  = 7,\r\n\tINVITEM_INV_LAST   = 46,\r\n\tINVITEM_BELT_FIRST = 47,\r\n\tINVITEM_BELT_LAST  = 54,\r\n\tNUM_INVELEM\r\n} inv_item;\r\n\r\n// identifiers for each of the inventory squares\r\n// see https://github.com/sanctuary/graphics/blob/master/inventory.png\r\ntypedef enum inv_xy_slot {\r\n\tSLOTXY_HEAD_FIRST       = 0,\r\n\tSLOTXY_HEAD_LAST        = 3,\r\n\tSLOTXY_RING_LEFT        = 4,\r\n\tSLOTXY_RING_RIGHT       = 5,\r\n\tSLOTXY_AMULET           = 6,\r\n\tSLOTXY_HAND_LEFT_FIRST  = 7,\r\n\tSLOTXY_HAND_LEFT_LAST   = 12,\r\n\tSLOTXY_HAND_RIGHT_FIRST = 13,\r\n\tSLOTXY_HAND_RIGHT_LAST  = 18,\r\n\tSLOTXY_CHEST_FIRST      = 19,\r\n\tSLOTXY_CHEST_LAST       = 24,\r\n\r\n\t// regular inventory\r\n\tSLOTXY_INV_FIRST = 25,\r\n\tSLOTXY_INV_LAST  = 64,\r\n\r\n\t// belt items\r\n\tSLOTXY_BELT_FIRST = 65,\r\n\tSLOTXY_BELT_LAST  = 72,\r\n\tNUM_XY_SLOTS      = 73\r\n} inv_xy_slot;\r\n\r\ntypedef enum player_graphic {\r\n\tPFILE_STAND     = 1 << 0,\r\n\tPFILE_WALK      = 1 << 1,\r\n\tPFILE_ATTACK    = 1 << 2,\r\n\tPFILE_HIT       = 1 << 3,\r\n\tPFILE_LIGHTNING = 1 << 4,\r\n\tPFILE_FIRE      = 1 << 5,\r\n\tPFILE_MAGIC     = 1 << 6,\r\n\tPFILE_DEATH     = 1 << 7,\r\n\tPFILE_BLOCK     = 1 << 8,\r\n\t// everything except PFILE_DEATH\r\n\t// 0b1_0111_1111\r\n\tPFILE_NONDEATH = 0x17F\r\n} player_graphic;\r\n\r\ntypedef enum anim_weapon_id {\r\n\tANIM_ID_UNARMED        = 0x00,\r\n\tANIM_ID_UNARMED_SHIELD = 0x01,\r\n\tANIM_ID_SWORD          = 0x02,\r\n\tANIM_ID_SWORD_SHIELD   = 0x03,\r\n\tANIM_ID_BOW            = 0x04,\r\n\tANIM_ID_AXE            = 0x05,\r\n\tANIM_ID_MACE           = 0x06,\r\n\tANIM_ID_MACE_SHIELD    = 0x07,\r\n\tANIM_ID_STAFF          = 0x08\r\n} anim_weapon_id;\r\n\r\ntypedef enum anim_armor_id {\r\n\tANIM_ID_LIGHT_ARMOR = 0x00,\r\n#ifndef SPAWN\r\n\tANIM_ID_MEDIUM_ARMOR = 0x10,\r\n\tANIM_ID_HEAVY_ARMOR  = 0x20\r\n#endif\r\n} anim_armor_id;\r\n\r\ntypedef enum shrine_gametype {\r\n\tSHRINETYPE_ANY    = 0,\r\n\tSHRINETYPE_SINGLE = 1,\r\n\tSHRINETYPE_MULTI  = 2,\r\n} shrine_gametype;\r\n\r\ntypedef enum shrine_type {\r\n\tSHRINE_MYSTERIOUS   = 0,\r\n\tSHRINE_HIDDEN       = 1,\r\n\tSHRINE_GLOOMY       = 2,\r\n\tSHRINE_WEIRD        = 3,\r\n\tSHRINE_MAGICAL      = 4,\r\n\tSHRINE_STONE        = 5,\r\n\tSHRINE_RELIGIOUS    = 6,\r\n\tSHRINE_ENCHANTED    = 7,\r\n\tSHRINE_THAUMATURGIC = 8,\r\n\tSHRINE_FASCINATING  = 9,\r\n\tSHRINE_CRYPTIC      = 10,\r\n\tSHRINE_MAGICAL2     = 11,\r\n\tSHRINE_ELDRITCH     = 12,\r\n\tSHRINE_EERIE        = 13,\r\n\tSHRINE_DIVINE       = 14,\r\n\tSHRINE_HOLY         = 15,\r\n\tSHRINE_SACRED       = 16,\r\n\tSHRINE_SPIRITUAL    = 17,\r\n\tSHRINE_SPOOKY       = 18,\r\n\tSHRINE_ABANDONED    = 19,\r\n\tSHRINE_CREEPY       = 20,\r\n\tSHRINE_QUIET        = 21,\r\n\tSHRINE_SECLUDED     = 22,\r\n\tSHRINE_ORNATE       = 23,\r\n\tSHRINE_GLIMMERING   = 24,\r\n\tSHRINE_TAINTED      = 25,\r\n#ifdef HELLFIRE\r\n\tSHRINE_OILY         = 26,\r\n\tSHRINE_GLOWING      = 27,\r\n\tSHRINE_MENDICANT    = 28,\r\n\tSHRINE_SPARKLING    = 29,\r\n\tSHRINE_TOWN         = 30,\r\n\tSHRINE_SHIMMERING   = 31,\r\n\tSHRINE_SOLAR        = 32,\r\n\tSHRINE_MURPHYS      = 33,\r\n#endif\r\n\tNUM_SHRINETYPE\r\n} shrine_type;\r\n\r\ntypedef enum action_id {\r\n\tACTION_NONE        = -1,\r\n\tACTION_ATTACK      = 9,\r\n\tACTION_RATTACK     = 10,\r\n\tACTION_SPELL       = 12,\r\n\tACTION_OPERATE     = 13,\r\n\tACTION_DISARM      = 14,\r\n\tACTION_PICKUPITEM  = 15, // put item in hand (inventory screen open)\r\n\tACTION_PICKUPAITEM = 16, // put item in inventory\r\n\tACTION_TALK        = 17,\r\n\tACTION_OPERATETK   = 18, // operate via telekinesis\r\n\tACTION_ATTACKMON   = 20,\r\n\tACTION_ATTACKPLR   = 21,\r\n\tACTION_RATTACKMON  = 22,\r\n\tACTION_RATTACKPLR  = 23,\r\n\tACTION_SPELLMON    = 24,\r\n\tACTION_SPELLPLR    = 25,\r\n\tACTION_SPELLWALL   = 26,\r\n} action_id;\r\n\r\ntypedef enum dlrg_flag {\r\n\tDLRG_HDOOR     = 0x01,\r\n\tDLRG_VDOOR     = 0x02,\r\n\tDLRG_CHAMBER   = 0x40,\r\n\tDLRG_PROTECTED = 0x80,\r\n} dlrg_flag;\r\n"
  },
  {
    "path": "resource.h",
    "content": "/**\r\n * @file resource.h\r\n *\r\n * Microsoft Developer Studio generated include file.\r\n * Used by Diablo.rc\r\n */\r\n\r\n#define IDI_ICON1 101\r\n#define IDD_DIALOG1 104  // DX\r\n#define IDD_DIALOG2 105  // NOMEMORY\r\n#define IDD_DIALOG3 106  // NOFILE\r\n#define IDD_DIALOG4 107  // DDRAW\r\n#define IDD_DIALOG5 108  // DSOUND\r\n#define IDD_DIALOG6 109  // PENTIUM (deprecated in 1.00)\r\n#define IDD_DIALOG7 110  // DISKSPACE\r\n#define IDD_DIALOG8 111  // VIDEOMODE\r\n#define IDD_DIALOG9 112  // INSERTCD\r\n#define IDD_DIALOG10 113 // RESTRICTED\r\n#define IDD_DIALOG11 114 // READONLY\r\n\r\n// Next default values for new objects\r\n//\r\n#ifdef APSTUDIO_INVOKED\r\n#ifndef APSTUDIO_READONLY_SYMBOLS\r\n#define _APS_NEXT_RESOURCE_VALUE        103\r\n#define _APS_NEXT_COMMAND_VALUE         40001\r\n#define _APS_NEXT_CONTROL_VALUE         1000\r\n#define _APS_NEXT_SYMED_VALUE           101\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "structs.h",
    "content": "/**\r\n * @file structs.h\r\n *\r\n * Various global structures.\r\n */\r\n\r\n//////////////////////////////////////////////////\r\n// control\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct RECT32 {\r\n\tint x;\r\n\tint y;\r\n\tint w;\r\n\tint h;\r\n} RECT32;\r\n\r\n//////////////////////////////////////////////////\r\n// items\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct PLStruct {\r\n\tconst char *PLName;\r\n\tint PLPower;\r\n\tint PLParam1;\r\n\tint PLParam2;\r\n\tchar PLMinLvl;\r\n\tint PLIType;\r\n\tBYTE PLGOE;\r\n\tBOOL PLDouble;\r\n\tBOOL PLOk;\r\n\tint PLMinVal;\r\n\tint PLMaxVal;\r\n\tint PLMultVal;\r\n} PLStruct;\r\n\r\ntypedef struct UItemStruct {\r\n\tconst char *UIName;\r\n\tchar UIItemId;\r\n\tchar UIMinLvl;\r\n\tchar UINumPL;\r\n\tint UIValue;\r\n\tchar UIPower1;\r\n\tint UIParam1;\r\n\tint UIParam2;\r\n\tchar UIPower2;\r\n\tint UIParam3;\r\n\tint UIParam4;\r\n\tchar UIPower3;\r\n\tint UIParam5;\r\n\tint UIParam6;\r\n\tchar UIPower4;\r\n\tint UIParam7;\r\n\tint UIParam8;\r\n\tchar UIPower5;\r\n\tint UIParam9;\r\n\tint UIParam10;\r\n\tchar UIPower6;\r\n\tint UIParam11;\r\n\tint UIParam12;\r\n} UItemStruct;\r\n\r\ntypedef struct ItemDataStruct {\r\n\tint iRnd;\r\n\tchar iClass;\r\n\tchar iLoc;\r\n\tint iCurs;\r\n\tchar itype;\r\n\tchar iItemId;\r\n\tconst char *iName;\r\n\tconst char *iSName;\r\n\tchar iMinMLvl;\r\n\tint iDurability;\r\n\tint iMinDam;\r\n\tint iMaxDam;\r\n\tint iMinAC;\r\n\tint iMaxAC;\r\n\tchar iMinStr;\r\n\tchar iMinMag;\r\n\tchar iMinDex;\r\n\t// item_special_effect\r\n\tint iFlags;\r\n\t// item_misc_id\r\n\tint iMiscId;\r\n\t// spell_id\r\n\tint iSpell;\r\n\tBOOL iUsable;\r\n\tint iValue;\r\n\tint iMaxValue;\r\n} ItemDataStruct;\r\n\r\ntypedef struct ItemGetRecordStruct {\r\n\tint nSeed;\r\n\tunsigned short wCI;\r\n\tint nIndex;\r\n\tunsigned int dwTimestamp;\r\n} ItemGetRecordStruct;\r\n\r\ntypedef struct ItemStruct {\r\n\tint _iSeed;\r\n\tWORD _iCreateInfo;\r\n\tint _itype;\r\n\tint _ix;\r\n\tint _iy;\r\n\tBOOL _iAnimFlag;\r\n\tunsigned char *_iAnimData; // PSX name -> ItemFrame\r\n\tint _iAnimLen;             // Number of frames in current animation\r\n\tint _iAnimFrame;           // Current frame of animation.\r\n\tint _iAnimWidth;\r\n\tint _iAnimWidth2; // width 2?\r\n\tBOOL _iDelFlag;   // set when item is flagged for deletion, deprecated in 1.02\r\n\tchar _iSelFlag;\r\n\tBOOL _iPostDraw;\r\n\tBOOL _iIdentified;\r\n\tchar _iMagical;\r\n\tchar _iName[64];\r\n\tchar _iIName[64];\r\n\tchar _iLoc;\r\n\t// item_class enum\r\n\tchar _iClass;\r\n\tint _iCurs;\r\n\tint _ivalue;\r\n\tint _iIvalue;\r\n\tint _iMinDam;\r\n\tint _iMaxDam;\r\n\tint _iAC;\r\n\t// item_special_effect\r\n\tint _iFlags;\r\n\t// item_misc_id\r\n\tint _iMiscId;\r\n\t// spell_id\r\n\tint _iSpell;\r\n\tint _iCharges;\r\n\tint _iMaxCharges;\r\n\tint _iDurability;\r\n\tint _iMaxDur;\r\n\tint _iPLDam;\r\n\tint _iPLToHit;\r\n\tint _iPLAC;\r\n\tint _iPLStr;\r\n\tint _iPLMag;\r\n\tint _iPLDex;\r\n\tint _iPLVit;\r\n\tint _iPLFR;\r\n\tint _iPLLR;\r\n\tint _iPLMR;\r\n\tint _iPLMana;\r\n\tint _iPLHP;\r\n\tint _iPLDamMod;\r\n\tint _iPLGetHit;\r\n\tint _iPLLight;\r\n\tchar _iSplLvlAdd;\r\n\tchar _iRequest;\r\n\tint _iUid;\r\n\tint _iFMinDam;\r\n\tint _iFMaxDam;\r\n\tint _iLMinDam;\r\n\tint _iLMaxDam;\r\n\tint _iPLEnAc;\r\n\tchar _iPrePower;\r\n\tchar _iSufPower;\r\n\tint _iVAdd1;\r\n\tint _iVMult1;\r\n\tint _iVAdd2;\r\n\tint _iVMult2;\r\n\tchar _iMinStr;\r\n\tunsigned char _iMinMag;\r\n\tchar _iMinDex;\r\n\tBOOL _iStatFlag;\r\n\tint IDidx;\r\n\tint offs016C; // _oldlight or _iInvalid\r\n#ifdef HELLFIRE\r\n\tint _iDamAcFlags;\r\n#endif\r\n} ItemStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// player\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct PlayerStruct {\r\n\tint _pmode;\r\n\tchar walkpath[MAX_PATH_LENGTH];\r\n\tBOOLEAN plractive;\r\n\tint destAction;\r\n\tint destParam1;\r\n\tint destParam2;\r\n\tint destParam3;\r\n\tint destParam4;\r\n\tint plrlevel;\r\n\tint _px;      // Tile X-position of player\r\n\tint _py;      // Tile Y-position of player\r\n\tint _pfutx;   // Future tile X-position of player. Set at start of walking animation\r\n\tint _pfuty;   // Future tile Y-position of player. Set at start of walking animation\r\n\tint _ptargx;  // Target tile X-position for player movment. Set during pathfinding\r\n\tint _ptargy;  // Target tile Y-position for player movment. Set during pathfinding\r\n\tint _pownerx; // Tile X-position of player. Set via network on player input\r\n\tint _pownery; // Tile X-position of player. Set via network on player input\r\n\tint _poldx;   // Most recent X-position in dPlayer.\r\n\tint _poldy;   // Most recent Y-position in dPlayer.\r\n\tint _pxoff;   // Player sprite's pixel X-offset from tile.\r\n\tint _pyoff;   // Player sprite's pixel Y-offset from tile.\r\n\tint _pxvel;   // Pixel X-velocity while walking. Indirectly applied to _pxoff via _pvar6\r\n\tint _pyvel;   // Pixel Y-velocity while walking. Indirectly applied to _pyoff via _pvar7\r\n\tint _pdir;    // Direction faced by player (direction enum)\r\n\tint _nextdir; // Unused\r\n\tint _pgfxnum; // Bitmask indicating what variant of the sprite the player is using. Lower byte define weapon (anim_weapon_id) and higher values define armour (starting with anim_armor_id)\r\n\tunsigned char *_pAnimData;\r\n\tint _pAnimDelay; // Tick length of each frame in the current animation\r\n\tint _pAnimCnt;   // Increases by one each game tick, counting how close we are to _pAnimDelay\r\n\tint _pAnimLen;   // Number of frames in current animation\r\n\tint _pAnimFrame; // Current frame of animation.\r\n\tint _pAnimWidth;\r\n\tint _pAnimWidth2;\r\n\tint _peflag;\r\n\tint _plid;\r\n\tint _pvid;\r\n\tint _pSpell;\r\n\tchar _pSplType;\r\n\tchar _pSplFrom;\r\n\tint _pTSpell;\r\n\tchar _pTSplType;\r\n\tint _pRSpell;\r\n\t// enum spell_type\r\n\tchar _pRSplType;\r\n\tint _pSBkSpell;\r\n\tchar _pSBkSplType;\r\n\tchar _pSplLvl[64];\r\n\tunsigned __int64 _pMemSpells;  // Bitmask of learned spells\r\n\tunsigned __int64 _pAblSpells;  // Bitmask of abilities\r\n\tunsigned __int64 _pScrlSpells; // Bitmask of spells avalible via scrolls\r\n\tUCHAR _pSpellFlags;\r\n\tint _pSplHotKey[4];\r\n\tchar _pSplTHotKey[4];\r\n\tint _pwtype;\r\n\tBOOLEAN _pBlockFlag;\r\n\tBOOLEAN _pInvincible;\r\n\tchar _pLightRad;\r\n\tBOOLEAN _pLvlChanging; // True when the player is transitioning between levels\r\n\tchar _pName[PLR_NAME_LEN];\r\n\t// plr_class enum value.\r\n\t// TODO: this could very well be `enum plr_class _pClass`\r\n\t// since there are 3 bytes of alingment after this field.\r\n\t// it could just be that the compiler optimized away all accesses to\r\n\t// the higher bytes by using byte instructions, since all possible values\r\n\t// of plr_class fit into one byte.\r\n\tchar _pClass;\r\n\tint _pStrength;\r\n\tint _pBaseStr;\r\n\tint _pMagic;\r\n\tint _pBaseMag;\r\n\tint _pDexterity;\r\n\tint _pBaseDex;\r\n\tint _pVitality;\r\n\tint _pBaseVit;\r\n\tint _pStatPts;\r\n\tint _pDamageMod;\r\n\tint _pBaseToBlk;\r\n\tint _pHPBase;\r\n\tint _pMaxHPBase;\r\n\tint _pHitPoints;\r\n\tint _pMaxHP;\r\n\tint _pHPPer;\r\n\tint _pManaBase;\r\n\tint _pMaxManaBase;\r\n\tint _pMana;\r\n\tint _pMaxMana;\r\n\tint _pManaPer;\r\n\tchar _pLevel;\r\n\tchar _pMaxLvl;\r\n\tint _pExperience;\r\n\tint _pMaxExp;\r\n\tint _pNextExper;\r\n\tchar _pArmorClass;\r\n\tchar _pMagResist;\r\n\tchar _pFireResist;\r\n\tchar _pLghtResist;\r\n\tint _pGold;\r\n\tBOOL _pInfraFlag;\r\n\tint _pVar1; // Used for referring to X-position of player when finishing moving one tile (also used to define target coordinates for spells and ranged attacks)\r\n\tint _pVar2; // Used for referring to Y-position of player when finishing moving one tile (also used to define target coordinates for spells and ranged attacks)\r\n\tint _pVar3; // Player's direction when ending movement. Also used for casting direction of SPL_FIREWALL.\r\n\tint _pVar4; // Used for storing X-position of a tile which should have its BFLAG_PLAYERLR flag removed after walking. When starting to walk the game places the player in the dPlayer array -1 in the Y coordinate, and uses BFLAG_PLAYERLR to check if it should be using -1 to the Y coordinate when rendering the player (also used for storing the level of a spell when the player casts it)\r\n\tint _pVar5; // Used for storing Y-position of a tile which should have its BFLAG_PLAYERLR flag removed after walking. When starting to walk the game places the player in the dPlayer array -1 in the Y coordinate, and uses BFLAG_PLAYERLR to check if it should be using -1 to the Y coordinate when rendering the player (also used for storing the level of a spell when the player casts it)\r\n\tint _pVar6; // Same as _pxoff but contains the value in a higher range\r\n\tint _pVar7; // Same as _pyoff but contains the value in a higher range\r\n\tint _pVar8; // Used for counting how close we are to reaching the next tile when walking (usually counts to 8, which is equal to the walk animation length). Also used for stalling the appearance of the options screen after dying in singleplayer\r\n\tBOOLEAN _pLvlVisited[NUMLEVELS];\r\n\tBOOLEAN _pSLvlVisited[NUMLEVELS]; // only 10 used\r\n\tint _pGFXLoad;\r\n\tunsigned char *_pNAnim[8]; // Stand animations\r\n\tint _pNFrames;\r\n\tint _pNWidth;\r\n\tunsigned char *_pWAnim[8]; // Walk animations\r\n\tint _pWFrames;\r\n\tint _pWWidth;\r\n\tunsigned char *_pAAnim[8]; // Attack animations\r\n\tint _pAFrames;\r\n\tint _pAWidth;\r\n\tint _pAFNum;\r\n\tunsigned char *_pLAnim[8]; // Lightning spell cast animations\r\n\tunsigned char *_pFAnim[8]; // Fire spell cast animations\r\n\tunsigned char *_pTAnim[8]; // Generic spell cast animations\r\n\tint _pSFrames;\r\n\tint _pSWidth;\r\n\tint _pSFNum;\r\n\tunsigned char *_pHAnim[8]; // Getting hit animations\r\n\tint _pHFrames;\r\n\tint _pHWidth;\r\n\tunsigned char *_pDAnim[8]; // Death animations\r\n\tint _pDFrames;\r\n\tint _pDWidth;\r\n\tunsigned char *_pBAnim[8]; // Block animations\r\n\tint _pBFrames;\r\n\tint _pBWidth;\r\n\tItemStruct InvBody[NUM_INVLOC];\r\n\tItemStruct InvList[NUM_INV_GRID_ELEM];\r\n\tint _pNumInv;\r\n\tchar InvGrid[NUM_INV_GRID_ELEM];\r\n\tItemStruct SpdList[MAXBELTITEMS];\r\n\tItemStruct HoldItem;\r\n\tint _pIMinDam;\r\n\tint _pIMaxDam;\r\n\tint _pIAC;\r\n\tint _pIBonusDam;\r\n\tint _pIBonusToHit;\r\n\tint _pIBonusAC;\r\n\tint _pIBonusDamMod;\r\n\tunsigned __int64 _pISpells; // Bitmask of staff spell\r\n\tint _pIFlags;\r\n\tint _pIGetHit;\r\n\tchar _pISplLvlAdd;\r\n\tchar _pISplCost;\r\n\tint _pISplDur;\r\n\tint _pIEnAc;\r\n\tint _pIFMinDam;\r\n\tint _pIFMaxDam;\r\n\tint _pILMinDam;\r\n\tint _pILMaxDam;\r\n\tint _pOilType;\r\n\tunsigned char pTownWarps;\r\n\tunsigned char pDungMsgs;\r\n\tunsigned char pLvlLoad;\r\n#ifdef HELLFIRE\r\n\tunsigned char pDungMsgs2;\r\n#else\r\n\tunsigned char pBattleNet;\r\n#endif\r\n\tBOOLEAN pManaShield;\r\n\tchar bReserved[3];\r\n\tWORD wReflections;\r\n\tshort wReserved[7];\r\n\tDWORD pDiabloKillLevel;\r\n\tint pDifficulty;\r\n\tint pDamAcFlags;\r\n\tint dwReserved[5];\r\n\tunsigned char *_pNData;\r\n\tunsigned char *_pWData;\r\n\tunsigned char *_pAData;\r\n\tunsigned char *_pLData;\r\n\tunsigned char *_pFData;\r\n\tunsigned char *_pTData;\r\n\tunsigned char *_pHData;\r\n\tunsigned char *_pDData;\r\n\tunsigned char *_pBData;\r\n\tvoid *pReserved;\r\n} PlayerStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// textdat\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct TextDataStruct {\r\n\tconst char *txtstr;\r\n\tint scrlltxt;\r\n\tint txtspd;\r\n\tint sfxnr;\r\n} TextDataStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// missiles\r\n//////////////////////////////////////////////////\r\n\r\n// TPDEF PTR FCN VOID MIADDPRC\r\n// TPDEF PTR FCN VOID MIPROC\r\n\r\ntypedef struct MissileData {\r\n\tunsigned char mName;\r\n\tvoid (*mAddProc)(int, int, int, int, int, int, char, int, int);\r\n\tvoid (*mProc)(int);\r\n\tBOOL mDraw;\r\n\tunsigned char mType;\r\n\tunsigned char mResist;\r\n\tunsigned char mFileNum;\r\n\tint mlSFX;\r\n\tint miSFX;\r\n} MissileData;\r\n\r\ntypedef struct MisFileData {\r\n\tunsigned char mAnimName;\r\n\tunsigned char mAnimFAmt;\r\n\tconst char *mName;\r\n\tint mFlags;\r\n\tunsigned char *mAnimData[16];\r\n\tunsigned char mAnimDelay[16];\r\n\tunsigned char mAnimLen[16];\r\n\tint mAnimWidth[16];\r\n\tint mAnimWidth2[16];\r\n} MisFileData;\r\n\r\ntypedef struct ChainStruct {\r\n\tint idx;\r\n\tint _mitype;\r\n\tint _mirange;\r\n} ChainStruct;\r\n\r\ntypedef struct MissileStruct {\r\n\tint _mitype;  // Type of projectile (missile_id)\r\n\tint _mix;     // Tile X-position of the missile\r\n\tint _miy;     // Tile Y-position of the missile\r\n\tint _mixoff;  // Sprite pixel X-offset for the missile\r\n\tint _miyoff;  // Sprite pixel Y-offset for the missile\r\n\tint _mixvel;  // Missile tile X-velocity while walking. This gets added onto _mitxoff each game tick\r\n\tint _miyvel;  // Missile tile Y-velocity while walking. This gets added onto _mitxoff each game tick\r\n\tint _misx;    // Initial tile X-position for missile\r\n\tint _misy;    // Initial tile Y-position for missile\r\n\tint _mitxoff; // How far the missile has travelled in its lifespan along the X-axis. mix/miy/mxoff/myoff get updated every game tick based on this\r\n\tint _mityoff; // How far the missile has travelled in its lifespan along the Y-axis. mix/miy/mxoff/myoff get updated every game tick based on this\r\n\tint _mimfnum; // The direction of the missile (direction enum)\r\n\tint _mispllvl;\r\n\tBOOL _miDelFlag; // Indicate weather the missile should be deleted\r\n\tBYTE _miAnimType;\r\n\tint _miAnimFlags;\r\n\tunsigned char *_miAnimData;\r\n\tint _miAnimDelay; // Tick length of each frame in the current animation\r\n\tint _miAnimLen;   // Number of frames in current animation\r\n\tint _miAnimWidth;\r\n\tint _miAnimWidth2;\r\n\tint _miAnimCnt; // Increases by one each game tick, counting how close we are to _pAnimDelay\r\n\tint _miAnimAdd;\r\n\tint _miAnimFrame; // Current frame of animation.\r\n\tBOOL _miDrawFlag;\r\n\tBOOL _miLightFlag;\r\n\tBOOL _miPreFlag;\r\n\tint _miUniqTrans;\r\n\tint _mirange; // Time to live for the missile in game ticks, oncs 0 the missile will be marked for deletion via _miDelFlag\r\n\tint _misource;\r\n\tint _micaster;\r\n\tint _midam;\r\n\tBOOL _miHitFlag;\r\n\tint _midist; // Used for arrows to measure distance travelled (increases by 1 each game tick). Higher value is a penalty for accuracy calculation when hitting enemy\r\n\tint _mlid;\r\n\tint _mirnd;\r\n\tint _miVar1;\r\n\tint _miVar2;\r\n\tint _miVar3;\r\n\tint _miVar4;\r\n\tint _miVar5;\r\n\tint _miVar6;\r\n\tint _miVar7;\r\n\tint _miVar8;\r\n} MissileStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// effects/sound\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct CKINFO {\r\n\tDWORD dwSize;\r\n\tDWORD dwOffset;\r\n} CKINFO;\r\n\r\ntypedef struct TSnd {\r\n\tWAVEFORMATEX fmt;\r\n\tCKINFO chunk;\r\n\tconst char *sound_path;\r\n\tLPDIRECTSOUNDBUFFER DSB;\r\n\tint start_tc;\r\n} TSnd;\r\n\r\n#pragma pack(push, 1)\r\ntypedef struct TSFX {\r\n\tunsigned char bFlags;\r\n\tconst char *pszName;\r\n\tTSnd *pSnd;\r\n} TSFX;\r\n#pragma pack(pop)\r\n\r\n//////////////////////////////////////////////////\r\n// monster\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct AnimStruct {\r\n\tBYTE *CMem;\r\n\tBYTE *Data[8];\r\n\tint Frames;\r\n\tint Rate;\r\n} AnimStruct;\r\n\r\ntypedef struct MonsterData {\r\n\tint width;\r\n\tint mImage;\r\n\tconst char *GraphicType;\r\n\tBOOL has_special;\r\n\tconst char *sndfile;\r\n\tBOOL snd_special;\r\n\tBOOL has_trans;\r\n\tconst char *TransFile;\r\n\tint Frames[6];\r\n\tint Rate[6];\r\n\tconst char *mName;\r\n\tchar mMinDLvl;\r\n\tchar mMaxDLvl;\r\n\tchar mLevel;\r\n\tint mMinHP;\r\n\tint mMaxHP;\r\n\tchar mAi;\r\n\tint mFlags;\r\n\tunsigned char mInt;\r\n\tunsigned char mHit; // BUGFIX: Some monsters overflow this value on high difficulty\r\n\tunsigned char mAFNum;\r\n\tunsigned char mMinDamage;\r\n\tunsigned char mMaxDamage;\r\n\tunsigned char mHit2; // BUGFIX: Some monsters overflow this value on high difficulty\r\n\tunsigned char mAFNum2;\r\n\tunsigned char mMinDamage2;\r\n\tunsigned char mMaxDamage2;\r\n\tunsigned char mArmorClass;\r\n\tchar mMonstClass;\r\n\tunsigned short mMagicRes;\r\n\tunsigned short mMagicRes2;\r\n\tunsigned short mTreasure;\r\n\tchar mSelFlag;\r\n\tunsigned short mExp;\r\n} MonsterData;\r\n\r\ntypedef struct CMonster {\r\n#ifdef HELLFIRE\r\n\tint mtype;\r\n#else\r\n\tunsigned char mtype;\r\n#endif\r\n\t// TODO: Add enum for place flags\r\n\tunsigned char mPlaceFlags;\r\n\tAnimStruct Anims[6];\r\n\tTSnd *Snds[4][2];\r\n\tint width;\r\n\tint width2;\r\n#ifdef HELLFIRE\r\n\tint mMinHP;\r\n\tint mMaxHP;\r\n#else\r\n\tunsigned char mMinHP;\r\n\tunsigned char mMaxHP;\r\n#endif\r\n\tBOOL has_special;\r\n\tunsigned char mAFNum;\r\n\tchar mdeadval;\r\n\tMonsterData *MData;\r\n\t// A TRN file contains a sequence of colour transitions, represented\r\n\t// as indexes into a palette. (a 256 byte array of palette indices)\r\n\tBYTE *trans_file;\r\n} CMonster;\r\n\r\ntypedef struct MonsterStruct { // note: missing field _mAFNum\r\n\tint _mMTidx;\r\n\tint _mmode; /* MON_MODE */\r\n\tunsigned char _mgoal;\r\n\tint _mgoalvar1;\r\n\tint _mgoalvar2;\r\n\tint _mgoalvar3;\r\n\tint field_18;\r\n\tunsigned char _pathcount;\r\n\tint _mx;                // Tile X-position of monster\r\n\tint _my;                // Tile Y-position of monster\r\n\tint _mfutx;             // Future tile X-position of monster. Set at start of walking animation\r\n\tint _mfuty;             // Future tile Y-position of monster. Set at start of walking animation\r\n\tint _moldx;             // Most recent X-position in dMonster.\r\n\tint _moldy;             // Most recent Y-position in dMonster.\r\n\tint _mxoff;             // Monster sprite's pixel X-offset from tile.\r\n\tint _myoff;             // Monster sprite's pixel Y-offset from tile.\r\n\tint _mxvel;             // Pixel X-velocity while walking. Applied to _mxoff\r\n\tint _myvel;             // Pixel Y-velocity while walking. Applied to _myoff\r\n\tint _mdir;              // Direction faced by monster (direction enum)\r\n\tint _menemy;            // The current target of the monster. An index into either the plr or monster array based on the _meflag value.\r\n\tunsigned char _menemyx; // X-coordinate of enemy (usually correspond's to the enemy's futx value)\r\n\tunsigned char _menemyy; // Y-coordinate of enemy (usually correspond's to the enemy's futy value)\r\n\tshort falign_52;        // probably _mAFNum (unused)\r\n\tunsigned char *_mAnimData;\r\n\tint _mAnimDelay; // Tick length of each frame in the current animation\r\n\tint _mAnimCnt;   // Increases by one each game tick, counting how close we are to _pAnimDelay\r\n\tint _mAnimLen;   // Number of frames in current animation\r\n\tint _mAnimFrame; // Current frame of animation.\r\n\tBOOL _meflag;\r\n\tBOOL _mDelFlag;\r\n\tint _mVar1;\r\n\tint _mVar2;\r\n\tint _mVar3;\r\n\tint _mVar4;\r\n\tint _mVar5;\r\n\tint _mVar6; // Used as _mxoff but with a higher range so that we can correctly apply velocities of a smaller number\r\n\tint _mVar7; // Used as _myoff but with a higher range so that we can correctly apply velocities of a smaller number\r\n\tint _mVar8; // Value used to measure progress for moving from one tile to another\r\n\tint _mmaxhp;\r\n\tint _mhitpoints;\r\n\tunsigned char _mAi;\r\n\tunsigned char _mint;\r\n\tshort falign_9A;\r\n\tint _mFlags;\r\n\tBYTE _msquelch;\r\n\tint falign_A4;\r\n\tint _lastx;\r\n\tint _lasty;\r\n\tint _mRndSeed;\r\n\tint _mAISeed;\r\n\tint falign_B8;\r\n\tunsigned char _uniqtype;\r\n\tunsigned char _uniqtrans;\r\n\tchar _udeadval;\r\n\tchar mWhoHit;\r\n\tchar mLevel;\r\n\tunsigned short mExp;\r\n\tunsigned char mHit;\r\n\tunsigned char mMinDamage;\r\n\tunsigned char mMaxDamage;\r\n\tunsigned char mHit2;\r\n\tunsigned char mMinDamage2;\r\n\tunsigned char mMaxDamage2;\r\n#ifdef HELLFIRE\r\n\tchar mArmorClass;\r\n#else\r\n\tunsigned char mArmorClass;\r\n#endif\r\n\tchar falign_CB;\r\n\tunsigned short mMagicRes;\r\n\tint mtalkmsg;\r\n\tunsigned char leader;\r\n\tunsigned char leaderflag;\r\n\tunsigned char packsize;\r\n\tunsigned char mlid;\r\n\tconst char *mName;\r\n\tCMonster *MType;\r\n\tMonsterData *MData;\r\n} MonsterStruct;\r\n\r\ntypedef struct UniqMonstStruct {\r\n#ifdef HELLFIRE\r\n\tint mtype;\r\n#else\r\n\tchar mtype;\r\n#endif\r\n\tconst char *mName;\r\n\tconst char *mTrnName;\r\n\tunsigned char mlevel;\r\n\tunsigned short mmaxhp;\r\n\tunsigned char mAi;\r\n\tunsigned char mint;\r\n\tunsigned char mMinDamage;\r\n\tunsigned char mMaxDamage;\r\n\tunsigned short mMagicRes;\r\n\tunsigned short mUnqAttr;\r\n\tunsigned char mUnqVar1;\r\n\tunsigned char mUnqVar2;\r\n\tint mtalkmsg;\r\n} UniqMonstStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// objects\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct ObjDataStruct {\r\n\tchar oload;\r\n\tchar ofindex;\r\n\tchar ominlvl;\r\n\tchar omaxlvl;\r\n\tchar olvltype;\r\n\tchar otheme;\r\n\tchar oquest;\r\n\tint oAnimFlag;\r\n\tint oAnimDelay; // Tick length of each frame in the current animation\r\n\tint oAnimLen;   // Number of frames in current animation\r\n\tint oAnimWidth;\r\n\tBOOL oSolidFlag;\r\n\tBOOL oMissFlag;\r\n\tBOOL oLightFlag;\r\n\tchar oBreak;\r\n\tchar oSelFlag;\r\n\tBOOL oTrapFlag;\r\n} ObjDataStruct;\r\n\r\ntypedef struct ObjectStruct {\r\n\tint _otype;\r\n\tint _ox;\r\n\tint _oy;\r\n\tint _oLight;\r\n\tint _oAnimFlag;\r\n\tunsigned char *_oAnimData;\r\n\tint _oAnimDelay; // Tick length of each frame in the current animation\r\n\tint _oAnimCnt;   // Increases by one each game tick, counting how close we are to _pAnimDelay\r\n\tint _oAnimLen;   // Number of frames in current animation\r\n\tint _oAnimFrame; // Current frame of animation.\r\n\tint _oAnimWidth;\r\n\tint _oAnimWidth2;\r\n\tBOOL _oDelFlag;\r\n\tchar _oBreak; // check\r\n\tBOOL _oSolidFlag;\r\n\tBOOL _oMissFlag;\r\n\tchar _oSelFlag; // check\r\n\tBOOL _oPreFlag;\r\n\tBOOL _oTrapFlag;\r\n\tBOOL _oDoorFlag;\r\n\tint _olid;\r\n\tint _oRndSeed;\r\n\tint _oVar1;\r\n\tint _oVar2;\r\n\tint _oVar3;\r\n\tint _oVar4;\r\n\tint _oVar5;\r\n\tint _oVar6;\r\n\tint _oVar7;\r\n\tint _oVar8;\r\n} ObjectStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// portal\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct PortalStruct {\r\n\tBOOL open;\r\n\tint x;\r\n\tint y;\r\n\tint level;\r\n\tint ltype;\r\n\tBOOL setlvl;\r\n} PortalStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// msg\r\n//////////////////////////////////////////////////\r\n\r\n#pragma pack(push, 1)\r\ntypedef struct TCmd {\r\n\tBYTE bCmd;\r\n} TCmd;\r\n\r\ntypedef struct TCmdLoc {\r\n\tBYTE bCmd;\r\n\tBYTE x;\r\n\tBYTE y;\r\n} TCmdLoc;\r\n\r\ntypedef struct TCmdLocParam1 {\r\n\tBYTE bCmd;\r\n\tBYTE x;\r\n\tBYTE y;\r\n\tWORD wParam1;\r\n} TCmdLocParam1;\r\n\r\ntypedef struct TCmdLocParam2 {\r\n\tBYTE bCmd;\r\n\tBYTE x;\r\n\tBYTE y;\r\n\tWORD wParam1;\r\n\tWORD wParam2;\r\n} TCmdLocParam2;\r\n\r\ntypedef struct TCmdLocParam3 {\r\n\tBYTE bCmd;\r\n\tBYTE x;\r\n\tBYTE y;\r\n\tWORD wParam1;\r\n\tWORD wParam2;\r\n\tWORD wParam3;\r\n} TCmdLocParam3;\r\n\r\ntypedef struct TCmdParam1 {\r\n\tBYTE bCmd;\r\n\tWORD wParam1;\r\n} TCmdParam1;\r\n\r\ntypedef struct TCmdParam2 {\r\n\tBYTE bCmd;\r\n\tWORD wParam1;\r\n\tWORD wParam2;\r\n} TCmdParam2;\r\n\r\ntypedef struct TCmdParam3 {\r\n\tBYTE bCmd;\r\n\tWORD wParam1;\r\n\tWORD wParam2;\r\n\tWORD wParam3;\r\n} TCmdParam3;\r\n\r\ntypedef struct TCmdGolem {\r\n\tBYTE bCmd;\r\n\tBYTE _mx;\r\n\tBYTE _my;\r\n\tBYTE _mdir;\r\n\tchar _menemy;\r\n\tint _mhitpoints;\r\n\tBYTE _currlevel;\r\n} TCmdGolem;\r\n\r\ntypedef struct TCmdQuest {\r\n\tBYTE bCmd;\r\n\tBYTE q;\r\n\tBYTE qstate;\r\n\tBYTE qlog;\r\n\tBYTE qvar1;\r\n} TCmdQuest;\r\n\r\ntypedef struct TCmdGItem {\r\n\tBYTE bCmd;\r\n\tBYTE bMaster;\r\n\tBYTE bPnum;\r\n\tBYTE bCursitem;\r\n\tBYTE bLevel;\r\n\tBYTE x;\r\n\tBYTE y;\r\n\tWORD wIndx;\r\n\tWORD wCI;\r\n\tint dwSeed;\r\n\tBYTE bId;\r\n\tBYTE bDur;\r\n\tBYTE bMDur;\r\n\tBYTE bCh;\r\n\tBYTE bMCh;\r\n\tWORD wValue;\r\n\tDWORD dwBuff;\r\n\tint dwTime;\r\n#ifdef HELLFIRE\r\n\tWORD wToHit;\r\n\tWORD wMaxDam;\r\n\tBYTE bMinStr;\r\n\tBYTE bMinMag;\r\n\tBYTE bMinDex;\r\n\tBYTE bAC;\r\n#endif\r\n} TCmdGItem;\r\n\r\ntypedef struct TCmdPItem {\r\n\tBYTE bCmd;\r\n\tBYTE x;\r\n\tBYTE y;\r\n\tWORD wIndx;\r\n\tWORD wCI;\r\n\tint dwSeed;\r\n\tBYTE bId;\r\n\tBYTE bDur;\r\n\tBYTE bMDur;\r\n\tBYTE bCh;\r\n\tBYTE bMCh;\r\n\tWORD wValue;\r\n\tDWORD dwBuff;\r\n#ifdef HELLFIRE\r\n\tWORD wToHit;\r\n\tWORD wMaxDam;\r\n\tBYTE bMinStr;\r\n\tBYTE bMinMag;\r\n\tBYTE bMinDex;\r\n\tBYTE bAC;\r\n#endif\r\n} TCmdPItem;\r\n\r\ntypedef struct TCmdChItem {\r\n\tBYTE bCmd;\r\n\tBYTE bLoc;\r\n\tWORD wIndx;\r\n\tWORD wCI;\r\n\tint dwSeed;\r\n\tBOOLEAN bId;\r\n} TCmdChItem;\r\n\r\ntypedef struct TCmdDelItem {\r\n\tBYTE bCmd;\r\n\tBYTE bLoc;\r\n} TCmdDelItem;\r\n\r\ntypedef struct TCmdDamage {\r\n\tBYTE bCmd;\r\n\tBYTE bPlr;\r\n\tDWORD dwDam;\r\n} TCmdDamage;\r\n\r\n#ifdef HELLFIRE\r\ntypedef struct TCmdMonDamage {\r\n\tBYTE bCmd;\r\n\tWORD wMon;\r\n\tDWORD dwDam;\r\n} TCmdMonDamage;\r\n#endif\r\n\r\ntypedef struct TCmdPlrInfoHdr {\r\n\tBYTE bCmd;\r\n\tWORD wOffset;\r\n\tWORD wBytes;\r\n} TCmdPlrInfoHdr;\r\n\r\ntypedef struct TCmdString {\r\n\tBYTE bCmd;\r\n\tchar str[MAX_SEND_STR_LEN];\r\n} TCmdString;\r\n\r\ntypedef struct TFakeCmdPlr {\r\n\tBYTE bCmd;\r\n\tBYTE bPlr;\r\n} TFakeCmdPlr;\r\n\r\ntypedef struct TFakeDropPlr {\r\n\tBYTE bCmd;\r\n\tBYTE bPlr;\r\n\tDWORD dwReason;\r\n} TFakeDropPlr;\r\n\r\ntypedef struct TSyncHeader {\r\n\tBYTE bCmd;\r\n\tBYTE bLevel;\r\n\tWORD wLen;\r\n\tBYTE bObjId;\r\n\tBYTE bObjCmd;\r\n\tBYTE bItemI;\r\n\tBYTE bItemX;\r\n\tBYTE bItemY;\r\n\tWORD wItemIndx;\r\n\tWORD wItemCI;\r\n\tDWORD dwItemSeed;\r\n\tBYTE bItemId;\r\n\tBYTE bItemDur;\r\n\tBYTE bItemMDur;\r\n\tBYTE bItemCh;\r\n\tBYTE bItemMCh;\r\n\tWORD wItemVal;\r\n\tDWORD dwItemBuff;\r\n\tBYTE bPInvLoc;\r\n\tWORD wPInvIndx;\r\n\tWORD wPInvCI;\r\n\tDWORD dwPInvSeed;\r\n\tBYTE bPInvId;\r\n#ifdef HELLFIRE\r\n\tWORD wToHit;\r\n\tWORD wMaxDam;\r\n\tBYTE bMinStr;\r\n\tBYTE bMinMag;\r\n\tBYTE bMinDex;\r\n\tBYTE bAC;\r\n#endif\r\n} TSyncHeader;\r\n\r\ntypedef struct TSyncMonster {\r\n\tBYTE _mndx;\r\n\tBYTE _mx;\r\n\tBYTE _my;\r\n\tBYTE _menemy;\r\n\tBYTE _mdelta;\r\n} TSyncMonster;\r\n\r\ntypedef struct TPktHdr {\r\n\tBYTE px;\r\n\tBYTE py;\r\n\tBYTE targx;\r\n\tBYTE targy;\r\n\tint php;\r\n\tint pmhp;\r\n\tBYTE bstr;\r\n\tBYTE bmag;\r\n\tBYTE bdex;\r\n\tWORD wCheck;\r\n\tWORD wLen;\r\n} TPktHdr;\r\n\r\ntypedef struct TPkt {\r\n\tTPktHdr hdr;\r\n\tBYTE body[493];\r\n} TPkt;\r\n\r\ntypedef struct DMonsterStr {\r\n\tBYTE _mx;\r\n\tBYTE _my;\r\n\tBYTE _mdir;\r\n\tBYTE _menemy;\r\n\tBYTE _mactive;\r\n\tint _mhitpoints;\r\n} DMonsterStr;\r\n\r\ntypedef struct DObjectStr {\r\n\tBYTE bCmd;\r\n} DObjectStr;\r\n\r\ntypedef struct DLevel {\r\n\tTCmdPItem item[MAXITEMS];\r\n\tDObjectStr object[MAXOBJECTS];\r\n\tDMonsterStr monster[MAXMONSTERS];\r\n} DLevel;\r\n\r\ntypedef struct LocalLevel {\r\n\tBYTE automapsv[DMAXX][DMAXY];\r\n} LocalLevel;\r\n\r\ntypedef struct DPortal {\r\n\tBYTE x;\r\n\tBYTE y;\r\n\tBYTE level;\r\n\tBYTE ltype;\r\n\tBYTE setlvl;\r\n} DPortal;\r\n\r\ntypedef struct MultiQuests {\r\n\tBYTE qstate;\r\n\tBYTE qlog;\r\n\tBYTE qvar1;\r\n} MultiQuests;\r\n\r\ntypedef struct DJunk {\r\n\tDPortal portal[MAXPORTAL];\r\n\tMultiQuests quests[MAXMULTIQUESTS];\r\n} DJunk;\r\n#pragma pack(pop)\r\n\r\ntypedef struct TMegaPkt {\r\n\tstruct TMegaPkt *pNext;\r\n\tDWORD dwSpaceLeft;\r\n\tBYTE data[32000];\r\n} TMegaPkt;\r\n\r\ntypedef struct TBuffer {\r\n\tDWORD dwNextWriteOffset;\r\n\tBYTE bData[4096];\r\n} TBuffer;\r\n\r\n//////////////////////////////////////////////////\r\n// quests\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct QuestStruct {\r\n\tunsigned char _qlevel;\r\n\tunsigned char _qtype;\r\n\tunsigned char _qactive;\r\n\tunsigned char _qlvltype;\r\n\tint _qtx;\r\n\tint _qty;\r\n\tunsigned char _qslvl;\r\n\tunsigned char _qidx;\r\n#ifndef HELLFIRE\r\n\tunsigned char _qmsg;\r\n#else\r\n\tunsigned int _qmsg;\r\n#endif\r\n\tunsigned char _qvar1;\r\n\tunsigned char _qvar2;\r\n\tBOOL _qlog;\r\n} QuestStruct;\r\n\r\ntypedef struct QuestData {\r\n\tunsigned char _qdlvl;\r\n\tchar _qdmultlvl;\r\n\tunsigned char _qlvlt;\r\n\tunsigned char _qdtype;\r\n\tunsigned char _qdrnd;\r\n\tunsigned char _qslvl;\r\n\tint _qflags; /* unsigned char */\r\n\tint _qdmsg;\r\n\tconst char *_qlstr;\r\n} QuestData;\r\n\r\n#ifdef HELLFIRE\r\ntypedef struct CornerStoneStruct {\r\n\tint x;\r\n\tint y;\r\n\tBOOL activated;\r\n\tItemStruct item;\r\n} CornerStoneStruct;\r\n#endif\r\n\r\n//////////////////////////////////////////////////\r\n// gamemenu/gmenu\r\n//////////////////////////////////////////////////\r\n\r\n// TPDEF PTR FCN VOID TMenuFcn\r\n\r\ntypedef struct TMenuItem {\r\n\tDWORD dwFlags;\r\n\tconst char *pszStr;\r\n\tvoid (*fnMenu)(BOOL); /* fix, should have one arg */\r\n} TMenuItem;\r\n\r\n// TPDEF PTR FCN VOID TMenuUpdateFcn\r\n\r\n//////////////////////////////////////////////////\r\n// spells\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct SpellData {\r\n\tunsigned char sName;\r\n\tunsigned char sManaCost;\r\n\tunsigned char sType;\r\n\tconst char *sNameText;\r\n\tconst char *sSkillText;\r\n\tint sBookLvl;\r\n\tint sStaffLvl;\r\n\tBOOL sTargeted;\r\n\tBOOL sTownSpell;\r\n\tint sMinInt;\r\n\tunsigned char sSFX;\r\n\tunsigned char sMissiles[3];\r\n\tunsigned char sManaAdj;\r\n\tunsigned char sMinMana;\r\n\tint sStaffMin;\r\n\tint sStaffMax;\r\n\tint sBookCost;\r\n\tint sStaffCost;\r\n} SpellData;\r\n\r\n//////////////////////////////////////////////////\r\n// towners\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct TNQ {\r\n\tunsigned char _qsttype;\r\n\tunsigned char _qstmsg;\r\n\tBOOLEAN _qstmsgact;\r\n} TNQ;\r\n\r\ntypedef struct TownerStruct {\r\n\tint _tmode;\r\n\tint _ttype;\r\n\tint _tx;    // Tile X-position of NPC\r\n\tint _ty;    // Tile Y-position of NPC\r\n\tint _txoff; // Sprite X-offset (unused)\r\n\tint _tyoff; // Sprite Y-offset (unused)\r\n\tint _txvel; // X-velocity during movement (unused)\r\n\tint _tyvel; // Y-velocity during movement (unused)\r\n\tint _tdir;  // Facing of NPC (unused)\r\n\tunsigned char *_tAnimData;\r\n\tint _tAnimDelay; // Tick length of each frame in the current animation\r\n\tint _tAnimCnt;   // Increases by one each game tick, counting how close we are to _pAnimDelay\r\n\tint _tAnimLen;   // Number of frames in current animation\r\n\tint _tAnimFrame; // Current frame of animation.\r\n\tint _tAnimFrameCnt;\r\n\tchar _tAnimOrder;\r\n\tint _tAnimWidth;\r\n\tint _tAnimWidth2;\r\n\tint _tTenPer;\r\n\tint _teflag;\r\n\tint _tbtcnt;\r\n\tint _tSelFlag;\r\n\tBOOL _tMsgSaid;\r\n\tTNQ qsts[MAXQUESTS];\r\n\tint _tSeed;\r\n\tint _tVar1;\r\n\tint _tVar2;\r\n\tint _tVar3;\r\n\tint _tVar4;\r\n\tchar _tName[PLR_NAME_LEN];\r\n\tunsigned char *_tNAnim[8];\r\n\tint _tNFrames;\r\n\tunsigned char *_tNData;\r\n} TownerStruct;\r\n\r\ntypedef struct QuestTalkData {\r\n\tint _qinfra;\r\n\tint _qblkm;\r\n\tint _qgarb;\r\n\tint _qzhar;\r\n\tint _qveil;\r\n\tint _qmod;\r\n\tint _qbutch;\r\n\tint _qbol;\r\n\tint _qblind;\r\n\tint _qblood;\r\n\tint _qanvil;\r\n\tint _qwarlrd;\r\n\tint _qking;\r\n\tint _qpw;\r\n\tint _qbone;\r\n\tint _qvb;\r\n#ifdef HELLFIRE\r\n\tint _qgrv;\r\n\tint _qfarm;\r\n\tint _qgirl;\r\n\tint _qtrade;\r\n\tint _qdefiler;\r\n\tint _qnakrul;\r\n\tint _qjersy;\r\n\tint _qhf8;\r\n#endif\r\n} QuestTalkData;\r\n\r\n//////////////////////////////////////////////////\r\n// gendung\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct ScrollStruct {\r\n\tint _sxoff; // X-offset of camera position. This usually corresponds to a negative version of plr[myplr]._pxoff\r\n\tint _syoff; // Y-offset of camera position. This usually corresponds to a negative version of plr[myplr]._pyoff\r\n\tint _sdx;\r\n\tint _sdy;\r\n\tint _sdir;\r\n} ScrollStruct;\r\n\r\ntypedef struct THEME_LOC {\r\n\tint x;\r\n\tint y;\r\n\tint ttval;\r\n\tint width;\r\n\tint height;\r\n} THEME_LOC;\r\n\r\ntypedef struct MICROS {\r\n\tWORD mt[16];\r\n} MICROS;\r\n\r\n//////////////////////////////////////////////////\r\n// drlg\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct ShadowStruct {\r\n\tunsigned char strig;\r\n\tunsigned char s1;\r\n\tunsigned char s2;\r\n\tunsigned char s3;\r\n\tunsigned char nv1;\r\n\tunsigned char nv2;\r\n\tunsigned char nv3;\r\n} ShadowStruct;\r\n\r\ntypedef struct HALLNODE {\r\n\tint nHallx1;\r\n\tint nHally1;\r\n\tint nHallx2;\r\n\tint nHally2;\r\n\tint nHalldir;\r\n\tstruct HALLNODE *pNext;\r\n} HALLNODE;\r\n\r\ntypedef struct ROOMNODE {\r\n\tint nRoomx1;\r\n\tint nRoomy1;\r\n\tint nRoomx2;\r\n\tint nRoomy2;\r\n\tint nRoomDest;\r\n} ROOMNODE;\r\n\r\n//////////////////////////////////////////////////\r\n// themes\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct ThemeStruct {\r\n\tchar ttype; /* aligned 4 */\r\n\tint ttval;\r\n} ThemeStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// inv\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct InvXY {\r\n\tint X;\r\n\tint Y;\r\n} InvXY;\r\n\r\n//////////////////////////////////////////////////\r\n// lighting\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct LightListStruct {\r\n\tint _lx;\r\n\tint _ly;\r\n\tint _lradius;\r\n\tint _lid;\r\n\tint _ldel;\r\n\tint _lunflag;\r\n\tint field_18;\r\n\tint _lunx;\r\n\tint _luny;\r\n\tint _lunr;\r\n\tint _xoff;\r\n\tint _yoff;\r\n\tint _lflags;\r\n} LightListStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// dead\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct DeadStruct {\r\n\tunsigned char *_deadData[8];\r\n\tint _deadFrame;\r\n\tint _deadWidth;\r\n\tint _deadWidth2;\r\n\tchar _deadtrans;\r\n} DeadStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// diabloui\r\n//////////////////////////////////////////////////\r\n\r\n// TPDEF PTR FCN VOID PLAYSND\r\n\r\ntypedef struct _gamedata {\r\n\tint dwSeed;\r\n\tBYTE bDiff;\r\n} _gamedata;\r\n\r\ntypedef struct _uidefaultstats {\r\n\tWORD strength;\r\n\tWORD magic;\r\n\tWORD dexterity;\r\n\tWORD vitality;\r\n} _uidefaultstats;\r\n\r\ntypedef struct _uiheroinfo {\r\n\tstruct _uiheroinfo *next;\r\n\tchar name[16];\r\n\tWORD level;\r\n\tBYTE heroclass;\r\n\tBYTE herorank;\r\n\tWORD strength;\r\n\tWORD magic;\r\n\tWORD dexterity;\r\n\tWORD vitality;\r\n\tint gold;\r\n\tint hassaved;\r\n\tBOOL spawned;\r\n} _uiheroinfo;\r\n\r\n// TPDEF PTR FCN UCHAR ENUMHEROPROC\r\n// TPDEF PTR FCN UCHAR ENUMHEROS\r\n// TPDEF PTR FCN UCHAR CREATEHERO\r\n// TPDEF PTR FCN UCHAR DELETEHERO\r\n// TPDEF PTR FCN UCHAR GETDEFHERO\r\n\r\n// TPDEF PTR FCN INT PROGRESSFCN\r\n\r\n//////////////////////////////////////////////////\r\n// storm\r\n//////////////////////////////////////////////////\r\n\r\n// TPDEF PTR FCN UCHAR SMSGIDLEPROC\r\n// TPDEF PTR FCN VOID SMSGHANDLER\r\n\r\ntypedef struct _SNETCAPS {\r\n\tDWORD size;\r\n\tDWORD flags;\r\n\tDWORD maxmessagesize;\r\n\tDWORD maxqueuesize;\r\n\tDWORD maxplayers;\r\n\tDWORD bytessec;\r\n\tDWORD latencyms;\r\n\tDWORD defaultturnssec;\r\n\tDWORD defaultturnsintransit;\r\n} _SNETCAPS;\r\n\r\ntypedef struct _SNETEVENT {\r\n\tDWORD eventid;\r\n\tDWORD playerid;\r\n\tvoid *data;\r\n\tDWORD databytes;\r\n} _SNETEVENT;\r\n\r\n// TPDEF PTR FCN UCHAR SNETABORTPROC\r\n// TPDEF PTR FCN UCHAR SNETCATEGORYPROC\r\n// TPDEF PTR FCN UCHAR SNETCHECKAUTHPROC\r\n// TPDEF PTR FCN UCHAR SNETCREATEPROC\r\n// TPDEF PTR FCN UCHAR SNETDRAWDESCPROC\r\n// TPDEF PTR FCN UCHAR SNETENUMDEVICESPROC\r\n// TPDEF PTR FCN UCHAR SNETENUMGAMESPROC\r\n// TPDEF PTR FCN UCHAR SNETENUMPROVIDERSPROC\r\n// TPDEF PTR FCN VOID SNETEVENTPROC\r\n// TPDEF PTR FCN UCHAR SNETGETARTPROC\r\n// TPDEF PTR FCN UCHAR SNETGETDATAPROC\r\n// TPDEF PTR FCN INT SNETMESSAGEBOXPROC\r\n// TPDEF PTR FCN UCHAR SNETPLAYSOUNDPROC\r\n// TPDEF PTR FCN UCHAR SNETSELECTEDPROC\r\n// TPDEF PTR FCN UCHAR SNETSTATUSPROC\r\n\r\ntypedef struct _SNETPLAYERDATA {\r\n\tint size;\r\n\tchar *playername;\r\n\tchar *playerdescription;\r\n\tint reserved;\r\n} _SNETPLAYERDATA;\r\n\r\ntypedef struct _SNETPROGRAMDATA {\r\n\tint size;\r\n\tconst char *programname;\r\n\tconst char *programdescription;\r\n\tint programid;\r\n\tint versionid;\r\n\tint reserved1;\r\n\tint maxplayers;\r\n\t_gamedata *initdata;\r\n\tint initdatabytes;\r\n\tvoid *reserved2;\r\n\tint optcategorybits;\r\n\tchar *cdkey;\r\n\tchar *registereduser;\r\n\tint spawned;\r\n\tint lcid;\r\n} _SNETPROGRAMDATA;\r\n\r\ntypedef struct _SNETUIDATA {\r\n\tint size;\r\n\tint uiflags;\r\n\tHWND parentwindow;\r\n\tvoid (*artcallback)();\r\n\tvoid (*authcallback)();\r\n\tvoid (*createcallback)();\r\n\tvoid (*drawdesccallback)();\r\n\tvoid (*selectedcallback)();\r\n\tvoid (*messageboxcallback)();\r\n\tvoid (*soundcallback)();\r\n\tvoid (*statuscallback)();\r\n\tvoid (*getdatacallback)();\r\n\tvoid (*categorycallback)();\r\n\tvoid (*categorylistcallback)();\r\n\tvoid (*newaccountcallback)();\r\n\tvoid (*profilecallback)();\r\n\tconst char **profilefields;\r\n\tvoid (*profilebitmapcallback)();\r\n\tint(__stdcall *selectnamecallback)(\r\n\t    const struct _SNETPROGRAMDATA *,\r\n\t    const struct _SNETPLAYERDATA *,\r\n\t    const struct _SNETUIDATA *,\r\n\t    const struct _SNETVERSIONDATA *,\r\n\t    DWORD provider, /* e.g. 'IPXN', 'BNET' etc. */\r\n\t    char *, DWORD,  /* character name will be copied here */\r\n\t    char *, DWORD,  /* character \"description\" will be copied here (used to advertise games) */\r\n\t    BOOL *          /* new character? - unsure about this */\r\n\t);\r\n\tvoid (*changenamecallback)();\r\n} _SNETUIDATA;\r\n\r\ntypedef struct _SNETVERSIONDATA {\r\n\tint size;\r\n\tconst char *versionstring;\r\n\tconst char *executablefile;\r\n\tconst char *originalarchivefile;\r\n\tconst char *patcharchivefile;\r\n} _SNETVERSIONDATA;\r\n\r\n// TPDEF PTR FCN UCHAR SNETSPIBIND\r\n// TPDEF PTR FCN UCHAR SNETSPIQUERY\r\n\r\n//////////////////////////////////////////////////\r\n// pack\r\n//////////////////////////////////////////////////\r\n\r\n#pragma pack(push, 1)\r\ntypedef struct PkItemStruct {\r\n\tDWORD iSeed;\r\n\tWORD iCreateInfo;\r\n\tWORD idx;\r\n\tBYTE bId;\r\n\tBYTE bDur;\r\n\tBYTE bMDur;\r\n\tBYTE bCh;\r\n\tBYTE bMCh;\r\n\tWORD wValue;\r\n\tDWORD dwBuff;\r\n} PkItemStruct;\r\n\r\ntypedef struct PkPlayerStruct {\r\n\tFILETIME archiveTime;\r\n\tchar destAction;\r\n\tchar destParam1;\r\n\tchar destParam2;\r\n\tBYTE plrlevel;\r\n\tBYTE px;\r\n\tBYTE py;\r\n\tBYTE targx;\r\n\tBYTE targy;\r\n\tchar pName[PLR_NAME_LEN];\r\n\tchar pClass;\r\n\tBYTE pBaseStr;\r\n\tBYTE pBaseMag;\r\n\tBYTE pBaseDex;\r\n\tBYTE pBaseVit;\r\n\tchar pLevel;\r\n\tBYTE pStatPts;\r\n\tint pExperience;\r\n\tint pGold;\r\n\tint pHPBase;\r\n\tint pMaxHPBase;\r\n\tint pManaBase;\r\n\tint pMaxManaBase;\r\n\tchar pSplLvl[37]; // Should be MAX_SPELLS but set to 37 to make save games compatible\r\n\tunsigned __int64 pMemSpells;\r\n\tPkItemStruct InvBody[NUM_INVLOC];\r\n\tPkItemStruct InvList[NUM_INV_GRID_ELEM];\r\n\tchar InvGrid[NUM_INV_GRID_ELEM];\r\n\tBYTE _pNumInv;\r\n\tPkItemStruct SpdList[MAXBELTITEMS];\r\n\tchar pTownWarps;\r\n\tchar pDungMsgs;\r\n\tchar pLvlLoad;\r\n#ifdef HELLFIRE\r\n\tunsigned char pDungMsgs2;\r\n#else\r\n\tchar pBattleNet;\r\n#endif\r\n\tBOOLEAN pManaShield;\r\n\tchar bReserved[3];\r\n\tWORD wReflections;\r\n\tshort wReserved2;\r\n\tchar pSplLvl2[10]; // Hellfire spells\r\n\tshort wReserved8;\r\n\tDWORD pDiabloKillLevel;\r\n\tint pDifficulty;\r\n\tint pDamAcFlags;\r\n\tint dwReserved[5];\r\n} PkPlayerStruct;\r\n#pragma pack(pop)\r\n\r\n//////////////////////////////////////////////////\r\n// path\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct PATHNODE {\r\n\tchar f;\r\n\tchar h;\r\n\tchar g;\r\n\tint x;\r\n\tint y;\r\n\tstruct PATHNODE *Parent;\r\n\tstruct PATHNODE *Child[8];\r\n\tstruct PATHNODE *NextNode;\r\n} PATHNODE;\r\n\r\n// TPDEF PTR FCN UCHAR CHECKFUNC1\r\n\r\n// TPDEF PTR FCN UCHAR CHECKFUNC\r\n\r\n//////////////////////////////////////////////////\r\n// sha\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct SHA1Context {\r\n\tint state[5];\r\n\tint count[2];\r\n\tchar buffer[64];\r\n} SHA1Context;\r\n\r\n//////////////////////////////////////////////////\r\n// tmsg\r\n//////////////////////////////////////////////////\r\n\r\n#pragma pack(push, 1)\r\ntypedef struct TMsg TMsg;\r\n\r\ntypedef struct TMsgHdr {\r\n\tTMsg *pNext;\r\n\tint dwTime;\r\n\tBYTE bLen;\r\n} TMsgHdr;\r\n\r\ntypedef struct TMsg {\r\n\tTMsgHdr hdr;\r\n\t// this is actually alignment padding, but the message body is appended to the struct\r\n\t// so it's convenient to use byte-alignment and name it \"body\"\r\n\tunsigned char body[3];\r\n} TMsg;\r\n#pragma pack(pop)\r\n\r\n//////////////////////////////////////////////////\r\n// mpqapi\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct _FILEHEADER {\r\n\tint signature;\r\n\tint headersize;\r\n\tint filesize;\r\n\tWORD version;\r\n\tshort sectorsizeid;\r\n\tint hashoffset;\r\n\tint blockoffset;\r\n\tint hashcount;\r\n\tint blockcount;\r\n\tchar pad[72];\r\n} _FILEHEADER;\r\n\r\ntypedef struct _HASHENTRY {\r\n\tint hashcheck[2];\r\n\tint lcid;\r\n\tint block;\r\n} _HASHENTRY;\r\n\r\ntypedef struct _BLOCKENTRY {\r\n\tint offset;\r\n\tint sizealloc;\r\n\tint sizefile;\r\n\tint flags;\r\n} _BLOCKENTRY;\r\n\r\n// TPDEF PTR FCN UCHAR TGetNameFcn\r\n\r\n// TPDEF PTR FCN VOID TCrypt\r\n\r\n//////////////////////////////////////////////////\r\n// trigs\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct TriggerStruct {\r\n\tint _tx;\r\n\tint _ty;\r\n\tint _tmsg;\r\n\tint _tlvl;\r\n} TriggerStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// stores\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct STextStruct {\r\n\tint _sx;\r\n\tint _syoff;\r\n\tchar _sstr[128];\r\n\tBOOL _sjust;\r\n\tchar _sclr;\r\n\tint _sline;\r\n\tBOOL _ssel;\r\n\tint _sval;\r\n} STextStruct;\r\n\r\n//////////////////////////////////////////////////\r\n// wave\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct MEMFILE {\r\n\tDWORD end;\r\n\tLONG offset;\r\n\tDWORD buf_len;\r\n\tDWORD dist;\r\n\tDWORD bytes_to_read;\r\n\tBYTE *buf;\r\n\tHANDLE file;\r\n} MEMFILE;\r\n\r\n//////////////////////////////////////////////////\r\n// plrmsg\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct _plrmsg {\r\n\tDWORD time;\r\n\tunsigned char player;\r\n\tchar str[144];\r\n} _plrmsg;\r\n\r\n//////////////////////////////////////////////////\r\n// capture\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct _PcxHeader {\r\n\tBYTE Manufacturer;\r\n\tBYTE Version;\r\n\tBYTE Encoding;\r\n\tBYTE BitsPerPixel;\r\n\tWORD Xmin;\r\n\tWORD Ymin;\r\n\tWORD Xmax;\r\n\tWORD Ymax;\r\n\tWORD HDpi;\r\n\tWORD VDpi;\r\n\tBYTE Colormap[48];\r\n\tBYTE Reserved;\r\n\tBYTE NPlanes;\r\n\tWORD BytesPerLine;\r\n\tWORD PaletteInfo;\r\n\tWORD HscreenSize;\r\n\tWORD VscreenSize;\r\n\tBYTE Filler[54];\r\n} PCXHEADER;\r\n\r\n//////////////////////////////////////////////////\r\n// encrypt\r\n//////////////////////////////////////////////////\r\n\r\ntypedef struct TDataInfo {\r\n\tBYTE *srcData;\r\n\tDWORD srcOffset;\r\n\tBYTE *destData;\r\n\tDWORD destOffset;\r\n\tDWORD size;\r\n} TDataInfo;\r\n"
  },
  {
    "path": "types.h",
    "content": "/**\r\n * @file types.h\r\n *\r\n * Include OS headers and set compiler state.\r\n */\r\n#ifndef _TYPES_H\r\n#define _TYPES_H\r\n\r\n#define WIN32_LEAN_AND_MEAN\r\n\r\n#include \"resource.h\"\r\n\r\n#include <windows.h>\r\n#include <mmsystem.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <ddraw.h>\r\n#include <dsound.h>\r\n#include <io.h>\r\n#include <limits.h>\r\n#include <math.h>\r\n#include <time.h>\r\n#include <process.h>\r\n#include <shlobj.h>\r\n#include <shellapi.h>\r\n\r\n#ifdef __GNUC__\r\n#include <ctype.h>\r\n#endif\r\n\r\n// tell Visual C++ to shut the hell up\r\n#ifdef _MSC_VER\r\n#pragma warning(disable : 4305) // truncation of int\r\n#pragma warning(disable : 4018) // signed/unsigned mismatch\r\n#pragma warning(disable : 4700) // used without having been initialized\r\n#pragma warning(disable : 4244) // conversion loss\r\n#pragma warning(disable : 4146) // negative unsigned\r\n#pragma warning(disable : 4996) // deprecation warning\r\n#pragma warning(disable : 4309) // VC2017: truncation of constant value\r\n#pragma warning(disable : 4267) // VC2017: conversion from 'size_t' to 'char'\r\n#pragma warning(disable : 4302) // VC2017: type cast truncation\r\n#pragma warning(disable : 4334) // VC2017: result of 32-bit shift implicitly converted to 64 bits\r\n#endif\r\n\r\n#include \"defs.h\"\r\n#include \"enums.h\"\r\n#include \"structs.h\"\r\n\r\n#if (_MSC_VER >= 800) && (_MSC_VER <= 1200)\r\n#define USE_ASM\r\n#endif\r\n\r\n// If defined, use copy protection [Default -> Defined]\r\n#if !defined(_DEBUG) && !defined(SPAWN)\r\n#define COPYPROT\r\n#endif\r\n\r\n// If defined, don't reload for debuggers [Default -> Undefined]\r\n// Note that with patch 1.03 the command line was hosed, this is required to pass arguments to the game\r\n#ifdef _DEBUG\r\n#define DEBUGGER\r\n#endif\r\n\r\n// If defined, don't fry the CPU [Default -> Undefined]\r\n#ifdef _DEBUG\r\n#define SLEEPFIX\r\n#endif\r\n\r\n// If defined, fix palette glitch in Windows Vista+ [Default -> Undefined]\r\n//#define COLORFIX\r\n\r\n#endif\r\n"
  }
]