blob: 33d8bdc8a7932890d9b4edb7860e0673693a984c [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// npcmaster.c - Verwaltung der eindeutigen Nummernvergabe fuer NPCs und
4// der Stufenpunkte, die sie geben
5//
6// $Id: npcmaster.c 9142 2015-02-04 22:17:29Z Zesstra $
7//
8/*
9 * $Log: npcmaster.c,v $
10 * Revision 1.6 1996/09/18 08:59:49 Wargon
11 * Globale Variablen private gemacht...
12 *
13 * Revision 1.5 1996/04/10 17:48:37 Jof
14 * Dump-Funktion eingebaut, damit man auch was zu lesen hat :)
15 * ,
16 *
17 * Revision 1.4 1996/04/10 14:32:24 Wargon
18 * QueryNPC(): int * -> mixed
19 *
20 * Revision 1.3 1996/04/04 12:33:06 Wargon
21 * QueryNPCbyNumber() gibt jetzt wirklich Nummer und Score zurueck...
22 *
23 * Revision 1.2 1996/03/06 14:34:51 Jof
24 * QueryNPCbyNumber eingebaut, Typos gefixed
25 *
26 * Revision 1.1 1996/03/06 13:45:36 Jof
27 * Initial revision
28 *
29 */
30
31#include "/secure/npcmaster.h"
32#include "/secure/wizlevels.h"
33
34private int lastNum;
35private mapping npcs;
36private nosave mapping by_num;
37
38void make_num(string key) {
39 by_num += ([ npcs[key,NPC_NUMBER] : key; npcs[key,NPC_SCORE] ]);
40}
41
42void create()
43{
44 seteuid(getuid());
45 if (!restore_object(NPCSAVEFILE))
46 {
47 lastNum=0;
48 npcs=m_allocate(0,2);
49 }
50 by_num = m_allocate(0,2);
51 filter_indices(npcs, #'make_num/*'*/);
52}
53
54static int DumpNPCs();
55
56varargs mixed QueryNPC(int score)
57{
58 string key, val;
59
60 if (!previous_object())
61 return NPC_INVALID_ARG;
62 key=old_explode(object_name(previous_object()),"#")[0];
63 if (val=npcs[key,NPC_NUMBER])
64 return ({val,npcs[key,NPC_SCORE]});
65 if (score<=0 || member(inherit_list(previous_object()),"/std/living/life.c") < 0)
66 return NPC_INVALID_ARG;
67 npcs[key,NPC_SCORE]=score;
68 npcs[key,NPC_NUMBER]=++lastNum;
69 by_num += ([lastNum:key;score]);
70 save_object(NPCSAVEFILE);
71 call_out("DumpNPCs",0);
72 return ({lastNum,score});
73}
74
75int SetScore(string key,int score)
76{
77 if (!IS_ARCH(this_interactive())||!IS_ARCH(geteuid(previous_object())))
78 return NPC_NO_PERMISSION;
79 if (!npcs[key,NPC_NUMBER])
80 return NPC_INVALID_ARG;
81 npcs[key,NPC_SCORE]=score;
82 by_num += ([npcs[key,NPC_NUMBER]:key;score]);
83 save_object(NPCSAVEFILE);
84 DumpNPCs();
85 return 1;
86}
87
88static int DumpNPCs()
89{
90 mixed *keys;
91 int i, max;
92
93 keys=m_indices(npcs);
94 rm(NPCDUMPFILE);
95 for (i=sizeof(keys)-1, max=0;i>=0;i--) {
96 write_file(NPCDUMPFILE,sprintf("%5d %4d %s\n",npcs[keys[i],NPC_NUMBER],
97 npcs[keys[i],NPC_SCORE],keys[i]));
98 max += npcs[keys[i],NPC_SCORE];
99 }
100 write_file(NPCDUMPFILE,sprintf("====================\nGesamt: %d Punkte\n",max));
101 return 1;
102}
103
104mixed *QueryNPCbyNumber(int num)
105{
106 if (by_num[num])
107 return ({num,by_num[num,NPC_SCORE],by_num[num,NPC_NUMBER]});
108
109 return 0;
110}
111
112int Recalculate(string s)
113{
114 int i, j;
115
116 if (!s || !sizeof(s))
117 return 0;
118
119 for (j=0, i=6*sizeof(s)-1; i>0; i--) {
120 if (test_bit(s,i))
121 j+=by_num[i,NPC_SCORE];
122 }
123 return j;
124}