File: attacktest.pas

package info (click to toggle)
gearhead2 0.628-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, squeeze, wheezy
  • size: 7,380 kB
  • ctags: 33
  • sloc: pascal: 52,411; makefile: 72; sh: 12
file content (98 lines) | stat: -rw-r--r-- 3,259 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
program attacktest;

uses	gears,gearutil,locale,gearparser,effects,randmaps,ghchars,ghweapon,texutil;

const
	Tar_X = 9;
	Tar_Y = 8;

	Num_Trials = 20000;

var
	results: SAttPtr;


Function TestAttack( GB: GameBoardPtr; AMaster,Attacker,Target: GearPtr; SkLvl: Integer; UseSpotWeakness: Boolean ): LongInt;
	{ Run this attack a lot of times, and return the average damage done. }
var
	T,TT: LongInt;
	Dmg,Total: LongInt;
begin
	Total := 0;
	StripNAtt( FindRoot( Attacker ) , NAG_Damage );
	StripNAtt( FindRoot( Target ) , NAG_Damage );
	for T := 1 to Num_Trials do begin
		for tt := 1 to NumSkill do begin
			SetNAtt( AMaster^.NA , NAG_Skill , TT , SkLvl );
			SetNAtt( Target^.NA , NAG_Skill , TT , 7 );
		end;
		if not UseSpotWeakness then SetNAtt( AMaster^.NA , NAG_Skill , 18 , 0 );

		DoAttack( GB , Attacker , Target , Tar_X , Tar_Y , 0 , 0 );

		{ Measure the damage done. }
		Dmg := AmountOfDamage( Target );
		Total := Total + Dmg;

		{ Delete the damage from both attacker and target. }
		StripNAtt( FindRoot( Attacker ) , NAG_Condition );
		StripNAtt( FindRoot( Target ) , NAG_Condition );
		StripNAtt( FindRoot( Attacker ) , NAG_Damage );
		StripNAtt( FindRoot( Target ) , NAG_Damage );
		StripNAtt( FindRoot( Attacker ) , NAG_WeaponModifier );
		StripNAtt( FindRoot( Target ) , NAG_WeaponModifier );
	end;
	TestAttack := Total div Num_Trials;
end;

Procedure TestThings( GB: GameBoardPtr; AMaster , Target: GearPtr; SkLvl: LongInt; UseSpotWeakness: Boolean );
	{ Test Armed Combat vs Martial Arts at the requested skill level. }
var
	Attacker: GearPtr;
	Dmg: LongInt;
begin
	Attacker := SeekGearByName( AMaster^.SubCom , 'Night Scythe' );
	if Attacker = Nil then StoreSAtt( results, 'Night Scythe not found!' );
	Dmg := TestAttack( GB , AMaster , Attacker , Target , SkLvl , UseSpotWeakness );
	StoreSAtt( Results, 'Night Scythe at ' + BStr( SkLvl ) + ': ' + BStr( Dmg ) );

	Attacker := SeekGearByName( AMaster^.SubCom , 'arm' );
	if Attacker = Nil then StoreSAtt( results, 'Arm not found!' );
	Dmg := TestAttack( GB , AMaster , Attacker , Target , SkLvl , UseSpotWeakness );
	StoreSAtt( Results, 'Martial Arts at ' + BStr( SkLvl ) + ': ' + BStr( Dmg ) );
end;


var
	GB: GameBoardPtr;
	Scene,AMaster,Target: GearPtr;


begin
	AMaster := LoadNewMonster( 'Assassin Lord' );
	SetSAtt( AMaster^.SA , 'JOB <Assassin>' );
	Target := LoadNewMonster( 'Hunter-Destroyer' );
	Scene := LoadNewSTC( 'SCENE_EmptyBuilding' );
	GB := RandomMap( Scene );
	AppendGear( GB^.Meks , AMaster );
	AppendGear( GB^.Meks , Target );
	SetNAtt( AMaster^.NA , NAG_Location , NAS_X , Tar_X - 1 );
	SetNAtt( AMaster^.NA , NAG_Location , NAS_Y , Tar_Y );
	SetNAtt( Target^.NA , NAG_Location , NAS_X , Tar_X );
	SetNAtt( Target^.NA , NAG_Location , NAS_Y , Tar_Y );

	results := Nil;

	SetNAtt( AMaster^.NA , NAG_Talent , NAS_KungFu , 1 );
	SetNAtt( AMaster^.NA , NAG_Talent , 23 , 0 );

	TestThings( GB , AMaster , Target , 5 , True );
	TestThings( GB , AMaster , Target , 10 , True );
	TestThings( GB , AMaster , Target , 15 , True );
	TestThings( GB , AMaster , Target , 20 , True );

	SaveStringList( 'out.txt' , results );

	DisposeSAtt( results );
	DisposeMap( GB );
end.