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
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`:
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:
// In Mob.java public void makePet(Hero hero) { this.petMaster = hero.id(); hero.pets.add(this); setState(MobAi.getStateByClass(Hunting.class)); // Follow and fight }
Pet inventory access:
// In PetInventoryManager.java public static void giveToPet(Hero hero, Item item) { Pet pet = getSelectedPet(hero); if (pet != null && pet.collect(item)) { GLog.p("PetInventory_GaveItem", item.name()); } }
Lua pet creation:
-- Possess spell RPD.Mob:makePet(target, caster) target:setState(RPD.MobAi:getStateByClass("ControlledAi")) -- Raise Dead local mob = RPD.MobFactory:mobByName(latestDeadMob.class) RPD.Mob:makePet(mob, chr) level:spawnMob(mob)