Browse Source

Corrected Taekwon Mission mob generator (#3509)

* Fixes #3499.
* Corrected the way target monsters are generated for Taekwon Mission.
* Requires: The mob ID is in the range [MOBID_PORING, MOBID_GREEN_IGUANA], the mob must have below 30,000 HP, the mob must give Base EXP, the mob must be CLASS_NORMAL.
* Added a new mob group: MOBG_Taekwon_Mission
* Removed hard coded checks.
* Created constants for random monster group flags.
Thanks to @mrjnumber1, @Lemongrass3110, and @cydh!
Aleos 6 years ago
parent
commit
7040057a9f
7 changed files with 396 additions and 34 deletions
  1. 4 0
      db/import-tmpl/mob_mission.txt
  2. 350 0
      db/mob_mission.txt
  3. 1 0
      src/map/map-server.vcxproj
  4. 15 22
      src/map/mob.cpp
  5. 20 8
      src/map/mob.hpp
  6. 1 0
      src/map/script_constants.hpp
  7. 5 4
      src/map/skill.cpp

+ 4 - 0
db/import-tmpl/mob_mission.txt

@@ -0,0 +1,4 @@
+// Taekwon Mission Summonable Monsters Database
+//
+// Structure of Database:
+// MobRandomGroupID,MobID,DummyName,Rate

+ 350 - 0
db/mob_mission.txt

@@ -0,0 +1,350 @@
+// Taekwon Mission Summonable Monsters Database
+//
+// Structure of Database:
+// MobRandomGroupID,MobID,DummyName,Rate
+
+MOBG_Taekwon_Mission,0,Scorpion,1001
+MOBG_Taekwon_Mission,1001,Scorpion,1
+MOBG_Taekwon_Mission,1002,Poring,1
+MOBG_Taekwon_Mission,1004,Hornet,1
+MOBG_Taekwon_Mission,1005,Familiar,1
+MOBG_Taekwon_Mission,1007,Fabre,1
+MOBG_Taekwon_Mission,1008,Pupa,1
+MOBG_Taekwon_Mission,1009,Condor,1
+MOBG_Taekwon_Mission,1010,Willow,1
+MOBG_Taekwon_Mission,1011,Chonchon,1
+MOBG_Taekwon_Mission,1012,Roda Frog,1
+MOBG_Taekwon_Mission,1013,Wolf,1
+MOBG_Taekwon_Mission,1014,Spore,1
+MOBG_Taekwon_Mission,1015,Zombie,1
+MOBG_Taekwon_Mission,1016,Archer Skeleton,1
+MOBG_Taekwon_Mission,1018,Creamy,1
+MOBG_Taekwon_Mission,1019,Peco Peco,1
+MOBG_Taekwon_Mission,1020,Mandragora,1
+MOBG_Taekwon_Mission,1023,Orc Warrior,1
+MOBG_Taekwon_Mission,1024,Wormtail,1
+MOBG_Taekwon_Mission,1025,Snake,1
+MOBG_Taekwon_Mission,1026,Munak,1
+MOBG_Taekwon_Mission,1028,Soldier Skeleton,1
+MOBG_Taekwon_Mission,1029,Isis,1
+MOBG_Taekwon_Mission,1030,Anacondaq,1
+MOBG_Taekwon_Mission,1031,Poporing,1
+MOBG_Taekwon_Mission,1032,Verit,1
+MOBG_Taekwon_Mission,1033,Elder Willow,1
+MOBG_Taekwon_Mission,1034,Thara Frog,1
+MOBG_Taekwon_Mission,1035,Hunter Fly,1
+MOBG_Taekwon_Mission,1036,Ghoul,1
+MOBG_Taekwon_Mission,1037,Side Winder,1
+MOBG_Taekwon_Mission,1040,Golem,1
+MOBG_Taekwon_Mission,1041,Mummy,1
+MOBG_Taekwon_Mission,1042,Steel Chonchon,1
+MOBG_Taekwon_Mission,1044,Obeaune,1
+MOBG_Taekwon_Mission,1045,Marc,1
+MOBG_Taekwon_Mission,1047,Peco Peco Egg,1
+MOBG_Taekwon_Mission,1048,Thief Bug Egg,1
+MOBG_Taekwon_Mission,1049,Picky,1
+MOBG_Taekwon_Mission,1050,Picky,1
+MOBG_Taekwon_Mission,1051,Thief Bug,1
+MOBG_Taekwon_Mission,1052,Rocker,1
+MOBG_Taekwon_Mission,1053,Thief Bug Female,1
+MOBG_Taekwon_Mission,1054,Thief Bug Male,1
+MOBG_Taekwon_Mission,1055,Muka,1
+MOBG_Taekwon_Mission,1056,Smokie,1
+MOBG_Taekwon_Mission,1057,Yoyo,1
+MOBG_Taekwon_Mission,1058,Metaller,1
+MOBG_Taekwon_Mission,1060,Bigfoot,1
+MOBG_Taekwon_Mission,1061,Nightmare,1
+MOBG_Taekwon_Mission,1062,Santa Poring,1
+MOBG_Taekwon_Mission,1063,Lunatic,1
+MOBG_Taekwon_Mission,1064,Megalodon,1
+MOBG_Taekwon_Mission,1065,Strouf,1
+MOBG_Taekwon_Mission,1066,Vadon,1
+MOBG_Taekwon_Mission,1067,Cornutus,1
+MOBG_Taekwon_Mission,1068,Hydra,1
+MOBG_Taekwon_Mission,1069,Swordfish,1
+MOBG_Taekwon_Mission,1070,Kukre,1
+MOBG_Taekwon_Mission,1071,Pirate Skeleton,1
+MOBG_Taekwon_Mission,1072,Kaho,1
+MOBG_Taekwon_Mission,1073,Crab,1
+MOBG_Taekwon_Mission,1074,Shellfish,1
+MOBG_Taekwon_Mission,1076,Skeleton,1
+MOBG_Taekwon_Mission,1077,Poison Spore,1
+MOBG_Taekwon_Mission,1088,Vocal,1
+MOBG_Taekwon_Mission,1089,Toad,1
+MOBG_Taekwon_Mission,1090,Mastering,1
+MOBG_Taekwon_Mission,1091,Dragon Fly,1
+MOBG_Taekwon_Mission,1092,Vagabond Wolf,1
+MOBG_Taekwon_Mission,1093,Eclipse,1
+MOBG_Taekwon_Mission,1094,Ambernite,1
+MOBG_Taekwon_Mission,1095,Andre,1
+MOBG_Taekwon_Mission,1096,Angeling,1
+MOBG_Taekwon_Mission,1097,Ant Egg,1
+MOBG_Taekwon_Mission,1098,Anubis,1
+MOBG_Taekwon_Mission,1099,Argiope,1
+MOBG_Taekwon_Mission,1100,Argos,1
+MOBG_Taekwon_Mission,1101,Baphomet Jr.,1
+MOBG_Taekwon_Mission,1102,Bathory,1
+MOBG_Taekwon_Mission,1103,Caramel,1
+MOBG_Taekwon_Mission,1104,Coco,1
+MOBG_Taekwon_Mission,1105,Deniro,1
+MOBG_Taekwon_Mission,1106,Desert Wolf,1
+MOBG_Taekwon_Mission,1107,Desert Wolf Baby,1
+MOBG_Taekwon_Mission,1108,Deviace,1
+MOBG_Taekwon_Mission,1109,Deviruchi,1
+MOBG_Taekwon_Mission,1110,Dokebi,1
+MOBG_Taekwon_Mission,1111,Drainliar,1
+MOBG_Taekwon_Mission,1113,Drops,1
+MOBG_Taekwon_Mission,1114,Dustiness,1
+MOBG_Taekwon_Mission,1116,Eggyra,1
+MOBG_Taekwon_Mission,1117,Evil Druid,1
+MOBG_Taekwon_Mission,1118,Flora,1
+MOBG_Taekwon_Mission,1119,Frilldora,1
+MOBG_Taekwon_Mission,1120,Ghostring,1
+MOBG_Taekwon_Mission,1121,Giearth,1
+MOBG_Taekwon_Mission,1122,Goblin,1
+MOBG_Taekwon_Mission,1123,Goblin,1
+MOBG_Taekwon_Mission,1124,Goblin,1
+MOBG_Taekwon_Mission,1125,Goblin,1
+MOBG_Taekwon_Mission,1126,Goblin,1
+MOBG_Taekwon_Mission,1127,Hode,1
+MOBG_Taekwon_Mission,1128,Horn,1
+MOBG_Taekwon_Mission,1129,Horong,1
+MOBG_Taekwon_Mission,1130,Jakk,1
+MOBG_Taekwon_Mission,1131,Joker,1
+MOBG_Taekwon_Mission,1132,Khalitzburg,1
+MOBG_Taekwon_Mission,1133,Kobold,1
+MOBG_Taekwon_Mission,1134,Kobold,1
+MOBG_Taekwon_Mission,1135,Kobold,1
+MOBG_Taekwon_Mission,1138,Magnolia,1
+MOBG_Taekwon_Mission,1139,Mantis,1
+MOBG_Taekwon_Mission,1140,Marduk,1
+MOBG_Taekwon_Mission,1141,Marina,1
+MOBG_Taekwon_Mission,1142,Marine Sphere,1
+MOBG_Taekwon_Mission,1143,Marionette,1
+MOBG_Taekwon_Mission,1144,Marse,1
+MOBG_Taekwon_Mission,1145,Martin,1
+MOBG_Taekwon_Mission,1146,Matyr,1
+MOBG_Taekwon_Mission,1148,Medusa,1
+MOBG_Taekwon_Mission,1149,Minorous,1
+MOBG_Taekwon_Mission,1151,Myst,1
+MOBG_Taekwon_Mission,1152,Orc Skeleton,1
+MOBG_Taekwon_Mission,1153,Orc Zombie,1
+MOBG_Taekwon_Mission,1154,Pasana,1
+MOBG_Taekwon_Mission,1155,Petite,1
+MOBG_Taekwon_Mission,1156,Petite,1
+MOBG_Taekwon_Mission,1158,Phen,1
+MOBG_Taekwon_Mission,1160,Piere,1
+MOBG_Taekwon_Mission,1161,Plankton,1
+MOBG_Taekwon_Mission,1162,Rafflesia,1
+MOBG_Taekwon_Mission,1163,Raydric,1
+MOBG_Taekwon_Mission,1164,Requiem,1
+MOBG_Taekwon_Mission,1165,Sandman,1
+MOBG_Taekwon_Mission,1166,Savage,1
+MOBG_Taekwon_Mission,1167,Savage Babe,1
+MOBG_Taekwon_Mission,1169,Skeleton Worker,1
+MOBG_Taekwon_Mission,1170,Sohee,1
+MOBG_Taekwon_Mission,1174,Stainer,1
+MOBG_Taekwon_Mission,1175,Tarou,1
+MOBG_Taekwon_Mission,1176,Vitata,1
+MOBG_Taekwon_Mission,1177,Zenorc,1
+MOBG_Taekwon_Mission,1178,Zerom,1
+MOBG_Taekwon_Mission,1179,Whisper,1
+MOBG_Taekwon_Mission,1180,Nine Tail,1
+MOBG_Taekwon_Mission,1183,Chonchon,1
+MOBG_Taekwon_Mission,1184,Fabre,1
+MOBG_Taekwon_Mission,1185,Whisper,1
+MOBG_Taekwon_Mission,1186,Giant Whisper,1
+MOBG_Taekwon_Mission,1188,Bongun,1
+MOBG_Taekwon_Mission,1189,Orc Archer,1
+MOBG_Taekwon_Mission,1191,Mimic,1
+MOBG_Taekwon_Mission,1192,Wraith,1
+MOBG_Taekwon_Mission,1193,Alarm,1
+MOBG_Taekwon_Mission,1194,Arclouse,1
+MOBG_Taekwon_Mission,1195,Rideword,1
+MOBG_Taekwon_Mission,1196,Skeleton Prisoner,1
+MOBG_Taekwon_Mission,1197,Zombie Prisoner,1
+MOBG_Taekwon_Mission,1198,Dark Priest,1
+MOBG_Taekwon_Mission,1199,Punk,1
+MOBG_Taekwon_Mission,1201,Rybio,1
+MOBG_Taekwon_Mission,1202,Phendark,1
+MOBG_Taekwon_Mission,1206,Anolian,1
+MOBG_Taekwon_Mission,1207,Sting,1
+MOBG_Taekwon_Mission,1208,Wander Man,1
+MOBG_Taekwon_Mission,1209,Cramp,1
+MOBG_Taekwon_Mission,1211,Brilight,1
+MOBG_Taekwon_Mission,1212,Iron Fist,1
+MOBG_Taekwon_Mission,1213,High Orc,1
+MOBG_Taekwon_Mission,1214,Choco,1
+MOBG_Taekwon_Mission,1215,Stem Worm,1
+MOBG_Taekwon_Mission,1216,Penomena,1
+MOBG_Taekwon_Mission,1219,Knight of Abyss,1
+MOBG_Taekwon_Mission,1248,Cruiser,1
+MOBG_Taekwon_Mission,1249,Myst Case,1
+MOBG_Taekwon_Mission,1250,Chepet,1
+MOBG_Taekwon_Mission,1253,Gargoyle,1
+MOBG_Taekwon_Mission,1254,Raggler,1
+MOBG_Taekwon_Mission,1255,Neraid,1
+MOBG_Taekwon_Mission,1256,Pest,1
+MOBG_Taekwon_Mission,1257,Injustice,1
+MOBG_Taekwon_Mission,1258,Goblin Archer,1
+MOBG_Taekwon_Mission,1260,Dark Frame,1
+MOBG_Taekwon_Mission,1261,Wild Rose,1
+MOBG_Taekwon_Mission,1263,Wind Ghost,1
+MOBG_Taekwon_Mission,1264,Merman,1
+MOBG_Taekwon_Mission,1265,Cookie,1
+MOBG_Taekwon_Mission,1266,Aster,1
+MOBG_Taekwon_Mission,1267,Carat,1
+MOBG_Taekwon_Mission,1269,Clock,1
+MOBG_Taekwon_Mission,1270,Clock Tower Manager,1
+MOBG_Taekwon_Mission,1271,Alligator,1
+MOBG_Taekwon_Mission,1273,Orc Lady,1
+MOBG_Taekwon_Mission,1274,Megalith,1
+MOBG_Taekwon_Mission,1275,Alice,1
+MOBG_Taekwon_Mission,1276,Raydric Archer,1
+MOBG_Taekwon_Mission,1277,Greatest General,1
+MOBG_Taekwon_Mission,1278,Stalactic Golem,1
+MOBG_Taekwon_Mission,1279,Tri Joint,1
+MOBG_Taekwon_Mission,1280,Steam Goblin,1
+MOBG_Taekwon_Mission,1281,Sage Worm,1
+MOBG_Taekwon_Mission,1282,Kobold Archer,1
+MOBG_Taekwon_Mission,1283,Chimera,1
+MOBG_Taekwon_Mission,1285,Archer Guardian,1
+MOBG_Taekwon_Mission,1287,Soldier Guardian,1
+MOBG_Taekwon_Mission,1290,Skeleton General,1
+MOBG_Taekwon_Mission,1291,Wraith Dead,1
+MOBG_Taekwon_Mission,1292,Mini Demon,1
+MOBG_Taekwon_Mission,1293,Creamy Fear,1
+MOBG_Taekwon_Mission,1294,Killer Mantis,1
+MOBG_Taekwon_Mission,1295,Owl Baron,1
+MOBG_Taekwon_Mission,1296,Kobold Leader,1
+MOBG_Taekwon_Mission,1297,Ancient Mummy,1
+MOBG_Taekwon_Mission,1298,Zombie Master,1
+MOBG_Taekwon_Mission,1299,Goblin Leader,1
+MOBG_Taekwon_Mission,1300,Caterpillar,1
+MOBG_Taekwon_Mission,1301,Am Mut,1
+MOBG_Taekwon_Mission,1302,Dark Illusion,1
+MOBG_Taekwon_Mission,1303,Giant Hornet,1
+MOBG_Taekwon_Mission,1304,Giant Spider,1
+MOBG_Taekwon_Mission,1305,Ancient Worm,1
+MOBG_Taekwon_Mission,1306,Leib Olmai,1
+MOBG_Taekwon_Mission,1307,Cat o' Nine Tails,1
+MOBG_Taekwon_Mission,1308,Panzer Goblin,1
+MOBG_Taekwon_Mission,1309,Gajomart,1
+MOBG_Taekwon_Mission,1310,Majoruros,1
+MOBG_Taekwon_Mission,1311,Gullinbursti,1
+MOBG_Taekwon_Mission,1313,Mobster,1
+MOBG_Taekwon_Mission,1314,Permeter,1
+MOBG_Taekwon_Mission,1315,Assaulter,1
+MOBG_Taekwon_Mission,1316,Solider,1
+MOBG_Taekwon_Mission,1317,Fur Seal,1
+MOBG_Taekwon_Mission,1318,Heater,1
+MOBG_Taekwon_Mission,1319,Freezer,1
+MOBG_Taekwon_Mission,1320,Owl Duke,1
+MOBG_Taekwon_Mission,1321,Dragon Tail,1
+MOBG_Taekwon_Mission,1322,Spring Rabbit,1
+MOBG_Taekwon_Mission,1323,Sea Otter,1
+MOBG_Taekwon_Mission,1365,Apocalypse,1
+MOBG_Taekwon_Mission,1366,Lava Golem,1
+MOBG_Taekwon_Mission,1367,Blazer,1
+MOBG_Taekwon_Mission,1368,Geographer,1
+MOBG_Taekwon_Mission,1369,Grand Peco,1
+MOBG_Taekwon_Mission,1370,Succubus,1
+MOBG_Taekwon_Mission,1371,Fake Angel,1
+MOBG_Taekwon_Mission,1372,Goat,1
+MOBG_Taekwon_Mission,1374,Incubus,1
+MOBG_Taekwon_Mission,1375,The Paper,1
+MOBG_Taekwon_Mission,1376,Harpy,1
+MOBG_Taekwon_Mission,1377,Elder,1
+MOBG_Taekwon_Mission,1378,Demon Pungus,1
+MOBG_Taekwon_Mission,1379,Nightmare Terror,1
+MOBG_Taekwon_Mission,1380,Driller,1
+MOBG_Taekwon_Mission,1381,Grizzly,1
+MOBG_Taekwon_Mission,1382,Diabolic,1
+MOBG_Taekwon_Mission,1383,Explosion,1
+MOBG_Taekwon_Mission,1384,Deleter,1
+MOBG_Taekwon_Mission,1385,Deleter,1
+MOBG_Taekwon_Mission,1386,Sleeper,1
+MOBG_Taekwon_Mission,1387,Gig,1
+MOBG_Taekwon_Mission,1388,Archangeling,1
+MOBG_Taekwon_Mission,1390,Violy,1
+MOBG_Taekwon_Mission,1391,Galapago,1
+MOBG_Taekwon_Mission,1392,Rotar Zairo,1
+MOBG_Taekwon_Mission,1400,Karakasa,1
+MOBG_Taekwon_Mission,1401,Shinobi,1
+MOBG_Taekwon_Mission,1402,Poison Toad,1
+MOBG_Taekwon_Mission,1403,Antique Firelock,1
+MOBG_Taekwon_Mission,1404,Miyabi Ningyo,1
+MOBG_Taekwon_Mission,1405,Tengu,1
+MOBG_Taekwon_Mission,1406,Kapha,1
+MOBG_Taekwon_Mission,1408,Bloody Butterfly,1
+MOBG_Taekwon_Mission,1409,Rice Cake Boy,1
+MOBG_Taekwon_Mission,1410,Live Peach Tree,1
+MOBG_Taekwon_Mission,1412,Evil Cloud Hermit,1
+MOBG_Taekwon_Mission,1413,Wild Ginseng,1
+MOBG_Taekwon_Mission,1415,Baby Leopard,1
+MOBG_Taekwon_Mission,1416,Wicked Nymph,1
+MOBG_Taekwon_Mission,1417,Zipper Bear,1
+MOBG_Taekwon_Mission,1493,Dryad,1
+MOBG_Taekwon_Mission,1494,Beetle King,1
+MOBG_Taekwon_Mission,1495,Stone Shooter,1
+MOBG_Taekwon_Mission,1497,Wooden Golem,1
+MOBG_Taekwon_Mission,1498,Wootan Shooter,1
+MOBG_Taekwon_Mission,1499,Wootan Fighter,1
+MOBG_Taekwon_Mission,1500,Parasite,1
+MOBG_Taekwon_Mission,1503,Gibbet,1
+MOBG_Taekwon_Mission,1504,Dullahan,1
+MOBG_Taekwon_Mission,1505,Loli Ruri,1
+MOBG_Taekwon_Mission,1506,Disguise,1
+MOBG_Taekwon_Mission,1507,Bloody Murderer,1
+MOBG_Taekwon_Mission,1508,Quve,1
+MOBG_Taekwon_Mission,1509,Lude,1
+MOBG_Taekwon_Mission,1510,Hylozoist,1
+MOBG_Taekwon_Mission,1512,Hyegun,1
+MOBG_Taekwon_Mission,1513,Civil Servant,1
+MOBG_Taekwon_Mission,1514,Dancing Dragon,1
+MOBG_Taekwon_Mission,1515,Garm Baby,1
+MOBG_Taekwon_Mission,1516,Increase Soil,1
+MOBG_Taekwon_Mission,1517,Li Me Mang Ryang,1
+MOBG_Taekwon_Mission,1519,Chung E,1
+MOBG_Taekwon_Mission,1520,Boiled Rice,1
+MOBG_Taekwon_Mission,1582,Deviling,1
+MOBG_Taekwon_Mission,1584,Tamruan,1
+MOBG_Taekwon_Mission,1585,Mime Monkey,1
+MOBG_Taekwon_Mission,1586,Leaf Cat,1
+MOBG_Taekwon_Mission,1587,Kraben,1
+MOBG_Taekwon_Mission,1588,Christmas Orc,1
+MOBG_Taekwon_Mission,1609,Dancing Dragon,1
+MOBG_Taekwon_Mission,1613,Metaling,1
+MOBG_Taekwon_Mission,1614,Mineral,1
+MOBG_Taekwon_Mission,1615,Obsidian,1
+MOBG_Taekwon_Mission,1616,Pitman,1
+MOBG_Taekwon_Mission,1617,Waste Stove,1
+MOBG_Taekwon_Mission,1618,Ungoliant,1
+MOBG_Taekwon_Mission,1619,Porcellio,1
+MOBG_Taekwon_Mission,1620,Noxious,1
+MOBG_Taekwon_Mission,1621,Venomous,1
+MOBG_Taekwon_Mission,1622,Teddy Bear,1
+MOBG_Taekwon_Mission,1625,Porcellio,1
+MOBG_Taekwon_Mission,1626,Hellion Revenant,1
+MOBG_Taekwon_Mission,1627,Anopheles,1
+MOBG_Taekwon_Mission,1628,Mole,1
+MOBG_Taekwon_Mission,1629,Hill Wind,1
+MOBG_Taekwon_Mission,1631,Chung E,1
+MOBG_Taekwon_Mission,1632,Gremlin,1
+MOBG_Taekwon_Mission,1633,Beholder,1
+MOBG_Taekwon_Mission,1664,Photon Cannon,1
+MOBG_Taekwon_Mission,1665,Photon Cannon,1
+MOBG_Taekwon_Mission,1666,Photon Cannon,1
+MOBG_Taekwon_Mission,1667,Photon Cannon,1
+MOBG_Taekwon_Mission,1668,Archdam,1
+MOBG_Taekwon_Mission,1670,Dimik,1
+MOBG_Taekwon_Mission,1671,Dimik,1
+MOBG_Taekwon_Mission,1672,Dimik,1
+MOBG_Taekwon_Mission,1673,Dimik,1
+MOBG_Taekwon_Mission,1676,Venatu,1
+MOBG_Taekwon_Mission,1677,Venatu,1
+MOBG_Taekwon_Mission,1678,Venatu,1
+MOBG_Taekwon_Mission,1679,Venatu,1
+MOBG_Taekwon_Mission,1680,Hill Wind,1
+MOBG_Taekwon_Mission,1686,Orc Baby,1
+MOBG_Taekwon_Mission,1687,Green Iguana,1

+ 1 - 0
src/map/map-server.vcxproj

@@ -346,6 +346,7 @@
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_drop.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_drop.txt')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_item_ratio.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_item_ratio.txt')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_poring.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_poring.txt')" />
+    <Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_mission.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_mission.txt')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_pouch.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_pouch.txt')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_race2_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_race2_db.txt')" />
     <Copy SourceFiles="$(SolutionDir)db\import-tmpl\mob_random_db.txt" DestinationFolder="$(SolutionDir)db\import\" ContinueOnError="true" Condition="!Exists('$(SolutionDir)db\import\mob_random_db.txt')" />

+ 15 - 22
src/map/mob.cpp

@@ -482,27 +482,19 @@ struct mob_data* mob_spawn_dataset(struct spawn_data *data)
 
 /*==========================================
  * Fetches a random mob_id [Skotlex]
- * type: Where to fetch from:
- * 0: dead branch list
- * 1: poring list
- * 2: bloody branch list
- * flag:
- * &1 : Apply the summon success chance found in the list (otherwise get any monster from the db)
- * &2 : Apply a monster check level.
- * &4 : Selected monster should not be a boss type (except those from MOBG_Bloody_Dead_Branch)
- * &8 : Selected monster must have normal spawn.
- * &16: Selected monster should not be a plant type
+ * type: Where to fetch from (see enum e_random_monster)
+ * flag: Type of checks to apply (see enum e_random_monster_flags)
  * lv: Mob level to check against
  *------------------------------------------*/
-int mob_get_random_id(int type, int flag, int lv)
+int mob_get_random_id(int type, enum e_random_monster_flags flag, int lv)
 {
 	struct mob_db *mob;
 	int i = 0, mob_id = 0, rand = 0;
 	struct s_randomsummon_group *msummon = (struct s_randomsummon_group *)idb_get(mob_summon_db, type);
 	struct s_randomsummon_entry *entry = nullptr;
 
-	if (type == MOBG_Bloody_Dead_Branch)
-		flag &= ~4;
+	if (type == MOBG_Bloody_Dead_Branch && flag&RMF_MOB_NOT_BOSS)
+		flag = static_cast<e_random_monster_flags>(flag&~RMF_MOB_NOT_BOSS);
 	
 	if (!msummon) {
 		ShowError("mob_get_random_id: Invalid type (%d) of random monster.\n", type);
@@ -521,11 +513,11 @@ int mob_get_random_id(int type, int flag, int lv)
 	} while ((rand == 0 || // Skip default first
 		mob == nullptr ||
 		mob_is_clone(mob_id) ||
-		(flag&0x01 && (entry->rate < 1000000 && entry->rate <= rnd() % 1000000)) ||
-		(flag&0x02 && lv < mob->lv) ||
-		(flag&0x04 && status_has_mode(&mob->status,MD_STATUS_IMMUNE) ) ||
-		(flag&0x08 && !mob_has_spawn(mob_id)) ||
-		(flag&0x10 && status_has_mode(&mob->status,MD_IGNOREMELEE|MD_IGNOREMAGIC|MD_IGNORERANGED|MD_IGNOREMISC) )
+		(flag&RMF_DB_RATE && (entry->rate < 1000000 && entry->rate <= rnd() % 1000000)) ||
+		(flag&RMF_CHECK_MOB_LV && lv < mob->lv) ||
+		(flag&RMF_MOB_NOT_BOSS && status_has_mode(&mob->status,MD_STATUS_IMMUNE) ) ||
+		(flag&RMF_MOB_NOT_SPAWN && !mob_has_spawn(mob_id)) ||
+		(flag&RMF_MOB_NOT_PLANT && status_has_mode(&mob->status,MD_IGNOREMELEE|MD_IGNOREMAGIC|MD_IGNORERANGED|MD_IGNOREMISC) )
 	) && (i++) < MAX_MOB_DB && msummon->count > 1);
 
 	if (i >= MAX_MOB_DB && &msummon->list[0]) {
@@ -678,7 +670,7 @@ int mob_once_spawn(struct map_session_data* sd, int16 m, int16 x, int16 y, const
 
 	for (count = 0; count < amount; count++)
 	{
-		int c = (mob_id >= 0) ? mob_id : mob_get_random_id(-mob_id - 1, (battle_config.random_monster_checklv) ? 3 : 1, lv);
+		int c = (mob_id >= 0) ? mob_id : mob_get_random_id(-mob_id - 1, (battle_config.random_monster_checklv) ? static_cast<e_random_monster_flags>(RMF_DB_RATE|RMF_CHECK_MOB_LV) : RMF_DB_RATE, lv);
 		md = mob_once_spawn_sub((sd) ? &sd->bl : NULL, m, x, y, mobname, c, event, size, ai);
 
 		if (!md)
@@ -843,7 +835,7 @@ int mob_spawn_guardian(const char* mapname, int16 x, int16 y, const char* mobnam
 	data.m = m;
 	data.num = 1;
 	if(mob_id<=0) {
-		mob_id = mob_get_random_id(-mob_id-1, 1, 99);
+		mob_id = mob_get_random_id(-mob_id-1, RMF_DB_RATE, 0);
 		if (!mob_id) return 0;
 	}
 
@@ -945,7 +937,7 @@ int mob_spawn_bg(const char* mapname, int16 x, int16 y, const char* mobname, int
 	data.num = 1;
 	if( mob_id <= 0 )
 	{
-		mob_id = mob_get_random_id(-mob_id-1,1,99);
+		mob_id = mob_get_random_id(-mob_id-1, RMF_DB_RATE, 0);
 		if( !mob_id ) return 0;
 	}
 
@@ -2969,7 +2961,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
 				(battle_config.taekwon_mission_mobname == 1 && mission_mdb && status_get_race2(&md->bl) == RC2_GOBLIN && mission_mdb->race2 == RC2_GOBLIN) ||
 				(battle_config.taekwon_mission_mobname == 2 && mob_is_samename(md, sd->mission_mobid)))
 			{ //TK_MISSION [Skotlex]
-				if (++(sd->mission_count) >= 100 && (temp = mob_get_random_id(MOBG_Branch_Of_Dead_Tree, 0xE, sd->status.base_level)))
+				if (++(sd->mission_count) >= 100 && (temp = mob_get_random_id(MOBG_Branch_Of_Dead_Tree, static_cast<e_random_monster_flags>(RMF_CHECK_MOB_LV|RMF_MOB_NOT_BOSS|RMF_MOB_NOT_SPAWN), sd->status.base_level)))
 				{
 					pc_addfame(sd, battle_config.fame_taekwon_mission);
 					sd->mission_mobid = temp;
@@ -5280,6 +5272,7 @@ static void mob_load(void)
 		sv_readdb(dbsubpath2, "mob_poring.txt", ',', 4, 4, -1, &mob_readdb_group, silent);
 		sv_readdb(dbsubpath2, "mob_boss.txt", ',', 4, 4, -1, &mob_readdb_group, silent);
 		sv_readdb(dbsubpath1, "mob_pouch.txt", ',', 4, 4, -1, &mob_readdb_group, silent);
+		sv_readdb(dbsubpath1, "mob_mission.txt", ',', 4, 4, -1, &mob_readdb_group, silent);
 		sv_readdb(dbsubpath1, "mob_classchange.txt", ',', 4, 4, -1, &mob_readdb_group, silent);
 		sv_readdb(dbsubpath2, "mob_drop.txt", ',', 3, 5, -1, &mob_readdb_drop, silent);
 		

+ 20 - 8
src/map/mob.hpp

@@ -101,13 +101,25 @@ enum size {
 	SZ_MAX
 };
 
-/// Used hardcoded Random Monster group in src
-enum e_Random_Monster {
-	MOBG_Branch_Of_Dead_Tree	= 0,
-	MOBG_Poring_Box				= 1,
-	MOBG_Bloody_Dead_Branch		= 2,
-	MOBG_Red_Pouch_Of_Surprise	= 3,
-	MOBG_ClassChange			= 4,
+/// Random Monster Groups
+enum e_random_monster : uint16 {
+	MOBG_Branch_Of_Dead_Tree = 0,
+	MOBG_Poring_Box,
+	MOBG_Bloody_Dead_Branch,
+	MOBG_Red_Pouch_Of_Surprise,
+	MOBG_ClassChange,
+	MOBG_Taekwon_Mission,
+};
+
+/// Random Monster Group Flags
+enum e_random_monster_flags {
+	RMF_NONE			= 0x00, ///< Apply no flags
+	RMF_DB_RATE			= 0x01, ///< Apply the summon success chance found in the list (otherwise get any monster from the db)
+	RMF_CHECK_MOB_LV	= 0x02, ///< Apply a monster level check
+	RMF_MOB_NOT_BOSS	= 0x04, ///< Selected monster should not be a Boss type (except those from MOBG_Bloody_Dead_Branch)
+	RMF_MOB_NOT_SPAWN	= 0x08, ///< Selected monster must have normal spawn
+	RMF_MOB_NOT_PLANT	= 0x10, ///< Selected monster should not be a Plant type
+	RMF_ALL				= 0xFF, ///< Apply all flags
 };
 
 struct mob_skill {
@@ -336,7 +348,7 @@ TIMER_FUNC(mob_timer_delete);
 int mob_deleteslave(struct mob_data *md);
 
 int mob_random_class (int *value, size_t count);
-int mob_get_random_id(int type, int flag, int lv);
+int mob_get_random_id(int type, enum e_random_monster_flags flag, int lv);
 int mob_class_change(struct mob_data *md,int mob_id);
 int mob_warpslave(struct block_list *bl, int range);
 int mob_linksearch(struct block_list *bl,va_list ap);

+ 1 - 0
src/map/script_constants.hpp

@@ -4416,6 +4416,7 @@
 	export_constant(MOBG_Bloody_Dead_Branch);
 	export_constant(MOBG_Red_Pouch_Of_Surprise);
 	export_constant(MOBG_ClassChange);
+	export_constant(MOBG_Taekwon_Mission);
 
 	/* Item Random Option Group */
 	export_constant(RDMOPTG_None);

+ 5 - 4
src/map/skill.cpp

@@ -2188,7 +2188,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
 		dstmd && !status_has_mode(tstatus,MD_STATUS_IMMUNE) &&
 		(rnd()%10000 < sd->bonus.classchange))
 	{
-		int class_ = mob_get_random_id(MOBG_Branch_Of_Dead_Tree, 1, 0);
+		int class_ = mob_get_random_id(MOBG_Branch_Of_Dead_Tree, RMF_DB_RATE, 0);
 		if (class_ != 0 && mobdb_checkid(class_))
 			mob_class_change(dstmd,class_);
 	}
@@ -6504,7 +6504,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				break;
 			}
-			class_ = (skill_id == SA_MONOCELL ? MOBID_PORING : mob_get_random_id(MOBG_ClassChange, 1, 0));
+			class_ = (skill_id == SA_MONOCELL ? MOBID_PORING : mob_get_random_id(MOBG_ClassChange, RMF_DB_RATE, 0));
 			clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
 			mob_class_change(dstmd,class_);
 			if( tsc && status_has_mode(&dstmd->status,MD_STATUS_IMMUNE) ) {
@@ -6894,13 +6894,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
 
 	case TK_MISSION:
 		if (sd) {
-			int id;
 			if (sd->mission_mobid && (sd->mission_count || rnd()%100)) { //Cannot change target when already have one
 				clif_mission_info(sd, sd->mission_mobid, sd->mission_count);
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				break;
 			}
-			id = mob_get_random_id(MOBG_Branch_Of_Dead_Tree,0xF, sd->status.base_level);
+
+			int id = mob_get_random_id(MOBG_Taekwon_Mission, RMF_NONE, 0);
+
 			if (!id) {
 				clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
 				break;