home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 23 / IOPROG_23.ISO / SOFT / RAYCAST.ZIP / SPRMAKE.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-19  |  4.0 KB  |  147 lines

  1. #include "ray.h"
  2. #include "globals.h"
  3. #include "rayspr.h"
  4. #include "bspmove.h"
  5. #include "message.h"
  6. #include "blockmap.h"
  7. #include "timer.h"
  8. #include <stddef.h>
  9.  
  10. pobject Create_Object(long x, long y, long z, angle_type angle,
  11.    short type, pobject owner, ULONG team)
  12. {
  13.  
  14.       if (type >= Number_Of_OTs) {
  15.          return NULL;
  16.       }
  17.  
  18.       pobject_node global_node, ss_node;
  19.       pobject cur_object;
  20.  
  21.       // Create a global node for the object
  22.  
  23.       global_node=(pobject_node)NewPtr(sizeof(object_node));
  24.       global_node->front=NULL;
  25.       global_node->back=NULL;
  26.       global_node->data=(pobject)NewPtr(sizeof(object));
  27.  
  28.       // Push it into the global node list
  29.  
  30.       OL_Push_Node(global_node, g_object_list);
  31.  
  32.       // Initialize given data
  33.  
  34.       cur_object=global_node->data;
  35.       cur_object->x=x;
  36.       cur_object->y=y;
  37.       cur_object->z=z;
  38.       cur_object->angle=angle;
  39.       cur_object->cur_frame=0;
  40.       cur_object->type=Obj_Type_List+type;
  41.  
  42.       // Set sector and ssector
  43.       cur_object->cur_ss=Get_Object_SSector(cur_object, bsp_start_node);
  44.       cur_object->cur_sec=Get_Sec_From_SSec(cur_object->cur_ss);
  45.  
  46.       // Save global node pointer in object
  47.  
  48.       cur_object->global_node=global_node;
  49.  
  50.       // Setup the sub sector node in object
  51.  
  52.       cur_object->ss_node=(pobject_node)NewPtr(sizeof(object_node));
  53.       ss_node=cur_object->ss_node;
  54.       ss_node->front=NULL;
  55.       ss_node->back=NULL;
  56.       ss_node->data=cur_object;
  57.  
  58.       // Push ssector node onto that ssector's list
  59.  
  60.       OL_Push_Node(ss_node, cur_object->cur_ss->objects);
  61.       cur_object->cur_ss->num_objects++;
  62.  
  63.       // Setup object for blockmap
  64.       cur_object->block_x=Block_X(cur_object->x);
  65.       cur_object->block_y=Block_Y(cur_object->y);
  66.       cur_object->block_node=(pobject_node)NewPtr(sizeof(object_node));
  67.       cur_object->block_node->front=NULL;
  68.       cur_object->block_node->back=NULL;
  69.       cur_object->block_node->data=cur_object;
  70.       OL_Push_Node(cur_object->block_node, 
  71.          *Get_Block_Obj_List(cur_object->block_x, cur_object->block_y));
  72.  
  73.       // Clear message queues
  74.       cur_object->send_objects=NULL;
  75.       cur_object->receive_objects=NULL;
  76.  
  77.       // set owner
  78.       cur_object->owner=owner;
  79.  
  80.       // set team
  81.       cur_object->team=team;
  82.  
  83.       // initalize stats
  84.       cur_object->stats.current_speed=cur_object->type->stats.base_speed;
  85.       cur_object->stats.current_health=cur_object->type->stats.total_health;
  86.  
  87.       // Set default extra data, for now
  88.  
  89.       cur_object->extra_data=NULL;
  90.       (*cur_object->type->Load_Extra)(cur_object, BAD_LOAD_OFFSET);
  91.  
  92.       if (updating) {
  93.          cur_object->type->Update(cur_object, Get_Update_Num());
  94.       }
  95.       return cur_object;
  96.  
  97. }
  98.  
  99. void Kill_Object(pobject del_obj)
  100. {
  101.  
  102.    Send_Auto_Message(del_obj, KILLED_MESSAGE, NULL);
  103.  
  104.    pobject_node cur_node, next_node;
  105.    cur_node=del_obj->send_objects;
  106.    while (!OL_Empty_Node(cur_node)) {
  107.       next_node=OL_Next_Node(cur_node);
  108.       Release_Object_Messages(del_obj, cur_node->data);
  109.       cur_node=next_node;
  110.    }
  111.    cur_node=del_obj->receive_objects;
  112.    while (!OL_Empty_Node(cur_node)) {
  113.       next_node=OL_Next_Node(cur_node);
  114.       Release_Object_Messages(cur_node->data, del_obj);
  115.       cur_node=next_node;
  116.    }
  117.  
  118.    // Clear nodes
  119.  
  120.    OL_Delete_Node(del_obj->ss_node, del_obj->cur_ss->objects);
  121.    del_obj->cur_ss->num_objects--;
  122.    OL_Delete_Node(del_obj->global_node, g_object_list);
  123.    OL_Delete_Node(del_obj->block_node, 
  124.       *Get_Block_Obj_List(del_obj->block_x, del_obj->block_y));
  125.    DelPtr( del_obj->global_node);
  126.    DelPtr( del_obj->ss_node);
  127.    DelPtr( del_obj->block_node);
  128.  
  129.    // Delete any extra the object might have
  130.  
  131.    if (del_obj->extra_data!=NULL)
  132.      DelPtr( del_obj->extra_data);
  133.  
  134.    // and delete the object
  135.  
  136.    DelPtr( del_obj);
  137.  
  138. }
  139.  
  140. void Clear_Objects() {
  141.    pobject cur_obj;
  142.    while (g_object_list!=NULL) {
  143.       cur_obj=g_object_list->data;
  144.       Kill_Object(cur_obj);
  145.    }
  146. }
  147.