Skip to content

Commit

Permalink
Генератор партий #22
Browse files Browse the repository at this point in the history
  • Loading branch information
devapromix committed Feb 22, 2021
1 parent 88d30f7 commit bed8d49
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 20 deletions.
58 changes: 44 additions & 14 deletions sources/DisciplesRL.Creatures.pas
Original file line number Diff line number Diff line change
Expand Up @@ -443,12 +443,15 @@ TCreature = record
class function Character(const I: TCreatureEnum): TCreatureBase; static;
class procedure Assign(var ACreature: TCreature;
const I: TCreatureEnum); static;
class function GetRandomEnum(const P, Position: Integer)
: TCreatureEnum; static;
end;

implementation

uses
System.SysUtils;
System.SysUtils,
System.Math;

const
CreatureBase: array [TCreatureEnum] of TCreatureBase = (
Expand All @@ -462,7 +465,8 @@ implementation
Description: ('Мизраэль был послан, чтобы помочь',
'Империи людей в их священной мис-', 'сии. Он охраняет столицу от врагов.');
HitPoints: 900; Initiative: 90; ChancesToHit: 95; Leadership: 5; Level: 1;
Damage: 250; Armor: 50; Heal: 0; SourceEnum: seLife; ReachEnum: reAll;),
Damage: 250; Armor: 50; Heal: 0; SourceEnum: seLife; ReachEnum: reAll;
Gold: 0;),
// Pegasus Knight
(ResEnum: rePegasusKnight; Name: 'Рыцарь на Пегасе';
Description: ('Оседлавший пегаса рыцарь - это бла-',
Expand Down Expand Up @@ -520,14 +524,15 @@ implementation
'может лечить раненых соратников,', 'по очереди перевязывая раны каждого.');
HitPoints: 50; Initiative: 10; ChancesToHit: 100; Leadership: 0; Level: 1;
Damage: 0; Armor: 0; Heal: 20; SourceEnum: seAir; ReachEnum: reAny;
Gold: 50),
Gold: 100),

// Ashgan
(ResEnum: reAshgan; Name: 'Ашган';
Description: ('Ашган, несущий чуму, был некогда',
'верховным священником Алкмаара.', 'Он не оставляет столицу без охраны.');
HitPoints: 900; Initiative: 90; ChancesToHit: 95; Leadership: 5; Level: 1;
Damage: 250; Armor: 50; Heal: 0; SourceEnum: seLife; ReachEnum: reAll;),
Damage: 250; Armor: 50; Heal: 0; SourceEnum: seLife; ReachEnum: reAll;
Gold: 0;),
// Death Knight
(ResEnum: rePegasusKnight; Name: 'Рыцарь Смерти';
Description: ('Сильнейшие и благороднейшие воины',
Expand Down Expand Up @@ -593,7 +598,7 @@ implementation
'избран Бетрезеном для защиты столицы Легионов,',
'никогда не оставляя её без защиты.'); HitPoints: 900; Initiative: 90;
ChancesToHit: 95; Leadership: 5; Level: 1; Damage: 250; Armor: 50; Heal: 0;
SourceEnum: seLife; ReachEnum: reAll;),
SourceEnum: seLife; ReachEnum: reAll; Gold: 0;),
// Duke
(ResEnum: rePegasusKnight; Name: 'Герцог';
Description: ('Воинственный герцог ведет демонов',
Expand All @@ -607,13 +612,13 @@ implementation
'Он путешествует по землям Невендаара', 'с высокой скоростью.');
HitPoints: 90; Initiative: 40; ChancesToHit: 80; Leadership: 1; Level: 1;
Damage: 40; Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAny;
Sound: (mmHumHit, mmHumDeath, mmBowAttack);),
Gold: 0; Sound: (mmHumHit, mmHumDeath, mmBowAttack);),
// Arch-Devil
(ResEnum: reArchmage; Name: 'Архидьявол';
Description: ('Архидьявол является владыкой магии;',
'он обладает глубокими знаниями', 'о посохах и свитках.'); HitPoints: 65;
Initiative: 40; ChancesToHit: 80; Leadership: 1; Level: 1; Damage: 30;
Armor: 0; Heal: 0; SourceEnum: seFire; ReachEnum: reAll;
Armor: 0; Heal: 0; SourceEnum: seFire; ReachEnum: reAll; Gold: 0;
Sound: (mmHumHit, mmHumDeath, mmStaffAttack);),
///
// Possessed
Expand Down Expand Up @@ -651,44 +656,44 @@ implementation
'орков. Они не такие сильные', 'создания, но зато хитрые и ловкие.');
HitPoints: 50; Initiative: 30; ChancesToHit: 80; Leadership: 0; Level: 1;
Damage: 15; Armor: 0; Heal: 0; SourceEnum: seLife; ReachEnum: reAdj;
Gold: 0; Sound: (mmGoblinHit, mmGoblinDeath, mmDaggerAttack);),
Gold: 50; Sound: (mmGoblinHit, mmGoblinDeath, mmDaggerAttack);),
// Goblin Archer
(ResEnum: reGoblinArcher; Name: 'Гоблин-лучник';
Description: ('Гоблины-лучники сопровождают своих',
'собратьев в засадах и нападениях,', 'используя грубые стрелы.');
HitPoints: 40; Initiative: 50; ChancesToHit: 80; Leadership: 0; Level: 1;
Damage: 15; Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAny;
Gold: 0; Sound: (mmGoblinHit, mmGoblinDeath, mmBowAttack);),
Gold: 75; Sound: (mmGoblinHit, mmGoblinDeath, mmBowAttack);),
// Goblin Elder
(ResEnum: reGoblinElder; Name: 'Гоблин-старейшина';
Description: ('Немногие гоблины настолько умны,',
'чтобы практиковать искусство магии,', 'но иногда появляются старейшины.');
HitPoints: 35; Initiative: 40; ChancesToHit: 80; Leadership: 0; Level: 1;
Damage: 10; Armor: 0; Heal: 0; SourceEnum: seFire; ReachEnum: reAll;
Gold: 0; Sound: (mmGoblinHit, mmGoblinDeath, mmStaffAttack);),
Gold: 100; Sound: (mmGoblinHit, mmGoblinDeath, mmStaffAttack);),

// Orc
(ResEnum: reOrc; Name: 'Орк';
Description: ('Орки в битвах всегда на передних',
'рядах, так как они обладают крепким', 'телосложением.'); HitPoints: 200;
Initiative: 40; ChancesToHit: 80; Leadership: 0; Level: 1; Damage: 55;
Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 0;
Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 200;
Sound: (mmOrcHit, mmOrcDeath, mmAxeAttack);),

// Ogre
(ResEnum: reOrc; Name: 'Огр';
Description: ('Огры нападают на всех проходящих',
'мимо, не обращая внимание на', 'тактику и стратегию.'); HitPoints: 300;
Initiative: 20; ChancesToHit: 80; Leadership: 0; Level: 1; Damage: 130;
Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 0;
Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 300;
Sound: (mmOrcHit, mmOrcDeath, mmAxeAttack);),

// Spider
(ResEnum: reGiantSpider; Name: 'Гигантский Паук';
Description: ('Сильный яд гигантского паука',
'полностью парализует жертву,', 'не давая ей убежать.'); HitPoints: 420;
Initiative: 35; ChancesToHit: 80; Leadership: 0; Level: 1; Damage: 130;
Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 0;
Armor: 0; Heal: 0; SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 400;
Sound: (mmSpiderHit, mmSpiderDeath, mmSpiderAttack);),

// Wolf
Expand All @@ -697,7 +702,7 @@ implementation
'землям в поисках добычи. Смерть ждет',
'воинов, которые столкнутся с ними.'); HitPoints: 180; Initiative: 50;
ChancesToHit: 80; Leadership: 0; Level: 1; Damage: 55; Armor: 0; Heal: 0;
SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 0;
SourceEnum: seWeapon; ReachEnum: reAdj; Gold: 200;
Sound: (mmWolfHit, mmWolfDeath, mmWolfAttack);)
//
);
Expand Down Expand Up @@ -756,6 +761,31 @@ class procedure TCreature.Clear(var ACreature: TCreature);
end;
end;

class function TCreature.GetRandomEnum(const P, Position: Integer)
: TCreatureEnum;
var
N, G: Integer;
R: TReachEnum;
begin
case Position of
0, 2, 4:
R := reAdj;
else
case RandomRange(0, 2) of
0:
R := reAll;
else
R := reAny;
end;
end;
repeat
N := RandomRange(0, Ord(High(TCreatureEnum))) + 1;
G := CreatureBase[TCreatureEnum(N)].Gold;
until (G > 0) and (G >= P - 25) and (G <= P + 25) and
(CreatureBase[TCreatureEnum(N)].ReachEnum = R);
Result := TCreatureEnum(N);
end;

function TCreature.IsLeader(): Boolean;
var
Race: TRaceEnum;
Expand Down
68 changes: 62 additions & 6 deletions sources/DisciplesRL.Saga.pas
Original file line number Diff line number Diff line change
Expand Up @@ -248,23 +248,79 @@ TPartyBase = record
{ TSaga }

class procedure TSaga.PartyInit(const AX, AY: Integer; IsFinal: Boolean);

var
Level, N: Integer;
Level, N, P: Integer;
I: TPosition;
Cr: TCreatureEnum;
begin
Level := EnsureRange((TMap.GetDistToCapital(AX, AY) div 3) +
Ord(TSaga.Difficulty), 1, MaxLevel);
SetLength(Party, TSaga.GetPartyCount + 1);
Party[TSaga.GetPartyCount - 1] := TParty.Create(AX, AY);
repeat
{ repeat
N := RandomRange(0, High(PartyBase) - 1) + 1;
until PartyBase[N].Level = Level;
if IsFinal then
until PartyBase[N].Level = Level;
if IsFinal then
N := High(PartyBase);
with Party[TSaga.GetPartyCount - 1] do
begin
for I := Low(TPosition) to High(TPosition) do
AddCreature(PartyBase[N].Character[I], I);
end;
}
// P:= Level*50;
P := 50+50;//+50;
with Party[TSaga.GetPartyCount - 1] do
begin
for I := Low(TPosition) to High(TPosition) do
AddCreature(PartyBase[N].Character[I], I);
//
Cr := TCreature.GetRandomEnum(P, 2);
case RandomRange(0, 4) of
0:
AddCreature(Cr, 2);
1:
begin
AddCreature(Cr, 0);
AddCreature(Cr, 4);
end;
2:
begin
AddCreature(Cr, 0);
AddCreature(Cr, 2);
AddCreature(Cr, 4);
end;
3:
begin
AddCreature(Cr, 0);
AddCreature(Cr, 4);
Cr := TCreature.GetRandomEnum(P, 2);
AddCreature(Cr, 2);
end;
end;
//
Cr := TCreature.GetRandomEnum(P, 3);
case RandomRange(0, 4) of
0:
AddCreature(Cr, 3);
1:
begin
AddCreature(Cr, 1);
AddCreature(Cr, 5);
end;
2:
begin
AddCreature(Cr, 1);
AddCreature(Cr, 3);
AddCreature(Cr, 5);
end;
3:
begin
AddCreature(Cr, 1);
AddCreature(Cr, 5);
Cr := TCreature.GetRandomEnum(P, 3);
AddCreature(Cr, 3);
end;
end;
end;
end;

Expand Down

0 comments on commit bed8d49

Please sign in to comment.