From 3c8bcba6b540f5cb84572994d9ec2426dd348a93 Mon Sep 17 00:00:00 2001 From: fusion32 Date: Thu, 5 Jun 2025 02:00:10 -0300 Subject: finish `magic.cc` --- reference/game.c | 1473 ------------------------------------------------------ 1 file changed, 1473 deletions(-) (limited to 'reference/game.c') diff --git a/reference/game.c b/reference/game.c index 0a5f3af..9fbabaf 100644 --- a/reference/game.c +++ b/reference/game.c @@ -20852,1479 +20852,6 @@ void __static_initialization_and_destruction_0(int __initialize_p,int __priority return; } -// MAGIC.CC - -void SpellFailed(ulong CreatureID) - -{ - TCreature *pTVar1; - Object local_1c [6]; - - pTVar1 = GetCreature(CreatureID); - if (pTVar1 == (TCreature *)0x0) { - error("SpellFailed: Kreatur existiert nicht.\n"); - } - else { - local_1c[0].ObjectID = (pTVar1->CrObject).ObjectID; - GraphicalEffect(local_1c,3); - } - return; -} - - - -void CharacterRightSpell(ulong CreatureID,int SpellNr,char (*SpellStr) [512]) - -{ - TCreature *cr_00; - undefined4 *puVar1; - TCreature *cr; - char (*pacVar2) [512]; - - // try { // try from 08088582 to 080887ce has its CatchHandler @ 080887d0 - cr_00 = GetCreature(CreatureID); - if (cr_00 == (TCreature *)0x0) { - error("CharacterRightSpell: Kreatur existiert nicht.\n"); - puVar1 = (undefined4 *)__cxa_allocate_exception(4); - *puVar1 = 0xffffffff; - // WARNING: Subroutine does not return - __cxa_throw(puVar1,&RESULT::typeinfo,0); - } - if (cr_00->Type != PLAYER) { - return; - } - switch(SpellNr) { - case 0x22: - pacVar2 = SpellStr + 3; - goto LAB_080885b7; - case 0x23: - pacVar2 = (char (*) [512])0x0; -LAB_080885b7: - CreateThing(cr_00,SpellStr[2],*pacVar2); - break; - case 0x25: - Teleport(cr_00,SpellStr[2]); - break; - case 0x28: - pacVar2 = (char (*) [512])0x0; - goto LAB_080885fd; - case 0x29: - ChangeData(cr_00,SpellStr[2]); - break; - case 0x2e: - pacVar2 = SpellStr + 4; -LAB_080885fd: - CreateKnowledge(cr_00,SpellStr[3],*pacVar2); - break; - case 0x2f: - TeleportToCreature(cr_00,SpellStr[3]); - break; - case 0x34: - TeleportPlayerToMe(cr_00,SpellStr[3]); - break; - case 0x35: - SummonCreature(cr_00,0,SpellStr[3],true); - break; - case 0x3a: - GetPosition(cr_00); - break; - case 0x3f: - CreateMoney(cr_00,SpellStr[3]); - break; - case 0x40: - ChangeProfession(cr_00,SpellStr[3]); - break; - case 0x47: - EditGuests(cr_00); - break; - case 0x48: - EditSubowners(cr_00); - break; - case 0x49: - KickGuest(cr_00,SpellStr[3]); - break; - case 0x4a: - EditNameDoor(cr_00); - break; - case 0x60: - GetQuestValue(cr_00,SpellStr[3]); - break; - case 0x61: - SetQuestValue(cr_00,SpellStr[3],SpellStr[4]); - break; - case 0x62: - CleanupField(cr_00); - break; - case 99: - MagicClimbing(cr_00,SpellStr[3]); - break; - case 100: - ClearQuestValues(cr_00); - break; - case 0x65: - KillAllMonsters(cr_00,0x12,2); - break; - case 0x66: - StartMonsterraid(cr_00,SpellStr[4]); - } - return; -} - - - -void AccountRightSpell(ulong CreatureID,int SpellNr,char (*SpellStr) [512]) - -{ - TCreature *cr_00; - int iVar1; - undefined4 *puVar2; - TCreature *cr; - - // try { // try from 08088805 to 080889de has its CatchHandler @ 080889e0 - cr_00 = GetCreature(CreatureID); - if (cr_00 != (TCreature *)0x0) { - if (cr_00->Type == PLAYER) { - switch(SpellNr) { - case 0x39: - iVar1 = __strtol_internal(SpellStr + 4,0,10,0); - BanishAccount(cr_00,SpellStr[3],iVar1,SpellStr[5]); - break; - case 0x3c: - HomeTeleport(cr_00,SpellStr[2]); - break; - case 0x3d: - DeleteAccount(cr_00,SpellStr[4],SpellStr[5]); - break; - case 0x3e: - SetNameRule(cr_00,SpellStr[2]); - break; - case 0x41: - Notation(cr_00,SpellStr[2],SpellStr[3]); - break; - case 0x42: - NameLock(cr_00,SpellStr[3]); - break; - case 0x43: - KickPlayer(cr_00,SpellStr[2]); - break; - case 0x44: - DeleteCharacter(cr_00,SpellStr[4],SpellStr[5]); - break; - case 0x45: - IPBanishment(cr_00,SpellStr[3],SpellStr[4]); - break; - case 0x46: - iVar1 = __strtol_internal(SpellStr + 4,0,10,0); - BanishCharacter(cr_00,SpellStr[3],iVar1,SpellStr[5]); - } - } - return; - } - error("AccountRightSpell: Kreatur existiert nicht.\n"); - puVar2 = (undefined4 *)__cxa_allocate_exception(4); - *puVar2 = 0xffffffff; - // WARNING: Subroutine does not return - __cxa_throw(puVar2,&RESULT::typeinfo,0); -} - - - -void CastSpell(ulong CreatureID,int SpellNr,char (*SpellStr) [512]) - -{ - bool bVar1; - TCreature *cr_00; - undefined4 *puVar2; - byte bVar3; - TCreature *cr; - int iVar4; - int iVar5; - int Damage; - - // try { // try from 08088a18 to 080894d1 has its CatchHandler @ 080894e6 - cr_00 = GetCreature(CreatureID); - if (cr_00 == (TCreature *)0x0) { - error("CastSpell: Kreatur existiert nicht.\n",CreatureID); - puVar2 = (undefined4 *)__cxa_allocate_exception(4); - *puVar2 = 0xffffffff; -LAB_0808947c: - // WARNING: Subroutine does not return - __cxa_throw(puVar2,&RESULT::typeinfo,0); - } - CheckSpellbook(cr_00,SpellNr); - CheckAccount(cr_00,SpellNr); - CheckLevel(cr_00,SpellNr); - CheckRing(cr_00,SpellNr); - if (ServerMilliseconds < cr_00->EarliestSpellTime) { - puVar2 = (undefined4 *)__cxa_allocate_exception(4); - *puVar2 = 0x31; - goto LAB_0808947c; - } - if (SpellNr - 1U < 0xff) { - bVar3 = (byte)SpellList[SpellNr].Flags & 1; - } - else { - error(&DAT_080fa6c0,SpellNr); - bVar3 = 0; - } - if (((bVar3 != 0) && (cr_00->Type == PLAYER)) && - (bVar1 = CheckRight(cr_00->ID,ATTACK_EVERYWHERE), !bVar1)) { - iVar4 = cr_00->posz; - iVar5 = cr_00->posy; - bVar1 = IsProtectionZone(); - if (bVar1) { - puVar2 = (undefined4 *)__cxa_allocate_exception(4,iVar5,iVar4); - *puVar2 = 0x2f; - goto LAB_0808947c; - } - } - switch(SpellNr) { - case 1: - iVar5 = 10; - iVar4 = 0x14; - goto LAB_08088ad0; - case 2: - iVar5 = 0x14; - iVar4 = 0x28; - goto LAB_08088ad0; - case 3: - iVar5 = 0x32; - iVar4 = 0xfa; -LAB_08088ad0: - ComputeDamage(cr_00,SpellNr,iVar4,iVar5); - Heal(); - break; - case 6: - goto LAB_08088ba1; - case 9: - SummonCreature(cr_00,SpellList[SpellNr].Mana,SpellStr[3],false); - break; - case 10: - goto LAB_08088c10; - case 0xb: - goto LAB_08088c10; - case 0xd: - ComputeDamage(cr_00,SpellNr,0x96,0x32); - goto LAB_08088c8f; - case 0x13: - ComputeDamage(cr_00,SpellNr,0x1e,10); - goto LAB_08088c8f; - case 0x14: - FindPerson(); - break; - case 0x16: - ComputeDamage(cr_00,SpellNr,0x3c,0x14); - goto LAB_08088c8f; - case 0x17: - ComputeDamage(cr_00,SpellNr,0x78,0x50); - goto LAB_08088c8f; - case 0x18: - ComputeDamage(cr_00,SpellNr,0xfa,0x32); - goto LAB_08088e31; - case 0x1d: - NegatePoison(); - break; - case 0x26: - CreatureIllusion(); - break; - case 0x27: -LAB_08088ba1: - MagicGoStrength(); - break; - case 0x2a: - CreateFood(); - break; - case 0x2c: - Shielding(); - break; - case 0x2d: - Invisibility(); - break; - case 0x30: - goto LAB_08088f60; - case 0x31: - goto LAB_08088f60; - case 0x33: - goto LAB_08088f60; - case 0x38: - ComputeDamage(cr_00,SpellNr,200,0x32); - goto LAB_08088e31; - case 0x4b: -LAB_08088c10: - Enlight(); - break; - case 0x4c: - MagicRope(); - break; - case 0x4f: - goto LAB_08088f60; - case 0x50: - ComputeDamage(cr_00,SpellNr,0x50,0x14); - TSkill::Get((cr_00->super_TSkillBase).Skills[0]); - TSkill::Get((cr_00->super_TSkillBase).Skills[0]); -LAB_08088e31: - MassCombat(); - break; - case 0x51: - MagicClimbing(); - break; - case 0x52: - ComputeDamage(cr_00,SpellNr,200,0x28); - MassHeal(); - break; - case 0x54: - ComputeDamage(cr_00,SpellNr,0x78,0x28); - HealFriend(); - break; - case 0x55: - MassRaiseDead(); - break; - case 0x57: - ComputeDamage(cr_00,SpellNr,0x2d,10); - goto LAB_08088c8f; - case 0x58: - ComputeDamage(cr_00,SpellNr,0x2d,10); - goto LAB_08088c8f; - case 0x59: - ComputeDamage(cr_00,SpellNr,0x2d,10); -LAB_08088c8f: - AngleCombat(); - break; - case 0x5a: - CancelInvisibility(); - break; - case 0x5c: - GetNewObjectType(0xd4,'Z'); - GetNewObjectType(0xc4,'Z'); - EnchantObject(); - break; - case 0x5d: - Challenge(); - break; - case 0x5e: - CreateField(); - break; - case 0x5f: -LAB_08088f60: - CreateArrows(); - } - if (SpellNr - 1U < 0xff) { - bVar3 = (byte)SpellList[SpellNr].Flags & 1; - } - else { - error(&DAT_080fa6c0,SpellNr); - bVar3 = 0; - } - if (bVar3 != 0) { - TCreature::BlockLogout(cr_00,0x3c,false); - } - return; -} - - - -void RuneSpell(ulong CreatureID,int SpellNr) - -{ - bool bVar1; - bool bVar2; - TCreature *cr_00; - undefined4 *puVar3; - ObjectType *pOVar4; - ObjectType *pOVar5; - bool executed; - TCreature *cr; - ObjectType local_5c [4]; - Object local_4c [4]; - Object local_3c; - Object Obj2; - Object local_2c; - Object Obj1; - - // try { // try from 0808951b to 0808966f has its CatchHandler @ 08089836 - cr_00 = GetCreature(CreatureID); - if (cr_00 == (TCreature *)0x0) { - error("RuneSpell: Kreatur existiert nicht.\n"); - } - else { - if (SpellList[SpellNr].RuneGr != '\0') { - GetBodyObject((ulong)&local_2c,CreatureID); - GetBodyObject((ulong)&local_3c,CreatureID); - CheckSpellbook(cr_00,SpellNr); - CheckAccount(cr_00,SpellNr); - CheckLevel(cr_00,SpellNr); - pOVar4 = (ObjectType *)SpellNr; - CheckRing(cr_00,SpellNr); - if (ServerMilliseconds < cr_00->EarliestSpellTime) { - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 0x31; - } - else { - bVar1 = false; - bVar2 = Object::exists(&local_2c); - if (bVar2) { - // try { // try from 0808970d to 080897f2 has its CatchHandler @ 08089836 - Object::getObjectType(local_4c); - pOVar5 = local_5c; - pOVar4 = (ObjectType *)0x28; - GetSpecialObject((SPECIALMEANING)pOVar5); - if (local_4c[0].ObjectID == local_5c[0].TypeID) { - CheckMana(cr_00,SpellList[SpellNr].Mana,SpellList[SpellNr].SoulPoints,1000); - GetNewObjectType((uchar)pOVar5,SpellList[SpellNr].RuneGr); - cr = (TCreature *)local_2c.ObjectID; - Change((Object *)&cr,pOVar5,SpellList[SpellNr].Amount); - bVar1 = true; - pOVar4 = pOVar5; - } - } - bVar2 = Object::exists(&local_3c); - if (bVar2) { - Object::getObjectType((Object *)&cr); - pOVar5 = local_5c; - pOVar4 = (ObjectType *)0x28; - GetSpecialObject((SPECIALMEANING)pOVar5); - if (cr == (TCreature *)local_5c[0].TypeID) { - // try { // try from 080896ac to 080896f0 has its CatchHandler @ 080897f5 - CheckMana(cr_00,SpellList[SpellNr].Mana,SpellList[SpellNr].SoulPoints,1000); - GetNewObjectType((uchar)pOVar5,SpellList[SpellNr].RuneGr); - local_4c[0].ObjectID = local_3c.ObjectID; - Change(local_4c,pOVar5,SpellList[SpellNr].Amount); - bVar1 = true; - pOVar4 = pOVar5; - } - } - if (bVar1) { - cr = (TCreature *)(cr_00->CrObject).ObjectID; - GraphicalEffect((Object *)&cr,0xe); - return; - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4,pOVar4); - *puVar3 = 0x22; - } - goto LAB_08089630; - } - error("RuneSpell: Spell %d ist Runenspruch, hat aber keine Rune.\n",SpellNr); - } - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 0xffffffff; -LAB_08089630: - // WARNING: Subroutine does not return - __cxa_throw(puVar3,&RESULT::typeinfo,0); -} - - - -int TypeOfSpell(char *Text) - -{ - int iVar1; - char (*s2) [6]; - int i; - int iVar2; - - if (Text != (char *)0x0) { - iVar2 = 1; - s2 = SpellSyllable; - do { - s2 = s2 + 1; - iVar1 = stricmp(Text,*s2,2); - if (iVar1 == 0) { - return iVar2; - } - iVar2 = iVar2 + 1; - } while (iVar2 < 6); - } - return 0; -} - - - -// WARNING: Variable defined which should be unmapped: Spell - -int FindSpell(uchar *Syllable) - -{ - uchar uVar1; - int j; - int iVar2; - int Params; - int iVar3; - int iVar4; - int local_1c; - int i; - int MinParams; - int Spell; - - local_1c = 1; - MinParams = 0; - i = 100; - iVar4 = 0x24; - do { - iVar3 = 0; - iVar2 = 0; - do { - uVar1 = SpellList[0].Syllable[iVar4 + iVar2]; - if (uVar1 == '\x06') { - if (Syllable[iVar2] == '\0') break; - } - else if (uVar1 != Syllable[iVar2]) break; - if (uVar1 == '\x06') { - iVar3 = iVar3 + 1; - } - if (uVar1 == '\0') { - if (iVar3 < i) { - MinParams = local_1c; - i = iVar3; - } - break; - } - iVar2 = iVar2 + 1; - } while (iVar2 < 10); - local_1c = local_1c + 1; - iVar4 = iVar4 + 0x24; - if (0xff < local_1c) { - return MinParams; - } - } while( true ); -} - - - -int FindSpell(Object *Obj) - -{ - bool bVar1; - int iVar2; - int i; - int iVar3; - char *Text; - ulong local_3c [4]; - Object local_2c [7]; - - bVar1 = Object::exists(Obj); - if (bVar1) { - iVar3 = 1; - iVar2 = 0x24; - Object::getObjectType(local_2c); - bVar1 = ObjectType::getFlag((ObjectType *)local_2c,RUNE); - if (bVar1) { - do { - Object::getObjectType(local_2c); - GetNewObjectType((uchar)local_3c,SpellList[0].Syllable[iVar2 + 10]); - if (local_2c[0].ObjectID == local_3c[0]) { - return iVar3; - } - iVar3 = iVar3 + 1; - iVar2 = iVar2 + 0x24; - } while (iVar3 < 0x100); - return 0; - } - Text = &DAT_080fd940; - } - else { - Text = &DAT_080fd900; - } - error(Text); - return 0; -} - - - -void GetSpellString(int SpellNr,char *Text) - -{ - size_t sVar1; - int i; - int iVar2; - - *Text = '\0'; - if (0xfe < SpellNr - 1U) { - error(&DAT_080fd980); - return; - } - iVar2 = 0; - do { - if (SpellSyllable[SpellList[SpellNr].Syllable[iVar2]][0] == '\0') break; - strcat(Text,SpellSyllable[SpellList[SpellNr].Syllable[iVar2]]); - if (0 < iVar2) { - strcat(Text," "); - } - iVar2 = iVar2 + 1; - } while (iVar2 < 10); - if (*Text != '\0') { - sVar1 = strlen(Text); - Text[sVar1 - 1] = '\0'; - } - return; -} - - - -void GetMagicItemDescription(Object *Obj,char *SpellString,int *MagicLevel) - -{ - bool bVar1; - int SpellNr_00; - int SpellNr; - char *Text; - Object local_2c [7]; - - *MagicLevel = 0; - *SpellString = '\0'; - bVar1 = Object::exists(Obj); - if (bVar1) { - Object::getObjectType(local_2c); - bVar1 = ObjectType::getFlag((ObjectType *)local_2c,RUNE); - if (bVar1) { - local_2c[0] = (Object)Obj->ObjectID; - SpellNr_00 = FindSpell(local_2c); - if (SpellNr_00 == 0) { - Object::getObjectType(local_2c); - error("GetMagicItemDescription: Objekt %d hat keinen Zauberspruch.\n", - local_2c[0].ObjectID); - return; - } - GetSpellString(SpellNr_00,SpellString); - *MagicLevel = (uint)SpellList[SpellNr_00].RuneLevel; - return; - } - Text = &DAT_080fda00; - } - else { - Text = &DAT_080fd9c0; - } - error(Text); - return; -} - - - -void GetSpellbook(ulong CharacterID,char *Buffer) - -{ - bool bVar1; - bool bVar2; - TPlayer *this; - TPlayer **ppTVar3; - TPlayer **ppTVar4; - uint uVar5; - uint uVar6; - int i; - int SpellNumber; - int iVar7; - int Level; - uint uVar8; - char *Text; - bool first; - TPlayer *pl; - char Help [100]; - - this = GetPlayer(CharacterID); - if (this == (TPlayer *)0x0) { - Text = "GetSpellbook: Spieler existiert nicht.\n"; - } - else { - if (Buffer != (char *)0x0) { - uVar8 = 1; - *Buffer = '\0'; - do { - bVar1 = true; - SpellNumber = 1; - iVar7 = 0x24; - do { - if ((*(ushort *)(SpellList[0].Syllable + iVar7 + 0x10) == uVar8) && - (bVar2 = TPlayer::SpellKnown(this,SpellNumber), bVar2)) { - if (bVar1) { - sprintf((char *)&pl,"Spells for Level %d\n",uVar8); - strcat(Buffer,(char *)&pl); - bVar1 = false; - } - GetSpellString(SpellNumber,(char *)&pl); - ppTVar4 = &pl; - do { - ppTVar3 = ppTVar4; - uVar5 = (uint)((int)(*ppTVar3)[-0x127c].QuestValues + 0x68fU) & - ~(uint)*ppTVar3; - uVar6 = uVar5 & 0x80808080; - ppTVar4 = ppTVar3 + 1; - } while (uVar6 == 0); - bVar2 = (uVar5 & 0x8080) == 0; - if (bVar2) { - uVar6 = uVar6 >> 0x10; - } - if (bVar2) { - ppTVar4 = (TPlayer **)((int)ppTVar3 + 6); - } - if ((int)ppTVar4 + ((-3 - (uint)CARRY1((byte)uVar6,(byte)uVar6)) - (int)&pl) - < 2) { - error("GetSpellbook: Zauberspruch %d hat keine Zauberformel.\n", - SpellNumber); - } - else { - strcat(Buffer," "); - strcat(Buffer,(char *)&pl); - if (**(char **)(SpellList[0].Syllable + iVar7 + 0xc) != '\0') { - strcat(Buffer," - "); - strcat(Buffer,*(char **)(SpellList[0].Syllable + iVar7 + 0xc)); - if (SpellNumber == 0x50) { - builtin_strncpy(Help,"*Level",7); - pl = (TPlayer *)0x34203a20; - } - else if ((SpellNumber < 0x51) && - ((SpellNumber == 9 || (SpellNumber == 0xc)))) { - Help._2_2_ = SUB42(Help._0_4_,2) & 0xff00; - pl = (TPlayer *)0x76203a20; - Help[0] = 'a'; - Help[1] = 'r'; - } - else { - sprintf((char *)&pl," : %d", - *(undefined4 *)(SpellList[0].Syllable + iVar7 + 0x18)); - } - strcat(Buffer,(char *)&pl); - } - strcat(Buffer,"\n"); - } - } - SpellNumber = SpellNumber + 1; - iVar7 = iVar7 + 0x24; - } while (SpellNumber < 0x100); - if (!bVar1) { - strcat(Buffer,"\n"); - } - uVar8 = uVar8 + 1; - } while ((int)uVar8 < 0x3d); - return; - } - Text = &DAT_080fdac0; - } - error(Text); - return; -} - - - -int GetSpellLevel(int SpellNr) - -{ - uint uVar1; - - if (SpellNr - 1U < 0xff) { - uVar1 = (uint)SpellList[SpellNr].Level; - } - else { - error(&DAT_080fdb40,SpellNr); - uVar1 = 1; - } - return uVar1; -} - - - -int CheckForSpell(ulong CreatureID,char *Text) - -{ - int *piVar1; - bool bVar2; - int SpellNr; - int iVar3; - int iVar4; - size_t sVar5; - int iVar6; - int Next; - char (*pacVar7) [6]; - int syl; - uint in_stack_ffffe8a0; - uint uVar8; - int local_1750; - char local_174c [4]; - char SpellStr [11] [512]; - uchar Syllable [11]; - char *local_11c [4]; - undefined4 local_10c; - istringstream IS; - undefined4 local_104 [20]; - int local_b4; - undefined4 local_b0; - ios_base aiStack_ac [16]; - byte local_9c; - - local_1750 = 0; - if (Text != (char *)0x0) { - local_1750 = 1; - pacVar7 = SpellSyllable; - do { - pacVar7 = pacVar7 + 1; - iVar3 = stricmp(Text,*pacVar7,2); - if (iVar3 == 0) goto LAB_08089ed2; - local_1750 = local_1750 + 1; - } while (local_1750 < 6); - local_1750 = 0; - } -LAB_08089ed2: - iVar3 = 0; - if (local_1750 != 0) { - if (Text != (char *)0x0) { - strlen(Text); - } - uVar8 = in_stack_ffffe8a0 & 0xffffff00; - // try { // try from 08089f11 to 08089f15 has its CatchHandler @ 0808a436 - local_11c[0] = basic_string<>::_S_construct<>(); - // try { // try from 08089f2d to 08089f31 has its CatchHandler @ 0808a413 - std::ios_base::ios_base(aiStack_ac); - local_b0 = 0x8128950; - // try { // try from 08089f56 to 08089f5a has its CatchHandler @ 0808a40f - std::istream::istream((istream *)&local_10c,(streambuf *)(std::istringstream::VTT + 4)); - local_10c = 0x8128964; - local_b0 = 0x8128978; - // try { // try from 08089f89 to 08089f8d has its CatchHandler @ 0808a40b - std::stringbuf::stringbuf((stringbuf *)local_104,local_11c,8,uVar8); - // try { // try from 08089f95 to 08089f99 has its CatchHandler @ 0808a3a5 - std::ios::init((EVP_PKEY_CTX *)&local_b0); - LOCK(); - piVar1 = (int *)(local_11c[0] + -4); - iVar3 = *piVar1; - *piVar1 = *piVar1 + -1; - UNLOCK(); - if (iVar3 < 1) { - // try { // try from 0808a380 to 0808a384 has its CatchHandler @ 0808a429 - std::__default_alloc_template::deallocate - (local_11c[0] + -0xc,*(int *)(local_11c[0] + -8) + 0xd); - } - SpellStr[10][0x1fc] = (char)local_1750; - strcpy(local_174c,SpellSyllable[local_1750]); - // try { // try from 08089ff2 to 0808a0d9 has its CatchHandler @ 0808a5e0 - std::istream::get(); - std::istream::get(); - SpellStr[10][0x1fd] = '\0'; - SpellStr[0][0x1fc] = '\0'; - iVar3 = 1; - if ((local_9c & 2) == 0) { - while( true ) { - while( true ) { - iVar4 = std::istream::peek(); - bVar2 = isSpace(iVar4); - if (!bVar2) break; - std::istream::get(); - } - if (iVar4 == 0x22) { - // try { // try from 0808a32b to 0808a36d has its CatchHandler @ 0808a5e0 - std::istream::get(); - std::istream::get((char *)&local_10c,(int)(SpellStr[iVar3 + -1] + 0x1fc),-2); - std::istream::get(); - } - else { - std::istream::get((char *)&local_10c,(int)(SpellStr[iVar3 + -1] + 0x1fc),'d'); - sVar5 = strlen(SpellStr[iVar3 + -1] + 0x1fc); - if (sVar5 == 99) { - local_10c = 0x8128964; - local_b0 = 0x8128978; - local_104[0] = 0x8128a08; - // try { // try from 0808a31b to 0808a31f has its CatchHandler @ 0808a43a - std::string::_Rep::_M_dispose((allocator *)(local_b4 + -0xc)); - goto LAB_0808a2a8; - } - } - if (SpellStr[iVar3 + -1][0x1fc] == '\0') break; - iVar4 = 1; - pacVar7 = SpellSyllable; - do { - pacVar7 = pacVar7 + 1; - iVar6 = stricmp(SpellStr[iVar3 + -1] + 0x1fc,*pacVar7,-1); - if (iVar6 == 0) { - SpellStr[10][iVar3 + 0x1fc] = (char)iVar4; - } - iVar4 = iVar4 + 1; - } while (iVar4 < 0x34); - if (SpellStr[10][iVar3 + 0x1fc] == '\0') { - SpellStr[10][iVar3 + 0x1fc] = '\x06'; - } - SpellStr[10][iVar3 + 0x1fd] = '\0'; - SpellStr[iVar3][0x1fc] = '\0'; - if ((9 < iVar3 + 1) || (iVar3 = iVar3 + 1, (local_9c & 2) != 0)) break; - } - } - iVar3 = FindSpell((uchar *)(SpellStr[10] + 0x1fc)); - if (iVar3 == 0) { - local_10c = 0x8128964; - local_b0 = 0x8128978; - local_104[0] = 0x8128a08; - // try { // try from 0808a2a3 to 0808a2a7 has its CatchHandler @ 0808a440 - std::string::_Rep::_M_dispose((allocator *)(local_b4 + -0xc)); -LAB_0808a2a8: - std::streambuf::~streambuf((streambuf *)local_104); - std::istream::~istream((istream *)&local_10c); - std::ios::~ios((ios *)&local_b0); - iVar3 = 0; - } - else { - switch(local_1750) { - default: - // try { // try from 0808a20c to 0808a260 has its CatchHandler @ 0808a442 - error("CheckForSpell: Spruchklasse %d existiert nicht.\n",local_1750); - break; - case 1: - // try { // try from 0808a16f to 0808a173 has its CatchHandler @ 0808a442 - CharacterRightSpell(CreatureID,iVar3,(char (*) [512])local_174c); - break; - case 2: - RuneSpell(CreatureID,iVar3); - break; - case 3: - case 4: - CastSpell(CreatureID,iVar3,(char (*) [512])local_174c); - break; - case 5: - AccountRightSpell(CreatureID,iVar3,(char (*) [512])local_174c); - } - local_10c = 0x8128964; - local_b0 = 0x8128978; - local_104[0] = 0x8128a08; - // try { // try from 0808a1b1 to 0808a1b5 has its CatchHandler @ 0808a436 - std::string::_Rep::_M_dispose((allocator *)(local_b4 + -0xc)); - std::streambuf::~streambuf((streambuf *)local_104); - std::istream::~istream((istream *)&local_10c); - std::ios::~ios((ios *)&local_b0); - iVar3 = local_1750; - } - } - return iVar3; -} - - - -void DeleteRune(Object *Obj) - -{ - bool bVar1; - ulong uVar2; - undefined4 *puVar3; - Object local_1c [5]; - - // try { // try from 0808a5ff to 0808a6a0 has its CatchHandler @ 0808a6a1 - bVar1 = Object::exists(Obj); - if (bVar1) { - uVar2 = Object::getAttribute(Obj,CHARGES); - if (uVar2 < 2) { - local_1c[0] = (Object)Obj->ObjectID; - Delete(local_1c,-1); - } - else { - uVar2 = Object::getAttribute(Obj,CHARGES); - local_1c[0] = (Object)Obj->ObjectID; - Change(local_1c,CHARGES,uVar2 - 1); - } - return; - } - error(&DAT_080fdbc0); - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = 0xffffffff; - // WARNING: Subroutine does not return - __cxa_throw(puVar3,&RESULT::typeinfo,0); -} - - - -void UseMagicItem(ulong CreatureID,Object *Obj,Object *Dest) - -{ - bool bVar1; - byte bVar2; - uchar uVar3; - TCreature *cr; - TPlayer *this; - int *SpellNr_00; - ulong uVar4; - int Damage_00; - undefined4 *puVar5; - int Damage; - TPlayer *pl; - char *pcVar6; - int *piVar7; - int *piVar8; - TCreature *z; - int EffectNr; - int AnimationNr; - ushort DmgType; - TCreature *local_60; - TCreature *dest; - int SpellNr; - int dx; - int dy; - int dz; - Object local_3c [4]; - Object local_2c; - Object Help; - - // try { // try from 0808a6de to 0808a8d4 has its CatchHandler @ 0808b318 - this = GetPlayer(CreatureID); - if (this == (TPlayer *)0x0) { - pcVar6 = "UseMagicItem: Kreatur existiert nicht.\n"; -LAB_0808b285: - error(pcVar6); -LAB_0808b22e: - puVar5 = (undefined4 *)__cxa_allocate_exception(4); - *puVar5 = 0xffffffff; -LAB_0808b0ba: - // WARNING: Subroutine does not return - __cxa_throw(puVar5,&RESULT::typeinfo,0); - } - bVar1 = Object::exists(Obj); - if (!bVar1) { - pcVar6 = &DAT_080fdcc0; - goto LAB_0808b285; - } - bVar1 = Object::exists(Dest); - if (!bVar1) { - Object::getObjectType(&local_2c); - pcVar6 = &DAT_080fdc80; -LAB_0808b229: - error(pcVar6,local_2c.ObjectID); - goto LAB_0808b22e; - } - bVar1 = CheckRight((this->super_TCreature).ID,NO_RUNES); - if (bVar1) { - puVar5 = (undefined4 *)__cxa_allocate_exception(4); - *puVar5 = 0x1d; - goto LAB_0808b0ba; - } - local_2c = (Object)Obj->ObjectID; - SpellNr_00 = (int *)FindSpell(&local_2c); - if (SpellNr_00 == (int *)0x0) { - Object::getObjectType(&local_2c); - pcVar6 = &DAT_080fdc40; - goto LAB_0808b229; - } - Object::getObjectType(&local_2c); - if (local_2c.ObjectID == 99) { - local_2c = (Object)Dest->ObjectID; - local_60 = GetCreature(&local_2c); - } - else { - local_60 = (TCreature *)0x0; - } - Object::getContainer(local_3c); - GetFirstContainerObject(&local_2c); - if (local_2c.ObjectID != NONE.ObjectID) { - do { - dz = NONE.ObjectID; - local_3c[0].ObjectID = NONE.ObjectID; - Object::getObjectType((Object *)&dz); - if (dz == 99) { - if ((int)SpellNr_00 - 1U < 0xff) { - bVar2 = (byte)SpellList[(int)SpellNr_00].Flags & 1; - } - else { - error(&DAT_080fa6c0,SpellNr_00); - bVar2 = 0; - } - if ((bVar2 != 0) && - ((local_60 == (TCreature *)0x0 || - (uVar4 = Object::getCreatureID(&local_2c), uVar4 != (this->super_TCreature).ID)) - )) { - local_3c[0].ObjectID = local_2c.ObjectID; - Dest->ObjectID = (ulong)local_2c; - dz = local_2c.ObjectID; - local_60 = GetCreature((Object *)&dz); - } - if ((int)SpellNr_00 - 1U < 0xff) { - bVar2 = (byte)SpellList[(int)SpellNr_00].Flags & 1; - } - else { - error(&DAT_080fa6c0,SpellNr_00); - bVar2 = 0; - } - if ((bVar2 == 0) && - ((local_60 == (TCreature *)0x0 || - (uVar4 = Object::getCreatureID(&local_2c), uVar4 == (this->super_TCreature).ID)) - )) { - local_3c[0].ObjectID = local_2c.ObjectID; - Dest->ObjectID = (ulong)local_2c; - dz = local_2c.ObjectID; - local_60 = GetCreature((Object *)&dz); - } - } - Object::getNextObject(local_3c); - local_2c.ObjectID = local_3c[0].ObjectID; - } while (local_3c[0].ObjectID != NONE.ObjectID); - } - dz = NONE.ObjectID; - local_3c[0].ObjectID = NONE.ObjectID; - CheckRuneLevel(&this->super_TCreature,(int)SpellNr_00); - dz = Dest->ObjectID; - z = (TCreature *)&dy; - piVar8 = &dx; - piVar7 = &SpellNr; - GetObjectCoordinates((Object *)&dz,piVar7,piVar8,(int *)z); - if (ServerMilliseconds < (this->super_TCreature).EarliestSpellTime) { - puVar5 = (undefined4 *)__cxa_allocate_exception(4); - *puVar5 = 0x31; - goto LAB_0808b0ba; - } - if ((int)SpellNr_00 - 1U < 0xff) { - bVar2 = (byte)SpellList[(int)SpellNr_00].Flags & 1; - } - else { - piVar7 = SpellNr_00; - error(&DAT_080fa6c0,SpellNr_00); - bVar2 = 0; - } - if (bVar2 != 0) { - piVar7 = (int *)0x43; - bVar1 = CheckRight((this->super_TCreature).ID,ATTACK_EVERYWHERE); - if (!bVar1) { - piVar8 = (int *)(this->super_TCreature).posz; - piVar7 = (int *)(this->super_TCreature).posy; - bVar1 = IsProtectionZone(); - if ((bVar1) || - (bVar1 = IsProtectionZone(), piVar7 = (int *)dx, piVar8 = (int *)dy, bVar1)) { - puVar5 = (undefined4 *)__cxa_allocate_exception(4,piVar7,piVar8); - *puVar5 = 0x2f; - goto LAB_0808b0ba; - } - } - } - if ((int)SpellNr_00 - 1U < 0xff) { - bVar2 = (byte)SpellList[(int)SpellNr_00].Flags & 1; - } - else { - piVar7 = SpellNr_00; - error(&DAT_080fa6c0,SpellNr_00); - bVar2 = 0; - } - if (bVar2 != 0) { - // try { // try from 0808b080 to 0808b289 has its CatchHandler @ 0808b318 - Object::getContainer((Object *)&dz); - piVar7 = &dz; - Object::getObjectType(local_3c); - if (local_3c[0].ObjectID != 0) { - puVar5 = (undefined4 *)__cxa_allocate_exception(4,piVar7); - *puVar5 = 4; - goto LAB_0808b0ba; - } - } - switch(SpellNr_00) { - case (int *)0x4: - if (local_60 != (TCreature *)0x0) { - // try { // try from 0808a978 to 0808b044 has its CatchHandler @ 0808b295 - z = (TCreature *)ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x46,0x1e); -LAB_0808a997: - piVar8 = (int *)0x0; - Heal(); - break; - } - goto LAB_0808aa1b; - case (int *)0x5: - if (local_60 != (TCreature *)0x0) { - z = (TCreature *)ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0xfa,0); - goto LAB_0808a997; - } - goto LAB_0808aa1b; - default: - error("UseMagicItem: Spell %d noch nicht implementiert.\n",SpellNr_00); - puVar5 = (undefined4 *)__cxa_allocate_exception(4); - *puVar5 = 0xffffffff; - goto LAB_0808aa2d; - case (int *)0x7: - Damage_00 = ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0xf,5); - dz = Dest->ObjectID; - DmgType = 8; - AnimationNr = 4; - EffectNr = 6; - goto LAB_0808aae3; - case (int *)0x8: - Damage_00 = ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x1e,10); - dz = Dest->ObjectID; - EffectNr = 6; - DmgType = 8; - goto LAB_0808ab2e; - case (int *)0xc: - if (local_60 != (TCreature *)0x0) { - Convince(&this->super_TCreature,local_60); - break; - } - goto LAB_0808aa1b; - case (int *)0xe: - dz = Dest->ObjectID; - z = (TCreature *)&dz; - piVar8 = (int *)0x0; - ObjectIllusion(); - break; - case (int *)0xf: - ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x14,5); - dz = Dest->ObjectID; - goto LAB_0808abfc; - case (int *)0x10: - ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x32,0xf); - dz = Dest->ObjectID; - goto LAB_0808abfc; - case (int *)0x11: - dz = Dest->ObjectID; - goto LAB_0808ac98; - case (int *)0x12: - ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x3c,0x28); - dz = Dest->ObjectID; -LAB_0808abfc: - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - MassCombat(); - break; - case (int *)0x15: - Damage_00 = ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x96,0x14); - dz = Dest->ObjectID; - EffectNr = 0x12; - DmgType = 1; - AnimationNr = 0xb; - goto LAB_0808aae3; - case (int *)0x19: - dz = Dest->ObjectID; - goto LAB_0808ad72; - case (int *)0x1a: - dz = Dest->ObjectID; - goto LAB_0808ad72; - case (int *)0x1b: - dz = Dest->ObjectID; - goto LAB_0808ad72; - case (int *)0x1c: - dz = Dest->ObjectID; - goto LAB_0808adf7; - case (int *)0x1e: - dz = Dest->ObjectID; - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - DeleteField(); - break; - case (int *)0x1f: - if (local_60 != (TCreature *)0x0) { - piVar8 = (int *)0x0; - NegatePoison(); - z = local_60; - break; - } - goto LAB_0808aa1b; - case (int *)0x20: - dz = Dest->ObjectID; - goto LAB_0808adf7; - case (int *)0x21: - dz = Dest->ObjectID; -LAB_0808adf7: - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - CreateFieldWall(); - break; - case (int *)0x32: - Damage_00 = ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x78,0x14); - dz = Dest->ObjectID; - EffectNr = 0x10; - DmgType = 0x40; -LAB_0808ab2e: - AnimationNr = 4; - goto LAB_0808aae3; - case (int *)0x36: - if (local_60 != (TCreature *)0x0) { - uVar3 = TPlayer::GetEffectiveProfession(this); - if (uVar3 == '\x04') { - z = (TCreature *)SpellList[(int)SpellNr_00].SoulPoints; - piVar8 = (int *)SpellList[(int)SpellNr_00].Mana; - MagicGoStrength(); - break; - } - puVar5 = (undefined4 *)__cxa_allocate_exception(4,piVar7); - *puVar5 = 0x1d; - goto LAB_0808aa2d; - } -LAB_0808aa1b: - puVar5 = (undefined4 *)__cxa_allocate_exception(4,piVar7,piVar8); - *puVar5 = 0x27; -LAB_0808aa2d: - // WARNING: Subroutine does not return - __cxa_throw(puVar5,&RESULT::typeinfo,0); - case (int *)0x37: - dz = Dest->ObjectID; - goto LAB_0808ac98; - case (int *)0x4d: - Damage_00 = ComputeDamage(&this->super_TCreature,(int)SpellNr_00,0x46,0x14); - dz = Dest->ObjectID; - EffectNr = 0x11; - DmgType = 0x20; - AnimationNr = 5; -LAB_0808aae3: - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - Combat(&this->super_TCreature,(Object *)&dz,0,0,Damage_00,EffectNr,AnimationNr,DmgType); - break; - case (int *)0x4e: - dz = Dest->ObjectID; - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - CleanupField(); - break; - case (int *)0x53: - dz = Dest->ObjectID; - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - RaiseDead(); - break; - case (int *)0x56: - dz = Dest->ObjectID; -LAB_0808ad72: - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - CreateField(); - break; - case (int *)0x5b: - dz = Dest->ObjectID; -LAB_0808ac98: - z = (TCreature *)0x0; - piVar8 = (int *)0x0; - MassCreateField(); - } - bVar1 = Object::exists(Obj); - if (bVar1) { - dz = Obj->ObjectID; - DeleteRune((Object *)&dz); - } - if ((int)SpellNr_00 - 1U < 0xff) { - bVar2 = (byte)SpellList[(int)SpellNr_00].Flags & 1; - } - else { - error(&DAT_080fa6c0,SpellNr_00,piVar8,z); - bVar2 = 0; - } - if (bVar2 != 0) { - TCreature::BlockLogout(&this->super_TCreature,0x3c,false); - } - return; -} - - - -void DrinkPotion(ulong CreatureID,Object *Obj) - -{ - bool bVar1; - TPlayer *pTVar2; - ulong uVar3; - undefined4 *puVar4; - TPlayer *pl; - char *Text; - Object local_2c [7]; - - // try { // try from 0808b348 to 0808b48e has its CatchHandler @ 0808b4b5 - pTVar2 = GetPlayer(CreatureID); - if (pTVar2 == (TPlayer *)0x0) { - Text = "DrinkPotion: Kreatur existiert nicht.\n"; - } - else { - bVar1 = Object::exists(Obj); - if (bVar1) { - Object::getObjectType(local_2c); - bVar1 = ObjectType::getFlag((ObjectType *)local_2c,LIQUIDCONTAINER); - if (bVar1) { - uVar3 = Object::getAttribute(Obj,CONTAINERLIQUIDTYPE); - if (uVar3 == 10) { - ComputeDamage((TCreature *)0x0,0,100,0x32); - RefreshMana(); - } - else { - if (uVar3 != 0xb) { - Text = &DAT_080fdd40; - goto LAB_0808b420; - } - ComputeDamage((TCreature *)0x0,0,0x32,0x19); - Heal(); - } - local_2c[0] = (Object)Obj->ObjectID; - Change(local_2c,CONTAINERLIQUIDTYPE,0); - return; - } - Text = &DAT_080fdd80; - } - else { - Text = &DAT_080fdde0; - } - } -LAB_0808b420: - error(Text); - puVar4 = (undefined4 *)__cxa_allocate_exception(4); - *puVar4 = 0xffffffff; - // WARNING: Subroutine does not return - __cxa_throw(puVar4,&RESULT::typeinfo,0); -} - -void CreateField(int x,int y,int z,int FieldType,ulong Owner,bool Peaceful) - -{ - bool bVar1; - undefined4 *puVar2; - ObjectType *this; - Object local_6c [4]; - ObjectType local_5c; - Object Help; - ObjectType local_4c; - Object Obj; - ObjectType local_3c [4]; - ObjectType local_2c; - ObjectType ObjectType; - - // try { // try from 0808db84 to 0808dc7d has its CatchHandler @ 0808dde0 - ::ObjectType::setTypeID(&local_2c,0); - switch(FieldType) { - default: - error(&DAT_080fdf20,FieldType); - puVar2 = (undefined4 *)__cxa_allocate_exception(4); - *puVar2 = 0xffffffff; - // WARNING: Subroutine does not return - __cxa_throw(puVar2,&RESULT::typeinfo,0); - case 1: - GetSpecialObject((SPECIALMEANING)&local_4c); - ::ObjectType::setTypeID(&local_2c,local_4c.TypeID); - this = local_3c; - goto LAB_0808dbd1; - case 2: - break; - case 3: - break; - case 4: - break; - case 5: - } - GetSpecialObject((SPECIALMEANING)local_3c); - ::ObjectType::setTypeID(&local_2c,local_3c[0].TypeID); - this = &local_4c; -LAB_0808dbd1: - ::ObjectType::setTypeID(this,local_2c.TypeID); - bVar1 = FieldPossible(); - if (bVar1) { - GetFirstObject(); - if (local_4c.TypeID != NONE.ObjectID) { - do { - local_5c.TypeID = local_4c.TypeID; - local_3c[0].TypeID = NONE.ObjectID; - Object::getNextObject(local_6c); - local_4c.TypeID = local_6c[0].ObjectID; - local_3c[0].TypeID = local_6c[0].ObjectID; - Object::getObjectType(local_6c); - bVar1 = ::ObjectType::getFlag((ObjectType *)local_6c,MAGICFIELD); - if (bVar1) { - local_6c[0].ObjectID = local_5c.TypeID; - // try { // try from 0808dcf9 to 0808dd64 has its CatchHandler @ 0808dde0 - Delete(local_6c,-1); - } - } while (local_4c.TypeID != NONE.ObjectID); - } - local_5c.TypeID = NONE.ObjectID; - local_3c[0].TypeID = NONE.ObjectID; - // try { // try from 0808dc9e to 0808dcdf has its CatchHandler @ 0808dda3 - ::ObjectType::setTypeID(&local_5c,local_2c.TypeID); - GetMapContainer((int)&local_4c,x,y); - Create(local_6c,&local_4c,(ulong)&local_5c); - } - return; -} - - - // WARNING: Unknown calling convention -- yet parameter storage is locked void _GLOBAL__I_SpellSyllable(void) -- cgit v1.2.3