Hello community,

here is the log from the commit of package openxcom for openSUSE:Factory 
checked in at 2020-11-06 23:45:20
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/openxcom (Old)
 and      /work/SRC/openSUSE:Factory/.openxcom.new.11331 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "openxcom"

Fri Nov  6 23:45:20 2020 rev:8 rq:846462 version:1.0.0.1604610320.4639493f0

Changes:
--------
--- /work/SRC/openSUSE:Factory/openxcom/openxcom.changes        2020-06-26 
21:48:53.458493165 +0200
+++ /work/SRC/openSUSE:Factory/.openxcom.new.11331/openxcom.changes     
2020-11-06 23:46:17.463126270 +0100
@@ -1,0 +2,34 @@
+Fri Nov  6 13:02:20 UTC 2020 - Tomáš Chvátal <tchva...@suse.com>
+
+- Switch to cmake build system as upstream deprecates the
+  autotools one
+
+-------------------------------------------------------------------
+Fri Nov 06 12:13:12 UTC 2020 - tchva...@suse.com
+
+- Update to version 1.0.0.1604610320.4639493f0:
+  * Stop the charade
+  * Stop using in-tree builds and use the ENABLE_WARNING setting instead of 
rolling our own custom flags.
+  * Move CI to ubuntu 20.04 and use the yaml-cpp package
+  * silence OpenGL deprecation warnings on MacOS 10.14+
+  * Final fix to 25y bug with throw
+  * Make shuffle deterministic
+  * Add missing Croatian characters
+  * Prevent AI frozen in place
+  * Fix build with clang 10.0.1 on FreeBSD
+  * Hack throw bug
+  * Mission zone fix
+  * Prevent psionic capture of uncapturable units
+  * Unified production monetary cost check
+  * Fix research lookup costs
+  * Set artifact site counters when loading OG saves
+  * fix small bug with melee reaction
+  * fix up some HWP damage values
+  * fix zombie armour values
+  * fix warnings about missing override keyword
+  * fix string conversion warnings
+  * treat third-party include files as system includes
+  * Allow player access to the built-in melee attack for Lobstermen
+  * Fixed average monthly rating calculation in StatisticsState
+
+-------------------------------------------------------------------

Old:
----
  OpenXcom-1.0.0.1592170963.8ae998af3.tar.xz

New:
----
  OpenXcom-1.0.0.1604610320.4639493f0.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ openxcom.spec ++++++
--- /var/tmp/diff_new_pack.4SLwSj/_old  2020-11-06 23:46:18.039125164 +0100
+++ /var/tmp/diff_new_pack.4SLwSj/_new  2020-11-06 23:46:18.043125156 +0100
@@ -17,28 +17,24 @@
 
 
 Name:           openxcom
-Version:        1.0.0.1592170963.8ae998af3
+Version:        1.0.0.1604610320.4639493f0
 Release:        0
 Summary:        An open source reimplementation of the original X-Com game
 License:        GPL-3.0-only
 URL:            https://openxcom.org/
 Source:         OpenXcom-%{version}.tar.xz
-BuildRequires:  Mesa-devel
-BuildRequires:  autoconf
-BuildRequires:  automake
-BuildRequires:  docbook2X
+BuildRequires:  cmake
 BuildRequires:  dos2unix
-BuildRequires:  doxygen
-BuildRequires:  fdupes
-BuildRequires:  gcc
 BuildRequires:  gcc-c++
+BuildRequires:  hicolor-icon-theme
 BuildRequires:  pkgconfig
-BuildRequires:  xmlto
 BuildRequires:  pkgconfig(SDL_gfx)
 BuildRequires:  pkgconfig(SDL_image)
 BuildRequires:  pkgconfig(SDL_mixer)
+BuildRequires:  pkgconfig(gl)
 BuildRequires:  pkgconfig(sdl)
 BuildRequires:  pkgconfig(yaml-cpp) >= 0.5
+Obsoletes:      %{name}-doc
 
 %description
 OpenXcom is an open-source clone of the original UFO: Enemy Unknown
@@ -51,52 +47,23 @@
 User is required to have original gamedata (possible to obtain from e.g. Steam)
 installed to ~/.local/share/openxcom/data/
 
-%package doc
-Summary:        Documentation files for %{name}
-Requires:       %{name} = %{version}
-
-%description doc
-Documentation files for %{name} game.
-
 %prep
 %setup -q -n OpenXcom-%{version}
-
-chmod -x LICENSE.txt
-sed -i \
-       -e 's:HTML_TIMESTAMP         = YES:HTML_TIMESTAMP         = NO:g' \
-       docs/Doxyfile.in
 dos2unix *.txt
 
 %build
-autoreconf -fvi
-%configure \
-       --disable-werror \
-       --disable-silent-rules \
-       --with-docs --docdir="%{_docdir}/%{name}"
-%make_build
+%cmake
+%cmake_build
 
 %install
-%make_install
-pushd %{buildroot}%{_datadir}/pixmaps/
-ln -s openxcom_wide.svg openxcom.svg
-popd
-%fdupes %{buildroot}%{_datadir}
+%cmake_install
 
 %files
 %license LICENSE.txt
 %doc README.md CHANGELOG.txt
 %{_datadir}/applications/openxcom.desktop
-%{_mandir}/man6/openxcom.6%{?ext_man}
-%{_datadir}/pixmaps/*
+%{_datadir}/icons/hicolor/*/apps/openxcom.*
 %{_datadir}/%{name}/
-%{_docdir}/%{name}/*.txt
 %{_bindir}/%{name}
-%dir %{_docdir}/%{name}
-%exclude %{_docdir}/%{name}/html/
-
-%files doc
-%dir %{_docdir}/%{name}
-%dir %{_docdir}/%{name}/html
-%{_docdir}/%{name}/html/*
 
 %changelog

++++++ OpenXcom-1.0.0.1592170963.8ae998af3.tar.xz -> 
OpenXcom-1.0.0.1604610320.4639493f0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/.github/workflows/ci.yml 
new/OpenXcom-1.0.0.1604610320.4639493f0/.github/workflows/ci.yml
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/.github/workflows/ci.yml    
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/.github/workflows/ci.yml    
2020-11-05 22:05:20.000000000 +0100
@@ -4,63 +4,34 @@
 
 jobs:
   build:
-    name: ${{ matrix.name }} (${{ matrix.compiler }})
+    name: ${{ matrix.os }} (${{ matrix.compiler }})
 
     strategy:
       fail-fast: false
       matrix:
-        name:
-          - Linux
-          - Windows
-          - macOS
-        compiler: [gcc, clang]
-
-        exclude:
-          - name: Windows
-            compiler: gcc
-
         include:
           - name: Linux
-            os: ubuntu-latest
-            packages: >-
-              libsdl1.2-dev libsdl-mixer1.2-dev
-              libsdl-image1.2-dev libsdl-gfx1.2-dev
+            os: ubuntu-20.04  # -latest is still stuck at 18.04
             compiler: gcc
             cpp-compiler: g++
-            cflags: "-Wall -Wextra"
-            cxxflags: "-Wall -Wextra"
 
           - name: Linux
-            os: ubuntu-latest
-            packages: >-
-              libsdl1.2-dev libsdl-mixer1.2-dev
-              libsdl-image1.2-dev libsdl-gfx1.2-dev
+            os: ubuntu-20.04  # -latest is still stuck at 18.04
             compiler: clang
             cpp-compiler: clang++
-            cflags: "-Wall -Wextra"
-            cxxflags: "-Wall -Wextra"
 
           - name: Windows
             os: windows-latest
-            compiler: clang
-            cpp-compiler: clang++
+            compiler: cl
+            cpp-compiler: cl
             cmake-args: -A Win32
 
           - name: macOS
             os: macOS-latest
             packages: yaml-cpp sdl sdl_gfx sdl_image sdl_mixer
-            compiler: gcc
-            cpp-compiler: g++
-            cflags: "-Wall -Wextra"
-            cxxflags: "-Wall -Wextra"
-
-          - name: macOS
-            os: macOS-latest
-            packages: yaml-cpp sdl sdl_gfx sdl_image sdl_mixer
             compiler: clang
             cpp-compiler: clang++
-            cflags: "-Wall -Wextra"
-            cxxflags: "-Wall -Wextra"
+            app-bundle: openxcom.app  # all other builds default to bin/
 
     runs-on: ${{ matrix.os }}
 
@@ -70,10 +41,7 @@
         run: |
           sudo apt-get update
           sudo apt-get -yq --no-install-suggests --no-install-recommends 
install ccache ${{ matrix.packages }}
-
-          wget -q 
http://archive.ubuntu.com/ubuntu/pool/main/y/yaml-cpp/libyaml-cpp0.6_0.6.2-4fakesync1_amd64.deb
-          wget -q 
http://archive.ubuntu.com/ubuntu/pool/main/y/yaml-cpp/libyaml-cpp-dev_0.6.2-4fakesync1_amd64.deb
-          sudo dpkg -i libyaml-cpp0.6_0.6.2-4fakesync1_amd64.deb 
libyaml-cpp-dev_0.6.2-4fakesync1_amd64.deb
+          sudo apt-get -yq --no-install-suggests --no-install-recommends 
install libsdl1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsdl-gfx1.2-dev 
libyaml-cpp-dev
 
       - name: Install packages (Windows)
         if: runner.os == 'Windows' && matrix.packages
@@ -83,18 +51,25 @@
       - name: Install packages (macOS)
         if: runner.os == 'macOS'
         run: |
-          brew update
+          brew update || true  # brew update often fails, no biggie.
           brew install ccache ${{ matrix.packages }}
 
       - name: Setup Cache
         if: runner.os == 'Linux' || runner.os == 'macOS'
-        uses: actions/cache@v1
+        uses: actions/cache@v2
         with:
           path: ~/.ccache
           key: ccache-${{ runner.os }}-${{ matrix.compiler }}
 
       - name: Checkout
-        uses: actions/checkout@v1
+        uses: actions/checkout@v2
+        with:
+          fetch-depth: 0
+
+      - name: Setup environment
+        shell: bash
+        run: |
+          echo "describe=$(git describe)" >> $GITHUB_ENV
 
       - name: Download dependencies (Windows)
         if: runner.os == 'Windows'
@@ -105,20 +80,22 @@
 
       - name: Generate project files
         run: |
-          mkdir ${{ matrix.build-dir || '.not-used' }}
-          cd ${{ matrix.build-dir || '.' }}
-          cmake ${{ matrix.build-src-dir || '.' }} 
-DCMAKE_BUILD_TYPE="Release" -DCHECK_CCACHE=TRUE ${{ matrix.cmake-args }}
+          mkdir ${{ matrix.build-dir || 'build' }}
+          cmake -B ${{ matrix.build-dir || 'build' }} ${{ matrix.build-src-dir 
|| '.' }} -DCMAKE_BUILD_TYPE=Release -DENABLE_WARNING=1 -DCHECK_CCACHE=1 ${{ 
matrix.cmake-args }}
         env:
           CC: ${{ matrix.compiler }}
           CXX: ${{ matrix.cpp-compiler }}
-          CFLAGS: ${{ matrix.cflags || env.CFLAGS }}
-          CXXFLAGS: ${{ matrix.cxxflags || env.CXXFLAGS }}
-          LDFLAGS: ${{ matrix.ldflags || env.LDFLAGS }}
 
       - name: Compile source code
         run: |
-          cd ${{ matrix.build-src-dir || '.' }}
-          cmake --build . --config ${{ matrix.build-config || 'Release' }}
+          cmake --build ${{ matrix.build-dir || 'build' }} -v -j2 --config ${{ 
matrix.build-config || 'Release' }}
+
+      - name: Archive artifacts
+        uses: actions/upload-artifact@v2
+        with:
+            name: openxcom_${{ matrix.name }}_${{ matrix.compiler }}-${{ 
env.describe }}
+            path: |
+                ${{ matrix.build-dir || 'build' }}/${{ matrix.app-bundle || 
'bin' }}/**/*
 
       - name: ccache stats
         if: runner.os == 'Linux' || runner.os == 'macOS'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/OpenXcom-1.0.0.1592170963.8ae998af3/CMakeLists.txt 
new/OpenXcom-1.0.0.1604610320.4639493f0/CMakeLists.txt
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/CMakeLists.txt      2020-06-14 
23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/CMakeLists.txt      2020-11-05 
22:05:20.000000000 +0100
@@ -47,7 +47,7 @@
 
 # Add check for library (SDL_gfx, yaml-cpp )
 if ( IS_DIRECTORY ${DEPS_DIR}/include )
-   include_directories ( ${DEPS_DIR}/include/SDL ${DEPS_DIR}/include/yaml-cpp 
${DEPS_DIR}/include )
+   include_directories ( SYSTEM ${DEPS_DIR}/include/SDL 
${DEPS_DIR}/include/yaml-cpp ${DEPS_DIR}/include )
    if ( CMAKE_CL_64 )
      link_directories ( ${DEPS_DIR}/lib/x64 )
    else ( )
@@ -68,35 +68,35 @@
   if ( NOT SDL_FOUND )
     message ( FATAL_ERROR "Can't find SDL which is required" )
   else ()
-    include_directories ( ${SDL_INCLUDE_DIR} )
+    include_directories ( SYSTEM ${SDL_INCLUDE_DIR} )
     message ( "found SDL ${SDL_MAJOR}.${SDL_MINOR}.${SDL_MICRO} 
(${SDL_LIBRARY_DIRS}:${SDL_INCLUDE_DIR})" )
   endif ()
 
   if ( NOT SDLMIXER_FOUND )
     message ( FATAL_ERROR "Can't find SDL_mixer which is required" )
   else ()
-    include_directories ( ${SDLMIXER_INCLUDE_DIR} )
+    include_directories ( SYSTEM ${SDLMIXER_INCLUDE_DIR} )
     message ( "found SDL_mixer 
${SDL_MIXER_MAJOR}.${SDL_MIXER_MINOR}.${SDL_MIXER_MICRO} 
(${SDL_MIXER_LIBRARY_DIRS}:${SDLMIXER_INCLUDE_DIR})" )
   endif ()
 
   if ( NOT SDLGFX_FOUND )
     message ( FATAL_ERROR "Can't find SDL_gfx which is required" )
   else ()
-    include_directories ( ${SDLGFX_INCLUDE_DIR} )
+    include_directories ( SYSTEM ${SDLGFX_INCLUDE_DIR} )
     message ( "found SDL_gfx 
${SDL_GFX_MAJOR}.${SDL_GFX_MINOR}.${SDL_GFX_MICRO} 
(${SDL_GFX_LIBRARY_DIRS}:${SDLGFX_INCLUDE_DIR})" )
   endif ()
 
   if ( NOT SDLIMAGE_FOUND )
     message ( FATAL_ERROR "Can't find SDL_image which is required" )
   else ()
-    include_directories ( ${SDLIMAGE_INCLUDE_DIR} )
+    include_directories ( SYSTEM ${SDLIMAGE_INCLUDE_DIR} )
     message ( "found SDL_image 
${SDL_IMAGE_MAJOR}.${SDL_IMAGE_MINOR}.${SDL_IMAGE_MICRO} 
(${SDL_IMAGE_LIBRARY_DIRS}:${SDLIMAGE_INCLUDE_DIR})" )
   endif ()
 
   if ( NOT YAMLCPP_FOUND )
     message ( FATAL_ERROR "Can't find yaml-cpp which is required" )
   else ()
-    include_directories ( ${YAMLCPP_INCLUDE_DIR} )
+    include_directories ( SYSTEM ${YAMLCPP_INCLUDE_DIR} )
     message ( "found yaml-cpp(${YAMLCPP_LIBRARY_DIRS}:${YAMLCPP_INCLUDE_DIR})" 
)
   endif ( NOT YAMLCPP_FOUND )
 endif()
@@ -110,7 +110,7 @@
     )
   add_definitions(-D__NO_OPENGL)
 else ()
-    include_directories ( ${OPENGL_INCLUDE_DIR} )
+    include_directories ( SYSTEM ${OPENGL_INCLUDE_DIR} )
     message ( "found openGL (${OPENGL_LIBRARIES})" )
 endif ()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/common/Language/Font.dat 
new/OpenXcom-1.0.0.1604610320.4639493f0/bin/common/Language/Font.dat
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/common/Language/Font.dat        
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/bin/common/Language/Font.dat        
2020-11-05 22:05:20.000000000 +0100
@@ -6,7 +6,7 @@
     images:
       - file: FontBig.png
         chars: >
-          
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐŰÙÚÛÜÝÞŸßàáâãäåæçèéêëìíîïðñòóôõöőűùúûüýþÿФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯфисвуапршолдьтщзйкыегмцчнябБжЖхХъЪэЭюЮĆĘ깣泥ŚśźżŻŹŃńĂăȘȚșțČĎĚŇŘŠŤŮŽčďěňřšťůžЄєŒœіІїЇøØĞŞİğşıΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωΆΈΉΊΌΎΏάέήίόύώςΐϊĹĽŔĺľŕ∞Ёё
+          
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐŰÙÚÛÜÝÞŸßàáâãäåæçèéêëìíîïðñòóôõöőűùúûüýþÿФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯфисвуапршолдьтщзйкыегмцчнябБжЖхХъЪэЭюЮĆĘ깣泥ŚśźżŻŹŃńĂăȘȚșțČĎĚŇŘŠŤŮŽčďěňřšťůžЄєŒœіІїЇøØĞŞİğşıΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωΆΈΉΊΌΎΏάέήίόύώςΐϊĹĽŔĺľŕ∞ЁёĐđ
       - file: FontBig_jp.png
         chars: >
           
‐―‘’“”†‡‥…‰′″※℃№℡ÅⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ←↑→↓⇒⇔∀∂∃∇∈∋∑√∝∞∟∠∥∧∨∩∪∫∬∮∴∵∽≒≠≡≦≧≪≫⊂⊃⊆⊇⊥⊿⌒①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳─━│┃┌┏┐┓└┗┘┛├┝┠┣┤┥┨┫┬┯┰┳┴┷┸┻┼┿╂╋■□▲△▼▽◆◇○◎●◯★☆♀♂♪♭♯
 
、。〃々〆〇〈〉《》「」『』【】〒〓〔〕〝〟ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん゛゜ゝゞァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ・ーヽヾ㈱㈲㈹㊤㊥㊦㊧㊨㌃㌍㌔㌘㌢㌣㌦㌧㌫㌶㌻㍉㍊㍍㍑㍗㍻㍼㍽㍾㎎㎏㎜㎝㎞㎡㏄㏍一丁七万丈三上下不与丐丑且丕世丗丘丙丞両並个中丱串丶丸丹主丼丿乂乃久之乍乎乏乕乖乗乘乙九乞也乢乱乳乾亀亂亅了予争亊事二于云互五井亘亙些亜亞亟亠亡亢交亥亦亨享京亭亮亰亳亶人什仁仂仄仆仇今介仍从仏仔仕他仗付仙仝仞仟代令以仭仮仰仲件价任企伉伊伍伎伏伐休会伜伝伯估伴伶伸伺似伽佃但佇位低住佐佑体何佗余佚佛作佝佞佩佯佰佳併佶佻佼使侃來侈例侍侏侑侖侘供依侠価侫侭侮侯侵侶便係促俄俊俎俐俑俔俗俘俚俛保俟信俣俤俥修俯俳俵俶俸俺俾倅倆倉個倍倏們倒倔倖候倚借倡倣値倥倦倨倩倪倫倬倭倶倹偃假偈偉偏偐偕偖做停健偬偲側偵偶偸偽傀傅傍傑傘備傚催傭傲傳傴債傷傾僂僅僉僊働像僑僕僖僚僞僣僥僧僭僮僵價僻儀儁儂億儉儒儔儕儖儘儚償儡優儲儷儺儻儼儿兀允元兄充兆兇先光克兌免兎児兒兔党兜兢入全兩兪八公六兮共兵其具典兼冀冂内円冉冊册再冏冐冑冒冓冕冖冗写冠冢冤冥冦冨冩冪冫冬冰冱冲决冴况冶冷冽凄凅准凉凋凌凍凖凛凜凝几凡処凧凩凪凭凰凱凵凶凸凹出函凾刀刃刄分切刈刊刋刎刑刔列初判別刧利刪刮到刳制刷券刹刺刻剃剄則削剋剌前剏剔剖剛剞剣剤剥剩剪副剰剱割剳剴創剽剿劃劇劈劉劍劑劒劔力功加劣助努劫劬劭励労劵効劼劾勁勃勅勇勉勍勒動勗勘務勝勞募勠勢勣勤勦勧勲勳勵勸勹勺勾勿匁匂包匆匈匍匏匐匕化北匙匚匝匠匡匣匪匯匱匳匸匹区医匿區十千卅卆升午卉半卍卑卒卓協南単博卜卞占卦卩卮卯印危即却卵卷卸卻卿厂厄厖厘厚原厠厥厦厨厩厭厮厰厳厶去参參又叉及友双反収叔取受叙叛叟叡叢口古句叨叩只叫召叭叮可台叱史右叶号司叺吁吃各合吉吊吋同名后吏吐向君吝吟吠否吩含听吭吮吶吸吹吻吼吽吾呀呂呆呈呉告呎呑呟周呪呰呱味呵呶呷呻呼命咀咄咆咋和咎咏咐咒咢咤咥咨咫咬咯咲咳咸咼咽咾哀品哂哄哇哈哉哘員哢哥哦哨哩哭哮哲哺哽唄唆唇唏唐唔唖售唯唱唳唸唹唾啀啄啅商啌問啓啖啗啜啝啣啻啼啾喀喃善喇喉喊喋喘喙喚喜喝喞喟喧喨喩喪喫喬單喰営嗄嗅嗇嗔嗚嗜嗟嗣嗤嗷嗹嗽嗾嘆嘉嘔嘖嘗嘘嘛嘩嘯嘱嘲嘴嘶嘸噂噌噎噐噛噤器噪噫噬噴噸噺嚀嚆嚇嚊嚏嚔嚠嚢嚥嚮嚴嚶嚼囀囁囂囃囈囎囑囓囗囘囚四回因団囮困囲図囹固国囿圀圃圄圈圉國圍圏園圓圖團圜土圦圧在圭地圷圸圻址坂均坊坎坏坐坑坡坤坦坩坪坿垂垈垉型垓垠垢垣垤垪垰垳埀埃埆埋城埒埓埔埖埜域埠埣埴執培基埼堀堂堅堆堊堋堕堙堝堡堤堪堯堰報場堵堺堽塀塁塊塋塑塒塔塗塘塙塚塞塢塩填塰塲塵塹塾境墅墓増墜墟墨墫墮墳墸墹墺墻墾壁壅壇壊壌壑壓壕壗壘壙壜壞壟壤壥士壬壮壯声壱売壷壹壺壻壼壽夂変夊夏夐夕外夘夙多夛夜夢夥大天太夫夬夭央失夲夷夸夾奄奇奈奉奎奏奐契奔奕套奘奚奠奢奥奧奨奩奪奬奮女奴奸好妁如妃妄妊妍妓妖妙妛妝妣妥妨妬妲妹妻妾姆姉始姐姑姓委姙姚姜姥姦姨姪姫姶姻姿威娃娉娑娘娚娜娟娠娥娩娯娵娶娼婀婁婆婉婚婢婦婪婬婿媒媚媛媼媽媾嫁嫂嫉嫋嫌嫐嫖嫗嫡嫣嫦嫩嫺嫻嬉嬋嬌嬖嬢嬪嬬嬰嬲嬶嬾孀孃孅子孑孔孕字存孚孛孜孝孟季孤孥学孩孫孰孱孳孵學孺宀它宅宇守安宋完宍宏宕宗官宙定宛宜宝実客宣室宥宦宮宰害宴宵家宸容宿寂寃寄寅密寇寉富寐寒寓寔寛寝寞察寡寢寤寥實寧寨審寫寮寰寳寵寶寸寺対寿封専射尅将將專尉尊尋對導小少尓尖尚尠尢尤尨尭就尸尹尺尻尼尽尾尿局屁居屆屈届屋屍屎屏屐屑屓展属屠屡層履屬屮屯山屶屹岌岐岑岔岡岨岩岫岬岱岳岶岷岸岻岼岾峅峇峙峠峡峨峩峪峭峯峰島峺峻峽崇崋崎崑崔崕崖崗崘崙崚崛崟崢崩嵋嵌嵎嵐嵒嵜嵩嵬嵯嵳嵶嶂嶄嶇嶋嶌嶐嶝嶢嶬嶮嶷嶺嶼嶽巉巌巍巒巓巖巛川州巡巣工左巧巨巫差己已巳巴巵巷巻巽巾市布帆帋希帑帖帙帚帛帝帥師席帯帰帳帶帷常帽幀幃幄幅幇幌幎幔幕幗幟幡幢幣幤干平年幵并幸幹幺幻幼幽幾广庁広庄庇床序底庖店庚府庠度座庫庭庵庶康庸廁廂廃廈廉廊廏廐廓廖廚廛廝廟廠廡廢廣廨廩廬廰廱廳廴延廷廸建廻廼廾廿弁弃弄弉弊弋弌弍式弐弑弓弔引弖弗弘弛弟弥弦弧弩弭弯弱張強弸弼弾彁彈彊彌彎彑当彖彗彙彜彝彡形彦彩彪彫彬彭彰影彳彷役彼彿往征徂徃径待徇很徊律後徐徑徒従得徘徙從徠御徨復循徭微徳徴徹徼徽心必忌忍忖志忘忙応忝忠忤快忰忱念忸忻忽忿怎怏怐怒怕怖怙怛怜思怠怡急怦性怨怩怪怫怯怱怺恁恂恃恆恊恋恍恐恒恕恙恚恟恠恢恣恤恥恨恩恪恫恬恭息恰恵恷悁悃悄悉悋悌悍悒悔悖悗悚悛悟悠患悦悧悩悪悲悳悴悵悶悸悼悽情惆惇惑惓惘惚惜惟惠惡惣惧惨惰惱想惴惶惷惹惺惻愀愁愃愆愈愉愍愎意愕愚愛感愡愧愨愬愴愼愽愾愿慂慄慇慈慊態慌慍慎慓慕慘慙慚慝慟慢慣慥慧慨慫慮慯慰慱慳慴慵慶慷慾憂憇憊憎憐憑憔憖憙憚憤憧憩憫憬憮憲憶憺憾懃懆懇懈應懊懋懌懍懐懣懦懲懴懶懷懸懺懼懽懾懿戀戈戉戊戌戍戎成我戒戔或戚戛戝戞戟戡戦截戮戯戰戲戳戴戸戻房所扁扇扈扉手才扎打払托扛扞扠扣扨扮扱扶批扼找承技抂抃抄抉把抑抒抓抔投抖抗折抛抜択披抬抱抵抹抻押抽拂担拆拇拈拉拊拌拍拏拐拑拒拓拔拗拘拙招拜拝拠拡括拭拮拯拱拳拵拶拷拾拿持挂指挈按挌挑挙挟挧挨挫振挺挽挾挿捉捌捍捏捐捕捗捜捧捨捩捫据捲捶捷捺捻掀掃授掉掌掎掏排掖掘掛掟掠採探掣接控推掩措掫掬掲掴掵掻掾揀揃揄揆揉描提插揖揚換握揣揩揮援揶揺搆損搏搓搖搗搜搦搨搬搭搴搶携搾摂摎摘摧摩摯摶摸摺撃撈撒撓撕撚撞撤撥撩撫播撮撰撲撹撻撼擁擂擅擇操擒擔擘據擠擡擢擣擦擧擬擯擱擲擴擶擺擽擾攀攅攘攜攝攣攤攪攫攬支攴攵收攷攸改攻放政故效敍敏救敕敖敗敘教敝敞敢散敦敬数敲整敵敷數斂斃文斈斉斌斎斐斑斗料斛斜斟斡斤斥斧斫斬断斯新斷方於施旁旃旄旅旆旋旌族旒旗旙旛无旡既日旦旧旨早旬旭旱旺旻昂昃昆昇昊昌明昏易昔昜星映春昧昨昭是昴昵昶昼昿晁時晃晄晉晋晏晒晝晞晟晢晤晦晧晨晩普景晰晴晶智暁暃暄暇暈暉暎暑暖暗暘暝暢暦暫暮暴暸暹暼暾曁曄曇曉曖曙曚曜曝曠曦曩曰曲曳更曵曷書曹曼曽曾替最會月有朋服朏朔朕朖朗望朝朞期朦朧木未末本札朮朱朴朶朷朸机朽朿杁杆杉李杏材村杓杖杙杜杞束杠条杢杣杤来杪杭杯杰東杲杳杵杷杼松板枅枇枉枋枌析枕林枚果枝枠枡枢枦枩枯枳枴架枷枸枹柁柄柆柊柎柏某柑染柔柘柚柝柞柢柤柧柩柬柮柯柱柳柴柵査柾柿栂栃栄栓栖栗栞校栢栩株栫栲栴核根格栽桀桁桂桃框案桍桎桐桑桓桔桙桜桝桟档桧桴桶桷桾桿梁梃梅梍梏梓梔梗梛條梟梠梢梦梧梨梭梯械梱梳梵梶梹梺梼棄棆棉棊棋棍棒棔棕棗棘棚棟棠棡棣棧森棯棲棹棺椀椁椄椅椈椋椌植椎椏椒椙椚椛検椡椢椣椥椦椨椪椰椴椶椹椽椿楊楓楔楕楙楚楜楝楞楠楡楢楪楫業楮楯楳楴極楷楸楹楼楽楾榁概榊榎榑榔榕榛榜榠榧榮榱榲榴榻榾榿槁槃槇槊構槌槍槎槐槓様槙槝槞槧槨槫槭槲槹槻槽槿樂樅樊樋樌樒樓樔樗標樛樞樟模樢樣権横樫樮樵樶樸樹樺樽橄橇橈橋橘橙機橡橢橦橲橸橿檀檄檍檎檐檗檜檠檢檣檪檬檮檳檸檻櫁櫂櫃櫑櫓櫚櫛櫞櫟櫨櫪櫺櫻欄欅權欒欖欝欟欠次欣欧欲欷欸欹欺欽款歃歇歉歌歎歐歓歔歙歛歟歡止正此武歩歪歯歳歴歸歹死歿殀殃殄殆殉殊残殍殕殖殘殞殤殪殫殯殱殲殳殴段殷殺殻殼殿毀毅毆毋母毎毒毓比毘毛毟毫毬毯毳氈氏民氓气気氛氣氤水氷永氾汀汁求汎汐汕汗汚汝汞江池汢汨汪汰汲汳決汽汾沁沂沃沈沌沍沐沒沓沖沙沚沛没沢沫沮沱河沸油沺治沼沽沾沿況泄泅泉泊泌泓法泗泙泛泝泡波泣泥注泪泯泰泱泳洋洌洒洗洙洛洞洟津洩洪洫洲洳洵洶洸活洽派流浄浅浙浚浜浣浤浦浩浪浬浮浴海浸浹涅消涌涎涓涕涙涛涜涯液涵涸涼淀淅淆淇淋淌淑淒淕淘淙淞淡淤淦淨淪淫淬淮深淳淵混淹淺添清渇済渉渊渋渓渕渙渚減渝渟渠渡渣渤渥渦温渫測渭渮港游渺渾湃湊湍湎湖湘湛湟湧湫湮湯湲湶湾湿満溂溌溏源準溘溜溝溟溢溥溪溯溲溶溷溺溽滂滄滅滉滋滌滑滓滔滕滝滞滬滯滲滴滷滸滾滿漁漂漆漉漏漑漓演漕漠漢漣漫漬漱漲漸漾漿潁潅潔潘潛潜潟潤潦潭潮潯潰潴潸潺潼澀澁澂澄澆澎澑澗澡澣澤澪澱澳澹激濁濂濃濆濔濕濘濛濟濠濡濤濫濬濮濯濱濳濶濺濾瀁瀉瀋瀏瀑瀕瀘瀚瀛瀝瀞瀟瀦瀧瀬瀰瀲瀾灌灑灘灣火灯灰灸灼災炉炊炎炒炙炬炭炮炯炳炸点為烈烋烏烙烝烟烱烹烽焉焔焙焚焜無焦然焼煉煌煎煕煖煙煢煤煥煦照煩煬煮煽熄熈熊熏熔熕熙熟熨熬熱熹熾燃燈燉燎燐燒燔燕燗營燠燥燦燧燬燭燮燵燹燻燼燿爆爍爐爛爨爪爬爭爰爲爵父爺爻爼爽爾爿牀牆片版牋牌牒牘牙牛牝牟牡牢牧物牲牴特牽牾犀犁犂犇犒犖犠犢犧犬犯犲状犹狂狃狄狆狎狐狒狗狙狛狠狡狢狩独狭狷狸狹狼狽猊猖猗猛猜猝猟猥猩猪猫献猯猴猶猷猾猿獄獅獎獏獗獣獨獪獰獲獵獸獺獻玄率玉王玖玩玲玳玻珀珂珈珊珍珎珞珠珥珪班珮珱珸現球琅理琉琢琥琲琳琴琵琶琺琿瑁瑕瑙瑚瑛瑜瑞瑟瑠瑣瑤瑩瑪瑯瑰瑳瑶瑾璃璋璞璢璧環璽瓊瓏瓔瓜瓠瓢瓣瓦瓧瓩瓮瓰瓱瓲瓶瓷瓸甃甄甅甌甍甎甑甓甕甘甚甜甞生産甥甦用甫甬田由甲申男甸町画甼畄畆畉畊畋界畍畏畑畔留畚畛畜畝畠畢畤略畦畧畩番畫畭異畳畴當畷畸畿疂疆疇疉疊疋疎疏疑疔疚疝疣疥疫疱疲疳疵疸疹疼疽疾痂痃病症痊痍痒痔痕痘痙痛痞痢痣痩痰痲痳痴痺痼痾痿瘁瘉瘋瘍瘟瘠瘡瘢瘤瘧瘰瘴瘻療癆癇癈癌癒癖癘癜癡癢癧癨癩癪癬癰癲癶癸発登發白百皀皃的皆皇皈皋皎皐皓皖皙皚皮皰皴皷皸皹皺皿盂盃盆盈益盍盒盖盗盛盜盞盟盡監盤盥盧盪目盲直相盻盾省眄眇眈眉看県眛眞真眠眤眥眦眩眷眸眺眼着睇睚睛睡督睥睦睨睫睹睾睿瞋瞎瞑瞞瞠瞥瞬瞭瞰瞳瞶瞹瞻瞼瞽瞿矇矍矗矚矛矜矢矣知矧矩短矮矯石矼砂砌砒研砕砠砥砦砧砲破砺砿硅硝硫硬硯硲硴硼碁碆碇碌碍碎碑碓碕碗碚碣碧碩碪碯碵確碼碾磁磅磆磊磋磐磑磔磚磧磨磬磯磴磽礁礇礎礑礒礙礦礪礫礬示礼社祀祁祇祈祉祐祓祕祖祗祚祝神祟祠祢祥票祭祷祺祿禀禁禄禅禊禍禎福禝禦禧禪禮禰禳禹禺禽禾禿秀私秉秋科秒秕秘租秡秣秤秦秧秩秬称移稀稈程稍税稔稗稘稙稚稜稟稠種稱稲稷稻稼稽稾稿穀穂穃穆穉積穎穏穐穗穡穢穣穩穫穰穴究穹空穽穿突窃窄窈窒窓窕窖窗窘窟窩窪窮窯窰窶窺窿竃竄竅竇竈竊立竍竏竒竓竕站竚竜竝竟章竡竢竣童竦竪竭端竰競竸竹竺竿笂笄笆笈笊笋笏笑笘笙笛笞笠笥符笨第笳笵笶笹筅筆筈等筋筌筍筏筐筑筒答策筝筥筧筬筮筰筱筴筵筺箆箇箋箍箏箒箔箕算箘箙箚箜箝箟管箪箭箱箴箸節篁範篆篇築篋篌篏篝篠篤篥篦篩篭篳篶篷簀簇簍簑簒簓簔簗簟簡簣簧簪簫簷簸簽簾簿籀籃籌籍籏籐籔籖籘籟籠籤籥籬米籵籾粁粂粃粉粋粍粐粒粕粗粘粛粟粡粢粤粥粧粨粫粭粮粱粲粳粹粽精糀糂糅糊糎糒糖糘糜糞糟糠糢糧糯糲糴糶糸糺系糾紀紂約紅紆紊紋納紐純紕紗紘紙級紛紜素紡索紫紬紮累細紲紳紵紹紺紿終絃組絅絆絋経絎絏結絖絛絞絡絢絣給絨絮統絲絳絵絶絹絽綉綏經継続綛綜綟綢綣綫綬維綮綯綰綱網綴綵綸綺綻綽綾綿緇緊緋総緑緒緕緘線緜緝緞締緡緤編緩緬緯緲練緻縁縄縅縉縊縋縒縛縞縟縡縢縣縦縫縮縱縲縵縷縹縺縻總績繁繃繆繊繋繍織繕繖繙繚繝繞繦繧繩繪繭繰繹繻繼繽繿纂纃纈纉續纎纏纐纒纓纔纖纛纜缶缸缺罅罌罍罎罐网罔罕罘罟罠罧罨罩罪罫置罰署罵罷罸罹羂羃羅羆羇羈羊羌美羔羚羝羞羣群羨義羮羯羲羶羸羹羽翁翅翆翊翌習翔翕翠翡翦翩翫翰翳翹翻翼耀老考耄者耆耋而耐耒耕耗耘耙耜耡耨耳耶耻耽耿聆聊聒聖聘聚聞聟聡聢聨聯聰聲聳聴聶職聹聽聾聿肄肅肆肇肉肋肌肓肖肘肚肛肝股肢肥肩肪肬肭肯肱育肴肺胃胄胆背胎胖胙胚胛胝胞胡胤胥胯胱胴胸胼能脂脅脆脇脈脉脊脚脛脣脩脯脱脳脹脾腆腋腎腐腑腓腔腕腟腥腦腫腮腰腱腴腸腹腺腿膀膂膃膈膊膏膓膕膚膜膝膠膣膤膨膩膰膳膵膸膺膽膾膿臀臂臆臈臉臍臑臓臘臙臚臟臠臣臥臧臨自臭至致臺臻臼臾舁舂舅與興舉舊舌舍舎舐舒舖舗舘舛舜舞舟舩航舫般舮舳舵舶舷舸船艀艇艘艙艚艝艟艢艤艦艨艪艫艮良艱色艶艷艸艾芋芍芒芙芝芟芥芦芫芬芭芯花芳芸芹芻芽苅苑苒苓苔苗苙苛苜苞苟苡苣若苦苧苫英苳苴苹苺苻茂范茄茅茆茉茎茖茗茘茜茣茨茫茯茱茲茴茵茶茸茹荀荅草荊荏荐荒荘荳荵荷荻荼莅莇莉莊莎莓莖莚莞莟莠莢莨莪莫莱莵莽菁菅菊菌菎菓菖菘菜菟菠菩菫華菰菱菲菴菷菻菽萃萄萇萋萌萍萎萓萠萢萩萪萬萱萵萸萼落葆葉葎著葛葡葢董葦葩葫葬葭葮葯葱葵葷葹葺蒂蒄蒋蒐蒔蒙蒜蒟蒡蒭蒲蒸蒹蒻蒼蒿蓁蓄蓆蓉蓊蓋蓍蓐蓑蓖蓙蓚蓬蓮蓴蓼蓿蔀蔆蔑蔓蔔蔕蔗蔘蔚蔟蔡蔦蔬蔭蔵蔽蕀蕁蕃蕈蕉蕊蕋蕎蕕蕗蕘蕚蕣蕨蕩蕪蕭蕷蕾薀薄薇薈薊薐薑薔薗薙薛薜薤薦薨薩薪薫薬薮薯薹薺藁藉藍藏藐藕藜藝藤藥藩藪藷藹藺藻藾蘂蘆蘇蘊蘋蘓蘖蘗蘚蘢蘭蘯蘰蘿虍虎虐虔處虚虜虞號虧虫虱虹虻蚊蚋蚌蚓蚕蚣蚤蚩蚪蚫蚯蚰蚶蛄蛆蛇蛉蛋蛍蛎蛔蛙蛛蛞蛟蛤蛩蛬蛭蛮蛯蛸蛹蛻蛾蜀蜂蜃蜆蜈蜉蜊蜍蜑蜒蜘蜚蜜蜥蜩蜴蜷蜻蜿蝉蝋蝌蝎蝓蝕蝗蝙蝟蝠蝣蝦蝨蝪蝮蝴蝶蝸蝿螂融螟螢螫螯螳螺螻螽蟀蟄蟆蟇蟋蟐蟒蟠蟯蟲蟶蟷蟹蟻蟾蠅蠍蠎蠏蠑蠕蠖蠡蠢蠣蠧蠱蠶蠹蠻血衂衄衆行衍衒術街衙衛衝衞衡衢衣表衫衰衲衵衷衽衾衿袁袂袈袋袍袒袖袗袙袞袢袤被袮袰袱袴袵袷袿裁裂裃裄装裏裔裕裘裙補裝裟裡裨裲裳裴裸裹裼製裾褂褄複褊褌褐褒褓褝褞褥褪褫褶褸褻襁襃襄襌襍襖襞襟襠襤襦襪襭襯襲襴襷襾西要覃覆覇覈覊見規覓視覗覘覚覡覦覧覩親覬覯覲観覺覽覿觀角觚觜觝解触觧觴觸言訂訃計訊訌討訐訓訖託記訛訝訟訣訥訪設許訳訴訶診註証詁詆詈詐詑詒詔評詛詞詠詢詣試詩詫詬詭詮詰話該詳詼誂誄誅誇誉誌認誑誓誕誘誚語誠誡誣誤誥誦誨説読誰課誹誼調諂諄談請諌諍諏諒論諚諛諜諞諠諡諢諤諦諧諫諭諮諱諳諷諸諺諾謀謁謂謄謇謌謎謐謔謖謗謙謚講謝謠謡謦謨謫謬謳謹謾譁證譌譎譏譖識譚譛譜譟警譫譬譯議譱譲譴護譽讀讃變讌讎讐讒讓讖讙讚谷谺谿豁豆豈豊豌豎豐豕豚象豢豪豫豬豸豹豺豼貂貅貉貊貌貍貎貔貘貝貞負財貢貧貨販貪貫責貭貮貯貰貲貳貴貶買貸費貼貽貿賀賁賂賃賄資賈賊賍賎賑賓賚賛賜賞賠賢賣賤賦質賭賺賻購賽贄贅贇贈贊贋贍贏贐贓贔贖赤赦赧赫赭走赱赳赴起趁超越趙趣趨足趺趾跂跋跌跏跖跚跛距跟跡跣跨跪跫路跳践跼跿踈踉踊踏踐踝踞踟踪踰踴踵蹂蹄蹇蹈蹉蹊蹌蹐蹕蹙蹟蹠蹣蹤蹲蹴蹶蹼躁躄躅躇躊躋躍躑躓躔躙躡躪身躬躯躰躱躾軅軆軈車軋軌軍軒軛軟転軣軫軸軻軼軽軾較輅載輊輌輒輓輔輕輙輛輜輝輟輦輩輪輯輳輸輹輻輾輿轂轄轅轆轉轌轍轎轗轜轟轡轢轣轤辛辜辞辟辣辧辨辭辮辯辰辱農辷辺辻込辿迂迄迅迎近返迚迢迥迦迩迪迫迭迯述迴迷迸迹迺追退送逃逅逆逋逍逎透逐逑逓途逕逖逗這通逝逞速造逡逢連逧逮週進逵逶逸逹逼逾遁遂遅遇遉遊運遍過遏遐遑遒道達違遖遘遙遜遞遠遡遣遥遨適遭遮遯遲遵遶遷選遺遼遽避邀邁邂邃還邇邉邊邏邑那邦邨邪邯邱邵邸郁郊郎郛郡郢郤部郭郵郷都鄂鄒鄙鄭鄰鄲酉酊酋酌配酎酒酔酖酘酢酣酥酩酪酬酲酳酵酷酸醂醇醉醋醍醐醒醗醜醢醤醪醫醯醴醵醸醺釀釁釆采釈釉釋里重野量釐金釖釘釛釜針釟釡釣釦釧釵釶釼釿鈍鈎鈑鈔鈕鈞鈩鈬鈴鈷鈿鉄鉅鉈鉉鉋鉐鉗鉚鉛鉞鉢鉤鉦鉱鉾銀銃銅銑銓銕銖銘銚銛銜銭銷銹鋏鋒鋤鋩鋪鋭鋲鋳鋸鋺鋼錆錏錐錘錙錚錠錢錣錦錨錫錬錮錯録錵錺錻鍄鍋鍍鍔鍖鍛鍜鍠鍬鍮鍵鍼鍾鎌鎔鎖鎗鎚鎧鎬鎭鎮鎰鎹鏃鏈鏐鏑鏖鏗鏘鏝鏡鏤鏥鏨鐃鐇鐐鐓鐔鐘鐙鐚鐡鐫鐵鐶鐸鐺鑁鑄鑑鑒鑓鑚鑛鑞鑠鑢鑪鑰鑵鑷鑼鑽鑾鑿钁長門閂閃閇閉閊開閏閑間閔閖閘閙閠関閣閤閥閧閨閭閲閹閻閼閾闃闇闊闌闍闔闕闖闘關闡闢闥阜阡阨阪阮阯防阻阿陀陂附陋陌降陏限陛陜陝陞陟院陣除陥陦陪陬陰陲陳陵陶陷陸険陽隅隆隈隊隋隍階随隔隕隗隘隙際障隠隣隧隨險隰隱隲隴隶隷隸隹隻隼雀雁雄雅集雇雉雋雌雍雎雑雕雖雙雛雜離難雨雪雫雰雲零雷雹電需霄霆震霈霊霍霎霏霑霓霖霙霜霞霤霧霪霰露霸霹霽霾靂靄靆靈靉青靖静靜非靠靡面靤靦靨革靫靭靱靴靹靺靼鞁鞄鞅鞆鞋鞍鞏鞐鞘鞜鞠鞣鞦鞨鞫鞭鞳鞴韃韆韈韋韓韜韭韮韲音韵韶韻響頁頂頃項順須頌頏預頑頒頓頗領頚頡頤頬頭頴頷頸頻頼頽顆顋題額顎顏顔顕願顛類顧顫顯顰顱顳顴風颪颯颱颶飃飄飆飛飜食飢飩飫飭飮飯飲飴飼飽飾餃餅餉養餌餐餒餓餔餘餝餞餠餡餤館餬餮餽餾饂饅饉饋饌饐饑饒饕饗首馗馘香馥馨馬馭馮馳馴馼駁駄駅駆駈駐駑駒駕駘駛駝駟駢駭駮駱駲駸駻駿騁騅騎騏騒験騙騨騫騰騷騾驀驂驃驅驍驕驗驚驛驟驢驤驥驩驪驫骨骭骰骸骼髀髄髏髑髓體高髞髟髢髣髦髪髫髭髮髯髱髴髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬱鬲鬻鬼魁魂魃魄魅魍魎魏魑魔魘魚魯魴鮃鮎鮑鮒鮓鮖鮗鮟鮠鮨鮪鮫鮭鮮鮴鮹鯀鯆鯉鯊鯏鯑鯒鯔鯖鯛鯡鯢鯣鯤鯨鯰鯱鯲鯵鰄鰆鰈鰉鰊鰌鰍鰐鰒鰓鰔鰕鰛鰡鰤鰥鰭鰮鰯鰰鰲鰹鰺鰻鰾鱆鱇鱈鱒鱗鱚鱠鱧鱶鱸鳥鳧鳩鳫鳬鳰鳳鳴鳶鴃鴆鴇鴈鴉鴎鴒鴕鴛鴟鴣鴦鴨鴪鴫鴬鴻鴾鴿鵁鵄鵆鵈鵐鵑鵙鵜鵝鵞鵠鵡鵤鵬鵯鵲鵺鶇鶉鶏鶚鶤鶩鶫鶯鶲鶴鶸鶺鶻鷁鷂鷄鷆鷏鷓鷙鷦鷭鷯鷲鷸鷹鷺鷽鸚鸛鸞鹵鹸鹹鹽鹿麁麈麋麌麑麒麓麕麗麝麟麥麦麩麪麭麸麹麺麻麼麾麿黄黌黍黎黏黐黒黔默黙黛黜黝點黠黥黨黯黴黶黷黹黻黼黽鼇鼈鼎鼓鼕鼠鼡鼬鼻鼾齊齋齎齏齒齔齟齠齡齢齣齦齧齪齬齲齶齷龍龕龜龝龠!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¢£¬ ̄¥
@@ -20,7 +20,7 @@
     images:
       - file: FontSmall.png
         chars: >
-          
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐŰÙÚÛÜÝÞŸßàáâãäåæçèéêëìíîïðñòóôõöőűùúûüýþÿФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯфисвуапршолдьтщзйкыегмцчнябБжЖхХъЪэЭюЮĆĘ깣泥ŚśźżŻŹŃńĂăȘȚșțČĎĚŇŘŠŤŮŽčďěňřšťůžЄєŒœіІїЇøØĞŞİğşıΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωΆΈΉΊΌΎΏάέήίόύώςΐϊĹĽŔĺľŕ∞Ёё
+          
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐŰÙÚÛÜÝÞŸßàáâãäåæçèéêëìíîïðñòóôõöőűùúûüýþÿФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯфисвуапршолдьтщзйкыегмцчнябБжЖхХъЪэЭюЮĆĘ깣泥ŚśźżŻŹŃńĂăȘȚșțČĎĚŇŘŠŤŮŽčďěňřšťůžЄєŒœіІїЇøØĞŞİğşıΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωΆΈΉΊΌΎΏάέήίόύώςΐϊĹĽŔĺľŕ∞ЁёĐđ
       - file: FontSmall_jp.png
         spacing: 0
         chars: >
Binary files 
old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/common/Language/FontBig.png and 
new/OpenXcom-1.0.0.1604610320.4639493f0/bin/common/Language/FontBig.png differ
Binary files 
old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/common/Language/FontSmall.png and 
new/OpenXcom-1.0.0.1604610320.4639493f0/bin/common/Language/FontSmall.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom1/research.rul 
new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom1/research.rul
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom1/research.rul     
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom1/research.rul     
2020-11-05 22:05:20.000000000 +0100
@@ -790,7 +790,6 @@
     points: 50
     needItem: true
   - name: STR_CELATID
-    cost: 170
     points: 50
     needItem: true
   - name: STR_SILACOID
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom2/armors.rul 
new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom2/armors.rul
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom2/armors.rul       
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom2/armors.rul       
2020-11-05 22:05:20.000000000 +0100
@@ -555,14 +555,14 @@
     underArmor: 4
     damageModifier:
       - 1.0
-      - 1.0
-      - 1.0
-      - 1.0
-      - 1.0
-      - 1.0
-      - 1.0
-      - 1.6
-      - 1.5
-      - 1.0
+      - 0.9
+      - 0.9
+      - 0.9
+      - 0.8
+      - 0.9
+      - 0.9
+      - 1.1
+      - 0.0
+      - 0.9
     loftemps: 2
     drawingRoutine: 17
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom2/items.rul 
new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom2/items.rul
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom2/items.rul        
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom2/items.rul        
2020-11-05 22:05:20.000000000 +0100
@@ -45,7 +45,7 @@
     bulletSprite: 6
     hitSound: 31
     hitAnimation: 46
-    power: 120
+    power: 110
     damageType: 4
     vaporColor: 2
     vaporDensity: 10
@@ -77,7 +77,7 @@
       - STR_HWP_SOLID_HARPOON_BOLTS
     accuracySnap: 60
     accuracyAimed: 90
-    tuSnap: 33
+    tuSnap: 30
     tuAimed: 80
     battleType: 1
     fixedWeapon: true
@@ -92,7 +92,7 @@
     weight: 1
     hitSound: 21
     hitAnimation: 26
-    power: 50
+    power: 60
     damageType: 1
     clipSize: 30
     battleType: 2
@@ -125,7 +125,7 @@
     costBuy: 3000
     costSell: 2250
     transferTime: 48
-    power: 90
+    power: 85
     damageType: 3
     clipSize: 8
     battleType: 2
@@ -161,10 +161,10 @@
     bulletSprite: 8
     fireSound: 36
     hitSound: 31
-    power: 130
+    power: 110
     damageType: 5
     hitAnimation: 46
-    accuracySnap: 85
+    accuracySnap: 86
     accuracyAimed: 100
     tuSnap: 30
     tuAimed: 60
@@ -185,7 +185,7 @@
     fireSound: 26
     compatibleAmmo:
       - STR_HWP_DISPLACER_PWT
-    accuracyAimed: 100
+    accuracyAimed: 60
     tuAimed: 66
     battleType: 1
     fixedWeapon: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom2/research.rul 
new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom2/research.rul
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/bin/standard/xcom2/research.rul     
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/bin/standard/xcom2/research.rul     
2020-11-05 22:05:20.000000000 +0100
@@ -648,7 +648,7 @@
     points: 50
     needItem: true
   - name: STR_XARQUID
-    cost: 170
+    cost: 0
     points: 50
     needItem: true
   - name: STR_DEEP_ONE
@@ -656,11 +656,11 @@
     points: 50
     needItem: true
   - name: STR_GILLMAN
-    cost: 170
+    cost: 0
     points: 50
     needItem: true
   - name: STR_CALCINITE
-    cost: 170
+    cost: 0
     points: 50
     needItem: true
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Basescape/ManufactureStartState.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Basescape/ManufactureStartState.cpp
--- 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Basescape/ManufactureStartState.cpp 
    2020-06-14 23:42:43.000000000 +0200
+++ 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Basescape/ManufactureStartState.cpp 
    2020-11-05 22:05:20.000000000 +0100
@@ -101,7 +101,7 @@
 
        const std::map<std::string, int> & requiredItems 
(_item->getRequiredItems());
        int availableWorkSpace = _base->getFreeWorkshops();
-       bool productionPossible = _game->getSavedGame()->getFunds() > 
_item->getManufactureCost();
+       bool productionPossible = 
_item->haveEnoughMoneyForOneMoreUnit(_game->getSavedGame()->getFunds());
        productionPossible &= (availableWorkSpace > 0);
 
        _txtRequiredItemsTitle->setText(tr("STR_SPECIAL_MATERIALS_REQUIRED"));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/AIModule.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/AIModule.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/AIModule.cpp        
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/AIModule.cpp        
2020-11-05 22:05:20.000000000 +0100
@@ -79,6 +79,16 @@
 }
 
 /**
+ * Resets the unsaved AI state.
+ */
+void AIModule::reset()
+{
+       // these variables are not saved in save() and also not initiated in 
think()
+       _escapeTUs = 0;
+       _ambushTUs = 0;
+}
+
+/**
  * Loads the AI state from a YAML file.
  * @param node YAML node.
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/AIModule.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/AIModule.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/AIModule.h  
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/AIModule.h  
2020-11-05 22:05:20.000000000 +0100
@@ -58,6 +58,8 @@
        AIModule(SavedBattleGame *save, BattleUnit *unit, Node *node);
        /// Cleans up the AIModule.
        ~AIModule();
+       /// Resets the unsaved AI state.
+       void reset();
        /// Loads the AI Module from YAML.
        void load(const YAML::Node& node);
        /// Saves the AI Module to YAML.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/BattlescapeGame.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/BattlescapeGame.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/BattlescapeGame.cpp 
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/BattlescapeGame.cpp 
2020-11-05 22:05:20.000000000 +0100
@@ -457,7 +457,7 @@
                {
                        if ((*j)->getOriginalFaction() == FACTION_HOSTILE)
                        {
-                               if (!Options::allowPsionicCapture || 
(*j)->getFaction() != FACTION_PLAYER)
+                               if (!Options::allowPsionicCapture || 
(*j)->getFaction() != FACTION_PLAYER || !(*j)->getCapturable())
                                {
                                        liveAliens++;
                                }
@@ -2156,7 +2156,7 @@
                {
                        if ((*j)->getOriginalFaction() == FACTION_HOSTILE)
                        {
-                               if (!Options::allowPsionicCapture || 
(*j)->getFaction() != FACTION_PLAYER)
+                               if (!Options::allowPsionicCapture || 
(*j)->getFaction() != FACTION_PLAYER || !(*j)->getCapturable())
                                {
                                        liveAliens++;
                                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/BattlescapeState.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/BattlescapeState.cpp
--- 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/BattlescapeState.cpp    
    2020-06-14 23:42:43.000000000 +0200
+++ 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/BattlescapeState.cpp    
    2020-11-05 22:05:20.000000000 +0100
@@ -1113,10 +1113,16 @@
 
                _battleGame->cancelCurrentAction();
 
-               _save->getSelectedUnit()->setActiveHand("STR_LEFT_HAND");
+               BattleUnit *unit = _save->getSelectedUnit();
+               BattleItem *leftHandItem = getLeftHandItem(unit);
+
+               if (leftHandItem != getSpecialMeleeWeapon(unit))
+               {
+                       unit->setActiveHand("STR_LEFT_HAND");
+               }
+
                _map->cacheUnits();
                _map->draw();
-               BattleItem *leftHandItem = 
_save->getSelectedUnit()->getItem("STR_LEFT_HAND");
                handleItemClick(leftHandItem);
        }
 }
@@ -1140,10 +1146,16 @@
 
                _battleGame->cancelCurrentAction();
 
-               _save->getSelectedUnit()->setActiveHand("STR_RIGHT_HAND");
+               BattleUnit *unit = _save->getSelectedUnit();
+               BattleItem *rightHandItem = getRightHandItem(unit);
+
+               if (rightHandItem != getSpecialMeleeWeapon(unit))
+               {
+                       unit->setActiveHand("STR_RIGHT_HAND");
+               }
+
                _map->cacheUnits();
                _map->draw();
-               BattleItem *rightHandItem = 
_save->getSelectedUnit()->getItem("STR_RIGHT_HAND");
                handleItemClick(rightHandItem);
        }
 }
@@ -1325,7 +1337,7 @@
 
        toggleKneelButton(battleUnit);
 
-       BattleItem *leftHandItem = battleUnit->getItem("STR_LEFT_HAND");
+       BattleItem *leftHandItem = getLeftHandItem(battleUnit);
        _btnLeftHandItem->clear();
        _numAmmoLeft->setVisible(false);
        if (leftHandItem)
@@ -1340,7 +1352,7 @@
                                _numAmmoLeft->setValue(0);
                }
        }
-       BattleItem *rightHandItem = battleUnit->getItem("STR_RIGHT_HAND");
+       BattleItem *rightHandItem = getRightHandItem(battleUnit);
        _btnRightHandItem->clear();
        _numAmmoRight->setVisible(false);
        if (rightHandItem)
@@ -1373,6 +1385,43 @@
 }
 
 /**
+ * Gets the item currently accessible through the left hand slot in the 
battlescape UI.
+ */
+BattleItem *BattlescapeState::getLeftHandItem(BattleUnit *battleUnit)
+{
+       BattleItem *melee = getSpecialMeleeWeapon(battleUnit);
+       BattleItem *leftHand = battleUnit->getItem("STR_LEFT_HAND");
+
+       // If the unit has a melee weapon, and the right hand is already 
occupied,
+       // allow access to the melee weapon through the left hand slot,
+       // provided that the left hand is empty.
+       return melee && battleUnit->getItem("STR_RIGHT_HAND") && !leftHand
+               ? melee
+               : leftHand;
+}
+
+/**
+ * Gets the item currently accessible through the right hand slot in the 
battlescape UI.
+ */
+BattleItem *BattlescapeState::getRightHandItem(BattleUnit *battleUnit)
+{
+       BattleItem *melee = getSpecialMeleeWeapon(battleUnit);
+       BattleItem *rightHand = battleUnit->getItem("STR_RIGHT_HAND");
+
+       // If the unit has a built-in melee weapon, and the right hand is not 
occupied,
+       // allow access to the melee weapon through the right hand slot.
+       return melee && !rightHand ? melee : rightHand;
+}
+
+/**
+ * Gets the built-in melee weapon of a unit, if any.
+ */
+BattleItem *BattlescapeState::getSpecialMeleeWeapon(BattleUnit *battleUnit)
+{
+       return battleUnit->getSpecialWeapon(BT_MELEE);
+}
+
+/**
  * Shifts the red colors of the visible unit buttons backgrounds.
  */
 void BattlescapeState::blinkVisibleUnitButtons()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/BattlescapeState.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/BattlescapeState.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/BattlescapeState.h  
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/BattlescapeState.h  
2020-11-05 22:05:20.000000000 +0100
@@ -89,6 +89,12 @@
        void blinkHealthBar();
        /// Shows the unit kneel state.
        void toggleKneelButton(BattleUnit* unit);
+       /// Gets the item currently accessible through the left hand slot in 
the battlescape UI.
+       BattleItem *getLeftHandItem(BattleUnit *unit);
+       /// Gets the item currently accessible through the right hand slot in 
the battlescape UI.
+       BattleItem *getRightHandItem(BattleUnit *unit);
+       /// Gets the built-in melee weapon of a unit, if any.
+       BattleItem *getSpecialMeleeWeapon(BattleUnit *unit);
 public:
        /// Selects the next soldier.
        void selectNextPlayerUnit(bool checkReselect = false, bool setReselect 
= false, bool checkInventory = false, bool checkFOV = true);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/MeleeAttackBState.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/MeleeAttackBState.cpp
--- 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/MeleeAttackBState.cpp   
    2020-06-14 23:42:43.000000000 +0200
+++ 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/MeleeAttackBState.cpp   
    2020-11-05 22:05:20.000000000 +0100
@@ -174,7 +174,10 @@
 //                     _parent->getTileEngine()->checkReactionFire(_unit);
 //             }
 
-               _parent->getCurrentAction()->type = BA_NONE; // do this to 
restore cursor
+               if (_unit->getFaction() == _parent->getSave()->getSide()) // 
not a reaction attack
+               {
+                       _parent->getCurrentAction()->type = BA_NONE; // do this 
to restore cursor
+               }
 
                if (_parent->getSave()->getSide() == FACTION_PLAYER || 
_parent->getSave()->getDebugMode())
                {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/Projectile.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/Projectile.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/Projectile.cpp      
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/Projectile.cpp      
2020-11-05 22:05:20.000000000 +0100
@@ -305,9 +305,10 @@
                        applyAccuracy(originVoxel, &targetVoxel, accuracy, 
true, false); //arcing shot deviation
                        deltas = Position(0,0,0);
                }
+
                test = _save->getTileEngine()->calculateParabola(originVoxel, 
targetVoxel, true, &_trajectory, _action.actor, curvature, deltas);
                if (forced) return O_OBJECT; //fake hit
-               Position endPoint = _trajectory.back() / Position (16, 16, 24);
+               Position endPoint = _trajectory.at(_trajectory.size() + 
ItemDropVoxelOffset - 1) / Position (16, 16, 24);
                Tile *endTile = _save->getTile(endPoint);
                // check if the item would land on a tile with a blocking object
                if (_action.type == BA_THROW
@@ -445,6 +446,8 @@
        int posOffset = (int)_position + offset;
        if (posOffset >= 0 && posOffset < (int)_trajectory.size())
                return _trajectory.at(posOffset);
+       else if (posOffset < 0)
+               return _trajectory.at(0);
        else
                return _trajectory.at(_position);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/Projectile.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/Projectile.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/Projectile.h        
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/Projectile.h        
2020-11-05 22:05:20.000000000 +0100
@@ -36,6 +36,10 @@
  */
 class Projectile
 {
+public:
+       /// Offset of voxel path where item should be drop
+       static const int ItemDropVoxelOffset = -2;
+
 private:
        Mod *_mod;
        SavedBattleGame *_save;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/ProjectileFlyBState.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/ProjectileFlyBState.cpp
--- 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/ProjectileFlyBState.cpp 
    2020-06-14 23:42:43.000000000 +0200
+++ 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/ProjectileFlyBState.cpp 
    2020-11-05 22:05:20.000000000 +0100
@@ -507,7 +507,7 @@
                        if (_action.type == BA_THROW)
                        {
                                _parent->getMap()->resetCameraSmoothing();
-                               Position pos = 
_parent->getMap()->getProjectile()->getPosition(-1);
+                               Position pos = 
_parent->getMap()->getProjectile()->getPosition(Projectile::ItemDropVoxelOffset);
                                pos.x /= 16;
                                pos.y /= 16;
                                pos.z /= 24;
@@ -525,7 +525,7 @@
                                if (Options::battleInstantGrenade && 
item->getRules()->getBattleType() == BT_GRENADE && item->getFuseTimer() == 0)
                                {
                                        // it's a hot grenade to explode 
immediately
-                                       _parent->statePushFront(new 
ExplosionBState(_parent, _parent->getMap()->getProjectile()->getPosition(-1), 
item, _action.actor));
+                                       _parent->statePushFront(new 
ExplosionBState(_parent, 
_parent->getMap()->getProjectile()->getPosition(Projectile::ItemDropVoxelOffset),
 item, _action.actor));
                                }
                                else
                                {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/TileEngine.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/TileEngine.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Battlescape/TileEngine.cpp      
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Battlescape/TileEngine.cpp      
2020-11-05 22:05:20.000000000 +0100
@@ -24,6 +24,7 @@
 #include "AIModule.h"
 #include "Map.h"
 #include "Camera.h"
+#include "Projectile.h"
 #include "../Savegame/SavedGame.h"
 #include "../Savegame/SavedBattleGame.h"
 #include "ExplosionBState.h"
@@ -2411,9 +2412,14 @@
        int z = origin.z;
        int i = 8;
        int result = V_EMPTY;
-       std::vector<Position> _trajectory;
        Position lastPosition = Position(x,y,z);
        Position nextPosition = lastPosition;
+
+       if (storeTrajectory && trajectory)
+       {
+               //initla value for small hack to glue `calculateLine` into one 
continuous arc
+               trajectory->push_back(lastPosition);
+       }
        while (z > 0)
        {
                x = (int)((double)origin.x + (double)i * cos(te) * sin(fi));
@@ -2421,25 +2427,24 @@
                z = (int)((double)origin.z + (double)i * cos(fi) - zK * 
((double)i - ro / 2.0) * ((double)i - ro / 2.0) + zA);
                //passes through this point?
                nextPosition = Position(x,y,z);
-               _trajectory.clear();
-               result = calculateLine(lastPosition, nextPosition, false, 0, 
excludeUnit);
-               if (result != V_EMPTY)
+
+               if (storeTrajectory && trajectory)
                {
-                       result = calculateLine(lastPosition, nextPosition, 
true, &_trajectory, excludeUnit);
-                       nextPosition = _trajectory.back(); //pick the INSIDE 
position of impact
-                       break;
+                       //remove end point of previus trajectory part, becasue 
next one will add this point again
+                       trajectory->pop_back();
                }
-               if (storeTrajectory && trajectory)
+               result = calculateLine(lastPosition, nextPosition, 
storeTrajectory, storeTrajectory ? trajectory : 0, excludeUnit);
+               if (result != V_EMPTY)
                {
-                       trajectory->push_back(nextPosition);
+                       if (!storeTrajectory && trajectory)
+                       {
+                               result = calculateLine(lastPosition, 
nextPosition, false, trajectory, excludeUnit); //pick the INSIDE position of 
impact
+                       }
+                       break;
                }
                lastPosition = nextPosition;
                ++i;
        }
-       if (trajectory != 0)
-       { // store the position of impact
-               trajectory->push_back(nextPosition);
-       }
        return result;
 }
 
@@ -2930,13 +2935,19 @@
                return false;
        }
 
+       std::vector<Position> trajectory;
+       // thows should be around 10 tiles far, make one allocation that fit 
99% cases with some margin
+       trajectory.resize(16*20);
        // we try 8 different curvatures to try and reach our goal.
        int test = V_OUTOFBOUNDS;
        while (!foundCurve && curvature < 5.0)
        {
-               std::vector<Position> trajectory;
-               test = calculateParabola(originVoxel, targetVoxel, false, 
&trajectory, action.actor, curvature, Position(0,0,0));
-               Position tilePos = ((trajectory.at(0) + Position(0,0,1)) / 
Position(16, 16, 24));
+               trajectory.clear();
+               test = calculateParabola(originVoxel, targetVoxel, true, 
&trajectory, action.actor, curvature, Position(0,0,0));
+               //position that item hit
+               Position hitPos = (trajectory.back() + Position(0,0,1)) / 
Position(16, 16, 24);
+               //position where item will land
+               Position tilePos = ((trajectory.at(trajectory.size() + 
Projectile::ItemDropVoxelOffset - 1)) / Position(16, 16, 24));
                if (forced || (test != V_OUTOFBOUNDS && tilePos == targetPos))
                {
                        if (voxelType)
@@ -2950,7 +2961,7 @@
                        curvature += 0.5;
                        if (test != V_OUTOFBOUNDS && action.actor->getFaction() 
== FACTION_PLAYER) //obstacle indicator is only for player
                        {
-                               Tile* hitTile = _save->getTile(tilePos);
+                               Tile* hitTile = _save->getTile(hitPos);
                                if (hitTile)
                                {
                                        hitTile->setObstacle(test);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/OpenGL.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/OpenGL.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/OpenGL.h 2020-06-14 
23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/OpenGL.h 2020-11-05 
22:05:20.000000000 +0100
@@ -11,6 +11,10 @@
 
 #ifndef __NO_OPENGL
 
+#ifdef __APPLE__
+#define GL_SILENCE_DEPRECATION
+#endif
+
 #include <SDL_opengl.h>
 #include <string>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/RNG.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/RNG.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/RNG.cpp  2020-06-14 
23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/RNG.cpp  2020-11-05 
22:05:20.000000000 +0100
@@ -152,17 +152,6 @@
        return (generate(0, 99) < value);
 }
 
-/**
- * Generates a random positive integer up to a number.
- * @param max Maximum number, exclusive.
- * @return Generated number.
- */
-int generateEx(int max)
-{
-       uint64_t num = next();
-       return (int)(num % max);
-}
-
 }
 
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/RNG.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/RNG.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/RNG.h    2020-06-14 
23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/RNG.h    2020-11-05 
22:05:20.000000000 +0100
@@ -18,6 +18,7 @@
  * along with OpenXcom.  If not, see <http://www.gnu.org/licenses/>.
  */
 #include <algorithm>
+#include <vector>
 #define __STDC_LIMIT_MACROS
 #include <stdint.h>
 
@@ -45,17 +46,18 @@
        double boxMuller(double m = 0, double s = 1);
        /// Generates a percentage chance.
        bool percent(int value);
-       /// Generates a random integer number, exclusive.
-       int generateEx(int max);
        /// Shuffles a list randomly.
        /**
         * Randomly changes the orders of the elements in a list.
         * @param list The container to randomize.
         */
        template <typename T>
-       void shuffle(T &list)
+       void shuffle(std::vector<T> &list)
        {
-               std::random_shuffle(list.begin(), list.end(), generateEx);
+               if (list.empty())
+                       return;
+               for (size_t i = list.size() - 1; i > 0; --i)
+                       std::swap(list[i], list[generate(0, i)]);
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/Screen.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/Screen.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Engine/Screen.cpp       
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Engine/Screen.cpp       
2020-11-05 22:05:20.000000000 +0100
@@ -41,7 +41,12 @@
 const int Screen::ORIGINAL_WIDTH = 320;
 const int Screen::ORIGINAL_HEIGHT = 200;
 
-static char VIDEO_WINDOW_POS[40];
+static const int VIDEO_WINDOW_POS_LEN = 40;
+static char VIDEO_WINDOW_POS[VIDEO_WINDOW_POS_LEN];
+
+static const char* SDL_VIDEO_CENTERED_UNSET = "SDL_VIDEO_CENTERED=";
+static const char* SDL_VIDEO_CENTERED_CENTER = "SDL_VIDEO_CENTERED=center";
+static const char* SDL_VIDEO_WINDOW_POS_UNSET = "SDL_VIDEO_WINDOW_POS=";
 
 /**
  * Sets up all the internal display flags depending on
@@ -71,19 +76,19 @@
        // Handle window positioning
        if (!Options::fullscreen && Options::rootWindowedMode)
        {
-               sprintf(VIDEO_WINDOW_POS, "SDL_VIDEO_WINDOW_POS=%d,%d", 
Options::windowedModePositionX, Options::windowedModePositionY);
+               snprintf(VIDEO_WINDOW_POS, VIDEO_WINDOW_POS_LEN, 
"SDL_VIDEO_WINDOW_POS=%d,%d", Options::windowedModePositionX, 
Options::windowedModePositionY);
                SDL_putenv(VIDEO_WINDOW_POS);
-               SDL_putenv("SDL_VIDEO_CENTERED=");
+               SDL_putenv((char *)SDL_VIDEO_CENTERED_UNSET);
        }
        else if (Options::borderless)
        {
-               SDL_putenv("SDL_VIDEO_WINDOW_POS=");
-               SDL_putenv("SDL_VIDEO_CENTERED=center");
+               SDL_putenv((char *)SDL_VIDEO_WINDOW_POS_UNSET);
+               SDL_putenv((char *)SDL_VIDEO_CENTERED_CENTER);
        }
        else
        {
-               SDL_putenv("SDL_VIDEO_WINDOW_POS=");
-               SDL_putenv("SDL_VIDEO_CENTERED=");
+               SDL_putenv((char *)SDL_VIDEO_WINDOW_POS_UNSET);
+               SDL_putenv((char *)SDL_VIDEO_CENTERED_UNSET);
        }
 
        // Handle display mode
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Interface/TextEdit.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Interface/TextEdit.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Interface/TextEdit.h    
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Interface/TextEdit.h    
2020-11-05 22:05:20.000000000 +0100
@@ -54,15 +54,17 @@
        /// Cleans up the text edit.
        ~TextEdit();
        /// Handle focus.
-       void handle(Action *action, State *state);
+       void handle(Action *action, State *state) override;
        /// Sets focus on this text edit.
-       void setFocus(bool focus, bool modal = true);
+       void setFocus(bool focus, bool modal);
+       // Override the base class' method properly.
+       void setFocus(bool focus) override { setFocus(focus, true); };
        /// Sets the text size to big.
        void setBig();
        /// Sets the text size to small.
        void setSmall();
        /// Initializes the text edit's resources.
-       void initText(Font *big, Font *small, Language *lang);
+       void initText(Font *big, Font *small, Language *lang) override;
        /// Sets the text's string.
        void setText(const std::string &text);
        /// Gets the text edit's string.
@@ -72,7 +74,7 @@
        /// Sets the text edit's color invert setting.
        void setInvert(bool invert);
        /// Sets the text edit's high contrast color setting.
-       void setHighContrast(bool contrast);
+       void setHighContrast(bool contrast) override;
        /// Sets the text edit's horizontal alignment.
        void setAlign(TextHAlign align);
        /// Sets the text edit's vertical alignment.
@@ -80,25 +82,25 @@
        /// Sets the text edit constraint.
        void setConstraint(TextEditConstraint constraint);
        /// Sets the text edit's color.
-       void setColor(Uint8 color);
+       void setColor(Uint8 color) override;
        /// Gets the text edit's color.
        Uint8 getColor() const;
        /// Sets the text edit's secondary color.
-       void setSecondaryColor(Uint8 color);
+       void setSecondaryColor(Uint8 color) override;
        /// Gets the text edit's secondary color.
        Uint8 getSecondaryColor() const;
        /// Sets the text edit's palette.
-       void setPalette(SDL_Color *colors, int firstcolor = 0, int ncolors = 
256);
+       void setPalette(SDL_Color *colors, int firstcolor = 0, int ncolors = 
256) override;
        /// Handles the timers.
-       void think();
+       void think() override;
        /// Plays the blinking animation.
        void blink();
        /// Draws the text edit.
-       void draw();
+       void draw() override;
        /// Special handling for mouse presses.
-       void mousePress(Action *action, State *state);
+       void mousePress(Action *action, State *state) override;
        /// Special handling for keyboard presses.
-       void keyboardPress(Action *action, State *state);
+       void keyboardPress(Action *action, State *state) override;
        /// Hooks an action handler to when the slider changes.
        void onChange(ActionHandler handler);
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Menu/StatisticsState.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Menu/StatisticsState.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Menu/StatisticsState.cpp        
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Menu/StatisticsState.cpp        
2020-11-05 22:05:20.000000000 +0100
@@ -39,6 +39,7 @@
 #include "../Savegame/SoldierDeath.h"
 #include "../Savegame/BattleUnitStatistics.h"
 #include "../Savegame/Country.h"
+#include "../Savegame/Region.h"
 #include "../Savegame/AlienBase.h"
 
 namespace OpenXcom
@@ -122,7 +123,13 @@
        ss << Unicode::TOK_NL_SMALL << time->getDayString(_game->getLanguage()) 
<< " " << tr(time->getMonthString()) << " " << time->getYear();
        _txtTitle->setText(ss.str());
 
-       int monthlyScore = sumVector(save->getResearchScores()) / 
(int)save->getResearchScores().size();
+       int totalScore = sumVector(save->getResearchScores());
+       for (std::vector<Region*>::iterator iter = save->getRegions()->begin(); 
iter != save->getRegions()->end(); ++iter)
+       {
+               totalScore += sumVector((*iter)->getActivityXcom()) - 
sumVector((*iter)->getActivityAlien());
+       }
+
+       int monthlyScore = totalScore / (int)save->getResearchScores().size();
        int64_t totalIncome = sumVector(save->getIncomes());
        int64_t totalExpenses = sumVector(save->getExpenditures());
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Mod/RuleManufacture.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Mod/RuleManufacture.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Mod/RuleManufacture.cpp 
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Mod/RuleManufacture.cpp 
2020-11-05 22:05:20.000000000 +0100
@@ -115,6 +115,17 @@
 }
 
 /**
+ * Checks if there's enough funds to manufacture one object.
+ * @param funds Current funds.
+ * @return True if manufacture is possible.
+ */
+bool RuleManufacture::haveEnoughMoneyForOneMoreUnit(int64_t funds) const
+{
+       // either we have enough money, or the production doesn't cost anything
+       return funds >= _cost || _cost <= 0;
+}
+
+/**
  * Gets the list of items required to manufacture one object.
  * @return The list of items required to manufacture one object.
  */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Mod/RuleManufacture.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Mod/RuleManufacture.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Mod/RuleManufacture.h   
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Mod/RuleManufacture.h   
2020-11-05 22:05:20.000000000 +0100
@@ -20,6 +20,7 @@
 #include <string>
 #include <map>
 #include <yaml-cpp/yaml.h>
+#include <stdint.h>
 
 namespace OpenXcom
 {
@@ -52,6 +53,8 @@
        int getManufactureTime() const;
        /// Gets the cost of manufacturing one object.
        int getManufactureCost() const;
+       /// Checks if there's enough funds to manufacture one object.
+       bool haveEnoughMoneyForOneMoreUnit(int64_t funds) const;
        /// Gets the list of items required to manufacture one object.
        const std::map<std::string, int> & getRequiredItems() const;
        /// Gets the list of items produced by completing "one object" of this 
project.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/AlienMission.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/AlienMission.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/AlienMission.cpp       
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/AlienMission.cpp       
2020-11-05 22:05:20.000000000 +0100
@@ -748,7 +748,7 @@
 
        if (_missionSiteZone != -1 && _rule.getWave(waveNumber).objective && 
trajectory.getZone(nextWaypoint) == (size_t)(_rule.getSpawnZone()))
        {
-               const MissionArea *area = 
&region.getMissionZones().at(_rule.getObjective()).areas.at(_missionSiteZone);
+               const MissionArea *area = 
&region.getMissionZones().at(_rule.getSpawnZone()).areas.at(_missionSiteZone);
                return std::make_pair(area->lonMin, area->latMin);
        }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/AlienStrategy.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/AlienStrategy.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/AlienStrategy.cpp      
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/AlienStrategy.cpp      
2020-11-05 22:05:20.000000000 +0100
@@ -185,12 +185,13 @@
 /**
  * Increments the number of missions run labelled as "varName".
  * @param varName the variable name that we want to use to keep track of this.
+ * @param increment the value to increment by.
  */
-void AlienStrategy::addMissionRun(const std::string &varName)
+void AlienStrategy::addMissionRun(const std::string &varName, int increment)
 {
        if (varName.empty())
                return;
-       _missionRuns[varName]++;
+       _missionRuns[varName] += increment;
 }
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/AlienStrategy.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/AlienStrategy.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/AlienStrategy.h        
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/AlienStrategy.h        
2020-11-05 22:05:20.000000000 +0100
@@ -50,7 +50,7 @@
        /// Checks the number of missions run labelled as "varName".
        int getMissionsRun(const std::string &varName);
        /// Increments the number of missions run labelled as "varName".
-       void addMissionRun(const std::string &varName);
+       void addMissionRun(const std::string &varName, int increment = 1);
        /// Adds a mission location to our storage array.
        void addMissionLocation(const std::string &varName, const std::string 
&regionName, int zoneNumber, int maximum);
        /// Checks that a given mission location (city or whatever) isn't 
stored in our list of previously attacked locations.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/Production.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/Production.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/Production.cpp 
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/Production.cpp 
2020-11-05 22:05:20.000000000 +0100
@@ -87,7 +87,7 @@
 
 bool Production::haveEnoughMoneyForOneMoreUnit(SavedGame * g) const
 {
-       return (g->getFunds() >= _rules->getManufactureCost());
+       return _rules->haveEnoughMoneyForOneMoreUnit(g->getFunds());
 }
 
 bool Production::haveEnoughMaterialsForOneMoreUnit(Base * b, const Mod *m) 
const
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/SaveConverter.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/SaveConverter.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/SaveConverter.cpp      
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/SaveConverter.cpp      
2020-11-05 22:05:20.000000000 +0100
@@ -341,7 +341,6 @@
                ids[_rules->getMarkers()[i]] = load<Uint16>(data + i * 
sizeof(Uint16));
        }
        ids["STR_CRASH_SITE"] = ids["STR_LANDING_SITE"] = ids["STR_UFO"];
-       _save->setAllIds(ids);
 
        _year = load<Uint16>(data + 0x16);
 
@@ -351,6 +350,35 @@
                int score = load<Sint16>(data + 0x18 + i * sizeof(Sint16));
                _save->getResearchScores().push_back(score);
        }
+
+       // Loads the SITE.DAT file (TFTD only).
+       std::string s = _savePath + CrossPlatform::PATH_SEPARATOR + "SITE.DAT";
+       if (CrossPlatform::fileExists(s))
+       {
+               std::vector<char> sitebuffer;
+               char* sitedata = binaryBuffer("SITE.DAT", sitebuffer);
+               int generatedArtifactSiteMissions = load<Uint16>(sitedata + 
0x24);
+               if (generatedArtifactSiteMissions > 0)
+               {
+                       _save->getAlienStrategy().addMissionRun("artifacts", 
generatedArtifactSiteMissions);
+
+                       int spawnedArtifactSites = 
generatedArtifactSiteMissions;
+                       char siteTypeToBeSpawned = load<char>(sitedata + 0x26);
+                       if (siteTypeToBeSpawned == 'T')
+                       {
+                               // before the first hour of the month, the 
mission was generated already, but the site has not spawned yet
+                               spawnedArtifactSites--;
+                       }
+                       else
+                       {
+                               // after the first hour of the month
+                               // or not an artifact site type
+                       }
+                       ids["STR_ARTIFACT_SITE"] = spawnedArtifactSites + 1; // 
OXC stores the ID of the next site, thus +1
+               }
+       }
+
+       _save->setAllIds(ids);
 }
 
 /**
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/SavedBattleGame.cpp 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/SavedBattleGame.cpp
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/SavedBattleGame.cpp    
2020-06-14 23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/SavedBattleGame.cpp    
2020-11-05 22:05:20.000000000 +0100
@@ -884,6 +884,10 @@
                        {
                                (*i)->setTurnsSinceSpotted(0);
                        }
+                       if ((*i)->getAIModule())
+                       {
+                               (*i)->getAIModule()->reset(); // clean up AI 
state
+                       }
                }
        }
        // hide all aliens (VOF calculations below will turn them visible again)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/Ufo.h 
new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/Ufo.h
--- old/OpenXcom-1.0.0.1592170963.8ae998af3/src/Savegame/Ufo.h  2020-06-14 
23:42:43.000000000 +0200
+++ new/OpenXcom-1.0.0.1604610320.4639493f0/src/Savegame/Ufo.h  2020-11-05 
22:05:20.000000000 +0100
@@ -56,7 +56,7 @@
        bool _detected, _hyperDetected, _processedIntercept;
        int _shootingAt, _hitFrame, _fireCountdown, _escapeCountdown;
        /// Calculates a new speed vector to the destination.
-       void calculateSpeed();
+       void calculateSpeed() override;
 
        using MovingTarget::load;
        using MovingTarget::save;
@@ -70,19 +70,19 @@
        /// Saves the UFO to YAML.
        YAML::Node save(bool newBattle) const;
        /// Gets the UFO's type.
-       std::string getType() const;
+       std::string getType() const override;
        /// Gets the UFO's ruleset.
        const RuleUfo *getRules() const;
        /// Sets the UFO's ruleset.
        void changeRules(const RuleUfo *rules);
        /// Gets the UFO's default name.
-       std::string getDefaultName(Language *lang) const;
+       std::string getDefaultName(Language *lang) const override;
        /// Gets the UFO's marker name.
-       std::string getMarkerName() const;
+       std::string getMarkerName() const override;
        /// Gets the UFO's marker ID.
        int getMarkerId() const override;
        /// Gets the UFO's marker sprite.
-       int getMarker() const;
+       int getMarker() const override;
        /// Gets the UFO's amount of damage.
        int getDamage() const;
        /// Sets the UFO's amount of damage.
@@ -142,7 +142,7 @@
        /// Gets the UFO's mission object.
        AlienMission *getMission() const { return _mission; }
        /// Sets the UFO's destination.
-       void setDestination(Target *dest);
+       void setDestination(Target *dest) override;
        /// Get which interceptor this ufo is engaging.
        int getShootingAt() const;
        /// Set which interceptor this ufo is engaging.


Reply via email to