Skip to content

Commit

Permalink
Fix enemy randomizer
Browse files Browse the repository at this point in the history
  • Loading branch information
IntelOrca committed Mar 23, 2024
1 parent 17db107 commit 29a2350
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 19 deletions.
26 changes: 21 additions & 5 deletions IntelOrca.Biohazard.BioRand/EnemyRandomiser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,10 @@ private void GatherEsps()
{
// HarvestEnemyAssets(RdtId.Parse("1031"), ReCvEnemyIds.Zombie, 512, 2, 0, 2);
HarvestEnemyAssets(RdtId.Parse("10D0"), ReCvEnemyIds.Bat, 3, 1, 0, 1);
HarvestEnemyAssets(RdtId.Parse("10F0"), ReCvEnemyIds.Zombie, 256, 1, 0, 1);
HarvestEnemyAssets(RdtId.Parse("10C0"), ReCvEnemyIds.Zombie, 0, 1, 0, 1);
HarvestEnemyAssets(RdtId.Parse("2000"), ReCvEnemyIds.ZombieDog, 0, 1, 0, 1);
HarvestEnemyAssets(RdtId.Parse("2060"), ReCvEnemyIds.Bandersnatch, 0, 1, 0, 1);
HarvestEnemyAssets(RdtId.Parse("20C2"), ReCvEnemyIds.Tyrant, 0, 2, 0, 2);
HarvestEnemyAssets(RdtId.Parse("20C2"), ReCvEnemyIds.Tyrant, 0, 2, 1, 2);
HarvestEnemyAssets(RdtId.Parse("80D0"), ReCvEnemyIds.Hunter, 0, 1, 0, 1);
HarvestEnemyAssets(RdtId.Parse("80D0"), ReCvEnemyIds.Hunter, 256, 3, 0, 2);
}
Expand All @@ -116,7 +116,7 @@ private void HarvestEnemyAssets(RdtId rdtId, short enemyType, short variant, int
{
var rdt = (RdtCv)_gameData.GetRdt(rdtId)!.RdtFile;
var model = rdt.Models.Pages[modelIndex];
var motion = rdt.Motions;
var motion = rdt.Motions; ;
var texture = rdt.Textures.Groups[textureIndex];
_cvEnemies.Add(new CvEnemyAssets(enemyType, variant, model, motion, texture));
}
Expand Down Expand Up @@ -630,13 +630,24 @@ private void RandomiseRoom(Rng rng, RandomizedRdt rdt, MapRoomEnemies enemySpec,
}
rdtb.Models = models.ToCvModelList();

// var motions = rdtb.Motions.ToBuilder();
// motions.Pages.RemoveAt(1);
// motions.Pages.Insert(0, assets.Motion);
// rdtb.Motions = motions.ToCvMotionList();
rdtb.Motions = assets.Motion;

var textures = rdtb.Textures.ToBuilder();
textures.Groups.RemoveAt(1);
textures.Groups.Insert(1, assets.Texture);
for (var i = 0; i < placements.Length; i++)
{
textures.Groups.Insert(1, assets.Texture);
if (enemyType != ReCvEnemyIds.Zombie)
break;
}
rdtb.Textures = textures.ToTextureList();

var variant = assets.Variant;

rdtb.Enemies.Clear();
foreach (var ep in placements)
{
Expand All @@ -645,11 +656,14 @@ private void RandomiseRoom(Rng rng, RandomizedRdt rdt, MapRoomEnemies enemySpec,
Header = 1,
Type = enemyType,
Effect = 0,
Variant = assets.Variant,
Variant = variant,
Index = (short)rdtb.Enemies.Count,
Position = new RdtCv.VectorF(ep.X, ep.Y, ep.Z),
Rotation = new RdtCv.Vector32(0, ep.D, 0),
});

if (enemyType == ReCvEnemyIds.Zombie)
variant += 256;
}

rdt.RdtFile = rdtb.ToRdt();
Expand Down Expand Up @@ -733,6 +747,8 @@ private byte[] GetPossibleEnemyTypes(MapRoomEnemies enemySpec, SelectableEnemy t
private SceEmSetOpcode[] GenerateRandomEnemies(Rng rng, RandomizedRdt rdt, MapRoomEnemies enemySpec, SceEmSetOpcode[] currentEnemies, byte enemyType)
{
var placements = GetRandomPlacements(rdt.RdtId, rng, enemySpec, enemyType);
if (placements.Length == 0)
return new SceEmSetOpcode[0];

foreach (var enemy in currentEnemies)
rdt.Nop(enemy.Offset);
Expand Down
2 changes: 0 additions & 2 deletions IntelOrca.Biohazard.BioRand/RECV/ReCvEnemyHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ public int GetEnemyTypeLimit(RandoConfig config, int difficulty, byte type)
{
if (type == RECV.ReCvEnemyIds.Tyrant)
return 1;
if (type == RECV.ReCvEnemyIds.Zombie)
return 1;

var limit = new byte[] { 2, 4, 7, 10 };
var index = Math.Min(limit.Length - 1, difficulty);
Expand Down
68 changes: 56 additions & 12 deletions IntelOrca.Biohazard.BioRand/RECV/ReCvRandomiser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace IntelOrca.Biohazard.BioRand.RECV
public class ReCvRandomiser : BaseRandomiser
{
private AfsFile? _advAfs;
// private AfsFile? _multspq1Afs;
private AfsFile? _rdxAfs;
private AfsFile? _systemAfs;
private RandomizedRdt[] _rdts = new RandomizedRdt[205];
Expand Down Expand Up @@ -146,6 +147,7 @@ public override void Generate(RandoConfig config, IRandoProgress progress, FileR
try
{
FileIdentifier? advAfsFileId;
FileIdentifier? multspq1AfsFileId;
FileIdentifier? rdxAfsFileId;
FileIdentifier? elfFileId;
FileIdentifier? systemAfsFileId;
Expand All @@ -156,6 +158,10 @@ public override void Generate(RandoConfig config, IRandoProgress progress, FileR
if (advAfsFileId == null)
throw new BioRandUserException("ADV.AFS not found in ISO");

multspq1AfsFileId = udfEditor.GetFileByName("MULTSPQ1.AFS");
if (multspq1AfsFileId == null)
throw new BioRandUserException("MULTSPQ1.AFS not found in ISO");

rdxAfsFileId = udfEditor.GetFileByName("RDX_LNK.AFS");
if (rdxAfsFileId == null)
throw new BioRandUserException("RDX_LNK.AFS not found in ISO");
Expand All @@ -169,12 +175,13 @@ public override void Generate(RandoConfig config, IRandoProgress progress, FileR
throw new BioRandUserException("SYSTEM.AFS not found in ISO");

_advAfs = ReadAfs(udfEditor, advAfsFileId);
// _multspq1Afs = ReadAfs(udfEditor, multspq1AfsFileId);
_rdxAfs = ReadAfs(udfEditor, rdxAfsFileId);
_elf = ReadFile(udfEditor, elfFileId);
_systemAfs = ReadAfs(udfEditor, systemAfsFileId);
}

// ExtractAfs(_advAfs, @"F:\games\recv\extracted\adv.afs");
// ExtractAfs(_multspq1Afs, @"F:\games\recv\extracted\multspq1.afs");
using (progress.BeginTask(null, $"Creating backgrounds"))
ReplaceBackground(config);

Expand Down Expand Up @@ -372,19 +379,56 @@ void SetInventoryItem(int index, byte type, byte quantity)

private unsafe void TestEdits(GameData gameData)
{
#if DEBUG
#if DEBUG1
// QuickDoor(RdtId.Parse("10B"), 0);

// var rrdt = gameData.GetRdt(RdtId.Parse("1021"))!;
// rrdt.PostModifications.Add(() =>
// {
// var rdtBuilder = ((RdtCv)rrdt.RdtFile).ToBuilder();
// rdtBuilder.Enemies.RemoveAt(rdtBuilder.Enemies.Count - 1);
// rdtBuilder.Enemies.RemoveAt(rdtBuilder.Enemies.Count - 1);
// rdtBuilder.Enemies.RemoveAt(rdtBuilder.Enemies.Count - 1);
// rdtBuilder.Enemies.RemoveAt(rdtBuilder.Enemies.Count - 1);
// rrdt.RdtFile = rdtBuilder.ToRdt();
// });
var srcRdt = (RdtCv)gameData.GetRdt(RdtId.Parse("10C0"))!.RdtFile;
var srcModels = srcRdt.Models.Pages[1..5].ToArray();
var srcMotion = srcRdt.Motions;
var srcTexture = srcRdt.Textures.Groups[1..4].ToArray();
var srcEnemies = srcRdt.Enemies.ToArray();

var rrdt = gameData.GetRdt(RdtId.Parse("1010"))!;
rrdt.PostModifications.Add(() =>
{
var rdtBuilder = ((RdtCv)rrdt.RdtFile).ToBuilder();

var scdb = new ScdProcedureList.Builder(BioVersion.BiohazardCv);
scdb.Procedures.Add(new ScdProcedure(BioVersion.BiohazardCv, new byte[] { 0x00, 0x00 }));
scdb.Procedures.Add(new ScdProcedure(BioVersion.BiohazardCv, new byte[] { 0x00, 0x00 }));
rdtBuilder.Script = scdb.ToProcedureList();

rdtBuilder.Motions = srcMotion;

var modelListBuilder = rdtBuilder.Models.ToBuilder();
modelListBuilder.Pages.RemoveAt(1);
modelListBuilder.Pages.Insert(1, srcModels[0]);
modelListBuilder.Pages.Insert(1, srcModels[2]);
rdtBuilder.Models = modelListBuilder.ToCvModelList();

var textureListBuilder = rdtBuilder.Textures.ToBuilder();
textureListBuilder.Groups.RemoveAt(1);
textureListBuilder.Groups.Insert(1, srcTexture[0]);
// textureListBuilder.Groups.Insert(1, srcTexture[0]);
rdtBuilder.Textures = textureListBuilder.ToTextureList();

rdtBuilder.Enemies.Clear();
for (var i = 0; i < 2; i++)
{
rdtBuilder.Enemies.Add(new RdtCv.Enemy()
{
Header = 1,
Type = ReCvEnemyIds.Zombie,
Effect = 0,
Variant = 0,
Index = (short)i,
Position = new RdtCv.VectorF(8, 0, 24),
Rotation = new RdtCv.Vector32()
});
}

rrdt.RdtFile = rdtBuilder.ToRdt();
});
#endif
}

Expand Down

0 comments on commit 29a2350

Please sign in to comment.