#
# RocketMUD was written by Jon Lambert, 2006.
# It is based on SocketMUD(tm) written by Brian Graversen.
# This code is released to the public domain.
#
class Mobile
attr_accessor :socket, :events, :name, :password, :level
def initialize
# use conditional initialization
@socket ||= nil
@events ||= []
@name ||= nil
@password ||= nil
@level ||= LEVEL_PLAYER
end
public :initialize # make it public so we can call it after YAML load
def is_admin?
@level > LEVEL_PLAYER ? true : false
end
def to_yaml_properties
['@name', '@password', '@level']
end
#
# Text_to_mobile()
#
# If the mobile has a socket, then the data will
# be send to text_to_buffer().
def text_to_mobile txt
if @socket
@socket.text_to_buffer txt
@socket.bust_prompt = true
end
end
def free_mobile
$dmobile_list.delete self
@socket.player = nil if @socket
@events.each {|e| e.dequeue_event}
end
# function :: event_isset?
# arguments :: the type of event
#
# This function checks to see if a given type of event is enqueued/attached
# to the mobile, and if it is, it will return a pointer to this event.
def event_isset? type
@events.each do |event|
if event.type == type
return event
end
end
return nil
end
# function :: strip_event
# arguments :: the type of event
#
# This function will dequeue all events of a given type from the mobile.
def strip_event type
@events.each do |event|
if event.type == type
event.dequeue_event
end
end
end
# function :: add_event
# arguments :: the event and the delay
#
# This function attaches an event to a mobile, and sets all the correct
# values, and makes sure it is enqueued into the event queue.
def add_event event, delay
# check to see if the event has a type
if event.type == :event_none
bug "add_event: no type."
return
end
# check to see of the event has a callback function
if event.fun == nil
bug "add_event: event type %d has no callback function.", event.type
return
end
# set the correct variables for this event
event.ownertype = :event_owner_dmob
event.owner = self
# attach the event to the mobiles local list
@events << event
# attempt to enqueue the event
if enqueue_event(event, delay) == false
bug "add_event: event type %d failed to be enqueued.", event.type
end
end
# commands follow
def cmd_say arg
if arg == ''
text_to_mobile "Say what?\r\n"
return
end
communicate self, arg, :comm_local
end
def cmd_quit arg
# log the attempt
log_string sprintf("%s has left the game.", @name)
save_player self
@socket.player = nil
free_mobile
@socket.close_socket false
end
def cmd_shutdown arg
$shut_down = true
end
def cmd_commands arg
col = 0
buf = sprintf " - - - - ----==== The full command list ====---- - - - -\r\n\r\n"
$tabCmd.each do |c|
next if @level < c.level
buf << sprintf(" %-16.16s", c.cmd_name)
col += 1
buf << "\r\n" if col % 4 == 0
end
buf << "\r\n" if col % 4 > 0
text_to_mobile buf
end
def cmd_who arg
buf = " - - - - ----==== Who's Online ====---- - - - -\r\n"
$dsock_list.each do |dsock|
next if dsock.state != :state_playing
xMob = dsock.player
next if xMob == nil
buf << sprintf(" %-12s %s\r\n", xMob.name, dsock.hostname)
end
buf << " - - - - ----======================---- - - - -\r\n"
text_to_mobile buf
end
def cmd_help arg
if arg == ''
col = 0
buf = " - - - - - ----====//// HELP FILES \\\\\\\\====---- - - - - -\r\n\r\n"
$help_list.each do |pHelp|
buf << sprintf(" %-19.18s", pHelp.keyword)
col += 1
buf << "\r\n" if col % 4 == 0
end
buf << "\r\n" if col % 4 != 0
buf << "\r\n Syntax: help <topic>\r\n"
text_to_mobile buf
return;
end
if !check_help self, arg
text_to_mobile "Sorry, no such helpfile.\r\n"
end
end
def cmd_save arg
save_player self
text_to_mobile "Saved.\r\n"
end
def cmd_linkdead arg
found = false
$dmobile_list.each do |xMob|
if xMob.socket.nil?
text_to_mobile sprintf("%s is linkdead.\r\n", xMob.name)
found = true
end
end
if !found
text_to_mobile "Noone is currently linkdead.\r\n"
end
end
end