summaryrefslogtreecommitdiff
path: root/src/being.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/being.cpp')
-rw-r--r--src/being.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/being.cpp b/src/being.cpp
new file mode 100644
index 00000000..ca527882
--- /dev/null
+++ b/src/being.cpp
@@ -0,0 +1,210 @@
+/**
+
+ 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
+
+*/
+
+#include <stdio.h>
+#include <memory.h>
+#ifndef MACOSX
+ #include <malloc.h>
+#endif
+
+#ifdef LINUXPPC
+ #include <malloc.h>
+#endif
+
+#include "astar.h"
+#include "being.h"
+
+NODE *player_node = NULL;
+NODE *head = NULL; // First node of the list
+unsigned int count = 0; // Number of beings in the list
+
+/** Create a path node */
+PATH_NODE *create_path_node(unsigned short x, unsigned short y) {
+ PATH_NODE *ret = (PATH_NODE *)malloc(sizeof(PATH_NODE));
+ ret->x = x;
+ ret->y = y;
+ ret->next = NULL;
+ return ret;
+}
+
+/** Return a* path */
+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 *create_node() {
+ NODE *node = (NODE *)malloc(sizeof(NODE));
+ node->id = 0;
+ node->job = 0;
+ memset(node->coordinates, 0, 3);
+ node->next = NULL;
+ node->action = 0;
+ node->frame = 0;
+ node->path = NULL;
+ node->speech = NULL;
+ node->speech_time = 0;
+ node->speech_color = makecol(255,255,255);
+ node->tick_time = 0;
+ node->speed = 150;
+ node->emotion = 0;
+ node->emotion_time = 0;
+ node->text_x = node->text_y = 0;
+ return node;
+}
+
+/** Returns number of beings in the list */
+unsigned int get_count() {
+ return count;
+}
+
+/** Removes all beings from the list */
+void empty() {
+ NODE *node = head;
+ NODE *next;
+ while(node) {
+ next = node->next;
+ free(node);
+ node = next;
+ }
+ 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;
+ 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;
+ free(node_old);
+ count--;
+ return;
+ } else {
+ node_new->next = node_old->next;
+ free(node_old);
+ 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;
+ }
+ 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>=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;
+ }
+ 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;
+ }
+ }
+}