// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/*********************************************************************
bookkeeping.c
Bookkeeping simple machine functions.
*********************************************************************/
#include "emu.h"
#include "config.h"
//**************************************************************************
// BOOKKEEPING MANAGER
//**************************************************************************
//-------------------------------------------------
// bookkeeping_manager - constructor
//-------------------------------------------------
bookkeeping_manager::bookkeeping_manager(running_machine &machine)
: m_machine(machine),
m_dispensed_tickets(0)
{
/* reset coin counters */
for (int counternum = 0; counternum < COIN_COUNTERS; counternum++)
{
m_lastcoin[counternum] = 0;
m_coinlockedout[counternum] = 0;
m_coin_count[counternum] = 0;
}
// register coin save state
machine.save().save_item(NAME(m_coin_count));
machine.save().save_item(NAME(m_coinlockedout));
machine.save().save_item(NAME(m_lastcoin));
machine.save().save_item(NAME(m_dispensed_tickets));
// register for configuration
machine.configuration().config_register("counters", config_saveload_delegate(FUNC(bookkeeping_manager::config_load), this), config_saveload_delegate(FUNC(bookkeeping_manager::config_save), this));
}
/***************************************************************************
TICKETS
***************************************************************************/
/*-------------------------------------------------
get_dispensed_tickets - return the number of
tickets dispensed
-------------------------------------------------*/
int bookkeeping_manager::get_dispensed_tickets() const
{
return m_dispensed_tickets;
}
/*-------------------------------------------------
increment_dispensed_tickets - increment the
number of dispensed tickets
-------------------------------------------------*/
void bookkeeping_manager::increment_dispensed_tickets(int delta)
{
m_dispensed_tickets += delta;
}
/***************************************************************************
COIN COUNTERS
***************************************************************************/
/*-------------------------------------------------
config_load - load the state of the counters
and tickets
-------------------------------------------------*/
void bookkeeping_manager::config_load(config_type cfg_type, xml_data_node *parentnode)
{
xml_data_node *coinnode, *ticketnode;
/* on init, reset the counters */
if (cfg_type == config_type::CONFIG_TYPE_INIT)
{
memset(m_coin_count, 0, sizeof(m_coin_count));
m_dispensed_tickets = 0;
}
/* only care about game-specific data */
if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
/* might not have any data */
if (parentnode == nullptr)
return;
/* iterate over coins nodes */
for (coinnode = xml_get_sibling(parentnode->child, "coins"); coinnode; coinnode = xml_get_sibling(coinnode->next, "coins"))
{
int index = xml_get_attribute_int(coinnode, "index", -1);
if (index >= 0 && index < COIN_COUNTERS)
m_coin_count[index] = xml_get_attribute_int(coinnode, "number", 0);
}
/* get the single tickets node */
ticketnode = xml_get_sibling(parentnode->child, "tickets");
if (ticketnode != nullptr)
m_dispensed_tickets = xml_get_attribute_int(ticketnode, "number", 0);
}
/*-------------------------------------------------
config_save - save the state of the counters
and tickets
-------------------------------------------------*/
void bookkeeping_manager::config_save(config_type cfg_type, xml_data_node *parentnode)
{
int i;
/* only care about game-specific data */
if (cfg_type != config_type::CONFIG_TYPE_GAME)
return;
/* iterate over coin counters */
for (i = 0; i < COIN_COUNTERS; i++)
if (m_coin_count[i] != 0)
{
xml_data_node *coinnode = xml_add_child(parentnode, "coins", nullptr);
if (coinnode != nullptr)
{
xml_set_attribute_int(coinnode, "index", i);
xml_set_attribute_int(coinnode, "number", m_coin_count[i]);
}
}
/* output tickets */
if (m_dispensed_tickets != 0)
{
xml_data_node *tickets = xml_add_child(parentnode, "tickets", nullptr);
if (tickets != nullptr)
xml_set_attribute_int(tickets, "number", m_dispensed_tickets);
}
}
/*-------------------------------------------------
coin_counter_w - sets input for coin counter
-------------------------------------------------*/
void bookkeeping_manager::coin_counter_w(int num, int on)
{
if (num >= ARRAY_LENGTH(m_coin_count))
return;
/* Count it only if the data has changed from 0 to non-zero */
if (on && (m_lastcoin[num] == 0))
m_coin_count[num]++;
m_lastcoin[num] = on;
}
/*-------------------------------------------------
coin_counter_get_count - return the coin count
for a given coin
-------------------------------------------------*/
int bookkeeping_manager::coin_counter_get_count(int num)
{
if (num >= ARRAY_LENGTH(m_coin_count))
return 0;
return m_coin_count[num];
}
/*-------------------------------------------------
coin_lockout_w - locks out one coin input
-------------------------------------------------*/
void bookkeeping_manager::coin_lockout_w(int num,int on)
{
if (num >= ARRAY_LENGTH(m_coinlockedout))
return;
m_coinlockedout[num] = on;
}
/*-------------------------------------------------
coin_lockout_get_state - return current lockout
state for a particular coin
-------------------------------------------------*/
int bookkeeping_manager::coin_lockout_get_state(int num)
{
if (num >= ARRAY_LENGTH(m_coinlockedout))
return FALSE;
return m_coinlockedout[num];
}
/*-------------------------------------------------
coin_lockout_global_w - locks out all the coin
inputs
-------------------------------------------------*/
void bookkeeping_manager::coin_lockout_global_w(int on)
{
for (int i = 0; i < ARRAY_LENGTH(m_coinlockedout); i++)
coin_lockout_w(i, on);
}