void f_reference_allowed() { svalue_t *sv = sp - st_num_arg + 1; svalue_t *v; object_t *referee = NULL; object_t *referrer_obj = command_giver; /* Default to this_player(). */ const char *referrer_name = NULL; int result = 0; int num_arg = st_num_arg; /* Maybe I could learn how to use this :p CHECK_TYPES(sp-1, T_NUMBER, 1, F_MEMBER_ARRAY); */ if (sv->type == T_OBJECT && sv->u.ob) { referee = sv->u.ob; } if (st_num_arg > 1) { if (sv[1].type == T_STRING && sv[1].u.string) { /* We've been passed in a string, now we need to call * find_player() */ #ifdef F_FIND_PLAYER /* If we have a find_player() efun, then we need to sue * the following method. This hasn't been tested! */ referrer = find_living_object(sv[1].u.string, 1); #else if (simul_efun_ob) { push_svalue(&sv[1]); v = apply("find_player", simul_efun_ob, 1, ORIGIN_EFUN); if (v && v->type == T_OBJECT) { referrer_obj = v->u.ob; referrer_name = sv[1].u.string; } else { referrer_obj = NULL; referrer_name = sv[1].u.string; } } #endif } if (sv[1].type == T_OBJECT && sv[1].u.ob) { referrer_obj = sv[1].u.ob; referrer_name = NULL; } } if (referee && (referrer_obj || referrer_name)) { result = reference_allowed(referee, referrer_obj, referrer_name); pop_n_elems(num_arg); push_number(result); } else { pop_n_elems(num_arg); push_undefined(); } }
void f_find_player (void) { object_t *ob; ob = find_living_object(sp->u.string, 1); free_string_svalue(sp); /* safe b/c destructed objects have had their living names removed */ if (ob) { put_unrefed_undested_object(ob, "find_living"); } else { *sp = const0; } }