classless_mud 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +32 -0
  6. data/Rakefile +5 -0
  7. data/bin/classless_mud +11 -0
  8. data/classless_mud.gemspec +29 -0
  9. data/conf/settings.yml +4 -0
  10. data/lib/classless_mud.rb +72 -0
  11. data/lib/classless_mud/account_builder.rb +81 -0
  12. data/lib/classless_mud/character.rb +39 -0
  13. data/lib/classless_mud/character_sheet.rb +26 -0
  14. data/lib/classless_mud/character_sheet_builder.rb +72 -0
  15. data/lib/classless_mud/client.rb +47 -0
  16. data/lib/classless_mud/colorizer.rb +33 -0
  17. data/lib/classless_mud/commands.rb +32 -0
  18. data/lib/classless_mud/commands/admin/kick.rb +15 -0
  19. data/lib/classless_mud/commands/bad_command.rb +81 -0
  20. data/lib/classless_mud/commands/character.rb +9 -0
  21. data/lib/classless_mud/commands/chat.rb +14 -0
  22. data/lib/classless_mud/commands/commands.rb +31 -0
  23. data/lib/classless_mud/commands/dance.rb +20 -0
  24. data/lib/classless_mud/commands/eat.rb +26 -0
  25. data/lib/classless_mud/commands/get.rb +20 -0
  26. data/lib/classless_mud/commands/inventory.rb +12 -0
  27. data/lib/classless_mud/commands/look.rb +43 -0
  28. data/lib/classless_mud/commands/move.rb +16 -0
  29. data/lib/classless_mud/commands/quit.rb +16 -0
  30. data/lib/classless_mud/commands/say.rb +10 -0
  31. data/lib/classless_mud/commands/score.rb +12 -0
  32. data/lib/classless_mud/commands/whisper.rb +17 -0
  33. data/lib/classless_mud/commands/who.rb +9 -0
  34. data/lib/classless_mud/effect.rb +14 -0
  35. data/lib/classless_mud/exit.rb +15 -0
  36. data/lib/classless_mud/game.rb +40 -0
  37. data/lib/classless_mud/game_master.rb +12 -0
  38. data/lib/classless_mud/input_parser.rb +7 -0
  39. data/lib/classless_mud/item.rb +21 -0
  40. data/lib/classless_mud/npc.rb +12 -0
  41. data/lib/classless_mud/player.rb +57 -0
  42. data/lib/classless_mud/room.rb +60 -0
  43. data/lib/classless_mud/server.rb +18 -0
  44. data/lib/classless_mud/version.rb +3 -0
  45. data/lib/classless_mud/world.rb +26 -0
  46. data/tasks/db.rake +10 -0
  47. metadata +202 -0
@@ -0,0 +1,12 @@
1
+ module ClasslessMud
2
+ module Commands
3
+ class Score
4
+ extend ::ClasslessMud::Colorizer
5
+
6
+ def self.perform game, player, message
7
+ player.puts "You are level #{bright_yellow(player.level)}"
8
+ player.puts "You have #{bright_green(player.health)} (#{green(player.max_health)}) hit points"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,17 @@
1
+ module ClasslessMud
2
+ module Commands
3
+ CONNECTORS = ['to']
4
+ class Whisper
5
+ def self.perform game, player, message
6
+ _, target, *target_message = message.split(' ').reject { |word| CONNECTORS.include?(word.downcase) }
7
+ target_char = player.room.find_character target
8
+ if target_char.nil?
9
+ player.puts "You can't seem to find them here."
10
+ else
11
+ target_char.puts %[#{player.name} whispers, "#{target_message.join(' ')}"]
12
+ player.puts %[You whisper to #{target_char.name}, "#{target_message.join(' ')}"]
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module ClasslessMud
2
+ module Commands
3
+ class Who
4
+ def self.perform game, player, message
5
+ game.display_players player
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module ClasslessMud
2
+ class Effect
3
+ include DataMapper::Resource
4
+ property :id, Serial
5
+ property :description, String
6
+ property :health_modification, Integer, default: 0
7
+
8
+ def affect player
9
+ player.puts description
10
+ player.affect_health health_modification
11
+ player.save!
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module ClasslessMud
2
+ class Exit
3
+ DIRECTIONS = ['north', 'south', 'east', 'west', 'up', 'down']
4
+ include DataMapper::Resource
5
+ property :id, Serial
6
+ property :direction, String
7
+ belongs_to :source, 'Room', :key => true
8
+ belongs_to :target, 'Room', :key => true
9
+ validates_with_method :direction, :method => :case_insensitive_direction_check
10
+
11
+ def case_insensitive_direction_check
12
+ DIRECTIONS.include? self.direction.downcase
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ module ClasslessMud
2
+ class Game
3
+ attr_reader :players
4
+ attr_reader :settings
5
+
6
+ def initialize world, settings
7
+ @players = []
8
+ @world = world
9
+ @settings = settings
10
+ end
11
+
12
+ def add_player player
13
+ @players << player
14
+ @world.add_player player
15
+ starting_room.enter player
16
+ broadcast "#{player.name} has joined the game."
17
+ end
18
+
19
+ def starting_room
20
+ @world.starting_room
21
+ end
22
+
23
+ def remove_player player
24
+ @players.delete player
25
+ broadcast "#{player.name} has left the game."
26
+ end
27
+
28
+ def broadcast message
29
+ @world.handle_message message
30
+ end
31
+
32
+ def display_players player
33
+ player.puts <<EOS
34
+ Currently active players
35
+ ------------------------
36
+ #{@players.map(&:name).join("\n")}
37
+ EOS
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,12 @@
1
+ module ClasslessMud
2
+ class GameMaster
3
+ def self.setup_player player
4
+ player.health = player.max_health
5
+ end
6
+
7
+ def self.respawn_player player
8
+ player.health = player.max_health
9
+ player.respawn_room.enter player
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,7 @@
1
+ module ClasslessMud
2
+ class InputParser
3
+ def parse input
4
+ return input
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ module ClasslessMud
2
+ class Item
3
+ include DataMapper::Resource
4
+ property :id, Serial
5
+ property :type, Discriminator
6
+ property :name, String
7
+ property :short_description, String
8
+ property :keywords, String
9
+ property :edible, Boolean, default: false
10
+
11
+ has n, :effects
12
+
13
+ def edible?
14
+ edible
15
+ end
16
+
17
+ def affect player
18
+ effects.each { |effect| effect.affect(player) }
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ module ClasslessMud
2
+ class Npc
3
+ include DataMapper::Resource
4
+ include ClasslessMud::Character
5
+
6
+ def puts message
7
+ end
8
+
9
+ def puts_inline message
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,57 @@
1
+ module ClasslessMud
2
+ class Player
3
+ include DataMapper::Resource
4
+ include ClasslessMud::Character
5
+ property :password, DataMapper::Property::BCryptHash
6
+
7
+ def client= client
8
+ @client = client
9
+ end
10
+
11
+ def close_client
12
+ @game.remove_player self
13
+ @client.close_connection
14
+ end
15
+
16
+ def on &callback
17
+ @client.on &callback
18
+ end
19
+
20
+ def puts message
21
+ @client.puts message
22
+ end
23
+
24
+ def puts_inline message
25
+ @client.send_data message
26
+ end
27
+
28
+ def handle_message message
29
+ if message.empty?
30
+ # do nothing
31
+ else
32
+ Commands.parse(message).perform @game, self, message
33
+ end
34
+ end
35
+
36
+ def display_prompt
37
+ puts_inline "#{name} > "
38
+ end
39
+
40
+ def max_health
41
+ 10 * character_sheet.strength
42
+ end
43
+
44
+ def look
45
+ handle_message "look"
46
+ end
47
+
48
+ def die
49
+ self.puts "You dead. Respawning..."
50
+ GameMaster.respawn_player self
51
+ end
52
+
53
+ def respawn_room
54
+ @game.starting_room
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,60 @@
1
+ module ClasslessMud
2
+ class Room
3
+ include DataMapper::Resource
4
+ property :id, Serial
5
+ property :description, String
6
+ has n, :players
7
+ has n, :npcs
8
+ has n, :exits, :child_key => [ :source_id ]
9
+ has n, :connected_rooms, self, :through => :exits, :via => :target
10
+ has n, :items
11
+
12
+ def enter player
13
+ broadcast "#{player.name} entered the room"
14
+ self.players << player
15
+ player.look
16
+ end
17
+
18
+ def characters
19
+ npcs.to_a + players.to_a
20
+ end
21
+
22
+ def exit player
23
+ self.players.delete player
24
+ broadcast "#{player.name} left the room"
25
+ end
26
+
27
+ def broadcast message
28
+ self.players.each do |occupant|
29
+ occupant.puts message
30
+ end
31
+ end
32
+
33
+ def broadcast_say from, message
34
+ self.players.each do |player|
35
+ if player == from
36
+ player.puts "You say '#{message}'"
37
+ else
38
+ player.puts "#{from.name} says '#{message}'"
39
+ end
40
+ end
41
+ end
42
+
43
+ def handle_message message
44
+ broadcast message
45
+ end
46
+
47
+ def find keywords
48
+ keywords_array = keywords.split
49
+ items.detect do |item|
50
+ (item.keywords.split & keywords_array).any?
51
+ end
52
+ end
53
+
54
+ def find_character keyword
55
+ characters.detect do |character|
56
+ character.name.include? keyword
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,18 @@
1
+ module ClasslessMud
2
+ class Server
3
+ def initialize port, game
4
+ @port = port
5
+ @game = game
6
+ end
7
+
8
+ def start
9
+ @signature = EventMachine.start_server('0.0.0.0', @port, ::ClasslessMud::Client) do |client|
10
+ client.start @game
11
+ end
12
+ end
13
+
14
+ def stop
15
+ EventMachine.stop_server(@signature)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module ClasslessMud
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,26 @@
1
+ module ClasslessMud
2
+ class World
3
+ def initialize rooms
4
+ @players = []
5
+ @rooms = rooms
6
+ end
7
+
8
+ def add_player player
9
+ @players << player
10
+ end
11
+
12
+ def starting_room
13
+ @rooms[0]
14
+ end
15
+
16
+ def handle_message message
17
+ broadcast message
18
+ end
19
+
20
+ def broadcast message
21
+ @rooms.each do |room|
22
+ room.handle_message message
23
+ end
24
+ end
25
+ end
26
+ end
data/tasks/db.rake ADDED
@@ -0,0 +1,10 @@
1
+ require 'dm-migrations'
2
+ require_relative '../lib/classless_mud'
3
+
4
+ namespace :db do
5
+ desc 'Sets up the sqlite database with needed migrations from the data model'
6
+ task :setup do
7
+ ClasslessMud.setup_db!
8
+ DataMapper.auto_upgrade!
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,202 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: classless_mud
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Patrick McFadden
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-01-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: eventmachine
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: datamapper
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: dm-sqlite-adapter
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: dm-postgres-adapter
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Run your own server
126
+ email:
127
+ - pemcfadden@gmail.com
128
+ executables:
129
+ - classless_mud
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - .gitignore
134
+ - Gemfile
135
+ - LICENSE.txt
136
+ - README.md
137
+ - Rakefile
138
+ - bin/classless_mud
139
+ - classless_mud.gemspec
140
+ - conf/settings.yml
141
+ - lib/classless_mud.rb
142
+ - lib/classless_mud/account_builder.rb
143
+ - lib/classless_mud/character.rb
144
+ - lib/classless_mud/character_sheet.rb
145
+ - lib/classless_mud/character_sheet_builder.rb
146
+ - lib/classless_mud/client.rb
147
+ - lib/classless_mud/colorizer.rb
148
+ - lib/classless_mud/commands.rb
149
+ - lib/classless_mud/commands/admin/kick.rb
150
+ - lib/classless_mud/commands/bad_command.rb
151
+ - lib/classless_mud/commands/character.rb
152
+ - lib/classless_mud/commands/chat.rb
153
+ - lib/classless_mud/commands/commands.rb
154
+ - lib/classless_mud/commands/dance.rb
155
+ - lib/classless_mud/commands/eat.rb
156
+ - lib/classless_mud/commands/get.rb
157
+ - lib/classless_mud/commands/inventory.rb
158
+ - lib/classless_mud/commands/look.rb
159
+ - lib/classless_mud/commands/move.rb
160
+ - lib/classless_mud/commands/quit.rb
161
+ - lib/classless_mud/commands/say.rb
162
+ - lib/classless_mud/commands/score.rb
163
+ - lib/classless_mud/commands/whisper.rb
164
+ - lib/classless_mud/commands/who.rb
165
+ - lib/classless_mud/effect.rb
166
+ - lib/classless_mud/exit.rb
167
+ - lib/classless_mud/game.rb
168
+ - lib/classless_mud/game_master.rb
169
+ - lib/classless_mud/input_parser.rb
170
+ - lib/classless_mud/item.rb
171
+ - lib/classless_mud/npc.rb
172
+ - lib/classless_mud/player.rb
173
+ - lib/classless_mud/room.rb
174
+ - lib/classless_mud/server.rb
175
+ - lib/classless_mud/version.rb
176
+ - lib/classless_mud/world.rb
177
+ - tasks/db.rake
178
+ homepage: ''
179
+ licenses:
180
+ - MIT
181
+ metadata: {}
182
+ post_install_message:
183
+ rdoc_options: []
184
+ require_paths:
185
+ - lib
186
+ required_ruby_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - '>='
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ required_rubygems_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - '>='
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ requirements: []
197
+ rubyforge_project:
198
+ rubygems_version: 2.0.14
199
+ signing_key:
200
+ specification_version: 4
201
+ summary: Simple Mud Server
202
+ test_files: []