ΠΠ΅Π΄Π°Π½ ΠΎΠ΄ Π½Π°ΡΠ°ΠΊΡΡΠ΅Π»Π½ΠΈΡΠΈΡ
ΡΡΠ΅Π½Π°ΡΠΈΡΠ° Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΠΠΠ‘-Π‘ΡΡΠ΄ΠΈΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΡΠ΅ ΡΠ΅Π³ΠΎΠ²Π° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° ΡΠ° Π¦Π ΡΠΈΡΡΠ΅ΠΌΠΈΠΌΠ°. Π ΠΈΠ°ΠΊΠΎ ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡΠΎΡΠ΅ΠΊΡΠ° ΠΠΠ‘-Π‘ΡΡΠ΄ΠΈΠΎ ΠΈΠ· ΡΠΊΠΎΡΠΎ ΡΠ²Π°ΠΊΠΎΠ³ ΡΠΈΡΡΠ΅ΠΌΠ° ΠΊΠΎΠ½ΡΠΈΠ½ΡΠΈΡΠ°Π½Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ ΡΠ³ΡΠ°Π΄ΠΈΡΠΈ Ρ ΡΠ°ΠΌΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΌΠΈ Π½Π°ΡΡΠ°Π²ΡΠ°ΠΌΠΎ Π΄Π° ΠΎΠ²Π°Ρ ΠΏΡΠΎΡΠ΅Ρ ΡΠΈΠ½ΠΈΠΌΠΎ ΡΠΎΡ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΈΡΠΈΠΌ. ΠΠΠ‘-Π‘ΡΡΠ΄ΠΈΠΎ ΡΠ°Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ΄ΡΡΠΊΡ Π·Π° ΠΏΡΠ΅ΡΠ²Π°ΡΠ°ΡΠ΅ ΠΈΠ·Π»Π°Π·Π° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Ρ ΡΠΎΡΠΌΠ°Ρ Π·Π° Π’Π΅Π°ΠΌΠ¦ΠΈΡΠΈ - Π’Π΅Π°ΠΌΠ¦ΠΈΡΠΈ ΠΠ½ΡΠΏΠ΅ΡΡΠΈΠΎΠ½Ρ Π’ΠΈΠΏΠ΅. Π₯Π°ΡΠ΄Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ ΠΊΠ°ΠΊΠΎ ΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ΅.
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅Π½ΠΎΠΌ ΡΠΎΡΡΠ²Π΅ΡΡ
ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ ΠΎ ΠΏΡΠΎΡΠ΅ΠΊΡΡ ΠΊΠΎΡΠΈ ΡΠ΅ ΠΏΡΠΎΡΡΠ°Π²Π°
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ β ΠΏΡΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ OpenRCT2.
ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ΅
ΠΠ° Π±ΠΈΡ ΡΡΡΠ΅Π΄Π΅Π»Π° Π²ΡΠ΅ΠΌΠ΅, Π²Π΅ΡΠΎΠ²Π°ΡΠ½ΠΎ ΡΡ ΠΏΡΠ΅ΡΠΊΠΎΡΠΈΡΠΈ ΠΏΡΠΎΡΠ΅Ρ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ΅ ΠΈ ΠΏΠΎΡΠ΅ΡΠΈ ΠΎΠ΄ ΡΡΠ΅Π½ΡΡΠΊΠ° ΠΊΠ°Π΄Π° Π½Π° ΠΌΠΎΠΌ ΡΠ°ΡΡΠ½Π°ΡΡ Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΡΠ΅Π½ΡΡ Π’Π΅Π°ΠΌΠ¦ΠΈΡΠΈ ΡΠ΅ΡΠ²Π΅Ρ. ΠΠΎΡΠ°ΠΌΠΎ Π΄Π° ΠΎΠ΄Π΅ΠΌΠΎ Π½Π°: Π»ΠΎΡΠ°Π»Ρ ΠΎΡΡ:{ΠΏΠΎΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠΈΡΠ°Π½ ΡΠΎΠΊΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ΅} (Ρ ΠΌΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ, Π»ΠΎΡΠ°Π»Ρ ΠΎΡΡ:9090) ΠΈ ΡΠ½Π΅ΡΠ΅ΠΌΠΎ ΠΏΠΎΠ΄Π°ΡΠΊΠ΅ Π·Π° Π°ΡΡΠΎΡΠΈΠ·Π°ΡΠΈΡΡ. ΠΠ°ΠΊΠΎΠ½ ΡΠ»Π°ΡΠΊΠ° Π΄ΠΎΡΠ΅ΠΊΠ°ΡΠ΅ Π½Π°Ρ:
ΠΠ°ΠΆΠΌΡΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Create Project. ΠΠ°Π»Π΅Π΅ Π²ΡΠ±Π΅ΡΠ΅ΠΌ Manually, Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΠ»Ρ.
ΠΠ°ΠΊΠΎΠ½ ΠΏΡΠΈΡΠΈΡΠΊΠ° Π½Π° Π΄ΡΠ³ΠΌΠ΅ Π‘ΡΠ²ΠΎΡΠΈΡΠΈ, Π΄ΠΎΡΠ΅ΠΊΠ° Π½Π°Ρ ΠΏΡΠΎΠ·ΠΎΡ ΡΠ° ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠΈΠΌΠ°.
Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌΠΎ ΠΡΠ΅ΠΈΡΠ°ΡΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡ ΠΈΠ·Π³ΡΠ°Π΄ΡΠ΅.
ΠΠΎΠΏΡΠ½ΠΈΡΠ΅ ΠΏΠΎΡΠ° ΠΈ ΠΊΠ»ΠΈΠΊΠ½ΠΈΡΠ΅ Π‘ΡΠ²ΠΎΡΠΈΡΠΈ. ΠΡ Π²ΠΈΠ΄ΠΈΠΌ ΠΎΠΊΠ½ΠΎ Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π²ΡΠ±ΠΎΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π²Π΅ΡΡΠΈΠΉ. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ ΡΠΆΠ΅ Π»Π΅ΠΆΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ, ΠΆΠΌΡΠΌ ΠΡΠ΅ΡΠΊΠΎΡΠΈΡΠΈ.
ΠΠ° ΠΊΡΠ°ΡΡ, ΠΏΡΠ΅Π»Π°Π·ΠΈΠΌΠΎ Π½Π° ΠΏΠΎΠ΄Π΅ΡΠ°Π²Π°ΡΠ° ΠΏΡΠΎΡΠ΅ΠΊΡΠ°.
ΠΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ°Π³ΠΈ ΡΠ±ΠΎΡΠΊΠΈ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΆΠΌΡΠΌ: ΠΠΎΡΠ°ΡΠΈ ΠΈΠ·Π³ΡΠ°Π΄ΡΠ΅ -> ΠΠΎΠ΄Π°Ρ ΠΊΠΎΡΠ°ΠΊ ΠΈΠ·Π³ΡΠ°Π΄ΡΠ΅.
ΠΠ²Π΄Π΅ Π±ΠΈΡΠ°ΠΌΠΎ:
- Π’ΠΈΠΏ ΠΏΠΎΠΊΡΠ΅ΡΠ°ΡΠ° -> ΠΠΎΠΌΠ°Π½Π΄Π½Π° Π»ΠΈΠ½ΠΈΡΠ°
- ΠΠΎΠΊΡΠ΅Π½ΠΈ -> ΠΡΠΈΠ»Π°Π³ΠΎΡΠ΅Π½Π° ΡΠΊΡΠΈΠΏΡΠ°
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ· Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΡΠ±ΠΎΡΠΊΠ° ΠΈ Π°Π½Π°Π»ΠΈΠ· Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΡΠ°Π³ΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΠ»Π΅ Π¦ΡΡΡΠΎΠΌ Π‘ΡΡΠΈΠΏΡ:
ΠΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ
ΡΠ°Π³Π°Ρ
ΠΌΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ ΠΏΠΎΠ·ΠΆΠ΅. ΠΠ°ΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΡΠ±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·, Π²ΡΠ²ΠΎΠ΄ ΠΎΡΡΡΡΠ° ΠΈ Π΅Π³ΠΎ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°Π½ΡΠ»ΠΎ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄ΠΈΠ½Π½Π°Π΄ΡΠ°ΡΡ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π°.
ΠΠΎΡΠ»Π΅Π΄Π½Π΅Π΅, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, β ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΌΠΈ Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠΈΠ» Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΡΠΈ Π΄Π»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΈΡ ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΡΠΌ: ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ -> ΠΠΎΠ΄Π°Ρ Π½ΠΎΠ²ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°Ρ ΠΈ Π΄ΠΎΠ΄Π°ΡΡΠ΅ ΡΡΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅:
ΠΡΡΠ°ΡΡΡΡ Π½Π°ΠΆΠ°ΡΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ ΡΡΡΠ°ΡΠ΅ Π² ΠΏΡΠ°Π²ΠΎΠΌ Π²Π΅ΡΡ
Π½Π΅ΠΌ ΡΠ³Π»Ρ. ΠΠΎΠΊΠ° ΠΈΠ΄ΡΡ ΡΠ±ΠΎΡΠΊΠ° ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ°ΡΡΠΊΠ°ΠΆΡ Π²Π°ΠΌ ΠΎ ΡΠΊΡΠΈΠΏΡΠ΅.
ΠΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠΎ
ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²ΡΠΊΠ°ΡΠ°ΡΡ ΡΠ²Π΅ΠΆΠΈΠΉ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ² PVS-Studio. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ Π‘hocolatey. ΠΠ»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ Ρ
ΠΎΡΠ΅Ρ ΡΠ·Π½Π°ΡΡ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅, Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ
choco install pvs-studio -y
ΠΠ°Π»Π΅Π΅ Π·Π°ΠΏΡΡΡΠΈΠΌ ΡΡΠΈΠ»ΠΈΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° CLMonitor.
%CLmon% monitor β-attach
ΠΠΎΡΠΎΠΌ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΡΠΌ ΡΠ±ΠΎΡΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ ΠΠ‘Π Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΠΏΡΡΡ ΠΊ Π½ΡΠΆΠ½ΠΎΠΉ ΠΌΠ½Π΅ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ Π²Π΅ΡΡΠΈΠΈ MSBuild
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
ΠΠ²Π΅Π΄ΡΠΌ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΊΠ»ΡΡ Π»ΠΈΡΠ΅Π½Π·ΠΈΠΈ PVS-Studio:
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ±ΠΎΡΠΊΠΈ Π΅ΡΡ ΡΠ°Π· Π·Π°ΠΏΡΡΡΠΈΠΌ CLMonitor Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°:
%CLmon% analyze -l "c:ptest.plog"
ΠΠ°ΡΠΈΠΌ ΡΠ΅ΠΌΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ»ΡΠΆΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌ ΠΈΠ· Π½Π°ΡΠ΅ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΠ΅. ΠΠ»ΠΎΠ³Π¦ΠΎΠ½Π²Π΅ΡΡΠ΅Ρ ΠΊΠΎΠ½Π²Π΅ΡΡΡΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ°Ρ ΠΈΠ· ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΎΠ³ ΡΠΎΡΠΌΠ°ΡΠ° Ρ ΡΠΎΡΠΌΠ°Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ°Π½ Π·Π° Π’Π΅Π°ΠΌΠ¦ΠΈΡΠΈ. ΠΠ°Ρ Π²Π°ΡΡΡΡΡΠΈ ΡΠΎΠΌΠ΅, ΠΌΠΎΡΠΈ ΡΠ΅ΠΌΠΎ Π΄Π° Π³Π° Π²ΠΈΠ΄ΠΈΠΌΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Ρ ΠΏΡΠΎΠ·ΠΎΡΡ Π·Π° ΠΈΠ·Π³ΡΠ°Π΄ΡΡ.
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΠΌ Π²ΡΠ²Π΅Π΄Π΅ΠΌ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΡΡΡ Π² ΡΡΠ΄ΠΎΡΡ, Π³Π΄Π΅ ΡΠ΅ Π³Π° ΠΏΠΎΠΊΡΠΏΠΈΡΠΈ Π’Π΅Π°ΠΌΠ¦ΠΈΡΠΈ ΠΏΠ°ΡΡΠ΅Ρ.
type "C:tempptest.plog_TeamCity.txt"
ΠΠΎΠΌΠΏΠ»Π΅ΡΠ°Π½ ΠΊΠΎΠ΄ ΡΠΊΡΠΈΠΏΡΠ΅:
choco install pvs-studio -y
%CLmon% monitor --attach
set platform=x64
%MSB% %ProjPath% /t:clean
%MSB% %ProjPath% /t:rebuild /p:configuration=release
%MSB% %ProjPath% /t:g2
%MSB% %ProjPath% /t:PublishPortable
%PVS-Studio_cmd% credentials --username %PVS_Name% --serialNumber %PVS_Key%
%CLmon% analyze -l "c:ptest.plog"
%PlogConverter% "c:ptest.plog" --renderTypes=TeamCity -o "C:temp"
type "C:tempptest.plog_TeamCity.txt"
Π’Π΅ΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ, ΡΠ±ΠΎΡΠΊΠ° ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΠ»ΠΈΡΡ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΡ Projekti ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΠ° Π² Π΅ΡΠΎΠΌ.
Π‘Π°Π΄Π° Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌΠΎ Π½Π° ΠΡΠ΅Π³Π»Π΅Π΄ΠΈ Π£ΠΊΡΠΏΠ½ΠΎ, ΡΡΠΎΠ± ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΠΏΡΠΎΡΠΌΠΎΡΡΡ ΠΎΡΡΡΡΠ° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°:
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ° ΡΡ Π³ΡΡΠΏΠΈΡΠ°Π½Π° ΠΏΡΠ΅ΠΌΠ° Π±ΡΠΎΡΠ΅Π²ΠΈΠΌΠ° Π΄ΠΈΡΠ°Π³Π½ΠΎΡΡΠΈΡΠΊΠΈΡ
ΠΏΡΠ°Π²ΠΈΠ»Π°. ΠΠ° Π±ΠΈΡΡΠ΅ ΡΠ΅ ΠΊΡΠ΅ΡΠ°Π»ΠΈ ΠΊΡΠΎΠ· ΠΊΠΎΠ΄, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ ΡΠ΅ Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΡΠ΅ Π½Π° Π±ΡΠΎΡ ΡΠ΅Π΄Π° ΡΠ° ΡΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ΠΌ. ΠΠ»ΠΈΠΊΠΎΠΌ Π½Π° ΡΠΏΠΈΡΠ½ΠΈΠΊ Ρ Π³ΠΎΡΡΠ΅ΠΌ Π΄Π΅ΡΠ½ΠΎΠΌ ΡΠ³Π»Ρ ΠΎΡΠ²ΠΎΡΠΈΡΠ΅ ΡΠ΅ Π½ΠΎΠ²Π° ΠΊΠ°ΡΡΠΈΡΠ° ΡΠ° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΎΠΌ. Π’Π°ΠΊΠΎΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΊΡΠ΅ΡΠ΅ΡΠ΅ ΠΊΡΠΎΠ· ΠΊΠΎΠ΄ ΡΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ΡΠ΅ ΠΊΠ»ΠΈΠΊΠ½ΡΡΠΈ Π½Π° Π±ΡΠΎΡ ΡΠ΅Π΄Π° ΡΠ° ΡΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ΠΌ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°. ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡΠ° ΡΠ° ΡΠ΄Π°ΡΠ΅Π½ΠΎΠ³ ΡΠ°ΡΡΠ½Π°ΡΠ° ΡΠ΅ ΠΌΠΎΠ³ΡΡΠ° ΠΊΠ°Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π‘ΠΎΡΡΡΠ΅Π’ΡΠ΅Π΅Π ΠΎΠΎΡ ΠΌΠ°ΡΠΊΠ΅ΡΠ°. Π’ΠΎΡ, ΠΊΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ Π΄Π°Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΡΠ°Π·Π΄Π΅Π»ΠΎΠΌ
ΠΡΠ΅Π³Π»Π΅Π΄ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ Ρ ΡΠ°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ, ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΠ΅ Π² ΠΈΡΡΠ»Π΅Π΄ΡΠ΅ΠΌΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅.
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ Π1
Object* CreateObjectFromJson(....)
{
Object* result = nullptr;
....
result = CreateObject(entry);
....
if (readContext.WasError())
{
throw std::runtime_error("Object has errors");
}
....
}
Object* CreateObject(const rct_object_entry& entry)
{
Object* result;
switch (entry.GetType())
{
case OBJECT_TYPE_RIDE:
result = new RideObject(entry);
break;
case OBJECT_TYPE_SMALL_SCENERY:
result = new SmallSceneryObject(entry);
break;
case OBJECT_TYPE_LARGE_SCENERY:
result = new LargeSceneryObject(entry);
break;
....
default:
throw std::runtime_error("Invalid object type");
}
return result;
}
ΠΠ½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π·Π°ΠΌΠ΅ΡΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ, Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ Π² Π¦ΡΠ΅Π°ΡΠ΅ΠΠ±ΡΠ΅ΡΡ, ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡ Π½Π΅ ΠΎΡΠΈΡΠ°Π΅ΡΡΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΡΡΠ΅ΡΠΊΠ° ΠΏΠ°ΠΌΡΡΠΈ.
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ Π2
static uint64_t window_cheats_page_enabled_widgets[] =
{
MAIN_CHEAT_ENABLED_WIDGETS |
(1ULL << WIDX_NO_MONEY) |
(1ULL << WIDX_ADD_SET_MONEY_GROUP) |
(1ULL << WIDX_MONEY_SPINNER) |
(1ULL << WIDX_MONEY_SPINNER_INCREMENT) |
(1ULL << WIDX_MONEY_SPINNER_DECREMENT) |
(1ULL << WIDX_ADD_MONEY) |
(1ULL << WIDX_SET_MONEY) |
(1ULL << WIDX_CLEAR_LOAN) |
(1ULL << WIDX_DATE_SET) |
(1ULL << WIDX_MONTH_BOX) | // <=
(1ULL << WIDX_MONTH_UP) |
(1ULL << WIDX_MONTH_DOWN) |
(1ULL << WIDX_YEAR_BOX) |
(1ULL << WIDX_YEAR_UP) |
(1ULL << WIDX_YEAR_DOWN) |
(1ULL << WIDX_DAY_BOX) |
(1ULL << WIDX_DAY_UP) |
(1ULL << WIDX_DAY_DOWN) |
(1ULL << WIDX_MONTH_BOX) | // <=
(1ULL << WIDX_DATE_GROUP) |
(1ULL << WIDX_DATE_RESET),
....
};
ΠΠ°Π»ΠΎ ΠΊΡΠΎ, ΠΊΡΠΎΠΌΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°, ΡΠΌΠΎΠ³ Π±Ρ ΠΏΡΠΎΠΉΡΠΈ Π΄Π°Π½Π½ΡΠΉ ΡΠ΅ΡΡ Π½Π° Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. ΠΠ°Π½Π½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΏΠΈΠΏΠ°ΡΡΡ Ρ ΠΎΡΠΎΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΈΠΌ.
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ° Π3
struct RCT12SpriteBase
{
....
uint8_t flags;
....
};
struct rct1_peep : RCT12SpriteBase
{
....
uint8_t flags;
....
};
ΠΠ°ΡΠ°Π²Π½ΠΎ, ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΠΈΠ²Π΅ ΡΠ° ΠΈΡΡΠΈΠΌ ΠΈΠΌΠ΅Π½ΠΎΠΌ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡ ΠΊΠ»Π°ΡΠΈ ΠΈ Ρ ΠΏΠΎΡΠΎΠΌΠΊΡ Π½ΠΈΡΠ΅ ΡΠ²Π΅ΠΊ Π³ΡΠ΅ΡΠΊΠ°. ΠΠ΅ΡΡΡΠΈΠΌ, ΡΠ°ΠΌΠ° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ° Π½Π°ΡΠ»Π΅ΡΠΈΠ²Π°ΡΠ° ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΡΠ° Π΄Π° ΡΡ ΡΠ²Π° ΠΏΠΎΡΠ° ΡΠΎΠ΄ΠΈΡΠ΅ΡΡΠΊΠ΅ ΠΊΠ»Π°ΡΠ΅ ΠΏΡΠΈΡΡΡΠ½Π° Ρ ΠΏΠΎΠ΄ΡΠ΅ΡΠ΅Π½ΠΎΡ ΠΊΠ»Π°ΡΠΈ. ΠΡΠΎΠ³Π»Π°ΡΠ°Π²Π°ΡΠ΅ΠΌ ΠΏΠΎΡΠ° ΡΠ° ΠΈΡΡΠΈΠΌ ΠΈΠΌΠ΅Π½ΠΎΠΌ Ρ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΡ ΡΡΠ²Π°ΡΠ°ΠΌΠΎ Π·Π°Π±ΡΠ½Ρ.
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ Π4
void vehicle_visual_observation_tower(...., int32_t imageDirection, ....)
{
if ((imageDirection / 8) && (imageDirection / 8) != 3)
{
....
}
....
}
Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π°ΠΌΠΎ ΠΈΠ·Π±Π»ΠΈΠ·Π°. ΠΠ·ΡΠ°Π· imageDirection / 8 Π±ΠΈΡΠ΅ Π»Π°ΠΆΠ½ΠΎ Π°ΠΊΠΎ ΠΈΠΌΠ°Π³Π΅ΠΠΈΡΠ΅ΡΡΠΈΠΎΠ½ ΡΠ΅ Ρ ΠΎΠΏΡΠ΅Π³Ρ ΠΎΠ΄ -7 Π΄ΠΎ 7. ΠΡΡΠ³ΠΈ Π΄Π΅ΠΎ: (ΠΈΠΌΠ°Π³Π΅ΠΠΈΡΠ΅ΡΡΠΈΠΎΠ½ / 8) != 3 ΠΏΡΠΎΠ²Π΅ΡΠ΅ ΠΈΠΌΠ°Π³Π΅ΠΠΈΡΠ΅ΡΡΠΈΠΎΠ½ Π·Π° ΠΈΠ·Π²Π°Π½ ΠΎΠΏΡΠ΅Π³Π°: ΠΎΠ΄ -31 Π΄ΠΎ -24 ΠΈ ΠΎΠ΄ 24 Π΄ΠΎ 31, ΡΠ΅ΡΠΏΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. Π§ΠΈΠ½ΠΈ ΠΌΠΈ ΡΠ΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΡΡΠ΄Π½ΠΈΠΌ Π΄Π° Π½Π° ΠΎΠ²Π°Ρ Π½Π°ΡΠΈΠ½ ΠΏΡΠΎΠ²Π΅ΡΠ°Π²Π°ΠΌ Π±ΡΠΎΡΠ΅Π²Π΅ Π·Π° ΡΠΊΡΡΡΠΈΠ²Π°ΡΠ΅ Ρ ΠΎΠ΄ΡΠ΅ΡΠ΅Π½ΠΈ ΠΎΠΏΡΠ΅Π³ ΠΈ, ΡΠ°ΠΊ ΠΈ Π°ΠΊΠΎ Π½Π΅ΠΌΠ° Π³ΡΠ΅ΡΠΊΠ΅ Ρ ΠΎΠ²ΠΎΠΌ Π΄Π΅Π»Ρ ΠΊΠΎΠ΄Π°, ΠΏΡΠ΅ΠΏΠΎΡΡΡΠΈΠΎ Π±ΠΈΡ Π΄Π° ΡΠ΅ ΠΎΠ²ΠΈ ΡΡΠ»ΠΎΠ²ΠΈ ΠΏΠΎΠ½ΠΎΠ²ΠΎ Π½Π°ΠΏΠΈΡΡ ΠΊΠ°ΠΊΠΎ Π±ΠΈ Π±ΠΈΠ»ΠΈ Π΅ΠΊΡΠΏΠ»ΠΈΡΠΈΡΠ½ΠΈΡΠΈ. ΠΠ²ΠΎ Π±ΠΈ Π·Π½Π°ΡΠ½ΠΎ ΠΎΠ»Π°ΠΊΡΠ°Π»ΠΎ ΠΆΠΈΠ²ΠΎΡ ΡΡΠ΄ΠΈΠΌΠ° ΠΊΠΎΡΠΈ Π±ΠΈ ΡΠΈΡΠ°Π»ΠΈ ΠΈ ΠΎΠ΄ΡΠΆΠ°Π²Π°Π»ΠΈ ΠΎΠ²Π°Ρ ΠΊΠΎΠ΄.
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ Π5
void process_mouse_over(....)
{
....
switch (window->widgets[widgetId].type)
{
case WWT_VIEWPORT:
ebx = 0;
edi = cursorId; // <=
// Window event WE_UNKNOWN_0E was called here,
// but no windows actually implemented a handler and
// it's not known what it was for
cursorId = edi; // <=
if ((ebx & 0xFF) != 0)
{
set_cursor(cursorId);
return;
}
break;
....
}
....
}
ΠΠ°Π½Π½ΡΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΊΠΎΠ΄Π°, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, Π±ΡΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΏΡΡΠ΅ΠΌ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. ΠΠ°ΡΠ΅ΠΌ, ΡΡΠ΄Ρ ΠΏΠΎ ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΌΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ, Π±ΡΠ»Π° ΡΠ΄Π°Π»Π΅Π½Π° ΡΠ°ΡΡΡ Π½Π΅ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΡΡΠ°Π»Π°ΡΡ ΠΏΠ°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ ΡΡΡΡΠΎΡΠΠ΄, ΡΡΠΎ ΡΠ°ΠΊΠΎΡΠ΅ Π½Π΅ΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΌΠΈΡΠ»Π°.
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ Π6
void Network::ProcessPlayerList()
{
....
auto* player = GetPlayerByID(pendingPlayer.Id);
if (player == nullptr)
{
// Add new player.
player = AddPlayer("", "");
if (player) // <=
{
*player = pendingPlayer;
if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
{
_serverConnection->Player = player;
}
}
newPlayers.push_back(player->Id); // <=
}
....
}
ΠΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ, Π½ΡΠΆΠ½ΠΎ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΠΈΠΉ ΡΠ°Π· ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΠΏΠ»Π΅ΡΠ΅Ρ Π½Π° Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π»ΠΈΠ±ΠΎ Π²Π½Π΅ΡΡΠΈ Π΅Π³ΠΎ Π² ΡΠ΅Π»ΠΎ ΡΡΠ»ΠΎΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°. Π― Π±Ρ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» Π²ΡΠΎΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ:
void Network::ProcessPlayerList()
{
....
auto* player = GetPlayerByID(pendingPlayer.Id);
if (player == nullptr)
{
// Add new player.
player = AddPlayer("", "");
if (player)
{
*player = pendingPlayer;
if (player->Flags & NETWORK_PLAYER_FLAG_ISSERVER)
{
_serverConnection->Player = player;
}
newPlayers.push_back(player->Id);
}
}
....
}
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ Π7
std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
auto name = json_object_get(server, "name");
.....
if (name == nullptr || version == nullptr)
{
....
}
else
{
....
entry.name = (name == nullptr ? "" : json_string_value(name));
....
}
....
}
ΠΠΎΠΆΠ½ΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΌΠ°Ρ ΠΎΠΌ ΠΈΠ·Π±Π°Π²ΠΈΡΡΡΡ ΠΎΡ ΡΡΡΠ΄Π½ΠΎΡΠΈΡΠ°Π΅ΠΌΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠ΄Π° ΠΈ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ Π½Π° Π½ΡΠ»Π»ΠΏΡΡ. ΠΡΠ΅Π΄Π»Π°Π³Π°Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΊΠΎΠ΄ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
std::optional<ServerListEntry> ServerListEntry::FromJson(...)
{
auto name = json_object_get(server, "name");
.....
if (name == nullptr || version == nullptr)
{
name = ""
....
}
else
{
....
entry.name = json_string_value(name);
....
}
....
}
Π£ΠΏΠΎΠ·ΠΎΡΠ΅ΡΠ΅ Π8
void CustomListView::MouseUp(....)
{
....
if (!ColumnHeaderPressedCurrentState)
{
ColumnHeaderPressed = std::nullopt;
ColumnHeaderPressedCurrentState = false;
Invalidate();
}
}
ΠΠΎΠ΄ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΡΠ°Π½Π½ΠΎ. ΠΠ½Π΅ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΠΈΠΌΠ΅Π»Π° ΠΌΠ΅ΡΡΠΎ Π±ΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΊΠ° Π»ΠΈΠ±ΠΎ Π² ΡΡΠ»ΠΎΠ²ΠΈΠΈ, Π»ΠΈΠ±ΠΎ ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΌ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π¦ΠΎΠ»ΡΠΌΠ½Π₯Π΅Π°Π΄Π΅ΡΠΡΠ΅ΡΡΠ΅Π΄Π¦ΡΡΡΠ΅Π½ΡΠ‘ΡΠ°ΡΠ΅ Π·Π½Π°ΡΠ΅ΡΠ° Π»Π°ΠΆΠ°Π½.
ΠΠ·Π»Π°Π·
ΠΠ°ΠΎ ΡΡΠΎ Π²ΠΈΠ΄ΠΈΠΌΠΎ, ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ° ΡΡΠ°ΡΠΈΡΠΊΠΎΠ³ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΠΠ‘-Π‘ΡΡΠ΄ΠΈΠΎ Ρ Π²Π°Ρ Π’Π΅Π°ΠΌΠ¦ΠΈΡΠΈ ΠΏΡΠΎΡΠ΅ΠΊΠ°Ρ ΡΠ΅ ΠΏΡΠΈΠ»ΠΈΡΠ½ΠΎ ΡΠ΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π°. ΠΠ° Π±ΠΈΡΡΠ΅ ΡΠΎ ΡΡΠ°Π΄ΠΈΠ»ΠΈ, Π΄ΠΎΠ²ΠΎΡΠ½ΠΎ ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΠΈ ΡΠ°ΠΌΠΎ ΡΠ΅Π΄Π½Ρ ΠΌΠ°Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Ρ Π΄Π°ΡΠΎΡΠ΅ΠΊΡ. ΠΡΠΎΠ²Π΅ΡΠ° ΠΊΠΎΠ΄Π° ΡΠ΅ Π²Π°ΠΌ ΠΎΠΌΠΎΠ³ΡΡΠΈΡΠΈ Π΄Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΡΠ΅ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΎΠ΄ΠΌΠ°Ρ Π½Π°ΠΊΠΎΠ½ ΡΠΊΠ»Π°ΠΏΠ°ΡΠ°, ΡΡΠΎ ΡΠ΅ ΠΏΠΎΠΌΠΎΡΠΈ Π΄Π° ΠΈΡ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡΠ΅ΡΠ΅ ΠΊΠ°Π΄Π° ΡΡ ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ ΠΈ ΡΠ΅Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π° ΡΠΎΡ ΡΠ²Π΅ΠΊ Π½ΠΈΡΠΊΠ°.
ΠΠΊΠΎ ΠΆΠ΅Π»ΠΈΡΠ΅ Π΄Π° ΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΠΎΠ²Π°Ρ ΡΠ»Π°Π½Π°ΠΊ ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠΎΠΌ ΠΊΠΎΡΠ° Π³ΠΎΠ²ΠΎΡΠΈ Π΅Π½Π³Π»Π΅ΡΠΊΠΈ, ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π»ΠΈΠ½ΠΊ Π·Π° ΠΏΡΠ΅Π²ΠΎΠ΄: ΠΠ»Π°Π΄ΠΈΡΠ»Π°Π² Π‘ΡΠΎΠ»ΠΈΠ°ΡΠΎΠ².
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ
Π°Π±Ρ.ΡΠΎΠΌ