Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/secure/pubmaster.c b/secure/pubmaster.c
new file mode 100644
index 0000000..a124889
--- /dev/null
+++ b/secure/pubmaster.c
@@ -0,0 +1,307 @@
+// MorgenGrauen MUDlib
+//
+// Pubmaster.c -- Registrating the heal-values of pubs
+//
+// $Id: pubmaster.c 9373 2015-10-22 19:02:42Z Zesstra $
+
+#include <pub.h>
+
+#define SAVEFILE "/secure/ARCH/pub"
+#define CLOGFILE "/log/ARCH/pubchange"
+#define DUMPFILE "/log/ARCH/PUBS"
+#define DUMPLIST "/log/ARCH/PUBLIST"
+
+#define DUMPF(str) write_file(DUMPFILE,str)
+#define DUMPL(str) write_file(DUMPLIST,str)
+
+#pragma strong_types
+
+#include <properties.h>
+#include <wizlevels.h>
+#include <health.h>
+
+mapping pubs;
+nosave string *watchprops;
+nosave int watchsize;
+
+void create()
+{
+ seteuid(getuid(this_object()));
+ if (clonep(this_object()))
+ {
+ destruct(this_object());
+ return;
+ }
+ if (!restore_object(SAVEFILE))
+ pubs = ([]);
+
+ watchprops = ({ P_HP, P_SP, P_ALCOHOL, P_DRINK, P_FOOD, P_VALUE,
+ "rate", "delay" });
+ watchsize = sizeof(watchprops);
+}
+
+void save_data()
+{
+ save_object(SAVEFILE);
+}
+
+int CalcMax(mapping info, string fn)
+{ float heal,delay,factor;
+
+ if (!info || !mappingp(info))
+ return 0;
+ if ( (info[P_ALCOHOL]+info[P_DRINK]+info[P_FOOD])<=0 ||
+ (info[P_ALCOHOL] && !(info[P_DRINK]||info[P_FOOD])) )
+ return 0;
+
+ delay = to_float(info["delay"]);
+ if (delay>PUB_MAXDELAY)
+ delay=PUB_MAXDELAY;
+
+ if (!stringp(fn) || !member(pubs,fn)) // External query?
+ factor=1.0;
+ else
+ factor=pubs[fn,1];
+
+ heal = to_float( info[P_ALCOHOL]*ALCOHOL_DELAY +
+ info[P_DRINK] *DRINK_DELAY +
+ info[P_FOOD] *FOOD_DELAY )
+ * PUB_SOAKMULT
+ / to_float( ALCOHOL_DELAY + DRINK_DELAY + FOOD_DELAY );
+ heal = heal +
+ to_float(info[P_VALUE])/(PUB_VALUEDIV+to_float(info["rate"])) -
+ exp(to_float(info["rate"])/PUB_RATEDIV1)/PUB_RATEDIV2;
+ heal = heal * factor *
+ (PUB_WAITOFFS + (exp(delay/PUB_WAITDIV1)/PUB_WAITDIV2));
+
+ return to_int(heal);
+}
+
+int RegisterItem(string item, mapping info)
+{ object pub;
+ string fn;
+ int i,c,cmax,max,heal;
+
+ if (!objectp(pub=previous_object()))
+ return -1;
+ if (member(inherit_list(pub), "/std/room/pub.c") == -1)
+ return -1;
+ if (!item || !stringp(item) || !info || !mappingp(info))
+ return -2;
+
+ if (info["rate"]<1)
+ info["rate"]=1;
+ if (info["delay"]<0)
+ info["delay"]=0;
+
+ // Loadname, weil VCs als ein Pub zaehlen sollen (das Tutorial hat ein
+ // VC-Pub fuer jeden Spieler. Die sollen nicht alle einzeln hier erfasst
+ // werden.
+ fn = load_name(pub);
+ c = 0;
+
+ heal=info[P_HP]+info[P_SP];
+
+ if (!member(pubs,fn))
+ pubs += ([ fn : ([]); 1.0 ]);
+
+ if (!member(pubs[fn],item))
+ {
+ max=CalcMax(info,fn);
+ pubs[fn] += ([
+ item : ([
+ P_HP : info[P_HP],
+ P_SP : info[P_SP],
+ P_VALUE : info[P_VALUE],
+ P_DRINK : info[P_DRINK],
+ P_ALCOHOL : info[P_ALCOHOL],
+ P_FOOD : info[P_FOOD],
+ "rate" : info["rate"],
+ "delay" : info["delay"],
+ "maxheal" : heal,
+ "maxrate" : 10
+ ])
+ ]);
+ c=1;
+ }
+ else
+ {
+ for (i=watchsize-1;i>=0;i--)
+ if (info[watchprops[i]]!=pubs[fn][item][watchprops[i]])
+ {
+ pubs[fn][item][watchprops[i]]=info[watchprops[i]];
+ c=1;
+ }
+ if (heal>pubs[fn][item]["maxheal"])
+ {
+ pubs[fn][item]["maxheal"]=heal;
+ c=1;
+ }
+ max=pubs[fn][item]["maxset"];
+ cmax=CalcMax(info,fn);
+ if (cmax>max)
+ max=cmax;
+ }
+
+ if (c)
+ save_data();
+
+ if ( heal>max || info["rate"]>pubs[fn][item]["maxrate"] )
+ return 0;
+
+ return 1;
+}
+
+private int allowed()
+{
+ if (previous_object() && geteuid(previous_object())==ROOTID)
+ return 1;
+ if (!process_call() && previous_object() && ARCH_SECURITY)
+ return 1;
+ return 0;
+}
+
+
+
+int SetMaxHeal(string pub, string item, int new)
+{ int old;
+
+ if (!allowed())
+ return -2;
+ if (!pub || !stringp(pub) || !item || !stringp(item) || !new)
+ return -1;
+ if (!member(pubs,pub) || !member(pubs[pub],item))
+ return 0;
+ old=pubs[pub][item]["maxset"];
+ pubs[pub][item]["maxset"]=new;
+ write_file(CLOGFILE,
+ sprintf("%s - %s\n%s:%s HEAL %d > %d\n",
+ dtime(time()),
+ (this_interactive() ? getuid(this_interactive()) : "???"),
+ pub,item,old,new));
+ save_data();
+ return 1;
+}
+
+int SetMaxRate(string pub, string item, int new)
+{ int old;
+
+ if (!allowed())
+ return -2;
+ if (!pub || !stringp(pub) || !item || !stringp(item) || !new)
+ return -1;
+ if (!member(pubs,pub) || !member(pubs[pub],item))
+ return 0;
+ old=pubs[pub][item]["maxrate"];
+ pubs[pub][item]["maxrate"]=new;
+ write_file(CLOGFILE,
+ sprintf("%s - %s\n%s:%s RATE %d > %d\n",
+ dtime(time()),
+ (this_interactive() ? getuid(this_interactive()) : "???"),
+ pub,item,old,new));
+ save_data();
+ return 1;
+}
+
+int SetPubFactor(string pub, float new)
+{ float old;
+
+ if (!allowed())
+ return -2;
+ if (!pub || !stringp(pub) || !new || !floatp(new) || new<1.0 || new>1.5)
+ return -1;
+ if (!member(pubs,pub))
+ return 0;
+ old=pubs[pub,1];
+ pubs[pub,1]=new;
+ write_file(CLOGFILE,
+ sprintf("%s - %s\n%s FACT %6.4f > %6.4f\n",
+ dtime(time()),
+ (this_interactive() ? getuid(this_interactive()) : "???"),
+ pub,old,new));
+ save_data();
+ return 1;
+}
+
+varargs int ClearPub(string pub, string item)
+{
+ if (!allowed())
+ return -2;
+ if (!pub || !stringp(pub) || (item && !stringp(item)))
+ return -1;
+ if (!member(pubs,pub))
+ return 0;
+ if (!item)
+ m_delete(pubs,pub);
+ else if (!member(pubs[pub],item))
+ return 0;
+ else
+ m_delete(pubs[pub],item);
+ save_data();
+ return 1;
+}
+
+int DumpPubs()
+{ string *publist,*itemlist;
+ int pubi,itemi;
+
+ if (!allowed())
+ return -2;
+ if (file_size(DUMPFILE)>1)
+ rm(DUMPFILE);
+ if (file_size(DUMPLIST)>1)
+ rm(DUMPLIST);
+ DUMPF(sprintf("Kneipen-Menu-Liste vom %s:\n\n",dtime(time())));
+ DUMPL(sprintf("Kneipenliste vom %s:\n\n",dtime(time())));
+ publist=sort_array(m_indices(pubs),#'</*'*/);
+ if ((pubi=sizeof(publist))<1)
+ {
+ DUMPF("No pubs in List\n");
+ DUMPL("No pubs in List\n");
+ return -1;
+ }
+ for (--pubi;pubi>=0;pubi--)
+ {
+ DUMPL(sprintf("%-'.'70s %6.4f\n",
+ publist[pubi],pubs[publist[pubi],1]));
+ DUMPF(sprintf("PUB: %s\nFAC: %6.4f\n\n",
+ publist[pubi],pubs[publist[pubi],1]));
+ itemlist=sort_array(m_indices(pubs[publist[pubi]]),#'</*'*/);
+ if ((itemi=sizeof(itemlist))<1)
+ {
+ DUMPF(" No items in list\n\n");
+ continue;
+ }
+ DUMPF(sprintf(
+ " %|'_'30.30s %5s %3s %3s %3s %3s %3s %2s %2s %3s %3s\n",
+ "ITEM","VALUE","HPH","SPH","DRI","ALC","FOO","RA","MR","MAX",
+ "FND"));
+ for (--itemi;itemi>=0;itemi--)
+ DUMPF(sprintf(
+ " %-'.'30.30s %5d %3d %3d %3d %3d %3d %2d %2d %3d %3d\n",
+ itemlist[itemi],
+ (int)pubs[publist[pubi]][itemlist[itemi]][P_VALUE],
+ (int)pubs[publist[pubi]][itemlist[itemi]][P_HP],
+ (int)pubs[publist[pubi]][itemlist[itemi]][P_SP],
+ (int)pubs[publist[pubi]][itemlist[itemi]][P_DRINK],
+ (int)pubs[publist[pubi]][itemlist[itemi]][P_ALCOHOL],
+ (int)pubs[publist[pubi]][itemlist[itemi]][P_FOOD],
+ (int)pubs[publist[pubi]][itemlist[itemi]]["rate"],
+ (int)pubs[publist[pubi]][itemlist[itemi]]["maxrate"],
+ (int)pubs[publist[pubi]][itemlist[itemi]]["maxset"],
+ (int)pubs[publist[pubi]][itemlist[itemi]]["maxheal"] ));
+ DUMPF("\n");
+ }
+ return sizeof(publist);
+}
+
+// bereinigt die Kneipenliste von allen Kneipen, die auf der Platte nicht mehr
+// existieren.
+public void CleanPublist() {
+ foreach(string pub: pubs) {
+ if (file_size(pub+".c") <= 0)
+ m_delete(pubs,pub);
+ }
+ save_data();
+}
+