#!/usr/bin/env ruby
# $Revision: 1.26 $
# $Date: 2003/12/06 18:12:08 $
# $Author: jefus, mikeman2 $

class System
	attr_accessor :server, :rooms, :skills, :commands, :passwd, :pidHash, :mobiles, :items, :progs
	
	# important pregame initialization; required files, skills, world population
	def System.start(port = 4000)
		System.Deps #Load needed files
		$system = System.new(port) #Load the system
		$system.initSkills #Load skills system
		$system.initRooms
		$system.initMobiles
		$system.initBackend #Initialize DRb backend
	end

	def System.Deps
		require "lib/logger" #Logging mechanism
		require "lib/ansify" #Text string ansification method
		require "lib/connection" #Handles incoming connections
		require "lib/server" #Guess what this does
		require "lib/ability" #Alternity-style abilities
		require "lib/dice" #Duh
		require "lib/skill" #Alternity-style skills
		require "lib/cfile" #MySQL configuration storage (requires newmain/mysql.dat db login info)
		require "lib/marshalsql" #Marshal into SQL db module
		require "lib/base" #Base object class
		require "lib/room" #Room class
		require "lib/mobile" #Mobile class
		require "lib/player" #Player class
		require "lib/item"
		require "lib/prog"
		require "lib/commands" #Command systems
		require "lib/backend" #DRb backend system (set ACLs in lib/backend.rb to restrict access)
		require "lib/crypt" #256 bit crypto (requires newmain/crypt.dat keyfile for corresponding db)
	end

	def initSkills
		armorOperation = Skill.new("armor operation", 7, "C", "str")
		combatArmor = Skill.new("combat armor", 3, "C", "str", true, armorOperation)
		poweredArmor = Skill.new("powered armor", 4, "C", "str", false, armorOperation)

		athletics = Skill.new("athletics", 3, "C", "str")
		climb = Skill.new("climb", 2, "", "str", true, athletics)
		jump = Skill.new("jump", 1, "", "str", true, athletics)
		throw_ = Skill.new("throw", 2, "", "str", true, athletics)
		Logger.log("Skills loaded.")
	end

	def initRooms
                roomlist = ['0', '1'] #replace with an autoloader
                roomlist.each{|rid| @rooms.store(rid, Room.new(rid)) }
		Logger.log("Rooms loaded.")
        end

	def initialize(port = 4000)
		@skills = []
		@commands = Commands.new #Prepare commands system
		@passwd = CFile.new("system:data:passwd")
		@pidHash = CFile.new("system:data:pid") #Load player ID hash
		@rooms = Hash.new
		@items = Array.new
		@mobiles = Array.new
		@progs = Progs.new
		#initRooms

		@server = Server.new(port) #Start listening for connections
		Logger.log("System loaded.")
	end

	def initMobiles
		@rooms.each{|rid, room|
			room.initMobiles
		}
		Logger.log("Mobiles loaded.")
	end

	def players #Array of connected players
		arr = []
		@server.connections.each {|conn| arr << conn.player if conn.player }
		return arr
	end

end