Advertisement
Guest User

Untitled

a guest
Feb 13th, 2017
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.91 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include "config.h"
  3. #include "char.h"
  4. #include "char_manager.h"
  5. #include "regen.h"
  6. #include "mob_manager.h"
  7. #include "dungeon.h"
  8.  
  9.  
  10. LPREGEN regen_list = NULL;
  11. LPREGEN_EXCEPTION regen_exception_list = NULL;
  12.  
  13. //REGEN
  14.  
  15. typedef struct SMapDataContainer
  16. {
  17.     char szBaseName[256];
  18.     int base_x;
  19.     int base_y;
  20. }TMapDataContainer;
  21.  
  22. #define mbMapDataCType std::map<DWORD, TMapDataContainer*>
  23. mbMapDataCType mbMapDataContainer;
  24.  
  25. //REGEN FINE
  26.  
  27. static bool get_word (FILE* fp, char* buf)
  28. {
  29.     int i = 0;
  30.     int c;
  31.  
  32.     int semicolon_mode = 0;
  33.  
  34.     while ((c = fgetc (fp)) != EOF)
  35.     {
  36.         if (i == 0)
  37.         {
  38.             if (c == '"')
  39.             {
  40.                 semicolon_mode = 1;
  41.                 continue;
  42.             }
  43.  
  44.             if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
  45.             {
  46.                 continue;
  47.             }
  48.         }
  49.  
  50.         if (semicolon_mode)
  51.         {
  52.             if (c == '"')
  53.             {
  54.                 buf[i] = '\0';
  55.                 return true;
  56.             }
  57.  
  58.             buf[i++] = c;
  59.         }
  60.         else
  61.         {
  62.             if ((c == ' ' || c == '\t' || c == '\n' || c == '\r'))
  63.             {
  64.                 buf[i] = '\0';
  65.                 return true;
  66.             }
  67.  
  68.             buf[i++] = c;
  69.         }
  70.  
  71.         if (i == 2 && buf[0] == '/' && buf[1] == '/')
  72.         {
  73.             buf[i] = '\0';
  74.             return true;
  75.         }
  76.     }
  77.  
  78.     buf[i] = '\0';
  79.     return (i != 0);
  80. }
  81.  
  82. static void next_line (FILE* fp)
  83. {
  84.     int c;
  85.  
  86.     while ((c = fgetc (fp)) != EOF)
  87.         if (c == '\n')
  88.         {
  89.             return;
  90.         }
  91. }
  92.  
  93. static bool read_line (FILE* fp, LPREGEN regen)
  94. {
  95.     char szTmp[256];
  96.  
  97.     int mode = MODE_TYPE;
  98.     int tmpTime;
  99.     DWORD i;
  100.  
  101.     while (get_word (fp, szTmp))
  102.     {
  103.         if (!strncmp (szTmp, "//", 2))
  104.         {
  105.             next_line (fp);
  106.             continue;
  107.         }
  108.  
  109.         switch (mode)
  110.         {
  111.             case MODE_TYPE:
  112.                 if (szTmp[0] == 'm')
  113.                 {
  114.                     regen->type = REGEN_TYPE_MOB;
  115.                 }
  116.                 else if (szTmp[0] == 'g')
  117.                 {
  118.                     regen->type = REGEN_TYPE_GROUP;
  119.  
  120.                     if (szTmp[1] == 'a')
  121.                     {
  122.                         regen->is_aggressive = true;
  123.                     }
  124.                 }
  125.                 else if (szTmp[0] == 'e')
  126.                 {
  127.                     regen->type = REGEN_TYPE_EXCEPTION;
  128.                 }
  129.                 else if (szTmp[0] == 'r')
  130.                 {
  131.                     regen->type = REGEN_TYPE_GROUP_GROUP;
  132.                 }
  133.                 else if (szTmp[0] == 's')
  134.                 {
  135.                     regen->type = REGEN_TYPE_ANYWHERE;
  136.                 }
  137.                 else
  138.                 {
  139.                     sys_err ("read_line: unknown regen type %c", szTmp[0]);
  140.                     exit (1);
  141.                 }
  142.  
  143.                 ++mode;
  144.                 break;
  145.  
  146.             case MODE_SX:
  147.                 str_to_number (regen->sx, szTmp);
  148.                 ++mode;
  149.                 break;
  150.  
  151.             case MODE_SY:
  152.                 str_to_number (regen->sy, szTmp);
  153.                 ++mode;
  154.                 break;
  155.  
  156.             case MODE_EX:
  157.             {
  158.                 int iX = 0;
  159.                 str_to_number (iX, szTmp);
  160.  
  161.                 regen->sx -= iX;
  162.                 regen->ex = regen->sx + iX * 2;
  163.  
  164.                 regen->sx *= 100;
  165.                 regen->ex *= 100;
  166.  
  167.                 ++mode;
  168.             }
  169.             break;
  170.  
  171.             case MODE_EY:
  172.             {
  173.                 int iY = 0;
  174.                 str_to_number (iY, szTmp);
  175.  
  176.                 regen->sy -= iY;
  177.                 regen->ey = regen->sy + iY * 2;
  178.  
  179.                 regen->sy *= 100;
  180.                 regen->ey *= 100;
  181.  
  182.                 ++mode;
  183.             }
  184.             break;
  185.  
  186.             case MODE_Z_SECTION:
  187.                 str_to_number (regen->z_section, szTmp);
  188.  
  189.                 if (regen->type == REGEN_TYPE_EXCEPTION)
  190.                 {
  191.                     return true;
  192.                 }
  193.  
  194.                 ++mode;
  195.                 break;
  196.  
  197.             case MODE_DIRECTION:
  198.                 str_to_number (regen->direction, szTmp);
  199.                 ++mode;
  200.                 break;
  201.  
  202.             case MODE_REGEN_TIME:
  203.                 regen->time = 0;
  204.                 tmpTime = 0;
  205.  
  206.                 for (i = 0; i < strlen (szTmp); ++i)
  207.                 {
  208.                     switch (szTmp[i])
  209.                     {
  210.                         case 'h':
  211.                             regen->time += tmpTime * 3600;
  212.                             tmpTime = 0;
  213.                             break;
  214.  
  215.                         case 'm':
  216.                             regen->time += tmpTime * 60;
  217.                             tmpTime = 0;
  218.                             break;
  219.  
  220.                         case 's':
  221.                             regen->time += tmpTime;
  222.                             tmpTime = 0;
  223.                             break;
  224.  
  225.                         default:
  226.                             if (szTmp[i] >= '0' && szTmp[i] <= '9')
  227.                             {
  228.                                 tmpTime *= 10;
  229.                                 tmpTime += (szTmp[i] - '0');
  230.                             }
  231.                     }
  232.                 }
  233.  
  234.                 ++mode;
  235.                 break;
  236.  
  237.             case MODE_REGEN_PERCENT:
  238.                 ++mode;
  239.                 break;
  240.  
  241.             case MODE_MAX_COUNT:
  242.                 regen->count = 0;
  243.                 str_to_number (regen->max_count, szTmp);
  244.                 ++mode;
  245.                 break;
  246.  
  247.             case MODE_VNUM:
  248.                 str_to_number (regen->vnum, szTmp);
  249.                 ++mode;
  250.                 return true;
  251.         }
  252.     }
  253.  
  254.     return false;
  255. }
  256.  
  257. bool is_regen_exception (long x, long y)
  258. {
  259.     LPREGEN_EXCEPTION exc;
  260.  
  261.     for (exc = regen_exception_list; exc; exc = exc->next)
  262.     {
  263.         if (exc->sx <= x && exc->sy <= y)
  264.         {
  265.             if (exc->ex >= x && exc->ey >= y)
  266.             {
  267.                 return true;
  268.             }
  269.         }
  270.     }
  271.  
  272.     return false;
  273. }
  274.  
  275. static void regen_spawn_dungeon (LPREGEN regen, LPDUNGEON pDungeon, bool bOnce)
  276. {
  277.     DWORD num;
  278.     DWORD i;
  279.  
  280.     num = (regen->max_count - regen->count);
  281.  
  282.     if (!num)
  283.     {
  284.         return;
  285.     }
  286.  
  287.     for (i = 0; i < num; ++i)
  288.     {
  289.         LPCHARACTER ch = NULL;
  290.  
  291.         if (regen->type == REGEN_TYPE_ANYWHERE)
  292.         {
  293.             ch = CHARACTER_MANAGER::instance().SpawnMobRandomPosition (regen->vnum, regen->lMapIndex);
  294.  
  295.             if (ch)
  296.             {
  297.                 ++regen->count;
  298.                 ch->SetDungeon (pDungeon);
  299.             }
  300.         }
  301.         else if (regen->sx == regen->ex && regen->sy == regen->ey)
  302.         {
  303.             ch = CHARACTER_MANAGER::instance().SpawnMob (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->z_section, false, regen->direction == 0 ? number (0, 7) * 45 : (regen->direction - 1) * 45);
  304.  
  305.             if (ch)
  306.             {
  307.                 ++regen->count;
  308.                 ch->SetDungeon (pDungeon);
  309.             }
  310.         }
  311.         else
  312.         {
  313.             if (regen->type == REGEN_TYPE_MOB)
  314.             {
  315.                 ch = CHARACTER_MANAGER::Instance().SpawnMobRange (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, true);
  316.  
  317.                 if (ch)
  318.                 {
  319.                     ++regen->count;
  320.                     ch->SetDungeon (pDungeon);
  321.                 }
  322.             }
  323.             else if (regen->type == REGEN_TYPE_GROUP)
  324.             {
  325.                 if (CHARACTER_MANAGER::Instance().SpawnGroup (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive, pDungeon))
  326.                 {
  327.                     ++regen->count;
  328.                 }
  329.             }
  330.             else if (regen->type == REGEN_TYPE_GROUP_GROUP)
  331.             {
  332.                 if (CHARACTER_MANAGER::Instance().SpawnGroupGroup (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive, pDungeon))
  333.                 {
  334.                     ++regen->count;
  335.                 }
  336.             }
  337.         }
  338.  
  339.         if (ch && !bOnce)
  340.         {
  341.             ch->SetRegen (regen);
  342.         }
  343.     }
  344. }
  345.  
  346. static void regen_spawn (LPREGEN regen, bool bOnce)
  347. {
  348.     DWORD num;
  349.     DWORD i;
  350.  
  351.     num = (regen->max_count - regen->count);
  352.  
  353.     if (!num)
  354.     {
  355.         return;
  356.     }
  357.  
  358.     for (i = 0; i < num; ++i)
  359.     {
  360.         LPCHARACTER ch = NULL;
  361.  
  362.         if (regen->type == REGEN_TYPE_ANYWHERE)
  363.         {
  364.             ch = CHARACTER_MANAGER::instance().SpawnMobRandomPosition (regen->vnum, regen->lMapIndex);
  365.  
  366.             if (ch)
  367.             {
  368.                 ++regen->count;
  369.             }
  370.         }
  371.         else if (regen->sx == regen->ex && regen->sy == regen->ey)
  372.         {
  373.             ch = CHARACTER_MANAGER::instance().SpawnMob (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->z_section, false, regen->direction == 0 ? number (0, 7) * 45 : (regen->direction - 1) * 45);
  374.  
  375.             if (ch)
  376.             {
  377.                 ++regen->count;
  378.             }
  379.         }
  380.         else
  381.         {
  382.             if (regen->type == REGEN_TYPE_MOB)
  383.             {
  384.                 ch = CHARACTER_MANAGER::Instance().SpawnMobRange (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, true, regen->is_aggressive, regen->is_aggressive);
  385.  
  386.                 if (ch)
  387.                 {
  388.                     ++regen->count;
  389.                 }
  390.             }
  391.             else if (regen->type == REGEN_TYPE_GROUP)
  392.             {
  393.                 if (CHARACTER_MANAGER::Instance().SpawnGroup (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
  394.                 {
  395.                     ++regen->count;
  396.                 }
  397.             }
  398.             else if (regen->type == REGEN_TYPE_GROUP_GROUP)
  399.             {
  400.                 if (CHARACTER_MANAGER::Instance().SpawnGroupGroup (regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
  401.                 {
  402.                     ++regen->count;
  403.                 }
  404.             }
  405.         }
  406.  
  407.         if (ch && !bOnce)
  408.         {
  409.             ch->SetRegen (regen);
  410.         }
  411.     }
  412. }
  413.  
  414. EVENTFUNC (dungeon_regen_event)
  415. {
  416.     dungeon_regen_event_info* info = dynamic_cast<dungeon_regen_event_info*> (event->info);
  417.  
  418.     if (info == NULL)
  419.     {
  420.         sys_err ("dungeon_regen_event> <Factor> Null pointer");
  421.         return 0;
  422.     }
  423.  
  424.     LPDUNGEON pDungeon = CDungeonManager::instance().Find (info->dungeon_id);
  425.     if (pDungeon == NULL)
  426.     {
  427.         return 0;
  428.     }
  429.  
  430.     LPREGEN regen = info->regen;
  431.     if (regen->time == 0)
  432.     {
  433.         regen->event = NULL;
  434.     }
  435.  
  436.     regen_spawn_dungeon (regen, pDungeon, false);
  437.     return PASSES_PER_SEC (regen->time);
  438. }
  439.  
  440. bool regen_do (const char* filename, long lMapIndex, int base_x, int base_y, LPDUNGEON pDungeon, bool bOnce)
  441. {
  442.     if (g_bNoRegen)
  443.     {
  444.         return true;
  445.     }
  446.  
  447.     LPREGEN regen = NULL;
  448.     FILE* fp = fopen (filename, "rt");
  449.  
  450.     if (NULL == fp)
  451.     {
  452.         sys_err ("SYSTEM: regen_do: %s: file not found", filename);
  453.         return false;
  454.     }
  455.  
  456.     while (true)
  457.     {
  458.         REGEN tmp;
  459.         memset (&tmp, 0, sizeof (tmp));
  460.  
  461.         if (!read_line (fp, &tmp))
  462.         {
  463.             break;
  464.         }
  465.  
  466.         if (tmp.type == REGEN_TYPE_MOB || tmp.type == REGEN_TYPE_GROUP || tmp.type == REGEN_TYPE_GROUP_GROUP || tmp.type == REGEN_TYPE_ANYWHERE)
  467.         {
  468.             if (!bOnce)
  469.             {
  470.                 regen = M2_NEW REGEN;
  471.                 memcpy (regen, &tmp, sizeof (REGEN));
  472.             }
  473.             else
  474.             {
  475.                 regen = &tmp;
  476.             }
  477.  
  478.             if (pDungeon)
  479.             {
  480.                 regen->is_aggressive = true;
  481.             }
  482.  
  483.             regen->lMapIndex = lMapIndex;
  484.             regen->count = 0;
  485.  
  486.             regen->sx += base_x;
  487.             regen->ex += base_x;
  488.  
  489.             regen->sy += base_y;
  490.             regen->ey += base_y;
  491.  
  492.             if (regen->sx > regen->ex)
  493.             {
  494.                 regen->sx ^= regen->ex;
  495.                 regen->ex ^= regen->sx;
  496.                 regen->sx ^= regen->ex;
  497.             }
  498.  
  499.             if (regen->sy > regen->ey)
  500.             {
  501.                 regen->sy ^= regen->ey;
  502.                 regen->ey ^= regen->sy;
  503.                 regen->sy ^= regen->ey;
  504.             }
  505.  
  506.             if (regen->type == REGEN_TYPE_MOB)
  507.             {
  508.                 const CMob* p = CMobManager::instance().Get (regen->vnum);
  509.  
  510.                 if (!p)
  511.                 {
  512.                     sys_err ("In %s, No mob data by vnum %u", filename, regen->vnum);
  513.                     if (!bOnce)
  514.                     {
  515.                         M2_DELETE (regen);
  516.                     }
  517.                     continue;
  518.                 }
  519.             }
  520.  
  521.             if (!bOnce && pDungeon != NULL)
  522.             {
  523.                 dungeon_regen_event_info* info = AllocEventInfo<dungeon_regen_event_info>();
  524.                 info->regen = regen;
  525.                 info->dungeon_id = pDungeon->GetId();
  526.  
  527.                 regen->event = event_create (dungeon_regen_event, info, PASSES_PER_SEC (number (0, 16)) + PASSES_PER_SEC (regen->time));
  528.                 pDungeon->AddRegen (regen);
  529.             }
  530.             regen_spawn_dungeon (regen, pDungeon, bOnce);
  531.  
  532.         }
  533.     }
  534.  
  535.     fclose (fp);
  536.     return true;
  537. }
  538.  
  539. bool regen_load_in_file (const char* filename, long lMapIndex, int base_x, int base_y)
  540. {
  541.     if (g_bNoRegen)
  542.     {
  543.         return true;
  544.     }
  545.  
  546.     LPREGEN regen = NULL;
  547.     FILE* fp = fopen (filename, "rt");
  548.  
  549.     if (NULL == fp)
  550.     {
  551.         sys_err ("SYSTEM: regen_do: %s: file not found", filename);
  552.         return false;
  553.     }
  554.  
  555.     while (true)
  556.     {
  557.         REGEN tmp;
  558.         memset (&tmp, 0, sizeof (tmp));
  559.  
  560.         if (!read_line (fp, &tmp))
  561.         {
  562.             break;
  563.         }
  564.  
  565.         if (tmp.type == REGEN_TYPE_MOB || tmp.type == REGEN_TYPE_GROUP || tmp.type == REGEN_TYPE_GROUP_GROUP || tmp.type == REGEN_TYPE_ANYWHERE)
  566.         {
  567.             regen = &tmp;
  568.  
  569.             regen->is_aggressive = true;
  570.  
  571.             regen->lMapIndex = lMapIndex;
  572.             regen->count = 0;
  573.  
  574.             regen->sx += base_x;
  575.             regen->ex += base_x;
  576.  
  577.             regen->sy += base_y;
  578.             regen->ey += base_y;
  579.  
  580.             if (regen->sx > regen->ex)
  581.             {
  582.                 regen->sx ^= regen->ex;
  583.                 regen->ex ^= regen->sx;
  584.                 regen->sx ^= regen->ex;
  585.             }
  586.  
  587.             if (regen->sy > regen->ey)
  588.             {
  589.                 regen->sy ^= regen->ey;
  590.                 regen->ey ^= regen->sy;
  591.                 regen->sy ^= regen->ey;
  592.             }
  593.  
  594.             if (regen->type == REGEN_TYPE_MOB)
  595.             {
  596.                 const CMob* p = CMobManager::instance().Get (regen->vnum);
  597.  
  598.                 if (!p)
  599.                 {
  600.                     sys_err ("In %s, No mob data by vnum %u", filename, regen->vnum);
  601.                     continue;
  602.                 }
  603.             }
  604.             regen_spawn (regen, true);
  605.         }
  606.     }
  607.  
  608.     fclose (fp);
  609.     return true;
  610. }
  611.  
  612. EVENTFUNC (regen_event)
  613. {
  614.     regen_event_info* info = dynamic_cast<regen_event_info*> (event->info);
  615.  
  616.     if (info == NULL)
  617.     {
  618.         sys_err ("regen_event> <Factor> Null pointer");
  619.         return 0;
  620.     }
  621.  
  622.     LPREGEN regen = info->regen;
  623.     //REGEN
  624.     if (!is_valid_regen(regen))
  625.     {
  626.         return 0;
  627.     }
  628.     //REGEN FINE
  629.     if (regen->time == 0)
  630.     {
  631.         regen->event = NULL;
  632.     }
  633.  
  634.     regen_spawn (regen, false);
  635.     return PASSES_PER_SEC (regen->time);
  636. }
  637.  
  638. bool regen_load (const char* filename, long lMapIndex, int base_x, int base_y)
  639. {
  640.     if (g_bNoRegen)
  641.     {
  642.         return true;
  643.     }
  644.  
  645.     LPREGEN regen = NULL;
  646.     FILE* fp = fopen (filename, "rt");
  647.  
  648.     if (NULL == fp)
  649.     {
  650.         sys_log (0, "SYSTEM: regen_load: %s: file not found", filename);
  651.         return false;
  652.     }
  653.  
  654.     while (true)
  655.     {
  656.         REGEN tmp;
  657.         memset (&tmp, 0, sizeof (tmp));
  658.  
  659.         if (!read_line (fp, &tmp))
  660.         {
  661.             break;
  662.         }
  663.  
  664.         if (tmp.type == REGEN_TYPE_MOB || tmp.type == REGEN_TYPE_GROUP || tmp.type == REGEN_TYPE_GROUP_GROUP || tmp.type == REGEN_TYPE_ANYWHERE)
  665.         {
  666.             if (test_server)
  667.             {
  668.                 CMobManager::instance().IncRegenCount (tmp.type, tmp.vnum, tmp.max_count, tmp.time);
  669.             }
  670.  
  671.             regen = M2_NEW REGEN;
  672.             memcpy (regen, &tmp, sizeof (REGEN));
  673.             INSERT_TO_TW_LIST (regen, regen_list, prev, next);
  674.  
  675.             regen->lMapIndex = lMapIndex;
  676.             regen->count = 0;
  677.  
  678.             regen->sx += base_x;
  679.             regen->ex += base_x;
  680.  
  681.             regen->sy += base_y;
  682.             regen->ey += base_y;
  683.  
  684.             if (regen->sx > regen->ex)
  685.             {
  686.                 regen->sx ^= regen->ex;
  687.                 regen->ex ^= regen->sx;
  688.                 regen->sx ^= regen->ex;
  689.             }
  690.  
  691.             if (regen->sy > regen->ey)
  692.             {
  693.                 regen->sy ^= regen->ey;
  694.                 regen->ey ^= regen->sy;
  695.                 regen->sy ^= regen->ey;
  696.             }
  697.  
  698.             if (regen->type == REGEN_TYPE_MOB)
  699.             {
  700.                 const CMob* p = CMobManager::instance().Get (regen->vnum);
  701.  
  702.                 if (!p)
  703.                 {
  704.                     sys_err ("In %s, No mob data by vnum %u", filename, regen->vnum);
  705.                 }
  706.                 else if (p->m_table.bType == CHAR_TYPE_NPC || p->m_table.bType == CHAR_TYPE_WARP || p->m_table.bType == CHAR_TYPE_GOTO)
  707.                 {
  708.                     SECTREE_MANAGER::instance().InsertNPCPosition (lMapIndex, p->m_table.bType, p->m_table.szLocaleName, (regen->sx + regen->ex) / 2 - base_x, (regen->sy + regen->ey) / 2 - base_y);
  709.                 }
  710.             }
  711.  
  712.             if (regen->time != 0)
  713.             {
  714.                 regen_spawn (regen, false);
  715.                 regen_event_info* info = AllocEventInfo<regen_event_info>();
  716.                 info->regen = regen;
  717.                 regen->event = event_create (regen_event, info, PASSES_PER_SEC (number (0, 16)) + PASSES_PER_SEC (regen->time));
  718.             }
  719.         }
  720.         else if (tmp.type == REGEN_TYPE_EXCEPTION)
  721.         {
  722.             LPREGEN_EXCEPTION exc;
  723.             exc = M2_NEW REGEN_EXCEPTION;
  724.  
  725.             exc->sx = tmp.sx;
  726.             exc->sy = tmp.sy;
  727.             exc->ex = tmp.ex;
  728.             exc->ey = tmp.ey;
  729.             exc->z_section = tmp.z_section;
  730.  
  731.             INSERT_TO_TW_LIST (exc, regen_exception_list, prev, next);
  732.         }
  733.     }
  734.  
  735.     fclose (fp);
  736.     return true;
  737. }
  738.  
  739. void regen_free (void)
  740. {
  741.     LPREGEN regen, next_regen;
  742.     LPREGEN_EXCEPTION exc, next_exc;
  743.  
  744.     for (regen = regen_list; regen; regen = next_regen)
  745.     {
  746.         next_regen = regen->next;
  747.  
  748.         event_cancel (&regen->event);
  749.         M2_DELETE (regen);
  750.     }
  751.  
  752.     regen_list = NULL;
  753.  
  754.     for (exc = regen_exception_list; exc; exc = next_exc)
  755.     {
  756.         next_exc = exc->next;
  757.  
  758.         M2_DELETE (exc);
  759.     }
  760.  
  761.     regen_exception_list = NULL;
  762. }
  763.  
  764. void regen_reset (int x, int y)
  765. {
  766.     LPREGEN regen;
  767.  
  768.     for (regen = regen_list; regen; regen = regen->next)
  769.     {
  770.         if (!regen->event)
  771.         {
  772.             continue;
  773.         }
  774.  
  775.         if (x != 0 || y != 0)
  776.         {
  777.             if (x >= regen->sx && x <= regen->ex)
  778.             {
  779.                 if (y >= regen->sy && y <= regen->ey)
  780.                 {
  781.                     event_reset_time (regen->event, 1);
  782.                 }
  783.             }
  784.         }
  785.         else
  786.         {
  787.             event_reset_time (regen->event, 1);
  788.         }
  789.     }
  790. }
  791.  
  792. bool is_valid_regen(LPREGEN currRegen)
  793. {
  794.     LPREGEN     regen;
  795.  
  796.     for (regen = regen_list; regen; regen = regen->next)
  797.     {
  798.         if (regen == currRegen)
  799.             return true;
  800.     }
  801.     return false;
  802. }
  803.  
  804. void regen_free_map(long lMapIndex)
  805. {
  806.     LPREGEN     regen, prev, next;
  807.  
  808.     for (regen = regen_list; regen; regen = regen->next)
  809.     {
  810.         if (regen->lMapIndex != lMapIndex)
  811.             continue;
  812.         event_cancel(&regen->event);
  813.         REMOVE_FROM_TW_LIST(regen, regen_list, prev, next);
  814.         M2_DELETE(regen);
  815.     }
  816. }
  817.  
  818. void regen_reload(long lMapIndex)
  819. {
  820.     if (mbMapDataContainer.find(lMapIndex) == mbMapDataContainer.end())
  821.         return;
  822.  
  823.     char szFilename[256];
  824.    
  825.     snprintf(szFilename, sizeof(szFilename), "%sregen.txt", mbMapDataContainer[lMapIndex]->szBaseName);
  826.     regen_load(szFilename, lMapIndex, mbMapDataContainer[lMapIndex]->base_x, mbMapDataContainer[lMapIndex]->base_y);
  827.  
  828.     snprintf(szFilename, sizeof(szFilename), "%snpc.txt", mbMapDataContainer[lMapIndex]->szBaseName);
  829.     regen_load(szFilename, lMapIndex, mbMapDataContainer[lMapIndex]->base_x, mbMapDataContainer[lMapIndex]->base_y);
  830.  
  831.     snprintf(szFilename, sizeof(szFilename), "%sboss.txt", mbMapDataContainer[lMapIndex]->szBaseName);
  832.     regen_load(szFilename, lMapIndex, mbMapDataContainer[lMapIndex]->base_x, mbMapDataContainer[lMapIndex]->base_y);
  833.  
  834.     snprintf(szFilename, sizeof(szFilename), "%sstone.txt", mbMapDataContainer[lMapIndex]->szBaseName);
  835.     regen_load(szFilename, lMapIndex, mbMapDataContainer[lMapIndex]->base_x, mbMapDataContainer[lMapIndex]->base_y);
  836. }
  837.  
  838. void regen_register_map(const char * szBaseName, long lMapIndex, int base_x, int base_y)
  839. {
  840.     TMapDataContainer* container = new TMapDataContainer;
  841.     memset(container->szBaseName, 0, sizeof(container->szBaseName));
  842. #ifdef __FreeBSD__
  843.     strlcpy(container->szBaseName, szBaseName, sizeof(container->szBaseName) - 1);
  844. #else
  845.     strncpy(container->szBaseName, szBaseName, sizeof(container->szBaseName) - 1);
  846. #endif
  847.     container->base_x = base_x;
  848.     container->base_y = base_y;
  849.     mbMapDataContainer[lMapIndex] = container;
  850. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement