Kill counters:
An extremely useful set of script from the main campaign is the kill counter. This let's you easily set flags, databases, resolve quests and other actions when a battle is finished.
You can also use it for simple quests like "kill 10 skeletons".
It's also a great way to handle long chains of scripted sequenced combats.

Begin by adding script like this to your mod:

[Linked Image]

This defines the kill counter by name and sets an integer count for how many kills will cause a reaction.

In a quest where you need to kill 10 skeletons you can have exactly 10 skeletons you want the player to kill and have 10 entries in the database.

Or if you just want the player to kill just any 10 skeletons, add more than 10 skeletons to the DB. That way you can leave it up to the player which fights impact the counter.

The Script:

//INIT:
KillCounter("KillCounterNameHere",4);
KillCounterDB(CHARACTER_Enemy1,"KillCounterNameHere");
KillCounterDB(CHARACTER_Enemy2,"KillCounterNameHere");
KillCounterDB(CHARACTER_Enemy3,"KillCounterNameHere");
KillCounterDB(CHARACTER_Enemy4,"KillCounterNameHere");

//KB:
PROC
ReactOnKillCounter("KillCounterNameHere")
THEN
QuestUpdate("KillEnemies","Update2");
GlobalSetEvent("EnemiesDead");


The script above will work if you already are using the Standalone Project Template.

If you are not using the template you can add the script yourself as seen here:
Code from the Larian file "Global_Procedure":

PROC
CheckCounter((INTEGER)_Count,(STRING)_CounterDB)
AND
KillCounterCounts(_CounterDB,_OldCount)
THEN
NOT KillCounterCounts(_CounterDB,_OldCount);
KillCounterCounts(_CounterDB,_Count);

PROC
ClearCounterDB((STRING)_CounterDB)
AND
KillCounterDB(_Character,_CounterDB)
THEN
NOT KillCounterDB(_Character,_CounterDB);

PROC
ClearCounterDB((STRING)_CounterDB)
AND
KillCounterTestDB(_Char,_CounterDB)
THEN
NOT KillCounterTestDB(_Char,_CounterDB);

PROC
CheckCounter(_Count,_CounterDB)
AND
KillCounter((STRING)_CounterDB,(INTEGER)_TargetCount)
AND
_Count == _TargetCount
THEN
NOT KillCounter(_CounterDB,_TargetCount);
ClearCounterDB(_CounterDB);
KillCounterReached(_CounterDB);
NOT KillCounterCounterDefined(_CounterDB);
NOT KillCounterCounts(_CounterDB,_TargetCount);

PROC
CheckCounter(_Count, _CounterDB)
AND
KillCounter((STRING)_CounterDB,(INTEGER)_TargetCount)
AND
IntegerSubtract(_TargetCount, 1, _New)
AND
_Count == _New
AND
KillCounterDB(_LastCharacter, _CounterDB)
THEN
LastManStandingDB((CHARACTER)_LastCharacter, (STRING)_CounterDB);

IF
CharacterDying(_Character)
AND
KillCounterDB(_Character,_CounterDB)
AND
dbCombat(_Character,_ID)
THEN
ProcSetCounterCombatID(_CounterDB,_ID);
ProcCheckCounterCombatOver(_CounterDB,_ID);

PROC
ProcClearCounterCombatID((STRING)_Counter)
AND
DB_CounterCombatID(_Counter,_OldID)
THEN
NOT DB_CounterCombatID(_Counter,_OldID);
PROC
ProcSetCounterCombatID((STRING)_Counter,(INTEGER)_ID)
THEN
ProcClearCounterCombatID(_Counter);
DB_CounterCombatID(_Counter,_ID);

IF
CharacterEnteredCombat(_Char, _ID)
AND
KillCounterDB(_Char, _Counter)
THEN
ProcClearCounterCombatID(_Counter);

IF
CharacterEnteredCombat(_LastMan, _ID)
AND
KillCounterDB(_LastMan, _Counter)
AND
KillCounter(_Counter,1)
THEN
LastManStandingDB((CHARACTER)_LastMan, (STRING)_Counter);

IF
CharacterKilledByCharacter(_LastMan, _Killer)
AND
LastManStandingDB(_LastMan, _CounterDB)
THEN
NOT LastManStandingDB(_LastMan, _CounterDB);
LastManInCombatKilledBy((CHARACTER)_Killer, (STRING)_CounterDB);

IF
CharacterDied(_Character)
AND
KillCounterDB(_Character,_CounterDB)
AND
KillCounterCounts(_CounterDB,_Count)
AND
IntegerSum(_Count,1,_NewCount)
THEN
NOT KillCounterDB(_Character,_CounterDB);
KillCounterTestDB(_Character,_CounterDB);
CheckCounter(_NewCount,_CounterDB);

IF
CharacterResurrected(_Character)
AND
KillCounterTestDB(_Character,_CounterDB)
AND
KillCounterCounts(_CounterDB,_Count)
AND
IntegerSubtract(_Count,1,_NewCount)
THEN
KillCounterDB(_Character,_CounterDB);
NOT KillCounterTestDB(_Character,_CounterDB);
CheckCounter(_NewCount,_CounterDB);

IF
KillCounterDB(_Character,_CounterDB)
AND
NOT KillCounterCounterDefined(_CounterDB)
THEN
KillCounterCounts(_CounterDB,0);
KillCounterCounterDefined(_CounterDB);

IF
CharacterLeftCombat(_Player, _CombatID)
AND
_Player.isPlayer()
AND
CombatGetNumberOfInvolvedPartyMembers(_CombatID, 0)
AND
DB_CounterCombatID(_CounterDB,_CombatID)
THEN
KillCounterCombatOver(_CombatID, _CounterDB);

IF
dbCombat(_Char, _CombatID)
AND
KillCounterDB(_Char,_CounterDB)
THEN
ProcClearCombatOverDB(_CounterDB);

PROC
ProcClearCombatOverDB((STRING)_CounterDB)
AND
KillCounterCombatOver(_OldCombatID, _CounterDB)
THEN
NOT KillCounterCombatOver(_OldCombatID, _CounterDB);

//killed people outside of combat
IF
KillCounterReached((STRING)_CounterDB)
AND
NOT DB_CounterCombatID(_CounterDB,_)
THEN
ReactOnKillCounter(_CounterDB);
NOT KillCounterReached(_CounterDB);

IF
KillCounterReached((STRING)_CounterDB)
AND
KillCounterCombatOver(_CombatID, _CounterDB)
THEN
ReactOnKillCounter(_CounterDB);
NOT KillCounterCombatOver(_CombatID, _CounterDB);
NOT KillCounterReached(_CounterDB);

//Wasn't involved in combat
PROC
ProcCheckCounterCombatOver((STRING)_CounterDB,(INTEGER)_CombatID)
THEN
NOT KillCounterCombatOver(_CombatID, _CounterDB);

PROC
ProcCheckCounterCombatOver((STRING)_CounterDB,(INTEGER)_CombatID)
AND
CombatGetNumberOfInvolvedPartyMembers(_CombatID, 0)
THEN
KillCounterCombatOver(_CombatID, _CounterDB);


I would recommend putting it in a separate goal file from your own modding.