// MorgenGrauen MUDlib
//
// container/light.c -- Lichtsystem fuer Container
//
// $Id: description.c 6986 2008-08-22 21:32:15Z Zesstra $

inherit "/std/thing/light";

#pragma strict_types
#pragma save_types,rtt_checks
#pragma range_check
#pragma no_clone

#define NEED_PROTOTYPES

#include <container.h>
#include <properties.h>

// BTW: _query_last_content_change() sollte bloss nie auch -1 fuer
// uninitialisiert zurueckliefern...
private nosave int last_light_calc = -1;

protected void create()
{
  ::create();
  // wieviel Licht schluckt der Container _muss_ > 0 sein!
  SetProp(P_LIGHT_TRANSPARENCY, 2);
}

protected void create_super() {set_next_reset(-1);}


static mixed _query_light_transparency()
{
   if (QueryProp(P_TRANSPARENT))
     return Query(P_LIGHT_TRANSPARENCY,F_VALUE);
   return 999;
}

protected int add_light_sources(int * sources) {
  float light = 0.0;
  //printf("als(%O): %O\n",this_object(),sources);
  // Alle Lichtlevel werden als Exponent von e aufgefasst und die Summe dieser
  // Potenzen gebildet.
  foreach(int l : sources) {
     if (l > 0)
       light += exp(l);
     else if (l < 0)
       light -= exp(abs(l));
     // l==0 muss ignoriert werden
  }
  // anschliessend wird aus dieser Summe der natuerliche Logarithmus
  // berechnet.
  // auf diese Weise haben hoehere Lichtlevel ueberproportional viel Einfluss
  // auf die Helligkeit im Raum, kleine Lichtlevel fallen aber nicht komplett
  // raus.
  if (light > 0) {
      light = log(light);
  }
  else if (light < 0) {
      light = -log(abs(light));
  }

  //printf("als(): %O\n",light);
  // runden und als int zurueckgeben.
  if (light >= 0)
    return to_int(light+0.5);
  //else
  return to_int(light-0.5);
}

static int _query_total_light()
{
  int totallight;

  if ( _query_last_content_change() == last_light_calc )
    return Query(P_TOTAL_LIGHT);

  // eigenes P_LIGHT und P_TOTAL_LIGHT der enthaltenen Objekte verrechnen
  int intlight = add_light_sources(
      ({int*})all_inventory()->QueryProp(P_TOTAL_LIGHT) + ({QueryProp(P_LIGHT)}));
  // P_INT_LIGHT (gerundet) abspeichern
  Set(P_INT_LIGHT, intlight, F_VALUE);

  // Licht nach aussen muss Containertransparenz beruecksichtigen.
  if (intlight > 0) {
    totallight = intlight - QueryProp(P_LIGHT_TRANSPARENCY);
    if (totallight < 0)
      totallight = 0;
  }
  else {
    totallight = intlight + QueryProp(P_LIGHT_TRANSPARENCY);
    if (totallight > 0)
      totallight = 0;
  }
  //printf("_query_total_light(%O): %O\n",this_object(),totallight);

  last_light_calc = _query_last_content_change();

  // Runden und Konversion nach int nicht vergessen...
  if (totallight > 0)
    return SetProp(P_TOTAL_LIGHT, to_int(totallight + 0.5));
  //else
  return SetProp(P_TOTAL_LIGHT, to_int(totallight - 0.5));
}

static int _query_int_light()
{
   int intlight, envlight;

   if ( _query_last_content_change() != last_light_calc )
       _query_total_light();

   // P_INT_LIGHT des environments kann sich natuerlich aendern _ohne_ das
   // etwas an einem container geaendert wird. Daher Auswertung jedes mal
   // neu aktualisieren.
   if (!environment()
       || !(envlight=({int})environment()->QueryProp(P_INT_LIGHT)))
      return Query(P_INT_LIGHT, F_VALUE);
   else {
      intlight = Query(P_INT_LIGHT, F_VALUE);
      int transparency = QueryProp(P_LIGHT_TRANSPARENCY);

      // bei einem transparentem Container kann natuerlich das Licht des
      // environments den Container auch ausleuchten....
      // (Anmerkung: in dem Licht von draussen ist unser Lichtanteil
      // natuerlich auch drin, gedaempft um die Transparenz (raus und rein).
      // Ich vernachlaessige das.)
      if (abs(envlight) > transparency) {
        if (envlight > 0)
            envlight -= transparency;
        else
            envlight += transparency;
        // jetzt Licht von aussen und innen verrechnen
        intlight = add_light_sources(({intlight, envlight}));
      }
      // else: nur P_INT_LIGHT, Licht des Environments keine Bedeutung
   }
   return intlight;
}

static int _set_light(int light)
{
  last_light_calc=-1;

  return ::_set_light(light);
}

