Pet Mechanic allows the hero to tame and command mobs as permanent companions that fight alongside them.
Game Mechanic (AI/Pet System)
Pet Management: PetInventoryManager.java
Pet Base Class: Mob.java (pet functionality)
Mob Pet Methods: Mob.java
Hero Pet List: Char.java
AI States: MobAi.java
UI: Toolbar.java
Windows: WndPetItem.java
Actions: CommonActions.java
Mob Pet Property: In `mobsDesc/<Mob>.json`
{
"canBePet": true,
"name": "Rat_Name",
...
}
Mobs with `“canBePet”: true` (e.g. Bee, DeepSnail, MazeShadow, ShamanElder):
English (values/strings_all.xml):
<string name="PetInventory_Title">Pet Inventory</string> <string name="PetInventory_ViewManage">View and manage your pet's equipment</string> <string name="PetInventory_GiveToPet">Give to Pet</string> <string name="PetInventory_TakeFromPet">Take from Pet</string> <string name="PetInventory_GaveItem">You gave %s to your pet</string> <string name="PetInventory_TookItem">You took %s from your pet</string> <string name="PetInventory_GiveN">Give %d</string> <string name="PetInventory_TakeN">Take %d</string> <string name="PetInventory_PetBackpackFull">Pet's backpack is full</string> <string name="PetInventory_HeroBackpackFull">Your backpack is full</string> <string name="PetInventory_TooFar">Pet is too far away</string> <string name="PetInventory_CantGiveEquipped">Can't give equipped items</string> <string name="Mob_Cannot_Be_Pet">This creature cannot be tamed</string> <string name="PetInventory_ACTakeFromPet">Take from Pet</string> <string name="PetInventory_ACGiveToPet">Give to Pet</string>
Russian (values-ru/strings_all.xml):
<string name="PetInventory_Title">Инвентарь питомца</string> <string name="PetInventory_ViewManage">Просмотр и управление экипировкой питомца</string> <string name="PetInventory_GiveToPet">Отдать питомцу</string> <string name="PetInventory_TakeFromPet">Забрать у питомца</string> <string name="PetInventory_GaveItem">Вы отдали %s питомцу</string> <string name="PetInventory_TookItem">Вы забрали %s у питомца</string> <string name="PetInventory_GiveN">Отдать %d</string> <string name="PetInventory_TakeN">Забрать %d</string> <string name="PetInventory_PetBackpackFull">Рюкзак питомца полон</string> <string name="PetInventory_HeroBackpackFull">Ваш рюкзак полон</string> <string name="PetInventory_TooFar">Питомец слишком далеко</string> <string name="PetInventory_CantGiveEquipped">Нельзя отдать экипированные предметы</string> <string name="Mob_Cannot_Be_Pet">Это существо нельзя приручить</string> <string name="PetInventory_ACTakeFromPet">Забрать у питомца</string> <string name="PetInventory_ACGiveToPet">Отдать питомцу</string>
Taming a mob (actual implementation in Mob.java):
public static Mob makePet(@NotNull Mob pet, int ownerId) { var owner = CharsList.getById(ownerId); if(owner.fraction()==Fraction.HEROES) { pet.expForKill = 0; } if (pet.canBePet()) { pet.setFraction(owner.fraction()); pet.setOwnerId(ownerId); } return pet; }
Lua pet creation:
-- Possess spell RPD.Mob:makePet(target, caster) -- Raise Dead local mob = RPD.MobFactory:mobByName(latestDeadMob.class) RPD.Mob:makePet(mob, chr) level:spawnMob(mob)