VANLIGA BUGGAR av Offe Viktbuggar När du flyttar saker ut och in i spelare och monster, måste du använda funktionen transfer (inte move_object()). Den funktionen ändrar den variabel i spelaren eller monstret som håller reda på hur mycket spelaren bär på. Annars kan det sluta med att spelaren kan bära hur mycket som helst (om bärvikten inte räknas upp när den borde), eller omvänt ingenting alls. Du kan inte heller förstöra något en spelare eller ett monster bär på utan vidare (med destruct()). Du kan antingen flytta saken till ett rum (med transfer()) innan du förstör den, eller räkna ner bärvikten med hjälp av funktionen add_weight() innan du förstör saken. Om saken är viktlös kan du naturligtvis förstöra den utan att vidta åtgärder. För många monster När du klonar ett nytt monster i reset() i ditt rum eller ditt castle.c, måste du först kolla om det gamla monstret har dött. Om monstret är stillastående, gör du det lättast med if(!present("monstret",rumsobjektet)) Om monstret knallar omkring, ska du sätta en variabel till monstret när du klonar det. Den variabeln håller sedan reda på monsterobjektet och när monstret dör blir variabeln 0. Ex. object monster; if(!monster) { monster = clone_object(/spelare/dittnamn/monster"); ... } Du får dock se upp om variabeln inte finns i ditt castle.c utan i ett rum. Om rummet förstörs, kan det inte längre hålla reda på monster-variabeln. Därför måste du skriva om funktionen clean_up() i rummet, så att det inte förstörs. Läs om clean_up() i "man" och i /doc/build/rum/funktioner! Du kan också testa om monstret fortfarande springer omkring ute i världen genom att skriva if(!find_living("monsternamn")) "monsternamn" måste då vara ett unikt namn. Du kan ge ditt monster ett sådant genom att anropa set_living_name() i create() i monstret. Som argument ger du det unika namnet. ÖVERKURS: Du kan mycket väl använda monster som är förlagor, precis som alla dina rum är förlagor. I stället för att klona monstret i reset() i rummet eller slottet, anropar du en funktion i monstret f|r att ladda det. Det kan vara en funktion som inte finns i monstret. Om monstret inte har blivit dödat sedan senaste reset() händer ingenting. Det går heller inte att klona ett monster vars förlaga redan finns i världen. På så sätt behöver du aldrig bekymra dig om att få mer än ett monster av samma slag. En annan stor fördel är att du från ett annat objekt när som helst kan anropa en funktion i monstret genom att skriva: "/spelare/dittnamn/monster/monstrets_fil"->funktion(); Om du skriver: find_object("/spelare/dittnamn/monster/monstrets_fil") kommer find_object() att returnera monsterobjektet om det är inladdat, dvs om monstret lever, annars returnerar den 0. (Anm. Du kan inte använda den här metoden om du vill göra flera monster utifrån samma fil.) Monster som stoppar spelare När monstret vaktar en ingång finns det fyra sätt att göra detta på. Två är felaktiga, dvs det buggar om man flyttar monstret till ett annat rum. Fel sätt: Rummet kollar om monstret (som stoppades in i en variabel när det skapades) fortfarande existerar. Om man flyttar monstret kommer det fortfarande att "stoppa" spelare, trots att det inte är närvarande. Fel sätt: I monstret görs en add_action på riktningen och en funktion returnerar alltid 1. Om man flyttar monstret kommer det att hindra spelare att gå i den riktningen i det rum monstret hamnat i. Rätt sätt: Som ovan, fast monstret kollar om det är på rätt ställe innan det stoppar spelaren. ex: (Kod i monstret) init() { ::init(); add_action("stopp","söder"); } stopp() { if(environment(this_object()) && file_name(environment(this_object())) == "/spelare/putte/rum1") { write("Monstret stoppar dig.\n"); return 1; } else return 0; } Rätt sätt: Rummet kollar om monstret är närvarande i rummet. Man kan gärna ge sitt monster ett unikt namn, så att andra förbipasserande monster som tex också är vakter, inte börjar vakta utgången. ex: (Kod i rummet) init() { ::init(); add_action("stopp","söder"); } stopp() { if(present("puttes_vakt",this_object())) { write("Monstret stoppar dig.\n"); return 1; } else return 0; } Inga monster i ditt nyladdade rum Om du klonar monster i reset() i ett rum, måste du anropa reset() från create() i rummet, om du vill att det ska finnas ett monster i rummet första gången någon går in i det. Plocka en blomma, upprepa 5000 plocka en blomma När du gör ett kommando som låter spelaren ta en sak som från början bara finns i items-listan, finns det tre saker att tänka på. 1) Om saken är värd pengar, måste du begränsa antalet. Det är inte meningen att spelare ska bli rika på att springa fram och tillbaka till affären. När spelaren har tagit alla saker, ska eventuella hänvisningar till saken i rummets beskrivning och items-lista tas bort. 2) Om spelaren ska ta en sak i items-listan med kommandot "ta" kan en lite speciell bugg inträffa. Om spelaren tar en sak som finns i items-listan, släpper den och sedan försöker ta upp den igen, kommer han inte att ta den sak som ligger "på golvet", utan en ny sak klonas upp i din funktion i rummet och flyttas till spelaren. Det sker därför att ditt anrop till add_action() gjordes sist (när spelaren kom in i rummet), det har därför högst prioritet. Du kan undvika detta genom att kolla om det ligger en sådan sak på golvet, innan du klonar upp en ny. Det gör du med present(). 3) Du måste använda transfer() när du flyttar saken till spelaren. Utgångarna i rummet fungerar inte Monstret pratar inte Om detta händer kan det bero på att du har skrivit din egen funktion init() i rummet eller monstret, men glömt att anropa standardobjektets init() från din egen init(). Detta gör du med ::init(); Skyltar, anslag mm. En skylt, eller ett annat föremål med text på, ska man både kunna titta på och läsa. present("saken",find_object("/spelare/putte/rum1")); Om /spelare/putte/rum1 inte är laddat när ovanstående rad körs, returnerar find_object() 0 och när present() anropas uppstår en bug (programmet avbryts). För att lösa problemet kan du kolla om /spelare/putte/rum1 är inladdat: if(find_object("/spelare/putte/rum1")) Om det inte är det kan ju heller inte "saken" finnas där. Om du hellre vill kan du ladda in rummet genom att skriva: "/spelare/putte/rum1"->en_funktion_som_inte_finns(); innan du anropar find_object().