00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #include <global.h>
00029 #include <ob_methods.h>
00030 #include <ob_types.h>
00031 #include <sounds.h>
00032 #include <sproto.h>
00033
00034 static method_ret mood_floor_type_process(ob_methods *context, object *op);
00035 static method_ret mood_floor_type_trigger(ob_methods *context, object *op, object *cause, int state);
00036
00040 void init_type_mood_floor(void) {
00041 register_process(MOOD_FLOOR, mood_floor_type_process);
00042 register_trigger(MOOD_FLOOR, mood_floor_type_trigger);
00043 }
00044
00062 static void do_mood_floor(object *op, object *op2) {
00063 object *tmp;
00064 object *tmp2;
00065
00066 for (tmp = GET_MAP_OB(op->map, op->x, op->y); tmp; tmp = tmp->above)
00067 if (QUERY_FLAG(tmp, FLAG_MONSTER))
00068 break;
00069
00070
00071
00072
00073 if (!tmp || tmp->type == PLAYER)
00074 return;
00075
00076 switch (op->last_sp) {
00077 case 0:
00078 if (QUERY_FLAG(tmp, FLAG_UNAGGRESSIVE))
00079 CLEAR_FLAG(tmp, FLAG_UNAGGRESSIVE);
00080 if (QUERY_FLAG(tmp, FLAG_FRIENDLY)) {
00081 CLEAR_FLAG(tmp, FLAG_FRIENDLY);
00082 remove_friendly_object(tmp);
00083 tmp->attack_movement = 0;
00084
00085
00086
00087 if (tmp->type == GOLEM
00088 && tmp->owner
00089 && tmp->owner->type == PLAYER
00090 && tmp->owner->contr->ranges[range_golem] == tmp) {
00091 tmp->owner->contr->ranges[range_golem] = NULL;
00092 tmp->owner->contr->golem_count = 0;
00093 }
00094 tmp->owner = NULL;
00095 }
00096 break;
00097
00098 case 1:
00099 if (QUERY_FLAG(tmp, FLAG_UNAGGRESSIVE)
00100 && !QUERY_FLAG(tmp, FLAG_FRIENDLY))
00101 CLEAR_FLAG(tmp, FLAG_UNAGGRESSIVE);
00102 break;
00103
00104 case 2:
00105 if (!QUERY_FLAG(tmp, FLAG_UNAGGRESSIVE)) {
00106 SET_FLAG(tmp, FLAG_UNAGGRESSIVE);
00107 tmp->enemy = NULL;
00108 }
00109 break;
00110
00111 case 3:
00112 if (!QUERY_FLAG(tmp, FLAG_SLEEP))
00113 SET_FLAG(tmp, FLAG_SLEEP);
00114 break;
00115
00116 case 4:
00117 if (op == op2)
00118 break;
00119
00120 for (tmp2 = GET_MAP_OB(op2->map, op2->x, op2->y); tmp2->type != PLAYER; tmp2 = tmp2->above)
00121 if (tmp2->above == NULL)
00122 break;
00123 if (tmp2->type != PLAYER)
00124 break;
00125 set_owner(tmp, tmp2);
00126 SET_FLAG(tmp, FLAG_MONSTER);
00127 tmp->stats.exp = 0;
00128 SET_FLAG(tmp, FLAG_FRIENDLY);
00129 add_friendly_object(tmp);
00130 tmp->attack_movement = PETMOVE;
00131 break;
00132
00133 default:
00134 break;
00135 }
00136 }
00137
00144 static method_ret mood_floor_type_process(ob_methods *context, object *op) {
00145 do_mood_floor(op, op);
00146 return METHOD_OK;
00147 }
00148
00157 static method_ret mood_floor_type_trigger(ob_methods *context, object *op, object *cause, int state) {
00158 do_mood_floor(op, cause);
00159 return METHOD_OK;
00160 }