/**********************************************************************
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/map_piece.hh"
#include "object_definer.hh"
#include "lisp/lisp.hh"
#include "objs/explode_model.hh"
#include "li_objref.hh"
#include "objs/path_object.hh"
#include "map_man.hh"
#include "map.hh"
#include "saver.hh"
#include "objs/shockwave.hh"
#include "image_man.hh"
#include "tick_count.hh"
#include "sound/sfx_id.hh"
#include "controller.hh"
static g1_team_icon_ref radar_im("bitmaps/radar/bomb_truck.tga");
S1_SFX(bomb_coming, "computer_voice/bomb_truck_approaching_22khz.wav", S1_STREAMED, 200);
S1_SFX(bleep, "misc/bleep_22khz.wav", 0, 100);
static li_symbol_ref reached("reached");
li_symbol_ref shockwave("shockwave");
class g1_bomb_truck_class : public g1_map_piece_class
{
public:
int warning_level;
i4_bool user_warned;
g1_bomb_truck_class(g1_object_type id, g1_loader_class *fp)
: g1_map_piece_class(id,fp)
{
warning_level=0;
draw_params.setup("bomb_truck",0,"bomb_truck_lod");
allocate_mini_objects(1,"Bomb Truck Mini-Objects");
user_warned=i4_F;
radar_image=&radar_im;
radar_type=G1_RADAR_VEHICLE;
set_flag(BLOCKING |
TARGETABLE |
GROUND |
SHADOWED |
DANGEROUS, 1);
}
void think()
{
g1_map_piece_class::think();
if (warning_level>9)
warning_level=9;
if (g1_player_man.local_player!=player_num &&
warning_level && (g1_tick_counter+global_id)%(10-warning_level)==0)
bleep.play();
}
void damage(g1_object_class *who_is_hurting,
int how_much_hurt, i4_3d_vector damage_dir)
{
g1_object_class::damage(who_is_hurting, how_much_hurt, damage_dir);
if (health<=0)
{
g1_shockwave_class *shock = NULL;
shock = (g1_shockwave_class *)g1_create_object(g1_get_object_type(shockwave.get()));
if (shock)
shock->setup(i4_3d_vector(x,y,h), 0.5);
g1_apply_damage(this, this, 0, i4_3d_vector(0,0,1));
}
}
li_object *message(li_symbol *message_name,
li_object *message_params,
li_environment *env)
{
if (message_name==reached.get())
{
g1_object_class *who=li_g1_ref::get(message_params,env)->value();
if (who)
{
g1_path_object_class *po=g1_path_object_class::cast(who);
if (po->bomb_warning_level()>warning_level)
warning_level=po->bomb_warning_level();
if (warning_level && g1_player_man.local_player!=player_num &&
!user_warned)
{
user_warned=i4_T;
if (g1_current_controller.get())
g1_current_controller->scroll_message(i4gets("bomb_coming"));
bomb_coming.play();
}
if (po && !po->total_links(get_team()))
{
for (int i=0; itotal_controlled_objects(); i++)
{
g1_object_class *who=po->get_controlled_object(i);
int e_type=g1_get_object_type("explode_model");
g1_explode_model_class *e = (g1_explode_model_class *)g1_create_object(e_type);
if (e && who && who->draw_params.model)
{
g1_explode_params params;
e->setup(who, i4_3d_vector(who->x, who->y, who->h), params);
who->unoccupy_location();
who->request_remove();
}
}
who->change_player_num(player_num);
}
}
}
return g1_map_piece_class::message(message_name, message_params, env);
}
};
g1_object_definer
g1_bomb_truck_def("bomb_truck",
g1_object_definition_class::EDITOR_SELECTABLE |
g1_object_definition_class::TO_MAP_PIECE |
g1_object_definition_class::MOVABLE);