-- ========== GENERATED BY ClassDef Editor (Ctrl-Alt-F3) DO NOT EDIT MANUALLY! ========== PlaceObj('ClassDef', { group = "Inventory", id = "AmmoProperties", PlaceObj('PropertyDefCombo', { 'category', "Caliber", 'id', "Caliber", 'template', true, 'items', function (self) return PresetGroupCombo("Caliber", "Default") end, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "MaxStacks", 'name', "Max Stacks", 'help', "Ammo can stack up to that number.", 'template', true, 'default', 10, 'slider', true, 'min', 1, 'max', 10000, }), PlaceObj('PropertyDefNestedList', { 'id', "Modifications", 'template', true, 'base_class', "CaliberModification", 'inclusive', true, }), PlaceObj('PropertyDefPresetIdList', { 'category', "Combat", 'id', "AppliedEffects", 'name', "Applied Effects", 'template', true, 'preset_class', "CharacterEffectCompositeDef", 'preset_group', "Default", }), PlaceObj('PropertyDefUIImage', { 'category', "General", 'id', "ammo_type_icon", 'name', "Ammo Type Icon", 'help', "Ammo type icon", 'template', true, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", }, group = "Inventory", id = "ArmorProperties", PlaceObj('PropertyDefCombo', { 'id', "Slot", 'template', true, 'default', "Torso", 'items', function (self) return {"Head", "Torso", "Legs"} end, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "PenetrationClass", 'help', "", 'template', true, 'extra_code', 'name = function(self) return "Penetration Class: " .. (PenetrationClassIds[self.PenetrationClass] or "") end', 'default', 1, 'slider', true, 'min', 1, 'max', 5, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "DamageReduction", 'name', "Damage Reduction (Base)", 'help', "How much damage the armor absorbs when the attack lands in an area covered by the armor.", 'template', true, 'default', 10, 'scale', "%", 'slider', true, 'min', 0, 'max', 100, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "AdditionalReduction", 'name', "Damage Reduction (Additional)", 'help', "Additional damage reduction applied when the effective Penetration Class of the attack is lower than the Penetration Class of the armor protecting the hit body part.", 'template', true, 'default', 10, 'scale', "%", 'slider', true, 'min', 0, 'max', 100, }), PlaceObj('PropertyDefSet', { 'category', "Combat", 'id', "ProtectedBodyParts", 'name', "Protected Body Parts", 'template', true, 'items', function (self) return PresetGroupCombo("TargetBodyPart", "Default") end, }), PlaceObj('PropertyDefBool', { 'category', "Combat", 'id', "Camouflage", 'template', true, }), }) PlaceObj('ClassDef', { DefParentClassList = { "BobbyRayShopItemProperties", }, group = "Inventory", id = "BobbyRayShopAmmoProperties", PlaceObj('PropertyDefPresetId', { 'category', "BobbyRayShop", 'id', "CategoryPair", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not self.CanAppearInShop end, 'template', true, 'preset_class', "BobbyRayShopSubCategory", 'preset_group', "Ammo", 'default', "12gauge", }), PlaceObj('ClassMethodDef', { 'name', "GetShopStats", 'params', "stacks", 'code', function (self, stacks) return BobbyRayStoreGetStats_Ammo(self) end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "BobbyRayShopUsedItemProperties", }, group = "Inventory", id = "BobbyRayShopArmorProperties", PlaceObj('PropertyDefPresetId', { 'category', "BobbyRayShop", 'id', "CategoryPair", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not self.CanAppearInShop end, 'template', true, 'preset_class', "BobbyRayShopSubCategory", 'preset_group', "Armor", 'default', "UtilityArmor", }), PlaceObj('ClassMethodDef', { 'name', "GetShopStats", 'params', "stacks", 'code', function (self, stacks) return BobbyRayStoreGetStats_Armor(self) end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopDescription", 'code', function (self) local hasDesc = self.Description and self.Description ~= "" local hasHint = self.AdditionalHint and self.AdditionalHint ~= "" local protectedParts = {} for part,val in sorted_pairs(self.ProtectedBodyParts) do local preset= Presets.TargetBodyPart.Default[part] table.insert(protectedParts, preset.display_name) end local protectedPartsText = "" if #protectedParts > 0 then protectedPartsText = T{378508273050, " Body parts - ", parts = table.concat(protectedParts, ", ")} end --FindPreset("WeaponType", "Armor").Description local text = hasDesc and self.Description or hasHint and self.AdditionalHint or "" return protectedPartsText .. "\n" .. text end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "BobbyRayShopWeaponProperties", }, group = "Inventory", id = "BobbyRayShopFirearmProperties", PlaceObj('ClassMethodDef', { 'name', "GetShopStats", 'params', "stacks", 'code', function (self, stacks) return BobbyRayStoreGetStats_Firearm(self) end, }), PlaceObj('ClassMethodDef', { 'name', "GenerateInventoryEntries", 'params', "stacks", 'code', function (self, stacks) local items = {} if self.Used then local new_item = PlaceInventoryItem(self.class, self) new_item.Condition = self.Condition RestoreCloneWeaponComponents(new_item, self) new_item.Cost = new_item.Cost table.insert(items, new_item) else items = BobbyRayShopItemProperties.GenerateInventoryEntries(self, stacks) end for _, weapon in ipairs(items) do -- make sure all equipped firearms have ammo local ammo = GetAmmosWithCaliber(weapon.Caliber, "sort")[1] if ammo then local tempAmmo = PlaceInventoryItem(ammo.id) tempAmmo.Amount = tempAmmo.MaxStacks weapon:Reload(tempAmmo, "suspend_fx") DoneObject(tempAmmo) end end return items end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopSubIcon", 'code', function (self) return CountWeaponUpgrades(self) > 0 and "UI/Inventory/w_mod" or "" end, }), }) PlaceObj('ClassDef', { group = "Inventory", id = "BobbyRayShopItemProperties", PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "CanAppearInShop", 'template', true, }), PlaceObj('PropertyDefCombo', { 'category', "BobbyRayShop", 'id', "Tier", 'name', "Tier", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not self.CanAppearInShop end, 'template', true, 'default', 1, 'items', function (self) return { 1, 2, 3 } end, }), PlaceObj('PropertyDefNumber', { 'category', "BobbyRayShop", 'id', "MaxStock", 'no_edit', "Tier.no_edit", 'template', true, 'default', 3, 'min', 0, 'max', 99, }), PlaceObj('PropertyDefNumber', { 'category', "BobbyRayShop", 'id', "RestockWeight", 'no_edit', "Tier.no_edit", 'template', true, 'default', 100, 'min', 0, }), PlaceObj('PropertyDefNumber', { 'category', "BobbyRayShop", 'id', "Stock", 'no_edit', true, 'template', true, 'default', 0, 'min', 0, }), PlaceObj('ClassMethodDef', { 'name', "GetShopDescription", 'code', function (self) return (self.Description and self.Description ~= "" and self.Description) or self.AdditionalHint end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopSubIcon", 'code', function (self) return self.SubIcon end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopStats", 'params', "stacks", 'code', function (self, stacks) return {{ Untranslated("(design)"), Untranslated("Not implemented") }} end, }), PlaceObj('ClassMethodDef', { 'name', "GetCategory", 'code', function (self) return BobbyRayShopGetCategory(BobbyRayShopGetSubCategory(self.CategoryPair).Category) end, }), PlaceObj('ClassMethodDef', { 'name', "GetSubCategory", 'code', function (self) return BobbyRayShopGetSubCategory(self.CategoryPair) end, }), PlaceObj('ClassMethodDef', { 'name', "GenerateInventoryEntries", 'params', "stacks", 'code', function (self, stacks) local items = {} if self.MaxStacks then local total_amount = stacks * (self.ShopStackSize or 1) local stacks = DivCeil(total_amount, self.MaxStacks) local remainder = total_amount - (stacks - 1) * self.MaxStacks for i = 1, stacks - 1 do local item = PlaceInventoryItem(self.class, self) item.Amount = item.MaxStacks table.insert(items, item) end local item = PlaceInventoryItem(self.class, self) item.Amount = remainder table.insert(items, item) else for i = 1, stacks do table.insert(items, PlaceInventoryItem(self.class, self)) end end return items end, }), PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "New", 'no_edit', true, }), PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "Seen", 'no_edit', true, }), PlaceObj('PropertyDefNumber', { 'category', "BobbyRayShop", 'id', "LastRestock", 'no_edit', true, 'template', true, 'default', -1, 'min', -1, }), PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "CanBeConsumed", 'no_edit', "Tier.no_edit", 'template', true, 'default', true, }), PlaceObj('PropertyDefPresetId', { 'category', "BobbyRayShop", 'id', "CategoryPair", 'no_edit', "Tier.no_edit", 'template', true, 'preset_class', "BobbyRayShopSubCategory", 'preset_group', "_Missing", 'default', "Missing", }), PlaceObj('PropertyDefNumber', { 'category', "BobbyRayShop", 'id', "ShopStackSize", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not (g_Classes[self.id] and g_Classes[self.id].MaxStacks) or not self.CanAppearInShop end, 'template', true, 'default', 1, 'min', 1, 'max', 99, }), PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "CanAppearStandard", 'read_only', true, 'no_edit', true, 'default', true, }), }) PlaceObj('ClassDef', { DefParentClassList = { "BobbyRayShopWeaponProperties", }, group = "Inventory", id = "BobbyRayShopMeleeWeaponProperties", PlaceObj('ClassMethodDef', { 'name', "GetShopStats", 'params', "stacks", 'code', function (self, stacks) return BobbyRayStoreGetStats_MeleeWeapon(self) end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopSubIcon", 'code', function (self) return self.SubIcon end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "BobbyRayShopItemProperties", }, group = "Inventory", id = "BobbyRayShopOtherProperties", PlaceObj('PropertyDefPresetId', { 'category', "BobbyRayShop", 'id', "CategoryPair", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not self.CanAppearInShop end, 'template', true, 'preset_class', "BobbyRayShopSubCategory", 'preset_group', "Other", 'default', "Other", }), PlaceObj('ClassMethodDef', { 'name', "GetShopDescription", 'code', function (self) return self.AdditionalHint end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopStats", 'params', "stacks", 'code', function (self, stacks) return BobbyRayStoreGetStats_Other(self) end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "BobbyRayShopItemProperties", }, group = "Inventory", id = "BobbyRayShopUsedItemProperties", PlaceObj('ClassMethodDef', { 'name', "GenerateInventoryEntries", 'params', "stacks", 'code', function (self, stacks) if self.Used then local items = {} local new_item = PlaceInventoryItem(self.class, self) new_item.Condition = self.Condition new_item.Cost = new_item.Cost table.insert(items, new_item) return items else return BobbyRayShopItemProperties.GenerateInventoryEntries(self, stacks) end end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopConditionPercent", 'code', function (self) return Untranslated{"", condPercent = self:GetConditionPercent()} end, }), PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "CanAppearUsed", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not self.CanAppearInShop end, 'template', true, 'default', true, }), PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "CanAppearStandard", 'no_edit', "CanAppearUsed.no_edit", 'template', true, 'default', true, }), PlaceObj('PropertyDefBool', { 'category', "BobbyRayShop", 'id', "Used", 'no_edit', true, }), }) PlaceObj('ClassDef', { DefParentClassList = { "BobbyRayShopUsedItemProperties", }, group = "Inventory", id = "BobbyRayShopWeaponProperties", PlaceObj('PropertyDefPresetId', { 'category', "BobbyRayShop", 'id', "CategoryPair", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not self.CanAppearInShop end, 'template', true, 'preset_class', "BobbyRayShopSubCategory", 'preset_group', "Weapons", 'default', "UtilityWeapons", }), PlaceObj('ClassMethodDef', { 'name', "GetShopStats", 'params', "stacks", 'code', function (self, stacks) if self:GetSubCategory().id == "MeleeWeapons" then return BobbyRayStoreGetStats_MeleeWeapon(self) else return BobbyRayStoreGetStats_Firearm(self) end end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopDescription", 'code', function (self) local hasDesc = self.Description and self.Description ~= "" local hasHint = self.AdditionalHint and self.AdditionalHint ~= "" return hasDesc and self.Description or hasHint and self.AdditionalHint or FindPreset("WeaponType", self.WeaponType).Description end, }), PlaceObj('ClassMethodDef', { 'name', "GetShopSubIcon", 'code', function (self) if IsKindOf(self, "Firearm") then return CountWeaponUpgrades(self) > 0 and "UI/Inventory/w_mod" or "" else return BobbyRayShopItemProperties.GetShopSubIcon(self) end end, }), }) PlaceObj('ClassDef', { group = "Inventory", id = "CapacityItemProperties", PlaceObj('PropertyDefNumber', { 'id', "MaxCapacity", 'name', "Max Capacity", 'template', true, 'default', 1000, 'min', 0, 'max', 10000, }), PlaceObj('PropertyDefNumber', { 'id', "capacity", 'name', "", 'no_edit', true, 'template', true, 'min', 0, 'max', 10000, }), PlaceObj('PropertyDefNumber', { 'id', "deplete_progress", 'name', "", 'no_edit', true, 'template', true, 'default', 0, 'min', 0, 'max', 10000, }), PlaceObj('PropertyDefFunc', { 'id', "Deplete", 'dont_save', true, 'no_edit', true, 'params', "self, amount, holder", 'default', function (self, amount, holder) self.capacity = self.capacity or self.MaxCapacity AddScaledProgress(self, "deplete_progress", "capacity", -amount) if self.capacity == 0 then local container_slot_name = GetContainerInventorySlotName(holder) local item = holder:RemoveItem(container_slot_name, self) if item then DoneObject(item) return true end end end, }), PlaceObj('PropertyDefFunc', { 'id', "IsDepleted", 'dont_save', true, 'no_edit', true, 'default', function (self) return (self.capacity or self.MaxCapacity) <= 0 end, }), }) PlaceObj('ClassDef', { group = "Inventory", id = "ExplosiveProperties", PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "CenterUnitDamageMod", 'name', "Unit Damage Modifier (Center)", 'help', "modifier applied to damage when damaging units in the central tile of the explosion", 'template', true, 'default', 100, 'scale', "%", 'min', 0, 'max', 500, }), PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "CenterObjDamageMod", 'name', "Object Damage Modifier (Center)", 'help', "modifier applied to damage when damaging objects in the central tile of the explosion", 'template', true, 'default', 100, 'scale', "%", 'min', 0, 'max', 500, }), PlaceObj('PropertyDefPresetIdList', { 'category', "Explosion", 'id', "CenterAppliedEffects", 'name', "Applied Effects (Center)", 'help', "status effects applied in the central tile of the explosion", 'template', true, 'preset_class', "CharacterEffectCompositeDef", 'preset_group', "Default", }), PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "AreaOfEffect", 'name', "Area of Effect", 'help', "the blast range (radius) in number of tiles", 'template', true, 'default', 3, 'min', 0, 'max', 20, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "CenterAreaOfEffect", 'name', "Central Area of Effect", 'help', "the central blast area radius in number of tiles", 'template', true, 'default', 1, 'min', 1, 'max', 20, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "AreaUnitDamageMod", 'name', "Unit Damage Modifier (Area)", 'help', "modifier applied to damage when damaging units outside the central tile of the explosion", 'template', true, 'default', 100, 'scale', "%", 'min', 0, 'max', 500, }), PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "AreaObjDamageMod", 'name', "Object Damage Modifier (Area)", 'help', "modifier applied to damage when damaging objects outside the central tile of the explosion", 'template', true, 'default', 100, 'scale', "%", 'min', 0, 'max', 500, 'modifiable', true, }), PlaceObj('PropertyDefPresetIdList', { 'category', "Explosion", 'id', "AreaAppliedEffects", 'name', "Applied Effects (Area)", 'help', "status effects applied outside the central tile of the explosion", 'template', true, 'preset_class', "CharacterEffectCompositeDef", 'preset_group', "Default", }), PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "PenetrationClass", 'help', "", 'template', true, 'extra_code', 'name = function(self) return "Penetration Class: " .. (PenetrationClassIds[self.PenetrationClass] or "") end', 'default', 5, 'slider', true, 'min', 1, 'max', 5, 'modifiable', true, }), PlaceObj('PropertyDefBool', { 'category', "Explosion", 'id', "coneShaped", 'name', "Cone Shaped", 'template', true, }), PlaceObj('PropertyDefNumber', { 'category', "Explosion", 'id', "coneAngle", 'name', "Cone Angle", 'help', "The angle of the bigger cone arc", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return not self.coneShaped end, 'template', true, 'default', 30, 'min', 1, 'max', 360, }), PlaceObj('PropertyDefBool', { 'category', "Explosion", 'id', "BurnGround", 'template', true, 'default', true, }), PlaceObj('PropertyDefChoice', { 'category', "Explosion", 'id', "DeathType", 'template', true, 'default', "Normal", 'items', function (self) return {"Normal", "BlowUp"} end, }), PlaceObj('PropertyDefButtons', { 'id', "dbg_explosion_buttons", 'buttons', { PlaceObj('PropertyDefPropButton', { 'Name', "Set Debug Explosion Source", 'FuncName', "DbgSetExplosionType", }), }, 'template', true, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", }, group = "Inventory", id = "FirearmProperties", PlaceObj('PropertyDefCombo', { 'category', "Caliber", 'id', "Caliber", 'template', true, 'items', function (self) return PresetGroupCombo("Caliber", "Default") end, }), PlaceObj('PropertyDefButtons', { 'category', "General", 'id', "btnAddAmmo", 'buttons', { PlaceObj('PropertyDefPropButton', { 'Name', "Add Ammo To Current Unit", 'FuncName', "UIPlaceInInventoryAmmo", }), }, 'template', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "Damage", 'help', "Damage of the firearm", 'template', true, 'default', 0, 'min', 0, 'max', 1000, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "ObjDamageMod", 'name', "Objects damage modifier", 'help', "Multiplicative damage modifier against objects (non-units)", 'template', true, 'default', 100, 'scale', "%", 'min', 0, 'max', 1000, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "AimAccuracy", 'name', "Aim Accuracy", 'help', "Base chance to hit increase per aim action", 'template', true, 'default', 2, 'scale', "%", 'min', 1, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "CritChance", 'name', "Crit Chance", 'help', "Base chance to cause a critical hit which deals more damage.", 'template', true, 'default', 0, 'scale', "%", 'slider', true, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "CritChanceScaled", 'name', "Crit Chance (Scaled)", 'help', "Additional chance to cause a critical hit (scaled by level, specified number is at merc level 10)", 'template', true, 'default', 10, 'scale', "%", 'slider', true, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "MagazineSize", 'name', "Magazine Size", 'help', "Number of bullets in a single clip", 'template', true, 'default', 1, 'min', 1, 'max', 1000, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "PenetrationClass", 'help', "", 'template', true, 'extra_code', 'name = function(self) return "Penetration Class: " .. (PenetrationClassIds[self.PenetrationClass] or "") end', 'default', 1, 'slider', true, 'min', 1, 'max', 5, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "IgnoreCoverReduction", 'name', "Ignore Cover Reduction", 'help', "If > 0 attacks with this weapon will ignore the damage reduction that would normally apply for targets in cover.", 'template', true, 'default', 0, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "WeaponRange", 'name', "Range", 'help', "Range at which the penalty of the gun is 100.", 'template', true, 'default', 20, 'slider', true, 'min', 1, 'max', 200, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "PointBlankBonus", 'help', "attacks get bonus CTH in point-blank range", 'template', true, 'default', 0, 'min', 0, 'max', 1, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "OverwatchAngle", 'name', "Overwatch Angle", 'help', "overwatch area cone angle", 'template', true, 'extra_code', 'no_edit = function(self) return \n (self.PreparedAttackType ~= "Overwatch" and self.PreparedAttackType ~= "Both" and self.PreparedAttackType ~= "Machine Gun")\nend', 'default', 2400, 'scale', "deg", 'slider', true, 'min', 1, 'max', 5400, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "BuckshotConeAngle", 'name', "Buckshot Cone Angle", 'template', true, 'extra_code', 'no_edit = function(self) return not table.find(self.AvailableAttacks, "Buckshot") end', 'default', 1600, 'scale', "deg", 'min', 60, 'max', 7200, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "BuckshotFalloffDamage", 'name', "Buckshot Falloff Damage", 'help', "what percent of nominal damage is the attack dealing at max range (cone length)", 'template', true, 'extra_code', 'no_edit = function(self) return not table.find(self.AvailableAttacks, "Buckshot") end', 'default', 25, 'scale', "%", 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "BuckshotFalloffStart", 'name', "Buckshot Falloff Start", 'help', "at what percent of the max distance (cone length) does the damage falloff start", 'template', true, 'extra_code', 'no_edit = function(self) return not table.find(self.AvailableAttacks, "Buckshot") end', 'default', 50, 'scale', "%", 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "Noise", 'name', "Noise Range", 'help', "Range (in tiles) in which the weapon alerts unaware enemies when firing.", 'template', true, 'default', 20, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefAccuracyChart', { 'category', "Caliber", 'id', "RangePenalty", 'name', "Range Penalty", 'dont_save', true, 'template', true, }), PlaceObj('PropertyDefCombo', { 'category', "General", 'id', "HandSlot", 'help', "One-haneded or two-handed weapon.", 'template', true, 'default', "OneHanded", 'items', function (self) return { "OneHanded", "TwoHanded" } end, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "Entity", 'template', true, 'items', function (self) return GetWeaponEntities end, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "fxClass", 'name', "FX Class", 'help', "use to override the default fx class of this weapon", 'template', true, 'default', "", 'items', function (self) return ItemTemplatesCombo("FirearmProperties") end, }), PlaceObj('PropertyDefNestedList', { 'category', "Body & Components", 'id', "ComponentSlots", 'template', true, 'base_class', "WeaponComponentSlot", 'inclusive', true, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "Color", 'template', true, 'default', "Olive", 'items', function (self) return Presets.WeaponColor.Default end, }), PlaceObj('PropertyDefNumber', { 'category', "Body & Components", 'id', "BaseDifficulty", 'help', 'Base difficulty value compared against the "Mechanical" skill.', 'template', true, 'min', 0, 'max', 10000000, 'modifiable', true, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "HolsterSlot", 'help', "By default Two Handed weapons go on shoulders, One Handed go to legs", 'template', true, 'default', "", 'items', function (self) return { "", "Shoulder", "Leg" } end, }), PlaceObj('PropertyDefBool', { 'category', "Body & Components", 'id', "ModifyRightHandGrip", 'template', true, }), PlaceObj('PropertyDefChoice', { 'category', "General", 'id', "PreparedAttackType", 'name', "Prepared Attack Type", 'template', true, 'default', "Overwatch", 'items', function (self) return { "Overwatch", "Pin Down", "None", "Both", "Machine Gun" } end, }), PlaceObj('PropertyDefPresetIdList', { 'category', "General", 'id', "AvailableAttacks", 'name', "Available Attacks", 'template', true, 'preset_class', "CombatAction", 'preset_group', "WeaponAttacks", }), PlaceObj('PropertyDefNumber', { 'category', "ActionPoints", 'id', "ShootAP", 'name', "Shoot", 'help', "Action points needed to shoot a single shot", 'template', true, 'default', 1000, 'scale', "AP", 'min', 1000, 'max', 50000, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "ActionPoints", 'id', "ReloadAP", 'name', "Reload", 'help', "Action points needed to reload the gun", 'template', true, 'default', 1000, 'scale', "AP", 'min', 1000, 'max', 50000, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "ActionPoints", 'id', "MaxAimActions", 'name', "Max Aim Actions", 'help', "Max number of aim actions allowed", 'default', 3, 'min', 0, 'max', 5, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Debug", 'id', "SetRange", 'name', "Range", 'dont_save', true, 'template', true, 'default', 10, 'slider', true, 'min', 0, 'max', 50, }), PlaceObj('PropertyDefNumber', { 'category', "Debug", 'id', "DPS", 'dont_save', true, 'read_only', true, 'template', true, 'min', 0, 'max', 1000, }), PlaceObj('ClassMethodDef', { 'name', "GetDPS", 'code', function (self) return self:GetProperty("Damage") * Max(0, GetRangeAccuracy(self, self:GetProperty("SetRange")*const.SlabSizeX)) / 100 end, }), PlaceObj('ClassMethodDef', { 'name', "HasPointBlankBonus", 'code', function (self) return self.PointBlankBonus ~= 0 end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", "MishapProperties", "ExplosiveProperties", }, group = "Inventory", id = "GrenadeProperties", PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "BaseDamage", 'name', "Base Damage", 'template', true, 'default', 20, 'min', 0, 'max', 200, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "Scatter", 'help', "area in which the grenade may scatter defined as a radius in tiles.", 'template', true, 'default', 3, 'min', 0, 'max', 20, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "AttackAP", 'name', "Attack AP", 'help', "AP to throw the greanade", 'template', true, 'default', 6000, 'scale', "AP", 'step', 1000, 'slider', true, 'min', 1000, 'max', 15000, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "BaseRange", 'name', "Throw Range (Min)", 'help', "Number of tiles that this grenade can be thrown by a unit with 0 Strength.", 'template', true, 'default', 5, 'min', -10, 'max', 30, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "ThrowMaxRange", 'name', "Throw Range (Max)", 'help', "Number of tiles that this grenade can be thrown by a unit with 100 Strength.", 'template', true, 'default', 15, 'min', -10, 'max', 30, }), PlaceObj('PropertyDefBool', { 'category', "Combat", 'id', "CanBounce", 'template', true, 'default', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "InaccurateMinOffset", 'name', "Min Offset (Inaccurate Throw)", 'help', "Minimum distance to the target point for inaccurate throws, at 10 tiles", 'template', true, 'default', 1000, 'scale', "m", 'min', 1, 'max', 20000, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "InaccurateMaxOffset", 'name', "Max Offset (Inaccurate Throw)", 'help', "Maximum distance to the target point for inaccurate throws, at 10 tiles", 'template', true, 'default', 5000, 'scale', "m", 'min', 1, 'max', 20000, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "IgnoreCoverReduction", 'name', "Ignore Cover Reduction", 'help', "If > 0 attacks with this weapon will ignore the damage reduction that would normally apply for targets in cover.", 'template', true, 'default', 0, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "Noise", 'name', "Noise", 'help', "Range (in tiles) in which the explosion alerts unaware enemies.", 'template', true, 'default', 20, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "ThrowNoise", 'name', "Throw Noise", 'help', "Range (in tiles) in which items that do not explode immediately can still alert enemies when they land.", 'template', true, 'default', 3, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefChoice', { 'category', "Combat", 'id', "aoeType", 'name', "AOE Type", 'help', "additional effect that happens after the explosion (optional)", 'template', true, 'default', "none", 'items', function (self) return {"none", "fire", "smoke", "teargas", "toxicgas"} end, }), PlaceObj('PropertyDefChoice', { 'category', "General", 'id', "Entity", 'read_only', true, 'no_edit', true, 'template', true, 'items', function (self) return ClassDescendantsCombo("GrenadeVisual") end, }), PlaceObj('PropertyDefUIImage', { 'category', "General", 'id', "ActionIcon", 'name', "Throw Action Icon", 'template', true, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", "MishapProperties", }, group = "Inventory", id = "HeavyWeaponProperties", PlaceObj('PropertyDefCombo', { 'category', "Caliber", 'id', "Caliber", 'template', true, 'items', function (self) return PresetGroupCombo("Caliber", "Default") end, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "AttackAP", 'name', "Attack AP", 'help', "AP to throw the greanade", 'template', true, 'default', 6000, 'scale', "AP", 'step', 1000, 'slider', true, 'min', 1000, 'max', 15000, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "BombardRadius", 'help', "defines the radius (in tiles) of the zone where the bombard ordnance can fall", 'template', true, 'default', 4, 'min', 0, 'max', 10, 'modifiable', true, }), PlaceObj('PropertyDefNestedList', { 'category', "Body & Components", 'id', "ComponentSlots", 'template', true, 'base_class', "WeaponComponentSlot", 'inclusive', true, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "Entity", 'template', true, 'items', function (self) return GetWeaponEntities end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", }, group = "Inventory", id = "InventoryItemProperties", PlaceObj('PropertyDefUIImage', { 'category', "General", 'id', "Icon", 'template', true, 'default', "", 'image_preview_size', 400, }), PlaceObj('PropertyDefUIImage', { 'category', "General", 'id', "SubIcon", 'help', "A small icon on the bootom left side of the item's icon", 'template', true, 'default', "", 'image_preview_size', 30, }), PlaceObj('PropertyDefPresetId', { 'category', "General", 'id', "ItemType", 'template', true, 'preset_class', "WeaponType", }), PlaceObj('PropertyDefText', { 'category', "General", 'id', "DisplayName", 'name', "Display Name", 'template', true, }), PlaceObj('PropertyDefText', { 'category', "General", 'id', "DisplayNamePlural", 'name', "Display Name Plural", 'template', true, }), PlaceObj('PropertyDefPresetId', { 'category', "General", 'id', "colorStyle", 'name', "Color Style", 'template', true, 'preset_class', "TextStyle", }), PlaceObj('PropertyDefText', { 'category', "General", 'id', "Description", 'template', true, 'lines', 1, 'max_lines', 3, }), PlaceObj('PropertyDefText', { 'category', "General", 'id', "AdditionalHint", 'name', "Additional Hint", 'help', "Additional keywords text to add to item's rollover hint. Added after the autogenerated keyswors for weapons.", 'template', true, 'lines', 1, 'max_lines', 10, }), PlaceObj('PropertyDefNumber', { 'category', "General", 'id', "LargeItem", 'template', true, 'default', 0, 'slider', true, 'min', 0, 'max', 1, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "General", 'id', "Cumbersome", 'template', true, 'default', 0, 'slider', true, 'min', 0, 'max', 1, 'modifiable', true, }), PlaceObj('PropertyDefChoice', { 'category', "General", 'id', "UnitStat", 'name', "Unit Stat", 'help', "Unit Properties stat.", 'template', true, 'items', function (self) return GetUnitStatsCombo() end, }), PlaceObj('PropertyDefNumber', { 'category', "General", 'id', "Valuable", 'name', "Valuable Item (for VR only)", 'help', "Will check whether to play the ValuableItemFound VR", 'template', true, 'default', 0, 'min', 0, 'max', 1, 'modifiable', true, }), PlaceObj('PropertyDefButtons', { 'category', "General", 'id', "btnAddItem", 'buttons', { PlaceObj('PropertyDefPropButton', { 'Name', "Add To Current Unit", 'FuncName', "UIPlaceInInventory", }), }, 'template', true, }), PlaceObj('PropertyDefNumber', { 'category', "BobbyRayShop", 'id', "Cost", 'help', "How much this item costs to buy in $", 'template', true, 'default', 1000, 'min', 0, 'max', 10000000, 'modifiable', true, }), PlaceObj('PropertyDefPresetId', { 'category', "General", 'id', "loot_def", 'name', "LootDef", 'help', "Loot def for the items ValuableItemContainer contains", 'no_edit', "expression", 'no_edit_expression', function (self, prop_meta) return self.object_class ~= "ValuableItemContainer" end, 'template', true, 'preset_class', "LootDef", }), PlaceObj('PropertyDefBool', { 'category', "General", 'id', "locked", 'name', "Locked", 'help', "Locked items cannot be moved from their slot. They also disappear when the bearer dies.", 'template', true, }), PlaceObj('PropertyDefFunc', { 'category', "Reactions", 'id', "OnItemGained", 'template', true, 'params', "self, owner, slot", }), PlaceObj('PropertyDefFunc', { 'category', "Reactions", 'id', "OnItemLost", 'template', true, 'params', "self, owner, slot", }), PlaceObj('PropertyDefText', { 'id', "owner", 'name', "Owner", 'help', "The item owner if any.", 'translate', false, }), PlaceObj('PropertyDefText', { 'id', "extra_tag", 'help', "Extra data to identify unique items. Note that for stacking items this will be wiped when they're stacked.", 'translate', false, }), PlaceObj('PropertyDefNumber', { 'id', "base_drop_chance", 'read_only', true, 'no_edit', true, 'default', 5, }), PlaceObj('PropertyDefNumber', { 'id', "drop_chance", 'read_only', true, 'no_edit', true, 'default', 0, }), PlaceObj('PropertyDefBool', { 'id', "guaranteed_drop", 'read_only', true, 'no_edit', true, }), PlaceObj('ClassMethodDef', { 'name', "GetColoredName", 'params', "plural", 'code', function (self, plural) local style = TextStyles[self.colorStyle] if style then local r, g, b = GetRGB(style.TextColor) local colorTag = string.format("", r, g, b) return T{236471449642, "", colorTag = colorTag, name = plural and self.DisplayNamePlural or self.DisplayName } else return plural and self.DisplayNamePlural or self.DisplayName end end, }), PlaceObj('ClassMethodDef', { 'name', "GetEquipCost", 'code', function (self) return const["Action Point Costs"].EquipItem end, }), PlaceObj('ClassMethodDef', { 'name', "GetUIWidth", 'code', function (self) return self:IsLargeItem() and 2 or 1 end, }), PlaceObj('ClassMethodDef', { 'name', "GetUIHeight", 'code', function (self) return 1 end, }), PlaceObj('ClassMethodDef', { 'name', "GetRolloverType", 'code', function (self) return self.ItemType end, }), PlaceObj('ClassMethodDef', { 'name', "IsLargeItem", 'code', function (self) return self.LargeItem ~= 0 end, }), PlaceObj('ClassMethodDef', { 'name', "IsCumbersome", 'code', function (self) return self.Cumbersome ~= 0 end, }), PlaceObj('ClassMethodDef', { 'name', "IsValuable", 'code', function (self) return self.Valuable ~= 0 end, }), }) PlaceObj('PresetDef', { DefGlobalMap = "InventoryTabs", DefParentClassList = { "ListPreset", }, group = "Inventory", id = "InventoryTab", PlaceObj('PropertyDefText', { 'id', "display_name", 'lines', 2, 'max_lines', 100, }), PlaceObj('PropertyDefUIImage', { 'id', "icon", 'default', "UI/Inventory/tabs_all.png", 'image_preview_size', 100, }), PlaceObj('PropertyDefStringList', { 'id', "item_classes", }), PlaceObj('PropertyDefFunc', { 'id', "FilterItem", 'template', true, 'params', "self, item", 'default', function (self, item) if not next(self.item_classes) then return true end return IsKindOfClasses(item, self.item_classes) end, }), }) PlaceObj('ClassDef', { group = "Inventory", id = "ItemUpgradeProperties", PlaceObj('PropertyDefCombo', { 'id', "Slot", 'template', true, 'default', "Modification", 'items', function (self) return {"Underslung", "Muzzle", "Sights", "Magazine", "Modification"} end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "PropertyObject", "ScrapableItem", }, group = "Inventory", id = "ItemWithCondition", PlaceObj('PropertyDefNumber', { 'category', "Condition", 'id', "Condition", 'help', "The overall condition of the item which is lowered when the item is fired/hit", 'template', true, 'default', 100, 'min', 0, 'max', 10000, }), PlaceObj('PropertyDefNumber', { 'category', "Condition", 'id', "RepairCost", 'name', "Repair Cost", 'help', "How long it takes to repair the item using Mechanical skill. Each hour a mechanic contributes his/her skill towards repair. To increase Condition by 1 point the merc has to contribute this much points.", 'template', true, 'default', 80, 'min', 0, 'max', 1000, }), PlaceObj('PropertyDefBool', { 'category', "Condition", 'id', "Repairable", 'name', "Repairable", 'help', "Whether the item can be repaired", 'template', true, 'default', true, }), PlaceObj('PropertyDefNumber', { 'category', "Condition", 'id', "Reliability", 'help', "For guns. Percentage. How fast or slowly condition is lost when the gun is fired. High percentage means that the gun is more reliable.", 'template', true, 'extra_code', 'no_edit = function(self) local class = g_Classes[self.object_class or false]\nreturn not IsKindOf(class, "FirearmBase") end', 'default', 40, 'slider', true, 'min', 0, 'max', 98, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Condition", 'id', "Degradation", 'help', "For armors. When the armor is hit how much of the damage is transfered as condition loss.", 'template', true, 'extra_code', 'no_edit = function(self) local class = g_Classes[self.object_class or false]\nreturn not IsKindOf(class, "Armor") end', 'default', 50, 'slider', true, 'min', 0, 'max', 100, }), PlaceObj('PropertyDefNumber', { 'category', "Condition", 'id', "repair_progress", 'no_edit', true, 'template', true, 'default', 0, }), PlaceObj('ClassMethodDef', { 'name', "AmountOfScrapPartsFromItem", 'code', function (self) local parts = self:GetScrapParts() if self.Condition and self.Condition < 50 then parts = parts / 2 end return parts end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", }, group = "Inventory", id = "MeleeWeaponProperties", PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "BaseChanceToHit", 'name', "Base Chance To Hit", 'help', "Multiplies chance to hit finaly. Used to define differently accurate weapon types.", 'template', true, 'default', 90, 'slider', true, 'min', 0, 'max', 100, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "CritChance", 'name', "Crit Chance", 'help', "Base chance to cause a critical hit which deals more damage.", 'template', true, 'default', 0, 'scale', "%", 'slider', true, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "CritChanceScaled", 'name', "Crit Chance (Scaled)", 'help', "Additional chance to cause a critical hit (scaled by level, specified number is at merc level 10)", 'template', true, 'default', 10, 'scale', "%", 'slider', true, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "BaseDamage", 'name', "Base Damage", 'help', "Melee weapon damage scales based on damage. This property defines the base cost.", 'template', true, 'default', 10, 'min', 0, 'max', 200, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "AimAccuracy", 'name', "Aim Accuracy", 'help', "Base chance to hit increase per aim action", 'template', true, 'default', 2, 'scale', "%", 'min', 1, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "PenetrationClass", 'help', "", 'template', true, 'extra_code', 'name = function(self) return "Penetration Class: " .. (PenetrationClassIds[self.PenetrationClass] or "") end', 'default', 1, 'slider', true, 'min', 1, 'max', 5, 'modifiable', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "DamageMultiplier", 'name', "Damage Multiplier", 'help', "In %. Strength stat is multiplied by this percentage when multiplying melee damage", 'template', true, 'default', 200, 'scale', "%", 'min', 0, 'max', 1000, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "IgnoreCoverReduction", 'name', "Ignore Cover Reduction", 'help', "If > 0 attacks with this weapon will ignore the damage reduction that would normally apply for targets in cover.", 'template', true, 'default', 0, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefBool', { 'category', "Combat", 'id', "CanThrow", 'name', "Can Throw", 'template', true, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "WeaponRange", 'name', "Range", 'help', "Range at which the penalty of the gun is 100.", 'template', true, 'extra_code', "no_edit = function(self) return not self.CanThrow end", 'default', 8, 'slider', true, 'min', 1, 'max', 20, 'modifiable', true, }), PlaceObj('PropertyDefBool', { 'category', "Combat", 'id', "Charge", 'template', true, }), PlaceObj('PropertyDefBool', { 'category', "Combat", 'id', "IsUnarmed", 'template', true, }), PlaceObj('PropertyDefNumber', { 'category', "Action Points", 'id', "AttackAP", 'name', "Attack", 'help', "Action Points needed to make a basic attack.", 'template', true, 'default', 5000, 'scale', "AP", 'min', 0, 'max', 30000, }), PlaceObj('PropertyDefNumber', { 'category', "Action Points", 'id', "MaxAimActions", 'name', "Max Aim Actions", 'help', "Max number of allowed aim actions.", 'template', true, 'default', 2, 'min', 0, 'max', 4, }), PlaceObj('PropertyDefNumber', { 'category', "Melee Weapon", 'id', "Noise", 'help', "How much noise the weapon makes when attacking.", 'template', true, 'default', 100, 'min', 0, 'max', 1000, }), PlaceObj('PropertyDefChoice', { 'category', "Melee Weapon", 'id', "NeckAttackType", 'template', true, 'default', "bleed", 'items', function (self) return {"choke", "bleed", "lethal"} end, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "Entity", 'template', true, 'items', function (self) return GetWeaponEntities end, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "fxClass", 'name', "FX Class", 'help', "use to override the default fx class of this weapon", 'template', true, 'default', "", 'items', function (self) return ItemTemplatesCombo("MeleeWeaponProperties") end, }), PlaceObj('PropertyDefCombo', { 'category', "Body & Components", 'id', "HolsterSlot", 'help', "By default Two Handed weapons go on shoulders, One Handed go to legs", 'template', true, 'default', "", 'items', function (self) return { "", "Shoulder", "Leg" } end, }), }) PlaceObj('ClassDef', { Comment = "On use/pickup effects", DefParentClassList = { "ItemWithCondition", }, group = "Inventory", id = "MiscItemProperties", PlaceObj('PropertyDefChoice', { 'category', "Execution", 'id', "effect_moment", 'name', "Effect moment", 'template', true, 'items', function (self) return InventoryItemEffectMoments end, }), PlaceObj('PropertyDefNestedList', { 'category', "Execution", 'id', "Effects", 'help', "Effects that are executed when consuming an item.", 'template', true, 'base_class', "Effect", }), PlaceObj('PropertyDefText', { 'category', "Execution", 'id', "action_name", 'name', "Name", 'help', "Action name", 'template', true, }), PlaceObj('PropertyDefBool', { 'category', "Execution", 'id', "destroy_item", 'name', "Destroy item", 'help', "Destroy item after execution.", 'template', true, }), PlaceObj('PropertyDefBool', { 'category', "Execution", 'id', "onlyOnMap", 'name', "Only on Map", 'help', "Can be used only when the unit is on a loaded map.", 'template', true, }), PlaceObj('PropertyDefNumber', { 'category', "Execution", 'id', "APCost", 'name', "AP Cost", 'help', "How much does the item cost to use while in combat.", 'template', true, 'default', 2, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ExplosiveProperties", }, group = "Inventory", id = "OrdnanceProperties", PlaceObj('PropertyDefCombo', { 'category', "Caliber", 'id', "Caliber", 'template', true, 'items', function (self) return PresetGroupCombo("Caliber", "Default") end, }), PlaceObj('PropertyDefNumber', { 'category', "Caliber", 'id', "MaxStacks", 'name', "Max Stacks", 'help', "Ammo can stack up to that number.", 'template', true, 'default', 10, 'slider', true, 'min', 1, 'max', 10000, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "BaseDamage", 'name', "Base Damage", 'template', true, 'default', 20, 'min', 0, }), PlaceObj('PropertyDefNumber', { 'category', "Combat", 'id', "Noise", 'name', "Noise", 'help', "Range (in tiles) in which the explosion alerts unaware enemies.", 'template', true, 'default', 20, 'min', 0, 'max', 100, 'modifiable', true, }), PlaceObj('PropertyDefChoice', { 'category', "Combat", 'id', "aoeType", 'name', "AOE Type", 'help', "additional effect that happens after the explosion (optional)", 'template', true, 'default', "none", 'items', function (self) return {"none", "fire", "smoke", "teargas", "toxicgas"} end, }), PlaceObj('PropertyDefBool', { 'category', "Combat", 'id', "CanBounce", 'template', true, }), PlaceObj('PropertyDefChoice', { 'category', "General", 'id', "Entity", 'read_only', true, 'no_edit', true, 'template', true, 'items', function (self) return ClassDescendantsCombo("GrenadeVisual") end, }), PlaceObj('PropertyDefUIImage', { 'category', "General", 'id', "ammo_type_icon", 'name', "Ammo Type Icon", 'help', "Ammo type icon", 'template', true, }), }) PlaceObj('ClassDef', { group = "Inventory", id = "QuestItemProperties", }) PlaceObj('ClassDef', { group = "Inventory", id = "ScrapableItem", PlaceObj('PropertyDefNumber', { 'category', "Condition", 'id', "ScrapParts", 'name', "Scrap Parts", 'help', "The number for Parts that are given to the player when its scraped", 'template', true, 'default', 0, 'min', 0, 'max', 1000, }), PlaceObj('ClassMethodDef', { 'name', "GetScrapParts", 'code', function (self) return self.ScrapParts end, }), PlaceObj('ClassMethodDef', { 'name', "AmountOfScrapPartsFromItem", 'code', function (self) return self:GetScrapParts() end, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", }, group = "Inventory", id = "StatBoostItemProperties", PlaceObj('PropertyDefChoice', { 'category', "Stat boost item", 'id', "stat", 'name', "Stat", 'template', true, 'items', function (self) return GetUnitStatsCombo end, }), PlaceObj('PropertyDefNumber', { 'category', "Stat boost item", 'id', "boost", 'name', "Boost value", 'template', true, }), }) PlaceObj('ClassDef', { DefParentClassList = { "ItemWithCondition", }, group = "Inventory", id = "TransmutedItemProperties", PlaceObj('PropertyDefPresetId', { 'id', "OriginalItemId", 'preset_class', "InventoryItemCompositeDef", }), PlaceObj('PropertyDefCombo', { 'id', "RevertCondition", 'items', function (self) return {"attacks", "damage"} end, }), PlaceObj('PropertyDefNumber', { 'id', "RevertConditionCounter", }), PlaceObj('ClassMethodDef', { 'name', "MakeTransmutation", 'params', "fromitem", 'code', function (self, fromitem) local new_item, prev_item if fromitem =="revert" then new_item = PlaceInventoryItem(self.OriginalItemId) prev_item = self else new_item = self prev_item = fromitem end new_item.Condition = prev_item.Condition return new_item, prev_item end, }), })