From 5fa56103cccbd64715015a567c7c65552bf424f7 Mon Sep 17 00:00:00 2001 From: Christian Schlittchen Date: Sun, 1 Jan 2006 15:17:08 +0000 Subject: [PATCH] Fehlende Dateien, Umlautkorrektur --- src/common/items/phoenixcompass.c | 117 ++++++++++++++++++++++++++++++ src/common/items/phoenixcompass.h | 26 +++++++ src/res/messages.xml | 2 +- src/res/vinyambar/wdw-strings.xml | 4 +- 4 files changed, 146 insertions(+), 3 deletions(-) create mode 100644 src/common/items/phoenixcompass.c create mode 100644 src/common/items/phoenixcompass.h diff --git a/src/common/items/phoenixcompass.c b/src/common/items/phoenixcompass.c new file mode 100644 index 000000000..a814d4067 --- /dev/null +++ b/src/common/items/phoenixcompass.c @@ -0,0 +1,117 @@ +/* vi: set ts=2: +* +* Eressea PB(E)M host Copyright (C) 1998-2003 +* Christian Schlittchen (corwin@amber.kn-bremen.de) +* Katja Zedel (katze@felidae.kn-bremen.de) +* Henning Peters (faroul@beyond.kn-bremen.de) +* Enno Rehling (enno@eressea-pbem.de) +* Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de) +* +* This program may not be used, modified or distributed without +* prior permission by the authors of Eressea. +*/ + +#include +#include +#include "phoenixcompass.h" + +/* kernel includes */ +#include +#include +#include +#include +#include + +/* util includes */ +#include +#include + +/* libc includes */ +#include +#include +#include +#include + +static int +use_phoenixcompass(struct unit * u, const struct item_type * itype, + int amount, struct order * ord) +{ + region *r; + unit *closest_phoenix = NULL; + int closest_phoenix_distance = INT_MAX; + boolean confusion = false; + direction_t direction; + unit *u2; + direction_t closest_neighbour_direction = 0; + + /* find the closest phoenix. */ + + for(r=regions; r; r=r->next) { + for(u2=r->units; u2; u2=u2->next) { + if(u2->race == new_race[RC_PHOENIX]) { + if(closest_phoenix == NULL) { + closest_phoenix = u2; + closest_phoenix_distance = distance(u->region, closest_phoenix->region); + } else { + int dist = distance(u->region, r); + if(dist < closest_phoenix_distance) { + closest_phoenix = u2; + closest_phoenix_distance = dist; + confusion = false; + } else if(dist == closest_phoenix_distance) { + confusion = true; + } + } + } + } + } + + /* no phoenix found at all.* if confusion == true more than one phoenix + * at the same distance was found and the device is confused */ + + if(closest_phoenix == NULL + || closest_phoenix->region == u->region + || confusion == true) { + add_message(&u->faction->msgs, msg_message("phoenixcompass_confusion", + "unit region command", u, u->region, ord)); + return 0; + } + + /* else calculate the direction. this is tricky. we calculate the + * neighbouring region which is closest to the phoenix found. hardcoded + * for readability. */ + + for(direction = 0; direction < MAXDIRECTIONS; ++direction) { + region *neighbour; + int closest_neighbour_distance = INT_MAX; + + neighbour = r_connect(u->region, direction); + if(neighbour != NULL) { + int dist = distance(neighbour, closest_phoenix->region); + if(dist < closest_neighbour_distance) { + closest_neighbour_direction = direction; + closest_neighbour_distance = dist; + } else if(dist == closest_neighbour_distance && rand()%100 < 50) { + /* there can never be more than two neighbours with the same + * distance (except when you are standing in the same region + * as the phoenix, but that case has already been handled). + * therefore this simple solution is correct */ + closest_neighbour_direction = direction; + closest_neighbour_distance = dist; + } + } + } + + add_message(&u->faction->msgs, msg_message("phoenixcompass_success", + "unit region command dir", + u, u->region, ord, closest_neighbour_direction)); + + return 0; +} + +void +register_phoenixcompass(void) +{ + register_function((pf_generic)use_phoenixcompass, "use_phoenixcompass"); +} + diff --git a/src/common/items/phoenixcompass.h b/src/common/items/phoenixcompass.h new file mode 100644 index 000000000..67fd54470 --- /dev/null +++ b/src/common/items/phoenixcompass.h @@ -0,0 +1,26 @@ +/* vi: set ts=2: + * + * + * Eressea PB(E)M host Copyright (C) 1998-2003 + * Christian Schlittchen (corwin@amber.kn-bremen.de) + * Katja Zedel (katze@felidae.kn-bremen.de) + * Henning Peters (faroul@beyond.kn-bremen.de) + * Enno Rehling (enno@eressea-pbem.de) + * Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de) + * + * This program may not be used, modified or distributed without + * prior permission by the authors of Eressea. + */ + +#ifndef H_ITM_PHOENIXCOMPASS +#define H_ITM_PHOENIXCOMPASS +#ifdef __cplusplus +extern "C" { +#endif + +extern void register_phoenixcompass(void); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/res/messages.xml b/src/res/messages.xml index 7b27935ba..0f50c6596 100644 --- a/src/res/messages.xml +++ b/src/res/messages.xml @@ -6566,7 +6566,7 @@ - "$unit($unit) in $region($region): '$order($command)' - Die Kompassnadel springt wild hin und her und es laesst sich keine Richtung erkennen." + "$unit($unit) in $region($region): '$order($command)' - Die Kompassnadel springt wild hin und her und es lässt sich keine Richtung erkennen." "$unit($unit) in $region($region): '$order($command)' - The needle jumps wildly and there is no specific direction recognizable." "$unit($unit) in $region($region): '$order($command)' - The needle jumps wildly and there is no specific direction recognizable." diff --git a/src/res/vinyambar/wdw-strings.xml b/src/res/vinyambar/wdw-strings.xml index 8345f109d..80063e351 100644 --- a/src/res/vinyambar/wdw-strings.xml +++ b/src/res/vinyambar/wdw-strings.xml @@ -143,11 +143,11 @@ trapped air elementals - Phoenixkompass + Phönixkompass phoenixcompass - Phoenixkompasse + Phönixkompasse phoenix compasses