|
|
|
|
|
PlaceObj('ZuluModuleDef', { |
|
DefAlwaysAddInstances = true, |
|
DefEditorMenubar = "Combat", |
|
DefEditorName = "Combat Tasks", |
|
DefGlobalMap = "CombatTaskDefs", |
|
DefOwnerMember = "combatTasks", |
|
DefParentClassList = { |
|
"ModulePreset", |
|
"TODOPreset", |
|
"MsgReactionsPreset", |
|
}, |
|
id = "CombatTask", |
|
PlaceObj('PropertyDefText', { |
|
'category', "Display", |
|
'id', "name", |
|
'name', "Name", |
|
'default', T(635036510295, "Combat Task"), |
|
}), |
|
PlaceObj('PropertyDefText', { |
|
'category', "Display", |
|
'id', "description", |
|
'name', "Description", |
|
}), |
|
PlaceObj('PropertyDefNumber', { |
|
'category', "Rewards", |
|
'id', "xpReward", |
|
'name', "XP Reward", |
|
'default', 300, |
|
}), |
|
PlaceObj('PropertyDefStringList', { |
|
'category', "Rewards", |
|
'id', "statGainRolls", |
|
'name', "Related Stats", |
|
'help', "Trigger rolls for Stat Gaining for the selected Stats on Task completion.", |
|
'item_default', "Wisdom", |
|
'items', function (self) return GetUnitStatsCombo() end, |
|
}), |
|
PlaceObj('PropertyDefNestedList', { |
|
'category', "CombatTask", |
|
'id', "selectionConditions", |
|
'name', "Selection Conditions", |
|
'help', "Explicitly specified", |
|
'base_class', "Condition", |
|
}), |
|
PlaceObj('PropertyDefNestedList', { |
|
'category', "CombatTask", |
|
'id', "favouredConditions", |
|
'name', "Favoured Conditions", |
|
'help', "Explicitly specified", |
|
'base_class', "Condition", |
|
}), |
|
PlaceObj('PropertyDefNumber', { |
|
'category', "CombatTask", |
|
'id', "requiredProgress", |
|
'name', "Required Progress", |
|
'help', "Amount of things you need to do.", |
|
'default', 1, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "CombatTask", |
|
'id', "hideProgress", |
|
'name', "Hide Progress", |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "CombatTask", |
|
'id', "holdUntilEnd", |
|
'name', "Hold until Conflict* End", |
|
'help', "End is when all non animal enemies have died.", |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "CombatTask", |
|
'id', "reverseProgress", |
|
'name', "Reverse Progress", |
|
'help', "If enabled currentProgress must not reach the requiredProgress instead.", |
|
}), |
|
PlaceObj('PropertyDefNumber', { |
|
'category', "CombatTask", |
|
'id', "cooldown", |
|
'name', "Cooldown", |
|
'help', "How much to wait (in SatView time) to be able to select the task again.", |
|
'default', 432000, |
|
'scale', "day", |
|
'min', 0, |
|
'max', 8640000, |
|
}), |
|
PlaceObj('PropertyDefBool', { |
|
'category', "CombatTask", |
|
'id', "competition", |
|
'name', "Competition", |
|
'help', "Puts the merc in a race against one of his Liked/Disliked", |
|
}), |
|
PlaceObj('PropertyDefButtons', { |
|
'category', "CombatTask", |
|
'id', "buttonGiveCombatTask", |
|
'buttons', { |
|
PlaceObj('PropertyDefPropButton', { |
|
'Name', "Give Combat Task", |
|
'FuncName', "GiveCombatTaskEditor", |
|
}), |
|
}, |
|
'template', true, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GiveCombatTaskEditor", |
|
'params', "root, prop_id, ged", |
|
'code', function (self, root, prop_id, ged) |
|
if gv_SatelliteView then return end |
|
if not IsKindOf(SelectedObj, "Unit") then return end |
|
GiveCombatTask(self, SelectedObj.session_id) |
|
end, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "currentProgress", |
|
'type', "number", |
|
'value', 0, |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "state", |
|
'type', "text", |
|
'value', "inProgress", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "additionalData", |
|
'type', "prop_table", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "unitId", |
|
'type', "text", |
|
}), |
|
PlaceObj('ClassConstDef', { |
|
'name', "otherUnitId", |
|
'type', "text", |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "CanBeSelected", |
|
'params', "unit", |
|
'code', function (self, unit) |
|
if self.competition then |
|
local hasOpponent = false |
|
local units = GetCurrentMapUnits() |
|
for _, u in ipairs(units) do |
|
if table.find(unit.Likes, u.session_id) or table.find(unit.Dislikes, u.session_id) then |
|
hasOpponent = true |
|
break |
|
end |
|
end |
|
if not hasOpponent then |
|
return false |
|
end |
|
end |
|
|
|
if not self.selectionConditions or #self.selectionConditions <= 0 then return true end |
|
return EvalConditionList(self.selectionConditions, self, {target_units = { unit }, no_log = true}) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "IsFavoured", |
|
'params', "unit", |
|
'code', function (self, unit) |
|
for _, stat in ipairs(self.statGainRolls) do |
|
if unit[stat] >= 70 then |
|
return true |
|
end |
|
end |
|
|
|
if self.favouredConditions and #self.favouredConditions > 0 then |
|
return EvalConditionList(self.favouredConditions, self, {target_units = { unit }, no_log = true}) |
|
end |
|
|
|
return false |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "OnAdd", |
|
'params', "owner, ...", |
|
'code', function (self, owner, ...) |
|
if not self.unitId or self.unitId == "" then |
|
self.unitId = owner.session_id |
|
|
|
if self.competition then |
|
local unit = g_Units[self.unitId] |
|
local ids = {} |
|
local units = GetCurrentMapUnits() |
|
for _, u in ipairs(units) do |
|
if table.find(unit.Likes, u.session_id) or table.find(unit.Dislikes, u.session_id) then |
|
ids[#ids+1] = u.session_id |
|
end |
|
end |
|
|
|
self.otherUnitId = ids[InteractionRand(#ids, "CombatTask")+1] |
|
end |
|
end |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "Finish", |
|
'code', function (self) |
|
ObjModified(self) |
|
local unit = g_Units[self.unitId] |
|
|
|
Msg("CombatTaskFinished", self.id, unit, self.state == "completed") |
|
|
|
CombatTaskUIAnimations[self] = {} |
|
CombatTaskUIAnimations[self].startTime = GetPreciseTicks() |
|
CombatTaskUIAnimations[self].thread = CreateRealTimeThread(function() |
|
if not (g_Teams[g_CurrentTeam].control == "UI") then |
|
WaitMsg("TurnEnded") |
|
end |
|
|
|
local igi = GetInGameInterfaceModeDlg() |
|
if IsKindOf(igi, "IModeCommonUnitControl") then |
|
local combatTasks = igi:ResolveId("idCombatTasks") |
|
for _, taskUI in ipairs(combatTasks) do |
|
if taskUI.context == self then |
|
taskUI:Animate() |
|
Sleep(taskUI.animPulseDuration + taskUI.animHideDuration) |
|
break |
|
end |
|
end |
|
end |
|
|
|
if unit then unit:RemoveCombatTask(self) end |
|
RefreshCombatTasks() |
|
end) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "Complete", |
|
'code', function (self) |
|
if self.state ~= "inProgress" then return end |
|
|
|
local unit = g_Units[self.unitId] |
|
if unit then |
|
RewardTeamExperience({ RewardExperience = self.xpReward }, { units = {unit}}) |
|
|
|
for _, stat in ipairs(self.statGainRolls) do |
|
RollForStatGaining(unit, stat) |
|
end |
|
|
|
PlayVoiceResponse(unit, "CombatTaskCompleted") |
|
end |
|
|
|
self.state = "completed" |
|
self:Finish() |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "Fail", |
|
'code', function (self) |
|
if self.state ~= "inProgress" then return end |
|
|
|
local unit = g_Units[self.unitId] |
|
if unit then |
|
PlayVoiceResponse(unit, "CombatTaskFailed") |
|
end |
|
|
|
self.state = "failed" |
|
self:Finish() |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "Update", |
|
'params', "progress, otherProgress", |
|
'code', function (self, progress, otherProgress) |
|
if self.state ~= "inProgress" then return end |
|
|
|
if self.competition then |
|
self.currentProgress = self.currentProgress + (progress or 0) |
|
self.requiredProgress = self.requiredProgress + (otherProgress or 0) |
|
else |
|
self.currentProgress = Clamp(self.currentProgress + progress, 0, self.requiredProgress) |
|
end |
|
|
|
if self.currentProgress >= self.requiredProgress then |
|
if not self.holdUntilEnd then |
|
if self.reverseProgress then |
|
self:Fail() |
|
else |
|
self:Complete() |
|
end |
|
end |
|
end |
|
|
|
ObjModified(self) |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "ShouldSave", |
|
'code', function (self) |
|
return self.state == "inProgress" |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "GetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
data.currentProgress = self.currentProgress |
|
data.state = self.state |
|
data.additionalData = self.additionalData |
|
data.unitId = self.unitId |
|
data.otherUnitId = self.otherUnitId |
|
end, |
|
}), |
|
PlaceObj('ClassMethodDef', { |
|
'name', "SetDynamicData", |
|
'params', "data", |
|
'code', function (self, data) |
|
self.currentProgress = data.currentProgress |
|
self.state = data.state |
|
self.additionalData = data.additionalData |
|
self.unitId = data.unitId |
|
self.otherUnitId = data.otherUnitId |
|
end, |
|
}), |
|
}) |
|
|
|
|