/**********************************************************************
This file is part of Crack dot Com's free source code release of
Golgotha.
for
information about compiling & licensing issues visit this URL
If that doesn't help, contact Jonathan Clark at
golgotha_source@usa.net (Subject should have "GOLG" in it)
***********************************************************************/
#include "objs/model_id.hh"
#include "objs/model_draw.hh"
#include "resources.hh"
#include "saver.hh"
#include "map_cell.hh"
#include "map.hh"
#include "map_man.hh"
#include "objs/moneyplane.hh"
#include "object_definer.hh"
#include "objs/moneycrate.hh"
#include "lisp/li_class.hh"
static g1_model_ref model_ref("moneycrate");
static li_float_class_member li_vspeed("vspeed");
static li_int_class_member li_value("crate_value");
static void g1_moneycrate_init()
{
}
g1_object_definer
g1_moneycrate_def("moneycrate",
g1_object_definition_class::EDITOR_SELECTABLE |
g1_object_definition_class::MOVABLE);
g1_moneycrate_class::g1_moneycrate_class(g1_object_type id,
g1_loader_class *fp)
: g1_object_class(id,fp)
{
draw_params.setup(model_ref.id());
set_flag(BLOCKING, 1);
}
i4_3d_vector g1_moneycrate_class::crate_attach()
{
i4_3d_vector crate_offset(0,0,0);
model_ref()->get_mount_point("mount",crate_offset);
return crate_offset;
}
void g1_moneycrate_class::setup(i4_3d_vector pos, w32 value)
{
x = pos.x;
y = pos.y;
h = pos.z;
grab_old();
li_class_context c(vars);
li_value() = value;
li_vspeed() = 1.0;
occupy_location();
request_think();
}
void g1_moneycrate_class::follow(i4_3d_vector pos, i4_3d_vector rot)
{
unoccupy_location();
x = pos.x;
y = pos.y;
h = pos.z;
theta = rot.z;
pitch = rot.y;
roll = rot.x;
li_class_context c(vars);
li_vspeed() = 1.0;
occupy_location();
request_think();
}
void g1_moneycrate_class::release()
{
li_class_context c(vars);
li_vspeed() = 0;
request_think();
}
w32 g1_moneycrate_class::value() const
{
li_class_context c(vars);
return li_value();
}
void g1_moneycrate_class::think()
{
i4_float vspeed = li_vspeed();
if (vspeed<=0.0)
{
i4_float height = g1_get_map()->map_height(x,y,h);
if (h+vspeed-0.001 > height)
{
h += vspeed;
vspeed -= g1_resources.gravity;
request_think();
}
else
{
h = height;
vspeed = 0;
unoccupy_location();
request_remove();
}
}
li_vspeed() = vspeed;
}