00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00027 #include <global.h>
00028 #include <ob_methods.h>
00029 #include <ob_types.h>
00030 #include <sounds.h>
00031 #include <sproto.h>
00032
00033 static void apply_sign(object *sign, object *op, int autoapply);
00034 static method_ret sign_type_apply(ob_methods *context, object *op, object *applier, int aflags);
00035 static method_ret sign_type_move_on(ob_methods *context, object *trap, object *victim, object *originator);
00036
00040 void init_type_sign(void) {
00041 register_move_on(SIGN, sign_type_move_on);
00042 register_apply(SIGN, sign_type_apply);
00043 }
00044
00051 static void apply_sign(object *sign, object *op, int autoapply) {
00052 const readable_message_type *msgType;
00053
00054 if (sign->msg == NULL) {
00055 draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_APPLY, MSG_TYPE_APPLY_FAILURE,
00056 "Nothing is written on it.", NULL);
00057 return;
00058 }
00059
00060 if (sign->stats.food) {
00061 if (sign->last_eat >= sign->stats.food) {
00062 if (!sign->move_on)
00063 draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_APPLY, MSG_TYPE_APPLY_FAILURE,
00064 "You cannot read it anymore.", NULL);
00065 return;
00066 }
00067
00068 if (!QUERY_FLAG(op, FLAG_WIZPASS))
00069 sign->last_eat++;
00070 }
00071
00072
00073
00074
00075
00076
00077 if (QUERY_FLAG(op, FLAG_BLIND)
00078 && !QUERY_FLAG(op, FLAG_WIZ)
00079 && !sign->move_on) {
00080 draw_ext_info(NDI_UNIQUE, 0, op, MSG_TYPE_APPLY, MSG_TYPE_APPLY_ERROR,
00081 "You are unable to read while blind.", NULL);
00082 return;
00083 }
00084 msgType = get_readable_message_type(sign);
00085 draw_ext_info(NDI_UNIQUE|NDI_NAVY, 0, op, msgType->message_type, msgType->message_subtype,
00086 sign->msg, sign->msg);
00087 }
00088
00097 static method_ret sign_type_apply(ob_methods *context, object *op, object *applier, int aflags) {
00098 apply_sign(op, applier, 0);
00099 return METHOD_OK;
00100 }
00101
00110 static method_ret sign_type_move_on(ob_methods *context, object *trap, object *victim, object *originator) {
00111 if (common_pre_ob_move_on(trap, victim, originator) == METHOD_ERROR)
00112 return METHOD_OK;
00113 if (victim->type != PLAYER && trap->stats.food > 0) {
00114 common_post_ob_move_on(trap, victim, originator);
00115 return METHOD_OK;
00116 }
00117 apply_sign(trap, victim, 1);
00118 common_post_ob_move_on(trap, victim, originator);
00119 return METHOD_OK;
00120 }