Nur Boote und Langboote koennen per Zauber fliegen.

Ein Item fuer den Flug von anderen Schiffen.
This commit is contained in:
Enno Rehling 2007-04-22 01:10:38 +00:00
parent 614aa80bdf
commit c36b14e9e0
8 changed files with 89 additions and 21 deletions

View File

@ -672,8 +672,13 @@ ship_allowed(const struct ship * sh, const region * r)
static boolean static boolean
flying_ship(const ship * sh) flying_ship(const ship * sh)
{ {
static const curse_type * ct_flyingship;
if (!ct_flyingship) {
ct_flyingship = ct_find("flyingship");
assert(ct_flyingship);
}
if (sh->type->flags & SFL_FLY) return true; if (sh->type->flags & SFL_FLY) return true;
if (is_cursed(sh->attribs, C_SHIP_FLYING, 0)) return true; if (curse_active(get_curse(sh->attribs, ct_flyingship))) return true;
return false; return false;
} }

View File

@ -6544,10 +6544,22 @@ sp_movecastle(castorder *co)
return cast_level; return cast_level;
} }
boolean curse *
shipcurse_flyingship(ship* sh, int power, int duration) shipcurse_flyingship(ship* sh, unit * mage, double power, int duration)
{ {
return false; static const curse_type * ct_flyingship = NULL;
if (!ct_flyingship) {
ct_flyingship = ct_find("flyingship");
assert(ct_flyingship);
}
if (curse_active(get_curse(sh->attribs, ct_flyingship))) {
return NULL;
} else if (is_cursed(sh->attribs, C_SHIP_SPEEDUP, 0)) {
return NULL;
} else {
/* mit C_SHIP_NODRIFT haben wir kein Problem */
return create_curse(mage, &sh->attribs, ct_flyingship, power, duration, zero_effect, 0);
}
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/* Name: Luftschiff /* Name: Luftschiff
@ -6572,30 +6584,29 @@ sp_flying_ship(castorder *co)
double power = co->force; double power = co->force;
spellparameter *pa = co->par; spellparameter *pa = co->par;
message * m = NULL; message * m = NULL;
curse * c;
/* wenn kein Ziel gefunden, Zauber abbrechen */ /* wenn kein Ziel gefunden, Zauber abbrechen */
if (pa->param[0]->flag == TARGET_NOTFOUND) return 0; if (pa->param[0]->flag == TARGET_NOTFOUND) return 0;
if (sh->type->construction->maxsize>50) {
/* TODO: error message */
return 0;
}
sh = pa->param[0]->data.sh; sh = pa->param[0]->data.sh;
if (is_cursed(sh->attribs, C_SHIP_FLYING, 0) ) {
/* sprintf(buf, "Auf dem Schiff befindet liegt bereits so ein Zauber."); */
cmistake(mage, co->order, 211, MSG_MAGIC);
return 0;
}
if (is_cursed(sh->attribs, C_SHIP_SPEEDUP, 0) ) {
/* sprintf(buf, "Es ist zu gefährlich, ein sturmgepeitschtes Schiff "
"fliegen zu lassen."); */
cmistake(mage, co->order, 210, MSG_MAGIC);
return 0;
}
/* mit C_SHIP_NODRIFT haben wir kein Problem */
/* Duration = 1, nur diese Runde */ /* Duration = 1, nur diese Runde */
create_curse(mage, &sh->attribs, ct_find("flyingship"), power, 1, zero_effect, 0); c = shipcurse_flyingship(sh, mage, power, 1);
/* Da der Spruch nur diese Runde wirkt, brauchen wir kein if (c==NULL) {
* set_cursedisplay() zu benutzten - es sieht eh niemand... if (is_cursed(sh->attribs, C_SHIP_FLYING, 0) ) {
*/ /* Auf dem Schiff befindet liegt bereits so ein Zauber. */
cmistake(mage, co->order, 211, MSG_MAGIC);
} else if (is_cursed(sh->attribs, C_SHIP_SPEEDUP, 0) ) {
/* Es ist zu gefährlich, ein sturmgepeitschtes Schiff fliegen zu lassen. */
cmistake(mage, co->order, 210, MSG_MAGIC);
}
return 0;
}
sh->coast = NODIRECTION; sh->coast = NODIRECTION;
/* melden, 1x pro Partei */ /* melden, 1x pro Partei */

View File

@ -19,6 +19,8 @@ extern "C" {
#endif #endif
extern void register_spells(void); extern void register_spells(void);
extern struct curse * shipcurse_flyingship(struct ship* sh, struct unit * mage, double power, int duration);
/* für Feuerwände: in movement muß das noch explizit getestet werden. /* für Feuerwände: in movement muß das noch explizit getestet werden.
* besser wäre eine blcok_type::move() routine, die den effekt * besser wäre eine blcok_type::move() routine, die den effekt

View File

@ -13,11 +13,14 @@
#include <gamecode/monster.h> #include <gamecode/monster.h>
#include <gamecode/creport.h> #include <gamecode/creport.h>
#include <spells/spells.h>
// kernel includes // kernel includes
#include <kernel/alliance.h> #include <kernel/alliance.h>
#include <kernel/equipment.h> #include <kernel/equipment.h>
#include <kernel/faction.h> #include <kernel/faction.h>
#include <kernel/item.h> #include <kernel/item.h>
#include <kernel/ship.h>
#include <kernel/message.h> #include <kernel/message.h>
#include <kernel/plane.h> #include <kernel/plane.h>
#include <kernel/race.h> #include <kernel/race.h>
@ -265,6 +268,15 @@ process_orders(void)
return 0; return 0;
} }
static int
levitate_ship(ship& sh, unit& mage, double power, int duration)
{
curse * c = shipcurse_flyingship(&sh, &mage, power, duration);
if (c) {
return c->no;
}
return 0;
}
void void
bind_gamecode(lua_State * L) bind_gamecode(lua_State * L)
@ -290,6 +302,9 @@ bind_gamecode(lua_State * L)
def("message_faction", &message_faction), def("message_faction", &message_faction),
def("message_region", &message_region), def("message_region", &message_region),
/* spells and stuff */
def("levitate_ship", &levitate_ship),
/* scripted monsters */ /* scripted monsters */
def("spawn_braineaters", &spawn_braineaters), def("spawn_braineaters", &spawn_braineaters),
def("spawn_undead", &spawn_undead), def("spawn_undead", &spawn_undead),

View File

@ -30,6 +30,9 @@
</string> </string>
</namespace> </namespace>
<namespace name="iteminfo"> <namespace name="iteminfo">
<string name="ring_of_levitation">
<text locale="de">Benutzt der Kapitän des Schiffes diesen Talisman, so wird allen an Bord befindlichen Mallornsamen ihre magisch Energie entzogen, und das Schiff kann mit dieser Energie bis zu zwei Wochen lang fliegen.</text>
</string>
<string name="birthdaycake"> <string name="birthdaycake">
<text locale="de">Eine Geburtstagstorte mit 10 Kerzen. Herzlichen Glückwunsch, Eressea!</text> <text locale="de">Eine Geburtstagstorte mit 10 Kerzen. Herzlichen Glückwunsch, Eressea!</text>
<text locale="en">A birthday cake with 10 candles. Happy Birthday, Eressea!</text> <text locale="en">A birthday cake with 10 candles. Happy Birthday, Eressea!</text>
@ -166,6 +169,14 @@
the sky one cold winter night, is said to have aphrodisiacal powers.</text> the sky one cold winter night, is said to have aphrodisiacal powers.</text>
</string> </string>
</namespace> </namespace>
<string name="ring_of_levitation">
<text locale="de">Ring der Levitation</text>
<text locale="en">ring of levitation</text>
</string>
<string name="ring_of_levitation_p">
<text locale="de">Ringe der Levitation</text>
<text locale="en">rings of levitation</text>
</string>
<string name="birthdaycake"> <string name="birthdaycake">
<text locale="de">Geburtstagstorte</text> <text locale="de">Geburtstagstorte</text>
<text locale="en">birthday cake</text> <text locale="en">birthday cake</text>

View File

@ -22,6 +22,12 @@
</item> </item>
</resource> </resource>
<resource name="ring_of_levitation" appearance="ring">
<item notlost="yes" weight="0">
<function name="use" value="lua_useitem"/>
</item>
</resource>
<resource name="birthdaycake"> <resource name="birthdaycake">
<item notlost="yes" weight="0"/> <item notlost="yes" weight="0"/>
</resource> </resource>

View File

@ -30,6 +30,7 @@ function run_scripts()
"eressea/eternath.lua", "eressea/eternath.lua",
"eressea/wedding-jadee.lua", "eressea/wedding-jadee.lua",
"eressea/ponnuki.lua", "eressea/ponnuki.lua",
"eressea/items.lua",
"eressea/xmas2004.lua", "eressea/xmas2004.lua",
"eressea/10years.lua", "eressea/10years.lua",
"eressea/xmas2005.lua", "eressea/xmas2005.lua",

View File

@ -0,0 +1,17 @@
function use_ring_of_levitation(u, amount)
if u.ship~=nil and amount>0 then
local mallorn = 0
for u2 in u.region.units do
local i = u2:get_item("mallornseed")
if i>0 then
u2:use_item("mallornseed", i)
u2:add_item("seed", i)
mallorn = mallorn + i
end
end
if mallorn>0 then
levitate_ship(u.ship, u, mallorn, 2)
end
end
return 0
end