# HG changeset patch # User KarstenBock@gmx.net # Date 1321127665 -3600 # Node ID 04854cf6e1ac81c6acc635bf3404fa0721c78160 # Parent 79d6b17b80a37690819801502a46c95d81c387a5 The approach method of MovingAgentBehaviour now accepts a locatior or another instance, and uses the follow method to move to the instance position. diff -r 79d6b17b80a3 -r 04854cf6e1ac behaviours/moving.py --- a/behaviours/moving.py Sat Nov 12 16:27:39 2011 +0100 +++ b/behaviours/moving.py Sat Nov 12 20:54:25 2011 +0100 @@ -30,26 +30,34 @@ self.idle_counter = 1 - def approach(self, location, action=None): - """Approaches a location and then perform an action (if set). - @type loc: fife.Location - @param loc: the location to approach - @type action: Action - @param action: The action to schedule for execution after the approach. - @return: None""" + def approach(self, location_or_agent, action=None): + """Approaches a location or another agent and then perform an action + (if set). + @type loc: fife.Location + @param loc: the location or agent to approach + @type action: Action + @param action: The action to schedule for execution after the + approach. + @return: None""" + self.state = base._AGENT_STATE_APPROACH self.nextAction = action - boxLocation = tuple([int(float(i)) for i in location]) - l = fife.Location(self.agent.getLocation()) - l.setLayerCoordinates(fife.ModelCoordinate(*boxLocation)) - self.agent.move('run', l, self.speed + 1) + if isinstance(location_or_agent, fife.Instance): + agent = location_or_agent + self.agent.follow('run', agent, self.speed + 1) + else: + location = location_or_agent + boxLocation = tuple([int(float(i)) for i in location]) + l = fife.Location(self.getLocation()) + l.setLayerCoordinates(fife.ModelCoordinate(*boxLocation)) + self.agent.move('run', l, self.speed + 1) def onInstanceActionFinished(self, instance, action): """@type instance: ??? - @param instance: ??? - @type action: ??? - @param action: ??? - @return: None""" + @param instance: ??? + @type action: ??? + @param action: ??? + @return: None""" BaseBehaviour.onInstanceActionFinished(self, instance, action) if(action.getId() != 'stand'): @@ -64,9 +72,9 @@ def run(self, location): """Makes the PC run to a certain location - @type location: fife.ScreenPoint - @param location: Screen position to run to. - @return: None""" + @type location: fife.ScreenPoint + @param location: Screen position to run to. + @return: None""" self.state = base._AGENT_STATE_RUN self.clear_animations() self.nextAction = None @@ -74,9 +82,9 @@ def walk(self, location): """Makes the PC walk to a certain location. - @type location: fife.ScreenPoint - @param location: Screen position to walk to. - @return: None""" + @type location: fife.ScreenPoint + @param location: Screen position to walk to. + @return: None""" self.state = base._AGENT_STATE_RUN self.clear_animations() self.nextAction = None diff -r 79d6b17b80a3 -r 04854cf6e1ac behaviours/npc.py --- a/behaviours/npc.py Sat Nov 12 16:27:39 2011 +0100 +++ b/behaviours/npc.py Sat Nov 12 20:54:25 2011 +0100 @@ -40,7 +40,7 @@ # I increased the wander rate to 900 since the idle method # gets called way more often now. self.wanderCounter = 0 - self.wanderRate = 900 + self.wanderRate = 9 def getTargetLocation(self): """@rtype: fife.Location diff -r 79d6b17b80a3 -r 04854cf6e1ac entities/action.py --- a/entities/action.py Sat Nov 12 16:27:39 2011 +0100 +++ b/entities/action.py Sat Nov 12 20:54:25 2011 +0100 @@ -324,50 +324,30 @@ @return: None""" player_char = self.model.game_state.\ getObjectById("PlayerCharacter").fifeagent - npc_coordinates = self.npc.fifeagent.behaviour.getLocation().\ - getLayerCoordinates() - pc_coordinates = player_char.behaviour.agent.\ - getLocation().getLayerCoordinates() - - distance_squared = (npc_coordinates.x - pc_coordinates.x) *\ - (npc_coordinates.x - pc_coordinates.x) +\ - (npc_coordinates.y - pc_coordinates.y) *\ - (npc_coordinates.y - pc_coordinates.y) - - # If we are too far away, we approach the NPC again - if distance_squared > 2: - player_char.behaviour.approach( - [npc_coordinates.x, npc_coordinates.y], - TalkAction(self.controller, - self.npc, - self.commands - ) - ) + player_char.behaviour.animate( + 'stand', + self.npc.fifeagent.behaviour.getLocation() + ) + + if self.npc.dialogue.dialogue is not None: + dialogue_controller = DialogueController( + self.controller.engine, + self.view, + self.model, + self.controller.application + ) + self.controller.application.manager.push_mode( + dialogue_controller + ) + dialogue_controller.startTalk(self.npc) else: - player_char.behaviour.agent.act( - 'stand', - self.npc.fifeagent.behaviour.getLocation() - ) - - if self.npc.dialogue.dialogue is not None: - dialogue_controller = DialogueController( - self.controller.engine, - self.view, - self.model, - self.controller.application - ) - self.controller.application.manager.push_mode( - dialogue_controller - ) - dialogue_controller.startTalk(self.npc) - else: - self.npc.fifeagent.behaviour.agent.say("Leave me alone!", 1000) - - self.model.game_state.getObjectById("PlayerCharacter").\ - fifeagent.behaviour.idle() - self.model.game_state.getObjectById("PlayerCharacter").\ - fifeagent.behaviour.nextAction = None - super(TalkAction, self).execute() + self.npc.fifeagent.behaviour.agent.say("Leave me alone!", 1000) + + self.model.game_state.getObjectById("PlayerCharacter").\ + fifeagent.behaviour.idle() + self.model.game_state.getObjectById("PlayerCharacter").\ + fifeagent.behaviour.nextAction = None + super(TalkAction, self).execute() class UseAction(Action): """Action for carryable items. It executes special commands that can be only diff -r 79d6b17b80a3 -r 04854cf6e1ac gamescenecontroller.py --- a/gamescenecontroller.py Sat Nov 12 16:27:39 2011 +0100 +++ b/gamescenecontroller.py Sat Nov 12 20:54:25 2011 +0100 @@ -426,10 +426,10 @@ npc_info.general.identifier, self.model.game_state.current_map_name ) - npc_pos = npc.fifeagent.behaviour.getLocation().getLayerCoordinates() + npc_behaviour = npc.fifeagent.behaviour + npc_pos = npc_behaviour.getLocation().getLayerCoordinates() self.model.game_state.getObjectById("PlayerCharacter").fifeagent.\ - behaviour.approach([npc_pos.x, - npc_pos.y], + behaviour.approach(npc_behaviour.agent, TalkAction(self, npc)) def getItemActions(self, obj_id): @@ -442,7 +442,8 @@ obj = self.model.game_state.\ getObjectById(obj_id, self.model.game_state.current_map_name) - obj_pos = obj.fifeagent.behaviour.getLocation().getLayerCoordinates() + #obj_pos = obj.fifeagent.behaviour.getLocation().getLayerCoordinates() + agent = obj.fifeagent.behaviour.agent player = self.model.game_state.getObjectById("PlayerCharacter") is_player = obj.general.identifier == player.general.identifier @@ -456,7 +457,7 @@ if obj.description and obj.description.desc: actions.append(["Examine", "Examine", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, ExamineAction(self, obj_id, obj.description.view_name, obj.description.desc)]) @@ -464,7 +465,7 @@ if obj.change_map: actions.append(["Change Map", "Change Map", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, ChangeMapAction(self, obj.change_map.target_map, obj.change_map.target_position)]) @@ -473,23 +474,23 @@ if not obj.lockable.locked: actions.append(["Open", "Open", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, OpenAction(self, obj)]) else: actions.append(["Close", "Close", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, CloseAction(self, obj)]) if obj.lockable.locked: actions.append(["Unlock", "Unlock", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, UnlockAction(self, obj)]) else: if obj.lockable.closed: actions.append(["Lock", "Lock", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, LockAction(self, obj)]) if obj.container: if obj.characterstats: @@ -498,12 +499,12 @@ elif not obj.lockable or not obj.lockable.closed: actions.append(["Examine contents", "Examine Contents", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, ExamineContentsAction(self, obj)]) if obj.containable: actions.append(["Pick Up", "Pick Up", player.fifeagent.behaviour.approach, - [obj_pos.x, obj_pos.y], + agent, PickUpAction(self, obj)]) return actions