diff options
| author | fusion32 <marcopuzziello@gmail.com> | 2025-06-07 17:15:40 -0300 |
|---|---|---|
| committer | fusion32 <marcopuzziello@gmail.com> | 2025-06-07 17:15:40 -0300 |
| commit | 3d7fcfc4a6a1fc7016145b39596775bcd32be5c1 (patch) | |
| tree | ce0f9045c4b7647f8517ab9febb22edd414dc9bf | |
| parent | bd145c3ebfc082286486a8700b9ce20bfd7383e2 (diff) | |
| download | game-3d7fcfc4a6a1fc7016145b39596775bcd32be5c1.tar.gz game-3d7fcfc4a6a1fc7016145b39596775bcd32be5c1.zip | |
race loading
| -rw-r--r-- | reference/game.c | 1628 | ||||
| -rw-r--r-- | src/cr.hh | 17 | ||||
| -rw-r--r-- | src/crmain.cc | 456 | ||||
| -rw-r--r-- | src/crskill.cc | 70 | ||||
| -rw-r--r-- | src/enums.hh | 4 | ||||
| -rw-r--r-- | src/objects.cc | 3 | ||||
| -rw-r--r-- | 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<TSkillData>::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<TItemData>::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<TSpellData>::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)
@@ -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); |
