/**********************************************************************
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 "string/string.hh"
#include "memory/array.hh"
#include "objs/defaults.hh"
#include "lisp/lisp.hh"
#include "loaders/load.hh"
#include "image/image.hh"
#include "g1_object.hh"

static li_symbol_ref li_sing("sing"), li_mult("mult");

i4_array g1_obj_defaults(0,32);
i4_array g1_stank_ammo_types(0,32);
i4_array      g1_damage_maps(0,32);

li_object *g1_defaults(li_object *i, li_environment *env)
{
  while (i)
  {
    g1_object_defaults_struct *d=g1_obj_defaults.add();
    li_object *o=li_car(i,env);

    strcpy(d->object_name, li_get_string(li_symbol::get(li_car(o,env),env)->name(),env));  
    o=li_cdr(o,env);
           
    d->speed=li_get_float(li_car(o,env),env);                 o=li_cdr(o,env);
    d->turn_speed=li_get_float(li_car(o,env),env);            o=li_cdr(o,env);
    d->accel=li_get_float(li_car(o,env),env);                 o=li_cdr(o,env);
    d->cost=li_get_int(li_car(o,env),env);                    o=li_cdr(o,env);

    d->health=li_get_int(li_car(o,env),env);                  o=li_cdr(o,env);
    d->fire_delay=li_get_int(li_car(o,env),env);              o=li_cdr(o,env);
    d->detection_range=li_get_float(li_car(o,env),env);       o=li_cdr(o,env);

    d->fire_type=li_symbol::get(li_car(o,env),env);           o=li_cdr(o,env);
    
    i=li_cdr(i,env);
  }
  return 0;
}

li_object *g1_add_stank_weapons(li_object *i, li_environment *env)
{
  while (i)
  {
    li_object *o=li_car(i,env);
    g1_stank_ammo_type_struct *a=g1_stank_ammo_types.add();
    a->weapon_type=li_symbol::get(li_car(o,env),env);              o=li_cdr(o,env);
    a->max_amount=li_get_int(li_eval(li_car(o,env),env),env);     o=li_cdr(o,env);
    a->refuel_delay=li_get_int(li_eval(li_car(o,env),env),env);   o=li_cdr(o,env);
    a->fire_delay=li_get_int(li_eval(li_car(o,env),env),env);     o=li_cdr(o,env);

    char name[100];
    sprintf(name,"bitmaps/stank/frame_%s.tga", li_get_string(li_car(o,env),env));
    a->icon=i4_load_image(name);
    
    sprintf(name,"bitmaps/stank/dark_%s.tga", li_get_string(li_car(o,env), env));
    a->dark_icon=i4_load_image(name);
    
    
    i=li_cdr(i,env);
  }
  return 0; 
}

li_object *g1_def_weapon_damage(li_object *i, li_environment *env)
{
  while (i)
  {
    li_object *o=li_car(i,env), *c;
    g1_damage_map_struct *a=g1_damage_maps.add();

    a->object_for=li_symbol::get(li_car(o,env),env);      o=li_cdr(o,env);

    li_symbol *htype=li_symbol::get(li_car(o,env),env);
    if (htype==li_sing.get())
      a->hurt_type=g1_damage_map_struct::HURT_SINGLE_GUY;
    else if (htype==li_mult.get())
      a->hurt_type=g1_damage_map_struct::DO_AREA_OF_EFFECT;
    else li_error(env, "unknown hurt type %O", o);
    o=li_cdr(o,env);
    
    a->default_damage=li_get_int(li_car(o,env),env);      o=li_cdr(o,env);
    a->special_damage=li_get_int(li_car(o,env),env);      o=li_cdr(o,env);
    a->speed=li_get_float(li_car(o,env),env);             o=li_cdr(o,env);
    a->range=li_get_float(li_car(o,env),env);             o=li_cdr(o,env);
        
    // count how many exceptions follow
    for (a->t_maps=0, c=o; c; c=li_cdr(c,env), a->t_maps++);

    if (a->t_maps)
    {
      a->maps=(g1_damage_map_struct::map *)i4_malloc(a->t_maps *
                                                     sizeof(g1_damage_map_struct::map),"");
      int i=0;
      for (;o; o=li_cdr(o,env))
      {
        a->maps[i].object_type=li_symbol::get(li_car(li_car(o,env),env),env);
        a->maps[i].damage=li_get_int(li_car(li_cdr(li_car(o,env),env),env),env);
        i++;
      }
    }
    else a->maps=0;
    i=li_cdr(i,env);
  }

  return 0;
}


g1_damage_map_struct *g1_find_damage_map(int object_type)
{
  int t=g1_damage_maps.size();
  for (int i=0; i