root/adventure/place.py

Revision 156, 5.5 kB (checked in by thib, 6 months ago)

Quelques modifs ( World, Place et Thing héritent d'object )

Line 
1 # -*- coding: utf-8 -*-
2
3 #  MUDMUC
4 #  place.py
5 #  Copyright (c) 2008 Thibaut Girka, Anaël Verrier
6
7 #  This program is free software; you can redistribute it and/or modify
8 #  it under the terms of the GNU General Public License as published by
9 #  the Free Software Foundation; version 3 only.
10
11 #  This program is distributed in the hope that it will be useful,
12 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #  GNU General Public License for more details.
15
16 #  You should have received a copy of the GNU General Public License
17 #  along with this program; if not, write to the Free Software
18 #  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
20 from xmpp import Message, Presence, NS_MUC_USER
21
22 from thing import NonPlayableCharacter
23
24 class Place(object):
25     def __init__(self, world, name, description):
26         self.world = world
27         self.name = name
28         self.description = description
29        
30         self.visitors = list() # Players ; Role: visitors
31         self.npcs = list() # Role: Participants
32         
33         self.things = list() # List of Things
34         self.exits = dict() # { spec: place_name }
35     
36     def player_leaved(self, player):
37         """
38         Broadcast unavaibility of Player or NonPlayableCharacter,
39         Trigger on-leave events and remove
40         Player/NonPlayableCharacter from the lists.
41         """
42        
43         if player.place:
44             message = '/me leaves %s going to %s' % (self.name,
45                                                      player.place.name)
46         else:
47             message = '/me disintegrates'
48        
49         if isinstance(player, NonPlayableCharacter):
50             player.trigger_event('on-self-leave')
51             self.npcs.remove(player)
52         else:
53             self.visitors.remove(player)
54            
55             # Send players and npcs unaivaibility to player
56             for npc in self.npcs:
57                 pres = Presence(node=npc.presence)
58                 pres.setType('unavailable')
59                 player.send_presence(npc.name, pres)
60             for visitor in self.visitors:
61                 if visitor is not player:
62                     pres = visitor.fix_presence()
63                     pres.setType('unavailable')
64                     player.send_presence(visitor.name, pres)
65        
66         # Broadcast player's unavailibility to all players in the room
67         self.broadcast_message(player.name, message)
68         self.broadcast_status(player, 'unavailable')
69        
70         # Trigger on-leave events
71         self.trigger_event('on-leave', player)
72    
73     def player_entered(self, player, old_place=None):
74         """
75         Broadcast avaibility of Player or NonPlayableCharacter,
76         Trigger on-enter events, append
77         Player/NonPlayableCharacter to the lists and send description
78         of the room to the Player.
79         """
80        
81         if old_place:
82             message = '/me enters in %s coming from %s' % (self.name,
83                                                       old_place.name)
84         else:
85             message = '/me spawns'
86        
87         # Broadcast player's availibility to all players in the room
88         self.broadcast_status(player)
89         self.broadcast_message(player.name, message)
90        
91         if isinstance(player, NonPlayableCharacter):
92             self.npcs.append(player)
93             player.trigger_event('on-self-enter')
94         else:
95             self.visitors.append(player)
96            
97             # Send players and npcs avaibility to player
98             for npc in self.npcs:
99                 player.send_presence(npc.name, npc.presence)
100             for visitor in self.visitors:
101                 if visitor is not player:
102                     pres = visitor.fix_presence()
103                     player.send_presence(visitor.name, pres)
104            
105             pres = player.fix_presence(to_self=True)
106             player.send_presence(player.name, pres)
107            
108             # Send description of the room
109             player.send_message(None, None,
110                                 '%s: %s' % (self.world.name,
111                                             self.name.capitalize()))
112             player.send_message(None,
113                             '\n******\n\n\n\n**********\n'
114                             'Entering %s\n**********'
115                             '\n\n%s\nYou can go %s.' % (self.name.capitalize(),
116                                                         self.description,
117                                                         ', '.join(self.exits.keys())))
118        
119         # Trigger on-enter events
120         self.trigger_event('on-enter', player)
121    
122     def trigger_event(self, event_type, actor):
123         """ Trigger event of type event_type for all things and npcs """
124         for npc in self.npcs:
125             if actor is not npc:
126                 npc.trigger_event(event_type, actor)
127         for thing in self.things:
128             thing.trigger_event(event_type, actor)
129            
130     def broadcast_status(self, player, status=None):
131         """ Broadcast a presence stanza in the room """
132         presence = player.fix_presence()
133         if status is not None:
134             presence.setType(status)
135         for visitor in self.visitors:
136             visitor.send_presence(player.name, presence)
137    
138     def broadcast_message(self, from_, message):
139         """ Broadcast a message in all visitors in the room """
140         for visitor in self.visitors:
141             visitor.send_message(from_, message)
142    
143
Note: See TracBrowser for help on using the browser.