-
Notifications
You must be signed in to change notification settings - Fork 0
/
player.c
75 lines (60 loc) · 1.78 KB
/
player.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <string.h>
#include "copyright.h"
#include "db.h"
#include "config.h"
#include "interface.h"
#include "externs.h"
#ifndef PLAYER_LIST
/* don't use this, it's expensive */
/* maybe soon we'll put in a hash table */
dbref lookup_player(const char *name)
{
dbref i;
for(i = 0; i < db_top; i++) {
if(Typeof(i) == TYPE_PLAYER
&& db[i].name && !string_compare(db[i].name, name)) return i;
}
return NOTHING;
}
#endif PLAYER_LIST
dbref connect_player(const char *name, const char *password)
{
dbref player;
if((player = lookup_player(name)) == NOTHING) return NOTHING;
if(db[player].password
&& *db[player].password
&&strcmp(db[player].password, password)) return NOTHING;
return player;
}
dbref create_player(const char *name, const char *password)
{
dbref player;
if(!ok_player_name(name) || !ok_password(password)) return NOTHING;
/* else he doesn't already exist, create him */
player = new_object();
/* initialize everything */
db[player].name = alloc_string(name);
db[player].location = PLAYER_START;
db[player].exits = PLAYER_START; /* home */
db[player].owner = player;
db[player].flags = TYPE_PLAYER;
db[player].password = alloc_string(password);
/* link him to PLAYER_START */
PUSH(player, db[PLAYER_START].contents);
#ifdef PLAYER_LIST
add_player(player);
#endif PLAYER_LIST
return player;
}
void do_password(dbref player, const char *old, const char *newobj)
{
if(!db[player].password || strcmp(old, db[player].password)) {
notify(player, "Sorry");
} else if(!ok_password(newobj)) {
notify(player, "Bad new password.");
} else {
free((void *) db[player].password);
db[player].password = alloc_string(newobj);
notify(player, "Password changed.");
}
}