summaryrefslogblamecommitdiff
path: root/src/being.cpp
blob: 31b87d73f9b1f710865b4a250a2aa74ecd585ab2 (plain) (tree)



















                                                                             
        
   

                  





                                            
                                                         
 
                                                         
              
 

                

 



                                                     








                                                      











                               

                                    



                                           
                 







                                       
                

                
              










                             
            












                                   
                        
                  


                                                
                        
                  





















                                                                                   



                                                      







                                                               

                                                                                      
                        

                      














































                                                       







                                         
                  




                      
/*
 *  The Mana World
 *  Copyright 2004 The Mana World Development Team
 *
 *  This file is part of The Mana World.
 *
 *  The Mana World is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  The Mana World is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with The Mana World; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  $Id$
 */

#include <stdio.h>

#include "astar.h"
#include "being.h"

NODE *player_node = NULL;
NODE *head = NULL; // First node of the list
unsigned int b_count = 0; // Number of beings in the list

PATH_NODE::PATH_NODE(unsigned short x, unsigned short y):
    next(NULL)
{
    this->x = x;
    this->y = y;
}

PATH_NODE *calculate_path(
        unsigned short src_x, unsigned short src_y,
        unsigned short dest_x, unsigned short dest_y)
{
    return find_path(1, src_x, src_y, dest_x, dest_y);
}

/** Returns the first node of the list */
NODE *get_head() {
  return head;
}

/** Creates a empty node */
NODE::NODE():
  id(0), job(0),
  next(NULL),
  action(0), frame(0),
  path(NULL),
  speech(NULL), speech_time(0),
  tick_time(0), speed(150),
  emotion(0), emotion_time(0),
  text_x(0), text_y(0),
  hair_style(1), hair_color(1),
  weapon(0)
{
    memset(coordinates, 0, 3);
    speech_color = makecol(0, 0, 0);
}

/** Returns number of beings in the list */
unsigned int get_count() {
  return b_count;
}

/** Removes all beings from the list */
void empty() {
  NODE *node = head;
  NODE *next;
  while(node) {
    next = node->next;
    delete node;
    node = next;
  }
  b_count = 0;
  head = NULL;
}

/** Add a node to the list */
void add_node(NODE *node) {
  NODE *temp = head;
  if(temp) {
    while(temp->next)
      temp = temp->next;
    temp->next = node;
  } else head = node;
  b_count++;
}

/** Remove a node */
void remove_node(unsigned int id) {
  unsigned int temp;
  NODE *node_old, *node_new;
  node_old = head;
  node_new = NULL;
    while(node_old) {
    temp = get_id(node_old);
        if(temp==id) {
      if(node_new==NULL) {
        head = node_old->next;
        delete node_old;
        b_count--;
        return;
      } else {
                node_new->next = node_old->next;
        delete node_old;
        b_count--;
        return;
      }
        } else {
      node_new = node_old;
      node_old = node_old->next;
    }
  }
}

/** Returns the id of a being in the list */
unsigned int get_id(NODE *node) {
  return node->id;
}

/** Find a NPC id based on its coordinates */
unsigned int find_npc(unsigned short x, unsigned short y) {
  NODE *node = head;
  while(node) {
    if((node->job>=46)&&(node->job<=125)) { // Check if is a NPC (only low job ids)
      if((get_x(node->coordinates)==x)&&(get_y(node->coordinates)==y))
        return node->id;
      else node = node->next;
		} else {
			node = node->next;
			//alert("id","","","","",0,0);
		}
  }
  return 0;
}

/** Find a MONSTER id based on its coordinates */
unsigned int find_monster(unsigned short x, unsigned short y) {
  NODE *node = head;
  while(node) {
    if(node->job>200) { // Check if is a MONSTER
			if(get_x(node->coordinates)==x && get_y(node->coordinates)==y)
        return node->id;
    }
    node = node->next;
  }
  return 0;
}

/** Return a specific id node */
NODE *find_node(unsigned int id) {
  NODE *node = head;
  while(node)
    if(node->id==id)
      return node;
    else node = node->next;
  return NULL;
}

/** Sort beings in vertical order using bubble sort */
void sort() {
  NODE *p, *q, *r, *s, *temp;
  s = NULL;

  while(s!=head->next) {
    r = p = head;
    q = p->next;

    while(p!=s) {
      if(get_y(p->coordinates)>get_y(q->coordinates)) {
        if(p==head) {
          temp = q->next;
          q->next = p;
          p->next = temp;
          head = q;
          r = q;
        } else {
          temp = q->next;
          q->next = p;
          p->next = temp;
          r->next = q;
          r = q;
        }
      } else {
        r = p;
        p = p->next;
      }
      q = p->next;
      if(q==s)s = p;
    }
  }
}

/** Remove all path nodes from a being */
void empty_path(NODE *node) {
	if(node) {
    PATH_NODE *temp = node->path;
    PATH_NODE *next;
    while(temp) {
      next = temp->next;
      delete temp;
      temp = next;
    }
    node->path = NULL;
	}
}