// MorgenGrauen MUDlib
//
// player/restrictions.c -- container aspect of players
//
// $Id: restrictions.c 9020 2015-01-10 21:49:41Z Zesstra $

// This is a simple container to put objects in. It defines all functions
// which are necessary to describe an object which can be filled with
// other things.
//
// It will support restrictions for volume, weight etc.
//
// The following properties are defined:
// P_MAX_WEIGHT - maximum weight which container can carry
// P_WEIGHT_CONTENTS - current contents
// P_WEIGHT - builtin property: read->total weight, write->own weight
//
// Functions for manipulation of weight
// MayAddWeight(weight) - Can <weight> be inserted?
// AddWeight(weight) - Add an amount of <weight>
//
// IMPORTANT: unit should be interpreted as grams (g).
#pragma strong_types
#pragma save_types
#pragma range_check
#pragma no_clone

inherit "/std/container/restrictions";

#define NEED_PROTOTYPES
#include <thing/properties.h>
#include <hook.h>
#include <living/skills.h>
#include <attributes.h>
#undef NEED_PROTOTYPES
#include <properties.h>
#include <wizlevels.h>
#include <container.h>
#include <defines.h>
#include <new_skills.h>

// local properties prototypes
static int _query_max_weight();
static mixed _set_frog(mixed arg);

protected void create()
{
  ::create();

  Set(P_MAX_WEIGHT, NOSETMETHOD, F_SET_METHOD);
  Set(P_MAX_WEIGHT, SECURED, F_MODE);
  offerHook(H_HOOK_INSERT, 1);
}

// **** local property methods
static int _query_max_weight() {
  int str,val;
  mixed ski;
  
  if (QueryProp(P_GHOST) && !IS_WIZARD(ME))
    return 0;
  str=QueryAttribute(A_STR);
  ski = UseSkill(SK_CARRY, ([SI_SKILLARG : str ]));

  if (!intp(ski))
    ski = 0;
  
  if (str<0) {
    val=9200+str*160+(int)ski;
    if (val<3000) val=3000;
    return val;
  }
  val = 9200+str*800+(int)ski;
  if (val<3000)
    val = 3000;
  return val;
}

static mixed _set_frog(mixed arg) {
  mixed res;
  
  res=Set(P_FROG,arg);
  if (res)
    SetProp(P_ATTRIBUTES_MODIFIER,({"#frosch",([A_STR:-30])}));
  else
    SetProp(P_ATTRIBUTES_MODIFIER,({"#frosch",0 }));
  return res;
}

public void NotifyInsert(object ob, object oldenv)
{
  ::NotifyInsert(ob, oldenv);
  // Alle Listener vom InsertHook informieren
  HookFlow(H_HOOK_INSERT, ob);
}

void AddInsertHook(object ob)
{
  raise_error("Diese Funktion gibt es nicht mehr. Bitte das neue "
      "Hooksystem nutzen!\n");
}

