LPC - SHADOW

YLEISESTI OBJEKTEISTA

Kaikki LPClla tehdyt tiedostot ovat objekteja, kun ne ladataan.
Lataus tapahtuu joko clone_objectilla tai call_otherilla.
Objekti ei lataudu, jos sen tiedoston koodissa on virhe.

Huoneet

Huoneobjektit ovat 'tyhjiossa', toisin sanottuna niilla
ei ole environment() objektia. Huoneita ei kloonata, vaan
ne latautuvat kun pelaajaobjektin look() funktio call_otheraa
huoneen long() funktiota. Huone (tai mika tahansa muu objekti)
latautuu, kun sita call_otherataan. Funktiolla ei ole valia,
objektissa ei tarvitse olla sen nimista funktiota mita
call_otherataan, se latautuu joka tapauksessa.
  esim.
  call_other("/wizards/celtron/workroom", "??",0);
  
Varusteet & NPC

Aseet ja panssarit ovat weapon.c:n ja armour.c:n objekteja.
Tavallisen arean ase tiedosto asettaa 'tyhjaan' weapon.c:n
objektiin arvoja, esim. set_class(2); laittaa laatuarvon.

NPC (non player character eli monster) on monster.c:n objekti.
Tavallisen arean NPC on monster.c tiedoston objekti, jota
muutellaan sen kloonaamisen (clone_object()) jalkeen.
  esimerkki
  guard.c on monster file.
  ob = clone_object("guard");
  ob on guard.c filen objekti
  move_object(ob, dest);
  siirtaa objektin ob objektin dest sisalle:
    esim. NPC siirretaan huoneeseen tai ase NPC:n sisalle.

Pelaajat

Pelaajat ovat player.c tiedoston objekteja. Nama objektit ovat
liitettyina kayttajiin, jotka ovat yhteydessa mudiin.

CALL_OTHER

call_other suorittaa annetun funktion annetusta tiedostosta.
Tiedosto voi olla myos sama missa call_other on.
  esimerkki
  i = call_other("/world/objects/dummy", "query_hp");
  query_hp returnaa jonkun arvon, joka siirtyy muuttujaan i.
  jos query_hp funktiossa ei ole return komentoa, se
  returnaa nollan.
Call_otherille on olemassa myos lyhyempi muoto:
  esimerkki
  jos dummy on maaritelty objekti.
  dummy->query_hp(); tai
  this_player()->query_hp()
Call_otherin lyhyin muoto, jota voi kayttaa vain objektin
sisalla oleville funktioille:
  esimerkki
  set_name("orc");
  call_otheraa objektin sisaista funktiota set_name() ja lahettaa
  mukana arvon "orc", joka on string.
Tassa tapauksessa set_name() funktio voisi olla tallainen:
  set_name(string str) {
    name = str;
  }

SHADOW

Oletetaan etta objekti a on pelaaja ja halutaan vaikuttaa pelaaja
objekti a:n sisaisiin arvoihin valiaikaisesti niita kuitenkaan
muuttamatta.

tehdaan tiedosto esimerkiksi varjo.c
/*alku*/
object player;

start(object ob) {
  player = ob;
  shadow(player, 1);
}
short() {
  return player->short()+" (shadowed)";
}
/*loppu*/

Ensin varjo.c tiedosto pitaa clone_objectata, jotta siita tulisi
objekti. Sen jalkeen tarvitaan etta joku objekti kaynnistaa shadow
objektin. Call_otherataan kloonattua shadow objektia ja annetaan
argumentiksi se pelaaja tai NPC objekti jonka short() funktion
palautetta halutaan muuttaa.

Kun shadown start() funktiota on call_otherattu, shadow objekti
alkaa varjostaa annettua objektia (objekti voi olla pelaaja, NPC,
ase, panssari tai jokin muu).

Shadow toimii silla periaatteella, etta jos shadown alaista objektin
jotain funktiota call_otherataan, call_otheriin vastaakin ainoastaan
shadow objekti. Ylla olevassa esimerkissa shadow objekti returnaa
pelaajan short() funktion returnaaman stringin ja lisaa siihen
viela " (shadowed)" stringin peraan.

Jos shadow objektissa on call_otherattu funktio, suoritetaan
vain shadow: ko funktio. Jos shadow:ssa ei ole ko funktiota
call_other yrittaa suorittaa sita shadown alaisesta objektista.
Esimerkiksi jos esimerkin pelaajan query_hp() funktiota
call_otherataan, sita haetaan pelaajan objektista kun sita
ei loydy shadow objektin sisalta.

Esimerkiksi jos halutaan muuttaa pelaajan statteja tai hit_pointteja
valiaikaisesti (esim berserk, boost_potion, unpain etc) shadow:n
kaytto on yksinkertaisin vaihtoehto. 

					(c) Celtron 10.1998

