classless_mud 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []