package {
	import flash.utils.Timer;
	import flash.events.TimerEvent;
	import flash.events.MouseEvent;
	
	public class Reguladora {
		// Propriedades
		public static const DIREITO:String = "direito";
		public static const CONTINENTE:String = "continente";
		public static const TROCA:String = "troca";
		public static const TROCA2:String = "troca2";
		public static const ATACAR:String = "atacar";
		public static const MOVER:String = "mover";
		public static var velocidade:Number = 1.5;
		public static var vez:Jogador;
		public static var ativo:Jogador;
		public static var troca:int;
		public static var sala:String;
		public static var etapa:String;
		public static var pausa:Function;
		public static var ganhador:Jogador;
		public static var inicio:Number;
		public static var recorde:int;
		public static var nicks:Array = ["Kacius",
"ponpeu",
"Mamona",
"JalesBrou",
"padua",
"Vinicius",
"sagaiz",
"vivi1234",
"leopardo",
"Ixidor",
"Myla",
"Turu",
"JANA",
"poderosochefao",
"Skar",
"Flavi",
"Bradok",
"lafer",
"ADRIANOW",
"Flecha",
"soda",
"david",
"sonnic",
"xuxa",
"IMPERADOR",
"lolk",
"cristicobain",
"RicSperoto",
"henrik",
"clertonjt",
"phantom",
"silverfox",
"VikaMalt595",
"lebromel",
"Marcozzy",
"costarico",
"pola",
"work",
"Deh",
"leozinelas",
"mmso",
"lulten",
"Ares",
"Pricyla",
"jjaydyerd",
"laroceriee",
"Amorim",
"weslin",
"Tick13",
"willtech",
"Ratones",
"aleectba",
"murilo157",
"Gus",
"Ic3MaN",
"manoviski",
"rello",
"aquiless",
"valmir",
"sytler",
"Mavi",
"Aminoacida",
"gogogo",
"thigotere",
"juninhouba",
"Lara",
"fredy",
"nynynha",
"kennimy",
"Vera",
"conkias",
"hikio",
"ovidios",
"Snow",
"conansoldier",
"nustraw",
"berzek",
"Tuor",
"bels",
"Shion",
"Diego88",
"Grazy",
"hawasakigirl",
"Dan",
"imeiunlocku",
"Nicodemo",
"luck3001",
"Platoonx",
"JumentoRules",
"shasha",
"carrascao",
"Nanaax",
"StylE",
"ujoker",
"malkaviano",
"Infantaria",
"destroyerr",
"Dheimos",
"caixa",
"solo",
"Caldana",
"pattynit",
"Erutan",
"erickson",
"deadpool",
"luiz",
"bara",
"lidersupremo",
"RebekkaWillinger",
"JefRambo",
"rain",
"Otaa",
"Adiel",
"nathy",
"Sargento",
"regisslim",
"carcamano",
"BMDC1987ligalaize",
"eterno",
"milaromani",
"joaojonny",
"colonell",
"Dadona",
"lidoinsok",
"luuh",
"goya",
"zyldor",
"pekenamah",
"tikuna",
"maskara",
"alanroots",
"BomberxP",
"mmendes",
"xrumerZittenodraire",
"mikescofield",
"XuViSQuiNhu",
"yurisalles",
"JonSoaJP",
"Bombinho",
"TOTOIM",
"Luizinho",
"gabriella",
"guigzp",
"andrepg",
"forrestgump",
"Ari",
"hiagosk8",
"TravelCluby",
"Soldado",
"andrecrvg",
"Ezra",
"Comodoro",
"mymi",
"lnbremmm",
"commando",
"Csmtlokoo",
"cesinha1988",
"totenkopf7",
"norminha92",
"Artur",
"cabezadevaca",
"Maphalda",
"fernandoasb",
"Qannas",
"kioske",
"Viking",
"guerrero",
"robew",
"sorrisooo",
"brandao93",
"belbartira",
"Pebabakes",
"ediney",
"Estragabof",
"marcelorocha",
"racucha",
"DivalaIressa",
"RodrigoCDU",
"fumegante",
"Cozer",
"ngdfds3hpec",
"Lufttwaffe",
"fifon",
"mklosn",
"lenon",
"MitchellHill",
"CS9",
"vivi",
"Rozenbaum",
"Razor",
"degen",
"tornado",
"karlota",
"fgsmed",
"ICEBURN",
"Mays",
"marechal",
"sgol",
"jbbrando",
"babau",
"Atila",
"WilliamEx",
"andrekm",
"Kirug",
"skynelo",
"Priamus",
"juniorxd",
"hotbit",
"luluzinha157",
"Thor",
"Jales",
"areadarky",
"Kvothe",
"cokeiro",
"Symeth",
"Fumela",
"milliciano",
"terminator",
"rambo",
"huel",
"Deboer",
"muller",
"canibalzin",
"Razhel",
"Matuza",
"TIAMAT",
"fatalitysix",
"arselbach",
"mayerhofer",
"cenora",
"Erickiinhoo",
"Marshall",
"edercorrea",
"kelevra",
"Dugalinha",
"Nicolalau",
"Sandrosd",
"seaway",
"Kane",
"LFK52",
"espantalho",
"lider1988",
"ATRick",
"corrosiva",
"ninho",
"Kammi",
"Bury",
"sownray",
"RedLabel",
"eruccubpale",
"Uthar",
"bastos",
"clacarnog",
"salamao",
"Tareewepcax",
"herick",
"Brigadiano",
"Patrick",
"nilton",
"vegetex",
"Chulina",
"inviniugh",
"falcom",
"intbr",
"dobonfa",
"UlyssesVilela",
"ligeirinho",
"ErickzinnH",
"sierradelta",
"F16Viper",
"machida",
"feeca",
"pablo",
"lica",
"Fazoor",
"boykachambers",
"dropezin",
"paulom500",
"readyzaum",
"gauluddila",
"ALMaster",
"cegevex",
"brunonolasco",
"Reathehup",
"HANKBR",
"Rtype",
"Moscardi",
"butterflyvv",
"ricopetrone",
"HWJohny",
"bucha13",
"CocoChanels",
"Belenus",
"sued",
"Mitaskylove",
"possa",
"Acsaram",
"saopaulo",
"vithor",
"pam",
"khcmoreale",
"Manuel",
"DOCTOR",
"fabianotp",
"LeonardoChampion",
"kadaaj10",
"Granada",
"reidoewar",
"UMMA",
"FINROD",
"Espanhol",
"Sirgus",
"caramba",
"babado",
"daniliminha",
"brustolini",
"ervacidreira",
"bentrolo",
"Picole",
"denzel",
"Edu22",
"Murilo",
"DarKFoX",
"sitegui",
"Bruna",
"Cidelmar",
"Leojarts",
"obiwankinobi",
"salgado84",
"Josie",
"Danga",
"Mitchel",
"wlisabethfitzgeraldq",
"Tymnplaymnnus",
"Jefferson",
"Masoquista",
"oretorno",
"cha",
"akinnis",
"Steffens93",
"shayera",
"Thomasmf",
"jocneto84",
"patrickj",
"Berilo",
"notreve",
"WorArt",
"MAtAdormAtuto",
"goodwar",
"Dedezim",
"MarceloPorto",
"xXIGORXx",
"igordrums",
"neereelty",
"tutuh",
"dafreitas007",
"fetichegirl",
"pituco",
"Danieggs",
"petty",
"JHESSY",
"kratos",
"kayobuba",
"jorgesport",
"corvello",
"caiof",
"nickgf",
"gutoaraujo",
"Mathh",
"chiara",
"Roque",
"sdedee",
"Donanfer",
"Pradeka",
"Coelho",
"BomRJ",
"Kaled",
"Bartz",
"Odnek",
"rusco",
"gutevesque",
"Kamikazes",
"rickrj",
"Sergyn123",
"Caique03",
"apply",
"chinazz",
"FELIX",
"Viajada",
"avelarr",
"lucianarn",
"KaKo",
"paparazzi",
"xangi",
"JekkemeevKq",
"dancer",
"natashaomp",
"JLRocha",
"MichaelIF",
"Nissin",
"Anarckos",
"liriotubbo",
"Renato",
"pedrosenra",
"rodx",
"atirador037",
"Wiselord",
"Dalkas",
"DaaarkxD",
"Rafiza",
"luizvictorio",
"aotd",
"femendes",
"Carlinzin",
"smwar",
"kid123",
"lukao",
"pvflu",
"marezim",
"hilario",
"Acerolinha",
"Clari",
"farrapo",
"andrew",
"juansales",
"nayka",
"drumskenedy",
"lucasmbz",
"bruninho",
"zeusgrego",
"bruno",
"italia",
"Xibanka",
"Warfat",
"panthro",
"bbb9",
"Ivan",
"patrickb2",
"Gerley",
"Dudinka",
"DestruidorSP",
"LUZ",
"warman",
"fifiuzim",
"gcmurilo",
"rodrigofbi",
"BinLadden",
"MephistoRed",
"wakash",
"mikaius",
"skazi",
"Caique",
"Cado",
"luizf",
"jgtserrinha",
"Mugen",
"Sonio",
"Schindler",
"fighter",
"Azriel",
"MAcaCOPREGO",
"anjo",
"arthemis",
"Rafa",
"luke",
"4RM4G3D0M",
"daigo",
"mussolini",
"Yosei",
"stacyapell",
"sk8men59",
"lucas0000",
"Pata",
"falcoantius",
"vivian",
"Bandida",
"mozinho",
"WillyDeath",
"chacal",
"seniordmuba",
"Smerecky",
"FernandoNess",
"net10",
"marco",
"LuNaTiCo",
"ThiagoSS",
"TheHawk",
"DS9",
"terciosolon",
"motumbo",
"abiblerve",
"Campos",
"kimbauer",
"ingrid",
"FouLs",
"dudumeduerj",
"diogorurique",
"NoBlood",
"wanks",
"Teko",
"saulolima",
"zeus",
"Alcoolatra",
"LordFriD",
"Malinos",
"panela",
"Baurock",
"consultora",
"Darkforever",
"fadrique",
"manguito",
"laka",
"Azarrel",
"WillieFox",
"Trogdor",
"lucasg3",
"suleta",
"Gera",
"general",
"Tom",
"Claudiopm",
"AdaM",
"Kropotkin",
"leonardo123",
"MCYBIS",
"luizinhobass",
"lemuria",
"Alegria",
"vampira",
"edugenes",
"drif",
"Fenix1978",
"Tobehovemop",
"mandrack",
"sorriso",
"liw",
"Meyer",
"rafpires",
"JulioxD",
"rogerinho",
"akillys",
"querujones28",
"gnomo23",
"HQLancos",
"beN",
"MaCuMbA",
"Xerox",
"Tiane",
"Ela",
"luan",
"redbeard",
"Doris",
"Gordo",
"Coatlyaffinia",
"scectudge",
"drigoo",
"reichsfurer",
"Lesktop",
"Buzinelson",
"gasparzin",
"alxs1326",
"Zidanilo",
"gpappen",
"neotron89",
"junior13",
"Favisk",
"luispaulo",
"John",
"ozama",
"cenna",
"barco",
"elfosred",
"ahmad",
"viiictor",
"Derico",
"GuilhermeDutra",
"NicoSafroic",
"luanziin",
"Hiram",
"severo",
"guardians",
"myncUnsono",
"bezerra",
"mormuz",
"pazzo",
"leandro28",
"Tito",
"RaptorOne",
"fann",
"Deran",
"Hitler666",
"voltaire",
"Soldadoreal",
"kriuleby",
"patriot",
"Ruflys",
"hodoo",
"moha",
"DANGER",
"bacteria",
"neto",
"broa",
"pipino",
"mck",
"iron",
"atilasnn",
"xburnx",
"Radamanthy",
"Arkeman",
"ingaglia",
"magricela",
"KratosBR",
"TravelPre",
"Bizu",
"elikezia",
"Satangoss2",
"007igor",
"Thack",
"brunovinni",
"fogler",
"duduproide",
"gualther",
"BruninhoS",
"jogador",
"Zetsu",
"Coruja",
"SrPinguim",
"LUA",
"Lorde",
"anarki",
"Sabotagem",
"brscaca",
"kidcris",
"strider84",
"MaiEGuis",
"jeanhappy",
"Bunker",
"soulmaster",
"Geliainsafe",
"leoshamanista",
"saiadin",
"ericpi83",
"VelminovC",
"msmosso",
"Orixars",
"Raphaell",
"pimenta",
"MuH",
"jzmcav",
"Winchester",
"srkiller",
"inckot",
"Churchil",
"Fael",
"matadooooooo",
"hyoga",
"andreh",
"Rafex",
"lauriberto",
"dochannibal",
"Gladiador",
"soumaluco",
"mformer",
"extremedream",
"IrinejcEo",
"toninhowar",
"capinha",
"cfdisk",
"CARLAMS",
"Okami",
"raul593",
"FETIGA",
"joabyoma",
"llazaruss",
"nickolas",
"oghati",
"gutoaraujoo",
"Evil",
"gepeta",
"Guin",
"Tchelo",
"superstarla",
"MBRIOS",
"anafazza",
"sidneicalifa",
"GRRAAWe",
"new",
"Marrih",
"luna",
"bruninhah",
"7saias",
"mangaba",
"Peixe",
"EdMoita",
"Brainvader",
"kanyenke",
"GuiPerasi",
"reinatinhu",
"peterpann",
"BrenoCMA",
"SilentWar",
"Emuppyamegree",
"MURZA",
"Celinha",
"Vick",
"renatosatelete",
"Kytxas",
"fisicman",
"patativa",
"Oliveirafn",
"Guina",
"milkeeee63",
"cristian",
"Ocean",
"Ernani",
"milatrop",
"luizim",
"Giom",
"ATanekok",
"lels",
"Luphas",
"SpiGe",
"carnificinatattoo",
"Paulinhocorleone",
"Alemoa",
"nixica",
"darkangel",
"dusEffoms",
"Skcud",
"Dreak",
"jzm",
"ray",
"fcsiqueira",
"iggblog",
"SilverEyes",
"Campones",
"superdarlan",
"bozinho",
"Meinha",
"kaue",
"Blitzkrieg",
"xPipoca",
"tenma",
"madman",
"Vingador",
"ricardors",
"azuro",
"guilhermefjg",
"Helinho",
"RobinHood",
"Nathan",
"conveyelel",
"lucasss",
"ggbbcc",
"ticky",
"meduzao",
"perversoo",
"chong",
"ARTMDC",
"Murasaki",
"marcinhu",
"okitorio",
"AsbestosManzwf42",
"djissao",
"repetir",
"larocerie",
"Iama",
"LibaneZ",
"rafaelvelemem",
"Pepperoni",
"ruts",
"susuke",
"dragon",
"marbioli",
"anubistanato",
"lulacda",
"OlyaAsia",
"Volkers",
"legend",
"Ocean07",
"Cris",
"Sabine",
"Landser",
"diogoo",
"saore",
"DaveNualove",
"kadu",
"Thiiago",
"Anjinho",
"rick",
"kakasalvador",
"patroclo",
"Nielzinho",
"ImperadorIII",
"mkomacs",
"Fiuza",
"myymario",
"Valer",
"Presunto",
"phillipe",
"JonatanBR",
"predator",
"vingativo",
"Rennanlouko",
"brenno21",
"tamandare",
"arcantus",
"nicholas",
"Maximina",
"ulcewayuplill",
"LucasRj",
"coringa",
"OdyceuS",
"ZicoFla",
"LaysOliveira",
"akilles",
"Cambruzzi",
"Take",
"vwgomes",
"etromaus",
"neverchanges",
"Fialho",
"Gleyson",
"Fefaum",
"luclins",
"PeenedTom",
"mirage",
"frncs",
"tuppyDenue",
"tfnicolau",
"CamusdeAquario",
"dieguitoo",
"goc",
"renancouto",
"louis",
"japaxina",
"frbfla",
"Jimitri",
"jjodiegreerl",
"NobodyX",
"sambarilovi",
"orbek",
"Navegador68",
"amor",
"Fabinho",
"derfregis",
"kranrf",
"stauffenberg",
"dead",
"makluc",
"bgomiero",
"Kusttin",
"Anjodomal",
"forumComrad",
"Sakura",
"Johann",
"kratos31",
"Rharu",
"nazatel",
"valmiki9d",
"anysiofilho",
"Dandanxxz",
"hatamaruk",
"Psi18",
"brainrj",
"girafales",
"Cavas",
"DiguitoLL",
"Roni",
"nesse",
"GDR",
"Chesler",
"Rav3",
"Disturbed",
"SUPERMAN",
"VINCENZO",
"felipesp",
"ReKEmenteeLes",
"Ediano",
"eveldKema",
"ThallisFeu",
"Mazzurbaf",
"aldegunda",
"erickcam",
"Flash",
"Advertext",
"buttman",
"Bronco",
"Jeffrey",
"mecadorian",
"phermes",
"brasileirobra",
"Petros",
"LHGS",
"yagodavp",
"Peruano",
"eujunior",
"DanilloxD",
"vivo",
"mariff",
"homer",
"rafaelteen",
"CHUTEDECOBRA",
"ls2p",
"tal1661",
"freddy",
"MarcoM",
"j4mb0re",
"Gildeon",
"Ciane",
"caio32000",
"sdchicao",
"infantariabr",
"Veshhh",
"matador",
"escaravelho",
"Killer",
"mariana",
"Gabriel93",
"mistureba",
"aragornalpha",
"diegobautz",
"loco",
"war777",
"Nahan",
"albertein",
"torremo",
"acer2009",
"stiletto",
"Hermano2",
"lipemnz",
"seliga",
"Stardust",
"Spriter",
"codorna",
"Zeitgeist",
"vcrash",
"Cripto",
"ZdelonO",
"babelake",
"renatop",
"Poof",
"Luis07",
"hagendemerak",
"shemyaza",
"everton",
"kamiikaze",
"Canuto",
"zurufa",
"Christopher",
"OffivyAlkalay",
"Delmiro",
"linkoni",
"Peloboy",
"airtractor",
"boinapreta",
"Vasoxianamn",
"Empalador",
"WestXD",
"matanzahd",
"hustuklig",
"steferson",
"HadesGU",
"sequelado",
"Janis",
"Guarlitro",
"santana",
"Hidan",
"TigerD",
"serginho",
"juh",
"Beggar",
"Vanessa",
"Scofield",
"breaks",
"nando",
"CaioAugustoRN",
"marcio12",
"MANTA",
"LiiH",
"elmatadorrr",
"rhiakuna",
"xsniper",
"smitoubdipism",
"MacabrosMax",
"rodrigobelladona",
"CabaLegal",
"Laio",
"dingomg",
"Rugal",
"kstanleywatersoni",
"Sarinha",
"Robinho"];
		public static var backup:Object;
		public static var alvo_edicao:Territorio;
		public static var jog_alvo_edicao:Jogador;

		// Inicia o jogo: sorteia os territórios e os objetivos
		// Se jogar for false então não inicia o jogo
		public static function iniciar_jogo(jogar:Boolean=true):void {
			var i:String, obj:Objetivo, ativos:Array = [], j:int, terras:Array = [];
			
			// Retira todos as relações anteriores e zera os contadores
			Relacao.eliminar_relacoes(Relacao.OBJETIVO);
			Relacao.eliminar_relacoes(Relacao.DONO);
			Relacao.eliminar_relacoes(Relacao.CARTA);
			troca = 1;
			sala = Grafica.salas[Math.floor(Math.random()*Grafica.salas.length)];
			etapa = DIREITO;
			pausa = null;
			ganhador = null;
			inicio = (new Date()).time;
			recorde = 0;
			
			// Distribui os objetivos e pega os jogadores ativos
			for (i in Grafica.jogadores) {
				Grafica.jogadores[i].perdas = [0, 0, 0, 0, 0, 0];
				Grafica.jogadores[i].rodada = 1;
				Grafica.jogadores[i].ganhou_carta = false;
				Grafica.jogadores[i].ultima_carta = null;
				Grafica.jogadores[i].porcem = 0;
				Grafica.jogadores[i].recorde = 0;
				do {
					obj = Grafica.objetivos[Math.floor(Math.random()*Grafica.objetivos.length)];
				} while (Relacao.get_relacoes(obj, Relacao.OBJETIVO).length != 0 || (obj.id<8 && !Grafica.jogadores[obj.id-2].jogou));
				Relacao.relacionar(Grafica.jogadores[i], obj, Relacao.OBJETIVO);
				
				if (Grafica.jogadores[i].jogou) {
					Grafica.jogadores[i].ativo = true;
					ativos.push(Grafica.jogadores[i]);
				}
			}
			
			// Caso sejam só 2 jogadores cada um tem o objetivo de destruir o outro
			if (ativos.length == 2) {
				Relacao.desrelacionar(ativos[0], Relacao.get_relacao(ativos[0], Relacao.OBJETIVO), Relacao.OBJETIVO);
				Relacao.desrelacionar(ativos[1], Relacao.get_relacao(ativos[1], Relacao.OBJETIVO), Relacao.OBJETIVO);
				Relacao.relacionar(ativos[0], Grafica.objetivos[ativos[1].id-1], Relacao.OBJETIVO);
				Relacao.relacionar(ativos[1], Grafica.objetivos[ativos[0].id-1], Relacao.OBJETIVO);
			}
			
			// Monta uma array com os territórios em ordem aleatória
			for (i in Grafica.territorios) {
				Grafica.territorios[i].soldados = 1;
				terras.push({"rand" : Math.random(), "terra" : Grafica.territorios[i]});
			}
			terras.sortOn("rand", Array.NUMERIC);
			
			// Escolhe por qual jogador começar a distribuição e a faz
			j = Math.floor(Math.random()*ativos.length);
			for (i in terras) {
				Relacao.relacionar(terras[i]["terra"], ativos[j], Relacao.DONO);
				Grafica.atualizar_territorio(terras[i]["terra"]);
				j = (j+1)%ativos.length;
			}
			
			// A vez é em quem parou a distribuição
			vez = ativos[j];
			
			// Pega o próximo jogador humano
			ativo = get_prox_humano();
			Grafica.campos_estaticos();
			Grafica.campos_jogador();
			Grafica.campos_gerais();
			
			if (jogar) {
				// Começa a partida
				if (vez.humano) {
					(new SomSuaVez).play();
				}
				// Temporário
				if (!vez.humano) {
					Inteligente.colocar();
				} else {
					Usuario.colocar();
				}
			}
		}
		
		// Configura um novo jogo rapidamente a partir da dificuldade escolhida
		public static function jogar_agora(cor:int, num_ad:int, nivel:Number):void {
			var i:String, j:int, jog:Jogador;
			
			// Reseta algumas configurações e define outras com base no nível
			for (i in Grafica.jogadores) {
				Grafica.jogadores[i].nome = get_nick();
				Grafica.jogadores[i].ativo = false;
				Grafica.jogadores[i].jogou = false;
				Grafica.jogadores[i].humano = false;
				Grafica.jogadores[i].agressividade = nivel/2+1/4;
				Grafica.jogadores[i].objetividade = nivel+1/2;
				Grafica.jogadores[i].sorte = nivel-1/2;
			}
			
			// Configura o jogador humano
			Grafica.jogadores[cor-1].nome = "Você";
			Grafica.jogadores[cor-1].ativo = true;
			Grafica.jogadores[cor-1].jogou = true;
			Grafica.jogadores[cor-1].humano = true;
			Grafica.jogadores[cor-1].sorte = 0;
			
			// Escolhe os outros jogadores
			for (j=0; j<num_ad; j++) {
				do {
					jog = Grafica.jogadores[Math.floor(Math.random()*Grafica.jogadores.length)];
				} while (jog.ativo);
				jog.ativo = true;
				jog.jogou = true;
			}
			
			// Inicia o jogo
			iniciar_jogo();
		}
		
		// Pega o próximo jogador humano. Usado para saber qual jogador a interface vai representar
		public static function get_prox_humano():Jogador {
			var i:String, ini:int, j:int;
			
			// Pega o jogador atual
			for (i in Grafica.jogadores) {
				if (Grafica.jogadores[i] === vez) {
					ini = int(i);
					break;
				}
			}
			
			// Encontra a resposta
			for (j=0; j<Grafica.jogadores.length; j++) {
				if (Grafica.jogadores[(ini+j)%Grafica.jogadores.length].jogou && Grafica.jogadores[(ini+j)%Grafica.jogadores.length].humano) {
					return Grafica.jogadores[(ini+j)%Grafica.jogadores.length];
				}
			}
			
			// Nenhum encontrado
			return null;
		}
		
		// Pega o próximo jogador ativo
		public static function get_prox_jogador():Jogador {
			var i:String, ini:int, j:int;
			
			// Pega o jogador atual
			for (i in Grafica.jogadores) {
				if (Grafica.jogadores[i] === vez) {
					ini = int(i);
					break;
				}
			}
			
			// Encontra a resposta
			for (j=1; j<=Grafica.jogadores.length; j++) {
				if (Grafica.jogadores[(ini+j)%Grafica.jogadores.length].ativo) {
					return Grafica.jogadores[(ini+j)%Grafica.jogadores.length];
				}
			}
			
			// Nenhum encontrado
			return null;
		}
		
		// Retorna o número de soldados que o jogador da vez tem direito
		public static function calcular_direito():int {
			return Math.max(Math.floor(Relacao.get_relacoes(vez, Relacao.DONO).length/2), 3);
		}
		
		// Retorna o número de soldados que o jogador da vez tem direito em cada continente
		public static function calcular_continentes():Array {
			var r:Array = [], i:String;
			for (i in Grafica.continentes) {
				r[i] = (Grafica.continentes[i].get_num(vez)==Grafica.continentes[i].get_max()) ? Grafica.continentes[i].bonus : 0;
			}
			return r;
		}
		
		// Escolhe um dos itens da 2ª Array baseado nas probabilidades correspondentes na 1ª
		public static function escolher(probs:Array, itens:Object):* {
			var soma:Number = 0, i:String, rand:Number;
			
			// Soma as probabilidades
			for (i in probs) {
				soma += probs[i];
			}
			
			// Sorteio um número entre 0 e soma
			rand = Math.random()*soma;
			
			// Encontra o objeto escolhido e o retorna
			soma = 0;
			for (i in probs) {
				soma += probs[i];
				if (rand<soma) {
					return itens[i];
				}
			}
		}
		
		// Finaliza essa etapa
		public static function finalizar_etapa():void {
			var i:String;
			
			// Elimina os efeitos gráficos
			Grafica.atualizar_territorios();
			Grafica.root.bt_jogue_por_mim.visible = false;
			
			if (Usuario.jogando_por_mim) {
				// Volta o controle para o usuário
				Usuario.jogando_por_mim = false;
				vez.humano = true;
			}
			
			// Verifica se o jogo não foi pausado
			if (etapa != DIREITO && etapa != TROCA && pausa !== null) {
				timeout(pausa, 100, false);
				pausa = null;
				return;
			}
			
			// Verifica se houve algum ganhador
			if (!ganhador) {
				verificar_ganhador();
			}
			if (ganhador) {
				// O jogo acabou
				Grafica.mostrar_fim();
				return;
			}
			
			// Executa a ação correta
			switch (etapa) {
			case DIREITO:
				etapa = CONTINENTE;
				Grafica.root["mc_etapa"].gotoAndStop(2);
				break;
			case CONTINENTE:
				if (vez.rodada == 1) {
					// Na primeira rodada não pode atacar
					finalizar_jogada();
				} else {
					// Muda de etapa
					etapa = TROCA;
					Grafica.root["mc_etapa"].gotoAndStop(3);
					if (vez.humano) {
						Usuario.trocar();
					} else {
						Inteligente.trocar();
					}
				}
				break;
			case TROCA:
				etapa = TROCA2;
				Grafica.root["mc_etapa"].gotoAndStop(4);
				break;
			case TROCA2:
				etapa = ATACAR;
				Grafica.root["mc_etapa"].gotoAndStop(5);
				if (vez.humano) {
					Usuario.atacar();
				} else {
					Inteligente.atacar();
				}
				break;
			case ATACAR:
				etapa = MOVER;
				Grafica.root.bt_repetir_ataque.visible = false;
				Grafica.root["mc_etapa"].gotoAndStop(6);
				
				// Calcula o nº de soldados livres
				for (i in Grafica.territorios) {
					Grafica.territorios[i].livres = Grafica.territorios[i].soldados-1;
				}
				
				if (vez.humano) {
					Usuario.mover();
				} else {
					Inteligente.mover();
				}
				
				break;
			case MOVER:
				finalizar_jogada();
				break;
			}
		}
		
		// Verifica se o jogador atual pode fazer trocas
		public static function pode_trocar():Boolean {
			var cartas:Object, i:int, j:int, k:int, temp:int, num:int;;
			cartas = Relacao.get_relacoes(Reguladora.vez, Relacao.CARTA);
			for (i=0; i<cartas.length; i++) {
				for (j=i+1; j<cartas.length; j++) {
					for (k=j+1; k<cartas.length; k++) {
						temp = cartas[i].figura*cartas[j].figura*cartas[k].figura;
						if (temp != 2 && temp != 3 && temp != 4 && temp != 9 && temp != 12 && temp != 18) {
							num++;
						}
					}
				}
			}
			
			return Boolean(num);
		}
		
		// Finaliza a jogada
		public static function finalizar_jogada():void {
			Grafica.root.bt_repetir_ataque.visible = false;
			Grafica.root.bt_jogue_por_mim.visible = false;
			var porcem:int = Math.round(100*Relacao.get_relacoes(vez, Relacao.DONO).length/Grafica.territorios.length);
			var dif:String = porcem-vez.porcem<0 ? String(porcem-vez.porcem) : "+"+String(porcem-vez.porcem);
			vez.porcem = porcem;
			
			// Mostra a carta adquirida
			if (vez === ativo && vez.ganhou_carta) {
				Grafica.root["mc_carta"].visible = true;
				Grafica.root["mc_carta"].gotoAndStop(vez.ultima_carta.id);
			}
			
			// Mostra informações no chat
			if (vez.rodada == 2) {
				chat(Grafica.cores[vez.id]+" dono de "+porcem+"% do mundo");
			} else if (vez.rodada == 3) {
				chat(Grafica.cores[vez.id]+" => "+porcem+"% ("+dif+"% em relação à rodada anterior)");
			} else if (vez.rodada>3) {
				chat(Grafica.cores[vez.id]+" => "+porcem+"% ("+dif+"%)");
				if (porcem>recorde) {
					chat(("novo recorde => "+Grafica.cores[vez.id]+" = "+porcem+"%").toUpperCase());
				} else if (porcem>vez.recorde) {
					chat("novo recorde pessoal => "+Grafica.cores[vez.id]+" = "+porcem+"%");
				}
			}
			recorde = Math.max(recorde, porcem);
			vez.recorde = Math.max(vez.recorde, porcem);
			
			// Muda a vez e a interface
			vez.rodada++;
			vez.ganhou_carta = false;
			vez = get_prox_jogador();
			ativo = get_prox_humano();
			Grafica.campos_jogador();
			Grafica.campos_gerais();
			Grafica.atualizar_territorios();
			
			// Decide a etapa inicial
			if (vez.rodada == 2) {
				etapa = ATACAR;
				Grafica.root["mc_etapa"].gotoAndStop(5);
			} else {
				etapa = DIREITO;
				Grafica.root["mc_etapa"].gotoAndStop(1);
			}
			
			// Começa a jogada
			if (vez.humano) {
				(new SomSuaVez).play();
				Grafica.root.mc_sua_vez.visible = true;
			} else {
				Grafica.root.mc_sua_vez.visible = false;
			}
			if (vez.humano) {
				if (etapa == ATACAR) {
					Usuario.atacar();
				} else {
					Usuario.colocar();
				}
			} else {
				if (etapa == ATACAR) {
					Reguladora.timeout(Inteligente.atacar, 1000, false);
				} else {
					Reguladora.timeout(Inteligente.colocar, 1000, false);
				}
			}
		}
		
		// Funciona como setTimeout (se evento for false não envia o TimerEvent como parâmetro)
		public static function timeout(funcao:Function, atraso:int, evento:Boolean=true):void {
			var timer:Timer = new Timer(atraso, 1);
			if (evento) {
				timer.addEventListener(TimerEvent.TIMER_COMPLETE, funcao);
			} else {
				timer.addEventListener(TimerEvent.TIMER_COMPLETE, function (e:TimerEvent):void {funcao();});
			}
			timer.start();
		}
		
		// Executa a troca
		public static function trocar(c1:Carta, c2:Carta, c3:Carta):int {
			// Desrelaciona as cartas com o jogador
			Relacao.desrelacionar(vez, c1, Relacao.CARTA);
			Relacao.desrelacionar(vez, c2, Relacao.CARTA);
			Relacao.desrelacionar(vez, c3, Relacao.CARTA);
			
			// Coloca exércitos nos territórios afetados
			if (Relacao.tem_relacao(c1.territorio, vez, Relacao.DONO)) {
				c1.territorio.soldados += 2;
				Grafica.atualizar_territorio(c1.territorio, {"delta" : 2, "aviso" : true, "fundo" : 2});
			}
			if (Relacao.tem_relacao(c2.territorio, vez, Relacao.DONO)) {
				c2.territorio.soldados += 2;
				Grafica.atualizar_territorio(c2.territorio, {"delta" : 2, "aviso" : true, "fundo" : 2});
			}
			if (Relacao.tem_relacao(c3.territorio, vez, Relacao.DONO)) {
				c3.territorio.soldados += 2;
				Grafica.atualizar_territorio(c3.territorio, {"delta" : 2, "aviso" : true, "fundo" : 2});
			}
			
			// Atualiza a interface
			Grafica.campos_jogador();
			
			// Retorna o número de exércitos ganhos
			troca++;
			if (troca<7) {
				return 2*troca;
			} else {
				return 5*troca-20;
			}
		}
		
		// Verifica se algum jogador ganhou
		public static function verificar_ganhador():void {
			var i:String;
			for (i in Grafica.jogadores) {
				if (Grafica.jogadores[i].ganhou()) {
					ganhador = Grafica.jogadores[i];
				}
			}
		}
		
		// Formata o número para ter um certo número de dígitos
		// Retorna uma String
		public static function formatar_num(num:int, dig:int):String {
			var r:String = String(num);
			while (r.length<dig) {
				r = "0"+r;
			}
			return r;
		}
		
		// Escreve a mensagem no chat
		public static function chat(txt:String):void {
			Grafica.root["txt_chat"].appendText(" > "+txt+"\n");
			Grafica.root["mc_scroll_chat"].maxScrollPosition = Grafica.root["txt_chat"].maxScrollV;
			Grafica.root["mc_scroll_chat"].scrollPosition = Grafica.root["txt_chat"].maxScrollV;
		}
		
		// Retorna um nick aleatório
		public static function get_nick():String {
			return nicks[Math.floor(Math.random()*nicks.length)];
		}
		
		// Realiza um backup das configurações dos jogadores
		public static function fazer_backup():void {
			var i:String;
			
			// Salva dados gerais
			backup = {};
			backup["velocidade"] = velocidade;
			backup["jogadores"] = [];
			
			// Salva dados dos jogadores
			for (i in Grafica.jogadores) {
				backup["jogadores"][i] = {};
				backup["jogadores"][i]["nome"]          = Grafica.jogadores[i].nome;
				backup["jogadores"][i]["agressividade"] = Grafica.jogadores[i].agressividade;
				backup["jogadores"][i]["objetividade"]  = Grafica.jogadores[i].objetividade;
				backup["jogadores"][i]["sorte"]         = Grafica.jogadores[i].sorte;
				backup["jogadores"][i]["humano"]        = Grafica.jogadores[i].humano;
				backup["jogadores"][i]["jogou"]         = Grafica.jogadores[i].jogou;
				backup["jogadores"][i]["ativo"]         = Grafica.jogadores[i].ativo;
			}
		}
		
		// Descarta as mudanças feitas após o backup
		public static function restaurar_backup():void {
			var i:String;
			
			// Salva dados gerais
			velocidade = backup["velocidade"];
			
			// Salva dados dos jogadores
			for (i in Grafica.jogadores) {
				Grafica.jogadores[i].nome          = backup["jogadores"][i]["nome"];
				Grafica.jogadores[i].agressividade = backup["jogadores"][i]["agressividade"];
				Grafica.jogadores[i].objetividade  = backup["jogadores"][i]["objetividade"];
				Grafica.jogadores[i].sorte         = backup["jogadores"][i]["sorte"];
				Grafica.jogadores[i].humano        = backup["jogadores"][i]["humano"];
				Grafica.jogadores[i].jogou         = backup["jogadores"][i]["jogou"];
				Grafica.jogadores[i].ativo         = backup["jogadores"][i]["ativo"];
			}
		}
		
		// Pausa o jogo assim que possível e executa a função enviada
		public static function pausar_jogo(acao:Function=null):void {
			if (acao === null) {
				pausa = function () {};
			} else {
				pausa = acao;
			}
		}
		
		// Cancela o comando de pausar
		public static function cancelar_pausa():void {
			pausa = null;
		}
		
		// Continua o jogo, recuperando a interface e tudo mais
		// Se jogar for false não inicia o jogo em si, só a interface
		public static function continuar_jogo(jogar:Boolean=true):void {
			var i:String;
			
			for (i in Grafica.territorios) {
				Grafica.atualizar_territorio(Grafica.territorios[i]);
			}
			Grafica.campos_estaticos();
			Grafica.campos_jogador();
			Grafica.campos_gerais();
			
			if (jogar) {
				// Continua de onde parou
				if (etapa == DIREITO) {
					// Começa a partida
					if (vez.humano) {
						(new SomSuaVez).play();
					}
					// Temporário
					if (vez.humano) {
						Usuario.colocar();
					} else {
						Inteligente.colocar();
					}
				} else if (vez.ativo) {
					finalizar_etapa();
				} else {
					finalizar_jogada();
				}
			}
		}
	}
}