Atrinik Server  4.0
duplicator.c
Go to the documentation of this file.
1 /*************************************************************************
2  * Atrinik, a Multiplayer Online Role Playing Game *
3  * *
4  * Copyright (C) 2009-2014 Alex Tokar and Atrinik Development Team *
5  * *
6  * Fork from Crossfire (Multiplayer game for X-windows). *
7  * *
8  * This program is free software; you can redistribute it and/or modify *
9  * it under the terms of the GNU General Public License as published by *
10  * the Free Software Foundation; either version 2 of the License, or *
11  * (at your option) any later version. *
12  * *
13  * This program is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16  * GNU General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU General Public License *
19  * along with this program; if not, write to the Free Software *
20  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
21  * *
22  * The author can be reached at admin@atrinik.org *
23  ************************************************************************/
24 
32 #include <global.h>
33 #include <arch.h>
34 #include <object_methods.h>
35 
44 static void
45 duplicator_match_obj (object *op, object *tmp)
46 {
47  HARD_ASSERT(op != NULL);
48  HARD_ASSERT(tmp != NULL);
49 
50  if (op->slaying != tmp->arch->name) {
51  return;
52  }
53 
54  if (op->level <= 0) {
55  object_destruct(tmp);
56  } else {
57  tmp->nrof = MIN(UINT32_MAX, (uint64_t) tmp->nrof * op->level);
58  }
59 }
60 
62 static int
63 move_on_func (object *op, object *victim, object *originator, int state)
64 {
65  HARD_ASSERT(op != NULL);
66  HARD_ASSERT(victim != NULL);
67 
68  if (state != 0) {
69  duplicator_match_obj(op, victim);
70  }
71 
72  return OBJECT_METHOD_OK;
73 }
74 
76 static int
77 trigger_func (object *op, object *cause, int state)
78 {
79  HARD_ASSERT(op != NULL);
80  HARD_ASSERT(cause != NULL);
81 
82  FOR_MAP_PREPARE(op->map, op->x, op->y, tmp) {
83  duplicator_match_obj(op, tmp);
84  } FOR_MAP_FINISH();
85 
86  return OBJECT_METHOD_OK;
87 }
88 
93 {
94  OBJECT_METHODS(DUPLICATOR)->move_on_func = move_on_func;
95  OBJECT_METHODS(DUPLICATOR)->trigger_func = trigger_func;
96 }
static void duplicator_match_obj(object *op, object *tmp)
Definition: duplicator.c:45
static int trigger_func(object *op, object *cause, int state)
Definition: duplicator.c:77
static int move_on_func(object *op, object *victim, object *originator, int state)
Definition: duplicator.c:63
const char * slaying
Definition: object.h:180
void object_destruct(object *op)
Definition: object.c:1521
struct archetype * arch
Definition: object.h:225
int16_t y
Definition: object.h:276
struct mapdef * map
Definition: object.h:139
uint32_t nrof
Definition: object.h:264
#define FOR_MAP_FINISH()
Definition: define.h:1759
int16_t x
Definition: object.h:273
OBJECT_TYPE_INIT_DEFINE(duplicator)
Definition: duplicator.c:92
#define DUPLICATOR
Definition: define.h:162
#define OBJECT_METHODS(type)
shstr * name
More definite name, like "kobold".
Definition: arch.h:46
#define OBJECT_METHOD_OK
int8_t level
Definition: object.h:347
#define FOR_MAP_PREPARE(map_, mx_, my_, it_)
Definition: define.h:1752