From c4b06256d92408c4e99bd37b58d66f2024ec0a70 Mon Sep 17 00:00:00 2001 From: fusion32 Date: Sat, 31 May 2025 22:18:08 -0300 Subject: impl TCreature::Damage + overall improvements --- reference/game.c | 628 ------------------------------------------------------- 1 file changed, 628 deletions(-) (limited to 'reference') diff --git a/reference/game.c b/reference/game.c index b5b2520..c003e99 100644 --- a/reference/game.c +++ b/reference/game.c @@ -38167,16 +38167,6 @@ TCreature * GetCreature(Object *Obj) return pTVar1; } - - -bool IsCreaturePlayer(ulong CreatureID) - -{ - return CreatureID < 0x40000000; -} - - - // WARNING: Unknown calling convention -- yet parameter storage is locked void ProcessSkills(void) @@ -38969,49 +38959,6 @@ void WriteKillStatistics(void) return; } - - -void AddKillStatistics(int AttackerRace,int DefenderRace) - -{ - int iVar1; - TRaceData *pTVar2; - char *pcVar3; - bool bVar4; - - bVar4 = AttackerRace * 0x150 == 0; - iVar1 = 6; - pTVar2 = RaceData + AttackerRace; - pcVar3 = "human"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar4 = pTVar2->Name[0] == *pcVar3; - pTVar2 = (TRaceData *)(pTVar2->Name + 1); - pcVar3 = pcVar3 + 1; - } while (bVar4); - if (bVar4) { - KilledCreatures[DefenderRace] = KilledCreatures[DefenderRace] + 1; - } - iVar1 = 6; - bVar4 = DefenderRace * 0x150 == 0; - pTVar2 = RaceData + DefenderRace; - pcVar3 = "human"; - do { - if (iVar1 == 0) break; - iVar1 = iVar1 + -1; - bVar4 = pTVar2->Name[0] == *pcVar3; - pTVar2 = (TRaceData *)(pTVar2->Name + 1); - pcVar3 = pcVar3 + 1; - } while (bVar4); - if (bVar4) { - KilledPlayers[AttackerRace] = KilledPlayers[AttackerRace] + 1; - } - return; -} - - - // WARNING: Unknown calling convention -- yet parameter storage is locked void ExitKillStatistics(void) @@ -39950,581 +39897,6 @@ void __thiscall TCreature::Death(TCreature *this) return; } - - -// DWARF original prototype: int Damage(TCreature * this, TCreature * atk, int Damage, int -// DamageType) - -int __thiscall TCreature::Damage(TCreature *this,TCreature *atk,int Damage,int DamageType) - -{ - TConnection *pTVar1; - bool bVar2; - bool bVar3; - ushort uVar4; - int iVar5; - int iVar6; - int iVar7; - ulong uVar8; - TPlayer *this_00; - int iVar9; - _func_int_varargs **pp_Var10; - TSkill *pTVar11; - CreatureType CVar12; - TSkill *sk_1; - char *pcVar13; - Object *pOVar14; - char *pcVar15; - undefined4 uVar16; - TPlayer *pl; - int Unjustified; - int i; - uint local_88; - ulong MurdererID; - int OldLevel; - int b; - TSkill *sk; - int b_1; - ulong atkID; - TCreature *Responsible; - char Remark [30]; - Object Obj; - Object local_3c [4]; - Object local_2c; - Object Obj_1; - - if (this->IsDead != false) { - return 0; - } - if (this->Type == NPC) { - return 0; - } - if (this->Type == PLAYER) { - CVar12 = PLAYER; - if ((this->Connection != (TConnection *)0x0) && (atk != (TCreature *)0x0)) { - SendMarkCreature((TConnection *)atk->ID,0,(int)this->Connection); - CVar12 = this->Type; - } - if ((((CVar12 == PLAYER) && (atk != (TCreature *)0x0)) && (atk->Type == PLAYER)) && - (((DamageType != 0x20 && (DamageType != 0x40)) && (DamageType != 0x80)))) { - Damage = (Damage + 1) / 2; - } - } - atkID = (ulong)atk; - if (atk == (TCreature *)0x0) { - b_1 = 0; - } - else { - iVar5 = (*atk->_vptr_TCreature[5])(atk); - if (iVar5 != 0) { - uVar8 = (*atk->_vptr_TCreature[5])(atk); - atkID = (ulong)GetCreature(uVar8); - } - b_1 = atk->ID; - } - if (atk != (TCreature *)0x0) { - BlockLogout(atk,0x3c,this->Type == PLAYER); - } - if (((atkID != 0) && - (BlockLogout((TCreature *)atkID,0x3c,this->Type == PLAYER), *(int *)(atkID + 0x28c) == 0)) - && (this->Type == PLAYER)) { - TPlayer::RecordAttack((TPlayer *)atkID,this->ID); - } - if (Damage < 1) { -LAB_080a1ca4: - local_2c.ObjectID = (this->CrObject).ObjectID; - pOVar14 = &local_2c; - } - else { - if (this->Type == PLAYER) { - bVar2 = CheckRight(this->ID,INVULNERABLE); - if (bVar2) goto LAB_080a1ca4; - if (this->Type == PLAYER) { - sk = (TSkill *)0x1; - do { - if (Damage < 1) goto LAB_080a1c71; - bVar2 = false; - GetBodyObject((ulong)&local_2c,this->ID); - local_3c[0].ObjectID = ::NONE.ObjectID; - if (local_2c.ObjectID == ::NONE.ObjectID) { -LAB_080a1d02: - bVar2 = true; - } - else { - Object::getObjectType((Object *)(Remark + 0x1c)); - bVar3 = ObjectType::getFlag((ObjectType *)(Remark + 0x1c),PROTECTION); - if (!bVar3) goto LAB_080a1d02; - } - if (!bVar2) { - Object::getObjectType((Object *)(Remark + 0x1c)); - bVar2 = ObjectType::getFlag((ObjectType *)(Remark + 0x1c),CLOTHES); - if (bVar2) { - Object::getObjectType((Object *)(Remark + 0x1c)); - pTVar11 = (TSkill *) - ObjectType::getAttribute - ((ObjectType *)(Remark + 0x1c),BODYPOSITION); - if (pTVar11 == sk) { - Object::getObjectType((Object *)(Remark + 0x1c)); - uVar8 = ObjectType::getAttribute - ((ObjectType *)(Remark + 0x1c), - PROTECTIONDAMAGETYPES); - if ((DamageType & uVar8) != 0) { - Object::getObjectType((Object *)(Remark + 0x1c)); - uVar8 = ObjectType::getAttribute - ((ObjectType *)(Remark + 0x1c),DAMAGEREDUCTION - ); - Damage = (Damage * (100 - uVar8)) / 100; - Object::getObjectType((Object *)(Remark + 0x1c)); - bVar2 = ObjectType::getFlag((ObjectType *)(Remark + 0x1c), - WEAROUT); - if (bVar2) { - uVar8 = Object::getAttribute(&local_2c,REMAININGUSES); - if (uVar8 < 2) { - // try { // try from 080a1e9f to 080a1ee8 has its CatchHandler @ 080a1f63 - Object::getObjectType(local_3c); - uVar8 = ObjectType::getAttribute - ((ObjectType *)local_3c,WEAROUTTARGET) - ; - ObjectType::setTypeID - ((ObjectType *)(Remark + 0x1c),uVar8); - local_3c[0].ObjectID = local_2c.ObjectID; - Change(local_3c,(ObjectType *)(Remark + 0x1c),0); - } - else { - stack0xffffffb4 = local_2c.ObjectID; - uVar8 = Object::getAttribute(&local_2c,REMAININGUSES); - Change((Object *)(Remark + 0x1c),REMAININGUSES,uVar8 - 1 - ); - } - } - } - } - } - else { - Object::getObjectType((Object *)(Remark + 0x1c)); - error("TCreature::Damage: Objekt %d hat PROTECTION, aber nicht CLOTHES.\n" - ,stack0xffffffb4); - } - } - sk = (TSkill *)((int)&sk->_vptr_TSkill + 1); - } while ((int)sk < 0xb); - } - } - if (0 < Damage) { - if (DamageType == 0x20) { - if (RaceData[this->Race].NoPoison != false) { - return 0; - } - pTVar11 = (this->super_TSkillBase).Skills[0x11]; - iVar5 = (*pTVar11->_vptr_TSkill[0xd])(pTVar11); - if (iVar5 < Damage) { - this->PoisonDamageOrigin = b_1; - TSkillBase::SetTimer(&this->super_TSkillBase); - } - pp_Var10 = this->_vptr_TCreature; - uVar16 = 0x20; -LAB_080a1b71: - (*pp_Var10[7])(this,b_1,Damage,uVar16); - return (int)(Object *)Damage; - } - if (DamageType == 0x40) { - if (RaceData[this->Race].NoBurning != false) { - return 0; - } - this->FireDamageOrigin = b_1; - TSkillBase::SetTimer(&this->super_TSkillBase); - pp_Var10 = this->_vptr_TCreature; - uVar16 = 0x40; - goto LAB_080a1b71; - } - if (DamageType == 0x80) { - if (RaceData[this->Race].NoEnergy != false) { - return 0; - } - this->EnergyDamageOrigin = b_1; - TSkillBase::SetTimer(&this->super_TSkillBase); - pp_Var10 = this->_vptr_TCreature; - uVar16 = 0x80; - goto LAB_080a1b71; - } - if (DamageType == 1) { - uVar4 = TCombat::GetArmorStrength(&this->Combat); - Damage = Damage - (uint)uVar4; - if (0 < Damage) goto LAB_080a0dd2; - } - else { -LAB_080a0dd2: - if ((((DamageType != 2) || (RaceData[this->Race].NoPoison == false)) && - (((DamageType != 4 || (RaceData[this->Race].NoBurning == false)) && - ((DamageType != 8 || (RaceData[this->Race].NoEnergy == false)))))) && - (((DamageType != 1 || (RaceData[this->Race].NoHit == false)) && - ((DamageType != 0x100 || (RaceData[this->Race].NoLifeDrain == false)))))) { - pOVar14 = (Object *)Damage; - iVar5 = DamageType; - (*this->_vptr_TCreature[7])(this,b_1,Damage,DamageType); - bVar2 = false; - if (((this->Outfit).OutfitID == 0) && ((this->Outfit).field_1.ObjectType == 0)) - { - bVar2 = true; - } - if ((bVar2) && (this->Type != PLAYER)) { - iVar5 = 0; - TSkillBase::SetTimer(&this->super_TSkillBase); - iVar9 = (this->OrgOutfit).OutfitID; - (this->Outfit).field_1 = (this->OrgOutfit).field_1; - (this->Outfit).OutfitID = iVar9; - AnnounceChangedCreature(this->ID,3); - pOVar14 = (Object *)(Remark + 0x1c); - stack0xffffffb4 = ::NONE.ObjectID; - local_3c[0].ObjectID = (this->CrObject).ObjectID; - b_1 = 2; - NotifyAllCreatures(local_3c,2,pOVar14); - } - if (DamageType == 0x200) { - pTVar11 = (this->super_TSkillBase).Skills[3]; - iVar5 = TSkill::Get(pTVar11); - if (iVar5 < Damage) { - Damage = TSkill::Get(pTVar11); - } - if ((Object *)Damage != (Object *)0x0) { - TSkill::Change(pTVar11,-Damage); - if ((this->Type == PLAYER) && (this->Connection != (TConnection *)0x0)) - { - SendMessage(this->Connection,0x15,"You lose %d mana.",Damage); - } - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),0xe); - unique0x00009680 = (this->CrObject).ObjectID; - TextualEffect(); - return (int)(Object *)Damage; - } - return 0; - } - pTVar11 = (this->super_TSkillBase).Skills[0x15]; - iVar5 = (*pTVar11->_vptr_TSkill[0xd])(pTVar11,b_1,pOVar14,iVar5); - if ((0 < iVar5) || - (iVar5 = TSkill::Get((this->super_TSkillBase).Skills[0x15]), 0 < iVar5)) { - pTVar11 = (this->super_TSkillBase).Skills[3]; - iVar5 = TSkill::Get(pTVar11); - if (Damage <= iVar5) { - TSkill::Change(pTVar11,-Damage); - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),2); - unique0x00009680 = (this->CrObject).ObjectID; - TextualEffect(); - if (this->Type != PLAYER) { - return (int)(Object *)Damage; - } - pTVar1 = this->Connection; - if (pTVar1 != (TConnection *)0x0) { - if (atk == (TCreature *)0x0) { - SendMessage(pTVar1,0x15,"You lose %d mana.",Damage); - } - else { - SendMessage(pTVar1,0x15, - "You lose %d mana blocking an attack by %s.",Damage, - atk->Name); - } - SendPlayerData(this->Connection); - return (int)(Object *)Damage; - } - return (int)(Object *)Damage; - } - iVar5 = TSkill::Get(pTVar11); - Damage = Damage - iVar5; - (*pTVar11->_vptr_TSkill[2])(pTVar11,0); - } - pTVar11 = (this->super_TSkillBase).Skills[2]; - iVar5 = TSkill::Get(pTVar11); - if (iVar5 < Damage) { - Damage = TSkill::Get(pTVar11); - } - TSkill::Change(pTVar11,-Damage); - if ((TCreature *)atkID == atk) { - pOVar14 = (Object *)Damage; - if (atk != (TCreature *)0x0) goto LAB_080a0fec; - } - else { - if (atkID != 0) { - TCombat::AddDamageToCombatList - (&this->Combat,*(ulong *)(atkID + 0x208),(ushort)(Damage / 2)) - ; - } - if (atk != (TCreature *)0x0) { - pOVar14 = (Object *)(Damage / 2); -LAB_080a0fec: - TCombat::AddDamageToCombatList(&this->Combat,atk->ID,(ushort)pOVar14); - } - } - if (DamageType == 4) { - unique0x00009680 = (this->CrObject).ObjectID; - iVar5 = 0x10; -LAB_080a17a3: - GraphicalEffect((Object *)(Remark + 0x1c),iVar5); - unique0x00009680 = (this->CrObject).ObjectID; - pOVar14 = (Object *)0xc6; -LAB_080a1080: - pcVar15 = "%d"; - TextualEffect(); - } - else { - if (4 < DamageType) { - if (DamageType == 8) { -switchD_080a1623_caseD_4: - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),0xc); - unique0x00009680 = (this->CrObject).ObjectID; - pOVar14 = (Object *)0x23; - } - else { - if (DamageType != 0x100) goto LAB_080a102f; - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),0xe); - unique0x00009680 = (this->CrObject).ObjectID; - pOVar14 = (Object *)0xb4; - } - goto LAB_080a1080; - } - if (DamageType != 1) { - if (DamageType != 2) { -LAB_080a102f: - error(&DAT_08101f00,DamageType); - return (int)(Object *)Damage; - } - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),9); - unique0x00009680 = (this->CrObject).ObjectID; - pOVar14 = (Object *)0x1e; - goto LAB_080a1080; - } - pcVar15 = (char *)this->Race; - switch(RaceData[(int)pcVar15].Blood) { - case BT_BLOOD: - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),1); - unique0x00009680 = (this->CrObject).ObjectID; - TextualEffect(); - local_3c[0].ObjectID = (this->CrObject).ObjectID; - // try { // try from 080a1684 to 080a16b8 has its CatchHandler @ 080a1fb1 - GetMapContainer((Object *)(Remark + 0x1c)); - pOVar14 = &local_2c; - GetSpecialObject((SPECIALMEANING)pOVar14); - pcVar15 = (char *)0x5; - CreatePool(); - break; - case BT_SLIME: - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),0x11); - unique0x00009680 = (this->CrObject).ObjectID; - TextualEffect(); - local_3c[0].ObjectID = (this->CrObject).ObjectID; - // try { // try from 080a171a to 080a174e has its CatchHandler @ 080a1fb1 - GetMapContainer((Object *)(Remark + 0x1c)); - pOVar14 = &local_2c; - GetSpecialObject((SPECIALMEANING)pOVar14); - pcVar15 = (char *)0x6; - CreatePool(); - break; - case BT_BONES: - unique0x00009680 = (this->CrObject).ObjectID; - GraphicalEffect((Object *)(Remark + 0x1c),10); - unique0x00009680 = (this->CrObject).ObjectID; - pOVar14 = (Object *)0x81; - goto LAB_080a1080; - case BT_FIRE: - unique0x00009680 = (this->CrObject).ObjectID; - iVar5 = 1; - goto LAB_080a17a3; - case BT_ENERGY: - goto switchD_080a1623_caseD_4; - default: - pOVar14 = (Object *)RaceData[(int)pcVar15].Blood; - error(&DAT_08101fe0,pOVar14,pcVar15); - } - } - if ((this->Type == PLAYER) && - (pTVar1 = this->Connection, pTVar1 != (TConnection *)0x0)) { - if (atk == (TCreature *)0x0) { - pcVar15 = "You lose %d hitpoint%s."; - pcVar13 = ""; - if ((Object *)Damage != (Object *)0x1) { - pcVar13 = "s"; - } - pOVar14 = (Object *)0x15; - SendMessage(pTVar1,0x15,"You lose %d hitpoint%s.",Damage,pcVar13); - } - else { - pcVar13 = ""; - pcVar15 = "You lose %d hitpoint%s due to an attack by %s."; - pOVar14 = (Object *)0x15; - if ((Object *)Damage != (Object *)0x1) { - pcVar13 = "s"; - } - SendMessage(pTVar1,0x15,"You lose %d hitpoint%s due to an attack by %s." - ,Damage,pcVar13,atk->Name); - } - SendPlayerData(this->Connection); - } - iVar5 = TSkill::Get(pTVar11); - if (0 < iVar5) goto LAB_080a1103; - if (this->Type == PLAYER) { - OldLevel = 1; - do { - pOVar14 = (Object *)this->ID; - pcVar15 = (char *)OldLevel; - GetBodyObject((ulong)(Remark + 0x1c),(int)pOVar14); - local_3c[0].ObjectID = ::NONE.ObjectID; - if (stack0xffffffb4 != ::NONE.ObjectID) { - Object::getObjectType(local_3c); - pOVar14 = (Object *)0x2e; - bVar2 = ObjectType::getFlag((ObjectType *)local_3c,CLOTHES); - if (bVar2) { - Object::getObjectType(local_3c); - pOVar14 = (Object *)0x16; - uVar8 = ObjectType::getAttribute - ((ObjectType *)local_3c,BODYPOSITION); - if (uVar8 == OldLevel) { - Object::getObjectType(local_3c); - pcVar15 = (char *)0xc; - pOVar14 = (Object *)0x4d; - GetNewObjectType((uchar)&local_2c,'M'); - if (local_3c[0].ObjectID == local_2c.ObjectID) { - pcVar15 = this->Name; - Log("game","%s stirbt mit Amulett of Loss.\n",pcVar15); - this->LoseInventory = 0; - pOVar14 = (Object *)0xffffffff; - local_3c[0].ObjectID = stack0xffffffb4; - // try { // try from 080a159b to 080a159f has its CatchHandler @ 080a1fc8 - Delete(local_3c,-1); - } - } - } - } - OldLevel = OldLevel + 1; - } while (OldLevel < 0xb); - } - iVar5 = TSkill::Get((this->super_TSkillBase).Skills[0]); - (*this->_vptr_TCreature[2])(this,pOVar14,pcVar15); - if ((atk != (TCreature *)0x0) && (this->Type == PLAYER)) { - BlockLogout(atk,900,true); - } - if ((atkID != 0) && (this->Type == PLAYER)) { - BlockLogout((TCreature *)atkID,900,true); - } - Responsible = (TCreature *)((uint)Responsible & 0xffffff00); - local_88 = 0; - if (atk == (TCreature *)0x0) { - iVar9 = this->Race; - iVar7 = strcmp(RaceData[0].Name,"human"); - if (iVar7 == 0) { - KilledCreatures[iVar9] = KilledCreatures[iVar9] + 1; - } - uVar16 = 6; - iVar9 = strcmp(RaceData[iVar9].Name,"human"); - if (iVar9 == 0) { - KilledPlayers[0] = KilledPlayers[0] + 1; - } - if (DamageType == 2) { - Responsible = (TCreature *)0x73696f70; - Remark[0] = 'o'; - Remark[1] = 'n'; -LAB_080a1479: - Remark[2] = '\0'; - } - else if (DamageType < 3) { - if (DamageType == 1) { - Responsible = (TCreature *)0x69682061; - Remark[0] = 't'; - Remark[1] = '\0'; - } - else { -LAB_080a1436: - error(&DAT_08101f80,DamageType,uVar16); - } - } - else { - if (DamageType != 4) { - if (DamageType == 8) { - Responsible = (TCreature *)0x72656e65; - Remark[0] = 'g'; - Remark[1] = 'y'; - goto LAB_080a1479; - } - goto LAB_080a1436; - } - Responsible = (TCreature *)0x65726966; - Remark._0_2_ = Remark._0_2_ & 0xff00; - } - } - else { - iVar9 = atk->Race; - iVar7 = this->Race; - iVar6 = strcmp(RaceData[iVar9].Name,"human"); - if (iVar6 == 0) { - KilledCreatures[iVar7] = KilledCreatures[iVar7] + 1; - } - iVar7 = strcmp(RaceData[iVar7].Name,"human"); - if (iVar7 == 0) { - KilledPlayers[iVar9] = KilledPlayers[iVar9] + 1; - } - strcpy(this->Murderer,atk->Name); - if ((atkID != 0) && (*(int *)(atkID + 0x28c) == 0)) { - local_88 = *(uint *)(atkID + 0x208); - } - if (atk->Type != PLAYER) { - strcpy((char *)&Responsible,atk->Name); - } - } - if (this->Type == PLAYER) { - Unjustified = 1; - do { - uVar8 = local_88; - if (Unjustified != 1) { - uVar8 = TCombat::GetMostDangerousAttacker(&this->Combat); - } - if ((Unjustified != 2) || - (((uVar8 != 0 && (uVar8 != local_88)) && (uVar8 < 0x40000000)))) { - bVar2 = false; - if (uVar8 - 1 < 0x3fffffff) { - this_00 = GetPlayer(uVar8); - if (this_00 == (TPlayer *)0x0) goto LAB_080a1376; - bVar2 = TPlayer::IsAttackJustified(this_00,this->ID); - bVar2 = !bVar2; - TPlayer::RecordMurder(this_00,this->ID); - } - bVar3 = false; - if (this->ID != uVar8) { - bVar3 = bVar2; - } - CharacterDeathOrder(this,iVar5,uVar8,(char *)&Responsible,bVar3); - Responsible = (TCreature *)((uint)Responsible & 0xffffff00); - } -LAB_080a1376: - Unjustified = Unjustified + 1; - } while (Unjustified < 3); - } -LAB_080a1103: - AnnounceChangedCreature(this->ID,1); - return (int)(Object *)Damage; - } - } - unique0x00009680 = (this->CrObject).ObjectID; - pOVar14 = (Object *)(Remark + 0x1c); - iVar5 = 4; - goto LAB_080a1a50; - } -LAB_080a1c71: - unique0x00009680 = (this->CrObject).ObjectID; - pOVar14 = (Object *)(Remark + 0x1c); - } - iVar5 = 3; -LAB_080a1a50: - GraphicalEffect(pOVar14,iVar5); - return 0; -} - - - // WARNING: Variable defined which should be unmapped: Execute_local // DWARF original prototype: bool MovePossible(TCreature * this, int x, int y, int z, bool Execute, // bool Jump) -- cgit v1.2.3