Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/std/inpc/eval.c b/std/inpc/eval.c
new file mode 100644
index 0000000..f755576
--- /dev/null
+++ b/std/inpc/eval.c
@@ -0,0 +1,189 @@
+// MorgenGrauen MUDlib
+//
+// inpc/eval.c -- Einschaetzen von Gegnern
+//
+// $Id: eval.c 6371 2007-07-17 22:46:50Z Zesstra $
+#pragma strong_types
+#pragma save_types
+#pragma range_check
+#pragma no_clone
+#pragma pedantic
+
+#define NEED_PROTOTYPES
+#include <thing/properties.h>
+#include <living.h>
+#undef NEED_PROTOTYPES
+#include <properties.h>
+#include <thing.h>
+#include <inpc.h>
+
+varargs void SetEvalFactor(mixed what, int fac, int off) {
+ mapping offs,facs;
+
+ if (!mappingp(facs=QueryProp(P_EVAL_FACTORS))) facs=([]);
+ if (!mappingp(offs=QueryProp(P_EVAL_OFFSETS))) offs=([]);
+ facs[what]=fac;
+ offs[what]=off;
+ SetProp(P_EVAL_FACTORS,facs);
+ SetProp(P_EVAL_OFFSETS,offs);
+}
+
+void SetDefaultEvalFactors() {
+ SetEvalFactor(P_HP,150,-60);
+ SetEvalFactor(P_TOTAL_WC,250,0);
+ SetEvalFactor(P_TOTAL_AC,1000,-50);
+ SetEvalFactor("abenteurer_pfeil",3,0);
+ SetEvalFactor("abenteurer_feuerball",8,0);
+}
+
+varargs int
+modify_eval(object ob, mixed what, mapping fac, mapping off, int val) {
+ if (!val) val=QueryProp(what);
+ val-=off[what];
+ if (val<0) val=0;
+ val=(val*fac[what])/10000;
+ if (val>200) val=200;
+ return val;
+}
+
+varargs int eval_enemy(object enemy, mapping fac, mapping off) {
+ int res;
+ string gilde;
+
+ if (!objectp(enemy)) return 0;
+ if (!mappingp(fac)) fac=QueryProp(P_EVAL_FACTORS);
+ if (!mappingp(fac)) fac=([]);
+ if (!mappingp(off)) off=QueryProp(P_EVAL_OFFSETS);
+ if (!mappingp(off)) off=([]);
+
+ res=0;
+ res+=modify_eval(enemy,P_TOTAL_WC,fac,off);
+ res+=modify_eval(enemy,P_TOTAL_AC,fac,off);
+ res+=modify_eval(enemy,P_HP,fac,off);
+ if (stringp(gilde=enemy->QueryProp(P_GUILD)))
+ res+=call_other(this_object(),"eval_guild_"+gilde,enemy,fac,off,gilde);
+ if (res<0) res=0;
+ if (res>1000) res=1000;
+ return res;
+}
+
+varargs mixed *eval_enemies(mapping fac, mapping off, object *here) {
+ int i,sz;
+ mixed *res;
+
+ res=({});
+ if (!here)
+ here=PresentEnemies();
+ if (!pointerp(here) || !(sz=sizeof(here)))
+ return res;
+ if (!mappingp(fac)) fac=QueryProp(P_EVAL_FACTORS);
+ if (!mappingp(fac)) fac=([]);
+ if (!mappingp(off)) off=QueryProp(P_EVAL_OFFSETS);
+ if (!mappingp(off)) off=([]);
+
+ for (i=sz-1;i>=0;i--)
+ res+=({({here[i],eval_enemy(here[i],fac,off)})});
+ return res;
+}
+
+varargs int sum_eval_enemies(mapping fac, mapping off, object *here) {
+ int res,i;
+ mixed *evals,x,y;
+
+ res=0;
+ if (!pointerp(evals=eval_enemies(fac,off,here)))
+ return res;
+ for (i=sizeof(evals)-1;i>=0;i--)
+ if (pointerp(x=evals[i]) && sizeof(x)>=2 && intp(y=x[1]))
+ res+=y;
+ return res;
+}
+
+varargs object *minimize_prop_filt(object *here, mixed prop) {
+ object *obs,ob;
+ int i,mhp,hp,sz;
+
+ obs=0;
+ if (!pointerp(here))
+ here=PresentEnemies();
+ if (!prop)
+ prop=P_HP;
+ for (i=sizeof(here)-1;i>=0;i--) {
+ if (objectp(ob=here[i])) {
+ hp=ob->QueryProp(prop);
+ if (!pointerp(obs) || hp<mhp) {
+ obs=({ob});
+ mhp=hp;
+ } else if (hp==mhp) {
+ obs+=({ob});
+ }
+ }
+ }
+ if (!pointerp(obs))
+ obs=({});
+ return obs;
+}
+
+varargs object *maximize_prop_filt(object *here, mixed prop) {
+ object *obs,ob;
+ int i,mwc,wc,sz;
+
+ obs=0;
+ if (!pointerp(here))
+ here=PresentEnemies();
+ if (!prop)
+ prop=P_TOTAL_WC;
+ for (i=sizeof(here)-1;i>=0;i--) {
+ if (objectp(ob=here[i])) {
+ wc=ob->QueryProp(prop);
+ if (!pointerp(obs) || wc<mwc) {
+ obs=({ob});
+ mwc=wc;
+ } else if (wc==mwc) {
+ obs+=({ob});
+ }
+ }
+ }
+ if (!pointerp(obs))
+ obs=({});
+ return obs;
+}
+
+varargs object *player_filt(object *here) {
+ object *obs,ob;
+ int i;
+
+ obs=({});
+ if (!pointerp(here))
+ here=PresentEnemies();
+ for (i=sizeof(here)-1;i>=0;i--)
+ if (objectp(ob=here[i]) && query_once_interactive(ob))
+ obs+=({ob});
+ return obs;
+}
+
+varargs object select_enemy_min_prop(object *here, mixed prop) {
+ object *obs;
+ int sz;
+
+ if (pointerp(obs=minimize_prop_filt(here,prop)) && (sz=sizeof(obs)))
+ return obs[random(sz)];
+ return 0;
+}
+
+varargs object select_enemy_max_prop(object *here, mixed prop) {
+ object *obs;
+ int sz;
+
+ if (pointerp(obs=maximize_prop_filt(here,prop)) && (sz=sizeof(obs)))
+ return obs[random(sz)];
+ return 0;
+}
+
+varargs object select_player_min_prop(object *here, mixed prop) {
+ return select_enemy_min_prop(player_filt(here),prop);
+}
+
+varargs object select_player_max_prop(object *here, mixed prop) {
+ return select_enemy_max_prop(player_filt(here),prop);
+}