Guest User

buildups

a guest
Jul 10th, 2020
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 50.15 KB | None | 0 0
  1. // dllmain.cpp: определяет точку входа для приложения DLL.
  2. // dllmain.cpp: определяет точку входа для приложения DLL.
  3. #include "targetver.h"
  4.  
  5. #include <windows.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8.  
  9.  
  10.  
  11. #include "..\..\include\patcher_x86_commented.hpp"
  12. #include "..\..\include\HotA\HoMM3.h"
  13. #include "..\..\include\era.h"
  14.  
  15.  
  16. Patcher * globalPatcher;
  17. PatcherInstance *emerald;
  18.  
  19. #define BLD_ID_MAGE1    0
  20. #define BLD_ID_MAGE2    1
  21. #define BLD_ID_MAGE3    2
  22. #define BLD_ID_MAGE4    3
  23. #define BLD_ID_MAGE5    4
  24. #define BLD_ID_TAVERN   5
  25. #define BLD_ID_WHARF    6
  26. #define BLD_ID_FORT1    7
  27. #define BLD_ID_FORT2    8
  28. #define BLD_ID_FORT3    9
  29. #define BLD_ID_HALL1    10
  30. #define BLD_ID_HALL2    11
  31. #define BLD_ID_HALL3    12
  32. #define BLD_ID_HALL4    13
  33. #define BLD_ID_MARKET   14
  34. #define BLD_ID_SILO     15
  35. #define BLD_ID_SMITH    16
  36. #define BLD_ID_SPEC17   17
  37. #define BLD_ID_HORDE1   18
  38. #define BLD_ID_HORDE1U  19
  39. #define BLD_ID_WHARF2   20
  40. #define BLD_ID_SPEC21   21
  41. #define BLD_ID_SPEC22   22
  42. #define BLD_ID_SPEC23   23
  43. #define BLD_ID_HORDE2   24
  44. #define BLD_ID_HORDE2U  25
  45. #define BLD_ID_GRAIL    26
  46. #define BLD_ID_DECOR27  27
  47. #define BLD_ID_DECOR28  28
  48. #define BLD_ID_DECOR29  29
  49. #define BLD_ID_DWELL1   30
  50. #define BLD_ID_DWELL2   31
  51. #define BLD_ID_DWELL3   32
  52. #define BLD_ID_DWELL4   33
  53. #define BLD_ID_DWELL5   34
  54. #define BLD_ID_DWELL6   35
  55. #define BLD_ID_DWELL7   36
  56. #define BLD_ID_DWELL1U  37
  57. #define BLD_ID_DWELL2U  38
  58. #define BLD_ID_DWELL3U  39
  59. #define BLD_ID_DWELL4U  40
  60. #define BLD_ID_DWELL5U  41
  61. #define BLD_ID_DWELL6U  42
  62. #define BLD_ID_DWELL7U  43
  63.  
  64.  
  65.  
  66. int Dependencies0[] = {
  67.     BLD_ID_MAGE1,   -1,
  68.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  69.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  70.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  71.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  72.     BLD_ID_WHARF,   -1,
  73.     BLD_ID_TAVERN,  -1,
  74.     BLD_ID_SPEC22,  BLD_ID_TAVERN,  -1, //brotherhood of the sword
  75.     BLD_ID_MARKET,  -1,
  76.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  77.     BLD_ID_SMITH,   -1,
  78.       //BLD_ID_SPEC17,  BLD_ID_FORT2,   -1,
  79.     BLD_ID_FORT1,   -1,
  80.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  81.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  82.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  83.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_SMITH,   BLD_ID_MAGE1,   BLD_ID_MARKET,  -1,
  84.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  85.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  86.     //BLD_ID_DWELL1U,   BLD_ID_DWELL1,  -1,
  87.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  88.     BLD_ID_DWELL2U, BLD_ID_DWELL2,  BLD_ID_DWELL3, BLD_ID_DWELL4, -1,
  89.     BLD_ID_DWELL3,  BLD_ID_DWELL1,  BLD_ID_TAVERN,  -1,
  90.     BLD_ID_DWELL3U, BLD_ID_DWELL3,  BLD_ID_DWELL5, BLD_ID_SMITH, -1,
  91.     BLD_ID_HORDE1,  BLD_ID_DWELL3,  -1,
  92.     BLD_ID_HORDE1U, BLD_ID_DWELL3U, -1,
  93.     BLD_ID_DWELL4,  BLD_ID_DWELL1,  BLD_ID_DWELL2, BLD_ID_SMITH, -1,
  94.     BLD_ID_DWELL4U, BLD_ID_DWELL2U, -1,
  95.     BLD_ID_DWELL5,  BLD_ID_DWELL1,  BLD_ID_TAVERN,  -1,
  96.     BLD_ID_DWELL5U, BLD_ID_DWELL5,  BLD_ID_DWELL3, BLD_ID_SMITH, -1,
  97.     BLD_ID_DWELL6,  BLD_ID_DWELL5,  BLD_ID_DWELL3,  -1,
  98.     BLD_ID_DWELL6U, BLD_ID_DWELL6,  -1,
  99.     BLD_ID_SPEC21,  BLD_ID_DWELL6,  -1, //конюшня
  100.     BLD_ID_DWELL7,  BLD_ID_DWELL3,  BLD_ID_DWELL5,  -1,
  101.     BLD_ID_DWELL7U, BLD_ID_DWELL7,  -1,
  102.     //BLD_ID_GRAIL, -1,
  103.     -100
  104. };
  105.  
  106.  
  107. int Dependencies1[] = {
  108.     BLD_ID_FORT1,   -1,
  109.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  110.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  111.     BLD_ID_TAVERN,  -1,
  112.     BLD_ID_SMITH,   -1,
  113.     BLD_ID_MARKET,  -1,
  114.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  115.     BLD_ID_MAGE1,   -1,
  116.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  117.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  118.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  119.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  120.     BLD_ID_SPEC17,  -1,
  121.     BLD_ID_SPEC21,  -1,
  122.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  123.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_MAGE1,   BLD_ID_SMITH,   BLD_ID_MARKET,  -1,
  124.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  125.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  126.     BLD_ID_HORDE2,  BLD_ID_DWELL1,  -1,
  127.     BLD_ID_HORDE2U, BLD_ID_DWELL1U, -1,
  128.     //BLD_ID_DWELL1U,   BLD_ID_DWELL1,  -1,
  129.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  BLD_ID_TAVERN,  -1,
  130.     BLD_ID_DWELL2U, BLD_ID_DWELL2,  -1,
  131.     //BLD_ID_HORDE1,    BLD_ID_DWELL2,  -1,
  132.     //BLD_ID_HORDE1U,   BLD_ID_DWELL2U, -1,
  133.     BLD_ID_SPEC22,  BLD_ID_FORT2,   -1,
  134.     BLD_ID_DWELL3,  BLD_ID_DWELL1,  -1,
  135.     BLD_ID_DWELL3U, BLD_ID_DWELL3, BLD_ID_DWELL5,   -1,
  136.     BLD_ID_DWELL4,  BLD_ID_DWELL2,  -1,
  137.     //BLD_ID_DWELL4U,   BLD_ID_DWELL4,  -1,
  138.     BLD_ID_DWELL5,  BLD_ID_DWELL3, BLD_ID_MAGE1,    -1,
  139.     BLD_ID_DWELL5U, BLD_ID_DWELL5,  -1,
  140.     BLD_ID_DWELL6,  BLD_ID_DWELL5, BLD_ID_DWELL4,   -1,
  141.     //BLD_ID_DWELL6U,   BLD_ID_DWELL6,  -1,
  142.     BLD_ID_DWELL7,  BLD_ID_DWELL6,  -1,
  143.     //BLD_ID_DWELL7U,   BLD_ID_DWELL7,  BLD_ID_MAGE3,   -1,
  144.     BLD_ID_WHARF,   -1,
  145.     //BLD_ID_GRAIL, -1,
  146.     -100
  147. };
  148.  
  149.  
  150. int Dependencies2[] = {
  151.     BLD_ID_FORT1,   -1,
  152.     //BLD_ID_SPEC21,    BLD_ID_FORT1,   -1,
  153.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  154.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  155.     BLD_ID_MAGE1,   -1,
  156.     BLD_ID_SPEC22,  BLD_ID_MAGE1,   -1,
  157.     BLD_ID_SPEC23,  BLD_ID_MAGE1,   -1,
  158.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  159.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  160.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  161.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  162.     BLD_ID_TAVERN,  -1,
  163.     BLD_ID_SMITH,   -1,
  164.     BLD_ID_MARKET,  -1,
  165.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  166.     BLD_ID_SPEC17,  BLD_ID_MARKET,  -1,
  167.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  168.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_MARKET,  BLD_ID_SMITH,   BLD_ID_MAGE1,   -1,
  169.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  170.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  171.     //BLD_ID_DWELL1U,   BLD_ID_DWELL1,  -1,
  172.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  173.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
  174.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  175.     //BLD_ID_DWELL2U,   BLD_ID_DWELL2,  -1,
  176.     BLD_ID_DWELL3,  BLD_ID_DWELL1,  -1,
  177.     //BLD_ID_DWELL3U,   BLD_ID_DWELL3,  -1,
  178.     BLD_ID_DWELL4,  BLD_ID_DWELL3,  -1,
  179.     BLD_ID_DWELL4U, BLD_ID_DWELL4,  -1,
  180.     BLD_ID_DWELL5,  BLD_ID_DWELL2,  -1,
  181.     //BLD_ID_DWELL5U,   BLD_ID_DWELL5,  -1,
  182.     BLD_ID_DWELL6,  BLD_ID_DWELL4,  BLD_ID_MAGE1,   -1,
  183.     BLD_ID_DWELL6U, BLD_ID_DWELL6,  -1,
  184.     BLD_ID_DWELL7,  BLD_ID_DWELL5,  BLD_ID_DWELL6,  -1,
  185.     BLD_ID_DWELL7U, BLD_ID_DWELL7,  -1,
  186.     BLD_ID_WHARF,   -1,
  187.     //BLD_ID_GRAIL, -1,
  188.     -100
  189. };
  190.  
  191.  
  192. int Dependencies3[] = {
  193.     /*BLD_ID_FORT1, -1,
  194.     BLD_ID_SPEC21,  BLD_ID_FORT1,   -1,
  195.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  196.     BLD_ID_SPEC22,  BLD_ID_FORT2,   -1,
  197.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  198.     BLD_ID_TAVERN,  -1,
  199.     BLD_ID_SMITH,   -1,
  200.     BLD_ID_MARKET,  -1,
  201.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  202.     BLD_ID_MAGE1,   -1,
  203.     BLD_ID_SPEC23,  BLD_ID_MAGE1,   -1,
  204.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  205.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  206.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  207.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  208.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  209.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_SMITH,   BLD_ID_MARKET,  BLD_ID_MAGE1,   -1,
  210.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  211.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  212.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  213.     BLD_ID_DWELL1U, BLD_ID_DWELL1,  -1,
  214.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
  215.     BLD_ID_DWELL3,  BLD_ID_DWELL1,  -1,
  216.     BLD_ID_HORDE2,  BLD_ID_DWELL3,  -1,
  217.     BLD_ID_DWELL3U, BLD_ID_DWELL3,  -1,
  218.     BLD_ID_HORDE2U, BLD_ID_DWELL3U, -1,
  219.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  220.     BLD_ID_DWELL2U, BLD_ID_DWELL2,  -1,
  221.     BLD_ID_DWELL4,  BLD_ID_DWELL2,  -1,
  222.     BLD_ID_DWELL4U, BLD_ID_DWELL4,  -1,
  223.     BLD_ID_DWELL6,  BLD_ID_DWELL4,  BLD_ID_MAGE1,   -1,
  224.     BLD_ID_DWELL6U, BLD_ID_DWELL6,  -1,
  225.     BLD_ID_DWELL5,  BLD_ID_DWELL4,  -1,
  226.     BLD_ID_DWELL5U, BLD_ID_DWELL5,  BLD_ID_MAGE2,   -1,
  227.     BLD_ID_DWELL7,  BLD_ID_DWELL5,  BLD_ID_DWELL6,  -1,
  228.     BLD_ID_DWELL7U, BLD_ID_DWELL7,  -1,*/
  229.     //BLD_ID_GRAIL, -1,
  230.     BLD_ID_WHARF,   -1,
  231.     -100
  232. };
  233.  
  234.  
  235. int Dependencies4[] = {
  236.     BLD_ID_FORT1,   -1,
  237.     BLD_ID_SPEC17,  BLD_ID_FORT1,   -1,
  238.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  239.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  240.     BLD_ID_TAVERN,  -1,
  241.     BLD_ID_SMITH,   -1,
  242.     BLD_ID_MARKET,  -1,
  243.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  244.     BLD_ID_WHARF,   -1,
  245.     BLD_ID_MAGE1,   -1,
  246.     BLD_ID_SPEC21,  BLD_ID_MAGE1,   -1,
  247.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  248.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  249.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  250.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  251.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  252.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_MARKET,  BLD_ID_SMITH,   BLD_ID_MAGE1,   -1,
  253.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  254.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  255.     BLD_ID_SPEC22,  BLD_ID_DWELL1,  -1,
  256.     BLD_ID_HORDE1,  BLD_ID_SPEC22,  -1,
  257.     //BLD_ID_DWELL1U,   BLD_ID_DWELL1,  -1,
  258.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
  259.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  260.     BLD_ID_DWELL2U, BLD_ID_DWELL2,  BLD_ID_MAGE1,   -1,
  261.     BLD_ID_DWELL3,  BLD_ID_DWELL2,  -1,
  262.     BLD_ID_DWELL3U, BLD_ID_DWELL3,  -1,
  263.     BLD_ID_DWELL4,  BLD_ID_DWELL3,  BLD_ID_TAVERN,  -1,
  264.     BLD_ID_DWELL4U, BLD_ID_DWELL4,  BLD_ID_SPEC17,  -1,
  265.     BLD_ID_DWELL5,  BLD_ID_DWELL4,  BLD_ID_TAVERN,  -1,
  266.     //BLD_ID_DWELL5U,   BLD_ID_DWELL5,  -1,
  267.     BLD_ID_DWELL6,  BLD_ID_DWELL2,  BLD_ID_DWELL3,  BLD_ID_MAGE1,   -1,
  268.     BLD_ID_DWELL6U, BLD_ID_DWELL6,  BLD_ID_MAGE2,   -1,
  269.     BLD_ID_DWELL7,  BLD_ID_DWELL6,  -1,
  270.     //BLD_ID_DWELL7U,   BLD_ID_DWELL7,  -1,
  271.     //BLD_ID_GRAIL, -1,
  272.     -100
  273. };
  274.  
  275.  
  276. int Dependencies5[] = {
  277.     BLD_ID_FORT1,   -1,
  278.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  279.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  280.     BLD_ID_SPEC23,  -1,
  281.     BLD_ID_TAVERN,  -1,
  282.     BLD_ID_SMITH,   -1,
  283.     BLD_ID_MARKET,  -1,
  284.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  285.     BLD_ID_SPEC17,  BLD_ID_MARKET,  -1,
  286.     BLD_ID_MAGE1,   -1,
  287.     BLD_ID_SPEC21,  BLD_ID_MAGE1,   -1,
  288.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  289.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  290.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  291.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  292.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  293.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_SMITH,   BLD_ID_MARKET,  BLD_ID_MAGE1,   -1,
  294.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  295.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  296.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  297.     //BLD_ID_DWELL1U,   BLD_ID_DWELL1,  -1,
  298.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
  299.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  300.     //BLD_ID_DWELL2U,   BLD_ID_DWELL2,  -1,
  301.     BLD_ID_DWELL3,  BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  302.     //BLD_ID_DWELL3U,   BLD_ID_DWELL3,  -1,
  303.     BLD_ID_DWELL4,  BLD_ID_DWELL3,  -1,
  304.     //BLD_ID_DWELL4U,   BLD_ID_DWELL4,  -1,
  305.     BLD_ID_DWELL5,  BLD_ID_DWELL4,  -1,
  306.     BLD_ID_DWELL5U, BLD_ID_DWELL5,  -1,
  307.     BLD_ID_DWELL6,  BLD_ID_DWELL3,  -1,
  308.     //BLD_ID_DWELL6U,   BLD_ID_DWELL6,  -1,
  309.     BLD_ID_DWELL7,  BLD_ID_DWELL5,  BLD_ID_DWELL6,  -1,
  310.     BLD_ID_DWELL7U, BLD_ID_DWELL7,  -1,
  311.     BLD_ID_SPEC22,  BLD_ID_DWELL7U, -1,
  312.     //BLD_ID_GRAIL, -1,
  313.     BLD_ID_WHARF,   -1,
  314.     -100
  315. };
  316.  
  317.  
  318. int Dependencies6[] = {
  319.     BLD_ID_FORT1,   -1,
  320.     BLD_ID_SPEC17,  BLD_ID_FORT1,   -1,
  321.     BLD_ID_SPEC23,  BLD_ID_FORT1,   -1,
  322.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  323.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  324.     BLD_ID_TAVERN,  -1,
  325.     BLD_ID_SMITH,   -1,
  326.     BLD_ID_SPEC22,  BLD_ID_SMITH,   -1,
  327.     BLD_ID_MARKET,  -1,
  328.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  329.     BLD_ID_SPEC21,  BLD_ID_MARKET,  -1,
  330.     BLD_ID_MAGE1,   -1,
  331.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  332.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  333.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  334.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  335.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  336.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_MAGE1,   BLD_ID_MARKET,  BLD_ID_SMITH,   -1,
  337.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  338.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  339.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  340.     //BLD_ID_DWELL1U,   BLD_ID_DWELL1,  -1,
  341.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
  342.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  343.     BLD_ID_DWELL2U, BLD_ID_DWELL2,  BLD_ID_DWELL3,  BLD_ID_DWELL5,  -1,
  344.     BLD_ID_DWELL3,  BLD_ID_DWELL1,  -1,
  345.     //BLD_ID_DWELL3U,   BLD_ID_DWELL3,  BLD_ID_SMITH,   -1,
  346.     BLD_ID_DWELL4,  BLD_ID_DWELL2,  -1,
  347.     //BLD_ID_DWELL4U,   BLD_ID_DWELL4,  BLD_ID_MAGE1,   -1,
  348.     BLD_ID_DWELL5,  BLD_ID_DWELL1,  -1,
  349.     BLD_ID_DWELL5U, BLD_ID_DWELL5,  BLD_ID_DWELL2,  BLD_ID_DWELL3,  -1,
  350.     BLD_ID_DWELL6,  BLD_ID_DWELL5,  BLD_ID_DWELL2,  BLD_ID_DWELL3,  -1,
  351.     BLD_ID_DWELL6U, BLD_ID_DWELL6,  -1,
  352.     BLD_ID_DWELL7,  BLD_ID_DWELL6,  -1,
  353.     //BLD_ID_DWELL7U,   BLD_ID_DWELL7,  -1,
  354.     //BLD_ID_GRAIL, -1,
  355.     BLD_ID_WHARF,   -1,
  356.     -100
  357. };
  358.  
  359.  
  360. int Dependencies7[] = {
  361.     BLD_ID_FORT1,   -1,
  362.     BLD_ID_SPEC21,  BLD_ID_FORT1,   -1,
  363.     BLD_ID_SPEC22,  BLD_ID_SPEC21,  -1,
  364.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  365.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  366.     BLD_ID_TAVERN,  -1,
  367.     BLD_ID_SMITH,   -1,
  368.     BLD_ID_MARKET,  -1,
  369.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  370.     BLD_ID_MAGE1,   -1,
  371.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  372.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  373.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  374.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  375.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  376.     BLD_ID_SPEC17,  BLD_ID_HALL2,   BLD_ID_SPEC21,  -1,
  377.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_MARKET,  BLD_ID_SMITH,   BLD_ID_MAGE1,   -1,
  378.     BLD_ID_WHARF,   -1,
  379.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  380.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  381.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  382.     //BLD_ID_DWELL1U,   BLD_ID_DWELL1,  BLD_ID_TAVERN,  -1,
  383.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
  384.     BLD_ID_DWELL2,  BLD_ID_DWELL1,  -1,
  385.     //BLD_ID_DWELL2U,   BLD_ID_DWELL2,  -1,
  386.     BLD_ID_DWELL6,  BLD_ID_DWELL2,  -1,
  387.     //BLD_ID_DWELL6U,   BLD_ID_DWELL6,  -1,
  388.     BLD_ID_DWELL3,  BLD_ID_DWELL1,  -1,
  389.     BLD_ID_DWELL3U, BLD_ID_DWELL3,  -1,
  390.     BLD_ID_DWELL4,  BLD_ID_DWELL3,  -1,
  391.     //BLD_ID_DWELL4U,   BLD_ID_DWELL4,  -1,
  392.     BLD_ID_DWELL5,  BLD_ID_DWELL3,  BLD_ID_DWELL2,  -1,
  393.     //BLD_ID_DWELL5U,   BLD_ID_DWELL5,  BLD_ID_SILO,    -1,
  394.     BLD_ID_DWELL7,  BLD_ID_DWELL6,  BLD_ID_DWELL4,  -1,
  395.     //BLD_ID_DWELL7U,   BLD_ID_DWELL7,  -1,
  396.     //BLD_ID_GRAIL, -1,
  397.     -100
  398. };
  399.  
  400.  
  401. int Dependencies8[] = {
  402.     BLD_ID_FORT1,   -1,
  403.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  404.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  405.     BLD_ID_WHARF,   -1,
  406.     BLD_ID_TAVERN,  -1,
  407.     BLD_ID_SMITH,   -1,
  408.     BLD_ID_MARKET,  -1,
  409.     BLD_ID_SILO,    BLD_ID_MARKET,  -1,
  410.     BLD_ID_SPEC17,  BLD_ID_MARKET,  -1,
  411.     BLD_ID_MAGE1,   -1,
  412.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  413.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  414.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  415.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  416.     //BLD_ID_SPEC21,    BLD_ID_MAGE1,   -1,
  417.     BLD_ID_HALL2,   BLD_ID_TAVERN,  -1,
  418.     BLD_ID_HALL3,   BLD_ID_HALL2,   BLD_ID_MARKET,  BLD_ID_SMITH,   BLD_ID_MAGE1,   -1,
  419.     BLD_ID_HALL4,   BLD_ID_HALL3,   BLD_ID_FORT3,   -1,
  420.     BLD_ID_DWELL1,  BLD_ID_FORT1,   -1,
  421.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  422.     BLD_ID_DWELL1U, BLD_ID_DWELL1,  BLD_ID_MARKET,  -1,
  423.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, -1,
  424.     BLD_ID_DWELL2,  BLD_ID_FORT1, BLD_ID_MAGE1,     -1,
  425.     //BLD_ID_DWELL2U,   BLD_ID_DWELL2,  -1,
  426.     BLD_ID_DWELL3,  BLD_ID_DWELL1,      -1,
  427.     //BLD_ID_DWELL3U,   BLD_ID_DWELL3,  -1,
  428.     BLD_ID_DWELL4,  BLD_ID_DWELL2,  -1,
  429.     BLD_ID_DWELL4U, BLD_ID_DWELL4,  BLD_ID_HALL3,   -1,
  430.     BLD_ID_DWELL5,  BLD_ID_DWELL2,  -1,
  431.     //BLD_ID_DWELL5U,   BLD_ID_DWELL5,  -1,
  432.     BLD_ID_DWELL6,  BLD_ID_DWELL3,  BLD_ID_SMITH,   -1,
  433.     //BLD_ID_DWELL6U,   BLD_ID_DWELL6,  BLD_ID_MAGE2,   -1,
  434.     BLD_ID_DWELL7,  BLD_ID_DWELL6,  BLD_ID_HALL2, -1,
  435.     //BLD_ID_DWELL7U,   BLD_ID_DWELL7,  -1,
  436.     //BLD_ID_GRAIL, -1,
  437.     -100
  438. };
  439.  
  440.  
  441. int ObsolutionsAll[] = {
  442.     BLD_ID_MAGE2,   BLD_ID_MAGE1,   -1,
  443.     BLD_ID_MAGE3,   BLD_ID_MAGE2,   -1,
  444.     BLD_ID_MAGE4,   BLD_ID_MAGE3,   -1,
  445.     BLD_ID_MAGE5,   BLD_ID_MAGE4,   -1,
  446.     BLD_ID_FORT2,   BLD_ID_FORT1,   -1,
  447.     BLD_ID_FORT3,   BLD_ID_FORT2,   -1,
  448.     BLD_ID_HALL2,   BLD_ID_HALL1,   -1,
  449.     BLD_ID_HALL3,   BLD_ID_HALL2,   -1,
  450.     BLD_ID_HALL4,   BLD_ID_HALL3,   -1,
  451.     BLD_ID_HORDE1U, BLD_ID_HORDE1,  -1,
  452.     BLD_ID_HORDE2U, BLD_ID_HORDE2,  -1,
  453.     BLD_ID_DWELL1U, BLD_ID_DWELL1,  -1,
  454.     BLD_ID_DWELL2U, BLD_ID_DWELL2,  -1,
  455.     BLD_ID_DWELL3U, BLD_ID_DWELL3,  -1,
  456.     BLD_ID_DWELL4U, BLD_ID_DWELL4,  -1,
  457.     BLD_ID_DWELL5U, BLD_ID_DWELL5,  -1,
  458.     BLD_ID_DWELL6U, BLD_ID_DWELL6,  -1,
  459.     BLD_ID_DWELL7U, BLD_ID_DWELL7,  -1,
  460.     -100
  461. };
  462.  
  463.  
  464. int Obsolutions0[] = {
  465.     BLD_ID_SPEC22,  BLD_ID_TAVERN,  -1,
  466.     BLD_ID_HORDE1,  BLD_ID_DWELL3,  -1,
  467.     BLD_ID_HORDE1U, BLD_ID_DWELL3U, BLD_ID_HORDE1,  -1,
  468.     -100
  469. };
  470.  
  471.  
  472. int Obsolutions1[] = {
  473.     //BLD_ID_HORDE1,    BLD_ID_DWELL2,  -1,
  474.     //BLD_ID_HORDE1U,   BLD_ID_DWELL2U, BLD_ID_HORDE1,  -1,
  475.      BLD_ID_HORDE2, BLD_ID_DWELL1,  -1,
  476.      BLD_ID_HORDE2U,    BLD_ID_DWELL1U, BLD_ID_HORDE2,  -1,
  477.     //BLD_ID_SPEC21,    BLD_ID_SPEC17,  -1,
  478.     -100
  479. };
  480.  
  481.  
  482. int Obsolutions2[] = {
  483.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  484.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1,  -1,
  485.     -100
  486. };
  487.  
  488.  
  489. int Obsolutions3[] = {
  490.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  491.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1,  -1,
  492.     BLD_ID_HORDE2,  BLD_ID_DWELL3,  -1,
  493.     BLD_ID_HORDE2U, BLD_ID_DWELL3U, BLD_ID_HORDE2,  -1,
  494.     -100
  495. };
  496.  
  497.  
  498. int Obsolutions4[] = {
  499.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  500.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1,  -1,
  501.     -100
  502. };
  503.  
  504.  
  505. int Obsolutions5[] = {
  506.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  507.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1,  -1,
  508.     -100
  509. };
  510.  
  511.  
  512. int Obsolutions6[] = {
  513.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  514.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1,  -1,
  515.     -100
  516. };
  517.  
  518.  
  519. int Obsolutions7[] = {
  520.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  521.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1,  -1,
  522.     -100
  523. };
  524.  
  525.  
  526. int Obsolutions8[] = {
  527.     BLD_ID_HORDE1,  BLD_ID_DWELL1,  -1,
  528.     BLD_ID_HORDE1U, BLD_ID_DWELL1U, BLD_ID_HORDE1,  -1,
  529.     -100
  530. };
  531.  
  532.  
  533. //int cstl_X_offsets[] = {0,2,4,6,1,3,5, 4,5,1,2,0,6,4, 2,0,0,0};
  534. //int cstl_Y_offsets[] = {3,3,3,3,4,4,4, 1,0,1,1,0,0,0, 2,2,0,0};
  535.  
  536.  
  537. int cstl_X_offsets[] = {0,2,4,6,1,3,5, 3,4,5,1,2,0,6, 5,1, 3,0};
  538. int cstl_Y_offsets[] = {3,3,3,3,4,4,4, 1,0,1,1,0,0,0, 2,2, 2,0};
  539.  
  540. int cstl_buildings[] = {0x1E,0x1F,0x20,0x21,0x22,0x23,0x24, 0x00,0x05,0x06,0x0E,0x07,0x0A,0x10, 0x12,0x15,17,0x00};
  541.  
  542.  
  543. /* H4 Style
  544. int cstl_X_offsets[] = {0,2,4,6,0,2,4,6, 0,2,4,6, 0,6, 0,2, 6, 0};
  545. int cstl_Y_offsets[] = {1,1,1,1,2,2,2,2, 0,0,0,0, 3,3, 4,4, 4, 0};
  546.  
  547. int cstl_buildings[] = {39,37,40,42,38,16,41,43,  10,7,5,14, 0,21, 15,6, 17, 10};*/
  548.  
  549.  
  550. int ramp_X_offsets[] = {0,2,4,6,1,3,5, 2,4,0,2,0,6,3, 5,1,4, 6};
  551. int ramp_Y_offsets[] = {3,3,3,3,4,4,4, 1,0,1,0,0,0,2, 2,2,1, 1};
  552. int ramp_buildings[] = {0x1E,0x1F,0x20,0x21,0x22,0x23,0x24, 0x00,0x05,0x0E,0x07,0x0A,0x10,21, 0x18,0x16,0x11 ,6};
  553.  
  554.  
  555. int tower_X_offsets[] = {0,2,4,6,1,3,5, 2,4,4,0,2,0,6,5, 6,3,1};
  556. int tower_Y_offsets[] = {3,3,3,3,4,4,4, 1,0,1,1,0,0,0,2, 1,2,2};
  557. int tower_buildings[] = {0x1E,0x1F,0x20,0x21,0x22,0x23,0x24, 0x00,0x05,0x16,0x0E,0x07,0x0A,0x10,0x12, 6,0x17,0x11};
  558.  
  559. int inferno_X_offsets[] = {0,2,4,6,1,3,5, 2,4,0,2,0,6,4,0, 2,4,6, 6};
  560. int inferno_Y_offsets[] = {3,3,3,3,4,4,4, 1,0,1,0,0,0,2,2, 2,1,2, 1};
  561. int inferno_buildings[] = {0x1E,0x1F,0x20,0x21,0x22,0x23,0x24, 0x00,0x05,0x0E,0x07,0x0A,0x10,0x12, 0x15,0x16,0x17,0x18, 6};
  562.  
  563. int warlock_buildings[] =  {0x1E,0x1F,0x20,0x21,0x22,0x23,0x24, 0x00,0x05,0x0E,0x07,0x0A,0x10,0x12,0x11,0x15,6, 0x17 /*15,16*/};
  564. //int warlock_buildings_[] = {0x1E,0x1F,0x20,0x21,0x22,0x23,0x16, 0x00,0x05,0x0E,0x07,0x0A,0x10,0x12,0x11,0x15,6, 0x17 /*15,16*/};
  565.  
  566.  
  567.  
  568. int barbarian_X_offsets[] = {0,2,4,6,1,3,5, 2,4,0,2,0,6,5, 3,6,4,1};
  569. int barbarian_Y_offsets[] = {3,3,3,3,4,4,4, 1,0,1,0,0,0,2, 2,1,1,2};
  570. int barbarian_buildings[] = {0x1E,0x1F,0x20,0x21,0x22,0x23,0x24, 0x00,0x05,0x0E,0x07,0x0A,0x10,0x12, 0x15,6,0x17,0x11};
  571.  
  572.  
  573. int __stdcall HallBldFix(LoHook* h, HookContext* c)
  574. {  
  575.     //запрет грейдов в окне холла
  576.     //и да, это write-only code
  577.     //прости, дяденька будущий я, я больше так не буду
  578.     if(c->ecx >= 0 || c->ecx <= 6)
  579.         *(char*)0x460E23 = ((*(int*)(0x836ADC + o_TownMgr->town->type*8) >> (5+c->ecx))&1)?7:0;
  580.     //берем бит из таблицы разрешенности зданий, соответствующий нужному зданию,
  581.     //сравниваем его с единицей, подсовываем расчетчику апгрейда
  582.     //и, кстати, проверка на c->ecx - фуфло
  583.  
  584.     //окно холла в замке : маяк -> укрепления под отдельную клетку
  585.     if( o_TownMgr->town->type == 0)
  586.     {
  587.         c->edx = cstl_buildings[c->ecx];
  588.         //if(c->edx == 7 && o_TownMgr->town->IsBuildingBuilt(9,0)) c->edx = 17;
  589.         return NO_EXEC_DEFAULT;
  590.     }
  591.  
  592.     //оплот: добавляем в окно холла верфь
  593.     if( o_TownMgr->town->type == 1)
  594.     {
  595.         c->edx = ramp_buildings[c->ecx];
  596.         return NO_EXEC_DEFAULT;
  597.     }
  598.  
  599.     //башня: добавляем верфь
  600.     if( o_TownMgr->town->type == 2)
  601.     {
  602.         c->edx = tower_buildings[c->ecx];
  603.         //if(c->edx == 5 && o_TownMgr->town->IsBuildingBuilt(5,0)) c->edx = 21; //гильдия воров как апгрейд таверны
  604.         return NO_EXEC_DEFAULT;
  605.     }
  606.  
  607.     //инферно: добавляем верфь
  608.     if( o_TownMgr->town->type == 3)
  609.     {
  610.         c->edx = inferno_buildings[c->ecx];
  611.         return NO_EXEC_DEFAULT;
  612.     }
  613.  
  614.     //варлок: выебываемся с третьим грейдом, добавляем верфь
  615.     if( o_TownMgr->town->type == 5)
  616.     {
  617.         c->edx = warlock_buildings[c->ecx];
  618.  
  619.         if (o_TownMgr->town->IsBuildingBuilt(BLD_ID_DWELL7U,1) && c->edx == BLD_ID_DWELL7)  c->edx = 0x16;  //апгрейд башни
  620.  
  621.         return NO_EXEC_DEFAULT;
  622.     }
  623.  
  624.     //варвар: добавляем верфь, убираем мастерскую бм в грейды кузни
  625.     if( o_TownMgr->town->type == 6)
  626.     {
  627.         c->edx = barbarian_buildings[c->ecx];
  628.  
  629.         if(c->edx == 16 && o_TownMgr->town->IsBuildingBuilt(BLD_ID_SMITH,0)) c->edx = BLD_ID_SPEC22; //апгрейд кузницы
  630.         return NO_EXEC_DEFAULT;
  631.     }
  632.  
  633.     //лишь один дедушка дервиш хороший был город
  634.     //и тетушка ведьма
  635.  
  636.     return EXEC_DEFAULT;
  637. }
  638.  
  639.  
  640.  
  641. int __stdcall HallLocFix(LoHook* h, HookContext* c)
  642. {
  643.    
  644.     *(int*)0x5CA989 = (int)cstl_Y_offsets - c->ebp;
  645.     *(int*)0x5CA9AA = (int)cstl_X_offsets - c->ebp;
  646.  
  647.     *(int*)0x5CAA00 = (int)cstl_Y_offsets - c->ebp;
  648.     *(int*)0x5CAA11 = (int)cstl_X_offsets - c->ebp;
  649.  
  650.     *(int*)0x5CAA70 = (int)cstl_Y_offsets - c->ebp;
  651.     *(int*)0x5CAA8E = (int)cstl_X_offsets - c->ebp;
  652.  
  653.     *(int*)0x5CAAE0 = (int)cstl_Y_offsets - c->ebp;
  654.     *(int*)0x5CAB01 = (int)cstl_X_offsets - c->ebp;
  655.  
  656.  
  657.     *(int*)0x5CABCF = (int)ramp_Y_offsets - c->ebp;
  658.     *(int*)0x5CABF0 = (int)ramp_X_offsets - c->ebp;
  659.  
  660.     *(int*)0x5CAC46 = (int)ramp_Y_offsets - c->ebp;
  661.     *(int*)0x5CAC57 = (int)ramp_X_offsets - c->ebp;
  662.  
  663.     *(int*)0x5CACB7 = (int)ramp_Y_offsets - c->ebp;
  664.     *(int*)0x5CACD5 = (int)ramp_X_offsets - c->ebp;
  665.  
  666.     *(int*)0x5CAD27 = (int)ramp_Y_offsets - c->ebp;
  667.     *(int*)0x5CAD48 = (int)ramp_X_offsets - c->ebp;
  668.  
  669.  
  670.     *(int*)0x5CAE17 = (int)tower_Y_offsets - c->ebp;
  671.     *(int*)0x5CAE38 = (int)tower_X_offsets - c->ebp;
  672.  
  673.     *(int*)0x5CAE8E = (int)tower_Y_offsets - c->ebp;
  674.     *(int*)0x5CAE9F = (int)tower_X_offsets - c->ebp;
  675.  
  676.     *(int*)0x5CAEFF = (int)tower_Y_offsets - c->ebp;
  677.     *(int*)0x5CAF1D = (int)tower_X_offsets - c->ebp;
  678.  
  679.     *(int*)0x5CAF69 = (int)tower_Y_offsets - c->ebp;
  680.     *(int*)0x5CAF8A = (int)tower_X_offsets - c->ebp;
  681.  
  682.  
  683.     *(int*)0x5CB059 = (int)inferno_Y_offsets - c->ebp;
  684.     *(int*)0x5CB07A = (int)inferno_X_offsets - c->ebp;
  685.  
  686.     *(int*)0x5CB0D0 = (int)inferno_Y_offsets - c->ebp;
  687.     *(int*)0x5CB0E1 = (int)inferno_X_offsets - c->ebp;
  688.  
  689.     *(int*)0x5CB141 = (int)inferno_Y_offsets - c->ebp;
  690.     *(int*)0x5CB15F = (int)inferno_X_offsets - c->ebp;
  691.  
  692.     *(int*)0x5CB1B1 = (int)inferno_Y_offsets - c->ebp;
  693.     *(int*)0x5CB1D2 = (int)inferno_X_offsets - c->ebp;
  694.  
  695.  
  696.     *(int*)0x5CB9AC = (int)barbarian_Y_offsets - c->ebp;
  697.     *(int*)0x5CB9CD = (int)barbarian_X_offsets - c->ebp;
  698.  
  699.     *(int*)0x5CBB5B = (int)barbarian_Y_offsets - c->ebp;
  700.     *(int*)0x5CBB6D = (int)barbarian_X_offsets - c->ebp;
  701.  
  702.     *(int*)0x5CBD04 = (int)barbarian_Y_offsets - c->ebp;
  703.     *(int*)0x5CBD22 = (int)barbarian_X_offsets - c->ebp;
  704.  
  705.     *(int*)0x5CBEAC = (int)barbarian_Y_offsets - c->ebp;
  706.     *(int*)0x5CBECD = (int)barbarian_X_offsets - c->ebp;
  707.  
  708.     return EXEC_DEFAULT;   
  709. }
  710.  
  711.  
  712. int __stdcall OnUnitBuildWindow(HiHook* h, int* building_struct, _Town_* town, signed int a3, int a4)
  713. {
  714.     int ret = CALL_4(int, __thiscall, h->GetOriginalFunc(), building_struct, town, a3, a4);
  715.  
  716.     if(a3 == 0x0D && town->type == 5 && town->IsBuildingBuilt(22,1))
  717.     {
  718.         building_struct[25] = 81;
  719.         building_struct[29] = building_struct[27];
  720.     }
  721.  
  722.     return ret;
  723. }
  724.  
  725. void __stdcall PatchIt (PEvent e)
  726. {
  727.     //0066D03C - таблица количества окошек 0x13 - гнусный хак, и так мы делать не будем
  728.     *(char*)0x66D03C = 0x11; //rampart +shipyard
  729.     *(char*)0x66D03D = 0x12; //rampart +shipyard
  730.     //*(char*)0x66D03E = 0x13; //tower   +shipyard
  731.     *(char*)0x66D03F = 0x13; //inferno +shipyard //не будем, но еретика нет 
  732.     //*(char*)0x66D042 = 0x13; //strong  +shipyard
  733.  
  734.    
  735.     *(char*)0x5CAB4D = 0x11;
  736.     *(char*)0x5CAD94 = 0x12; //rampart +shipyard
  737.     //*(char*)0x5CAFD6 = 0x13; //tower   +shipyard
  738.     *(char*)0x5CB21E = 0x13; //inferno +shipyard
  739.     //*(char*)0x5CC056 = 0x13; //strong  +shipyard
  740.  
  741.  
  742.     //ГМ4-5
  743.  
  744.     *(unsigned short*)4591590 = 37008; //cstl skip
  745.  
  746.     *(char*)0x460FAA = 0x40; //barb id
  747.     *(char*)0x460FAE = 0x40; //wtch id
  748.  
  749.     //спрайты кораблей в окнах верфей
  750.     *(int*)0x68A394 = 0x68C068; //ramp
  751.     *(int*)0x68A398 = 0x68C068; //twr
  752.     *(int*)0x68A39C = 0x68C068; //inf
  753.     *(int*)0x68A3A4 = 0x68C068; //dung
  754.     *(int*)0x68A3A8 = 0x68C068; //str
  755.  
  756.     *(char*)0x5C355E = 0xEB; //исправляем вылет при постройке цитадели в городе с верфью. Не понимаю^WW понимаю, это костыль для разных спрайтов
  757.      
  758.     //*(char*)0x5C3471 = 0xEB; //исправляем вылет при постройке манавортекса у Варлока  
  759.     //*(unsigned short*)0x5C3471 = 0x9090; //исправляем вылет при постройке манавортекса у Варлока
  760.     //*(char*)0x5C3427 = 0xBC; //еще раз
  761.     //говноговноговно, заткнуто графикой
  762.    
  763.     *(char*)0x4610DB = 0x6; //нет грейда верфи в замке
  764.     *(char*)0x4E4D5C = 0xEB; //нет бонуса от маяка, готовим его к судьбе Укреплений
  765.  
  766.     *(int*)0x46166C = 0x4612DF; //нету изменений в холле у Сорки
  767.     *(char*)0x461171 = 0x11; //фонтан удачи - не грейд пруда в экране холла ????
  768.     *(char*)0x5D2F5E = 0x55; //фонтан удачи - не грейд холла в хинтах
  769.  
  770.     *(char*)0x4C617C = 5; //радиус обзора от башни
  771.     *(char*)0x4C79CF = 5;
  772.     *(char*)0x5BF4F2 = 5;
  773.  
  774.     //сило
  775.     _Resources_* siloes =  ((_Resources_*)0x688F04);
  776.  
  777.     //сорка: ртуть
  778.     siloes[1].crystal   = 0;
  779.     siloes[1].mercury   = 1;
  780.  
  781.     //визард: джем
  782.     siloes[2].jems      = 1;
  783.  
  784.     //еретик: сера
  785.     siloes[3].mercury   = 0;
  786.     siloes[3].sulfur    = 1;
  787.  
  788.     //ведьма: кристаллы
  789.     siloes[7].wood      = 0;
  790.     siloes[7].ore       = 0;
  791.     siloes[7].crystal   = 1;
  792.  
  793.     //дервиш: джем
  794.     siloes[8].mercury   = 0;
  795.     siloes[8].jems      = 1;
  796.  
  797.     emerald->WriteLoHook(0x5CA8FC,(void*)HallLocFix);
  798.  
  799.     //выпил портала вызова
  800.     emerald->WriteByte(0x5D8BDB, 50);
  801.     emerald->WriteByte(0x5D8C14, 50);
  802.     emerald->WriteByte(0x5C6522, 50);
  803.     emerald->WriteByte(0x51D2B1, 50);
  804.     emerald->WriteByte(0x4C8B3C, 50);
  805.    
  806.     emerald->WriteHiHook(0x551960, SPLICE_, EXTENDED_, THISCALL_, (void*)OnUnitBuildWindow);
  807. }
  808.  
  809.  
  810. //после создания окна вога
  811. void __stdcall PatchIt2 (PEvent e)
  812. {  
  813.     emerald->WriteLoHook(0x460DE2,(void*)HallBldFix);
  814.     //сетки
  815.     //здесь, потому что перекрываем правки HD
  816.     *(int*)0x5CA92D = (int)"zpthbkfr.pcx";
  817.     *(int*)0x5CAB73 = (int)"ZPTHBKDG.pcx";
  818.  
  819.     //зеленые драконы
  820.     *(int*)0x80312C = 0x51;
  821. }
  822.  
  823.  
  824. int GetCreatureFromCastlf(int line, int offset, _Town_* cstl)
  825. {  
  826.  
  827.  /*if(cstl->type < 0 ||
  828.         cstl->type > 8 ||
  829.         cstl->mag_level > 5 ||
  830.         cstl->owner_id < -1 ||
  831.         cstl->owner_id > 8 ||
  832.         cstl->built_this_turn > 2 ||
  833.         offset < 0 ||
  834.         offset > 9*7*2
  835.         )
  836.     {
  837.         char mess[255];
  838.         sprintf(mess,"%i",line);
  839.         MessageBoxA(0,mess,mess,0);
  840.     }*/
  841.  
  842.     /*char mess[255];
  843.     sprintf(mess,"%i",line);
  844.     MessageBoxA(0,mess,mess,0);*/
  845.    
  846.     int type = offset/14;
  847.     int level = (offset%14)%7;
  848.     int upgrade = (offset%14)/7;
  849.  
  850.    
  851.     //return ((int*)0x836CC8)[(type*2+upgrade)*7+level];
  852.  
  853.     if(upgrade)
  854.     {
  855.         upgrade = (*(int*)(0x836ADC + cstl->type*8) >> (5+level))&1;
  856.     }
  857.  
  858.     int default_ret = ((int*)0x6747B4)[(cstl->type*2+upgrade)*7+level];
  859.  
  860.     if (type == 5 && level == 6 && !cstl->IsBuildingBuilt(0x16,1))
  861.     {
  862.         default_ret-=1;
  863.     }
  864.  
  865.  
  866.     return default_ret;
  867.  
  868.     /*if (type == 2 && level == 2 && upgrade ==0 && cstl->Number&1) return 32;
  869.     if (type == 2 && level == 2 && upgrade ==1 && cstl->Number&1) return 117;
  870.  
  871.     if (type == 2 && level == 2 && upgrade ==0 && !(cstl->Number&1)) return 33;
  872.     if (type == 2 && level == 2 && upgrade ==1 && !(cstl->Number&1)) return 116;*/
  873.  
  874.     //return ((int*)0x836CC8)[(type*2+upgrade)*7+level];
  875. }
  876.  
  877. #define GetCreatureFromCastle(a,b) GetCreatureFromCastlf(__LINE__,(a),(b))
  878.  
  879. signed int __stdcall CorrectTownCreatureGrowth(HiHook *h, _Town_* _cstl, int a2, int a3)
  880. {
  881.   signed int result; // eax@1
  882.   int i = 0;
  883.  
  884.  
  885.   result = 0;
  886.   do
  887.   {
  888.     if ( GetCreatureFromCastle(14*(_cstl->type)+i, _cstl) == a2 )
  889.       break;
  890.  
  891.     ++result;
  892.     ++i;
  893.   }
  894.   while ( result < 14 );
  895.   if ( result != 14 )
  896.   {
  897.    *(int *)((int)_cstl + 4 * result + 0x118) += a3;
  898.      //_cstl->guards.count[result]+=a3;
  899.     if ( result < 7 )
  900.          //_cstl->guards0.count[result]+=a3;
  901.      *(int *)((int)_cstl + 4 * result + 0x134) += a3;
  902.   }
  903.   return result;
  904. }
  905.  
  906. void __stdcall splice_00551B50(HiHook *h, _Town_* cstl, int edx)
  907. {
  908.     int a1 = (int)cstl;
  909.     //sub_00551B80(MonstersInTowns_9x2x7[edx0 + 14 * *(_BYTE *)(a1 + 4)], a1 + 2 * edx0 + 22);
  910.  
  911.     CALL_2(void,__fastcall,0x551B80,GetCreatureFromCastle(edx + 14 * cstl->type, cstl), a1 + 2 * edx + 22);
  912.     return;
  913. }
  914.  
  915.  
  916. // Город при вычислении локальной ценности части легиона.
  917. _Town_* LegioTown = NULL;
  918.  
  919. int __stdcall StoreLegion(LoHook* h, HookContext* c)
  920. {
  921.   LegioTown = (_Town_*)c->esi;
  922.   return EXEC_DEFAULT;
  923. }
  924.  
  925. int __stdcall hook_428602(LoHook* h, HookContext* c)
  926.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)(*(int*)(c->ebp + 0x8))); return NO_EXEC_DEFAULT;}
  927.  
  928. int __stdcall hook_428964(LoHook* h, HookContext* c)
  929.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)c->ebx); return NO_EXEC_DEFAULT;}
  930.  
  931. int __stdcall hook_429BB1(LoHook* h, HookContext* c)
  932.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)(*(int*)(c->ebp - 0x14))); return NO_EXEC_DEFAULT;}
  933.  
  934. int __stdcall hook_429DEC(LoHook* h, HookContext* c)
  935.     {c->ecx = GetCreatureFromCastle(c->eax,(_Town_*)c->edi); return NO_EXEC_DEFAULT;}
  936.  
  937. int __stdcall hook_429F32(LoHook* h, HookContext* c)
  938.     {c->eax = GetCreatureFromCastle(c->eax,(_Town_*)c->edi); return NO_EXEC_DEFAULT;}
  939.  
  940. int __stdcall hook_42A026(LoHook* h, HookContext* c)
  941.     {c->eax = GetCreatureFromCastle(c->edi,(_Town_*)c->eax); return NO_EXEC_DEFAULT;}
  942.  
  943. int __stdcall hook_42B538(LoHook* h, HookContext* c)
  944.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)c->ecx); return NO_EXEC_DEFAULT;}
  945.  
  946. int __stdcall hook_42B5D9(LoHook* h, HookContext* c)
  947.     {c->edi = GetCreatureFromCastle(c->edx,(_Town_*)c->ecx); return NO_EXEC_DEFAULT;}
  948.  
  949. int __stdcall hook_42B5F3(LoHook* h, HookContext* c)
  950.     {c->esi = GetCreatureFromCastle(c->esi,(_Town_*)c->ecx); return NO_EXEC_DEFAULT;}
  951.  
  952. int __stdcall hook_42B724(LoHook* h, HookContext* c)
  953.     {c->eax = GetCreatureFromCastle(c->ecx,(_Town_*)c->edi); return NO_EXEC_DEFAULT;}
  954.  
  955. int __stdcall hook_42BE42(LoHook* h, HookContext* c)
  956.     {c->edx = GetCreatureFromCastle(c->eax,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  957.  
  958. int __stdcall hook_42CF07(LoHook* h, HookContext* c)
  959.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)(*(int*)(c->ebp + 0xC))); return NO_EXEC_DEFAULT;}
  960.  
  961. int __stdcall hook_42D241(LoHook* h, HookContext* c)
  962.     {c->eax = GetCreatureFromCastle(c->eax,(_Town_*)(*(int*)(c->ebp + 0x8))); return NO_EXEC_DEFAULT;}
  963.  
  964. int __stdcall hook_432E94(LoHook* h, HookContext* c)
  965.     {c->eax = GetCreatureFromCastle(c->edx, LegioTown); return NO_EXEC_DEFAULT;}
  966.  
  967. int __stdcall hook_432F5F(LoHook* h, HookContext* c)
  968.     {c->edx = GetCreatureFromCastle(c->ecx,(_Town_*)c->edi); return NO_EXEC_DEFAULT;}
  969.  
  970. int __stdcall hook_43363B(LoHook* h, HookContext* c)
  971.     {c->eax = GetCreatureFromCastle(c->eax,(_Town_*)c->edx); return NO_EXEC_DEFAULT;}
  972.  
  973. int __stdcall hook_4BF302(LoHook* h, HookContext* c)
  974.     {c->edi = GetCreatureFromCastle(7+c->eax/4,(_Town_*)(*(int*)(c->ebp - 0x10))); return NO_EXEC_DEFAULT;}
  975.  
  976. int __stdcall hook_4BF307(LoHook* h, HookContext* c)
  977.     {c->esi = GetCreatureFromCastle(c->eax/4,(_Town_*)(*(int*)(c->ebp - 0x10))); return NO_EXEC_DEFAULT;}
  978.  
  979. int __stdcall hook_4C8D2D(LoHook* h, HookContext* c)
  980.     {c->edx = GetCreatureFromCastle(c->ecx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  981.  
  982. int __stdcall hook_51CFD8(LoHook* h, HookContext* c)
  983.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)(*(int*)(c->ebp - 0x14))); return NO_EXEC_DEFAULT;}
  984.  
  985. int __stdcall hook_525A8B(LoHook* h, HookContext* c)
  986.     {c->edx = GetCreatureFromCastle(7+c->eax,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  987.  
  988. int __stdcall hook_525AAD(LoHook* h, HookContext* c)
  989. {c->return_address =  (c->eax == GetCreatureFromCastle(c->ecx,(_Town_*)c->esi))?0x525ABA:0x525B56; return NO_EXEC_DEFAULT;}
  990.  
  991. int __stdcall hook_52A31B(LoHook* h, HookContext* c)
  992.     {c->ebx = GetCreatureFromCastle(c->edx,(_Town_*)c->edi); return NO_EXEC_DEFAULT;}
  993.  
  994. int __stdcall hook_5519A7(LoHook* h, HookContext* c)
  995.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  996.  
  997. int __stdcall hook_5BEF9E(LoHook* h, HookContext* c)
  998.     {c->eax = GetCreatureFromCastle(c->eax,(_Town_*)c->ecx); return NO_EXEC_DEFAULT;}
  999.  
  1000. //int __stdcall hook_551B68(LoHook* h, HookContext* c)
  1001. //  {c->ecx = GetCreatureFromCastle(c->eax,(CASTLE*)c->ecx); return NO_EXEC_DEFAULT;}
  1002.  
  1003. int __stdcall hook_5BFC66(LoHook* h, HookContext* c)
  1004.     {c->eax = GetCreatureFromCastle(c->ecx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1005.  
  1006. int __stdcall hook_5BFFDF(LoHook* h, HookContext* c)
  1007.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1008.  
  1009. int __stdcall hook_5C0098(LoHook* h, HookContext* c)
  1010.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1011.  
  1012. int __stdcall hook_5C0264(LoHook* h, HookContext* c)
  1013.     {c->edx = GetCreatureFromCastle(c->esi/2,(_Town_*)c->ecx); return NO_EXEC_DEFAULT;}
  1014.  
  1015. int __stdcall hook_5C6023(LoHook* h, HookContext* c)
  1016.     {c->eax = GetCreatureFromCastle(c->eax,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1017.  
  1018. int __stdcall hook_5C7196(LoHook* h, HookContext* c)
  1019.     {c->eax = GetCreatureFromCastle(c->ecx,(_Town_*)(*(int*)(c->ebx + 0x38))); return NO_EXEC_DEFAULT;}
  1020.  
  1021. int __stdcall hook_5C7CE5(LoHook* h, HookContext* c)
  1022.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)(*(int*)(c->ebx + 0x38))); return NO_EXEC_DEFAULT;}
  1023.  
  1024. int __stdcall hook_5C7D1E(LoHook* h, HookContext* c)
  1025.     {c->eax = GetCreatureFromCastle(c->eax,(_Town_*)(*(int*)(c->ebx + 0x38))); return NO_EXEC_DEFAULT;}
  1026.  
  1027.  
  1028. int __stdcall hook_5D9DE4(LoHook* h, HookContext* c)
  1029.     {   int tmgr = *(int*)0x69954C;
  1030.         c->edx = GetCreatureFromCastle(c->edx,(_Town_*)(*(int*)(0x38 + tmgr))); return NO_EXEC_DEFAULT;}
  1031.  
  1032. int __stdcall hook_5D9E5D(LoHook* h, HookContext* c)
  1033.     {   int tmgr = *(int*)0x69954C;
  1034.         c->edx = GetCreatureFromCastle(c->ecx,(_Town_*)(*(int*)(0x38 + tmgr))); return NO_EXEC_DEFAULT;}
  1035.  
  1036. int __stdcall hook_5DD099(LoHook* h, HookContext* c)
  1037.     {   int tmgr = *(int*)0x69954C;
  1038.         c->eax = GetCreatureFromCastle(c->edx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1039.  
  1040. int __stdcall hook_5DDAD6(LoHook* h, HookContext* c)
  1041.     {   int tmgr = *(int*)0x69954C;
  1042.         c->eax = GetCreatureFromCastle(c->ecx,(_Town_*)(*(int*)(0x38 + tmgr))); return NO_EXEC_DEFAULT;}
  1043.  
  1044. int __stdcall hook_5C8037(LoHook* h, HookContext* c)
  1045.     {c->eax = GetCreatureFromCastle(c->eax-30,(_Town_*)(*(int*)(c->ebx + 0x38))); return NO_EXEC_DEFAULT;}
  1046.  
  1047. int __stdcall hook_5C0BEC(LoHook* h, HookContext* c)
  1048.     {c->ebx = GetCreatureFromCastle(c->edx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1049.  
  1050. int __stdcall hook_551A14(LoHook* h, HookContext* c)
  1051.     {c->edx = GetCreatureFromCastle(c->ecx-7,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1052.  
  1053. int __stdcall hook_5DD96B(LoHook* h, HookContext* c)
  1054.     {c->eax = GetCreatureFromCastle(c->edx,(_Town_*)(*(int*)((*(int*)0x69954C) + 0x38))); return NO_EXEC_DEFAULT;}
  1055.  
  1056.  
  1057. int __stdcall hook_42BCC9(LoHook* h, HookContext* c)
  1058.     {c->edi = GetCreatureFromCastle(c->eax-30,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1059.  
  1060. int __stdcall hook_4C69AF(LoHook* h, HookContext* c)
  1061. {
  1062.     _Town_* t = (_Town_*)c->ebx;
  1063.     int creature = c->edi;
  1064.  
  1065.     if(t->type == 5 && t->IsBuildingBuilt(0x16,1) && c->edi == 81)
  1066.     {
  1067.         c->eax = 82;
  1068.         c->return_address = 0x4C6A18;
  1069.         return NO_EXEC_DEFAULT;
  1070.     }
  1071.  
  1072.     if(c->edi != GetCreatureFromCastle(c->eax-30,t) )
  1073.     {  
  1074.         c->return_address = 0x4C69df;
  1075.     }
  1076.     else
  1077.     {
  1078.         c->return_address = 0x4C69b8;
  1079.     }
  1080.     return NO_EXEC_DEFAULT;
  1081. }
  1082.  
  1083.  
  1084. int __stdcall hook_5C0203(LoHook* h, HookContext* c)
  1085.     {c->ecx = GetCreatureFromCastle(c->ecx,(_Town_*)c->esi); return NO_EXEC_DEFAULT;}
  1086.  
  1087.  
  1088. int saved_town_struct;
  1089.  
  1090. int __stdcall hook_521711(LoHook* h, HookContext* c)
  1091.     {saved_town_struct = c->edx; return EXEC_DEFAULT;}
  1092.  
  1093. int __stdcall hook_52190D(LoHook* h, HookContext* c)
  1094.     {c->eax = GetCreatureFromCastle(c->eax-19,(_Town_*)saved_town_struct); return NO_EXEC_DEFAULT;}
  1095.  
  1096. int __stdcall hook_5218F7(LoHook* h, HookContext* c)
  1097.     {c->edi = GetCreatureFromCastle(c->eax-33,(_Town_*)saved_town_struct); return NO_EXEC_DEFAULT;}
  1098.  
  1099. int __stdcall hook_5219B2(LoHook* h, HookContext* c)
  1100.     {c->edi = GetCreatureFromCastle(c->eax-69,(_Town_*)saved_town_struct); return NO_EXEC_DEFAULT;}
  1101.  
  1102. int __stdcall hook_521951(LoHook* h, HookContext* c)
  1103.     {c->edi = GetCreatureFromCastle(c->eax-332,(_Town_*)saved_town_struct); return NO_EXEC_DEFAULT;}
  1104.  
  1105.  
  1106. int __stdcall OnSpecBuildAIValueCalc(LoHook* h, HookContext* c)
  1107. {
  1108.     _Town_* town = (_Town_*)c->ebx;
  1109.     int building = c->edi;
  1110.  
  1111.     if (town->type == 5 && building == 22)
  1112.     {
  1113.         int value = 1;
  1114.         if(town->field_03)
  1115.         {
  1116.             value = -1;
  1117.         }
  1118.         else
  1119.         {
  1120.             //should be dynamic
  1121.             value = 9999;
  1122.         }
  1123.         c->return_address =  0x42B1CB;
  1124.         *(int*)(c->ebp + c->edi * 4 - 0x114) = value;
  1125.         return NO_EXEC_DEFAULT;
  1126.     }
  1127.     return EXEC_DEFAULT;
  1128. }
  1129.  
  1130.  
  1131. int __stdcall GetMonsterUpgrade(HiHook *h, int a)
  1132. {
  1133.     if(a == 81 || a == 82)
  1134.         return a+1;
  1135.     else
  1136.         return CALL_1(int, __thiscall, h->GetOriginalFunc(), a);
  1137. }
  1138.  
  1139. int __stdcall HasMonsterUpgrade(HiHook *h, int a)
  1140. {
  1141.     if(a == 81 || a == 82)
  1142.         return true;
  1143.     else
  1144.         return CALL_1(int, __thiscall, h->GetOriginalFunc(), a);
  1145. }
  1146.  
  1147.  
  1148. inline void Citrine(PatcherInstance * citrine)
  1149. {
  1150.  
  1151.     //!!!в моп забанено
  1152.     //"При проверке недели монстра учитываем пороховой склад"
  1153.     //citrine->WriteLoHook(0x5C0203,(void*)hook_5C0203);
  1154.  
  1155.     //43. Неизвестно (АИ-визит в город? sub_0042BA60) вычисление ИИ ценности армии от постройки жилища - используется только с неулучшенными существами
  1156.     citrine->WriteLoHook(0x42BCC9,(void*)hook_42BCC9);
  1157.     //44. Неизвестно (расчет морали в диалогах?)
  1158.     citrine->WriteLoHook(0x4C69AF,(void*)hook_4C69AF);
  1159.  
  1160.     //10. Для ИИ: покупка в городе
  1161.     //ЗДЕСЬ ЕБУЧИЙ БАГ - исправлено
  1162.     citrine->WriteLoHook(0x428602,(void*)hook_428602); //edx, [ebp+8] -> eax
  1163.     //11. Для ИИ: оценка ИИ ценности ресурсов
  1164.     citrine->WriteLoHook(0x428964,(void*)hook_428964); //edx, ebx -> eax
  1165.     //12. Для ИИ: оценка ИИ максимальной стоимости существ в городах
  1166.     citrine->WriteLoHook(0x429BB1,(void*)hook_429BB1); //edx, [ebp-0x14] -> eax
  1167.     //13. Для ИИ: оценка ИИ максимальной дороговизны приростов сушеств
  1168.     citrine->WriteLoHook(0x429DEC,(void*)hook_429DEC); //eax, edi -> ecx
  1169.     //14. Неизвестно: оценка ИИ максимальной дороговизны приростов сушеств(?)
  1170.     citrine->WriteLoHook(0x429F32,(void*)hook_429F32); //eax, edi -> eax
  1171.     //15. Неизвестно (пока вылет, потом посмотрим): оценка ИИ максимальной дороговизны приростов сушеств
  1172.     //citrine->WriteLoHook(0x42A026,(void*)hook_42A026); //eax, edi -> eax
  1173.     //16. Для ИИ:  вычисление ценности строительства неулучшенного жилища - используется только с неулучшенными существами
  1174.     citrine->WriteLoHook(0x42B538,(void*)hook_42B538); //edx, ecx -> eax
  1175.     //17-18. Для ИИ: вычисление ценности строительства улучшенного жилища - обрабатывается отдельно
  1176.     citrine->WriteLoHook(0x42B5D9,(void*)hook_42B5D9); //edx, ecx -> edi
  1177.     citrine->WriteLoHook(0x42B5F3,(void*)hook_42B5F3); //esi, ecx -> esi
  1178.  
  1179.     citrine->WriteLoHook(0x42B04D, (void*)OnSpecBuildAIValueCalc);
  1180.  
  1181.     //19. Неизвестно: При оценке ИИ ценности постройки цитадели или замка учитываем
  1182.     citrine->WriteLoHook(0x42B724,(void*)hook_42B724); //eax, edi -> eax
  1183.  
  1184.     //20. ИИ: При покупке ИИ армии в городе учитываем морских волков.
  1185.     citrine->WriteLoHook(0x42BE42,(void*)hook_42BE42); //eax, esi -> edx
  1186.     //21. Неизвестно: При создании структуры пополнения армии ИИ от города учитываем морских волков
  1187.     citrine->WriteLoHook(0x42CF07,(void*)hook_42CF07); //edx, [ebp+c] -> eax
  1188.     //22. ИИ: При заполнении ИИ списка доступных для покупки существ города учитываем морских волков
  1189.     citrine->WriteLoHook(0x42D241,(void*)hook_42D241); //eax, [ebp+8] -> eax
  1190.  
  1191.    
  1192.  
  1193.     //23. ИИ: При вычислении ИИ локальной ценности части легиона учитываем морских волков
  1194.     //Очередной вылет, faraon3.gm1, witch2.gm1, поправлен
  1195.     citrine->WriteLoHook(0x432E81, (void*)StoreLegion);
  1196.     citrine->WriteLoHook(0x432E94,(void*)hook_432E94); //edx, esi -> eax
  1197.     //24. ИИ: При вычислении ИИ глобальной ценности части легиона учитываем морских волков
  1198.     citrine->WriteLoHook(0x432F5F,(void*)hook_432F5F); //ecx, edi -> edx
  1199.     //25. Неизвестно:  При вычислении ИИ ценности легиона учитываем морских волков
  1200.     citrine->WriteLoHook(0x43363B,(void*)hook_43363B); //eax, edx -> eax
  1201.  
  1202.     //три обращения из 47AB00,11,33 - получение апгрейда
  1203.     citrine->WriteHiHook(0x47AAD0,SPLICE_,EXTENDED_,THISCALL_,(void*)GetMonsterUpgrade);
  1204.     /*citrine->WriteHiHook(0x47AB50,SPLICE_,EXTENDED_,THISCALL_,(void*)GetMonsterDegrade);*/
  1205.     citrine->WriteHiHook(0x47AA50,SPLICE_,EXTENDED_,THISCALL_,(void*)HasMonsterUpgrade);
  1206.    
  1207.     //новый месяц
  1208.     //26. Неизвестно: При проверке месяца монстра учитываем пороховой склад.
  1209.     citrine->WriteLoHook(0x4C8D2D,(void*)hook_4C8D2D); //ecx, esi -> edx
  1210.    
  1211.     //; 27-28. Неизвестно
  1212.     //Еженедельный апгрейд юнитов в нейтральных замках на карте.
  1213.     citrine->WriteLoHook(0x4BF302,(void*)hook_4BF302); //(eax/4)+7 [ebp-0x10] -> edi
  1214.     citrine->WriteLoHook(0x4BF308,(void*)hook_4BF307); //eax/4 [ebp-0x10] -> esi
  1215.  
  1216.  
  1217.  
  1218.  
  1219.     //citrine->WriteLoHook(0x503290,(void*)hook_); //,  ->
  1220.     //окно города
  1221.     //29. кадры существ для найма в обзоре королевства:
  1222.     citrine->WriteLoHook(0x51CFD8,(void*)hook_51CFD8); //edx,[EBP-14]  -> eax
  1223.  
  1224.     //30-31. Неизвестно: улучшение ИИ существ в городе, обрабатывается отдельно (!!!)
  1225.     citrine->WriteLoHook(0x525A8B,(void*)hook_525A8B); //edx,[EBP-14]  -> eax
  1226.     citrine->WriteLoHook(0x525AAD,(void*)hook_525AAD); //cmp ..
  1227.     //32. Неизвестно: при вычислении ИИ ценности атаки города учитываем морских волков.
  1228.     citrine->WriteLoHook(0x52A31B,(void*)hook_52A31B); //edx, edi  -> ebx
  1229.  
  1230.     //окно покупки юнита
  1231.     //9. Отображение неулучшенного существа в диалоге найма при клике в Форте
  1232.     citrine->WriteLoHook(0x5519A7,(void*)hook_5519A7); //edx, edi  -> ebx
  1233.     //; 1. Отображение улучшенного существа в диалоге найма при клике в Форте:
  1234.     citrine->WriteLoHook(0x551A14,(void*)hook_551A14); //апгрейды
  1235.  
  1236.     //обзор королевства
  1237.     //citrine->WriteLoHook(0x551B68,(void*)hook_551B68); //eax, eci  -> ecx //сплайс ниже
  1238.    
  1239.     // инициализация орд
  1240.     //citrine->WriteLoHook(0x5BE383,(void*)hook_52A31B); //старт игры
  1241.     //citrine->WriteLoHook(0x5BE3AB,(void*)hook_52A31B); //старт игры
  1242.  
  1243.     //; 34. Установка прироста монстров в города в первый день игры:
  1244.     citrine->WriteLoHook(0x5BEF9E,(void*)hook_5BEF9E); //
  1245.     //; 46. Неизвестно: При вычислении добавки к приросту от легиона
  1246.     citrine->WriteLoHook(0x5BFC66,(void*)hook_5BFC66); //
  1247.     //4. Цифры прироста:
  1248.     citrine->WriteLoHook(0x5BFFDF,(void*)hook_5BFFDF); //Цифры прироста
  1249.     //47. Бонус прироста от Статуи Легиона
  1250.     citrine->WriteLoHook(0x5C0098,(void*)hook_5C0098); //
  1251.     //0x5C0203 - новая неделя
  1252.  
  1253.     //жилища. Править обязательно!!11
  1254.     //При подготовке иконки и описания источников прироста в городе учитываем морских волков.
  1255.     //citrine->WriteLoHook(0x5C0264,(void*)hook_5C0264); //
  1256.  
  1257.     // При прибавке существ из-за глобальных событий учитываем морских волков.
  1258.     //citrine->WriteLoHook(0x5C0527,(void*)hook_); //absent in MoP
  1259.     //0x5C057E - используется только с неулучшенными существами.
  1260.     //citrine->WriteLoHook(0x5C057E,(void*)hook_5C0264); //
  1261.    
  1262.     //0x5C0B34, 0x5C0BEC - настройка случайного города - третьего грейда нет в формате карты.
  1263.     //citrine->WriteLoHook(0x5C0B34,(void*)hook_5C0264); //
  1264.     //в моп и хоте забанено
  1265.     //citrine->WriteLoHook(0x5C0BEC,(void*)hook_5C0BEC); //
  1266.  
  1267.  
  1268.     //3. Кадры иконок найма:
  1269.     citrine->WriteLoHook(0x5C6023,(void*)hook_5C6023); //Кадры иконок найма
  1270.     //2.при подготовке информации города для окна форта
  1271.     citrine->WriteLoHook(0x5C7196,(void*)hook_5C7196); //
  1272.  
  1273.     //; 35. Подсказка к орде первого уровня в городе при наведении мыши:
  1274.     citrine->WriteLoHook(0x5C7CE5,(void*)hook_5C7CE5); //
  1275.     //; 36. Подсказка к орде третьего уровня в городе при наведении мыши:
  1276.     citrine->WriteLoHook(0x5C7D1E,(void*)hook_5C7D1E); //
  1277.     //; 42. подсказка к двеллингу без орды
  1278.     citrine->WriteLoHook(0x5C8037,(void*)hook_5C8037); //хинты
  1279.  
  1280.  
  1281.     //5. Отрисовка существ двеллингов в Форте:
  1282.     //окно форта
  1283.     citrine->WriteLoHook(0x5D9DE4,(void*)hook_5D9DE4); //edx, tmgr -> edx
  1284.  
  1285.     citrine->WriteLoHook(0x5D9E5D,(void*)hook_5D9E5D); //ecx, tmgr -> edx
  1286.     citrine->WriteLoHook(0x5D9ED3,(void*)hook_5D9E5D); //ecx, tmgr -> edx
  1287.     citrine->WriteLoHook(0x5D9F4C,(void*)hook_5D9E5D); //ecx, tmgr -> edx
  1288.     citrine->WriteLoHook(0x5D9FC5,(void*)hook_5D9E5D); //ecx, tmgr -> edx
  1289.     citrine->WriteLoHook(0x5DA03E,(void*)hook_5D9E5D); //ecx, tmgr -> edx
  1290.     citrine->WriteLoHook(0x5DA0C2,(void*)hook_5D9E5D); //ecx, tmgr -> edx
  1291.     citrine->WriteLoHook(0x5DA1BA,(void*)hook_5D9E5D); //ecx, tmgr -> edx
  1292.  
  1293.     //8. Подсказки к существам в Форте при наведении мыши
  1294.     citrine->WriteLoHook(0x5DD099,(void*)hook_5DD099); //edx, esi -> edx
  1295.  
  1296.     //7. Параметры существ в Форте
  1297.     citrine->WriteLoHook(0x5DDAD6,(void*)hook_5DDAD6); //ecx, [edx+38] -> eax
  1298.     //6. Названия существ в Форте
  1299.     citrine->WriteLoHook(0x5DD96B,(void*)hook_5DD96B); //
  1300.  
  1301.     //сплайсы
  1302.     //; 33. Неизвестно:
  1303.     citrine->WriteHiHook(0x551B50,SPLICE_,EXTENDED_,FASTCALL_,(void*)splice_00551B50);
  1304.  
  1305.     //37. Снова запуск карты:
  1306.     citrine->WriteHiHook(0x5C0250,SPLICE_,EXTENDED_,THISCALL_,(void*)CorrectTownCreatureGrowth);
  1307.  
  1308.  
  1309.    
  1310.  
  1311.     //еще обзор королевства
  1312.     //сохраняем структуру города
  1313.     citrine->WriteLoHook(0x521711,(void*)hook_521711); //
  1314.     //; 38. Подсказка в кадру существа для найма в обзоре королевства (слева):
  1315.     citrine->WriteLoHook(0x52190D,(void*)hook_52190D); //
  1316.     //; 39. Подсказка в цифре кол-ва существа для найма в обзоре королевства (справа):
  1317.     citrine->WriteLoHook(0x5218F4,(void*)hook_5218F7); //
  1318.     //; 40. Подсказка в кадру существа для найма в обзоре королевства (справа):
  1319.     citrine->WriteLoHook(0x5219B2,(void*)hook_5219B2); //
  1320.     //; 41. Подсказка в цифре кол-ва существа для найма в обзоре королевства (cлева):
  1321.     citrine->WriteLoHook(0x521951,(void*)hook_521951); //
  1322. }
  1323.  
  1324.  
  1325.  
  1326. BOOL APIENTRY DllMain( HMODULE hModule,
  1327.                        DWORD  ul_reason_for_call,
  1328.                        LPVOID lpReserved
  1329.                      )
  1330. {
  1331.     if (ul_reason_for_call == DLL_PROCESS_ATTACH)
  1332.     {
  1333.         globalPatcher = GetPatcher();
  1334.         emerald =  globalPatcher->CreateInstance("h2sw_buildups");
  1335.  
  1336.         Citrine(emerald);
  1337.  
  1338.         //кажется, эти таблицы требуются едва ли не сразу, пусть правки будут здесь
  1339.         *(int*)0x004EB816 = (int)Dependencies0;
  1340.         *(int*)0x004EB8B3 = (int)Dependencies1;
  1341.         *(int*)0x004EB971 = (int)Dependencies2;
  1342.         *(int*)0x004EBA39 = (int)Dependencies3;
  1343.         *(int*)0x004EBA48 = (int)Dependencies4;
  1344.         *(int*)0x004EBA5C = (int)Dependencies5;
  1345.         *(int*)0x004EBA70 = (int)Dependencies6;
  1346.         *(int*)0x004EBA84 = (int)Dependencies7;
  1347.         *(int*)0x004EBA98 = (int)Dependencies8;
  1348.  
  1349.         *(int*)0x004EBAC9 = (int)ObsolutionsAll;
  1350.         *(int*)0x004EBB04 = (int)ObsolutionsAll;
  1351.         *(int*)0x004EBB3F = (int)ObsolutionsAll;
  1352.         *(int*)0x004EBB7A = (int)ObsolutionsAll;
  1353.         *(int*)0x004EBC74 = (int)ObsolutionsAll;
  1354.  
  1355.         *(int*)0x004EBAD8 = (int)Obsolutions0;
  1356.         *(int*)0x004EBB13 = (int)Obsolutions1;
  1357.         *(int*)0x004EBB89 = (int)Obsolutions2;
  1358.         *(int*)0x004EBB4E = (int)Obsolutions3;
  1359.         *(int*)0x004EBB98 = (int)Obsolutions4;
  1360.         *(int*)0x004EBBA7 = (int)Obsolutions5;
  1361.         *(int*)0x004EBBB6 = (int)Obsolutions6;
  1362.         *(int*)0x004EBBC5 = (int)Obsolutions7;
  1363.         *(int*)0x004EBBD4 = (int)Obsolutions8;
  1364.  
  1365.        
  1366.         *(int*)0x688820 = 14;//орда дендруидов -> орда фей
  1367.         *(int*)0x688824 = 10;//орда дендруидов -> орда фей
  1368.         *(char*)0x68A3CA = 0;
  1369.         *(char*)0x68A3CB = 0+7;
  1370.  
  1371.         *(int*)0x688830 = 28; //орда хоббитов
  1372.         *(int*)0x688834 = 8;//орда кабанов -> орда хоббитов
  1373.         *(char*)0x68A3B8 = 0;
  1374.         *(char*)0x68A3B9 = 0+7;
  1375.  
  1376.         ConnectEra();
  1377.        
  1378.  
  1379.         RegisterHandler(PatchIt,"OnBeforeWoG");
  1380.         RegisterHandler(PatchIt2,"OnAfterCreateWindow");
  1381.  
  1382.     /*case :
  1383.     case DLL_THREAD_ATTACH:
  1384.     case DLL_THREAD_DETACH:
  1385.     case DLL_PROCESS_DETACH:
  1386.         break;*/
  1387.     }
  1388.     return TRUE;
  1389. }
Advertisement
Add Comment
Please, Sign In to add comment