#define BI_INT_OPER(FUNCNAME_,OPERATOR_) \ int FUNCNAME_(struct object *caller,struct object *obj, \ struct object *player,struct var_stack **rts) { \ struct var tmp1,tmp2; \ \ if (popint(&tmp2,rts,obj)) return 1; \ if (popint(&tmp1,rts,obj)) return 1; \ tmp1.value.integer=((tmp1.value.integer) OPERATOR_ \ (tmp2.value.integer)); \ push(&tmp1,rts); \ return 0; \ } #define CZBI_OPER(FUNCNAME_,OPERATOR_) \ int FUNCNAME_(struct object *caller,struct object *obj, \ struct object *player,struct var_stack **rts) { \ struct var tmp1,tmp2; \ \ if (popint(&tmp2,rts,obj)) return 1; \ if (popint(&tmp1,rts,obj)) return 1; \ if (tmp2.value.integer==0) return 1; \ tmp1.value.integer=((tmp1.value.integer) OPERATOR_ \ (tmp2.value.integer)); \ push(&tmp1,rts); \ return 0; \ } #define EQ_INT_OPER(FUNCNAME_,OPERATOR_) \ int FUNCNAME_(struct object *caller,struct object *obj, \ struct object *player,struct var_stack **rts) { \ struct var tmp1,tmp2; \ \ if (popint(&tmp2,rts,obj)) return 1; \ if (pop(&tmp1,rts,obj)) return 1; \ if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) { \ clear_var(&tmp1); \ return 1; \ } \ if (tmp1.value.l_value.size!=1) return 1; \ if (tmp1.type==GLOBAL_L_VALUE) { \ if (obj->globals[tmp1.value.l_value.ref].type!=INTEGER) \ return 1; \ (obj->globals[tmp1.value.l_value.ref].value.integer) \ OPERATOR_ (tmp2.value.integer); \ push(&(obj->globals[tmp1.value.l_value.ref]),rts); \ obj->obj_state=DIRTY; \ } else { \ if (locals[tmp1.value.l_value.ref].type!=INTEGER) \ return 1; \ (locals[tmp1.value.l_value.ref].value.integer) \ OPERATOR_ (tmp2.value.integer); \ push(&(locals[tmp1.value.l_value.ref]),rts); \ } \ return 0; \ } #define CZEQ_OPER(FUNCNAME_,OPERATOR_) \ int FUNCNAME_(struct object *caller,struct object *obj, \ struct object *player,struct var_stack **rts) { \ struct var tmp1,tmp2; \ \ if (popint(&tmp2,rts,obj)) return 1; \ if (pop(&tmp1,rts,obj)) return 1; \ if (tmp1.type!=GLOBAL_L_VALUE && tmp1.type!=LOCAL_L_VALUE) { \ clear_var(&tmp1); \ return 1; \ } \ if (tmp1.value.l_value.size!=1) return 1; \ if (tmp1.type==GLOBAL_L_VALUE) { \ if (obj->globals[tmp1.value.l_value.ref].type!=INTEGER) \ return 1; \ if (tmp2.value.integer==0) return 1; \ (obj->globals[tmp1.value.l_value.ref].value.integer) \ OPERATOR_ (tmp2.value.integer); \ push(&(obj->globals[tmp1.value.l_value.ref]),rts); \ obj->obj_state=DIRTY; \ } else { \ if (locals[tmp1.value.l_value.ref].type!=INTEGER) \ return 1; \ if (tmp2.value.integer==0) return 1; \ (locals[tmp1.value.l_value.ref].value.integer) \ OPERATOR_ (tmp2.value.integer); \ push(&(locals[tmp1.value.l_value.ref]),rts); \ } \ return 0; \ }