• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

Targeting-Verhalten von Diablo

CorniI

Guest
Hi,
nachdem Desti ja das Targetin-Verhalten vor ein paar Monaten austesten wollte, aber nicht wirklich erfolgreich war, hier der Code, der das für Diablo macht. Jeder Spieler bekommt einen "Rank" zugewiesen, und die Unit, mit dem höchsten Rank ist dann das Ziel der nächsten Attacke, das Verhalten hat desti ja beschrieben.
Bei 1 oder 2 Sachen bin ich mir noch nihct ganz sicher, v.a. weil ich sie nicht reproduzieren konnte, aber das müsste so stimmen :p
Der Code ist in C(++) geschrieben, bei Fragen, einfach posten, ich gehe jedoch von grundlegenden Kenntnissen einer Programmiersprache aus :clown:
Code:
DWORD __fastcall rankTarget(BlizzGame* ptGame, BlizzUnit* ptMonster, BlizzUnit* ptUnit, diabloAiStruct* ptStrc)
{
	ASSERT(ptGame!=NULL);
	ASSERT(ptMonster!=NULL);
	BOOL inMeeleRange=isInRange(ptMonster,ptUnit,0);
	DWORD tooFar=0;
	if(inMeeleRange)
		inMeeleRange=100;
	//unsure why the unit should get an bonus for that...
	if(ptStrc!=NULL&&getAnotherIsometricDistance(ptMonster,ptStrc->xPos,ptStrc->yPos)>85&&getAnotherIsometricDistance(ptUnit,ptStrc->xPos,ptStrc->yPos)>85)
	{
		//var=100
		tooFar=100;
	}
	//resistances
	DWORD damageresist=getStatSigned(ptUnit,STAT_DAMAGERESIST,0);
	DWORD fireresist=getStatSigned(ptUnit,STAT_FIRERESIST,0);
	DWORD lightresist=getStatSigned(ptUnit,STAT_LIGHTRESIST,0);
	DWORD magicresist=getStatSigned(ptUnit,STAT_MAGICRESIST,0);
	DWORD coldresist=0;
	if(inMeeleRange)
		DWORD coldresist=getStatSigned(ptUnit,STAT_COLDRESIST,0);
	DWORD resisttotal=4*damageresist+8*magicresist+coldresist+fireresist+lightresist;
	resisttotal/=15;
	//damage
	DWORD maxdamage=getStatSigned(ptUnit,STAT_MAXDAMAGE,0);
	DWORD lightmaxdam=getStatSigned(ptUnit,STAT_LIGHTMAXDAM,0);
	DWORD firemaxdam=getStatSigned(ptUnit,STAT_FIREMAXDAM,0);
	DWORD coldmaxdam=getStatSigned(ptUnit,STAT_COLDMAXDAM,0);
	DWORD poisonmaxdam=getStatSigned(ptUnit,STAT_POISONMAXDAM,0);
	DWORD magicmaxdam=getStatSigned(ptUnit,STAT_MAGICMAXDAM,0);
	poisonmaxdam/=64;
	DWORD damtotal=maxdamage+poisonmaxdam+lightmaxdam+firemaxdam+magicmaxdam;
	damtotal=abs(damtotal)/2;
	//stae cold present?
	DWORD stateCold=0;
	if(checkState(ptUnit,STATE_COLD))
		stateCold=100;
	//Life
	int life=getLifePct(ptUnit);
	if(life>=20)
		life=0;
	else
		life=100;
	
	//Skills+attackRank
	DWORD skillLevelLeft=0,skillIdLeft=0,skillLevelRight=0,skillIdRight=0;
	char attackRankRight=0,attackRankLeft=0;
	BlizzSkill* ptSkillLeft=getSkillLeft(ptUnit);
	BlizzSkill* ptSkillRight=getSkillRight(ptUnit);
	if(ptSkillLeft)
	{
		skillLevelLeft=getCurrentSkillLevel(ptUnit,ptSkillLeft,1);
		skillIdLeft=getSkillId(ptSkillLeft,__FILE__,__LINE__);
		if(skillIdLeft<0||(*sgptDataTables)->nSkills<skillIdLeft)
			NEFEXUTIL_Error("Nonmatching skill here, exiting",__FILE__,__LINE__,1);
		attackRankLeft=(*sgptDataTables)->ptSkillsTxt->attackrank;
	}
	if(ptSkillRight)
	{
		skillLevelRight=getCurrentSkillLevel(ptUnit,ptSkillRight,1);
		skillIdRight=getSkillId(ptSkillLeft,__FILE__,__LINE__);
		if(skillIdRight<0||(*sgptDataTables)->nSkills<skillIdRight)
			NEFEXUTIL_Error("Nonmatching skill here, exiting",__FILE__,__LINE__,1);
		attackRankRight=(*sgptDataTables)->ptSkillsTxt->attackrank;
	}
	int threatSkills=attackRankRight*skillLevelRight+attackRankLeft*skillLevelLeft;
	threatSkills&=3;//Limit it to 3 as max
	threatSkills=abs(threatSkills);//is this just a compiler safety or really needed?
	threatSkills/=4; //weird...
	if(ptUnit->typeNo==UNIT_MONSTER)
	{
		FileMonstatsTable* ptMonstats=NULL;
		if((*sgptDataTables)->nMonster<ptUnit->classNo)
			return 0;
		ptMonstats=(*sgptDataTables)->ptMonstats;
		ptMonstats+=ptUnit->classNo;
		if(ptMonstats->threat<=1)
			return 0;
	}
	//compute the rank
	/*6FCE866F  |> 8B4424 1C      MOV EAX,DWORD PTR SS:[ESP+1C]            ;  EAX=TooFar????
	6FCE8673  |. 8B4C24 30      MOV ECX,DWORD PTR SS:[ESP+30]            ;  inmeelerangebonus?
	6FCE8677  |. 03C1           ADD EAX,ECX                              ;  EAX=^^^^
	6FCE8679  |. 8B4C24 24      MOV ECX,DWORD PTR SS:[ESP+24]            ;  ECX=I guess resistrank
	6FCE867D  |. 8D547D 00      LEA EDX,DWORD PTR SS:[EBP+EDI*2]         ;  EDX=threatSkills+2*statecoldset
	6FCE8681  |. 8D0C81         LEA ECX,DWORD PTR DS:[ECX+EAX*4]         ;  ECX=resistRank+4*tooFar+inmeelerangebonus
	6FCE8684  |. 03D3           ADD EDX,EBX                              ;  threatSkill+2*statecold+damagerank
	6FCE8686  |. 03C1           ADD EAX,ECX                              ;  EAX=ECX+EAX
	6FCE8688  |. 8B4C24 28      MOV ECX,DWORD PTR SS:[ESP+28]            ;  ECX=lifeBonus??
	6FCE868C  |. 8D0C49         LEA ECX,DWORD PTR DS:[ECX+ECX*2]         ;  lifeBonus*3
	6FCE868F  |. 8D1450         LEA EDX,DWORD PTR DS:[EAX+EDX*2]
	6FCE8692  |. 03CA           ADD ECX,EDX
*/
	/*DWORD eax=tooFar+retByPath;
	DWORD edx=threatSkills+(2*stateCold);
	DWORD ecx=resisttotal+(4*eax);
	edx=edx+damtotal;
	eax=eax+ecx;
	ecx=3*life;
	edx=eax+2*edx;
	ecx=ecx+edx;*/
	//and now the real :D
	//DWORD eax=tooFar+retByPath;
		//DWORD edx=threatSkills+(2*stateCold);
		//DWORD ecx=resisttotal+(4*tooFar+retByPath);
		//edx=threatSkills+(2*stateCold)+damtotal;
		//eax=tooFar+retByPath+resisttotal+(4*tooFar+retByPath);
		//ecx=3*life;
		//edx=tooFar+retByPath+resisttotal+(4*tooFar+retByPath)+2*(threatSkills+(2*stateCold)+damtotal);
	//DWORD totalRank=(3*life)+tooFar+retByPath+resisttotal+(4*tooFar)+retByPath+2*(threatSkills+(2*stateCold)+damtotal);
	DWORD totalRank=tooFar + inMeeleRange + resisttotal + 4*tooFar + 4*inMeeleRange + 2*threatSkills + 4*stateCold + 2*damtotal + 3*life;
	totalRank/=22;
	if(!totalRank)
		return 1;
	return totalRank;
}
Und hier die (noch unvollständig in den Code-Pfaden für Hirelings+Barb-Allys in a5, und deshalb noch nicht geteste) Funktion, die dann die Unit wirklich auswählt:
Code:
BlizzUnit* __fastcall getTargetDiablo(BlizzGame* ptGame, BlizzUnit* ptMonster, DWORD* highestRankFound, DWORD* noUnitsChecked, diabloAiStruct* ptStrc, pfnFindTargetFunc* pfnFindTarget)
{
	ASSERT(pfnFindTarget!=NULL);
	BlizzUnitNode* ptTargetNode=ptGame->ptUnitNodes[0];
	BlizzUnitNode** pptTargetNode=ptGame->ptUnitNodes;
	DWORD i=0,targetRank=0,highestRank=0,unitsChecked=0;
	BlizzUnit* ptTarget=NULL;
	BlizzUnit* highestRankedUnit=NULL;
	WORD xPos,yPos;
	getCoords(ptMonster,xPos,yPos);
	while(i<8)
	{
		ptTargetNode=*pptTargetNode;
		if(ptTargetNode!=NULL)
		{
			ptTarget=ptTargetNode->ptUnit;
			//come up with own assertation set
			ASSERT(ptTarget!=NULL);
			ASSERT(ptTarget->typeNo==UNIT_PLAYER)
			if((*pfnFindTarget)(ptMonster,ptTarget)==true)
			{
				if(ptTarget->modeNo!=PLRMODE_DEATH&&ptTarget->modeNo!=PLRMODE_DEAD)
					targetRank=rankTarget(ptGame,ptMonster,ptTarget,ptStrc);
				else
					targetRank=0;
				while(1)
				{
					if(highestRank<targetRank)
					{
						highestRank=targetRank;
						highestRankedUnit=ptTarget;
					}
					ptTargetNode=ptTargetNode->ptNext;
					unitsChecked++;
					if(ptTargetNode==NULL)
						break;
					ptTarget=ptTargetNode->ptUnit;
					targetRank=rankTarget(ptGame,ptMonster,ptTarget,ptStrc);
				}
			}
		}
		pptTargetNode++;
		ptTargetNode=*pptTargetNode;
		i++;
	}
	//now we have a good ranked Target in ptTarget
	if(ptTargetNode!=NULL)
	{
		//later, dunno exactly what it is
	}
	if(ptGame->ptUnitNodes[9]!=NULL)
	{
		//other stuff for barbs in a5, later
	}
	*noUnitsChecked=unitsChecked;
	*highestRankFound=highestRank;
	return highestRankedUnit;
}
ACHTUNG: Obwohl Baal ähnlichen Code verwenden kann, DIESER ist es NICHT, außer Blizz hat c&p benutzt (gut möglich :p)
MfG
Corni
EDIT: Da der Code bei mir ziemlich beschissen umbricht (1400x900, 16:10 Display), empfehle ich, den Code in Wordpad oder so zu kopieren...
 
du gehtst von kenntnissen aus, die min 90% der com nicht hat :p
inklusive meiner einer

also ne übersetzung wär nicht schlecht
kann mir zwar bei den meisten sachen denken was sie bedeuten könnten, aber richtig lesen ist nicht
 
sagen wir 95% damit wird so kaum einer was anfangen können glaub ich..trotzdem nen gutes stück arbeit..gratz
 
na, dann übersetze ich mal. Wenn man das nicht lesen kann, ist das, was ich jetzt weglasse, sowieso uninteressant:
überprüfe, ob das target im meele-range ist, wenn ja, setze imMeeleRange auf 100, sonst 0.
jetzt der komische teil: überpr
üfe einige entfernungen, das habe ich nicht wirklich verstanden :(, setze evtl. tooFar auf 100, sonst tooFar=0
*komischer teil ende*
hole alle resistenzen vom character und berechne nach folgender Formel resisttotal:
4*damageresist+8*magicresist+coldresist+fireresist+lightresist
ACHTUNG: coldresisit ist 0, wenn das target nicht im Meele-Range von Diablo ist
Hole alle maxdams, teile den poisonmaxdam und berechne damtotal nach folgender Formel:
maxdamage+poisonmaxdam+lightmaxdam+firemaxdam+magicmaxdam :D
damtotal wird danach auf die hälfte des eigenen betrages gesetzt, aka
damtotal=|damtotal|/2
Wenn die Unit eingefroren ist (STATE_COLD vorhanden), setze stateCold auf 100, sonst auf 0
Wenn das prozentuale Leben der Unit zwischen 0...19 liegt, setze life auf 100, sonst auf 0
Wenn vorhanden, berechne threatSkills für den linken Skill nach (attack-ranks aus der skills.txt):
slvlLeftSkill*attackRankLeft+slvlRightSkill*attackRankRightSkill
und wieder etwas komisches:
führe ein logisches AND mit 3 auf threatSkills aus
berechne den Betrag von threatSkills
Teile das ganze durch 4, ergebnis ist das finale threatSkills
WENN das ganze ein Monster (aka Hireling/minion) ist, überprüfe, ob der threat in monstats.txt <=1 ist, wenn ja, gebe ein illegales resultat zurück, wenn größer, mache mit der berechnung weiter
Berechne rankTotal mit
tooFar + inMeeleRange + resisttotal + 4*tooFar + 4*inMeeleRange + 2*threatSkills + 4*stateCold + 2*damtotal + 3*life
und teile das ganze dann noch durch 22, dann hast du den rückgabewert der Funktion
Die 2. Funktion ist für nichtprogrammier eh uninteressant, da sie einfach die Unit mit dem höchsten Rank als Target auswählt...
MfG
Corni
 
Eine schöne Arbeit,
Aber nun bitte erkläre doch mal wie wir das auf unsere Chars umsetzen können.
Also sprich was oder wen greift Diablo zuerst an bzw was sucht er sich als Ziel aus.
 
So direkt kann man das ja nicht sagen, das kommt ja immer auf das gewünschte Ergebnis+Party an. Ein Hammerdin mit viel DMG, der aber hinten steht ist prinzipiell schlecht, da Diablo dann evtl. ihn wegen seinem hohen DMG (resistenzen haben palas ja ohnehin hoch) auswählt, weil Diablo dann eben ihn auswählt und evtl. zu ihm hinrennt -> Meteore+Blizzard+Nahkämpfer müssen hinterher, und das braucht Zeit. Wenn du dir wegen sowas wirklich gedanken machst, rechne es doch einfach durch und überlegt dann, ob ein char evtl. ein wenig +skill-equip oder resi-charms wegnimmt, damit dickerchen ihm nicht nachrennt.
MfG
Corni
 
Nette Arbeit :cool:
Bin ich jetzt der einzige, der den Code versteht? :D
 
Sooo schwer ist der ja nicht, ich hätte mir ein Haufen zeit sparen können und hier einfach das ASM c&p können, dann wüsste niemand, inkl. mir, was da berechnet wird :D
 
CorniI schrieb:
jetzt der komische teil: überpr
üfe einige entfernungen, das habe ich nicht wirklich verstanden , setze evtl. tooFar auf 100, sonst tooFar=0
*komischer teil ende*
PHP:
...
	if(ptStrc!=NULL&&getAnotherIsometricDistance(ptMonster,ptStrc->xPos,ptStrc->yPos)>85&&getAnotherIsometricDistance(ptUnit,ptStrc->xPos,ptStrc->yPos)>85)
	{
		//var=100
		tooFar=100;
	}

Ich habe diese Zeile so verstanden, dass ein gedanklicher Kreis (bzw eine Elipse) mit dem Radius 85 um Diablo gezogen wird.
Wer außerhalb diese Kreises ist (Summe der X- und Y-Koordinate > 85), ist too far für den Dicken.

CorniI schrieb:
und wieder etwas komisches:
führe ein logisches AND mit 3 auf threatSkills aus

Kommentar lesen:
//Limit it to 3 as max

Heißt also das eine Zahl zwischen 0 und 3 ausgegeben wird.
Nehmen wir an der Skill hat eine ID von 53 (110101b), dann gibt der Compiler den Wert 1 zurück

Code:
 110101
&    11
_______
=    01

die ID von Druidenskills ist wesentlich höher (ka, so um die 150 rum) als die von Barbaren (ab 10, glaub ich)

Sonst würde Diablo immer die Druiden und Assassinen in der party angreifen und die Barbaren und Amazonen nie.
 
Nette Arbeit, mit ein paar Programmierkenntnissen auch zu verstehen. gut gemacht.

Lg
 
@Kreis: Das ist komisch, die eine Funktion müsste logischerweise immer 0 zurückgeben, da sie mit der Unit von Diablo aufgerufen wird, anstatt der des players, weshalb ich evtl. auch noch nicht in der lage war, das zu reproduzieren
@&3
dann mach mal eine zahl &3, haste als ergebnis 0...3 und teile das ganzzahlig durch 4, also ohne nachkommastellen, das gibt immer 0.
Und mit skillId hat das nix zu tun, sondern mit slvls, also wie hoch der skill geskillt ist (+items), und dem sog. skill-threat, der in der skills.txt spezifiert werden kann. Formel dafür ist ja oben :)
MfG
Corni
EDIT: das könnte auch ganz einfach ein (oder 2) Bugs sein, müsste ich nochmal drüber schauen...
 
da ich sowas nicht konzentriert durch mache, wohl die letzten 2 tage, also 10+Zeitstunden. Da hängt aber noch mehr Code dran, der fürs topic uninteressant ist.
 
CorniI schrieb:
da ich sowas nicht konzentriert durch mache, wohl die letzten 2 tage, also 10+Zeitstunden. Da hängt aber noch mehr Code dran, der fürs topic uninteressant ist.

Der da welchen Inhalt hat? Würde mich interessieren :)

Lg
 
welche kenntnisse (und programme) braucht man denn so, um solchen code herauslesen zu können? und kennst du vielleicht eine gute erklärung zum einsteigen? mich würd sowas auch interressieren.

Sooo schwer ist der ja nicht, ich hätte mir ein Haufen zeit sparen können und hier einfach das ASM c&p können, dann wüsste niemand, inkl. mir, was da berechnet wird
kann ich den zueghörigen assembler-code auch mal sehen?

mfg
 
aaalso
@Nosferatus: bekommst gleich ne PM mit dem restlichen Code den ich in der Zeit geschrieben habe, das sind vor allem (unfertige :clown:) Funktionen, die da halt auch mit drinhängen, aber halt speicher allozieren, initialisieren etc...
@Titan:
Du bist ja an auslesen interessiert, dann natürlich erstmal (grundlegende) ASM-Kenntnisse+C. Das ++ hintendran ist nicht wirklich nützlich, da man in D2 zum Glück nicht auf virtuelle Funktionen, klassenvererbung, Templates und Exceptions trifft :) Allerdings gibt es halt einige Microsoft-spezifische Erweiterungen, v. a. mal unter __declspec(naked/dllimport/export) und __fastcall,__stdcall und __cdecl schauen...
Als Tutorial kenn ich nur eines: http://phrozenkeep.planetdiablo.gam...cs/resources/diablo_ii_code_editing v2.01.htm
ASM kommt dann hier als extra-Post, das ist relativ lang. Man braucht halt a) einen Einstieg in den Code und b) einen großen Header mit den bekannten Diablo-Strukturen und c) Erfahrung :p und d) am besten 1.10, da dort der Code deutlich einfacher lesbar ist, und auch, für mich wichtiger, besser erweiterbar. Mein Code ist auch 1.10, aber da bei blizz niemand sowas je ändern wird (die haben schon beim hinzufügen der übers und ütrist genug mist gebaut, die würden nie im Traum drauf kommen, da drin Code zu ändern) ists immer noch aktuell. Sowas lernen braucht halt Zeit, am besten jemand, den man schnell fragen kann, und am besten D2Mod oder NefEx, damit man auch eigenen Code schnell nach Diablo rein bekommt, und so dann mitloggen kann, oder auch einfach eine in C neu geschriebene Funktion testen und debuggen kann. Sonst, im keep gibt es noch ein CE-Forum mit interessanten Stickys und auch so netten Posts :)
MfG
Corni
 
UND Asm
Achtung, die erste Zeile ist fubar, das ist mein jump-patch. Ohne Comments gibts die, wenn man D2 1.10 mit ner rebased d2common.dll started, ingame geht und dann ollydbg attached, addressen stehen ja links geügend drann...
Wenn du sowas mal machst: kopiere das kommentierte listing immer in ne text-datei, olly verliert die manchmal zwischen neustarts
Wer sich wundert, warum bei Calls manchmal ein Funtionsname dransteht: Das war ich, da standen davor nur Ordinals (also Ordinalzahlen, ordinäre (:D) Nummern dran)
Code:
6FCE83A0 >-E9 AB12DB91      JMP Mod.01A99650
6FCE83A5   56               PUSH ESI
6FCE83A6   8B7424 2C        MOV ESI,DWORD PTR SS:[ESP+2C]            ; ESI=ptUnit
6FCE83AA   57               PUSH EDI
6FCE83AB   8BDA             MOV EBX,EDX
6FCE83AD   6A 00            PUSH 0
6FCE83AF   56               PUSH ESI                                 ; ptUnit
6FCE83B0   53               PUSH EBX                                 ; ptMonster
6FCE83B1   895C24 2C        MOV DWORD PTR SS:[ESP+2C],EBX            ; =ptMonster
6FCE83B5   E8 483E0300      CALL <JMP.&D2Common.#10361>
6FCE83BA   8B7C24 34        MOV EDI,DWORD PTR SS:[ESP+34]            ; EDI=ptSTrc
6FCE83BE   894424 18        MOV DWORD PTR SS:[ESP+18],EAX            ; ESP+18=BOOL from pathfunc
6FCE83C2   85FF             TEST EDI,EDI
6FCE83C4   C74424 1C 000000>MOV DWORD PTR SS:[ESP+1C],0
6FCE83CC   74 2E            JE SHORT D2Game.6FCE83FC
6FCE83CE   8B47 10          MOV EAX,DWORD PTR DS:[EDI+10]
6FCE83D1   8B57 0C          MOV EDX,DWORD PTR DS:[EDI+C]
6FCE83D4   50               PUSH EAX                                 ; x, y
6FCE83D5   8BCB             MOV ECX,EBX                              ; ptMonster
6FCE83D7   E8 348F0000      CALL <D2Game.getAnotherIsometricDistance>
6FCE83DC   83F8 55          CMP EAX,55
6FCE83DF   7E 1B            JLE SHORT D2Game.6FCE83FC
6FCE83E1   8B4F 10          MOV ECX,DWORD PTR DS:[EDI+10]
6FCE83E4   8B57 0C          MOV EDX,DWORD PTR DS:[EDI+C]
6FCE83E7   51               PUSH ECX
6FCE83E8   8BCE             MOV ECX,ESI                              ; ptUnit
6FCE83EA   E8 218F0000      CALL <D2Game.getAnotherIsometricDistance>
6FCE83EF   83F8 55          CMP EAX,55
6FCE83F2   7D 08            JGE SHORT D2Game.6FCE83FC
6FCE83F4   C74424 1C 640000>MOV DWORD PTR SS:[ESP+1C],64
6FCE83FC   6A 00            PUSH 0
6FCE83FE   6A 24            PUSH 24
6FCE8400   56               PUSH ESI
6FCE8401   E8 8C320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE8406   8BF8             MOV EDI,EAX
6FCE8408   6A 00            PUSH 0
6FCE840A   6A 27            PUSH 27
6FCE840C   56               PUSH ESI
6FCE840D   E8 80320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE8412   8BD8             MOV EBX,EAX
6FCE8414   6A 00            PUSH 0
6FCE8416   6A 29            PUSH 29
6FCE8418   56               PUSH ESI
6FCE8419   E8 74320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE841E   8BE8             MOV EBP,EAX
6FCE8420   6A 00            PUSH 0
6FCE8422   6A 25            PUSH 25
6FCE8424   56               PUSH ESI
6FCE8425   E8 68320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE842A   894424 30        MOV DWORD PTR SS:[ESP+30],EAX            ; ESP+30=magicresist
6FCE842E   8B4424 18        MOV EAX,DWORD PTR SS:[ESP+18]            ; EAX=DWORD from 10361
6FCE8432   85C0             TEST EAX,EAX
6FCE8434   75 04            JNZ SHORT D2Game.6FCE843A
6FCE8436   33C0             XOR EAX,EAX
6FCE8438   EB 0A            JMP SHORT D2Game.6FCE8444
6FCE843A   6A 00            PUSH 0
6FCE843C   6A 2B            PUSH 2B
6FCE843E   56               PUSH ESI
6FCE843F   E8 4E320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE8444   8B5424 30        MOV EDX,DWORD PTR SS:[ESP+30]            ; EDX=magicresist
6FCE8448   6A 00            PUSH 0
6FCE844A   6A 16            PUSH 16                                  ; maxdamage
6FCE844C   56               PUSH ESI
6FCE844D   8D0C57           LEA ECX,DWORD PTR DS:[EDI+EDX*2]         ; ECX=damageresist+2*magicresist
6FCE8450   8D0C88           LEA ECX,DWORD PTR DS:[EAX+ECX*4]         ; ECX=4*(damageresist+2*magicresist)+coldresist
6FCE8453   B8 89888888      MOV EAX,88888889                         ; check again, nef says thats a division by 15
6FCE8458   03CD             ADD ECX,EBP                              ; ECX+=lightresist
6FCE845A   03CB             ADD ECX,EBX                              ; +=fireresist
6FCE845C   F7E9             IMUL ECX                                 ; ECX*EAX
6FCE845E   03D1             ADD EDX,ECX
6FCE8460   C1FA 03          SAR EDX,3
6FCE8463   8BC2             MOV EAX,EDX
6FCE8465   C1E8 1F          SHR EAX,1F
6FCE8468   03D0             ADD EDX,EAX
6FCE846A   895424 30        MOV DWORD PTR SS:[ESP+30],EDX            ; ESP+30=resistrank (02)
6FCE846E   E8 1F320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE8473   8BF8             MOV EDI,EAX                              ; maxdamage
6FCE8475   6A 00            PUSH 0
6FCE8477   6A 31            PUSH 31
6FCE8479   56               PUSH ESI
6FCE847A   E8 13320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE847F   8BD8             MOV EBX,EAX                              ; firemaxdam
6FCE8481   6A 00            PUSH 0
6FCE8483   6A 33            PUSH 33
6FCE8485   56               PUSH ESI
6FCE8486   E8 07320300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE848B   8BE8             MOV EBP,EAX                              ; lightmaxdam
6FCE848D   6A 00            PUSH 0
6FCE848F   6A 35            PUSH 35
6FCE8491   56               PUSH ESI
6FCE8492   E8 FB310300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE8497   6A 00            PUSH 0
6FCE8499   6A 37            PUSH 37
6FCE849B   56               PUSH ESI
6FCE849C   894424 40        MOV DWORD PTR SS:[ESP+40],EAX            ; magicmaxdam
6FCE84A0   E8 ED310300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE84A5   6A 00            PUSH 0
6FCE84A7   6A 3A            PUSH 3A
6FCE84A9   56               PUSH ESI
6FCE84AA   894424 3C        MOV DWORD PTR SS:[ESP+3C],EAX            ; coldmaxdam
6FCE84AE   E8 DF310300      CALL <D2Game.getStatSigned>              ; JMP to D2Common.#10519
6FCE84B3   C1F8 08          SAR EAX,8                                ; poisonmaxdam
6FCE84B6   8B4C24 30        MOV ECX,DWORD PTR SS:[ESP+30]            ; ECX=coldmaxdam
6FCE84BA   8B5424 34        MOV EDX,DWORD PTR SS:[ESP+34]            ; EDX=magicmaxdam
6FCE84BE   03C1             ADD EAX,ECX                              ; EAX=psn+cold
6FCE84C0   6A 0B            PUSH 0B                                  ; STATE_COLD
6FCE84C2   03C2             ADD EAX,EDX                              ; EAX+=magic
6FCE84C4   56               PUSH ESI
6FCE84C5   03C5             ADD EAX,EBP                              ; EAX+=light
6FCE84C7   03C3             ADD EAX,EBX                              ; EAX+=fire
6FCE84C9   03C7             ADD EAX,EDI                              ; EAX+=max
6FCE84CB   99               CDQ
6FCE84CC   2BC2             SUB EAX,EDX                              ; abs
6FCE84CE   8BD8             MOV EBX,EAX                              ; EBX=abs(alldamages)
6FCE84D0   D1FB             SAR EBX,1                                ; EBX/2
6FCE84D2   E8 F1310300      CALL <D2Game.checkState>                 ; JMP to D2Common.#10487
6FCE84D7   8BF8             MOV EDI,EAX
6FCE84D9   F7DF             NEG EDI
6FCE84DB   1BFF             SBB EDI,EDI
6FCE84DD   56               PUSH ESI
6FCE84DE   83E7 64          AND EDI,64                               ; EDI is either 100 (state set) or 0 (state not set)
6FCE84E1   E8 C0320300      CALL <D2Game.getLifePct>                 ; JMP to D2Common.#10368
6FCE84E6   33C9             XOR ECX,ECX
6FCE84E8   83F8 14          CMP EAX,14
6FCE84EB   0F9DC1           SETGE CL                                 ; if(>=20) CL=true
6FCE84EE   49               DEC ECX                                  ; --
6FCE84EF   33C0             XOR EAX,EAX
6FCE84F1   83E1 64          AND ECX,64                               ; ECX=100 if life<20%else ECX=0
6FCE84F4   56               PUSH ESI                                 ; ptUnit
6FCE84F5   894C24 2C        MOV DWORD PTR SS:[ESP+2C],ECX            ; ESP+2C=life (0)
6FCE84F9   894424 38        MOV DWORD PTR SS:[ESP+38],EAX            ; ESP+38=0
6FCE84FD   894424 18        MOV DWORD PTR SS:[ESP+18],EAX            ; ESP+18=0
6FCE8501   884424 34        MOV BYTE PTR SS:[ESP+34],AL              ; ESP+34 (byte)=0
6FCE8505   884424 14        MOV BYTE PTR SS:[ESP+14],AL              ; ESP+14(byte)=0
6FCE8509   E8 7C330300      CALL <D2Game.getSkillLeft>               ; JMP to D2Common.#10321
6FCE850E   8BE8             MOV EBP,EAX                              ; EBP=ptSkill
6FCE8510   85ED             TEST EBP,EBP
6FCE8512   74 50            JE SHORT D2Game.6FCE8564
6FCE8514   6A 01            PUSH 1
6FCE8516   55               PUSH EBP
6FCE8517   56               PUSH ESI
6FCE8518   E8 09310300      CALL <D2Game.getSkillLevel>              ; JMP to D2Common.#10968
6FCE851D   68 CD330000      PUSH 33CD
6FCE8522   68 B003D46F      PUSH D2Game.6FD403B0                     ; ASCII "C:\\projects\\D2\\head\\Diablo2\\Source\\D2Game\\Ai\\AiThink.cpp"
6FCE8527   55               PUSH EBP                                 ; BlizzSKill*
6FCE8528   894424 20        MOV DWORD PTR SS:[ESP+20],EAX            ; ESP+20=skillLevel
6FCE852C   E8 5D320300      CALL <D2Game.getSkilld>                  ; JMP to D2Common.#10963
6FCE8531   85C0             TEST EAX,EAX
6FCE8533   7C 23            JL SHORT D2Game.6FCE8558
6FCE8535   8B15 6070D26F    MOV EDX,DWORD PTR DS:[<&D2Common.sgptDat>; D2Common.sgptDataTables
6FCE853B   8B0A             MOV ECX,DWORD PTR DS:[EDX]
6FCE853D   3B81 A00B0000    CMP EAX,DWORD PTR DS:[ECX+BA0]
6FCE8543   7D 13            JGE SHORT D2Game.6FCE8558
6FCE8545   8D14C0           LEA EDX,DWORD PTR DS:[EAX+EAX*8]
6FCE8548   C1E2 04          SHL EDX,4
6FCE854B   2BD0             SUB EDX,EAX
6FCE854D   8B81 980B0000    MOV EAX,DWORD PTR DS:[ECX+B98]
6FCE8553   8D0490           LEA EAX,DWORD PTR DS:[EAX+EDX*4]
6FCE8556   EB 02            JMP SHORT D2Game.6FCE855A
6FCE8558   33C0             XOR EAX,EAX
6FCE855A   8A88 8E010000    MOV CL,BYTE PTR DS:[EAX+18E]             ; attackrank
6FCE8560   884C24 10        MOV BYTE PTR SS:[ESP+10],CL              ; ESP+10=attackrankleft
6FCE8564   56               PUSH ESI                                 ; no left skill
6FCE8565   E8 1A330300      CALL <D2Game.getSkillRight>              ; JMP to D2Common.#10322
6FCE856A   8BE8             MOV EBP,EAX
6FCE856C   85ED             TEST EBP,EBP
6FCE856E   74 50            JE SHORT D2Game.6FCE85C0
6FCE8570   6A 01            PUSH 1
6FCE8572   55               PUSH EBP
6FCE8573   56               PUSH ESI
6FCE8574   E8 AD300300      CALL <D2Game.getSkillLevel>              ; JMP to D2Common.#10968
6FCE8579   68 D3330000      PUSH 33D3
6FCE857E   68 B003D46F      PUSH D2Game.6FD403B0                     ; ASCII "C:\\projects\\D2\\head\\Diablo2\\Source\\D2Game\\Ai\\AiThink.cpp"
6FCE8583   55               PUSH EBP
6FCE8584   894424 40        MOV DWORD PTR SS:[ESP+40],EAX            ; ESP=skilLevelRight (5)
6FCE8588   E8 01320300      CALL <D2Game.getSkilld>                  ; JMP to D2Common.#10963
6FCE858D   85C0             TEST EAX,EAX
6FCE858F   7C 23            JL SHORT D2Game.6FCE85B4
6FCE8591   8B15 6070D26F    MOV EDX,DWORD PTR DS:[<&D2Common.sgptDat>; D2Common.sgptDataTables
6FCE8597   8B0A             MOV ECX,DWORD PTR DS:[EDX]
6FCE8599   3B81 A00B0000    CMP EAX,DWORD PTR DS:[ECX+BA0]
6FCE859F   7D 13            JGE SHORT D2Game.6FCE85B4
6FCE85A1   8D14C0           LEA EDX,DWORD PTR DS:[EAX+EAX*8]
6FCE85A4   C1E2 04          SHL EDX,4
6FCE85A7   2BD0             SUB EDX,EAX
6FCE85A9   8B81 980B0000    MOV EAX,DWORD PTR DS:[ECX+B98]
6FCE85AF   8D0490           LEA EAX,DWORD PTR DS:[EAX+EDX*4]
6FCE85B2   EB 02            JMP SHORT D2Game.6FCE85B6
6FCE85B4   33C0             XOR EAX,EAX
6FCE85B6   8A88 8E010000    MOV CL,BYTE PTR DS:[EAX+18E]
6FCE85BC   884C24 30        MOV BYTE PTR SS:[ESP+30],CL              ; ESP+30=attackRankRight=0
6FCE85C0   8B4424 30        MOV EAX,DWORD PTR SS:[ESP+30]            ; EAX=right
6FCE85C4   8B5424 10        MOV EDX,DWORD PTR SS:[ESP+10]            ; EDX=left
6FCE85C8   25 FF000000      AND EAX,0FF
6FCE85CD   81E2 FF000000    AND EDX,0FF
6FCE85D3   0FAF4424 34      IMUL EAX,DWORD PTR SS:[ESP+34]
6FCE85D8   0FAF5424 14      IMUL EDX,DWORD PTR SS:[ESP+14]
6FCE85DD   03C2             ADD EAX,EDX
6FCE85DF   C74424 30 000000>MOV DWORD PTR SS:[ESP+30],0              ; ESP+30=0
6FCE85E7   99               CDQ
6FCE85E8   83E2 03          AND EDX,3
6FCE85EB   03C2             ADD EAX,EDX
6FCE85ED   8BE8             MOV EBP,EAX                              ; EBP=threatSkills
6FCE85EF   8B4424 18        MOV EAX,DWORD PTR SS:[ESP+18]            ; retByPath
6FCE85F3   C1FD 02          SAR EBP,2                                ; threatSkills/4
6FCE85F6   85C0             TEST EAX,EAX                             ; if(retByPath)
6FCE85F8   74 0A            JE SHORT D2Game.6FCE8604
6FCE85FA   C74424 30 640000>MOV DWORD PTR SS:[ESP+30],64             ; ESP+30=100||ESP+30=0
6FCE8602   EB 17            JMP SHORT D2Game.6FCE861B
6FCE8604   8B4C24 20        MOV ECX,DWORD PTR SS:[ESP+20]            ; ECX=ptMonstats
6FCE8608   8BD6             MOV EDX,ESI                              ; EDX=ptUnit
6FCE860A   E8 51A80000      CALL D2Game.6FCF2E60
6FCE860F   85C0             TEST EAX,EAX
6FCE8611   74 08            JE SHORT D2Game.6FCE861B
6FCE8613   C74424 30 4B0000>MOV DWORD PTR SS:[ESP+30],4B
6FCE861B   85F6             TEST ESI,ESI
6FCE861D   74 50            JE SHORT D2Game.6FCE866F
6FCE861F   833E 01          CMP DWORD PTR DS:[ESI],1
6FCE8622   75 4B            JNZ SHORT D2Game.6FCE866F
6FCE8624   8B76 04          MOV ESI,DWORD PTR DS:[ESI+4]             ; part for hirelings
6FCE8627   85F6             TEST ESI,ESI                             ; ESI=ptTarget->classNo
6FCE8629   7C 26            JL SHORT D2Game.6FCE8651
6FCE862B   A1 6070D26F      MOV EAX,DWORD PTR DS:[<&D2Common.sgptDat>
6FCE8630   8B08             MOV ECX,DWORD PTR DS:[EAX]
6FCE8632   3BB1 800A0000    CMP ESI,DWORD PTR DS:[ECX+A80]           ; nMonstats
6FCE8638   7D 17            JGE SHORT D2Game.6FCE8651
6FCE863A   8D0476           LEA EAX,DWORD PTR DS:[ESI+ESI*2]
6FCE863D   8D14C0           LEA EDX,DWORD PTR DS:[EAX+EAX*8]
6FCE8640   8B81 780A0000    MOV EAX,DWORD PTR DS:[ECX+A78]
6FCE8646   03D2             ADD EDX,EDX
6FCE8648   2BD6             SUB EDX,ESI
6FCE864A   8D04D0           LEA EAX,DWORD PTR DS:[EAX+EDX*8]
6FCE864D   85C0             TEST EAX,EAX
6FCE864F   75 0C            JNZ SHORT D2Game.6FCE865D
6FCE8651   5F               POP EDI
6FCE8652   5E               POP ESI
6FCE8653   5D               POP EBP
6FCE8654   33C0             XOR EAX,EAX
6FCE8656   5B               POP EBX
6FCE8657   83C4 1C          ADD ESP,1C
6FCE865A   C2 0800          RETN 8
6FCE865D   8078 4E 01       CMP BYTE PTR DS:[EAX+4E],1
6FCE8661   77 0C            JA SHORT D2Game.6FCE866F                 ; threat>1?
6FCE8663   5F               POP EDI
6FCE8664   5E               POP ESI
6FCE8665   5D               POP EBP
6FCE8666   33C0             XOR EAX,EAX
6FCE8668   5B               POP EBX
6FCE8669   83C4 1C          ADD ESP,1C
6FCE866C   C2 0800          RETN 8
6FCE866F   8B4424 1C        MOV EAX,DWORD PTR SS:[ESP+1C]            ; EAX=TooFar????
6FCE8673   8B4C24 30        MOV ECX,DWORD PTR SS:[ESP+30]            ; inmeelerangebonus?
6FCE8677   03C1             ADD EAX,ECX                              ; EAX=^^^^
6FCE8679   8B4C24 24        MOV ECX,DWORD PTR SS:[ESP+24]            ; ECX=I guess resistrank
6FCE867D   8D547D 00        LEA EDX,DWORD PTR SS:[EBP+EDI*2]         ; EDX=threatSkills+2*statecoldset
6FCE8681   8D0C81           LEA ECX,DWORD PTR DS:[ECX+EAX*4]         ; ECX=resistRank+4*tooFar+inmeelerangebonus
6FCE8684   03D3             ADD EDX,EBX                              ; threatSkill+2*statecold+damagerank
6FCE8686   03C1             ADD EAX,ECX                              ; EAX=ECX+EAX
6FCE8688   8B4C24 28        MOV ECX,DWORD PTR SS:[ESP+28]            ; ECX=lifeBonus??
6FCE868C   8D0C49           LEA ECX,DWORD PTR DS:[ECX+ECX*2]         ; lifeBonus*3
6FCE868F   8D1450           LEA EDX,DWORD PTR DS:[EAX+EDX*2]
6FCE8692   03CA             ADD ECX,EDX
6FCE8694   B8 E9A28B2E      MOV EAX,2E8BA2E9
6FCE8699   F7E9             IMUL ECX
6FCE869B   C1FA 02          SAR EDX,2
6FCE869E   8BC2             MOV EAX,EDX
6FCE86A0   C1E8 1F          SHR EAX,1F
6FCE86A3   03D0             ADD EDX,EAX
6FCE86A5   75 05            JNZ SHORT D2Game.6FCE86AC
6FCE86A7   BA 01000000      MOV EDX,1
6FCE86AC   5F               POP EDI
6FCE86AD   5E               POP ESI
6FCE86AE   5D               POP EBP
6FCE86AF   8BC2             MOV EAX,EDX
6FCE86B1   5B               POP EBX
6FCE86B2   83C4 1C          ADD ESP,1C
6FCE86B5   C2 0800          RETN 8
 
Danke für die PM, werde mich mal reinfitzen. Hätte keine Geduld das selber rauszuschreiben, Lob für den Fleiß.

Lg
 
*seufz* Leider ist das Reverse Engineering, das Rückübersetzen von Quellcodes in Deutschland ein Verstoß gegen das Urheberrechtsgesetz (§69e). Sorry für den Rechtshänger, aber rein juristisch steht die Veröffentlichung (sogar die Durchführung!) des disassemblierten Quelltextes auf der selben Stufe wie das anfertigen einer sog. "Raubkopie". Ich habe keine Ahnung, wie das hier im Forum gehandhabt wird. Ich persönlich teile nicht die Auffassung des UhrG. Der Ordnung halber darauf hingewiesen und den Mod-Knopf gedrückt, da ich kein Interesse daran habe, dass PlanetDiablo damit rechtlich Probleme bekommt.
 
willst du das dann auch in jedem einzelnen thread im mod-forum machen? ^^
wenn blizzard etwas dagegen hätte, wären sie schon lange rechtlich gegen den hiesigen mod-bereich, gegen ganze moding-foren (zb PK) und vor allem die zahlreichen modifikations selbst vorgegangen.

danke corni, werds mir ansehen sobald ich etwas zeit hab.

mfg
 
Zurück
Oben