asgard/
asgard/.settings/
asgard/area/
asgard/data/clans/
asgard/data/clans/history/
asgard/data/rosters/
asgard/src/notice/
/*
 Slot code by Jair for Asgardian Nightmares
 Written for Rot
 */
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"
#include "recycle.h"
DECLARE_DO_FUN(do_announce );

/***********************************************************
 fp = fopen(SLOT_FILE,"r");
 slotMachine->value[1] = fread_number(fp);
 fclose(fp);
 ************************************************************/
//no idea what this does


/*****Functions*******/
int Roll_Slots();
void Update_Player_Money(CHAR_DATA *ch, int silver);
int Slots_Win(int slot_roll1, int slot_roll2, int slot_roll3, int bet,
		int Slots_Jackpot, OBJ_DATA *slotMachine);

void do_slots(CHAR_DATA *ch, char *argument)
{
	char *bar_messages[] =
	{ "<------------>", "{Y  Aegir  {x", /* 1 */
	"{R  Odin   {x", /* 2 */
	"{M   Hel   {x", /* 3 */
	"{c  Loki   {x", /* 4 */
	"{C  Thor   {x", /* 5 */
	"{y  Freya  {x", /* 6 */
	"{r Forseti {x", /* 7 */
	"{G   Tyr   {x", /* 8 */
	"{W   Sif   {x", /* 9 */
	"{B  Jord   {x", /* 10*/
	};

	//FILE *fp;
	OBJ_DATA *slotMachine;
	char buf[MAX_STRING_LENGTH];
	//int winArray[11];
	int Slots_Jackpot, cost;
	char arg[MSL / 10];
	int bet, total_silver, slot_roll1, slot_roll2, slot_roll3, money_won;
	bool foundSlot;

	//check if arguments are correct
	argument = one_argument(argument, arg); // the players bet

	if (arg[0] == '\0')
	{
		send_to_char("{@Syntax: {#slots {$<{&amount{$>{x\n\r", ch);
		return;
	}

	/*if(!is_number(arg))
	 {
	 send_to_char("{@Syntax: {#slots {$<{&amount{$>{^ amount in silver{x\n\r",ch);
	 return;
	 }*/

	bet = atoi(arg);

	//First, check if the character is an npc
	if (IS_NPC(ch))
	{
		send_to_char(
				"Sorry, only player characters may use the slot machine.\n\r",
				ch);
		return;
	}

	//Second, check if there is a slot machine here, if it is working


	foundSlot = FALSE;

	for (slotMachine = ch->in_room->contents; slotMachine != NULL; slotMachine
			= slotMachine->next_content)
	{
		if ((slotMachine->item_type == ITEM_SLOT_MACHINE) && (can_see_obj(ch,
				slotMachine)))
		{
			foundSlot = TRUE;
			break;
		}
	}

	if (foundSlot == FALSE)
	{
		send_to_char("There is no slot machine here.\n\r", ch);
		return;
	}

	cost = slotMachine->value[0];

	if (cost <= 0)
	{
		send_to_char("This slot machine seems to be broken.\n\r", ch);
		return;
	}

	//bet needs to be in silver, so get total money character has


	total_silver = ch->silver + (ch->gold * 100) + (ch->platinum * 10000);

	//Check if bet is greater than the money the character has

	if (bet > total_silver)
	{
		send_to_char("You can't bet more than you have.\n\r", ch);
		return;
	}

	if (bet > 100000)
	{
		send_to_char("{@You can't bid more than 10 platinum.{0\n\r", ch);
		return;
	}

	if (bet < 0)
	{
		send_to_char("{@You can't bid a negative number.{0\n\r", ch);
		return;
	}

	//Backup Slots
	/*  This didn't like me, so I took it out. */

	/*
	 fp = fopen(SLOT_FILE,"r");
	 slotMachine->value[1] = fread_number(fp);
	 fclose(fp);
	 */

	//so, the character has enough money to cover its bet, slots on
	Slots_Jackpot = slotMachine->value[1];

	//subtract the bet to start
	total_silver = total_silver - bet;

	//run slot code
		slot_roll1 = Roll_Slots();
		slot_roll2 = Roll_Slots();
		slot_roll3 = Roll_Slots();
	//Tien's Code

	send_to_char(
			"{x\n\r{x     {3_______________________________________    {!_{x\n\r",
			ch);
	send_to_char(
			"{x    {3/{* ------------------------------------- {3\\  {!(_){x\n\r",
			ch);
	send_to_char(
			"{x   {3|                  {@Slots           {7-{*|{7-    {3| {7/{7/{x\n\r",
			ch);
	send_to_char(
			"{x   {3|{!> {@************************************* {!<{3|{7/{7/{x\n\r",
			ch);
	sprintf(buf, "{x   {3|{!> {@[ %s {@| %s {@| %s {@] {!<{3|{7/{x\n\r",
			bar_messages[slot_roll1], bar_messages[slot_roll2],
			bar_messages[slot_roll3]);
	send_to_char(buf, ch);
	send_to_char(
			"{x   {3|{!> {@************************************* {!<{3|{x\n\r",
			ch);
	send_to_char(
			"{x    {3\\{*---------------------------------------{3/{x\n\r", ch);
	sprintf(buf, "{x     {#Current Jackpot:{& %d {7silver{x\n\r{x\n\r",
			Slots_Jackpot);
	send_to_char(buf, ch);

	//check if the player won
	if (slot_roll1 != slot_roll2 && slot_roll1 != slot_roll3 && slot_roll2
			!= slot_roll3)
	{
		//update jackpot
		Slots_Jackpot = Slots_Jackpot + bet;

		if (Slots_Jackpot > 10000000)
			Slots_Jackpot = 10000000;

		//player did not win
		sprintf(
				buf,
				"Sorry you didn't win anything. The jackpot is now worth %d silver.\n\r",
				Slots_Jackpot);

		send_to_char(buf, ch);
		slotMachine->value[1] = Slots_Jackpot;
		Update_Player_Money(ch, total_silver);

		return;
	}

	//the player has won something, find how much they won.


	//money won is the amount they won total, to be added to their money

	money_won = Slots_Win(slot_roll1, slot_roll2, slot_roll3, bet,
			Slots_Jackpot, slotMachine);

	//update players total_silver
	//Check if the slot machine can cover the win
	if (Slots_Jackpot < money_won)
	{
		//slots cannot handle the amount, give over as much as possible
		total_silver = total_silver + Slots_Jackpot;

		sprintf(
				buf,
				"The slot machine cannot cover your winnings.  You get %d silver.\n\r",
				Slots_Jackpot);
		send_to_char(buf, ch);

		Slots_Jackpot = 0;
		slotMachine->value[1] = Slots_Jackpot;

		Update_Player_Money(ch, total_silver);
		return;
	}

	total_silver = total_silver + money_won + bet;
	Slots_Jackpot = Slots_Jackpot - money_won;
	slotMachine->value[1] = Slots_Jackpot;

	if ((slot_roll1 == slot_roll2) && (slot_roll2 == slot_roll3))
	{
		sprintf(
				buf,
				"You won the jackpot worth %d silver!! The jackpot now stands at %d silver.\n\r",
				money_won, slotMachine->value[1]);
		send_to_char(buf, ch);
	}
	else
	{
		sprintf(
				buf,
				"You matched 2 bars and won %d silver! The jackpot is now worth %d silver.\n\r",
				money_won, slotMachine->value[1]);
		send_to_char(buf, ch);
	}

	Update_Player_Money(ch, total_silver);

	return;
}

int Roll_Slots()
{
	int slot = 0;

	slot = number_range(1, 49);

	if (slot == 1)
		return 1; //tas		1/49
	else if (slot == 2 || slot == 3)
		return 2; //skyntil	2/49
	else if (slot >= 4 && slot <= 6)
		return 3; //lucifer	3/49
	else if (slot >= 7 && slot <= 10)
		return 4; //raolin	4/49
	else if (slot >= 11 && slot <= 15)
		return 5; //kefka		5/49
	else if (slot >= 16 && slot <= 21)
		return 6; //jasrags	6/49
	else if (slot >= 22 && slot <= 28)
		return 7; //deblin	7/49
	else if (slot >= 29 && slot <= 36)
		return 8; //anonymous	8/49
	else if (slot >= 37 && slot <= 45)
		return 9; //gavorkian	9/49
	else
		return 10; //jair		10/49
}

int Slots_Win(int bar1, int bar2, int bar3, int bet, int jackpot,
		OBJ_DATA *slotMachine)
{
	int winnings;

	//Check if all 3 are the same, declare jackpot
	winnings = 0;

	if ((bar1 == bar2) && (bar2 == bar3))
	{
		if (bar1 <= 5)
		{
			winnings = bet * (11 - bar1) * 1.5; /* they won the jackpot, make it */
			/* worth their while!            */
		}
		else
			winnings = bet * (11 - bar1);

		slotMachine->value[1] -= winnings; /* put it back to something */
		slotMachine->value[1] += bet;
		return winnings;
	}
	if (bar1 == bar2 || bar1 == bar3)
	{
		winnings += ((bet * 12) / (bar1));
		return winnings;
	}
	if (bar2 == bar3)
	{
		winnings += ((bet * 12) / (bar2));
		return winnings;
	}
	return 0;
}

void Update_Player_Money(CHAR_DATA *ch, int total_silver)
{
	int plat, gold, silver;

	plat = total_silver / 10000;
	total_silver -= plat * 10000;
	gold = total_silver / 100;
	total_silver -= gold * 100;
	silver = total_silver;

	ch->silver = silver;
	ch->gold = gold;
	ch->platinum = plat;
}