Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 38.46 KB | None | 0 0
  1. #include "inc_char_token"
  2. #include "inc_summon_comps"
  3. #include "inc_summon_theme"
  4. #include "inc_summon_disco"
  5. #include "inc_summon_pproc"
  6. #include "inc_domains_new"
  7. #include "inc_vfx_eyes"
  8. #include "inc_itemgenesis"
  9.  
  10. const int SPELL_SCHOOL_NO_MULTISUMMON = 20000;
  11. const int SPELL_SCHOOL_IGNORE_HD = 20001;
  12.  
  13. string GetInnateTheme(object oPC);
  14. int ApplySummonModifier(int nSpellID, int nSpellModifier);
  15.  
  16. // Process the Special Effects / Name change for the War Summoning Theme.
  17. void EFUSummon_ProcessWar(object oSummon);
  18.  
  19. //Get Female War Theme Name
  20. string GetFemaleWarName();
  21.  
  22. //Get Male War Theme Name
  23. string GetMaleWarName();
  24.  
  25. //War Summon Titan Name Database
  26. string GetTitanWarName();
  27.  
  28. // Implements summoning as per EfU conventions. Do not summon creatures directly
  29. // unless you are sure of what you are doing.
  30. // Created by Johannes.
  31. void EFUSummon(effect eSummon, location lLocation, float fDuration, object oPC=OBJECT_SELF, int nSpellSchool=SPELL_SCHOOL_CONJURATION, int bNoMultisummon=FALSE, int nPostprocessingInstruction=0, float fSummonCustomChallengeRating=-1.0f, int bIgnoreSummonHD=FALSE);
  32.  
  33. int EFUSummon_GetMaxSummonHD(object oPC)
  34. {
  35. int nMaxHD = 0;
  36. nMaxHD += GetLevelByClass(CLASS_TYPE_BARD, oPC);
  37. nMaxHD += 2 * GetLevelByClass(CLASS_TYPE_CLERIC, oPC);
  38. nMaxHD += 2 * GetLevelByClass(CLASS_TYPE_DRUID, oPC);
  39. nMaxHD += GetLevelByClass(CLASS_TYPE_PALADIN, oPC);
  40. nMaxHD += GetLevelByClass(CLASS_TYPE_PALEMASTER, oPC);
  41. nMaxHD += GetLevelByClass(CLASS_TYPE_RANGER, oPC);
  42. nMaxHD += 2 * GetLevelByClass(CLASS_TYPE_SORCERER, oPC);
  43. nMaxHD += 2 * GetLevelByClass(CLASS_TYPE_WIZARD, oPC);
  44. nMaxHD += GetTokenInt(oPC,"nSummonBonus");
  45. //Channeler
  46. if (GetTokenInt(oPC,"bFeat_Channeler") == 1) nMaxHD += 5;
  47. nMaxHD *= 1; // May change this later as necessary.
  48.  
  49. return nMaxHD;
  50. }
  51.  
  52.  
  53. int EFUSummon_GetGreaterSpellFocusFeatFromSpellSchool(int nSpellSchool)
  54. {
  55. int nFeat;
  56. switch (nSpellSchool)
  57. {
  58. case SPELL_SCHOOL_ABJURATION:
  59. nFeat = FEAT_GREATER_SPELL_FOCUS_ABJURATION;
  60. break;
  61. case SPELL_SCHOOL_DIVINATION:
  62. nFeat = FEAT_GREATER_SPELL_FOCUS_DIVINATION;
  63. break;
  64. case SPELL_SCHOOL_ENCHANTMENT:
  65. nFeat = FEAT_GREATER_SPELL_FOCUS_ENCHANTMENT;
  66. break;
  67. case SPELL_SCHOOL_EVOCATION:
  68. nFeat = FEAT_GREATER_SPELL_FOCUS_EVOCATION;
  69. break;
  70. case SPELL_SCHOOL_ILLUSION:
  71. nFeat = FEAT_GREATER_SPELL_FOCUS_ILLUSION;
  72. break;
  73. case SPELL_SCHOOL_NECROMANCY:
  74. nFeat = FEAT_GREATER_SPELL_FOCUS_NECROMANCY;
  75. break;
  76. case SPELL_SCHOOL_TRANSMUTATION:
  77. nFeat = FEAT_GREATER_SPELL_FOCUS_TRANSMUTATION;
  78. break;
  79. default:
  80. nFeat = FEAT_GREATER_SPELL_FOCUS_CONJURATION;
  81. }
  82. return nFeat;
  83. }
  84.  
  85. int EFUSummon_GetSpellFocusFeatFromSpellSchool(int nSpellSchool)
  86. {
  87. int nFeat;
  88. switch (nSpellSchool)
  89. {
  90. case SPELL_SCHOOL_ABJURATION:
  91. nFeat = FEAT_SPELL_FOCUS_ABJURATION;
  92. break;
  93. case SPELL_SCHOOL_DIVINATION:
  94. nFeat = FEAT_SPELL_FOCUS_DIVINATION;
  95. break;
  96. case SPELL_SCHOOL_ENCHANTMENT:
  97. nFeat = FEAT_SPELL_FOCUS_ENCHANTMENT;
  98. break;
  99. case SPELL_SCHOOL_EVOCATION:
  100. nFeat = FEAT_SPELL_FOCUS_EVOCATION;
  101. break;
  102. case SPELL_SCHOOL_ILLUSION:
  103. nFeat = FEAT_SPELL_FOCUS_ILLUSION;
  104. break;
  105. case SPELL_SCHOOL_NECROMANCY:
  106. nFeat = FEAT_SPELL_FOCUS_NECROMANCY;
  107. break;
  108. case SPELL_SCHOOL_TRANSMUTATION:
  109. nFeat = FEAT_SPELL_FOCUS_TRANSMUTATION;
  110. break;
  111. default:
  112. nFeat = FEAT_SPELL_FOCUS_CONJURATION;
  113. }
  114. return nFeat;
  115. }
  116.  
  117. // Okay. We're not REALLY using HitDie. In actuality we are taking the challenge
  118. // rating and modifying it depending on the summoner's feats/classes.
  119. float EFUSummon_GetSummonHD(object oSummon, object oMaster)
  120. {
  121. float fMultiplier = 1.0;
  122. float fHD = IntToFloat(GetLocalInt(oSummon, "nSummonCost"))/10.0;
  123. if (fHD < 1.0) fHD = GetChallengeRating(oSummon);
  124. if (fHD <= 1.0) fHD = GetChallengeRating(oSummon);
  125. fHD = fHD < 1.0 ? 1.0 : fHD;
  126. int nSpellSchool = GetLocalInt(oSummon, "nSummonSpellSchool");
  127.  
  128. if (GetHasFeat(EFUSummon_GetGreaterSpellFocusFeatFromSpellSchool(nSpellSchool), oMaster))
  129. {
  130. fMultiplier -= 0.25;
  131. }
  132.  
  133. if (GetHasFeat(EFUSummon_GetSpellFocusFeatFromSpellSchool(nSpellSchool), oMaster))
  134. {
  135. fMultiplier -= 0.25;
  136. }
  137.  
  138. //if (nSpellSchool == SPELL_SCHOOL_NECROMANCY && GetLevelByClass(CLASS_TYPE_PALE_MASTER, oMaster) > 0)
  139. //{
  140. // fMultiplier -= 0.25;
  141. //}
  142.  
  143. fHD *= fMultiplier;
  144.  
  145. //Negation if it is a summoned animal companion.
  146. if(GetLocalInt(oSummon, "bAnimalCompanion"))
  147. {
  148. fHD = 0.0;
  149. }
  150.  
  151. return fHD;
  152. }
  153.  
  154. int EFUSummon_GetSummonSpellSchool(object oSummon)
  155. {
  156. int nSpellSchool = GetLocalInt(oSummon, "nSummonSpellSchool");
  157. return nSpellSchool;
  158. }
  159.  
  160. int EFUSummon_GetSummonSpellSchoolFromMaster(object oMaster)
  161. {
  162. int nSpellSchool = GetLocalInt(oMaster, "nLastSummonSpellSchool");
  163. DeleteLocalInt(oMaster, "nLastSummonSpellSchool");
  164. return nSpellSchool;
  165. }
  166.  
  167. void EFUSummon_ForceUnsummon(object oSummon)
  168. {
  169. if(GetTag(oSummon) == "aniweapon001")
  170. {
  171. object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oSummon);
  172. if(GetLocalInt(oWeapon, "bShelgarnDrop"))
  173. CopyObject(oWeapon, GetLocation(oSummon), OBJECT_INVALID, GetTag(oWeapon));
  174. }
  175. AssignCommand(oSummon, SetIsDestroyable(TRUE, FALSE, FALSE));
  176.  
  177. ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), GetLocation(oSummon));
  178. DestroyObject(oSummon, 0.0);
  179. return;
  180. }
  181.  
  182. void EFUSummon_ForceHostile(object oSummon, object oMaster)
  183. {
  184. AssignCommand(oSummon, SetIsDestroyable(TRUE, FALSE, FALSE));
  185. string sResRef = GetResRef(oSummon);
  186. location lSummon = GetLocation(oSummon);
  187. DestroyObject(oSummon, 0.0);
  188. oSummon = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lSummon);
  189. AssignCommand(oSummon, ActionAttack(oMaster, TRUE));
  190. ChangeToStandardFaction(oSummon, STANDARD_FACTION_HOSTILE);
  191. effect eEffect = EffectVisualEffect(VFX_IMP_UNSUMMON);
  192. DelayCommand(160.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oSummon));
  193.  
  194. DestroyObject(oSummon, 160.3);
  195. }
  196.  
  197. float EFUSummon_CountSummonHD(object oMaster)
  198. {
  199. int n = 1;
  200. float fMyHD, fNetHD = 0.0;
  201. object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster, n++);
  202. while(GetIsObjectValid(oSummon))
  203. {
  204. fMyHD = EFUSummon_GetSummonHD(oSummon, oMaster);
  205. if (EFUSummon_GetSummonSpellSchool(oSummon) == SPELL_SCHOOL_NO_MULTISUMMON && !GetLocalInt(oSummon, "bAnimalCompanion")) EFUSummon_ForceUnsummon(oSummon);
  206. else fNetHD += fMyHD;
  207. oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster, n++);
  208. }
  209.  
  210. // Cruzel additions for undead Henchmen. Same as above, but for Henchman. Ignores non-animated Hench.
  211. n = 1;
  212. oSummon = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oMaster, n++);
  213. while(GetIsObjectValid(oSummon))
  214. {
  215. if (GetLocalInt(oSummon, "nDismissable") == 1) // Make sure they're a proper corpse flagged by animating
  216. {
  217. fMyHD = EFUSummon_GetSummonHD(oSummon, oMaster);
  218. if (EFUSummon_GetSummonSpellSchool(oSummon) == SPELL_SCHOOL_NO_MULTISUMMON && !GetLocalInt(oSummon, "bAnimalCompanion")) EFUSummon_ForceUnsummon(oSummon);
  219. else fNetHD += fMyHD;
  220. oSummon = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oMaster, n++);
  221. }
  222. }
  223. // End of Cruzel Additions
  224.  
  225.  
  226.  
  227. return fNetHD;
  228. }
  229.  
  230. void EFUSummon(effect eSummon, location lLocation, float fDuration, object oPC=OBJECT_SELF, int nSpellSchool=SPELL_SCHOOL_CONJURATION, int bNoMultisummon=FALSE, int nPostprocessingInstruction=0, float fSummonCustomChallengeRating = -1.0f, int bIgnoreSummonHD=FALSE)
  231. {
  232. if ((GetIsPC(oPC) || GetLocalInt(oPC, "bMultisummon")) && !bNoMultisummon)
  233. {
  234. int n = 1;
  235. object oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC, n++);
  236. while(GetIsObjectValid(oSummon))
  237. {
  238. AssignCommand(oSummon, SetIsDestroyable(FALSE, FALSE, FALSE));
  239. AssignCommand(oSummon, DelayCommand(0.3, SetIsDestroyable(TRUE, FALSE, FALSE)));
  240. oSummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oPC, n++);
  241. }
  242. nSpellSchool = (bIgnoreSummonHD == FALSE) ? nSpellSchool : SPELL_SCHOOL_IGNORE_HD; // Indicates whether we are using an HD limit or not
  243. SetLocalInt(oPC, "nLastSummonSpellSchool", nSpellSchool);
  244. }
  245. else
  246. {
  247. // This is going to indicate that our summon does not support multisummoning
  248. SetLocalInt(oPC, "nLastSummonSpellSchool", SPELL_SCHOOL_NO_MULTISUMMON);
  249. }
  250. // If no duration, assume the duration is permanent
  251. int nDurationType = DURATION_TYPE_TEMPORARY;
  252. if (fDuration <= 0.0)
  253. {
  254. fDuration = 0.0;
  255. nDurationType = DURATION_TYPE_PERMANENT;
  256. eSummon = SupernaturalEffect(eSummon);
  257. }
  258. if (fSummonCustomChallengeRating >= 1.0f) nPostprocessingInstruction = PROCESS_SUMMON_BASE_CRCONTROL + FloatToInt(fSummonCustomChallengeRating);
  259. PrepareSummonForProcessing(oPC, nPostprocessingInstruction);
  260. AssignCommand(oPC, ApplyEffectAtLocation(nDurationType, ExtraordinaryEffect(eSummon), lLocation, fDuration));
  261.  
  262. return;
  263. }
  264.  
  265. void EFUSummon_ProcessWar(object oSummon)
  266. {
  267. string sTag = GetTag(oSummon);
  268. object oMaster = GetMaster(oSummon);
  269. effect eVis;
  270. effect eSmoke;
  271. SetLocalInt(oSummon,"nWeaponBonus",1);
  272. object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST,oSummon);
  273. object oHelm = GetItemInSlot(INVENTORY_SLOT_HEAD,oSummon);
  274. int iAppr = 0;
  275.  
  276. if(GetAlignmentGoodEvil(oMaster) == ALIGNMENT_EVIL)
  277. { eVis = EffectRedEyes(oSummon);
  278. oArmor = GenerateTargusColorTemplate(oArmor);
  279. iAppr = APPEARANCE_TYPE_GIANT_FIRE;
  280. if(GetIsObjectValid(oHelm) == TRUE) oHelm = GenerateTargusColorTemplate(oHelm);
  281. }
  282. else if(GetAlignmentGoodEvil(oMaster) == ALIGNMENT_GOOD)
  283. { eVis = EffectWhiteEyes(oSummon); }
  284. else if(GetAlignmentGoodEvil(oMaster) == ALIGNMENT_NEUTRAL)
  285. {
  286. if (GetStringLowerCase(GetDeity(oMaster)) == "tempus")
  287. { eVis = EffectWhiteEyes(oSummon); }
  288. else if (GetStringLowerCase(GetDeity(oMaster)) == "garagos")
  289. { eVis = EffectRedEyes(oSummon);
  290. iAppr = APPEARANCE_TYPE_GIANT_FIRE;
  291. oArmor = GenerateTargusColorTemplate(oArmor);
  292. if(GetIsObjectValid(oHelm) == TRUE) oHelm = GenerateTargusColorTemplate(oHelm);
  293. }
  294. else if (GetStringLowerCase(GetDeity(oMaster)) == "targus")
  295. { eVis = EffectRedEyes(oSummon);
  296. iAppr = APPEARANCE_TYPE_GIANT_FIRE;
  297. oArmor = GenerateTargusColorTemplate(oArmor);
  298. if(GetIsObjectValid(oHelm) == TRUE) oHelm = GenerateTargusColorTemplate(oHelm);
  299. }
  300. else
  301. { eVis = EffectWhiteEyes(oSummon); }
  302. }
  303.  
  304. eSmoke = EffectVisualEffect(VFX_DUR_GHOST_SMOKE_2);
  305. eSmoke = SupernaturalEffect(eSmoke);
  306. eVis = SupernaturalEffect(eVis);
  307. SetDroppableFlag(oArmor,FALSE);
  308. if(GetIsObjectValid(oHelm) == TRUE)
  309. {
  310. SetDroppableFlag(oHelm,FALSE);
  311. AssignCommand(oSummon,ActionEquipItem(oHelm,INVENTORY_SLOT_HEAD));
  312. }
  313. AssignCommand(oSummon,ActionEquipItem(oArmor,INVENTORY_SLOT_CHEST));
  314. string sName = GetName(oSummon);
  315.  
  316. if(sTag == "sum_war_1")
  317. {
  318. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oSummon);
  319. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  320. GenerateWeapon(oSummon,"normal",1);
  321. SetName(oSummon,GetMaleWarName() + " the " + sName);
  322. }
  323. else if(sTag == "sum_war_2")
  324. {
  325. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oSummon);
  326. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  327. SetName(oSummon,GetMaleWarName() + " the " + sName);
  328. }
  329. else if(sTag == "sum_war_3")
  330. {
  331. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oSummon);
  332. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  333. GenerateWeapon(oSummon,"normal",0);
  334. SetName(oSummon,GetMaleWarName() + " the " + sName);
  335. }
  336. else if(sTag == "sum_war_4")
  337. {
  338. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oSummon);
  339. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  340. GenerateWeapon(oSummon,"normal",1);
  341. SetName(oSummon,GetFemaleWarName() + " the " + sName);
  342. }
  343. else if(sTag == "sum_war_5")
  344. {
  345. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oSummon);
  346. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  347. SetLocalInt(oSummon,"nWeaponBonus",2);
  348. GenerateWeapon(oSummon,"normal",1);
  349. SetName(oSummon,GetMaleWarName() + " the " + sName);
  350. }
  351. else if(sTag == "sum_war_6")
  352. {
  353. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  354. SetName(oSummon,GetTitanWarName() + " the " + sName);
  355. if(iAppr != 0)
  356. {
  357. SetCreatureAppearanceType(oSummon,iAppr);
  358. SetPortraitId(oSummon,215);
  359. }
  360. }
  361. else if(sTag == "sum_war_7")
  362. {
  363. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  364. SetName(oSummon,GetTitanWarName() + " the " + sName);
  365. if(iAppr != 0)
  366. {
  367. SetCreatureAppearanceType(oSummon,iAppr);
  368. SetPortraitId(oSummon,215);
  369. }
  370. }
  371. else if(sTag == "sum_war_8")
  372. {
  373. ApplyEffectToObject(DURATION_TYPE_PERMANENT, eSmoke, oSummon);
  374. SetName(oSummon,GetTitanWarName() + " the " + sName);
  375. if(iAppr != 0)
  376. {
  377. SetCreatureAppearanceType(oSummon,iAppr);
  378. SetPortraitId(oSummon,215);
  379. }
  380. }
  381. }
  382.  
  383. // Cruzel : New wrapper function for Johannes' code below. This allows us to call it in the animate dead and player tools
  384. // w/o triggering the processing functions more than once.
  385.  
  386. void HandleOverSpawn(object oSummon, int nSpellSchool=-1)
  387. {
  388. object oMaster = GetMaster(oSummon);
  389.  
  390. if (nSpellSchool != SPELL_SCHOOL_NO_MULTISUMMON && nSpellSchool != SPELL_SCHOOL_IGNORE_HD)
  391. {
  392. float fMaxHD = IntToFloat(EFUSummon_GetMaxSummonHD(oMaster));
  393. float fNetHD = EFUSummon_CountSummonHD(oMaster);
  394. float fMyHD = EFUSummon_GetSummonHD(oSummon, oMaster);
  395. if (GetIsPC(oMaster) == FALSE) fMaxHD = 1500.0;
  396. if (GetIsPC(oMaster) == TRUE && GetIsDM(oMaster) == TRUE) fMaxHD = 1500.0;
  397. if (GetIsPC(oMaster) == TRUE && GetIsDMPossessed(oMaster) == TRUE) fMaxHD = 1500.0;
  398. if (fNetHD > fMaxHD)
  399. {
  400. fNetHD -= fMyHD;
  401. SendMessageToPC(oMaster, "You have "+IntToString(FloatToInt(10.0*fNetHD))+" of "+IntToString(FloatToInt(10.0*fMaxHD))+" maintainable summoning points and are attempting to summon '"+GetName(oSummon)+"' worth "+IntToString(FloatToInt(10.0*fMyHD))+" summoning points. You are unable to control this summoned creature.");
  402.  
  403. if (nSpellSchool != -100) // Handle for undead claim tool. -100 should only be a thing if reclaiming.
  404. {
  405. SendMessageToPC(oMaster, "Unable to control your summon, it breaks free of your bonds and leaps back into the ether...");
  406. ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), GetLocation(oSummon));
  407. DestroyObject(oSummon, 0.5);
  408. }
  409.  
  410. // Johannes: Summons no longer become hostile if uncontrollable.
  411. // EFUSummon_ForceHostile(oSummon, oMaster);
  412. }
  413. else
  414. {
  415. SendMessageToPC(oMaster, "You have "+IntToString(FloatToInt(10.0*fNetHD))+" of "+IntToString(FloatToInt(10.0*fMaxHD))+" maintainable summoning points.");
  416. }
  417. }
  418. else if (nSpellSchool != SPELL_SCHOOL_IGNORE_HD)
  419. {// No multisummoning, so clear the party of unwanted summons.
  420. int n = 1;
  421. object oPartySummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster, n++);
  422. while(GetIsObjectValid(oPartySummon))
  423. {
  424. if (oSummon != oPartySummon && !GetLocalInt(oSummon, "bAnimalCompanion")) EFUSummon_ForceUnsummon(oPartySummon);
  425. oPartySummon = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oMaster, n++);
  426. }
  427. // Cruzel Additions to make it unsummon corpses, but will not unsummon DM granted Henchmen or special minions:
  428. n = 1;
  429. oPartySummon = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oMaster, n++);
  430. while(GetIsObjectValid(oPartySummon))
  431. {
  432. if (GetLocalInt(oPartySummon, "nDismissable") == 1)
  433. {
  434. ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_UNSUMMON), GetLocation(oPartySummon), 4.0f);
  435. DestroyObject(oPartySummon);
  436. }
  437. oPartySummon = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oMaster, n++);
  438. }
  439. // End of Cruzel Additions
  440. }
  441.  
  442. }
  443. // Johannes: Bit of a hack-job on my part. Essentially adds a spell school
  444. // variable to the summoned creature OnSpawn, and at the same time creates
  445. // any reaction to oversummoning of creatures if appropriate.
  446.  
  447. // Cruzel : Cut out the over summoning function and wrapped it above.
  448. void EFUSummon_HandleOnSpawn(object oSummon)
  449. {
  450. if (GetAssociateType(oSummon) != ASSOCIATE_TYPE_SUMMONED ) return;
  451. object oMaster = GetMaster(oSummon); int nSpellSchool;
  452.  
  453. // Process the summon as necessary.
  454. ProcessSummon(oMaster, oSummon);
  455.  
  456. if ((nSpellSchool=EFUSummon_GetSummonSpellSchoolFromMaster(oMaster))!=0)
  457. {
  458. SetLocalInt(oSummon, "nSummonSpellSchool", nSpellSchool);
  459. }
  460.  
  461. // Cruzel Change : Wrapped below function
  462. HandleOverSpawn(oSummon, nSpellSchool);
  463.  
  464. return;
  465. }
  466.  
  467. effect GetSummonEffect(object oPC, int nSpellID){
  468. string sActiveTheme = "";
  469. int nSpellModifier = 0;
  470.  
  471. // Caster item theme override
  472. object oItem = GetSpellCastItem();
  473. if(oItem != OBJECT_INVALID){
  474. if(GetLocalString(oItem, "Summoning_Theme") != ""){
  475. sActiveTheme = GetLocalString(oItem, "Summoning_Theme");
  476. nSpellModifier = GetLocalInt(oItem, "Summoning_Modifier");
  477. }
  478. }
  479.  
  480. /* --- Get the Active Theme and Spell Level Modifier --- */
  481. object oReagent = GetLocalObject(oPC, "Summon_Chosen_Reagent");
  482. string sSingle = GetTokenString(oPC, "Summon_Chosen_Single");
  483. string sTome = GetTokenString(oPC, "Summon_Chosen_Tome");
  484.  
  485. // Reagents are checked first...
  486. if(sActiveTheme == "" && oReagent != OBJECT_INVALID){
  487. SetLocalObject(oPC, "Summon_Chosen_Reagent", OBJECT_INVALID);
  488. if(GetItemPossessor(oReagent) == oPC){
  489. sActiveTheme = GetSummonTheme(oReagent);
  490. nSpellModifier = GetSummonModifier(oReagent);
  491. if(sActiveTheme != "")
  492. DestroyObject(oReagent);
  493. else
  494. SendMessageToPC(oPC, "The chosen reagent does nothing.");
  495. }
  496. }
  497.  
  498. // ...followed by the single-shot theme...
  499. if(sActiveTheme == "" && sSingle != ""){
  500. sActiveTheme = sSingle;
  501. SetTokenString(oPC, "Summon_Chosen_Single", "");
  502. }
  503.  
  504. // ...followed by the active tome theme...
  505. if(sActiveTheme == "" && sTome != ""){
  506. object oTome = GetItemPossessedBy(oPC, sTome);
  507. if(oTome == OBJECT_INVALID){
  508. SetTokenString(oPC, "Summon_Chosen_Tome", "");
  509. }else{
  510. sActiveTheme = GetSummonTheme(oTome);
  511. nSpellModifier = GetSummonModifier(oTome);
  512. }
  513. }
  514.  
  515. // ...followed by the default theme overrides...
  516. if(sActiveTheme == ""){
  517. if(GetIsPC(oPC) && !GetIsDMPossessed(oPC)){
  518. sActiveTheme = GetTokenString(oPC, "Summon_Chosen_Permanent");
  519. }else{
  520. sActiveTheme = GetLocalString(oPC, "Summoning_Theme");
  521. nSpellModifier = GetLocalInt(oPC, "Summoning_Modifier");
  522. }
  523. }
  524.  
  525. //.. followed by a bonus for being in a summoning circle...
  526. object oSummonCircle = GetFirstObjectInShape(SHAPE_SPHERE, 4.0, GetLocation(oPC), FALSE, OBJECT_TYPE_PLACEABLE);
  527. while(GetIsObjectValid(oSummonCircle)) {
  528. if(GetTag(oSummonCircle) == "summon_circle") {
  529. SendMessageToPC(oPC, "Your summon is empowered by a nearby summoning circle!");
  530. nSpellModifier ++;
  531. break;
  532. }
  533. else{
  534. }
  535. oSummonCircle = GetNextObjectInShape(SHAPE_SPHERE, 4.0, GetLocation(oPC), FALSE, OBJECT_TYPE_PLACEABLE);
  536. }
  537.  
  538. // ...followed by the default/innate theme.
  539. if(sActiveTheme == "") {
  540. sActiveTheme = GetInnateTheme(oPC);
  541. }
  542.  
  543. // Animal Domain gives improved summoning
  544. // NOTE: Animal Domain will work for the default theme.
  545. // It will not work for any other summoning theme.
  546. // in order to add additional themes, add to the next line of script '|| sActivityTheme == <THEME>' for example, adding "Monkey" like so:
  547. // if((sActiveTheme == "" || sActiveTheme == "Default" || sActiveTheme == "Dog" || sActiveTheme == "Monkey")
  548. if((sActiveTheme == "" || sActiveTheme == "Default" || sActiveTheme == "Dog")
  549. && GetHasFeat(FEAT_ANIMAL_DOMAIN_POWER, oPC) && !GetHasFeat(FEAT_PLANT_DOMAIN_POWER, oPC)) {
  550. nSpellModifier += 1;
  551. }
  552.  
  553. nSpellID = ApplySummonModifier(nSpellID, nSpellModifier);
  554.  
  555. if (sActiveTheme == "Default") return GetEffect_Default(nSpellID);
  556. else if(sActiveTheme == "Aberration")return GetEffect_Aberration(nSpellID);
  557. else if(sActiveTheme == "Beholder") return GetEffect_Beholder(nSpellID);
  558. else if(sActiveTheme == "Spider") return GetEffect_Spider(nSpellID);
  559. else if(sActiveTheme == "Light") return GetEffect_Light(nSpellID);
  560. else if(sActiveTheme == "Spirits") return GetEffect_Spirit(nSpellID);
  561. else if(sActiveTheme == "Earth2") return GetEffect_Earth2(nSpellID);
  562. else if(sActiveTheme == "Rats") return GetEffect_Rats(nSpellID);
  563. else if(sActiveTheme == "Illusion") return GetEffect_Illusion(nSpellID);
  564. else if(sActiveTheme == "Slaadi") return GetEffect_Slaad(nSpellID);
  565. else if(sActiveTheme == "Slimes") return GetEffect_Slime(nSpellID);
  566. else if(sActiveTheme == "Demons") return GetEffect_Demon(nSpellID);
  567. else if(sActiveTheme == "Devils") return GetEffect_Devil(nSpellID);
  568. else if(sActiveTheme == "Ark") return GetEffect_Ark(nSpellID);
  569. else if(sActiveTheme == "Plant") return GetEffect_Plant(nSpellID);
  570. else if(sActiveTheme == "Animated") return GetEffect_Animated(nSpellID);
  571. else if(sActiveTheme == "War") return GetEffect_War(nSpellID);
  572. else if(sActiveTheme == "Crystal") return GetEffect_Crystal(nSpellID);
  573. else if(sActiveTheme == "Law") return GetEffect_Law(nSpellID);
  574. else if(sActiveTheme == "Shadow") return GetEffect_Shadow(nSpellID);
  575. else if(sActiveTheme == "Astral") return GetEffect_Astral(nSpellID);
  576. else if(sActiveTheme == "ForgottenSpirits") return GetEffect_ForgottenSpirits(nSpellID);
  577. else if(sActiveTheme == "Dog") return GetEffect_Dog(nSpellID);
  578. else if(sActiveTheme == "Chitinoid") return GetEffect_Chitinoid(nSpellID);
  579. else if(GetIsDiscountTheme(sActiveTheme)){
  580. return GetEffect_Discount(nSpellID, sActiveTheme, oPC);
  581. }else if(GetStringLeft(sActiveTheme, 7) == "Special"){
  582. return GetEffect_Special(nSpellID, StringToInt(GetStringRight(sActiveTheme, GetStringLength(sActiveTheme) - 7)));
  583. }else
  584. return GetEffect_Default(nSpellID);
  585. }
  586.  
  587. string GetInnateTheme(object oPC) {
  588. if(GetHasFeat(FEAT_PLANT_DOMAIN_POWER,oPC)) return "Plant";
  589. if(GetHasFeat(FEAT_WATER_DOMAIN_POWER, oPC)) return "Water";
  590. if(GetHasFeat(FEAT_AIR_DOMAIN_POWER, oPC)) return "Air";
  591. if(GetHasFeat(FEAT_FIRE_DOMAIN_POWER, oPC)) return "Fire";
  592. if(GetHasFeat(FEAT_EARTH_DOMAIN_POWER, oPC)) return "Earth";
  593.  
  594. if(GetHasFeat(FEAT_OOZE_DOMAIN_POWER, oPC)) return "Slimes";
  595. if(GetHasFeat(FEAT_SPIDER_DOMAIN_POWER, oPC)) return "Spider";
  596. if(GetHasFeat(FEAT_UNDEATH_DOMAIN_POWER, oPC)) return "Spirits";
  597. if(GetHasFeat(FEAT_ILLUSION_DOMAIN_POWER, oPC)) return "Illusion";
  598. if(GetHasFeat(FEAT_DARKNESS_DOMAIN_POWER, oPC)) return "Shadow";
  599. if (GetHasFeat(FEAT_GOOD_DOMAIN_POWER, oPC)) return "Light";
  600. if (GetDeity(oPC) == "Orcus") return "Demons";
  601. if ((GetDeity(oPC) == "Ithikraszt") ||
  602. (GetDeity(oPC) == "Gargauth")) return "Devils";
  603. if(GetTokenString(oPC, "sWatcher_Role") == "ForgottenCircle") return "ForgottenSpirits";
  604.  
  605.  
  606. return "";
  607. }
  608.  
  609. // Utility Function
  610. int ApplySummonModifier(int nSpellID, int nSpellModifier){
  611. if(nSpellModifier == 0){
  612. return nSpellID;
  613. }else if(nSpellModifier > 0){
  614. if(nSpellID == SPELL_SUMMON_CREATURE_IX)
  615. return SPELL_SUMMON_CREATURE_IX;
  616. else if(nSpellID == SPELL_SUMMON_CREATURE_VIII)
  617. return SPELL_SUMMON_CREATURE_IX;
  618. else if(nSpellID == SPELL_SUMMON_CREATURE_VII)
  619. return ApplySummonModifier(SPELL_SUMMON_CREATURE_VIII, nSpellModifier-1);
  620. else if(nSpellID == SPELL_SUMMON_CREATURE_VI)
  621. return ApplySummonModifier(SPELL_SUMMON_CREATURE_VII, nSpellModifier-1);
  622. else if(nSpellID == SPELL_SUMMON_CREATURE_V)
  623. return ApplySummonModifier(SPELL_SUMMON_CREATURE_VI, nSpellModifier-1);
  624. else if(nSpellID == SPELL_SUMMON_CREATURE_IV)
  625. return ApplySummonModifier(SPELL_SUMMON_CREATURE_V, nSpellModifier-1);
  626. else if(nSpellID == SPELL_SUMMON_CREATURE_III)
  627. return ApplySummonModifier(SPELL_SUMMON_CREATURE_IV, nSpellModifier-1);
  628. else if(nSpellID == SPELL_SUMMON_CREATURE_II)
  629. return ApplySummonModifier(SPELL_SUMMON_CREATURE_III, nSpellModifier-1);
  630. else
  631. return ApplySummonModifier(SPELL_SUMMON_CREATURE_II, nSpellModifier-1);
  632. }else{
  633. if(nSpellID == SPELL_SUMMON_CREATURE_I)
  634. return SPELL_SUMMON_CREATURE_I;
  635. else if(nSpellID == SPELL_SUMMON_CREATURE_II)
  636. return SPELL_SUMMON_CREATURE_I;
  637. else if(nSpellID == SPELL_SUMMON_CREATURE_III)
  638. return ApplySummonModifier(SPELL_SUMMON_CREATURE_II, nSpellModifier+1);
  639. else if(nSpellID == SPELL_SUMMON_CREATURE_IV)
  640. return ApplySummonModifier(SPELL_SUMMON_CREATURE_III, nSpellModifier+1);
  641. else if(nSpellID == SPELL_SUMMON_CREATURE_V)
  642. return ApplySummonModifier(SPELL_SUMMON_CREATURE_IV, nSpellModifier+1);
  643. else if(nSpellID == SPELL_SUMMON_CREATURE_VI)
  644. return ApplySummonModifier(SPELL_SUMMON_CREATURE_V, nSpellModifier+1);
  645. else if(nSpellID == SPELL_SUMMON_CREATURE_VII)
  646. return ApplySummonModifier(SPELL_SUMMON_CREATURE_VI, nSpellModifier+1);
  647. else if(nSpellID == SPELL_SUMMON_CREATURE_VIII)
  648. return ApplySummonModifier(SPELL_SUMMON_CREATURE_VII, nSpellModifier+1);
  649. else
  650. return ApplySummonModifier(SPELL_SUMMON_CREATURE_VIII, nSpellModifier+1);
  651. }
  652. }
  653.  
  654. //War Summon Male Name Database
  655. string GetMaleWarName()
  656. {
  657. string sName;
  658. int n = Random(100);
  659. switch(n)
  660. {
  661. case 0: sName = "Brynjar";
  662. break;
  663. case 1: sName = "Baldur";
  664. break;
  665. case 2: sName = "Bjartur";
  666. break;
  667. case 3: sName = "Eirikur";
  668. case 4: sName = "Ari";break;
  669. case 5: sName = "Eyvindur";break;
  670. case 6: sName = "Fannar";break;
  671. case 7: sName = "Fridrik";break;
  672. case 8: sName = "Hakon";break;
  673. case 9: sName = "Hallbjorn";break;
  674. case 10: sName = "Halldor";break;
  675. case 11: sName = "Haraldur";break;
  676. case 12: sName = "Hinrik";break;
  677. case 13: sName = "Hjortur";break;
  678. case 14: sName = "Hraen";break;
  679. case 15: sName = "Hrafn";break;
  680. case 16: sName = "Jonas";break;
  681. case 17: sName = "Kristjan";break;
  682. case 18: sName = "Larus";break;
  683. case 19: sName = "Ludvik";break;
  684. case 20: sName = "Njala";break;
  685. case 21: sName = "Oskar";break;
  686. case 22: sName = "Petur";break;
  687. case 23: sName = "Sindri";break;
  688. case 24: sName = "Sverrir";break;
  689. case 25: sName = "Drauglur";break;
  690. case 26: sName = "Tryggvi";break;
  691. case 27: sName = "Vilhjalmur";break;
  692. case 28: sName = "Lugos";break;
  693. case 29: sName = "Lugus";break;
  694. case 30: sName = "Dwyn";break;
  695. case 31: sName = "Cernunnos";break;
  696. case 32: sName = "Belenos";break;
  697. case 33: sName = "Belenus";break;
  698. case 34: sName = "Taranis";break;
  699. case 35: sName = "Askr";break;
  700. case 36: sName = "Borghild";break;
  701. case 37: sName = "Brynhildr"; break;
  702. case 38: sName = "Freyr";break;
  703. case 39: sName = "Grimhildr";break;
  704. case 40: sName = "Gunnar";break;
  705. case 41: sName = "Gudrun";break;
  706. case 42: sName = "Gunnarr";break;
  707. case 43: sName = "Heidrun";break;
  708. case 44: sName = "Hel";break;
  709. case 45: sName = "Huld";break;
  710. case 46: sName = "Idun";break;
  711. case 47: sName = "Jarl";break;
  712. case 48: sName = "Njall";break;
  713. case 49: sName = "Njord";break;
  714. case 50: sName = "Njordr";break;
  715. case 51: sName = "Oden";break;
  716. case 52: sName = "Saga";break;
  717. case 53: sName = "Sigrun";break;
  718. case 54: sName = "Sigurd";break;
  719. case 55: sName = "Skadi";break;
  720. case 56: sName = "Skuld";break;
  721. case 57: sName = "Thorus";break;
  722. case 58: sName = "Vidarr";break;
  723. case 59: sName = "Volund";break;
  724. case 60: sName = "Yngvi";break;
  725. case 61: sName = "Wulfgor";break;
  726. case 62: sName = "Wulfgarr";break;
  727. case 63: sName = "Gorlf";break;
  728. case 64: sName = "Volos";break;
  729. case 65: sName = "Mokosh";break;
  730. case 66: sName = "Stribog";break;
  731. case 67: sName = "Svarog"; break;
  732. case 68: sName = "Dazhdbog"; break;
  733. case 69: sName = "Aedan";break;
  734. case 70: sName = "Aedh";break;
  735. case 71: sName = "Caderyn"; break;
  736. case 72: sName = "Caratacus"; break;
  737. case 73: sName = "Drest";break;
  738. case 74: sName = "Drust"; break;
  739. case 75: sName = "Faelan"; break;
  740. case 76: sName = "Eogan"; break;
  741. case 77: sName = "Iodocus"; break;
  742. case 78: sName = "Haerviu"; break;
  743. case 79: sName = "Jodocus"; break;
  744. case 80: sName = "Mael"; break;
  745. case 81: sName = "Maedoc"; break;
  746. case 82: sName = "Loeghair"; break;
  747. case 83: sName = "Morcant";break;
  748. case 84: sName = "Oengus"; break;
  749. case 85: sName = "Angus";break;
  750. case 86: sName = "Angmor"; break;
  751. case 87: sName = "Angmarr"; break;
  752. case 88: sName = "Roagam"; break;
  753. case 89: sName = "Riagan"; break;
  754. case 90: sName = "Mael"; break;
  755. case 91: sName = "Haerix"; break;
  756. case 92: sName = "Yorr"; break;
  757. case 93: sName = "Daerix"; break;
  758. case 94: sName = "Aenphar"; break;
  759. case 95: sName = "Moratorix"; break;
  760. case 96: sName = "Angmor"; break;
  761. case 97: sName = "Gorix";break;
  762. case 98: sName = "Goratorix"; break;
  763. case 99: sName = "Vercingetorix"; break;
  764. }
  765. return sName;
  766. }
  767.  
  768. //War Summon Titan Name Database
  769. string GetTitanWarName()
  770. {
  771. string sName;
  772. int n = Random(38);
  773. switch(n)
  774. {
  775. case 0: sName = "Jormungdar"; break;
  776. case 1: sName = "Odingar"; break;
  777. case 2: sName = "Graloq"; break;
  778. case 3: sName = "Bjorganum"; break;
  779. case 4: sName = "Haerakh"; break;
  780. case 5: sName = "Forakh"; break;
  781. case 6: sName = "Ghro"; break;
  782. case 7: sName = "Eross"; break;
  783. case 8: sName = "Zorakh"; break;
  784. case 9: sName = "Bodvar"; break;
  785. case 10: sName = "Loki"; break;
  786. case 11: sName = "Hodr"; break;
  787. case 12: sName = "Hoenir"; break;
  788. case 13: sName = "Lodurr"; break;
  789. case 14: sName = "Vali"; break;
  790. case 15: sName = "Vidarr"; break;
  791. case 16: sName = "Njorar"; break;
  792. case 17: sName = "Njor"; break;
  793. case 18: sName = "Delingr"; break;
  794. case 19: sName = "Heimdalar"; break;
  795. case 20: sName = "Freyr"; break;
  796. case 21: sName = "Glaur"; break;
  797. case 22: sName = "Jofurr"; break;
  798. case 23: sName = "Asgarr"; break;
  799. case 24: sName = "Marahk"; break;
  800. case 25: sName = "Ragnara"; break;
  801. case 26: sName = "Gnarok"; break;
  802. case 27: sName = "Eirek"; break;
  803. case 28: sName = "Hervarar"; break;
  804. case 29: sName = "Hrolf"; break;
  805. case 30: sName = "Sogubrot"; break;
  806. case 31: sName = "Slaug"; break;
  807. case 32: sName = "Sturlaugh"; break;
  808. case 33: sName = "Yngvar"; break;
  809. case 34: sName = "Volsungahr"; break;
  810. case 35: sName = "Ghautrek"; break;
  811. case 36: sName = "Gandar"; break;
  812. case 37: sName = "Gaendarr"; break;
  813.  
  814. }
  815. return sName;
  816. }
  817.  
  818.  
  819. //War Summon Female Name Database
  820. string GetFemaleWarName()
  821. {
  822. string sName;
  823. int n = Random(100);
  824. switch(n)
  825. {
  826. case 0: sName = "Anna"; break;
  827. case 1: sName = "Asdis"; break;
  828. case 2: sName = "Bjork"; break;
  829. case 3: sName = "Adalbjorg"; break;
  830. case 4: sName = "Elisabet"; break;
  831. case 5: sName = "Eydis"; break;
  832. case 6: sName = "Frida"; break;
  833. case 7: sName = "Fridrika"; break;
  834. case 8: sName = "Gudlaug"; break;
  835. case 9: sName = "Gudrun"; break;
  836. case 10: sName = "Halldora"; break;
  837. case 11: sName = "Hanna"; break;
  838. case 12: sName = "Hildur"; break;
  839. case 13: sName = "Hjordis"; break;
  840. case 14: sName = "Johanna"; break;
  841. case 15: sName = "Jona"; break;
  842. case 16: sName = "Kristin"; break;
  843. case 17: sName = "Kristjana"; break;
  844. case 18: sName = "Lara"; break;
  845. case 19: sName = "Lilja"; break;
  846. case 20: sName = "Maeja"; break;
  847. case 21: sName = "Margret"; break;
  848. case 22: sName = "Pala"; break;
  849. case 23: sName = "Ragnheidur"; break;
  850. case 24: sName = "Ragnhildur"; break;
  851. case 25: sName = "Svana"; break;
  852. case 26: sName = "Sveltlana"; break;
  853. case 27: sName = "Svanhildur"; break;
  854. case 28: sName = "Unnur"; break;
  855. case 29: sName = "Sjordana"; break;
  856. case 30: sName = "Agrona"; break;
  857. case 31: sName = "Agarna"; break;
  858. case 32: sName = "Asara"; break;
  859. case 33: sName = "Agahl"; break;
  860. case 34: sName = "Epona"; break;
  861. case 35: sName = "Isolda"; break;
  862. case 36: sName = "Freyja"; break;
  863. case 37: sName = "Eir"; break;
  864. case 38: sName = "Borghild"; break;
  865. case 39: sName = "Borghildr"; break;
  866. case 40: sName = "Grimhildr"; break;
  867. case 41: sName = "Hulda"; break;
  868. case 42: sName = "Silfa"; break;
  869. case 43: sName = "Silvana"; break;
  870. case 44: sName = "Sylka"; break;
  871. case 45: sName = "Sylkana"; break;
  872. case 46: sName = "Sylra"; break;
  873. case 47: sName = "Jahla"; break;
  874. case 48: sName = "Jahra"; break;
  875. case 49: sName = "Marana"; break;
  876. case 50: sName = "Skala"; break;
  877. case 51: sName = "Skasha"; break;
  878. case 52: sName = "Sorsha"; break;
  879. case 53: sName = "Vergana"; break;
  880. case 54: sName = "Morgana"; break;
  881. case 55: sName = "Siiwa"; break;
  882. case 56: sName = "Ziiva"; break;
  883. case 57: sName = "Boadecia"; break;
  884. case 58: sName = "Genovea"; break;
  885. case 59: sName = "Asa"; break;
  886. case 60: sName = "Arnbjorg";break;
  887. case 61: sName = "Brynja"; break;
  888. case 62: sName = "Bergljot"; break;
  889. case 63: sName = "Dagmaer"; break;
  890. case 64: sName = "Dagny"; break;
  891. case 65: sName = "Gudlaug"; break;
  892. case 66: sName = "Gunnvor"; break;
  893. case 67: sName = "Gunnbjorg"; break;
  894. case 68: sName = "Eydis"; break;
  895. case 69: sName = "Inga"; break;
  896. case 70: sName = "Ingibjorg"; break;
  897. case 71: sName = "Ingridr"; break;
  898. case 72: sName = "Idunn"; break;
  899. case 73: sName = "Jorunnr"; break;
  900. case 74: sName = "Myrgjol"; break;
  901. case 75: sName = "Hjordis"; break;
  902. case 76: sName = "Gyda"; break;
  903. case 77: sName = "Runa"; break;
  904. case 78: sName = "Rana"; break;
  905. case 79: sName = "Janah"; break;
  906. case 80: sName = "Sarahna"; break;
  907. case 81: sName = "Zalhana"; break;
  908. case 82: sName = "Gorhana";break;
  909. case 83: sName = "Morhana"; break;
  910. case 84: sName = "Ghaena"; break;
  911. case 85: sName = "Jaraha"; break;
  912. case 86: sName = "Faera"; break;
  913. case 87: sName = "Feaja"; break;
  914. case 88: sName = "Fioja"; break;
  915. case 89: sName = "Fiora"; break;
  916. case 90: sName = "Yiora"; break;
  917. case 91: sName = "Ilda"; break;
  918. case 92: sName = "Korja"; break;
  919. case 93: sName = "Syljarra"; break;
  920. case 94: sName = "Jaera"; break;
  921. case 95: sName = "Maeha"; break;
  922. case 96: sName = "Uldara";break;
  923. case 97: sName = "Qwara"; break;
  924. case 98: sName = "Lea"; break;
  925. case 99: sName = "Leara"; break;
  926. }
  927. return sName;
  928. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement