Merge branch 'sebastian-heinz:develop' into feat/serverside-translation

This commit is contained in:
Nirrudn 2026-07-10 18:44:01 -04:00 committed by GitHub
commit dad78cc2bb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
37 changed files with 282685 additions and 282541 deletions

View file

@ -23,19 +23,19 @@ public class MonsterSpotInfo : IMonsterSpotInfo
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.RogueFighter, 10, 100, 0)
LibDdon.Enemy.Create(EnemyId.RogueFighter, 10, 62, 17)
.SetDropsTable(dropsTable)
.SetHmPresetNo(HmPresetId.RogueFighter)
.SetNamedEnemyParams(NamedParamId.HiddenBeachRogue),
LibDdon.Enemy.Create(EnemyId.RogueSeeker, 10, 100, 1)
LibDdon.Enemy.Create(EnemyId.RogueSeeker, 10, 62, 18)
.SetDropsTable(dropsTable)
.SetHmPresetNo(HmPresetId.RogueSeeker)
.SetNamedEnemyParams(NamedParamId.HiddenBeachRogue),
LibDdon.Enemy.Create(EnemyId.RogueHunter, 10, 100, 2)
LibDdon.Enemy.Create(EnemyId.RogueHunter, 10, 62, 19)
.SetDropsTable(dropsTable)
.SetHmPresetNo(HmPresetId.RogueHunter)
.SetNamedEnemyParams(NamedParamId.HiddenBeachRogue),
LibDdon.Enemy.Create(EnemyId.RogueMage, 10, 100, 3)
LibDdon.Enemy.Create(EnemyId.RogueMage, 10, 62, 20)
.SetDropsTable(dropsTable)
.SetHmPresetNo(HmPresetId.RogueMage)
.SetNamedEnemyParams(NamedParamId.HiddenBeachRogue),

View file

@ -23,13 +23,21 @@ public class MonsterSpotInfo : IMonsterSpotInfo
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 384, 1)
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 52, 10)
.SetDropsTable(namedEnemyDrops)
.SetNamedEnemyParams(NamedParamId.MotherHarpy),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 52, 11)
.SetDropsTable(namedEnemyDrops)
.SetNamedEnemyParams(NamedParamId.MotherHarpy),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 52, 12)
.SetDropsTable(namedEnemyDrops)
.SetNamedEnemyParams(NamedParamId.MotherHarpy),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 52, 13)
.SetDropsTable(namedEnemyDrops)
.SetNamedEnemyParams(NamedParamId.MotherHarpy),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 52, 14)
.SetDropsTable(namedEnemyDrops)
.SetNamedEnemyParams(NamedParamId.MotherHarpy),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 276, 0),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 276, 2),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 276, 3),
LibDdon.Enemy.Create(EnemyId.Harpy, 13, 276, 4),
});
}
}

View file

@ -28,7 +28,7 @@ public class MonsterSpotInfo : IMonsterSpotInfo
public override void Initialize()
{
var namedEnemyDrops = LibDdon.Enemy.GetDropsTable(EnemyId.HobgoblinLeader, 20).Clone()
var namedEnemyDrops = LibDdon.Enemy.GetDropsTable(EnemyId.HobgoblinLeader, 19).Clone()
.AddDrop(ItemId.BronzeScale0, 1, 1, DropRate.RARE)
.AddDrop(ItemId.HematiteSand, 1, 3, DropRate.VERY_COMMON)
.AddDrop(ItemId.LeatherCord, 1, 1, DropRate.UNCOMMON)
@ -36,20 +36,14 @@ public class MonsterSpotInfo : IMonsterSpotInfo
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.HobgoblinLeader, 20, 706, 2)
LibDdon.Enemy.Create(EnemyId.HobgoblinLeader, 19, 105, 0)
.SetDropsTable(namedEnemyDrops)
.SetNamedEnemyParams(NamedParamId.GyumulTheSpikedHorn),
CreateRandomHobgoblin(18, 510, 0)
CreateRandomHobgoblin(18, 96, 1)
.SetNamedEnemyParams(NamedParamId.GyumulsMinion),
CreateRandomHobgoblin(18, 510, 1)
CreateRandomHobgoblin(18, 96, 2)
.SetNamedEnemyParams(NamedParamId.GyumulsMinion),
CreateRandomHobgoblin(18, 510, 3)
.SetNamedEnemyParams(NamedParamId.GyumulsMinion),
CreateRandomHobgoblin(18, 510, 4)
.SetNamedEnemyParams(NamedParamId.GyumulsMinion),
CreateRandomHobgoblin(18, 510, 5)
.SetNamedEnemyParams(NamedParamId.GyumulsMinion),
CreateRandomHobgoblin(18, 510, 6)
CreateRandomHobgoblin(18, 96, 3)
.SetNamedEnemyParams(NamedParamId.GyumulsMinion),
});
}

View file

@ -24,12 +24,18 @@ public class MonsterSpotInfo : IMonsterSpotInfo
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.Wight0, 23, 874, 0)
LibDdon.Enemy.Create(EnemyId.Wight0, 23, 1336, 3)
.SetIsBoss(true)
.SetScale(115)
.SetDropsTable(namedEnemyDrops)
.SetNamedEnemyParams(NamedParamId.SpecterOfRuflow)
.SetSpawnTime(GameTimeManager.NightTime),
LibDdon.Enemy.Create(EnemyId.SkeletonKnight, 21, 95, 4)
.SetNamedEnemyParams(NamedParamId.FormerVillager)
.SetSpawnTime(GameTimeManager.NightTime),
LibDdon.Enemy.Create(EnemyId.SkeletonKnight, 21, 95, 5)
.SetNamedEnemyParams(NamedParamId.FormerVillager)
.SetSpawnTime(GameTimeManager.NightTime),
});
}
}

View file

@ -0,0 +1,47 @@
/**
* @brief Enemy Spot in "Breya Coast" for "Deserted Village of Ruflow"
*/
#load "libs.csx"
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(104);
public override QuestAreaId AreaId => QuestAreaId.BreyaCoast;
public override bool CautionPlayer => false;
public override uint RequiredAreaRank => 7;
public class NamedParamId
{
public const uint FormerVillager = 204; // Former Villager
}
public override void Initialize()
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.Skeleton, 20, 73, 4)
.SetNamedEnemyParams(NamedParamId.FormerVillager)
.SetSpawnTime(GameTimeManager.NightTime)
.SetStartThinkTblNo(8)
.SetIsManualSet(true),
LibDdon.Enemy.Create(EnemyId.Skeleton, 20, 73, 5)
.SetNamedEnemyParams(NamedParamId.FormerVillager)
.SetSpawnTime(GameTimeManager.NightTime)
.SetStartThinkTblNo(8)
.SetIsManualSet(true),
LibDdon.Enemy.Create(EnemyId.Skeleton, 20, 73, 6)
.SetNamedEnemyParams(NamedParamId.FormerVillager)
.SetSpawnTime(GameTimeManager.NightTime)
.SetStartThinkTblNo(8)
.SetIsManualSet(true),
LibDdon.Enemy.Create(EnemyId.Skeleton, 20, 73, 7)
.SetNamedEnemyParams(NamedParamId.FormerVillager)
.SetSpawnTime(GameTimeManager.NightTime)
.SetStartThinkTblNo(8)
.SetIsManualSet(true),
});
}
}
return new MonsterSpotInfo();

View file

@ -6,7 +6,7 @@
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(103);
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(98);
public override QuestAreaId AreaId => QuestAreaId.BreyaCoast;
public override uint RequiredAreaRank => 8;
@ -25,7 +25,7 @@ public class MonsterSpotInfo : IMonsterSpotInfo
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.ArmoredCyclops, 27, 1126, 0)
LibDdon.Enemy.Create(EnemyId.ArmoredCyclops, 27, 2756, 2)
.SetIsBoss(true)
.SetScale(135)
.SetDropsTable(namedEnemyDrops)

View file

@ -6,7 +6,7 @@
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(147);
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(142);
public override QuestAreaId AreaId => QuestAreaId.MysreeGrove;
public override uint RequiredAreaRank => 3;
@ -23,16 +23,13 @@ public class MonsterSpotInfo : IMonsterSpotInfo
var enemies = new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.BlueNewt, 35, 0)
LibDdon.Enemy.Create(EnemyId.BlueNewt, 35, 173, 10)
.SetDropsTable(dropsTable)
.SetNamedEnemyParams(NamedParamId.CobaltNewt),
LibDdon.Enemy.CreateAuto(EnemyId.BlueNewt, 35, 1)
LibDdon.Enemy.Create(EnemyId.BlueNewt, 35, 173, 11)
.SetDropsTable(dropsTable)
.SetNamedEnemyParams(NamedParamId.CobaltNewt),
LibDdon.Enemy.CreateAuto(EnemyId.BlueNewt, 35, 2)
.SetDropsTable(dropsTable)
.SetNamedEnemyParams(NamedParamId.CobaltNewt),
LibDdon.Enemy.CreateAuto(EnemyId.BlueNewt, 35, 3)
LibDdon.Enemy.Create(EnemyId.BlueNewt, 35, 173, 12)
.SetDropsTable(dropsTable)
.SetNamedEnemyParams(NamedParamId.CobaltNewt),
};

View file

@ -19,7 +19,7 @@ public class MonsterSpotInfo : IMonsterSpotInfo
{
var enemies = new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.MoleTroll0, 43, 2)
LibDdon.Enemy.Create(EnemyId.MoleTroll0, 43, 4080, 2)
.SetIsBoss(true)
.SetNamedEnemyParams(NamedParamId.JotunTheReturned),
};

View file

@ -12,7 +12,6 @@ public class MonsterSpotInfo : IMonsterSpotInfo
public class NamedParamId
{
public const uint MergodaPatrolCorps = 251; // Mergoda Patrol Corps
public const uint MergodaFemaleOfficer = 252; // Mergoda Female Officer
}
@ -20,11 +19,10 @@ public class MonsterSpotInfo : IMonsterSpotInfo
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.Witch, 47, 0, isBoss: true)
LibDdon.Enemy.Create(EnemyId.Witch, 47, 3024, 1)
.SetIsBoss(true)
.SetNamedEnemyParams(NamedParamId.MergodaFemaleOfficer)
.AddDrop(ItemId.CrestOfGreaterMagick0, 1, 3, DropRate.UNCOMMON),
LibDdon.Enemy.CreateAuto(EnemyId.AlchemizedSkeleton, 46, 1)
.SetNamedEnemyParams(NamedParamId.MergodaPatrolCorps),
});
}
}

View file

@ -0,0 +1,39 @@
/**
* @brief Enemy Spot in "Zandora Wastelands" for "Twin Wheel Valley"
*/
#load "libs.csx"
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(362);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override bool CautionPlayer => false;
public override uint RequiredAreaRank => 2;
public class NamedParamId
{
public const uint MergodaPatrolCorps = 251; // Mergoda Patrol Corps
}
public override void Initialize()
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.AlchemizedSkeleton, 46, 444, 6)
.SetNamedEnemyParams(NamedParamId.MergodaPatrolCorps),
LibDdon.Enemy.Create(EnemyId.AlchemizedSkeleton, 46, 444, 7)
.SetNamedEnemyParams(NamedParamId.MergodaPatrolCorps),
LibDdon.Enemy.Create(EnemyId.AlchemizedSkeleton, 46, 444, 8)
.SetNamedEnemyParams(NamedParamId.MergodaPatrolCorps),
LibDdon.Enemy.Create(EnemyId.AlchemizedSkeleton, 46, 444, 9)
.SetNamedEnemyParams(NamedParamId.MergodaPatrolCorps),
LibDdon.Enemy.Create(EnemyId.AlchemizedSkeleton, 46, 444, 10)
.SetNamedEnemyParams(NamedParamId.MergodaPatrolCorps),
LibDdon.Enemy.Create(EnemyId.AlchemizedSkeleton, 46, 444, 11)
.SetNamedEnemyParams(NamedParamId.MergodaPatrolCorps),
});
}
}
return new MonsterSpotInfo();

View file

@ -6,26 +6,22 @@
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(360);
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(439);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override uint RequiredAreaRank => 4;
public class NamedParamId
{
public const uint RustedIronGiantWarrior = 249; // Rusted Iron Giant Warrior
public const uint RustedAlchemizedGoblin = 250; // Rusted Alchemized Goblin
}
public override void Initialize()
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.DamnedGolem, 49, 2, isBoss: true)
LibDdon.Enemy.Create(EnemyId.DamnedGolem, 49, 4617, 1)
.SetIsBoss(true)
.SetNamedEnemyParams(NamedParamId.RustedIronGiantWarrior),
LibDdon.Enemy.CreateAuto(EnemyId.DamnedGoblin, 49, 0)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.CreateAuto(EnemyId.DamnedSlingGoblinFlask, 49, 1)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
});
}
}

View file

@ -0,0 +1,32 @@
/**
* @brief Enemy Spot in "Zandora Wastelands" for "Banded Haunt"
*/
#load "libs.csx"
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(431);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override uint RequiredAreaRank => 4;
public class NamedParamId
{
public const uint RustedAlchemizedGoblin = 250; // Rusted Alchemized Goblin
}
public override void Initialize()
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.DamnedGoblin, 49, 236, 3)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedGoblin, 49, 236, 4)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedGoblin, 49, 236, 5)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
});
}
}
return new MonsterSpotInfo();

View file

@ -0,0 +1,32 @@
/**
* @brief Enemy Spot in "Zandora Wastelands" for "Banded Haunt"
*/
#load "libs.csx"
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(437);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override uint RequiredAreaRank => 4;
public class NamedParamId
{
public const uint RustedAlchemizedGoblin = 250; // Rusted Alchemized Goblin
}
public override void Initialize()
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.DamnedGoblin, 49, 236, 3)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedGoblin, 49, 236, 4)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedGoblin, 49, 236, 5)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
});
}
}
return new MonsterSpotInfo();

View file

@ -0,0 +1,36 @@
/**
* @brief Enemy Spot in "Zandora Wastelands" for "Banded Haunt"
*/
#load "libs.csx"
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(438);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override uint RequiredAreaRank => 4;
public class NamedParamId
{
public const uint RustedAlchemizedGoblin = 250; // Rusted Alchemized Goblin
}
public override void Initialize()
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.DamnedSlingGoblinFlask, 49, 236, 5)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedSlingGoblinFlask, 49, 236, 6)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedSlingGoblinFlask, 49, 236, 7)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedSlingGoblinFlask, 49, 236, 8)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
LibDdon.Enemy.Create(EnemyId.DamnedSlingGoblinFlask, 49, 236, 9)
.SetNamedEnemyParams(NamedParamId.RustedAlchemizedGoblin),
});
}
}
return new MonsterSpotInfo();

View file

@ -27,15 +27,15 @@ public class MonsterSpotInfo : IMonsterSpotInfo
// TODO: Guessed based on item levels, but might need to be updated
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.BandedHunter, 48, 2)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian2)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.CreateAuto(EnemyId.BandedFighter, 48, 0)
LibDdon.Enemy.Create(EnemyId.BandedFighter, 48, 238, 0)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian0)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.CreateAuto(EnemyId.BandedMage, 48, 1)
LibDdon.Enemy.Create(EnemyId.BandedFighter, 48, 238, 1)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian0)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.Create(EnemyId.BandedMage, 48, 238, 2)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian5)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),

View file

@ -0,0 +1,59 @@
/**
* @brief Enemy Spot in "Zandora Wastelands" for "South Mergoda Ruins"
*/
#load "libs.csx"
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(409);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override uint RequiredAreaRank => 5;
public class NamedParamId
{
public const uint ZandoraBarbarian0 = 253; // Zandora Barbarian (Fighter)
public const uint ZandoraBarbarian1 = 254; // Zandora Barbarian (Seeker)
public const uint ZandoraBarbarian2 = 255; // Zandora Barbarian (Hunter)
public const uint ZandoraBarbarian3 = 256; // Zandora Barbarian (Healer)
public const uint ZandoraBarbarian4 = 257; // Zandora Barbarian (Defender)
public const uint ZandoraBarbarian5 = 258; // Zandora Barbarian (Mage)
public const uint ZandoraBarbarian6 = 259; // Zandora Barbarian (Warrior)
}
public override void Initialize()
{
// TODO: Unable to locate what jewlery these enemies should drop
// TODO: Guessed based on item levels, but might need to be updated
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.Create(EnemyId.BandedFighter, 48, 238, 0)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian0)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.Create(EnemyId.BandedHunter, 48, 238, 1)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian2)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.Create(EnemyId.BandedMage, 48, 238, 2)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian5)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.Create(EnemyId.BandedHealer, 48, 238, 3)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian3)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.Create(EnemyId.BandedFighter, 48, 238, 4)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian0)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
LibDdon.Enemy.Create(EnemyId.BandedHunter, 48, 238, 5)
.SetNamedEnemyParams(NamedParamId.ZandoraBarbarian2)
.AddDrop(ItemId.HighVitalityRing, 1, 1, DropRate.RARE)
.AddDrop(ItemId.SacredTreeRing, 1, 1, DropRate.VERY_RARE),
});
}
}
return new MonsterSpotInfo();

View file

@ -21,24 +21,20 @@ public class MonsterSpotInfo : IMonsterSpotInfo
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.GeneralOrc, 56, 3)
.SetNamedEnemyParams(NamedParamId.OrcRemnants1)
LibDdon.Enemy.Create(EnemyId.GeneralOrc, 56, 1526, 0)
.SetNamedEnemyParams(NamedParamId.OrcGeneralRemnant)
.AddDrop(ItemId.RousingSteak, 1, 3, DropRate.UNCOMMON),
LibDdon.Enemy.CreateAuto(EnemyId.OrcBattler, 56, 0)
LibDdon.Enemy.Create(EnemyId.OrcBattler, 56, 356, 1)
.SetRepopConditions(1, 10)
.SetNamedEnemyParams(NamedParamId.OrcRemnants0),
LibDdon.Enemy.CreateAuto(EnemyId.OrcBattler, 56, 1)
LibDdon.Enemy.Create(EnemyId.OrcBattler, 56, 356, 2)
.SetRepopConditions(1, 10)
.SetNamedEnemyParams(NamedParamId.OrcRemnants0),
LibDdon.Enemy.CreateAuto(EnemyId.OrcBattler, 56, 2)
.SetNamedEnemyParams(NamedParamId.OrcRemnants0),
LibDdon.Enemy.CreateAuto(EnemyId.OrcBattler, 56, 4)
.SetNamedEnemyParams(NamedParamId.OrcRemnants0),
LibDdon.Enemy.CreateAuto(EnemyId.OrcTrooper, 56, 5)
LibDdon.Enemy.Create(EnemyId.OrcTrooper, 56, 307, 3)
.SetRepopConditions(1, 10)
.SetNamedEnemyParams(NamedParamId.OrcRemnants1),
LibDdon.Enemy.CreateAuto(EnemyId.OrcTrooper, 56, 6)
.SetNamedEnemyParams(NamedParamId.OrcRemnants1),
LibDdon.Enemy.CreateAuto(EnemyId.OrcTrooper, 56, 8)
.SetNamedEnemyParams(NamedParamId.OrcRemnants1),
LibDdon.Enemy.CreateAuto(EnemyId.OrcTrooper, 56, 9)
LibDdon.Enemy.Create(EnemyId.OrcTrooper, 56, 307, 4)
.SetRepopConditions(1, 10)
.SetNamedEnemyParams(NamedParamId.OrcRemnants1),
});
}

View file

@ -6,7 +6,7 @@
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(373);
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(375);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override uint RequiredAreaRank => 9;
@ -19,7 +19,8 @@ public class MonsterSpotInfo : IMonsterSpotInfo
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.Nightmare, 58, 0, isBoss: true)
LibDdon.Enemy.Create(EnemyId.Nightmare, 58, 8831, 1)
.SetIsBoss(true)
.SetNamedEnemyParams(NamedParamId.WailingMora)
.AddDrop(ItemId.TitanBracelet, 1, 1, DropRate.RARE)
.AddDrop(ItemId.MephistoBracelet, 1, 1, DropRate.RARE)

View file

@ -6,7 +6,7 @@
public class MonsterSpotInfo : IMonsterSpotInfo
{
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(364);
public override StageLayoutId StageLayoutId => Stage.Lestania.AsStageLayoutId(361);
public override QuestAreaId AreaId => QuestAreaId.ZandoraWastelands;
public override uint RequiredAreaRank => 12;
@ -19,7 +19,8 @@ public class MonsterSpotInfo : IMonsterSpotInfo
{
AddEnemies(new List<InstancedEnemy>()
{
LibDdon.Enemy.CreateAuto(EnemyId.BlackGriffin0, 70, 0, isBoss: true)
LibDdon.Enemy.Create(EnemyId.BlackGriffin0, 70, 6840, 6)
.SetIsBoss(true)
.SetNamedEnemyParams(NamedParamId.BlackSeaEagleOfTheRuinedSite)
});
}

View file

@ -51,7 +51,7 @@ public class ScriptedQuest : IQuest
// Dacreim Fortress
public const uint Allies0 = 5405; // Gillian, Lise, Gurdolin, Elliot
public const uint Allies1 = 5412; // Nedo, Meirova, Gillian, Gurdolin, Lise, Elliot, Bertha
public const uint Nedo = 6532; // Nedo,
public const uint Nedo = 6532; // Nedo,
public const uint Blockade = 5643;
// Rathnite Foothills Lakeside
@ -80,7 +80,7 @@ public class ScriptedQuest : IQuest
{
AddEnemies(EnemyGroupId.Encounter + 0, Stage.RathniteFoothillsLakeside0, 25, QuestEnemyPlacementType.Manual, new()
{
// 0, 2, 3, 4
// 0, 2, 3, 4
LibDdon.Enemy.CreateAuto(EnemyId.SquadLeaderDwarfOrc, 84, 0)
.SetNamedEnemyParams(NamedParamId.FortGuard),
LibDdon.Enemy.CreateAuto(EnemyId.SwordSoldierDwarfOrc, 84, 2)
@ -159,7 +159,7 @@ public class ScriptedQuest : IQuest
process0.AddNewTalkToNpcBlock(QuestAnnounceType.CheckpointAndUpdate, Stage.RathniteFoothillsLakeside0, 0, 0, NpcId.RothgillSoldier0, 24170) // Head to the soldier before Dacreim Fortress
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.RothgillSoldiers)
.AddQuestFlag(QuestFlagAction.Clear, QuestFlags.RathniteFoothillsLakeside.FortDacriumWallBreach);
process0.AddDestroyGroupBlock(QuestAnnounceType.CheckpointAndUpdate, EnemyGroupId.Encounter + 0); // Defeat the obstructing Orcs to storm into Dacreim Fortress
process0.AddDestroyGroupBlock(QuestAnnounceType.CheckpointAndUpdate, EnemyGroupId.Encounter + 0); // Defeat the obstructing Orcs to storm into Dacreim Fortress
process0.AddDiscoverGroupBlock(QuestAnnounceType.CheckpointAndUpdate, EnemyGroupId.Encounter + 1) // Raid Dacreim Fortress
.AddQuestFlag(QuestFlagAction.Set, QuestFlags.RathniteFoothillsLakeside.DacriumFortressEntrance);
process0.AddDestroyGroupBlock(QuestAnnounceType.Update, EnemyGroupId.Encounter + 1, resetGroup: false); // Eliminate the War-Ready Manticore and the War-Ready Grimwarg
@ -167,6 +167,8 @@ public class ScriptedQuest : IQuest
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.Nedo);
process0.AddPlayEventBlock(QuestAnnounceType.None, Stage.DacreimFortress0, 0, 4);
process0.AddSpawnGroupBlock(QuestAnnounceType.Update, EnemyGroupId.Encounter + 2) // Eliminate the enemy
.AddResultCmdMyQstFlagOn(3605)
.AddResultCmdSetDiePlayerReturnPos(Stage.DacreimFortress0, 4, 0)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.Allies0)
.AddQuestFlag(QuestFlagType.MyQst, QuestFlagAction.Set, MyQstFlag.StartAdds)
.AddCheckCmdEmHpLess(Stage.DacreimFortress0, 1, 0, 65)
@ -174,6 +176,8 @@ public class ScriptedQuest : IQuest
process0.AddPlayEventBlock(QuestAnnounceType.None, Stage.DacreimFortress0, 5, 1)
.AddQuestFlag(QuestFlagType.MyQst, QuestFlagAction.Set, MyQstFlag.EndAdds);
process0.AddNewTalkToNpcBlock(QuestAnnounceType.CheckpointAndUpdate, Stage.DacreimFortress0, 1, 0, NpcId.Nedo0, 23223) // Speak with Nedo
.AddResultCmdResetDiePlayerReturnPos(Stage.Invalid, 0)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Clear, QstLayoutFlag.Blockade)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Clear, QstLayoutFlag.Nedo)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Clear, QstLayoutFlag.Allies0)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.Allies1);

View file

@ -14,11 +14,6 @@ public class ScriptedQuest : IQuest
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.QuestUsefulForAdventure;
public override bool AcceptRequirementsMet(GameClient client)
{
return client.Character.CharacterJobDataList.Any(x => x.Lv >= 70);
}
protected override void InitializeRewards()
{
AddPointReward(PointType.ExperiencePoints, 38375);
@ -29,6 +24,8 @@ public class ScriptedQuest : IQuest
protected override void InitializeBlocks()
{
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Any, 70);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Archibald0, 20221);
process0.AddRawBlock(QuestAnnounceType.Accept)
.AddCheckCmdOpenPpMode()

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Fighter
* @brief Seeking the Master: Fighter
*/
#load "libs.csx"
@ -11,19 +11,18 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.FighterTacticsTrialBreakAttack) &&
client.Character.ActiveCharacterJobData.Job == JobId.Fighter;
return client.Character.ActiveCharacterJobData.Job == JobId.Fighter;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.Fighter, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.FighterTacticsTrialBreakAttack));
}
protected override void InitializeRewards()
@ -40,12 +39,12 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.Fighter)
.AddCheckCmdIsTutorialQuestClear(QuestId.FighterTacticsTrialBreakAttack);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14011);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.GrittenFort0, NpcId.Vanessa0, 14014);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.GrittenFort0)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.GrittenFort0, NpcId.Vanessa0, 14014)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14013);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.FighterJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Seeker
* @brief Seeking the Master: Seeker
*/
#load "libs.csx"
@ -11,20 +11,19 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.SeekerTacticsTrialAWhirlwind) &&
return client.Character.AreaRanks[QuestAreaId.DoweValley].Rank == 5 &&
client.Character.ActiveCharacterJobData.Job == JobId.Seeker;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.Seeker, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.SeekerTacticsTrialAWhirlwind));
AddQuestOrderCondition(QuestOrderCondition.HasAreaRank(QuestAreaId.DoweValley, 5));
}
protected override void InitializeRewards()
@ -41,12 +40,13 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.Seeker)
.AddCheckCmdIsTutorialQuestClear(QuestId.SeekerTacticsTrialAWhirlwind);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18)
.AddCheckCmdCheckAreaRank(QuestAreaId.DoweValley, 5);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14025);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.LoneHouseintheValley, NpcId.Chester0, 14027);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.LoneHouseintheValley)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.LoneHouseintheValley, NpcId.Chester0, 14027)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14026);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.SeekerJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Hunter
* @brief Seeking the Master: Hunter
*/
#load "libs.csx"
@ -11,16 +11,11 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.HunterTacticsTrialBreakAttack) &&
client.Character.ActiveCharacterJobData.Job == JobId.Hunter;
}
public override bool AcceptRequirementsMet(GameClient client)
{
return client.Character.ActiveCharacterJobData.Job == JobId.Hunter;
}
@ -28,7 +23,6 @@ public class ScriptedQuest : IQuest
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.Hunter, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.HunterTacticsTrialBreakAttack));
}
protected override void InitializeRewards()
@ -45,12 +39,12 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.Hunter)
.AddCheckCmdIsTutorialQuestClear(QuestId.HunterTacticsTrialBreakAttack);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14018);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.IvansLodge, NpcId.Ivan, 14020);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.IvansLodge)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.IvansLodge, NpcId.Ivan, 14020)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14019);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.HunterJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Priest
* @brief Seeking the Master: Priest
*/
#load "libs.csx"
@ -11,16 +11,11 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.PriestTacticsTrialBreakAttack) &&
client.Character.ActiveCharacterJobData.Job == JobId.Priest;
}
public override bool AcceptRequirementsMet(GameClient client)
{
return client.Character.ActiveCharacterJobData.Job == JobId.Priest;
}
@ -28,7 +23,6 @@ public class ScriptedQuest : IQuest
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.Priest, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.PriestTacticsTrialBreakAttack));
}
protected override void InitializeRewards()
@ -45,12 +39,12 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.Priest)
.AddCheckCmdIsTutorialQuestClear(QuestId.PriestTacticsTrialBreakAttack);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14015);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.PawnCathedral, NpcId.Camus, 14017);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.PawnCathedral)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.PawnCathedral, NpcId.Camus, 14017)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14016);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.PriestJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Shield Sage
* @brief Seeking the Master: Shield Sage
*/
#load "libs.csx"
@ -11,19 +11,18 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.ShieldSageTacticsTrialBreakAttack) &&
client.Character.ActiveCharacterJobData.Job == JobId.ShieldSage;
return client.Character.ActiveCharacterJobData.Job == JobId.ShieldSage;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.ShieldSage, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.ShieldSageTacticsTrialBreakAttack));
}
protected override void InitializeRewards()
@ -40,12 +39,12 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.ShieldSage)
.AddCheckCmdIsTutorialQuestClear(QuestId.ShieldSageTacticsTrialBreakAttack);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14022);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.LighthouseKeepersHouse, NpcId.Rudolfo, 14024);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.LighthouseKeepersHouse)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.LighthouseKeepersHouse, NpcId.Rudolfo, 14024)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14023);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.ShieldSageJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Sorcerer
* @brief Seeking the Master: Sorcerer
*/
#load "libs.csx"
@ -11,20 +11,19 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.SorcerTacticsTrialAMagickAttack) &&
return client.Character.AreaRanks[QuestAreaId.MysreeForest].Rank == 5 &&
client.Character.ActiveCharacterJobData.Job == JobId.Sorcerer;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.Sorcerer, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.SorcerTacticsTrialAMagickAttack));
AddQuestOrderCondition(QuestOrderCondition.HasAreaRank(QuestAreaId.MysreeForest, 5));
}
protected override void InitializeRewards()
@ -41,12 +40,13 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.Sorcerer)
.AddCheckCmdIsTutorialQuestClear(QuestId.SorcerTacticsTrialAMagickAttack);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18)
.AddCheckCmdCheckAreaRank(QuestAreaId.MysreeForest, 5);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14028);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.LoneHouseintheForest, NpcId.Emerada0, 14030);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.LoneHouseintheForest)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.LoneHouseintheForest, NpcId.Emerada0, 14030)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14029);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.SorcererJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Warrior
* @brief Seeking the Master: Warrior
*/
#load "libs.csx"
@ -11,20 +11,19 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.WarriorTacticsTrialAStrongSword) &&
return client.Character.AreaRanks[QuestAreaId.EasternZandora].Rank == 3 &&
client.Character.ActiveCharacterJobData.Job == JobId.Warrior;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.Warrior, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.WarriorTacticsTrialAStrongSword));
AddQuestOrderCondition(QuestOrderCondition.HasAreaRank(QuestAreaId.EasternZandora, 3));
}
protected override void InitializeRewards()
@ -41,12 +40,13 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.Warrior)
.AddCheckCmdIsTutorialQuestClear(QuestId.WarriorTacticsTrialAStrongSword);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18)
.AddCheckCmdCheckAreaRank(QuestAreaId.EasternZandora, 3);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14034);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.OswaldsArmorShop, NpcId.Oliver, 14036);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.OswaldsArmorShop)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.OswaldsArmorShop, NpcId.Oliver, 14036)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14035);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.WarriorJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Element Archer
* @brief Seeking the Master: Element Archer
*/
#load "libs.csx"
@ -11,20 +11,19 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.ElementArcherTacticsTrialAMagickBow) &&
return client.Character.AreaRanks[QuestAreaId.DeenanWoods].Rank == 5 &&
client.Character.ActiveCharacterJobData.Job == JobId.ElementArcher;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.ElementArcher, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.ElementArcherTacticsTrialAMagickBow));
AddQuestOrderCondition(QuestOrderCondition.HasAreaRank(QuestAreaId.DeenanWoods, 5));
}
protected override void InitializeRewards()
@ -41,12 +40,13 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.ElementArcher)
.AddCheckCmdIsTutorialQuestClear(QuestId.ElementArcherTacticsTrialAMagickBow);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18)
.AddCheckCmdCheckAreaRank(QuestAreaId.DeenanWoods, 5);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14031);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.SecretBowmakersHome, NpcId.Ringdeel0, 14033);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.SecretBowmakersHome)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.SecretBowmakersHome, NpcId.Ringdeel0, 14033)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14032);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.ElementArcherJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Alchemist
* @brief Seeking the Master: Alchemist
*/
#load "libs.csx"
@ -11,20 +11,19 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.AlchemistTacticsTrialAlchemy) &&
return client.Character.AreaRanks[QuestAreaId.MergodaRuins].Rank == 6 &&
client.Character.ActiveCharacterJobData.Job == JobId.Alchemist;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.Alchemist, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.AlchemistTacticsTrialAlchemy));
AddQuestOrderCondition(QuestOrderCondition.HasAreaRank(QuestAreaId.MergodaRuins, 6));
}
protected override void InitializeRewards()
@ -41,12 +40,13 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.Alchemist)
.AddCheckCmdIsTutorialQuestClear(QuestId.AlchemistTacticsTrialAlchemy);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18)
.AddCheckCmdCheckAreaRank(QuestAreaId.MergodaRuins, 6);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 14037);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.TheodorsAlchemyWorkshop, NpcId.Theodor, 14039);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.TheodorsAlchemyWorkshop)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.TheodorsAlchemyWorkshop, NpcId.Theodor, 14039)
.AddResultCmdQstTalkChg(NpcId.Renton0, 14038);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.AlchemistJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -1,5 +1,5 @@
/**
* @brief Seeking the Master Spirit Lancer
* @brief Seeking the Master: Spirit Lancer
*/
#load "libs.csx"
@ -11,19 +11,18 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 18;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.DanaCentrum;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
public override bool ShowInAdventureGuide(GameClient client)
{
return client.Character.HasQuestCompleted(QuestId.SpiritLancerTacticsTrialASpiritLance) &&
client.Character.ActiveCharacterJobData.Job == JobId.SpiritLancer;
return client.Character.ActiveCharacterJobData.Job == JobId.SpiritLancer;
}
protected override void InitializeState()
{
AddQuestOrderCondition(QuestOrderCondition.MinimumVocationLevel(JobId.SpiritLancer, 18));
AddQuestOrderCondition(QuestOrderCondition.PersonalQuestCleared(QuestId.SpiritLancerTacticsTrialASpiritLance));
}
protected override void InitializeRewards()
@ -40,12 +39,12 @@ public class ScriptedQuest : IQuest
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdPlJobEq(JobId.SpiritLancer)
.AddCheckCmdIsTutorialQuestClear(QuestId.SpiritLancerTacticsTrialASpiritLance);
.AddCheckCmdJobLevelNotLess(QuestLevelCheckType.Current, 18);
process0.AddNpcTalkAndOrderBlock(Stage.DanaCentrum, NpcId.Razanailt, 19699);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.SpiritArtsHut, NpcId.AdairDonnchadh0, 19701);
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.SpiritArtsHut)
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.SpiritArtsHut, NpcId.AdairDonnchadh0, 19701)
.AddResultCmdQstTalkChg(NpcId.Razanailt, 19700);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.SpiritLancerJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

View file

@ -11,6 +11,7 @@ public class ScriptedQuest : IQuest
public override ushort RecommendedLevel => 10;
public override byte MinimumItemRank => 0;
public override bool IsDiscoverable => true;
public override bool? EnableCancel => true;
public override StageInfo StageInfo => Stage.TheWhiteDragonTemple0;
public override QuestAdventureGuideCategory? AdventureGuideCategory => QuestAdventureGuideCategory.VocationQuest;
@ -19,12 +20,12 @@ public class ScriptedQuest : IQuest
// st0503
public const uint Barris0 = 7411;
public const uint Barris1 = 7735;
}
private class EnemyGroupId
{
public const uint Encounter = 10;
public const uint Set7413 = 7413;
public const uint Set7414 = 7414;
}
protected override void InitializeState()
@ -43,43 +44,51 @@ public class ScriptedQuest : IQuest
protected override void InitializeEnemyGroups()
{
AddEnemies(EnemyGroupId.Encounter + 0, Stage.SmallCaveTombs, 1, QuestEnemyPlacementType.Manual, new()
AddEnemies(EnemyGroupId.Set7413, Stage.SmallCaveTombs, 1, QuestEnemyPlacementType.Manual, new()
{
LibDdon.Enemy.CreateAuto(EnemyId.WarriorUndead, 10, 0),
LibDdon.Enemy.CreateAuto(EnemyId.UndeadMale, 10, 1),
LibDdon.Enemy.CreateAuto(EnemyId.WarriorUndead, 10, 2),
LibDdon.Enemy.CreateAuto(EnemyId.UndeadMale, 10, 3),
LibDdon.Enemy.CreateAuto(EnemyId.WarriorUndead, 10, 4),
LibDdon.Enemy.Create(EnemyId.WarriorUndead, 10, 88, 0),
LibDdon.Enemy.Create(EnemyId.UndeadMale, 10, 44, 1),
LibDdon.Enemy.Create(EnemyId.WarriorUndead, 10, 88, 2),
LibDdon.Enemy.Create(EnemyId.UndeadMale, 10, 44, 3),
LibDdon.Enemy.Create(EnemyId.WarriorUndead, 10, 88, 4),
});
AddEnemies(EnemyGroupId.Encounter + 1, Stage.SmallCaveTombs, 1, QuestEnemyPlacementType.Manual, new()
AddEnemies(EnemyGroupId.Set7414, Stage.SmallCaveTombs, 1, QuestEnemyPlacementType.Manual, new()
{
LibDdon.Enemy.CreateAuto(EnemyId.WarriorUndead, 10, 5),
LibDdon.Enemy.CreateAuto(EnemyId.SwordUndead, 15, 6),
LibDdon.Enemy.CreateAuto(EnemyId.SwordUndead, 15, 7),
LibDdon.Enemy.CreateAuto(EnemyId.SwordUndead, 15, 8),
LibDdon.Enemy.CreateAuto(EnemyId.WarriorUndead, 15, 9),
LibDdon.Enemy.Create(EnemyId.SwordUndead, 10, 60, 0),
LibDdon.Enemy.Create(EnemyId.WarriorUndead, 10, 88, 1),
LibDdon.Enemy.Create(EnemyId.SwordUndead, 10, 60, 2),
LibDdon.Enemy.Create(EnemyId.WarriorUndead, 10, 88, 3),
LibDdon.Enemy.Create(EnemyId.SwordUndead, 10, 60, 4),
});
}
protected override void InitializeBlocks()
{
var process0 = AddNewProcess(0);
process0.AddRawBlock(QuestAnnounceType.None)
.AddCheckCmdIsMainQuestClear(QuestId.TheSlumberingGod);
process0.AddNpcTalkAndOrderBlock(Stage.TheWhiteDragonTemple0, NpcId.Renton0, 29199);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.CraftRoom, NpcId.Craig0, 27144); // Hear what Craig has to say in the Craft Room
process0.AddIsStageNoBlock(QuestAnnounceType.CheckpointAndUpdate, Stage.SmallCaveTombs); // Head to "Small Cave Tombs" and stand-in for Craig
process0.AddDiscoverGroupBlock(QuestAnnounceType.CheckpointAndUpdate, EnemyGroupId.Encounter + 0); // Investigate a mysterious person
process0.AddDestroyGroupBlock(QuestAnnounceType.Update, EnemyGroupId.Encounter + 0, false); // Defeat the enemy encountered
process0.AddDestroyGroupBlock(QuestAnnounceType.None, EnemyGroupId.Encounter + 1)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.Barris0);
process0.AddTalkToNpcBlock(QuestAnnounceType.Accept, Stage.CraftRoom, NpcId.Craig0, 27144) // Hear what Craig has to say in the Craft Room
.AddResultCmdQstTalkChg(NpcId.Renton0, 29200);
process0.AddIsStageNoBlock(QuestAnnounceType.CheckpointAndUpdate, Stage.SmallCaveTombs) // Head to "Small Cave Tombs" and stand-in for Craig
.AddResultCmdQstTalkChg(NpcId.Craig0, 27145);
process0.AddDiscoverGroupBlock(QuestAnnounceType.CheckpointAndUpdate, EnemyGroupId.Set7413); // Investigate a mysterious person
process0.AddDestroyGroupBlock(QuestAnnounceType.Update, EnemyGroupId.Set7413, false); // Defeat the enemy encountered
process0.AddDestroyGroupBlock(QuestAnnounceType.None, EnemyGroupId.Set7414)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.Barris0)
.AddResultCmdPlayMessage(29145, 10)
.AddResultCmdPlayMessage(29146, 10)
.AddResultCmdPlayMessage(29147, 10);
process0.AddNewTalkToNpcBlock(QuestAnnounceType.CheckpointAndUpdate, Stage.SmallCaveTombs, 1, 0, NpcId.Barris, 29148) // Speak to the person who assisted
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Clear, QstLayoutFlag.Barris0)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.Barris1);
process0.AddTalkToNpcBlock(QuestAnnounceType.CheckpointAndUpdate, Stage.CraftRoom, NpcId.Craig0, 27146); // Return to the Craft Room and report to Craig
process0.AddIsStageNoBlock(QuestAnnounceType.None, Stage.CraftRoom, false)
.AddQuestFlag(QuestFlagType.QstLayout, QuestFlagAction.Set, QstLayoutFlag.Barris1)
.AddResultCmdStopMessage();
process0.AddTalkToNpcBlock(QuestAnnounceType.CheckpointAndUpdate, Stage.CraftRoom, NpcId.Craig0, 27146) // Return to the Craft Room and report to Craig
.AddResultCmdQstTalkChg(NpcId.Barris, 29149);
process0.AddProcessEndBlock(true)
.AddResultCmdReleaseAnnounce(ContentsRelease.ChangetoHighScepter, TutorialId.BasicTacticsHighScepter)
.AddResultCmdReleaseAnnounce(ContentsRelease.HighScepterJobTraining, TutorialId.JobTrainingLog);
process0.AddProcessEndBlock(true);
}
}

File diff suppressed because it is too large Load diff

View file

@ -46,7 +46,7 @@
"comment": "Hidden Beach Rogue (Fighter)",
"enemy_id": "0x011000",
"level": 11,
"exp": 55,
"exp": 62,
"named_enemy_params_id": 195,
"hm_present_no": 45
},
@ -54,7 +54,7 @@
"comment": "Hidden Beach Rogue (Seeker)",
"enemy_id": "0x011001",
"level": 11,
"exp": 55,
"exp": 62,
"named_enemy_params_id": 195,
"hm_present_no": 46
},
@ -62,7 +62,7 @@
"comment": "Hidden Beach Rogue (Hunter)",
"enemy_id": "0x011002",
"level": 11,
"exp": 55,
"exp": 62,
"named_enemy_params_id": 195,
"hm_present_no": 47
},
@ -70,7 +70,7 @@
"comment": "Hidden Beach Rogue (Mage)",
"enemy_id": "0x011005",
"level": 11,
"exp": 55,
"exp": 62,
"named_enemy_params_id": 195,
"hm_present_no": 50
}

View file

@ -33,8 +33,9 @@
{
"stage_id": {
"id": 1,
"group_id": 146
"group_id": 138
},
"starting_index": 2,
"enemies": [
{
"comment": "Jotun the Returned (Mole Troll)",
@ -42,7 +43,7 @@
"level": 43,
"is_boss": true,
"named_enemy_params_id": 232,
"exp_scheme": "automatic"
"exp": 4080
}
]
}

View file

@ -43,7 +43,7 @@
"level": 70,
"is_boss": true,
"named_enemy_params_id": 901,
"exp_scheme": "automatic"
"exp": 6840
}
]
}

View file

@ -2,7 +2,7 @@ namespace Arrowgene.Ddon.Shared.Model.Quest
{
public enum QuestLevelCheckType : uint
{
Party = 0,
Player = 1,
Any = 0,
Current = 1,
}
}