Denna fil förklarar hur man gör monster (NPC, icke-spelarfigurer). Se även /obj/monster.c och /doc/exempel/ ! Det finns två sätt att göra ett monster: 1) Ge monstret en egen fil. (Detta är det bästa sättet.) Filen ska börja med raden inherit "/obj/monster"; Därefter skriver du funktionen create() där du anropar nedanstående funktioner för att ange hur ditt monster ser ut. Från din egen create() måste du anropa den create() som definieras i /obj/monster.c! Skriv: ::create(); Om du vill kan du även ha med en egen init() där du anropar add_action() p} vanligt sätt, men glöm inte att anropa init() i /obj/monster.c! Skriv: ::init(); 2) Klona /obj/monster.c och anropa funktionerna nedan innan monstret placeras ut. Exempel: object monster; monster = clone_object("/obj/monster"); monster->set_name( ({"trollet","troll","det stora trollet"}) ); monster->set_short("ett stort troll"); ...osv move_object(monster,this_object()); *** FUNKTIONER *** set_name(string namnet, string namn) set_name(string *allanamn) set_short(string sh) set_long(string ldesc) Se /doc/build/namn. set_level(int l) Sätter monstrets nivå. Sätter lämpliga värden på styrkar, smidighet, hälsa och så vidare. set_race(string ras) Sätter rasen för din NPC. Sätt den till något vettigt i obestämd form singular. set_hp(int hälsa) Sätter hur många skadepoäng din NPC skall tåla. set_ep(int poäng) Du kan om du vill minska antalet erfarenhetspoäng som monstret har, för att göra det mindre lönsamt att döda det. set_al(int etik) Sätter hur ont/gott ditt monster skall vara. Skalan går från -1000 (demonisk) till +1000 (änglalik). Tänk på att extremt goda eller onda monster skall vara sällsynta och svårdödade. En oskyldig liten flicka är ingen ängel, bara lite smågod. set_wc(int klass) Du kan öka vapenstyrkan för ett monster över vad den sätts till efter set_level() för att göra det mer svårdödat. set_ac(int klass) Du kan öka skyddet för ett monster över vad den sätts till efter set_level() för att göra det mer svårdödat. set_move_at_reset() Om denna funktion anropas kommer monstret att sakta röra sig ett steg varje reset. (ca en gång per timma) set_random_pick(int chans) Denna funktion anropas med en siffra mellan 0 och 100, som utgör den procentuella chans det är att monstret ska plocka upp alla föremål i rummet när monstrets heart_beat anropas (varannan sekund om en spelare är närvarande). Funktionen som får monstret att plocka upp alla saker heter pick_any_obj(). set_aggressive(status ilska) Om ilska är skilt från noll angriper monstret spelare som kommer in i rummet. set_corpse_weight(int a) 0 innebär att liket tar standardvikten från obj/lik, annars används den vikten du anger. set_frog() Om någon kysser monstret blir spelaren en groda. :-) set_whimpy() Monstret blir fegt och flyr om det blir skadat. set_dead_ob(object ob) Denna funktion behöver bara anropas om monstret inte har en egen fil. Argumentet 'ob' kan t.ex. vara ett rum, där en funktion som heter 'monster_died' sköter om vad som ska hända när monstret dör. Strax innan monstret dör anropas en funktion i /obj/monster.c som heter 'second_life', som i sin tur anropar 'monster_died' i 'ob'. Argumenten till monster_died() är det snart döda monstret och det nyskapade liket. Om monster_died() returnerar 1 överlever monstret, annars dör det. (Glöm inte förstöra liket om monstret överlever.) Har monstret en egen fil, skriver du istället en egen funktion 'second_life' som sköter om vad som ska hända. set_init_ob(object ob) Denna funktion behöver bara anropas om monstret inte har en egen fil. Funktionen 'monster_init' i 'ob' kommar att anropas från init i monstret. Argumentet till 'monster_init' är monstret det gäller. Om returvärdet från monster_init är 1 undviker monstret att angripa spelaren, annars beter det sig som 'set_aggressive' angett. init_command(string cmd) Få monstret att utföra ett kommando. (Till exempel "fatta dolken".) *** MAGI *** För att få monstret att kasta magi används dessa funktioner: set_spell_mess1(string meddelande) Argumentet anger vad som skrivs ut till de spelare i rummet som inte blir offret för monstrets magi (tredje person). set_spell_mess2(string meddelande) Med denna funktion anger du vad som ska skrivas ut till offret för stridstrollformeln. set_chance(int chans) Detta anger den procentuella chansen att monstret ska kasta magi när 'heart_beat' anropas i monstret (varannan sekund). set_spell_dam(int skada) Anger vilken skada formeln gör om den träffar. Skadan blir ett slumpmässigt mellan 0 och d-1. Försök att ge dina högnivåmonster hård magi, spelarna använder säkert magi mot dina monster... *** TALANDE MONSTER *** Om du vill ha ett talande monster anropar du 'load_chat' och 'load_a_chat' i 'create'. Om du vill byta repliker senare, kan du anropa funktionen igen. load_chat(int chans,string* repliker) Första argumentet är den procentuella chans det är att monstret ska prata när dess funktion 'heart_beat' anropas (vilket sker varannan sekund). Andra argumentet är en array av de strängar som ska skrivas ut när monstret pratar. En sträng kan se ut som: "Monstret säger: Hej på dig!\n" load_a_chat(int chans,string* repliker) Den här funktionen fungerar likadant, men dessa repliker används när monstret slåss. *** MONSTER SOM LYSSNAR *** Om du ska göra ett monster som reagerar på vad någon säger eller gör i samma rum, gör du det verkligen enklast för dig själv, om ger ditt monster en egen fil i stället för att klona /obj/monster.c och modifiera det. All text som skickas till monstret, kommer som argument till funktionen 'catch_tell'. I standardmonstret jämförs varje sådan sträng med den information som har laddats in med 'set_match'. Om ditt monster har en egen fil, skriver du helt enkelt en egen funktion 'catch_tell'. Med 'sscanf' är det enkelt att sortera ut de intressanta strängarna. set_match(object ob,string* func,string* type,string* match) Argumentet 'ob' kan t.ex. vara ett rum där den funktionerna 'func' finns. Funktionerna 'func' anropas i 'ob' om monstret reagerar på motsvarande strängar. 'type' är det andra ordet i den sträng som monstret ska reagera på. Om den t.ex. ska reagera på att någon 'ler glatt', sätts 'type' till 'ler'. Slutligen är 'match' resten av den sträng som monstret ska reagera på. I vårt exempel blir det 'glatt'. Arrayerna 'func', 'type' och 'match' ska ha lika många element vardera. EXEMPEL (Detta är ett gammalt engelskt exempel. Ett svenskt exempel finns i /rum/byvägen3.c där Harry skapas.) string function, type, match; function=allocate(3); type = allocate(3); match = allocate(3); /* * This cathes 'name gives flower to Lady.' and * 'name gives flower to Ann.' and binds it to * the function 'handle_give' in the current object. */ function[0] = "handle_give"; type[0] = "gives"; match[0] = "flower to Lady."; match[1] = "flower to Ann."; /* * This cathes 'name say: daisy' and binds it to * the function ''handle_say' in the current object. */ function[2] = "handle_say"; type[2] = "says:"; match[2] = "daisy"; dam = clone_object("obj/monster"); dam -> set_name("mary"); dam -> set_alias("lady"); dam -> set_short("An old lady is here"); dam -> set_ac(0); dam -> set_level(5); dam -> set_al(200); dam -> set_hp(30); dam -> set_wc(7); dam -> set_aggressive(0); /* Load the catch arrays */ dam -> set_match(this_object(),functions,type,match); . . handle_give(str) { object giver; if(dam && living(dam)) { string who, rest; sscanf(str, "%s %s\n", who, rest); giver = present(lower_case(who),environment(this_player())); alig = giver -> query_alignment(); if(alig > 0 ) { say("Ann says: Oh thank you " + who + ".\n"); say("Ann says: You look like a fine young man.\n"); } else { say("Ann says: Oh thank you " + who + ".\n"); } } } handle_say(str) { if(dam && living(dam)) { string who, rest; sscanf(str, "%s %s\n", who, rest); say("Ann says: Sheeit " + who + ", ah' really likes daisys.\n"); } }