aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfusion32 <marcopuzziello@gmail.com>2025-06-07 17:15:40 -0300
committerfusion32 <marcopuzziello@gmail.com>2025-06-07 17:15:40 -0300
commit3d7fcfc4a6a1fc7016145b39596775bcd32be5c1 (patch)
treece0f9045c4b7647f8517ab9febb22edd414dc9bf
parentbd145c3ebfc082286486a8700b9ce20bfd7383e2 (diff)
downloadgame-3d7fcfc4a6a1fc7016145b39596775bcd32be5c1.tar.gz
game-3d7fcfc4a6a1fc7016145b39596775bcd32be5c1.zip
race loading
-rw-r--r--reference/game.c1628
-rw-r--r--src/cr.hh17
-rw-r--r--src/crmain.cc456
-rw-r--r--src/crskill.cc70
-rw-r--r--src/enums.hh4
-rw-r--r--src/objects.cc3
-rw-r--r--src/stubs.hh7
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)
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);