diff --git a/src/constants.nvgt b/src/constants.nvgt index c7b8597..4563c49 100644 --- a/src/constants.nvgt +++ b/src/constants.nvgt @@ -254,7 +254,7 @@ const int PLAYER_ITEM_BREAK_ROLL_MAX = 200; const int PET_START_LOYALTY = 5; const int PET_LOYALTY_HELP_LOSS = 1; const int PET_LOYALTY_HUNGER_LOSS = 2; -const int PET_LOYALTY_ACTION_COST = 1; +const int PET_LOYALTY_CALLOUT_COST = 1; const int PET_LOYALTY_EAT_BONUS = 2; const int PET_LOYALTY_MAX = 10; const int PET_ATTACK_COOLDOWN = 1600; // Same as axe diff --git a/src/pet_system.nvgt b/src/pet_system.nvgt index 6bb364e..70354f0 100644 --- a/src/pet_system.nvgt +++ b/src/pet_system.nvgt @@ -7,6 +7,8 @@ string petType = ""; string petGender = ""; int petLoyalty = 0; bool petOut = false; +int petPosition = 0; +bool petPositionValid = false; timer petAttackTimer; timer petRetrieveTimer; @@ -223,6 +225,8 @@ void reset_pet_state() { petGender = ""; petLoyalty = 0; petOut = false; + petPosition = 0; + petPositionValid = false; petEventMessages.resize(0); petEventSounds.resize(0); petEventPositions.resize(0); @@ -272,10 +276,15 @@ void check_pet_call_key() { if (petOut) { petOut = false; stop_pet_travel(); + petPositionValid = false; speak_with_history("Pet called back.", true); return; } + adjust_pet_loyalty(-PET_LOYALTY_CALLOUT_COST); + if (!petActive) return; petOut = true; + petPosition = x; + petPositionValid = true; if (file_exists("sounds/pets/call_pet.ogg")) { p.play_stationary("sounds/pets/call_pet.ogg", false); } @@ -288,6 +297,8 @@ void adopt_pet(const string&in soundPath) { petGender = (random(0, 1) == 0) ? "Male" : "Female"; petLoyalty = PET_START_LOYALTY; petOut = false; + petPosition = 0; + petPositionValid = false; petAttackTimer.restart(); petRetrieveTimer.restart(); petTravelTimer.restart(); @@ -306,8 +317,8 @@ void stop_pet_travel() { petTravelSoundHandle = -1; } -int get_pet_travel_duration_ms(int targetPos) { - int distance = abs(targetPos - x); +int get_pet_travel_duration_ms(int startPos, int targetPos) { + int distance = abs(targetPos - startPos); int duration = distance * PET_MOVE_SPEED; if (duration < PET_TRAVEL_MIN_MS) duration = PET_TRAVEL_MIN_MS; return duration; @@ -317,11 +328,11 @@ void start_pet_travel_attack(int targetPos, const string&in targetLabel, int tar stop_pet_travel(); petTravelActive = true; petTravelAction = PET_TRAVEL_ATTACK; - petTravelStartPos = x; + petTravelStartPos = petPositionValid ? petPosition : x; petTravelTargetPos = targetPos; petTravelTargetLabel = targetLabel; petTravelTargetKind = targetKind; - petTravelDurationMs = get_pet_travel_duration_ms(targetPos); + petTravelDurationMs = get_pet_travel_duration_ms(petTravelStartPos, targetPos); petTravelTimer.restart(); if (petSoundPath != "" && file_exists(petSoundPath)) { @@ -339,9 +350,9 @@ void start_pet_travel_retrieve(int targetPos) { stop_pet_travel(); petTravelActive = true; petTravelAction = PET_TRAVEL_RETRIEVE; - petTravelStartPos = x; + petTravelStartPos = petPositionValid ? petPosition : x; petTravelTargetPos = targetPos; - petTravelDurationMs = get_pet_travel_duration_ms(targetPos); + petTravelDurationMs = get_pet_travel_duration_ms(petTravelStartPos, targetPos); petTravelTimer.restart(); } @@ -377,7 +388,15 @@ void update_pet_travel() { if (hit) { queue_pet_event("Your " + petType + " attacks the " + petTravelTargetLabel + ".", petTravelTargetPos); } - adjust_pet_loyalty(-PET_LOYALTY_ACTION_COST); + petPosition = petTravelTargetPos; + petPositionValid = true; + int nextTargetPos = -1; + string nextTargetLabel = ""; + int nextTargetKind = -1; + if (!find_pet_attack_target(nextTargetPos, nextTargetLabel, nextTargetKind)) { + petOut = false; + petPositionValid = false; + } } else if (petTravelAction == PET_TRAVEL_RETRIEVE) { WorldDrop@ drop = get_drop_at(petTravelTargetPos); if (drop !is null) { @@ -386,9 +405,9 @@ void update_pet_travel() { remove_drop_at(drop.position); queue_pet_event(message); petOut = false; + petPositionValid = false; } } - adjust_pet_loyalty(-PET_LOYALTY_ACTION_COST); } stop_pet_travel(); @@ -614,8 +633,8 @@ void attempt_pet_random_find() { add_personal_count(itemType, added); string itemName = (added == 1) ? item_registry[itemType].singular : item_registry[itemType].name; queue_pet_event("Your " + petType + " retrieved " + added + " " + itemName + ".", x); - adjust_pet_loyalty(-PET_LOYALTY_ACTION_COST); petOut = false; + petPositionValid = false; } void handle_pet_hourly_update(int hour) {