From 3d7fcfc4a6a1fc7016145b39596775bcd32be5c1 Mon Sep 17 00:00:00 2001 From: fusion32 Date: Sat, 7 Jun 2025 17:15:40 -0300 Subject: race loading --- reference/game.c | 1628 ------------------------------------------------------ src/cr.hh | 17 + src/crmain.cc | 456 ++++++++++++++- src/crskill.cc | 70 ++- src/enums.hh | 4 +- src/objects.cc | 3 +- src/stubs.hh | 7 - 7 files changed, 536 insertions(+), 1649 deletions(-) diff --git a/reference/game.c b/reference/game.c index d50249a..f0a4f51 100644 --- a/reference/game.c +++ b/reference/game.c @@ -29623,1225 +29623,6 @@ void __static_initialization_and_destruction_0(int __initialize_p,int __priority return; } -char * GetRaceName(int Race) - -{ - TRaceData *pTVar1; - - if (Race - 1U < 0x1ff) { - pTVar1 = RaceData + Race; - } - else { - error(&DAT_08102100,Race); - pTVar1 = (TRaceData *)0x0; - } - return pTVar1->Name; -} - - - -TOutfit GetRaceOutfit(int Race) - -{ - int iVar1; - anon_union_4_2_730cd3ca_for_TOutfit_2 aVar2; - TOutfit TVar3; - int in_stack_00000008; - - if (in_stack_00000008 - 1U < 0x1ff) { - iVar1 = RaceData[in_stack_00000008].Outfit.OutfitID; - aVar2 = RaceData[in_stack_00000008].Outfit.field_1; - } - else { - error(&DAT_08102140); - iVar1 = RaceData[1].Outfit.OutfitID; - aVar2 = RaceData[1].Outfit.field_1; - } - *(int *)Race = iVar1; - *(anon_union_4_2_730cd3ca_for_TOutfit_2 *)(Race + 4) = aVar2; - TVar3.field_1 = aVar2; - TVar3.OutfitID = Race; - return TVar3; -} - - - -bool GetRaceNoSummon(int Race) - -{ - undefined1 uVar1; - - if (Race - 1U < 0x1ff) { - uVar1 = RaceData[Race].NoSummon; - } - else { - error(&DAT_08102180,Race); - uVar1 = 1; - } - return (bool)uVar1; -} - - - -bool GetRaceNoConvince(int Race) - -{ - undefined1 uVar1; - - if (Race - 1U < 0x1ff) { - uVar1 = RaceData[Race].NoConvince; - } - else { - error(&DAT_081021c0,Race); - uVar1 = 1; - } - return (bool)uVar1; -} - - - -bool GetRaceNoIllusion(int Race) - -{ - undefined1 uVar1; - - if (Race - 1U < 0x1ff) { - uVar1 = RaceData[Race].NoIllusion; - } - else { - error(&DAT_08102200,Race); - uVar1 = 1; - } - return (bool)uVar1; -} - - - -bool GetRaceNoParalyze(int Race) - -{ - undefined1 uVar1; - - if (Race - 1U < 0x1ff) { - uVar1 = RaceData[Race].NoParalyze; - } - else { - error(&DAT_08102240,Race); - uVar1 = 1; - } - return (bool)uVar1; -} - - - -int GetRaceSummonCost(int Race) - -{ - int iVar1; - - if (Race - 1U < 0x1ff) { - iVar1 = RaceData[Race].SummonCost; - } - else { - error(&DAT_08102280,Race); - iVar1 = 0; - } - return iVar1; -} - - - -int GetRacePoison(int Race) - -{ - int iVar1; - - if (Race - 1U < 0x1ff) { - iVar1 = RaceData[Race].Poison; - } - else { - error(&DAT_081022c0,Race); - iVar1 = 0; - } - return iVar1; -} - - - -bool GetRaceUnpushable(int Race) - -{ - undefined1 uVar1; - - if (Race - 1U < 0x1ff) { - uVar1 = RaceData[Race].Unpushable; - } - else { - error(&DAT_08102300,Race); - uVar1 = 1; - } - return (bool)uVar1; -} - - - -void LoadRace(char *FileName) - -{ - TReadScriptFile *pTVar1; - char cVar2; - char *pcVar3; - TSpellData *pTVar4; - TItemData *this; - ulong uVar5; - ulong *puVar6; - int iVar7; - TSkillData *pTVar8; - char *pcVar9; - int iVar10; - int iVar11; - int SkillNr; - char *pcVar12; - char *pcVar13; - undefined1 uVar14; - char *Impact; - TRaceData *R; - char *Shape; - TOutfit HelpOutfit; - ObjectType local_402c [4]; - char local_401c [4]; - char Ident [30]; - TReadScriptFile Script; - - uVar14 = &stack0x00000000 == (undefined1 *)0x406c; - pcVar3 = FileName; - // try { // try from 080a2768 to 080a277a has its CatchHandler @ 080a3a74 - print(); - TReadScriptFile::TReadScriptFile((TReadScriptFile *)(Ident + 0x1c)); - // try { // try from 080a2788 to 080a39ea has its CatchHandler @ 080a3a57 - TReadScriptFile::open((TReadScriptFile *)(Ident + 0x1c),FileName,(int)pcVar3); - pcVar3 = TReadScriptFile::readIdentifier((TReadScriptFile *)(Ident + 0x1c)); - iVar10 = 0xb; - pcVar9 = "racenumber"; - do { - if (iVar10 == 0) break; - iVar10 = iVar10 + -1; - uVar14 = *pcVar3 == *pcVar9; - pcVar3 = pcVar3 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar14); - if (!(bool)uVar14) { - TReadScriptFile::error((TReadScriptFile *)(Ident + 0x1c),"race number expected"); - } - pcVar3 = (char *)0x3d; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'='); - iVar10 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - if (0x1fe < iVar10 - 1U) { - pcVar3 = "illegal race number"; - TReadScriptFile::error((TReadScriptFile *)(Ident + 0x1c),"illegal race number"); - } - if (RaceData[iVar10].Name[0] != '\0') { - pcVar3 = "race already defined"; - // try { // try from 080a3a17 to 080a3a51 has its CatchHandler @ 080a3a57 - TReadScriptFile::error((TReadScriptFile *)(Ident + 0x1c),"race already defined"); - } - RaceData[iVar10].Outfit.field_1 = (anon_union_4_2_730cd3ca_for_TOutfit_2)0x0; - RaceData[iVar10].Outfit.OutfitID = iVar10; - do { - do { - TReadScriptFile::nextToken((TReadScriptFile *)(Ident + 0x1c)); - if (stack0xffffc004 == 0) { - TReadScriptFile::close((TReadScriptFile *)(Ident + 0x1c),(int)pcVar3); - // try { // try from 080a39f4 to 080a39f8 has its CatchHandler @ 080a3a74 - TReadScriptFile::~TReadScriptFile((TReadScriptFile *)(Ident + 0x1c),(int)pcVar3); - return; - } - uVar14 = stack0xffffc004 == 1; - if (!(bool)uVar14) { - TReadScriptFile::error((TReadScriptFile *)(Ident + 0x1c),"identifier expected"); - } - pcVar3 = TReadScriptFile::getIdentifier((TReadScriptFile *)(Ident + 0x1c)); - strcpy(local_401c,pcVar3); - pcVar3 = (char *)0x3d; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'='); - iVar11 = 5; - pcVar9 = local_401c; - pcVar12 = "name"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pcVar3 = TReadScriptFile::readString((TReadScriptFile *)(Ident + 0x1c)); - strcpy(RaceData[iVar10].Name,pcVar3); - } - iVar11 = 8; - pcVar9 = local_401c; - pcVar12 = "article"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pcVar3 = TReadScriptFile::readString((TReadScriptFile *)(Ident + 0x1c)); - uVar14 = RaceData[iVar10].Article == (char *)0x0; - strcpy(RaceData[iVar10].Article,pcVar3); - } - iVar11 = 7; - pcVar9 = local_401c; - pcVar12 = "outfit"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pcVar3 = Ident + 0x1c; - uVar14 = &RaceData[iVar10].Outfit == (TOutfit *)0x0; - TOutfit::load(&RaceData[iVar10].Outfit,(TReadScriptFile *)pcVar3); - } - iVar11 = 7; - pcVar9 = local_401c; - pcVar12 = "corpse"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - ObjectType::setTypeID((ObjectType *)&HelpOutfit.field_1,iVar11); - ObjectType::setTypeID(&RaceData[iVar10].MaleCorpse,(int)HelpOutfit.field_1); - ObjectType::setTypeID(local_402c,RaceData[iVar10].MaleCorpse.TypeID); - uVar14 = &RaceData[iVar10].FemaleCorpse == (ObjectType *)0x0; - ObjectType::setTypeID(local_402c,RaceData[iVar10].MaleCorpse.TypeID); - ObjectType::setTypeID(&RaceData[iVar10].FemaleCorpse,local_402c[0].TypeID); - pcVar3 = (char *)RaceData[iVar10].FemaleCorpse.TypeID; - ObjectType::setTypeID((ObjectType *)&HelpOutfit.field_1,(int)pcVar3); - } - iVar11 = 8; - pcVar9 = local_401c; - pcVar12 = "corpses"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - ObjectType::setTypeID(local_402c,iVar11); - ObjectType::setTypeID(&RaceData[iVar10].MaleCorpse,local_402c[0].TypeID); - ObjectType::setTypeID - ((ObjectType *)&HelpOutfit.field_1,RaceData[iVar10].MaleCorpse.TypeID); - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - uVar14 = &RaceData[iVar10].FemaleCorpse == (ObjectType *)0x0; - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - ObjectType::setTypeID(local_402c,iVar11); - ObjectType::setTypeID(&RaceData[iVar10].FemaleCorpse,local_402c[0].TypeID); - pcVar3 = (char *)RaceData[iVar10].FemaleCorpse.TypeID; - ObjectType::setTypeID((ObjectType *)&HelpOutfit.field_1,(int)pcVar3); - } - iVar11 = 6; - pcVar9 = local_401c; - pcVar12 = "blood"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pcVar9 = TReadScriptFile::readIdentifier((TReadScriptFile *)(Ident + 0x1c)); - iVar11 = 6; - pcVar12 = pcVar9; - pcVar13 = "blood"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].Blood = BT_BLOOD; - } - else { - iVar11 = 6; - pcVar12 = pcVar9; - pcVar13 = "slime"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].Blood = BT_SLIME; - } - else { - iVar11 = 6; - pcVar12 = pcVar9; - pcVar13 = "bones"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].Blood = BT_BONES; - } - else { - iVar11 = 5; - pcVar12 = pcVar9; - pcVar13 = "fire"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].Blood = BT_FIRE; - } - else { - iVar11 = 7; - pcVar12 = "energy"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].Blood = BT_ENERGY; - } - else { - pcVar3 = "unknown blood type"; - TReadScriptFile::error - ((TReadScriptFile *)(Ident + 0x1c), - "unknown blood type"); - } - } - } - } - } - } - iVar11 = 0xb; - pcVar9 = local_401c; - pcVar12 = "experience"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].ExperiencePoints = iVar11; - } - iVar11 = 0xb; - pcVar9 = local_401c; - pcVar12 = "summoncost"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].SummonCost = iVar11; - } - iVar11 = 0xe; - pcVar9 = local_401c; - pcVar12 = "fleethreshold"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].FleeThreshold = iVar11; - } - iVar11 = 7; - pcVar9 = local_401c; - pcVar12 = "attack"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].Attack = iVar11; - } - iVar11 = 7; - pcVar9 = local_401c; - pcVar12 = "defend"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].Defend = iVar11; - } - iVar11 = 6; - pcVar9 = local_401c; - pcVar12 = "armor"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].Armor = iVar11; - } - iVar11 = 7; - pcVar9 = local_401c; - pcVar12 = "poison"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].Poison = iVar11; - } - iVar11 = 0xb; - pcVar9 = local_401c; - pcVar12 = "losetarget"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - RaceData[iVar10].LoseTarget = iVar11; - } - iVar11 = 9; - pcVar9 = local_401c; - pcVar12 = "strategy"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = 0; - do { - if (iVar11 != 0) { - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - } - iVar7 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - *(int *)(iVar10 * 0x150 + 0x81c47b8 + iVar11 * 4) = iVar7; - iVar11 = iVar11 + 1; - uVar14 = iVar11 == 3; - } while (iVar11 < 4); - pcVar3 = (char *)0x29; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),')'); - } - iVar11 = 6; - pcVar9 = local_401c; - pcVar12 = "flags"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pcVar3 = (char *)0x7b; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'{'); - do { - pcVar9 = TReadScriptFile::readIdentifier((TReadScriptFile *)(Ident + 0x1c)); - iVar11 = 10; - pcVar12 = pcVar9; - pcVar13 = "kickboxes"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].KickBoxes = true; - } - iVar11 = 0xe; - pcVar12 = pcVar9; - pcVar13 = "kickcreatures"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].KickCreatures = true; - } - iVar11 = 0xd; - pcVar12 = pcVar9; - pcVar13 = "seeinvisible"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].SeeInvisible = true; - } - iVar11 = 0xb; - pcVar12 = pcVar9; - pcVar13 = "unpushable"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].Unpushable = true; - } - iVar11 = 0x11; - pcVar12 = pcVar9; - pcVar13 = "distancefighting"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].DistanceFighting = true; - } - iVar11 = 9; - pcVar12 = pcVar9; - pcVar13 = "nosummon"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoSummon = true; - } - iVar11 = 0xb; - pcVar12 = pcVar9; - pcVar13 = "noconvince"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoConvince = true; - } - iVar11 = 0xb; - pcVar12 = pcVar9; - pcVar13 = "noillusion"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoIllusion = true; - } - iVar11 = 10; - pcVar12 = pcVar9; - pcVar13 = "noburning"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoBurning = true; - } - iVar11 = 9; - pcVar12 = pcVar9; - pcVar13 = "nopoison"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoPoison = true; - } - iVar11 = 9; - pcVar12 = pcVar9; - pcVar13 = "noenergy"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoEnergy = true; - } - iVar11 = 6; - pcVar12 = pcVar9; - pcVar13 = "nohit"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoHit = true; - } - iVar11 = 0xc; - pcVar12 = pcVar9; - pcVar13 = "nolifedrain"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar12 == *pcVar13; - pcVar12 = pcVar12 + 1; - pcVar13 = pcVar13 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoLifeDrain = true; - } - iVar11 = 0xb; - pcVar12 = "noparalyze"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - RaceData[iVar10].NoParalyze = true; - } - cVar2 = TReadScriptFile::readSpecial((TReadScriptFile *)(Ident + 0x1c)); - uVar14 = cVar2 == '}'; - } while (!(bool)uVar14); - } - iVar11 = 7; - pcVar9 = local_401c; - pcVar12 = "skills"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'{'); - do { - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - pcVar3 = TReadScriptFile::readIdentifier((TReadScriptFile *)(Ident + 0x1c)); - iVar11 = GetSkillByName(pcVar3); - if (iVar11 == -1) { - TReadScriptFile::error - ((TReadScriptFile *)(Ident + 0x1c),"unknown skill name"); - } - iVar7 = RaceData[iVar10].Skills + 1; - RaceData[iVar10].Skills = iVar7; - pTVar8 = vector::operator()(&RaceData[iVar10].Skill,iVar7); - pTVar8->Nr = iVar11; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - pTVar1 = (TReadScriptFile *)(Ident + 0x1c); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar8->Actual = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar8->Minimum = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar8->Maximum = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar8->NextLevel = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar8->FactorPercent = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar8->AddLevel = iVar11; - pcVar3 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - cVar2 = TReadScriptFile::readSpecial(pTVar1); - uVar14 = cVar2 == '}'; - } while (!(bool)uVar14); - } - iVar11 = 5; - pcVar9 = local_401c; - pcVar12 = "talk"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'{'); - do { - RaceData[iVar10].Talks = RaceData[iVar10].Talks + 1; - pcVar3 = TReadScriptFile::readString((TReadScriptFile *)(Ident + 0x1c)); - uVar5 = AddDynamicString(pcVar3); - pcVar3 = (char *)RaceData[iVar10].Talks; - puVar6 = vector<>::operator()(&RaceData[iVar10].Talk,(int)pcVar3); - *puVar6 = uVar5; - cVar2 = TReadScriptFile::readSpecial((TReadScriptFile *)(Ident + 0x1c)); - uVar14 = cVar2 == '}'; - } while (!(bool)uVar14); - } - iVar11 = 10; - pcVar9 = local_401c; - pcVar12 = "inventory"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'{'); - do { - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = RaceData[iVar10].Items + 1; - RaceData[iVar10].Items = iVar11; - this = vector::operator()(&RaceData[iVar10].Item,iVar11); - pTVar1 = (TReadScriptFile *)(Ident + 0x1c); - iVar11 = TReadScriptFile::readNumber(pTVar1); - ObjectType::setTypeID(local_402c,iVar11); - ObjectType::setTypeID(&this->Type,local_402c[0].TypeID); - ObjectType::setTypeID((ObjectType *)&HelpOutfit.field_1,(this->Type).TypeID); - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - this->Maximum = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - this->Probability = iVar11; - pcVar3 = (char *)0x29; - TReadScriptFile::readSymbol(pTVar1,')'); - cVar2 = TReadScriptFile::readSpecial(pTVar1); - uVar14 = cVar2 == '}'; - } while (!(bool)uVar14); - } - iVar11 = 7; - pcVar9 = local_401c; - pcVar12 = "spells"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - } while (!(bool)uVar14); - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'{'); - do { - iVar11 = RaceData[iVar10].Spells + 1; - uVar14 = iVar11 == 0; - RaceData[iVar10].Spells = iVar11; - pTVar4 = vector::operator()(&RaceData[iVar10].Spell,iVar11); - pcVar3 = TReadScriptFile::readIdentifier((TReadScriptFile *)(Ident + 0x1c)); - iVar11 = 6; - pcVar9 = pcVar3; - pcVar12 = "actor"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Shape = SHAPE_ACTOR; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ShapeParam1 = iVar11; -LAB_080a2c00: - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),')'); - } - else { - iVar11 = 7; - pcVar9 = pcVar3; - pcVar12 = "victim"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Shape = SHAPE_VICTIM; -LAB_080a2b8a: - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ShapeParam1 = iVar11; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - pTVar1 = (TReadScriptFile *)(Ident + 0x1c); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ShapeParam2 = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ShapeParam3 = iVar11; - goto LAB_080a2c00; - } - iVar11 = 7; - pcVar9 = pcVar3; - pcVar12 = "origin"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Shape = SHAPE_ORIGIN; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ShapeParam1 = iVar11; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ShapeParam2 = iVar11; - goto LAB_080a2c00; - } - iVar11 = 0xc; - pcVar9 = pcVar3; - pcVar12 = "destination"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Shape = SHAPE_DESTINATION; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ShapeParam1 = iVar11; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - pTVar1 = (TReadScriptFile *)(Ident + 0x1c); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ShapeParam2 = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ShapeParam3 = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ShapeParam4 = iVar11; - goto LAB_080a2c00; - } - iVar11 = 6; - pcVar9 = "angle"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar3 == *pcVar9; - pcVar3 = pcVar3 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Shape = SHAPE_ANGLE; - goto LAB_080a2b8a; - } - TReadScriptFile::error((TReadScriptFile *)(Ident + 0x1c),"unknown spell shape"); - } - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'I'); - pcVar3 = TReadScriptFile::readIdentifier((TReadScriptFile *)(Ident + 0x1c)); - iVar11 = 7; - pcVar9 = pcVar3; - pcVar12 = "damage"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_DAMAGE; - goto LAB_080a2f08; - } - iVar11 = 6; - pcVar9 = pcVar3; - pcVar12 = "field"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_FIELD; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ImpactParam1 = iVar11; -LAB_080a2d71: - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),')'); - } - else { - iVar11 = 8; - pcVar9 = pcVar3; - pcVar12 = "healing"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_HEALING; -LAB_080a2d18: - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ImpactParam1 = iVar11; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ImpactParam2 = iVar11; - goto LAB_080a2d71; - } - iVar11 = 6; - pcVar9 = pcVar3; - pcVar12 = "speed"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_SPEED; -LAB_080a2f08: - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ImpactParam1 = iVar11; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - pTVar1 = (TReadScriptFile *)(Ident + 0x1c); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ImpactParam2 = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ImpactParam3 = iVar11; - goto LAB_080a2d71; - } - iVar11 = 8; - pcVar9 = pcVar3; - pcVar12 = "drunken"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_DRUNKEN; - goto LAB_080a2f08; - } - iVar11 = 9; - pcVar9 = pcVar3; - pcVar12 = "strength"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_STRENGTH; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ImpactParam1 = iVar11; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - pTVar1 = (TReadScriptFile *)(Ident + 0x1c); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ImpactParam2 = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); - iVar11 = TReadScriptFile::readNumber(pTVar1); - pTVar4->ImpactParam3 = iVar11; - TReadScriptFile::readSymbol(pTVar1,','); -LAB_080a2e6c: - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ImpactParam4 = iVar11; - goto LAB_080a2d71; - } - iVar11 = 7; - pcVar9 = pcVar3; - pcVar12 = "outfit"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar9 == *pcVar12; - pcVar9 = pcVar9 + 1; - pcVar12 = pcVar12 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_OUTFIT; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),'('); - TOutfit::load((TOutfit *)&Shape,(TReadScriptFile *)(Ident + 0x1c)); - pTVar4->ImpactParam1 = (int)Shape; - pTVar4->ImpactParam2 = (uint)(ushort)HelpOutfit.OutfitID; - pTVar4->ImpactParam3 = (uint)HelpOutfit.OutfitID._2_2_; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),','); - goto LAB_080a2e6c; - } - iVar11 = 7; - pcVar9 = "summon"; - do { - if (iVar11 == 0) break; - iVar11 = iVar11 + -1; - uVar14 = *pcVar3 == *pcVar9; - pcVar3 = pcVar3 + 1; - pcVar9 = pcVar9 + 1; - } while ((bool)uVar14); - if ((bool)uVar14) { - pTVar4->Impact = IMPACT_SUMMON; - goto LAB_080a2d18; - } - TReadScriptFile::error((TReadScriptFile *)(Ident + 0x1c),"unknown spell impact"); - } - pcVar3 = (char *)0x3a; - TReadScriptFile::readSymbol((TReadScriptFile *)(Ident + 0x1c),':'); - iVar11 = TReadScriptFile::readNumber((TReadScriptFile *)(Ident + 0x1c)); - pTVar4->Delay = iVar11; - if (iVar11 == 0) { - pcVar3 = "zero spell delay"; - TReadScriptFile::error((TReadScriptFile *)(Ident + 0x1c),"zero spell delay"); - } - cVar2 = TReadScriptFile::readSpecial((TReadScriptFile *)(Ident + 0x1c)); - } while (cVar2 != '}'); - } while( true ); -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void LoadRaces(void) - -{ - char *__s; - dirent *DirEntry; - DIR *__dirp; - dirent *pdVar1; - size_t sVar2; - undefined4 *puVar3; - int iVar4; - char *s; - char *pcVar5; - char *pcVar6; - bool bVar7; - DIR *WorkDir; - char FileName [4096]; - - __dirp = opendir(MONSTERPATH); - if (__dirp == (DIR *)0x0) { - error("LoadRaces: Unterverzeichnis %s nicht gefunden\n",MONSTERPATH); - puVar3 = (undefined4 *)__cxa_allocate_exception(4); - *puVar3 = "Cannot load races"; - // WARNING: Subroutine does not return - __cxa_throw(puVar3,char_const*::typeinfo,0); - } - do { - do { - pdVar1 = readdir(__dirp); - if (pdVar1 == (dirent *)0x0) { - closedir(__dirp); - return; - } - __s = pdVar1->d_name; - sVar2 = strlen(__s); - bVar7 = sVar2 == 4; - } while (sVar2 < 5); - iVar4 = 4; - pcVar5 = __s + (sVar2 - 4); - pcVar6 = ".mon"; - do { - if (iVar4 == 0) break; - iVar4 = iVar4 + -1; - bVar7 = *pcVar5 == *pcVar6; - pcVar5 = pcVar5 + 1; - pcVar6 = pcVar6 + 1; - } while (bVar7); - if (bVar7) { - sprintf((char *)&WorkDir,"%s/%s",MONSTERPATH,__s); - // try { // try from 080a3b22 to 080a3b7f has its CatchHandler @ 080a3b80 - LoadRace((char *)&WorkDir); - } - } while( true ); -} - - - // DWARF original prototype: void TAttackWave(TAttackWave * this) void __thiscall TAttackWave::TAttackWave(TAttackWave *this) @@ -46873,415 +45654,6 @@ void __static_initialization_and_destruction_0(int __initialize_p,int __priority } - -int GetSkillByName(char *Name) - -{ - int iVar1; - byte *pbVar2; - byte *pbVar3; - bool bVar4; - bool bVar5; - bool bVar6; - - iVar1 = 6; - bVar4 = &stack0xfffffffc < (undefined1 *)0xc; - bVar6 = &stack0x00000000 == (undefined1 *)0x10; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)0x80f09da; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar4 = *pbVar2 < *pbVar3; - bVar6 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar6); - iVar1 = 0; - bVar5 = (!bVar4 && !bVar6) < bVar4; - bVar4 = (!bVar4 && !bVar6) == bVar4; - if (!bVar4) { - iVar1 = 0xb; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"magiclevel"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 1; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 10; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"hitpoints"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 2; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 5; - pbVar2 = (byte *)Name; - pbVar3 = &DAT_081075e9; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 3; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 0xb; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"gostrength"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 4; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 0xe; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"carrystrength"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 5; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 10; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"shielding"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 6; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 0x11; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"distancefighting"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 7; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 0xe; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"swordfighting"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 8; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 0xd; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"clubfighting"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 9; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 0xc; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"axefighting"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 10; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 0xd; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"fistfighting"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0xb; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 0xd; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"magicdefense"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0xc; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 8; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"fishing"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0xd; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 7; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"eating"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0xe; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 8; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"shining"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0xf; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 9; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)0x81028c5; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0x10; - bVar5 = (!bVar6 && !bVar4) < - bVar6; - bVar4 = (!bVar6 && !bVar4) == - bVar6; - if (!bVar4) { - iVar1 = 7; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)0x81028da; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < * - pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0x11; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 8; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)0x81028d0; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0x12; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 7; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)0x81028e3; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0x13; - bVar6 = (!bVar5 && !bVar4) < bVar5; - bVar4 = (!bVar5 && !bVar4) == bVar5; - if (!bVar4) { - iVar1 = 8; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"drunken"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0x14; - bVar5 = (!bVar6 && !bVar4) < bVar6; - bVar4 = (!bVar6 && !bVar4) == bVar6; - if (!bVar4) { - iVar1 = 0xb; - pbVar2 = (byte *)Name; - pbVar3 = (byte *)"manashield"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar5 = *pbVar2 < *pbVar3; - bVar4 = *pbVar2 == *pbVar3; - pbVar2 = pbVar2 + 1; - pbVar3 = pbVar3 + 1; - } while (bVar4); - iVar1 = 0x15; - bVar6 = (!bVar5 && !bVar4) < bVar5 - ; - bVar4 = (!bVar5 && !bVar4) == - bVar5; - if (!bVar4) { - iVar1 = 0xb; - pbVar2 = (byte *)"soulpoints"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar6 = (byte)*Name < - *pbVar2; - bVar4 = *Name == *pbVar2; - Name = (char *)((byte *) - Name + 1); - pbVar2 = pbVar2 + 1; - } while (bVar4); - iVar1 = 0x16; - if ((!bVar6 && !bVar4) != bVar6) { - iVar1 = -1; - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - return iVar1; -} - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void InitCrskill(void) - -{ - return; -} - - - -// WARNING: Unknown calling convention -- yet parameter storage is locked - -void ExitCrskill(void) - -{ - return; -} - - - // WARNING: Unknown calling convention -- yet parameter storage is locked void _GLOBAL__I__Z14GetSkillByNamePc(void) diff --git a/src/cr.hh b/src/cr.hh index a81b59b..ff96e88 100644 --- a/src/cr.hh +++ b/src/cr.hh @@ -16,6 +16,7 @@ struct TOutfit{ union{ uint16 ObjectType; uint8 Colors[4]; + uint32 PackedData; }; }; @@ -742,6 +743,22 @@ void ExitKillStatistics(void); bool IsRaceValid(int Race); int GetRaceByName(const char *RaceName); +const char *GetRaceName(int Race); +TOutfit GetRaceOutfit(int Race); +bool GetRaceNoSummon(int Race); +bool GetRaceNoConvince(int Race); +bool GetRaceNoIllusion(int Race); +bool GetRaceNoParalyze(int Race); +int GetRaceSummonCost(int Race); +int GetRacePoison(int Race); +bool GetRaceUnpushable(int Race); + +TOutfit ReadOutfit(TReadScriptFile *Script); +void WriteOutfit(TReadScriptFile *Script, TOutfit Outfit); + +// crskill.cc +// ============================================================================= +int GetSkillByName(const char *Name); // crnonpl.cc // ============================================================================= diff --git a/src/crmain.cc b/src/crmain.cc index 6a9602d..48d31be 100644 --- a/src/crmain.cc +++ b/src/crmain.cc @@ -1239,7 +1239,461 @@ int GetRaceByName(const char *RaceName){ return Result; } -void LoadRaces(void); //TODO +const char *GetRaceName(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceName: Ungültige Rassen-Nummer %d.\n", Race); + return NULL; + } + + return RaceData[Race].Name; +} + +TOutfit GetRaceOutfit(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceOutfit: Ungültige Rassen-Nummer %d.\n", Race); + return RaceData[1].Outfit; + } + + return RaceData[Race].Outfit; +} + +bool GetRaceNoSummon(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceNoSummon: Ungültige Rassen-Nummer %d.\n", Race); + return true; + } + + return RaceData[Race].NoSummon; +} + +bool GetRaceNoConvince(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceNoConvince: Ungültige Rassen-Nummer %d.\n", Race); + return true; + } + + return RaceData[Race].NoConvince; +} + +bool GetRaceNoIllusion(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceNoIllusion: Ungültige Rassen-Nummer %d.\n", Race); + return true; + } + + return RaceData[Race].NoIllusion; +} + +bool GetRaceNoParalyze(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceNoParalyze: Ungültige Rassen-Nummer %d.\n", Race); + return true; + } + + return RaceData[Race].NoParalyze; +} + +int GetRaceSummonCost(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceSummonCost: Ungültige Rassen-Nummer %d.\n", Race); + return 0; + } + + return RaceData[Race].SummonCost; +} + +int GetRacePoison(int Race){ + if(!IsRaceValid(Race)){ + error("GetRacePoison: Ungültige Rassen-Nummer %d.\n", Race); + return 0; + } + + return RaceData[Race].Poison; +} + +bool GetRaceUnpushable(int Race){ + if(!IsRaceValid(Race)){ + error("GetRaceUnpushable: Ungültige Rassen-Nummer %d.\n", Race); + return true; + } + + return RaceData[Race].Unpushable; +} + +// TODO(fusion): Probably move this somewhere else? +TOutfit ReadOutfit(TReadScriptFile *Script){ + TOutfit Outfit = {}; + Script->readSymbol('('); + Outfit.OutfitID = Script->readNumber(); + Script->readSymbol(','); + if(Outfit.OutfitID == 0){ + Outfit.ObjectType = (uint16)Script->readNumber(); + }else{ + memcpy(Outfit.Colors, Script->readBytesequence(), sizeof(Outfit.Colors)); + } + Script->readSymbol(')'); +} + +// TODO(fusion): Probably move this somewhere else? +void WriteOutfit(TReadScriptFile *Script, TOutfit Outfit){ + Script->writeText("("); + Script->writeNumber(Outfit.OutfitID); + Script->writeText(","); + if(Outfit.OutfitID == 0){ + Script->writeNumber((int)Outfit.ObjectType); + }else{ + Script->writeBytesequence(Outfit.Colors, sizeof(Outfit.Colors)); + } + Script->writeText(")"); +} + +void LoadRace(const char *FileName){ + TReadScriptFile Script; + + Script.open(FileName); + + // NOTE(fusion): It seems we expect `RaceNumber` to be the first attribute + // declared in a race file. + if(strcmp(Script.readIdentifier(), "racenumber") != 0){ + Script.error("race number expected"); + } + + Script.readSymbol('='); + + int RaceNumber = Script.readNumber(); + if(!IsRaceValid(Race)){ + Script.error("illegal race number"); + } + + TRaceData *Race = &RaceData[RaceNumber]; + if(Race->Name[0] != 0){ + Script.error("race already defined"); + } + + Race->Outfit = TOutfit{}; + Race->Outfit.OutfitID = RaceNumber; + + while(true){ + Script.nextToken(); + if(Script.Token == ENDOFFILE){ + Script.close(); + break; + } + + char Identifier[MAX_IDENT_LENGTH]; + strcpy(Identifier, Script.getIdentifier()); + Script.readSymbol('='); + + if(strcmp(Identifier, "name") == 0){ + strcpy(Race->Name, Script.readString()); + }else if(strcmp(Identifier, "article") == 0){ + strcpy(Race->Article, Script.readString()); + }else if(strcmp(Identifier, "outfit") == 0){ + Race->Outfit = ReadOutfit(Script); + }else if(strcmp(Identifier, "corpse") == 0){ + int CorpseTypeID = Script.readNumber(); + Race->MaleCorpse = CorpseTypeID; + Race->FemaleCorpse = CorpseTypeID; + }else if(strcmp(Identifier, "corpses") == 0){ + Race->MaleCorpse = Script.readNumber(); + Script.readSymbol(','); + Race->FemaleCorpse = Script.readNumber(); + }else if(strcmp(Identifier, "blood") == 0){ + const char *Blood = Script.readIdentifier(); + if(strcmp(Blood, "blood") == 0){ + Race->Blood = BT_BLOOD; + }else if(strcmp(Blood, "slime") == 0){ + Race->Blood = BT_SLIME; + }else if(strcmp(Blood, "bones") == 0){ + Race->Blood = BT_BONES; + }else if(strcmp(Blood, "fire") == 0){ + Race->Blood = BT_FIRE; + }else if(strcmp(Blood, "energy") == 0){ + Race->Blood = BT_ENERGY; + }else{ + Script.error("unknown blood type"); + } + }else if(strcmp(Identifier, "experience") == 0){ + Race->ExperiencePoints = Script.readNumber(); + }else if(strcmp(Identifier, "summoncost") == 0){ + Race->SummonCost = Script.readNumber(); + }else if(strcmp(Identifier, "fleethreshold") == 0){ + Race->FleeThreshold = Script.readNumber(); + }else if(strcmp(Identifier, "attack") == 0){ + Race->Attack = Script.readNumber(); + }else if(strcmp(Identifier, "defend") == 0){ + Race->Defend = Script.readNumber(); + }else if(strcmp(Identifier, "armor") == 0){ + Race->Armor = Script.readNumber(); + }else if(strcmp(Identifier, "poison") == 0){ + Race->Poison = Script.readNumber(); + }else if(strcmp(Identifier, "losetarget") == 0){ + Race->LoseTarget = Script.readNumber(); + }else if(strcmp(Identifier, "strategy") == 0){ + Script.readSymbol('('); + Race->Strategy[0] = Script.readNumber(); + Script.readSymbol(','); + Race->Strategy[1] = Script.readNumber(); + Script.readSymbol(','); + Race->Strategy[2] = Script.readNumber(); + Script.readSymbol(','); + Race->Strategy[3] = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(Identifier, "flags") == 0){ + Script.readSymbol('{'); + do{ + const char *Flag = Script.getIdentifier(); + if(strcmp(Flag, "kickboxes") == 0){ + Race->KickBoxes = true; + }else if(strcmp(Flag, "kickcreatures") == 0){ + Race->KickCreatures = true; + }else if(strcmp(Flag, "seeinvisible") == 0){ + Race->SeeInvisible = true; + }else if(strcmp(Flag, "unpushable") == 0){ + Race->Unpushable = true; + }else if(strcmp(Flag, "distancefighting") == 0){ + Race->DistanceFighting = true; + }else if(strcmp(Flag, "nosummon") == 0){ + Race->NoSummon = true; + }else if(strcmp(Flag, "noconvince") == 0){ + Race->NoConvince = true; + }else if(strcmp(Flag, "noillusion") == 0){ + Race->NoIllusion = true; + }else if(strcmp(Flag, "noburning") == 0){ + Race->NoBurning = true; + }else if(strcmp(Flag, "nopoison") == 0){ + Race->NoPoison = true; + }else if(strcmp(Flag, "noenergy") == 0){ + Race->NoEnergy = true; + }else if(strcmp(Flag, "nohit") == 0){ + Race->NoHit = true; + }else if(strcmp(Flag, "nolifedrain") == 0){ + Race->NoLifeDrain = true; + }else if(strcmp(Flag, "noparalyze") == 0){ + Race->NoParalyze = true; + }else{ + Script.error("unknown flag"); + } + }while(Script.readSpecial() != '}'); + }else if(strcmp(Identifier, "skills") == 0){ + Script.readSymbol('{'); + do{ + Script.readSymbol('('); + int SkillNr = GetSkillByName(Script.readIdentifier()); + if(SkillNr == -1){ + Script.error("unknown skill name"); + } + + // NOTE(fusion): Skills are indexed from 1. + Race->Skills += 1; + TSkillData *SkillData = Race->Skill.at(Race->Skills); + SkillData->Nr = SkillNr; + Script.readSymbol(','); + SkillData->Actual = Script.readNumber(); + Script.readSymbol(','); + SkillData->Minimum = Script.readNumber(); + Script.readSymbol(','); + SkillData->Maximum = Script.readNumber(); + Script.readSymbol(','); + SkillData->NextLevel = Script.readNumber(); + Script.readSymbol(','); + SkillData->FactorPercent = Script.readNumber(); + Script.readSymbol(','); + SkillData->AddLevel = Script.readNumber(); + Script.readSymbol(')'); + }while(Script.readSpecial() != '}'); + }else if(strcmp(Identifier, "talk") == 0){ + Script.readSymbol('{'); + do{ + // NOTE(fusion): Talks are indexed from 1. + Race->Talks += 1; + *Race->Talk.at(Race->Talks) = AddDynamicString(Script.readString()); + }while(Script.readSpecial() != '}'); + }else if(strcmp(Identifier, "inventory") == 0){ + Script.readSymbol('{'); + do{ + Script.readSymbol('('); + // NOTE(fusion): Items are indexed from 1. + Race->Items += 1; + TItemData *ItemData = Race->Item.at(Race->Items); + ItemData->Type = Script.readNumber(); + Script.readSymbol(','); + ItemData->Maximum = Script.readNumber(); + Script.readSymbol(','); + ItemData->Probability = Script.readNumber(); + Script.readSymbol(')'); + }while(Script.readSpecial() != '}'); + }else if(strcmp(Identifier, "spells") == 0){ + Script.readSymbol('{'); + do{ + Race->Spells += 1; + TSpellData *SpellData = Race->Spell.at(Race->Spells); + + // NOTE(fusion): Spell shape. + { + const char *SpellShape = Script.readIdentifier(); + if(strcmp(SpellShape, "actor") == 0){ + SpellData->Shape = SHAPE_ACTOR; + Script.readSymbol('('); + SpellData->ShapeParam1 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellShape, "victim") == 0){ + SpellData->Shape = SHAPE_VICTIM; + Script.readSymbol('('); + SpellData->ShapeParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam2 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam3 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellShape, "origin") == 0){ + SpellData->Shape = SHAPE_ORIGIN; + Script.readSymbol('('); + SpellData->ShapeParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam2 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellShape, "destination") == 0){ + SpellData->Shape = SHAPE_DESTINATION; + Script.readSymbol('('); + SpellData->ShapeParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam2 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam3 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam4 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellShape, "angle") == 0){ + SpellData->Shape = SHAPE_ANGLE; + Script.readSymbol('('); + SpellData->ShapeParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam2 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ShapeParam3 = Script.readNumber(); + Script.readSymbol(')'); + }else{ + Script.error("unknown spell shape"); + } + } + + Script.readSymbol('I'); + + // NOTE(fusion): Spell impact. + { + const char *SpellImpact = Script.readIdentifier(); + if(strcmp(SpellImpact, "damage") == 0){ + SpellData->Impact = IMPACT_DAMAGE; + Script.readSymbol('('); + SpellData->ImpactParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam2 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam3 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellImpact, "field") == 0){ + SpellData->Impact = IMPACT_FIELD; + Script.readSymbol('('); + SpellData->ImpactParam1 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellImpact, "healing") == 0){ + SpellData->Impact = IMPACT_HEALING; + Script.readSymbol('('); + SpellData->ImpactParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam2 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellImpact, "speed") == 0){ + SpellData->Impact = IMPACT_SPEED; + Script.readSymbol('('); + SpellData->ImpactParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam2 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam3 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellImpact, "drunken") == 0){ + SpellData->Impact = IMPACT_DRUNKEN; + Script.readSymbol('('); + SpellData->ImpactParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam2 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam3 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellImpact, "strength") == 0){ + SpellData->Impact = IMPACT_STRENGTH; + Script.readSymbol('('); + SpellData->ImpactParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam2 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam3 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam4 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellImpact, "outfit") == 0){ + SpellData->Impact = IMPACT_OUTFIT; + Script.readSymbol('('); + TOutfit Outfit = ReadOutfit(Script); + SpellData->ImpactParam1 = Outfit.OutfitID; + SpellData->ImpactParam2 = (int)Outfit.PackedData; + Script.readSymbol(','); + SpellData->ImpactParam3 = Script.readNumber(); + Script.readSymbol(')'); + }else if(strcmp(SpellImpact, "summon") == 0){ + SpellData->Impact = IMPACT_SUMMON; + Script.readSymbol('('); + SpellData->ImpactParam1 = Script.readNumber(); + Script.readSymbol(','); + SpellData->ImpactParam2 = Script.readNumber(); + Script.readSymbol(')'); + }else{ + Script.error("unknown spell impact"); + } + } + + Script.readSymbol(':'); + + // NOTE(fusion): Spell delay. + { + SpellData->Delay = Script.readNumber(); + if(SpellData->Delay == 0){ + Script.error("zero spell delay"); + } + } + }while(Script.readSpecial() != '}'); + }else{ + Script.error("unknown race field"); + } + } +} + +void LoadRaces(void){ + // TODO(fusion): It is possible to leak `MonsterDir` if `LoadRace` throws on + // errors (which it does). This is usually not a problem because failing here + // means we're cascading back to `InitAll` which will report the error and + // exit, but it is something to keep in mind for any functions that uses + // exceptions with non-RAII resources. + + DIR *MonsterDir = opendir(MONSTERPATH); + if(MonsterDir == NULL){ + error("LoadRaces: Unterverzeichnis %s nicht gefunden\n", MONSTERPATH); + throw "Cannot load races"; + } + + char FilePath[4096]; + while(dirent *DirEntry = readdir(MonsterDir)){ + const char *FileExt = findLast(DirEntry->d_name, '.'); + if(FileExt != NULL && strcmp(FileExt, ".mon") == 0){ + snprintf(FilePath, sizeof(FilePath), "%s/%s", MONSTERPATH, DirEntry->d_name); + LoadRace(FilePath); + } + } + + closedir(MonsterDir); +} // Monster Raid // ============================================================================= diff --git a/src/crskill.cc b/src/crskill.cc index 8e259a8..84402ee 100644 --- a/src/crskill.cc +++ b/src/crskill.cc @@ -345,10 +345,10 @@ bool TSkillLevel::Jump(int Range){ return false; } - this->Master->Skills[SKILL_HITPOINTS ]->Advance(Range); - this->Master->Skills[SKILL_MANA ]->Advance(Range); - this->Master->Skills[SKILL_GO_STRENGTH ]->Advance(Range); - this->Master->Skills[SKILL_CARRY_WEIGHT]->Advance(Range); + this->Master->Skills[SKILL_HITPOINTS ]->Advance(Range); + this->Master->Skills[SKILL_MANA ]->Advance(Range); + this->Master->Skills[SKILL_GO_STRENGTH ]->Advance(Range); + this->Master->Skills[SKILL_CARRY_STRENGTH]->Advance(Range); AnnounceChangedCreature(this->Master->ID, 4); this->Master->Combat.CheckCombatValues(); @@ -1142,7 +1142,7 @@ bool TSkillBase::NewSkill(uint16 SkillNo, TCreature *Creature){ case SKILL_HITPOINTS: Skill = new TSkillHitpoints(SkillNo, Creature); break; case SKILL_MANA: Skill = new TSkillMana(SkillNo, Creature); break; case SKILL_GO_STRENGTH: Skill = new TSkillGoStrength(SkillNo, Creature); break; - case SKILL_CARRY_WEIGHT: Skill = new TSkillCarryStrength(SkillNo, Creature); break; + case SKILL_CARRY_STRENGTH: Skill = new TSkillCarryStrength(SkillNo, Creature); break; case SKILL_FED: Skill = new TSkillFed(SkillNo, Creature); break; case SKILL_LIGHT: Skill = new TSkillLight(SkillNo, Creature); break; case SKILL_ILLUSION: Skill = new TSkillIllusion(SkillNo, Creature); break; @@ -1164,10 +1164,8 @@ bool TSkillBase::SetSkills(int Race){ return false; } - // TODO(fusion): This is referencing some global table with probably all - // types of creatures. - int NumSkills = RaceData[Race].Skills; - for(int i = 0; i < NumSkills; i += 1){ + // NOTE(fusion): Skills are indexed from 1. + for(int i = 1; i <= RaceData[Race].Skills; i += 1){ TSkillData *SkillData = RaceData[Race].Skill.at(i); // BUG(fusion): We don't check if `Skill` is valid? Could be NULL. We @@ -1251,6 +1249,60 @@ void TSkillBase::DelTimer(uint16 SkNr){ } } +// Helpers +//============================================================================== +int GetSkillByName(const char *Name){ + int Result = -1; + if(strcmp(Name, "level") == 0){ + Result = SKILL_LEVEL; + }else if(strcmp(Name, "magiclevel") == 0){ + Result = SKILL_MAGIC_LEVEL; + }else if(strcmp(Name, "hitpoints") == 0){ + Result = SKILL_HITPOINTS; + }else if(strcmp(Name, "mana") == 0){ + Result = SKILL_MANA; + }else if(strcmp(Name, "gostrength") == 0){ + Result = SKILL_GO_STRENGTH; + }else if(strcmp(Name, "carrystrength") == 0){ + Result = SKILL_CARRY_STRENGTH; + }else if(strcmp(Name, "shielding") == 0){ + Result = SKILL_SHIELDING; + }else if(strcmp(Name, "distancefighting") == 0){ + Result = SKILL_DISTANCE; + }else if(strcmp(Name, "swordfighting") == 0){ + Result = SKILL_SWORD; + }else if(strcmp(Name, "clubfighting") == 0){ + Result = SKILL_CLUB; + }else if(strcmp(Name, "axefighting") == 0){ + Result = SKILL_AXE; + }else if(strcmp(Name, "fistfighting") == 0){ + Result = SKILL_FIST; + }else if(strcmp(Name, "magicdefense") == 0){ + Result = SKILL_MAGIC_DEFENSE; + }else if(strcmp(Name, "fishing") == 0){ + Result = SKILL_FISHING; + }else if(strcmp(Name, "eating") == 0){ + Result = SKILL_FED; + }else if(strcmp(Name, "shining") == 0){ + Result = SKILL_LIGHT; + }else if(strcmp(Name, "illusion") == 0){ + Result = SKILL_ILLUSION; + }else if(strcmp(Name, "poison") == 0){ + Result = SKILL_POISON; + }else if(strcmp(Name, "burning") == 0){ + Result = SKILL_BURNING; + }else if(strcmp(Name, "energy") == 0){ + Result = SKILL_ENERGY; + }else if(strcmp(Name, "drunken") == 0){ + Result = SKILL_DRUNK; + }else if(strcmp(Name, "manashield") == 0){ + Result = SKILL_MANASHIELD; + }else if(strcmp(Name, "soulpoints") == 0){ + Result = SKILL_SOUL; + } + return Result; +} + // Initialization //============================================================================== void InitCrskill(void){ diff --git a/src/enums.hh b/src/enums.hh index 8257677..4801e49 100644 --- a/src/enums.hh +++ b/src/enums.hh @@ -415,14 +415,14 @@ enum Skill: int { SKILL_HITPOINTS = 2, SKILL_MANA = 3, SKILL_GO_STRENGTH = 4, // speed? - SKILL_CARRY_WEIGHT = 5, // capacity? + SKILL_CARRY_STRENGTH = 5, // capacity? SKILL_SHIELDING = 6, SKILL_DISTANCE = 7, SKILL_SWORD = 8, SKILL_CLUB = 9, SKILL_AXE = 10, SKILL_FIST = 11, - // 12? + SKILL_MAGIC_DEFENSE = 12, SKILL_FISHING = 13, SKILL_FED = 14, SKILL_LIGHT = 15, diff --git a/src/objects.cc b/src/objects.cc index f617fb9..51171f0 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -576,8 +576,7 @@ static void LoadObjects(void){ } } }else{ - // TODO(fusion): - // error("Invalid object type field \"%s\"", Identifier); + Script.error("Unknown object type field"); } } } diff --git a/src/stubs.hh b/src/stubs.hh index ba87f27..3495a59 100644 --- a/src/stubs.hh +++ b/src/stubs.hh @@ -40,13 +40,6 @@ extern TConnection *GetNextConnection(void); extern const char *GetName(Object Obj); extern Object GetObject(uint32 CreatureID, int x, int y, int z, int RNum, ObjectType Type); extern TPlayer *GetPlayer(uint32 CreatureID); -extern bool GetRaceNoConvince(int Race); -extern bool GetRaceNoIllusion(int Race); -extern bool GetRaceNoParalyze(int Race); -extern bool GetRaceNoSummon(int Race); -extern TOutfit GetRaceOutfit(int Race); -extern int GetRacePoison(int Race); -extern int GetRaceSummonCost(int Race); extern void GraphicalEffect(int x, int y, int z, int Type); extern void GraphicalEffect(Object Obj, int Type); extern int IdentifyPlayer(const char *Name, bool ExactMatch, bool IgnoreGamemasters, TPlayer **Player); -- cgit v1.2.3