//===========================================================================//
// File:	gauss.cc                                                          //
// Project: BT           Brick: Entity Manager                            //
// Contents: Basic weapons system pieces                                     //
//---------------------------------------------------------------------------//
//   Date    Who  Modification                                               //
// --------  ---  ---------------------------------------------------------- //
// 04/13/95  JM  Initial coding.                                            //
// 07/19/95  GDU  Complied with new munga and added electrical behavior
//---------------------------------------------------------------------------//
// Copyright (C) 1995, Virtual World Entertainment, Inc. All Rights reserved //
//
//                   	PROPRIETARY AND CONFIDENTIAL                         //
//===========================================================================//

#include <bt.hpp>
#pragma hdrstop

#if !defined(GAUSS_HPP)
#	include <gauss.hpp>
#endif

//#############################################################################
// Shared Data Support
//
GaussRifle::SharedData
	GaussRifle::DefaultData(
		&GaussRifle::ClassDerivations,
		GaussRifle::MessageHandlers,
		MechWeapon::GetAttributeIndex(),	// gauge wave: inherit temps/InputVoltage/OutputVoltage/PercentDone (was empty)
		GaussRifle::StateCount
	);

Derivation
	GaussRifle::ClassDerivations(
		&Emitter::ClassDerivations,
		"GaussRifle"
		);


//#############################################################################
// Messaging Support
//

#if 0
//#############################################################################
// Attribute Support
//

const GaussRifle::IndexEntry
	GaussRifle::AttributePointers[]=
{
	ATTRIBUTE_ENTRY(GaussRifle, DischargeVoltage, dischargeVoltage)
};

GaussRifle::AttributeIndexSet
	GaussRifle::AttributeIndex(
		ELEMENTS(GaussRifle::AttributePointers),
		GaussRifle::AttributePointers,
		Emitter::AttributeIndex
	);
#endif

//#############################################################################
// Model Support
//

void
	GaussRifle::FireWeapon()
{
	//
	// Fire the weapon
	//
		currentLevel = 0.0f;	// binary @004bdcb4/@004bdca4 write [this+0x414] == inherited Emitter currentLevel (discharge)

		Check_Fpu();
}

//#############################################################################
// Constructer/Destructor Support
//

GaussRifle::GaussRifle(
	Mech	*owner,
	int	subsystem_ID,
	SubsystemResource	*subsystem_resource,
	SharedData &shared_data
):
	Emitter(owner, subsystem_ID, subsystem_resource, shared_data)
{
	Check(owner);
	Check_Pointer(subsystem_resource);
	currentLevel = 0.0f;	// binary @004bdcb4/@004bdca4 write [this+0x414] == inherited Emitter currentLevel (discharge)
	Check_Fpu();
}

GaussRifle::~GaussRifle()
{
	Check(this);
	Check_Fpu();
}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CreateStreamedSubsystem
//
Logical
	GaussRifle::CreateStreamedSubsystem(
		ResourceFile					*resource_file,
		NotationFile					*model_file,
		const char						*model_name,
		const char						*subsystem_name,
		SubsystemResource					*subsystem_resource,
		NotationFile					*subsystem_file,
		const ResourceDirectories	*directories,
		int							  	passes
	)
{

	if (
		!Emitter::CreateStreamedSubsystem(
			resource_file,
			model_file,
			model_name,
			subsystem_name,
			subsystem_resource,
			subsystem_file,
			directories,
			passes
		)
	)
	{
		Check_Fpu();
		return False;
	}




	subsystem_resource->subsystemModelSize = sizeof(*subsystem_resource);
	subsystem_resource->classID = RegisteredClass::GaussRifleClassID;

 
	Check_Fpu();
	return True;
}

Logical
	GaussRifle::TestInstance() const
{
	return IsDerivedFrom(ClassDerivations);
}



//===========================================================================//
// WAVE 7 factory bridge -- GaussRifle (factory case 0xBCE, "MissileWeapon"
//   mislabel).  VDATA.h enum: 0xBCE == GaussRifleClassID.  GaussRifle : Emitter
//   (sizeof 0x484 = Emitter 0x478 + Vector3D muzzleVelocity).  ctor @004bdcb4,
//   no-op FireWeapon @004bdca4 (just zeros currentLevel -- a non-functional weapon
//   in this 1995 build), so it needs a DEDICATED bridge (CreateEmitterSubsystem
//   would build a plain Emitter that WOULD deal damage).  Was building a
//   MissileLauncher RECON_SUBSYS stub.  alloc 0x484.
//===========================================================================//
Subsystem *CreateGaussRifleSubsystem(Mech *owner, int id, void *seg)
{
	Check(sizeof(GaussRifle) <= 0x484);
	return (Subsystem *) new (Memory::Allocate(0x484))
		GaussRifle(owner, id, (GaussRifle::SubsystemResource *)seg, GaussRifle::DefaultData);
}
