Crossfire Server, Branch 1.12
R12190
|
00001 /* 00002 CrossFire, A Multiplayer game for X-windows 00003 00004 Copyright (C) 2007 Mark Wedel & Crossfire Development Team 00005 Copyright (C) 1992 Frank Tore Johansen 00006 00007 This program is free software; you can redistribute it and/or modify 00008 it under the terms of the GNU General Public License as published by 00009 the Free Software Foundation; either version 2 of the License, or 00010 (at your option) any later version. 00011 00012 This program is distributed in the hope that it will be useful, 00013 but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 GNU General Public License for more details. 00016 00017 You should have received a copy of the GNU General Public License 00018 along with this program; if not, write to the Free Software 00019 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00020 00021 The authors can be reached via e-mail at crossfire-devel@real-time.com 00022 */ 00027 #include <global.h> 00028 #include <ob_methods.h> 00029 #include <ob_types.h> 00030 #include <sproto.h> 00031 00032 static method_ret power_crystal_type_apply(ob_methods *context, object *op, object *applier, int aflags); 00033 00037 void init_type_power_crystal(void) { 00038 register_apply(POWER_CRYSTAL, power_crystal_type_apply); 00039 register_describe(POWER_CRYSTAL, common_ob_describe); 00040 } 00041 00053 static method_ret power_crystal_type_apply(ob_methods *context, object *op, object *applier, int aflags) { 00054 int available_power; 00055 int power_space; 00056 int power_grab; 00057 00058 available_power = applier->stats.sp-applier->stats.maxsp; 00059 power_space = op->stats.maxsp-op->stats.sp; 00060 power_grab = 0; 00061 if (available_power >= 0 && power_space > 0) 00062 power_grab = MIN(power_space, 0.5*applier->stats.sp); 00063 if (available_power < 0 && op->stats.sp > 0) 00064 power_grab = -MIN(-available_power, op->stats.sp); 00065 00066 applier->stats.sp -= power_grab; 00067 op->stats.sp += power_grab; 00068 op->speed = (float)op->stats.sp/(float)op->stats.maxsp; 00069 update_ob_speed(op); 00070 if (applier->type == PLAYER) 00071 esrv_update_item(UPD_ANIMSPEED, applier, op); 00072 return METHOD_OK; 00073 }