[size=85]Scusate se rispondo ad un quesito posto mesi fa, ma magari il programmatore in questione non ha ancora trovato risposte, quindi tanto vale provarci
Premetto che lo specifico codice di Lyonesse non lo conosco, quindi baserò la mia risposta su delle considerazioni generali.
(Ciao xantos hai fatto bennissimo a rispondere almeno dopo tanto tempo qualcuno posta qualche risposta qui sembra tutto morto qui:(....)
il vari file codice sorgente di lyonesse mud e un po differenze dai file di codice sorgente del smaug anche perche lyonesse mud come anche dalila mud e un derivato del circle mud che e strutturato in maniera un po diversa dal codice sorgente eseguibile smaug
lyonesse e strutturato in questo modo
ce la cartella Lyonesse con dentro i vari file quali
___________________
|Cartella bin |
|Cartella doc |
|Cartella lib |
|Cartella log |
|Cartella src |
|File autorun |
|File LANCIA |
|File Lyonesse.dsp |
|File Lyonesse.dsw |
|File Lyonesse.leggimi|
|File Lyonesse.opt |
|File Lyonesse |
__________________|
e nella cartella src ci stanno tutti i vari file codici sorgenti di Lyonesse Mud
quali questi file qui di seguito
act.comm.c
act.informative.c
act.item.c
act.movement.c
act.offensive.c
act.other.c
act.social.c
act.wizard.c
alias.c
ban.c
boards.c
boards.h
buildings.c
clan.c
clan.h
class.c
comm.c
comm.h
conf.h
config.c
constants.c
constants.h
db.c
db.h
economy.c
events.c
fight.c
goods.c
graph.c
handler.c
handler.h
house.c
house.h
interpreter.c
interpreter.h
limits.c
magic.c
magic2.c
mail.c
mail.h
mobact.c
modify.c
objects.c
objrandom.c
objrandom.h
obj_trap.c
Parser.c
queue.c
random.c
room_trigger.c
save.c
screen.h
shop.c
shop.h
spec_assign.c
spec_procs.c
spells.c
spells.h
spell_parser.c
stables.c
structs.h
sysdep.h
telnet.h
utils.c
utils.h
vehicles.c
weather.c
wild.info.c
wild.life.c
wild.map.c
wild.ships.c
wilderness.c
da questo link si puo scaricare il codice sorgente eseguibile di lyonesse mud
http://www.mudbytes.net/files/view/809/riguardante il primo aiuto cioe questo PRIMO AIUTO
======================================
in poche parole vorrei che a seconda della razza che un pg sceglie nasce( la prima volta quando uno si crea il pg) e quando muore il pg che il pg poi risolge in quella determinata locazione
Esempio:(nascita)
Umani= cerchio di pietre umano che si trova a x locazione
Hafling=cerchio di pietre degli hafling che si trova a y locazione
Elfi Neri= cerchio di pietre degli elfi neri che si trova a Z locazione.
con la possibilita che il pg puo scegliere dove risolgere nel cerchio degli elfi o quello degli hafling o quello della sua razza.
======================================
Non ce un file razze ci sta il file class dove ci sono anche le razze.
/**************************************************************************
* # # # ## # # ### ## ## ###
http://www.lyonesse.it *
* # # # # # ## # # # # # *
* # # # # # ## ## # # ## ## ## # # ## *
* # # # # # ## # # # # # # # # # # # *
* ### # ## # # ### ## ## ### # # #### ## Ver. 1.0 *
* *
* -Based on CircleMud & Smaug- Copyright (c) 2001-2002 by Mithrandir *
* *
* ********************************************************************** */
/* ************************************************************************
* File: class.c Part of CircleMUD *
* Usage: Source file for class-specific code *
* *
* All rights reserved. See license.doc for complete information. *
* *
* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. *
************************************************************************ */
/*
* This file attempts to concentrate most of the code which must be changed
* in order for new classes to be added. If you're adding a new class,
* you should go through this entire file from beginning to end and add
* the appropriate new special cases for your new class.
*/
#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "db.h"
#include "utils.h"
#include "comm.h"
#include "spells.h"
#include "interpreter.h"
#include "constants.h"
extern int siteok_everyone;
OBJ_DATA *obj_to_char(OBJ_DATA *object, CHAR_DATA *ch);
void create_new_spellbook(CHAR_DATA *ch, int type);
/* local functions */
void snoop_check(CHAR_DATA *ch);
int parse_class(char arg);
long find_class_bitvector(char arg);
byte saving_throws(int class_num, int type, int level);
int thaco(int class_num, int level);
void roll_real_abils(CHAR_DATA *ch);
void do_start(CHAR_DATA *ch);
int backstab_mult(int level);
int invalid_class(CHAR_DATA *ch, OBJ_DATA *obj);
const char *title_male(int chclass, int level);
const char *title_female(int chclass, int level);
/* Names first */
const char *class_abbrevs[] =
{
"Mu",
"Cl",
"Th",
"Wa",// guerriero
"So",
"\n"
};
const char *race_abbrevs[] =
{
"&b&1Umano Eliantiriano&0",
"&1Umano Emeriani&0",
"&b&2Elfo di Alwenion&0",
//"&2Elfo di Sinor&0",
"&b&3Elfo Ambrato&0",
//"&3Elfo Selvaggio",
"&b&4Elfo Nero&0", // QUSST'VIIRYN Ousst'viiryn
"&4Nano&0",
//"&b&5Mezzuomo&0",
//"&5Mezzelfo&0",
"&b&6Halfling&0",
"&6Orco&0",
"&b&7Goblin&0",
"\n"
};
const char *pc_class_types[] =
{
"&b&1 Mago&0",
"&b&2 Chierico&0",
"&b&3 Bandito&0",
"&b&4 Guerriero&0",
"&b&5 Stregone&0",
"\n"
};
const char *pc_race_types[] =
{
"&b&1Umano Eliantiriano&0",
"&1Umano Emeriani&0",
"&b&2Elfo di Alwenion&0",
//"&2Elfo di Sinor&0",
"&b&3Elfo Ambrato&0",
//"&3Elfo Selvaggio",
"&b&4Elfo Nero&0", // QUSST'VIIRYN Ousst'viiryn
"&4Nano&0",
//"&b&5Mezzuomo&0",
//"&5Mezzelfo&0",
"&b&6Halfling&0",
"&6Orco&0",
"&b&7Goblin&0",
"\n"
};
const char *pc_hometown[] = {
"Deira",
"Cimmura",
"Lamorka",
"Chyrellos",
"\n"
};
/* The menu for choosing a class in interpreter.c: */
const char *class_menu =
"\r\n"
"&b&4-================&b&1}&3****&b&1(&b&3 O&7 S C E L T A C U L T U R A &b&3 O&b&1)&3****&b&1{&b&4================-&0\r\n"
"\r\n"
"Devi ora scegliere la cultura del tuo personaggio. Puoi trovare la &0\r\n"
"documentazione relativa alle culture nella pagina dell'ambientazione:&0\r\n"
"\r\n"
"
http://thegate.landmar.it/bg/ \r\n"
"\r\n"
"&4Culture disponibili per la tua razza/etnia!&7\r\n"
"\r\n"
"Seleziona la classe:&0\r\n"
"&b&1 [M]ago&0\r\n"
"&b&2 [C]hierico&0\r\n"
"&b&3 [B]andito&0\r\n"
"&b&4 [G]uerriero&0\r\n"
"&b&5 [S]tregone&0\r\n"
"\r\n"
"&1La cultura attualmente scelta viene indicata con il simbolo &b&3^&7.\r\n";
const char *race_menu =
"\r\n"
"&b&4-================&b&1}&3****&b&1(&b&3 O&7 S C E L T A R A Z Z A &b&3 O&b&1)&3****&b&1{&b&4================-&0\r\n"
"\r\n"
"Devi ora scegliere la razza del tuo personaggio. Puoi trovare la &0\r\n"
"documentazione relativa alle razze nella pagina dell'ambientazione:&0\r\n"
"\r\n"
"
http://LyonesseMud.it/bg/ \r\n"
"\r\n"
"&4Razze disponibili!&7\r\n"
"\r\n"
"Seleziona la razza:&0\r\n"
"&7 1 &b&1) Umano Eliantiriano&0\r\n"
"&7 2 &b&1) Umano Emeriano&0\r\n"
"&7 3 &b&1) Elfo di Alwenion&0\r\n"
"&7 4 &b&1) Elfo Ambrato&0\r\n"
"&7 5 &b&1) Elfo Nero&0\r\n" // QUSST'VIIRYN Ousst'viiryn
"&7 6 &b&1) Nano&0\r\n"
"&7 7 &b&1) Halfling&0\r\n"
"&7 8 &b&1) Orco&0&0\r\n"
"&7 9 &b&1) Goblin&0\r\n"
"\r\n"
"&1La razza attualmente scelta viene indicata con il simbolo &b&3^&7.\r\n";
const char *hometown_menu =
"\r\n"
"Ora puoi scegliere la tua citta' natale. Pensaci bene perche'\r\n"
"ogni Regno ha leggi e usanze diverse che guideranno il tuo\r\n"
"destino finche' non sarai forte abbastanza.\r\n"
"\r\n"
"[D]eira ----\r\n" // Esempio Prima Citta'
" Capitale del Regno \r\n"
"[C]immura - Capitale del giovane regno \r\n" // Esempio Seconda Citta'
" l'anima indipendente e libertaria.\r\n"
"[L]amorka - Capitale del fiorente regno di Sendaria\r\n" // Esempio Terza Citta'
" sul mare a sud ed est.\r\n"
"Ch[y]rellos La citta' santa della Daresia\r\n" // Esempio Quarta Citta'
" Cattedrale e centro di riferimento per i quattro ordini\r\n"
"Che citta scegli?\r\n";
/*
* The code to interpret a class letter -- used in interpreter.c when a
* new character is selecting a class and by 'set class' in act.wizard.c.
*/
int parse_class(char arg)
{
arg = LOWER(arg);
switch (arg)
{
case 'm': return CLASS_MAGIC_USER;
case 'c': return CLASS_CLERIC;
case 'b': return CLASS_THIEF;
case 'g': return CLASS_WARRIOR;
case 's': return CLASS_SORCERER;
default: return CLASS_UNDEFINED;
}
}
int parse_race(char arg)
{
switch (arg)
{
case '1': return RACE_UMANO_ELIANTIRIANO;
case '2': return RACE_UMANO_EMERIANO;
case '3': return RACE_ELFO_DI_ALWENION;
case '4': return RACE_ELFO_DI_AMBRATO;
case '5': return RACE_ELFO_NERO; // QUSST'VIIRYN Ousst'viiryn
case '6': return RACE_NANO;
case '7': return RACE_HALFLING;
case '8': return RACE_ORCO;
case '9': return RACE_GOBLIN;
default : return RACE_UNDEFINED;
}
}
int parse_hometown(char arg)
{
arg = LOWER(arg);
switch (arg) {
case 'd':
return 0;
break;
case 'j': // JIROCH - Non e' valida alla nascita !!!!
return 1;
break;
case 'c':
return 2;
break;
case 'y':
return 3;
break;
case 'l':
return 4;
break;
default:
return 0;
break;
}
}
/*pezzo di codice aggiunto[NON COMBATIBILE:-( ] da un altro mud basato sullo stesso codice sorgente lyonesse mud(circle mud)
int parse_hometown(char arg)
{
switch (arg)
{
case 'd': return HOMETOWN_DEIRA;
case 'j': return HOMETOWN_CIMMURA;
case 'c': return HOMETOWN_LAMORKA;
case 'y': return HOMETOWN_CHYRELLOS;
}
}*/
/*
* bitvectors (i.e., powers of two) for each class, mainly for use in
* do_who and do_users. Add new classes at the end so that all classes
* use sequential powers of two (1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4,
* 1 << 5, etc.
*/
long find_class_bitvector(char arg)
{
arg = LOWER(arg);
switch (arg)
{
case 'm': return (1 << CLASS_MAGIC_USER);
case 'c': return (1 << CLASS_CLERIC);
case 'b': return (1 << CLASS_THIEF);
case 'g': return (1 << CLASS_WARRIOR);
case 's': return (1 << CLASS_SORCERER);
default: return 0;
}
}
long find_race_bitvector(char arg)
{
switch (arg)
{
case '1': return (1 << RACE_UMANO_ELIANTIRIANO);
case '2': return (1 << RACE_UMANO_EMERIANO);
case '3': return (1 << RACE_ELFO_DI_ALWENION);
case '4': return (1 << RACE_ELFO_DI_AMBRATO);
case '5': return (1 << RACE_ELFO_NERO); // QUSST'VIIRYN Ousst'viiryn
case '6': return (1 << RACE_NANO);
case '7': return (1 << RACE_HALFLING);
case '8': return (1 << RACE_ORCO);
case '9': return (1 << RACE_GOBLIN);
default : return (0);
}
}
/*pezzo di codice aggiunto[NON COMBATIBILE:-( ] da un altro mud basato sullo stesso codice sorgente lyonesse mud(circle mud)
long find_hometown_bitvector(char arg)
{
switch (arg)
{
case 'd': return (1 << HOMETOWN_DEIRA);
case 'j': return (1 << HOMETOWN_CIMMURA);
case 'c': return (1 << HOMETOWN_LAMORKA);
case 'y': return (1 << HOMETOWN_CHYRELLOS);
default : return (0);
}
}*/
/*
* These are definitions which control the guildmasters for each class.
*
* The first field (top line) controls the highest percentage skill level
* a character of the class is allowed to attain in any skill. (After
* this level, attempts to practice will say "You are already learned in
* this area."
*
* The second line controls the maximum percent gain in learnedness a
* character is allowed per practice -- in other words, if the random
* die throw comes out higher than this number, the gain will only be
* this number instead.
*
* The third line controls the minimu percent gain in learnedness a
* character is allowed per practice -- in other words, if the random
* die throw comes out below this number, the gain will be set up to
* this number.
*
* The fourth line simply sets whether the character knows 'spells'
* or 'skills'. This does not affect anything except the message given
* to the character when trying to practice (i.e. "You know of the
* following spells" vs. "You know of the following skills"
*/
#define SPELL 0
#define SKILL 1
/* #define LEARNED_LEVEL 0 % known which is considered "learned" */
/* #define MAX_PER_PRAC 1 max percent gain in skill per practice */
/* #define MIN_PER_PRAC 2 min percent gain in skill per practice */
/* #define PRAC_TYPE 3 should it say 'spell' or 'skill'? */
int prac_params[4][NUM_CLASSES] =
{
/* MAG CLE THE WAR, SOR */
{ 95, 95, 85, 80, 95 }, /* learned level */
{ 100, 100, 12, 12, 100 }, /* max per practice */
{ 25, 25, 0, 0, 25 }, /* min per practice */
{ SPELL, SPELL, SKILL, SKILL, SPELL } /* prac name */
};
/*
* ...And the appropriate rooms for each guildmaster/guildguard; controls
* which types of people the various guildguards let through. i.e., the
* first line shows that from room 3017, only MAGIC_USERS are allowed
* to go south.
*
* Don't forget to visit spec_assign.c if you create any new mobiles that
* should be a guild master or guard so they can act appropriately. If you
* "recycle" the existing mobs that are used in other guilds for your new
* guild, then you don't have to change that file, only here.
*/
int guild_info[][3] =
{
/* Midgaard */
{CLASS_MAGIC_USER, 3017, SCMD_SUD},
{CLASS_SORCERER, 3017, SCMD_SUD},
{CLASS_CLERIC, 3004, SCMD_NORD},
{CLASS_THIEF, 3027, SCMD_EST},
{CLASS_WARRIOR, 3021, SCMD_EST},
/* Brass Dragon */
{-999 /* all */ , 5065, SCMD_OVEST},
/* this must go last -- add new guards above! */
{-1, -1, -1}
};
/* Order of saving throws: PARA, ROD, PETRI, BREATH, SPELL */
/* This matrix determines the base saving throw for each */
/* class (i.e. the saving throw needed at level 1). */
int saving_throw_base[NUM_CLASSES][5] =
{
{ 70, 55, 65, 75, 60 }, /* MU */
{ 60, 70, 65, 80, 75 }, /* CL */
{ 65, 70, 60, 80, 75 }, /* TH */
{ 70, 80, 75, 85, 85 }, /* WA */
{ 70, 55, 65, 75, 60 } /* SO */
};
/* This is the rate at which saving throws improve, *10 */
/* So, if a saving throw improves at a rate of 1.4 per */
/* level, it is entered into this matrix as -14. */
int saving_throw_improve[NUM_CLASSES][5] =
{
{ -14, -16, -17, -17, -17 }, /* MU */
{ -16, -15, -15, -15, -15 }, /* CL */
{ -10, -20, -10, -10, -20 }, /* TH */
{ -21, -21, -21, -25, -21 }, /* WA */
{ -14, -16, -17, -17, -17 } /* SO */
};
/*
* Saving throws for:
* MCTW
* PARA, ROD, PETRI, BREATH, SPELL
* Levels 0-40
*
* Do not forget to change extern declaration in magic.c if you add to this.
*/
byte saving_throws(int class_num, int type, int level)
{
float mod;
mod = (saving_throw_improve[class_num][type] / 10.0) * (level - 1);
return (saving_throw_base[class_num][type] + mod);
}
/* THAC0 for classes and levels. (To Hit Armor Class 0) */
int thaco(int class_num, int level)
{
int t = 100; /* Default THAC0 */
if (level > 0)
{
switch (class_num)
{
case CLASS_MAGIC_USER: t = 20 - ((level - 1) / 3); break;
case CLASS_CLERIC: t = 20 - (((level - 1) / 3) * 2); break;
case CLASS_THIEF: t = 20 - ((level - 1) / 2); break;
case CLASS_WARRIOR: t = 20 - (level - 1); break;
case CLASS_SORCERER: t = 20 - ((level - 1) / 3); break;
default:
log("SYSERR: Unknown class in thac0 chart."); break;
}
}
if (t < 1) /* Nobody can have a THAC0 better than 1! */
t = 1;
return (t);
}
/*
* Roll the 6 stats for a character... each stat is made of the sum of
* the best 3 out of 4 rolls of a 6-sided die. Each class then decides
* which priority will be given for the best to worst stats.
*/
void roll_real_abils(CHAR_DATA *ch)
{
int i, j, k, temp;
ubyte table[6];
ubyte rolls[4];
for (i = 0; i < 6; i++)
table[i] = 0;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 4; j++)
rolls[j] = number(1, 6);
temp = rolls[0] + rolls[1] + rolls[2] + rolls[3] -
MIN(rolls[0], MIN(rolls[1], MIN(rolls[2], rolls[3])));
for (k = 0; k < 6; k++)
if (table[k] < temp)
{
temp ^= table[k];
table[k] ^= temp;
temp ^= table[k];
}
}
switch (GET_CLASS(ch))
{
case CLASS_MAGIC_USER:
ch->real_abils.intel = table[0];
ch->real_abils.wis = table[1];
ch->real_abils.dex = table[2];
ch->real_abils.str = table[3];
ch->real_abils.con = table[4];
ch->real_abils.cha = table[5];
break;
case CLASS_CLERIC:
ch->real_abils.wis = table[0];
ch->real_abils.intel = table[1];
ch->real_abils.str = table[2];
ch->real_abils.dex = table[3];
ch->real_abils.con = table[4];
ch->real_abils.cha = table[5];
break;
case CLASS_THIEF:
ch->real_abils.dex = table[0];
ch->real_abils.str = table[1];
ch->real_abils.con = table[2];
ch->real_abils.intel = table[3];
ch->real_abils.wis = table[4];
ch->real_abils.cha = table[5];
break;
case CLASS_WARRIOR:
ch->real_abils.str = table[0];
ch->real_abils.dex = table[1];
ch->real_abils.con = table[2];
ch->real_abils.wis = table[3];
ch->real_abils.intel = table[4];
ch->real_abils.cha = table[5];
break;
case CLASS_SORCERER:
ch->real_abils.intel = table[0];
ch->real_abils.dex = table[1];
ch->real_abils.str = table[2];
ch->real_abils.wis = table[3];
ch->real_abils.con = table[4];
ch->real_abils.cha = table[5];
}
switch (GET_RACE(ch))
{
case RACE_UMANO_ELIANTIRIANO:
break;
case RACE_UMANO_EMERIANO:
break;
case RACE_ELFO_DI_ALWENION:
ch->real_abils.dex += 1;
ch->real_abils.con -= 1;
break;
case RACE_ELFO_DI_AMBRATO:
ch->real_abils.dex += 1;
ch->real_abils.con -= 1;
break;
case RACE_ELFO_NERO:
ch->real_abils.dex += 1;
ch->real_abils.con -= 1;
break;
case RACE_NANO:
ch->real_abils.con += 2;
ch->real_abils.intel -= 1;
ch->real_abils.cha -= 1;
break;
case RACE_HALFLING:
ch->real_abils.con += 2;
ch->real_abils.intel -= 1;
ch->real_abils.cha -= 1;
case RACE_ORCO:
break;
case RACE_GOBLIN:
break;
}
ch->aff_abils = ch->real_abils;
}
/* Some initializations for characters, including initial skills */
void do_start(CHAR_DATA *ch)
{
OBJ_DATA *obj;
int i;
obj_vnum give_obj[] = {2542, 2544, 3010, 3022, 3030, 3042, 3071, 3076, 3081, 4328, 3104, 3221, 4002, 5423, 5441, -1};
//obj_vnum give_obj[] = {3015, 3015, -1};
/*
Oggetti di partenza alla creazione del personaggio base
N vnum oggetto N Peso in Libbre
1 3015 un pezzo di carne 1 1--- Libbre
2 3015 un pezzo di carne 2 1--- Libbre
* ---- ------------------------------------ -- 2-/-- Libbre Totali
Oggetti di partenza alla creazione del personaggio completo
( tutti gli oggetti nel inventario)e non nell'equip.
N Vnum Oggetto N Peso in Libbre
1 2542 Un paio di grandi stivali 1 1???
2 2544 Uno Zaino di Cuoio 2 2--- Libbre
3 3010 Un pezzo di pane 3 1???
4 3022 Una spada lunga 4 5--- Libbre
5 3030 Una torcia 5 1--- Libbre
6 3042 Uno scudo di legno 6 5--- Libbre
7 3071 Un paio di guanti di cuoio 7 1--- Libbre
8 3076 Un elmetto di cuoio 8 3--- Libbre
9 3081 Un paio di pantaloni di cotone 9 1--- Libbre
10 3104 Una borraccia acqua 10 9--- Libbre
11 3221 Una razione di frutta essiccata 11 1--- Libbre
12 4002 Una some di 500 monete 12 2???
13 4328 Un paio di bracciali di cuoio 13 4--- Libbre
14 5423 Una Giacca di pelle 14 1???
15 5441 Un filoncino di pane 15 1--- Libbre
* ---- ------------------------------ -- 34/38 Libbre Totali
esempio di un pg appena creato in mud con 36% 40 libbre.
*/
GET_LEVEL(ch) = 1;
GET_TOT_LEVEL(ch) = 1;
GET_EXP(ch) = 1;
set_title(ch, NULL);
switch (GET_CLASS(ch))
{
case CLASS_MAGIC_USER:
SET_SKILL(ch, SKILL_AGGUATO, 20);
SET_SKILL(ch, SKILL_SNEAK, 5);
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
SET_SKILL(ch, SKILL_CALCIARE, 5);
SET_SKILL(ch, SKILL_CAVALCARE, 60);
SET_SKILL(ch, SKILL_TRACK, 20);
SET_SKILL(ch, SKILL_SCASSINARE, 10);
SET_SKILL(ch, SKILL_HIDE, 20);
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
SET_SKILL(ch, SKILL_TAME, 50);
//SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
//SET_SKILL(ch, SKILL_DAGGERS, 15);
//SET_SKILL(ch, SKILL_BLUDGEONS, 15);
SET_SKILL(ch, SKILL_STUDY, 15);
SET_SKILL(ch, SKILL_READ_MAGIC, 10);
break;
case CLASS_CLERIC:
SET_SKILL(ch, SKILL_AGGUATO, 20);
SET_SKILL(ch, SKILL_SNEAK, 5);
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
SET_SKILL(ch, SKILL_CALCIARE, 5);
SET_SKILL(ch, SKILL_CAVALCARE, 60);
SET_SKILL(ch, SKILL_TRACK, 20);
SET_SKILL(ch, SKILL_SCASSINARE, 10);
SET_SKILL(ch, SKILL_HIDE, 20);
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
SET_SKILL(ch, SKILL_TAME, 50);
//SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
//SET_SKILL(ch, SKILL_DAGGERS, 15);
//SET_SKILL(ch, SKILL_BLUDGEONS, 15);
SET_SKILL(ch, SKILL_STUDY, 10);
SET_SKILL(ch, SKILL_READ_MAGIC, 10);
break;
case CLASS_WARRIOR:
SET_SKILL(ch, SKILL_AGGUATO, 20);
SET_SKILL(ch, SKILL_SNEAK, 5);
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
SET_SKILL(ch, SKILL_CALCIARE, 5);
SET_SKILL(ch, SKILL_CAVALCARE, 60);
SET_SKILL(ch, SKILL_TRACK, 20);
SET_SKILL(ch, SKILL_SCASSINARE, 10);
SET_SKILL(ch, SKILL_HIDE, 20);
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
SET_SKILL(ch, SKILL_TAME, 50);
//SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
//SET_SKILL(ch, SKILL_DAGGERS, 15);
//SET_SKILL(ch, SKILL_BLUDGEONS, 15);
SET_SKILL(ch, SKILL_STUDY, 10);
SET_SKILL(ch, SKILL_NAVIGATION, 15);
break;
case CLASS_THIEF:
SET_SKILL(ch, SKILL_AGGUATO, 20);
SET_SKILL(ch, SKILL_SNEAK, 5);
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
SET_SKILL(ch, SKILL_CALCIARE, 5);
SET_SKILL(ch, SKILL_CAVALCARE, 60);
SET_SKILL(ch, SKILL_TRACK, 20);
SET_SKILL(ch, SKILL_SCASSINARE, 10);
SET_SKILL(ch, SKILL_HIDE, 20);
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
SET_SKILL(ch, SKILL_TAME, 50);
//SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
//SET_SKILL(ch, SKILL_DAGGERS, 15);
//SET_SKILL(ch, SKILL_BLUDGEONS, 15);
SET_SKILL(ch, SKILL_STUDY, 10);
break;
case CLASS_SORCERER:
SET_SKILL(ch, SKILL_AGGUATO, 20);
SET_SKILL(ch, SKILL_SNEAK, 5);
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
SET_SKILL(ch, SKILL_CALCIARE, 5);
SET_SKILL(ch, SKILL_CAVALCARE, 60);
SET_SKILL(ch, SKILL_TRACK, 20);
SET_SKILL(ch, SKILL_SCASSINARE, 10);
SET_SKILL(ch, SKILL_HIDE, 20);
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
SET_SKILL(ch, SKILL_TAME, 50);
//SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
//SET_SKILL(ch, SKILL_DAGGERS, 15);
//SET_SKILL(ch, SKILL_BLUDGEONS, 15);
SET_SKILL(ch, SKILL_STUDY, 10);
SET_SKILL(ch, SKILL_READ_MAGIC, 15);
create_new_spellbook(ch, BOOK_TRAVELLING);
break;
}
advance_level(ch);
sprintf(buf, "%s avanzi di livello %d", GET_NAME(ch), GET_LEVEL(ch));
mudlog(buf, BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
GET_HIT(ch) = GET_MAX_HIT(ch);
GET_MANA(ch) = GET_MAX_MANA(ch);
GET_MOVE(ch) = GET_MAX_MOVE(ch);
//pezzo di codice preso dal file sorgente( che se si vuole modificare il tempo alla fame e alla sete bisogna andare nei seguenti file act.wizard.c, limits.c, act.informative.c, act.item.c, db.c.
//fame = 300 Minuti '5 Ore' ( Mud )
//sete = 180 Minuti '3 Ore' ( Mud )
GET_COND(ch, THIRST) = 96;
GET_COND(ch, FULL) = 96;
GET_COND(ch, DRUNK) = 0;
SET_BIT(PRF_FLAGS(ch), PRF_AUTOEXIT);
// SET_BIT(PRF_FLAGS(ch), PRF_AUTODIR);
SET_BIT(PRF_FLAGS(ch), PRF_DISPHP);
SET_BIT(PRF_FLAGS(ch), PRF_DISPMANA);
SET_BIT(PRF_FLAGS(ch), PRF_DISPMOVE);
SET_BIT(PRF_FLAGS(ch), PRF_COLOR_1);
SET_BIT(PRF_FLAGS(ch), PRF_COLOR_2);
ch->player.time.played = 0;
ch->player.time.logon = time(0);
if (siteok_everyone)
SET_BIT(PLR_FLAGS(ch), PLR_SITEOK);
SET_BIT(PRF_FLAGS(ch), PRF_COLOR_1);
SET_BIT(PRF_FLAGS(ch), PRF_COLOR_2);
/* give them something to start with */
for (i = 0; give_obj[i] != -1; i++)
{
obj = read_object(give_obj[i], VIRTUAL);
obj_to_char(obj, ch);
}
}
/*
* This function controls the change to maxmove, maxmana, and maxhp for
* each class every time they gain a level.
*/
void advance_level(CHAR_DATA *ch)
{
int add_hp, add_mana = 0, add_move = 0, i;
add_hp = con_app[GET_CON(ch)].hitp;
switch (GET_CLASS(ch))
{
case CLASS_MAGIC_USER:
add_hp += number(6, 16); // add_hp += number(3, 8);
add_mana = number(GET_LEVEL(ch), 1.5 * GET_LEVEL(ch)); //
add_mana = MIN(add_mana, 10); //
add_move = number(0, 6); // add_move = number(0, 3);
GET_PRACTICES(ch) += 4;
break;
case CLASS_CLERIC:
add_hp += number(10, 20); // add_hp += number(5, 10);
add_mana = number(GET_LEVEL(ch), 1.5 * GET_LEVEL(ch)); //
add_mana = MIN(add_mana, 10); //
add_move = number(4, 10); // add_move = number(2, 5);
GET_PRACTICES(ch) += 4;
break;
case CLASS_THIEF:
add_hp += number(14, 26); // add_hp += number(7, 13);
add_mana = 0; //
add_move = number(6, 12); // add_move = number(3, 6);
GET_PRACTICES(ch) += 4;
break;
case CLASS_WARRIOR:
add_hp += number(20, 30); // add_hp += number(10, 15);
add_mana = 0; //
add_move = number(6, 10); // add_move = number(3, 5);
GET_PRACTICES(ch) += 4;
break;
case CLASS_SORCERER:
add_hp += number(8, 18); // add_hp += number(4, 9);
add_mana = 0; //
add_move = number(2, 8); // add_move = number(1, 4);
GET_PRACTICES(ch) += 4;
break;
}
GET_MAX_HIT(ch) += MAX(1, add_hp);
GET_MAX_MOVE(ch) += MAX(1, add_move);
GET_MAX_MANA(ch) += add_mana;
if (IS_MAGIC_USER(ch) || IS_CLERIC(ch) || IS_SORCERER(ch))
GET_PRACTICES(ch) += MAX(2, wis_app[GET_WIS(ch)].bonus);
else
GET_PRACTICES(ch) += MIN(2, MAX(1, wis_app[GET_WIS(ch)].bonus));
if (GET_LEVEL(ch) >= LVL_IMMORT)
{
for (i = 0; i < 3; i++)
GET_COND(ch, i) = (char) -1;
SET_BIT(PRF_FLAGS(ch), PRF_HOLYLIGHT);
}
snoop_check(ch);
save_char(ch, NULL);
}
/*
* This simply calculates the backstab multiplier based on a character's
* level. This used to be an array, but was changed to be a function so
* that it would be easier to add more levels to your MUD. This doesn't
* really create a big performance hit because it's not used very often.
*/
int backstab_mult(int level)
{
if (level <= 0) return (1); /* livello 0 */
else if (level <= 7) return (2); /* livello 1 - 7 */
else if (level <= 13) return (3); /* livello 8 - 13 */
else if (level <= 20) return (4); /* livello 14 - 20 */
else if (level <= 28) return (5); /* livello 21 - 28 */
else if (level < LVL_IMMORT) return (6); /* tutti i rimandenti livelli mortali */
else return (20); /* immortali */
}
/*
* invalid_class is used by handler.c to determine if a piece of equipment is
* usable by a particular class, based on the ITEM_ANTI_{class} bitvectors.
*/
int invalid_class(CHAR_DATA *ch, OBJ_DATA *obj)
{
if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_MAGIC_USER) && IS_MAGIC_USER(ch))
return (TRUE);
if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_CLERIC) && IS_CLERIC(ch))
return (TRUE);
if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_THIEF) && IS_THIEF(ch))
return (TRUE);
//if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_WARRIOR) && IS_WARRIOR(ch))
// return (TRUE);
if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_SORCERER) && IS_SORCERER(ch))
return (TRUE);
return (FALSE);
}
int invalid_race(CHAR_DATA *ch, OBJ_DATA *obj)
{
//if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_UMANO) && IS_UMANO(ch))
//return (TRUE);
//if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_ELFO) && IS_ELFO(ch))
//return (TRUE);
//if (IS_SET(GET_OBJ_ANTI(obj), ITEM_ANTI_NANO) && IS_NANO(ch))
//return (TRUE);
return (FALSE);
}
/*
* SPELLS AND SKILLS. This area defines which spells are assigned to
* which classes, and the minimum level the character must be to use
* the spell or skill.
*/
void init_spell_levels(void)
{
/* MAGHI */
spell_level(SKILL_AGGUATO, CLASS_MAGIC_USER, 1);
spell_level(SKILL_SNEAK, CLASS_MAGIC_USER, 1);
spell_level(SKILL_SBILANCIARE, CLASS_MAGIC_USER, 1);
spell_level(SKILL_CALCIARE, CLASS_MAGIC_USER, 1);
spell_level(SKILL_CAVALCARE, CLASS_MAGIC_USER, 1);
spell_level(SKILL_TRACK, CLASS_MAGIC_USER, 1);
spell_level(SKILL_SCASSINARE, CLASS_MAGIC_USER, 1);
spell_level(SKILL_HIDE, CLASS_MAGIC_USER, 1);
spell_level(SKILL_BORSEGGIARE, CLASS_MAGIC_USER, 1);
//spell_level(SPELL_CHARM, CLASS_MAGIC_USER, 1);
spell_level(SKILL_TAME, CLASS_MAGIC_USER, 1);
spell_level(SPELL_SENSE_LIFE, CLASS_MAGIC_USER, 1);
spell_level(SKILL_WEAPON_SWORDS, CLASS_MAGIC_USER, 1); // Spade
spell_level(SKILL_WEAPON_DAGGERS, CLASS_MAGIC_USER, 1); // Pugnali
spell_level(SKILL_WEAPON_BLUDGEONS, CLASS_MAGIC_USER, 1); // mazze
//spell_level(STUDY, CLASS_MAGIC_USER, 1);
spell_level(SPELL_MAGIC_MISSILE, CLASS_MAGIC_USER, 1);
spell_level(SPELL_SHIELD, CLASS_MAGIC_USER, 1);
spell_level(SPELL_DETECT_INVIS, CLASS_MAGIC_USER, 2);
spell_level(SPELL_DETECT_MAGIC, CLASS_MAGIC_USER, 2);
spell_level(SPELL_CHILL_TOUCH, CLASS_MAGIC_USER, 3);
spell_level(SPELL_INFRAVISION, CLASS_MAGIC_USER, 3);
spell_level(SPELL_INVISIBLE, CLASS_MAGIC_USER, 4);
spell_level(SPELL_ARMOR, CLASS_MAGIC_USER, 4);
spell_level(SPELL_BURNING_HANDS, CLASS_MAGIC_USER, 5);
spell_level(SPELL_LOCATE_OBJECT, CLASS_MAGIC_USER, 6);
spell_level(SPELL_STRENGTH, CLASS_MAGIC_USER, 6);
spell_level(SPELL_SHOCKING_GRASP, CLASS_MAGIC_USER, 7);
spell_level(SPELL_SLEEP, CLASS_MAGIC_USER, 8);
spell_level(SPELL_LIGHTNING_BOLT, CLASS_MAGIC_USER, 9);
spell_level(SPELL_BLINDNESS, CLASS_MAGIC_USER, 9);
spell_level(SPELL_DETECT_POISON, CLASS_MAGIC_USER, 10);
spell_level(SPELL_COLOR_SPRAY, CLASS_MAGIC_USER, 11);
spell_level(SPELL_ACID_ARROW, CLASS_MAGIC_USER, 12);
spell_level(SPELL_ENERGY_DRAIN, CLASS_MAGIC_USER, 13);
spell_level(SPELL_CURSE, CLASS_MAGIC_USER, 14);
spell_level(SPELL_POISON, CLASS_MAGIC_USER, 14);
spell_level(SPELL_FIREBALL, CLASS_MAGIC_USER, 15);
spell_level(SPELL_FLASH, CLASS_MAGIC_USER, 18);
spell_level(SPELL_PARALYSIS, CLASS_MAGIC_USER, 20);
spell_level(SPELL_CLONE, CLASS_MAGIC_USER, 22);
spell_level(SPELL_STONE_SKIN, CLASS_MAGIC_USER, 25);
spell_level(SPELL_SHOCKWAVE, CLASS_MAGIC_USER, 27);
spell_level(SPELL_INCENDIARY_CLOUD, CLASS_MAGIC_USER, 30);
/* CHIERICO */
spell_level(SKILL_AGGUATO, CLASS_CLERIC, 1);
spell_level(SKILL_SNEAK, CLASS_CLERIC, 1);
spell_level(SKILL_SBILANCIARE, CLASS_CLERIC, 1);
spell_level(SKILL_CALCIARE, CLASS_CLERIC, 1);
spell_level(SKILL_CAVALCARE, CLASS_CLERIC, 1);
spell_level(SKILL_TRACK, CLASS_CLERIC, 1);
spell_level(SKILL_SCASSINARE, CLASS_CLERIC, 1);
spell_level(SKILL_HIDE, CLASS_CLERIC, 1);
spell_level(SKILL_BORSEGGIARE, CLASS_CLERIC, 1);
//spell_level(SPELL_CHARM, CLASS_CLERIC, 1);
spell_level(SKILL_TAME, CLASS_CLERIC, 1);
spell_level(SPELL_SENSE_LIFE, CLASS_CLERIC, 1);
spell_level(SKILL_WEAPON_SWORDS, CLASS_CLERIC, 1); // Spade
spell_level(SKILL_WEAPON_DAGGERS, CLASS_CLERIC, 1); // Pugnali
spell_level(SKILL_WEAPON_BLUDGEONS, CLASS_CLERIC, 1); // mazze
//spell_level(STUDY, CLASS_CLERIC, 1);
spell_level(SPELL_CURE_LIGHT, CLASS_CLERIC, 1);
spell_level(SPELL_ARMOR, CLASS_CLERIC, 1);
spell_level(SPELL_CREATE_FOOD, CLASS_CLERIC, 2);
spell_level(SPELL_CREATE_WATER, CLASS_CLERIC, 2);
spell_level(SPELL_DETECT_POISON, CLASS_CLERIC, 3);
spell_level(SPELL_DETECT_ALIGN, CLASS_CLERIC, 4);
spell_level(SPELL_CURE_BLIND, CLASS_CLERIC, 4);
spell_level(SPELL_BLESS, CLASS_CLERIC, 5);
spell_level(SPELL_DETECT_INVIS, CLASS_CLERIC, 6);
spell_level(SPELL_BLINDNESS, CLASS_CLERIC, 6);
spell_level(SPELL_INFRAVISION, CLASS_CLERIC, 7);
spell_level(SPELL_PROT_FROM_EVIL, CLASS_CLERIC, 8);
spell_level(SPELL_POISON, CLASS_CLERIC, 8);
spell_level(SPELL_GROUP_ARMOR, CLASS_CLERIC, 9);
spell_level(SPELL_CURE_CRITIC, CLASS_CLERIC, 9);
spell_level(SPELL_SUMMON, CLASS_CLERIC, 10);
spell_level(SPELL_REMOVE_POISON, CLASS_CLERIC, 10);
spell_level(SPELL_REGENERATION, CLASS_CLERIC, 10);
spell_level(SPELL_WORD_OF_RECALL, CLASS_CLERIC, 12);
spell_level(SPELL_EARTHQUAKE, CLASS_CLERIC, 12);
spell_level(SPELL_FLASH, CLASS_CLERIC, 13);
spell_level(SPELL_DISPEL_EVIL, CLASS_CLERIC, 14);
spell_level(SPELL_DISPEL_GOOD, CLASS_CLERIC, 14);
spell_level(SPELL_SANCTUARY, CLASS_CLERIC, 15);
spell_level(SPELL_CALL_LIGHTNING, CLASS_CLERIC, 15);
spell_level(SPELL_HEAL, CLASS_CLERIC, 16);
spell_level(SPELL_CONTROL_WEATHER, CLASS_CLERIC, 17);
spell_level(SPELL_HARM, CLASS_CLERIC, 19);
spell_level(SPELL_GROUP_HEAL, CLASS_CLERIC, 22);
spell_level(SPELL_REMOVE_CURSE, CLASS_CLERIC, 26);
/* BANDITO */
spell_level(SKILL_AGGUATO, CLASS_THIEF, 1);
spell_level(SKILL_SNEAK, CLASS_THIEF, 1);
spell_level(SKILL_SBILANCIARE, CLASS_THIEF, 1);
spell_level(SKILL_CALCIARE, CLASS_THIEF, 1);
spell_level(SKILL_CAVALCARE, CLASS_THIEF, 1);
spell_level(SKILL_TRACK, CLASS_THIEF, 1);
spell_level(SKILL_SCASSINARE, CLASS_THIEF, 1);
spell_level(SKILL_HIDE, CLASS_THIEF, 1);
spell_level(SKILL_BORSEGGIARE, CLASS_THIEF, 1);
//spell_level(SPELL_CHARM, CLASS_THIEF, 1);
spell_level(SKILL_TAME, CLASS_THIEF, 1);
spell_level(SPELL_SENSE_LIFE, CLASS_THIEF, 1);
spell_level(SKILL_WEAPON_SWORDS, CLASS_THIEF, 1); // Spade
spell_level(SKILL_WEAPON_DAGGERS, CLASS_THIEF, 1); // Pugnali
spell_level(SKILL_WEAPON_BLUDGEONS, CLASS_THIEF, 1); // mazze
//spell_level(STUDY, CLASS_THIEF, 1);
spell_level(SKILL_DISARM_TRAPS, CLASS_THIEF, 9);
/* GUERRIERO */
spell_level(SKILL_AGGUATO, CLASS_WARRIOR, 1);
spell_level(SKILL_SNEAK, CLASS_WARRIOR, 1);
spell_level(SKILL_SBILANCIARE, CLASS_WARRIOR, 1);
spell_level(SKILL_CALCIARE, CLASS_WARRIOR, 1);
spell_level(SKILL_CAVALCARE, CLASS_WARRIOR, 1);
spell_level(SKILL_TRACK, CLASS_WARRIOR, 1);
spell_level(SKILL_SCASSINARE, CLASS_WARRIOR, 1);
spell_level(SKILL_HIDE, CLASS_WARRIOR, 1);
spell_level(SKILL_BORSEGGIARE, CLASS_WARRIOR, 1);
spell_level(SKILL_RESCUE, CLASS_WARRIOR, 1);
spell_level(SKILL_TAME, CLASS_WARRIOR, 1);
spell_level(SPELL_SENSE_LIFE, CLASS_WARRIOR, 1);
//spell_level(STUDY, CLASS_WARRIOR, 1);
//spell_level(SPELL_CHARM, CLASS_WARRIOR, 1);
//spell_level(SKILL_NAVIGATION, CLASS_WARRIOR, PROF_LVL_START);
spell_level(SKILL_WEAPON_BOW, CLASS_WARRIOR, PROF_LVL_START);
spell_level(SKILL_WEAPON_SLING, CLASS_WARRIOR, PROF_LVL_START);
spell_level(SKILL_WEAPON_CROSSBOW, CLASS_WARRIOR, PROF_LVL_START);
spell_level(SKILL_WEAPON_SWORDS, CLASS_WARRIOR, 1); // Spade
spell_level(SKILL_WEAPON_DAGGERS, CLASS_WARRIOR, 1); // Pugnali
spell_level(SKILL_WEAPON_WHIPS, CLASS_WARRIOR, PROF_LVL_START);
spell_level(SKILL_WEAPON_TALONOUS_ARMS, CLASS_WARRIOR, PROF_LVL_START);
spell_level(SKILL_WEAPON_BLUDGEONS, CLASS_WARRIOR, 1); // mazze
spell_level(SKILL_WEAPON_EXOTICS, CLASS_WARRIOR, PROF_LVL_START);
/* STREGONE */
spell_level(SKILL_AGGUATO, CLASS_SORCERER, 1);
spell_level(SKILL_SNEAK, CLASS_SORCERER, 1);
spell_level(SKILL_SBILANCIARE, CLASS_SORCERER, 1);
spell_level(SKILL_CALCIARE, CLASS_SORCERER, 1);
spell_level(SKILL_CAVALCARE, CLASS_SORCERER, 1);
spell_level(SKILL_TRACK, CLASS_SORCERER, 1);
spell_level(SKILL_SCASSINARE, CLASS_SORCERER, 1);
spell_level(SKILL_HIDE, CLASS_SORCERER, 1);
spell_level(SKILL_BORSEGGIARE, CLASS_SORCERER, 1);
spell_level(SPELL_CHARM, CLASS_SORCERER, 1);
spell_level(SKILL_TAME, CLASS_SORCERER, 1);
spell_level(SPELL_SENSE_LIFE, CLASS_SORCERER, 1);
//spell_level(STUDY, CLASS_SORCERER, 1);
spell_level(SKILL_WEAPON_SWORDS, CLASS_SORCERER, 1); // Spade
spell_level(SKILL_WEAPON_DAGGERS, CLASS_SORCERER, 1); // Pugnali
spell_level(SKILL_WEAPON_BLUDGEONS, CLASS_SORCERER, 1); // mazze
spell_level(SPELL_MAGIC_MISSILE, CLASS_SORCERER, 1);
spell_level(SPELL_DETECT_INVIS, CLASS_SORCERER, 2);
spell_level(SPELL_DETECT_MAGIC, CLASS_SORCERER, 2);
spell_level(SPELL_CHILL_TOUCH, CLASS_SORCERER, 3);
spell_level(SPELL_INFRAVISION, CLASS_SORCERER, 3);
spell_level(SPELL_INVISIBLE, CLASS_SORCERER, 4);
spell_level(SPELL_ARMOR, CLASS_SORCERER, 4);
spell_level(SPELL_BURNING_HANDS, CLASS_SORCERER, 5);
spell_level(SPELL_LOCATE_OBJECT, CLASS_SORCERER, 6);
spell_level(SPELL_STRENGTH, CLASS_SORCERER, 6);
spell_level(SPELL_SHOCKING_GRASP, CLASS_SORCERER, 7);
spell_level(SPELL_SLEEP, CLASS_SORCERER, 8);
spell_level(SPELL_LIGHTNING_BOLT, CLASS_SORCERER, 9);
spell_level(SPELL_DETECT_POISON, CLASS_SORCERER, 10);
spell_level(SPELL_COLOR_SPRAY, CLASS_SORCERER, 11);
spell_level(SPELL_CURSE, CLASS_SORCERER, 14);
spell_level(SPELL_POISON, CLASS_SORCERER, 14);
spell_level(SPELL_FIREBALL, CLASS_SORCERER, 15);
spell_level(SPELL_BLINDNESS, CLASS_SORCERER, 16);
spell_level(SPELL_PARALYSIS, CLASS_SORCERER, 18);
spell_level(SPELL_ENCHANT_WEAPON, CLASS_SORCERER, 20);
spell_level(SKILL_ENCHANT_ITEMS, CLASS_SORCERER, 22);
spell_level(SPELL_FIRESHIELD, CLASS_SORCERER, 25);
spell_level(SPELL_SHOCKWAVE, CLASS_SORCERER, 27);
}
/*
* This is the exp given to implementors -- it must always be greater
* than the exp required for immortality, plus at least 20,000 or so.
*/
#define EXP_MAX 10000000
/*
* I titoli di default di personaggi maschili.
*/
const char *title_male(int chclass, int level)
{
if (level <= 0 || level > LVL_IMPL)
return ("L'Uomo");
if (level == LVL_IMPL)
return ("L'Implementor");
switch (chclass)
{
case CLASS_MAGIC_USER:
if (level < 10) return ("L'Appredista di magia ");
else if (level < 20) return ("Il Mago");
else if (level < 30) return ("l'Arcimago");
else return ("L'Immortale Arcimago ");
break;
case CLASS_CLERIC:
if (level < 10) return ("Il Druido");
else if (level < 20) return ("Il Prete");
else if (level < 30) return ("Il Vescovo");
else return ("L'Immortale Chierico");
break;
case CLASS_THIEF:
if (level < 10) return ("Il Ladro");
else if (level < 20) return ("Il furfante");
else if (level < 30) return ("Il bandito");
else return ("LImmortale Bandito");
break;
case CLASS_WARRIOR:
if (level < 10) return ("il combattente");
else if (level < 20) return ("il guerriero");
else if (level < 30) return ("il maestro guerriero");
else return ("l'Immortal maestro guerriero");
break;
case CLASS_SORCERER:
if (level < 10) return ("the Spell Student");
else if (level < 20) return ("the Magician");
else if (level < 30) return ("Il Stregone");
else return ("L'Immortale Stregone");
break;
}
/* Default title for classes which do not have titles defined */
return ("the Classless");
}
/*
* Default titles of female characters.
*/
const char *title_female(int chclass, int level)
{
if (level <= 0 || level > LVL_IMPL)
return ("La Donna");
if (level == LVL_IMPL)
return ("the Implementress");
switch (chclass)
{
case CLASS_MAGIC_USER:
if (level < 10) return ("the Apprentice of Magic"); // "the Apprentice of Magic"
else if (level < 20) return ("the Witch"); // "the Witch"
else if (level < 30) return ("the Archwitch"); // "the Archwitch"
else return ("the Immortal Archwitch"); // "the Immortal Archwitch"
break;
case CLASS_CLERIC:
if (level < 10) return ("the Acolyte"); // "the Acolyte"
else if (level < 20) return ("the Priestess"); // "the Priestess"
else if (level < 30) return ("the Bishop"); // "the Bishop"
else return ("the Immortal Priestess"); // "the Immortal Priestess"
break;
case CLASS_THIEF:
if (level < 10) return ("the Cut-Purse"); // "the Cut-Purse"
else if (level < 20) return ("the Rogue"); // "the Rogue"
else if (level < 30) return ("the Thief"); // "the Thief"
else return ("the Immortal Thief"); // "the Immortal Thief"
break;
case CLASS_WARRIOR:
if (level < 10) return ("the Fighter"); // "the Fighter"
else if (level < 20) return ("the Warrior"); // "the Warrior"
else if (level < 30) return ("the Swordmistress"); // "the Swordmistress"
else return ("the Immortal Swordmistress"); // "the Immortal Swordmistress"
break;
case CLASS_SORCERER:
if (level < 10) return ("the Spell Student"); // "the Spell Student"
else if (level < 20) return ("the Magician"); // "the Magician"
else if (level < 30) return ("the Sorceress"); // "the Sorceress"
else return ("the Immortal Sorceress"); // "the Immortal Sorceress"
break;
}
/* Default title for classes which do not have titles defined */
return "the Classless";
}
/* ********************************************************************* */
/* Remort Code */
/* ********************************************************************* */
/* Multi message - modify this message to set multi message */
char *multi_message =
"You have multied, and must begin anew. However, you will retain knowledge\r\n"
"of your previous skills and spells, you just will not be able to use them\r\n"
"until you reach the appropriate level.\r\n";
int can_multi(CHAR_DATA *ch, int newclass)
{
/* Is wanted class same as current class? */
if (newclass == GET_CLASS(ch))
{
sprintf(buf, "Ma tu sei un %s!!!\r\n", pc_class_types[(int)GET_CLASS(ch)]);
send_to_char(buf, ch);
return (FALSE);
}
/* Has char already completed this class? */
if (MULTICLASSED(ch, (1 << newclass)))
{
send_to_char("You can not repeat a class already completed.\r\n", ch);
return (FALSE);
}
if (GET_LEVEL(ch) < MULTI_LEVEL)
{
sprintf(buf, "You are only level %d, you must be at least level %d before you can multi.\r\n",
GET_LEVEL(ch), MULTI_LEVEL);
send_to_char(buf, ch);
return (FALSE);
}
/* Is the char in the appropriate room? */
if (MULTI_ROOM != NOWHERE)
{
ROOM_DATA *pRoom;
if ((pRoom = get_room(MULTI_ROOM)) && ch->in_room != pRoom)
{
send_to_char("You are not in the correct room to multi!\r\n", ch);
return (FALSE);
}
}
return (TRUE);
}
ACMD(do_remort)
{
int newclass;
one_argument(argument, arg);
if (!*arg)
{
send_to_char(
"&b&4-================&b&1}&3****&b&1(&b&3 O&7 S C E L T A C U L T U R A &b&3 O&b&1)&3****&b&1{&b&4================-&0\r\n"
"Usare: multi <nome classe>\r\n"
"I nomi classi validi sono:\r\n"
"&b&1[M]ago\r\n"
"&b&1[C]hierico\r\n"
"&b&1[B]andito\r\n"
"&b&1[G]uerriero\r\n"
"&b&1[S]tregone\r\n", ch);
return;
}
if ((newclass = parse_class(arg[0])) < 0)
{
send_to_char("Improper class name, please try again.\r\n", ch);
return;
}
if (!can_multi(ch, newclass))
return;
SET_BIT(MULTICLASS(ch), (1 << GET_CLASS(ch)));
GET_TOT_LEVEL(ch) += 1;
GET_LEVEL(ch) = 1;
GET_CLASS(ch) = newclass;
GET_EXP(ch) = 1;
GET_MAX_HIT(ch) = 10;
GET_MAX_MANA(ch) = 100;
GET_MAX_MOVE(ch) = 100;
set_title(ch, NULL);
switch (GET_CLASS(ch))
{
case CLASS_MAGIC_USER:
if (!GET_SKILL(ch, SKILL_AGGUATO))
SET_SKILL(ch, SKILL_AGGUATO, 20);
if (!GET_SKILL(ch, SKILL_SNEAK))
SET_SKILL(ch, SKILL_SNEAK, 5);
if (!GET_SKILL(ch, SKILL_SBILANCIARE))
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
if (!GET_SKILL(ch, SKILL_CALCIARE))
SET_SKILL(ch, SKILL_CALCIARE, 5);
if (!GET_SKILL(ch, SKILL_CAVALCARE))
SET_SKILL(ch, SKILL_CAVALCARE, 60);
if (!GET_SKILL(ch, SKILL_TRACK))
SET_SKILL(ch, SKILL_TRACK, 20);
if (!GET_SKILL(ch, SKILL_SCASSINARE))
SET_SKILL(ch, SKILL_SCASSINARE, 10);
if (!GET_SKILL(ch, SKILL_HIDE))
SET_SKILL(ch, SKILL_HIDE, 20);
if (!GET_SKILL(ch, SKILL_BORSEGGIARE))
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
//if (!GET_SKILL(ch, SKILL_CHARM))
// SET_SKILL(ch, SKILL_CHARM, 5);
if (!GET_SKILL(ch, SKILL_TAME))
SET_SKILL(ch, SKILL_TAME, 50);
//if (!GET_SKILL(ch, SKILL_SENSE_LIFE))
// SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_SWORDS))
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
if (!GET_SKILL(ch, SKILL_WEAPON_DAGGERS))
SET_SKILL(ch, SKILL_WEAPON_DAGGERS, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_BLUDGEONS))
SET_SKILL(ch, SKILL_WEAPON_BLUDGEONS, 15);
if (!GET_SKILL(ch, SKILL_STUDY))
SET_SKILL(ch, SKILL_STUDY, 15);
if (!GET_SKILL(ch, SKILL_READ_MAGIC))
SET_SKILL(ch, SKILL_READ_MAGIC, 10);
break;
case CLASS_CLERIC:
if (!GET_SKILL(ch, SKILL_AGGUATO))
SET_SKILL(ch, SKILL_AGGUATO, 20);
if (!GET_SKILL(ch, SKILL_SNEAK))
SET_SKILL(ch, SKILL_SNEAK, 5);
if (!GET_SKILL(ch, SKILL_SBILANCIARE))
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
if (!GET_SKILL(ch, SKILL_CALCIARE))
SET_SKILL(ch, SKILL_CALCIARE, 5);
if (!GET_SKILL(ch, SKILL_CAVALCARE))
SET_SKILL(ch, SKILL_CAVALCARE, 60);
if (!GET_SKILL(ch, SKILL_TRACK))
SET_SKILL(ch, SKILL_TRACK, 20);
if (!GET_SKILL(ch, SKILL_SCASSINARE))
SET_SKILL(ch, SKILL_SCASSINARE, 10);
if (!GET_SKILL(ch, SKILL_HIDE))
SET_SKILL(ch, SKILL_HIDE, 20);
if (!GET_SKILL(ch, SKILL_BORSEGGIARE))
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
//if (!GET_SKILL(ch, SKILL_CHARM))
// SET_SKILL(ch, SKILL_CHARM, 5);
if (!GET_SKILL(ch, SKILL_TAME))
SET_SKILL(ch, SKILL_TAME, 50);
//if (!GET_SKILL(ch, SKILL_SENSE_LIFE))
// SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_SWORDS))
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
if (!GET_SKILL(ch, SKILL_WEAPON_DAGGERS))
SET_SKILL(ch, SKILL_WEAPON_DAGGERS, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_BLUDGEONS))
SET_SKILL(ch, SKILL_WEAPON_BLUDGEONS, 15);
if (!GET_SKILL(ch, SKILL_STUDY))
SET_SKILL(ch, SKILL_STUDY, 10);
if (!GET_SKILL(ch, SKILL_READ_MAGIC))
SET_SKILL(ch, SKILL_READ_MAGIC, 10);
break;
case CLASS_WARRIOR:
if (!GET_SKILL(ch, SKILL_AGGUATO))
SET_SKILL(ch, SKILL_AGGUATO, 20);
if (!GET_SKILL(ch, SKILL_SNEAK))
SET_SKILL(ch, SKILL_SNEAK, 5);
if (!GET_SKILL(ch, SKILL_SBILANCIARE))
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
if (!GET_SKILL(ch, SKILL_CALCIARE))
SET_SKILL(ch, SKILL_CALCIARE, 5);
if (!GET_SKILL(ch, SKILL_CAVALCARE))
SET_SKILL(ch, SKILL_CAVALCARE, 60);
if (!GET_SKILL(ch, SKILL_TRACK))
SET_SKILL(ch, SKILL_TRACK, 20);
if (!GET_SKILL(ch, SKILL_SCASSINARE))
SET_SKILL(ch, SKILL_SCASSINARE, 10);
if (!GET_SKILL(ch, SKILL_HIDE))
SET_SKILL(ch, SKILL_HIDE, 20);
if (!GET_SKILL(ch, SKILL_BORSEGGIARE))
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
//if (!GET_SKILL(ch, SKILL_CHARM))
// SET_SKILL(ch, SKILL_CHARM, 5);
if (!GET_SKILL(ch, SKILL_TAME))
SET_SKILL(ch, SKILL_TAME, 50);
//if (!GET_SKILL(ch, SKILL_SENSE_LIFE))
// SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_SWORDS))
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
if (!GET_SKILL(ch, SKILL_WEAPON_DAGGERS))
SET_SKILL(ch, SKILL_WEAPON_DAGGERS, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_BLUDGEONS))
SET_SKILL(ch, SKILL_WEAPON_BLUDGEONS, 15);
if (!GET_SKILL(ch, SKILL_STUDY))
SET_SKILL(ch, SKILL_STUDY, 10);
if (!GET_SKILL(ch, SKILL_NAVIGATION))
SET_SKILL(ch, SKILL_NAVIGATION, 5);
break;
case CLASS_THIEF:
if (!GET_SKILL(ch, SKILL_AGGUATO))
SET_SKILL(ch, SKILL_AGGUATO, 20);
if (!GET_SKILL(ch, SKILL_SNEAK))
SET_SKILL(ch, SKILL_SNEAK, 5);
if (!GET_SKILL(ch, SKILL_SBILANCIARE))
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
if (!GET_SKILL(ch, SKILL_CALCIARE))
SET_SKILL(ch, SKILL_CALCIARE, 5);
if (!GET_SKILL(ch, SKILL_CAVALCARE))
SET_SKILL(ch, SKILL_CAVALCARE, 60);
if (!GET_SKILL(ch, SKILL_TRACK))
SET_SKILL(ch, SKILL_TRACK, 20);
if (!GET_SKILL(ch, SKILL_SCASSINARE))
SET_SKILL(ch, SKILL_SCASSINARE, 10);
if (!GET_SKILL(ch, SKILL_HIDE))
SET_SKILL(ch, SKILL_HIDE, 20);
if (!GET_SKILL(ch, SKILL_BORSEGGIARE))
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
//if (!GET_SKILL(ch, SKILL_CHARM))
// SET_SKILL(ch, SKILL_CHARM, 5);
if (!GET_SKILL(ch, SKILL_TAME))
SET_SKILL(ch, SKILL_TAME, 50);
//if (!GET_SKILL(ch, SKILL_SENSE_LIFE))
// SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_SWORDS))
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
if (!GET_SKILL(ch, SKILL_WEAPON_DAGGERS))
SET_SKILL(ch, SKILL_WEAPON_DAGGERS, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_BLUDGEONS))
SET_SKILL(ch, SKILL_WEAPON_BLUDGEONS, 15);
if (!GET_SKILL(ch, SKILL_STUDY))
SET_SKILL(ch, SKILL_STUDY, 10);
break;
case CLASS_SORCERER:
if (!GET_SKILL(ch, SKILL_AGGUATO))
SET_SKILL(ch, SKILL_AGGUATO, 20);
if (!GET_SKILL(ch, SKILL_SNEAK))
SET_SKILL(ch, SKILL_SNEAK, 5);
if (!GET_SKILL(ch, SKILL_SBILANCIARE))
SET_SKILL(ch, SKILL_SBILANCIARE, 5);
if (!GET_SKILL(ch, SKILL_CALCIARE))
SET_SKILL(ch, SKILL_CALCIARE, 5);
if (!GET_SKILL(ch, SKILL_CAVALCARE))
SET_SKILL(ch, SKILL_CAVALCARE, 60);
if (!GET_SKILL(ch, SKILL_TRACK))
SET_SKILL(ch, SKILL_TRACK, 20);
if (!GET_SKILL(ch, SKILL_SCASSINARE))
SET_SKILL(ch, SKILL_SCASSINARE, 10);
if (!GET_SKILL(ch, SKILL_HIDE))
SET_SKILL(ch, SKILL_HIDE, 20);
if (!GET_SKILL(ch, SKILL_BORSEGGIARE))
SET_SKILL(ch, SKILL_BORSEGGIARE, 15);
//if (!GET_SKILL(ch, SKILL_CHARM))
// SET_SKILL(ch, SKILL_CHARM, 5);
if (!GET_SKILL(ch, SKILL_TAME))
SET_SKILL(ch, SKILL_TAME, 50);
//if (!GET_SKILL(ch, SKILL_SENSE_LIFE))
// SET_SKILL(ch, SKILL_SENSE_LIFE, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_SWORDS))
SET_SKILL(ch, SKILL_WEAPON_SWORDS, 40);
if (!GET_SKILL(ch, SKILL_WEAPON_DAGGERS))
SET_SKILL(ch, SKILL_WEAPON_DAGGERS, 15);
if (!GET_SKILL(ch, SKILL_WEAPON_BLUDGEONS))
SET_SKILL(ch, SKILL_WEAPON_BLUDGEONS, 15);
if (!GET_SKILL(ch, SKILL_STUDY))
SET_SKILL(ch, SKILL_STUDY, 10);
if (!GET_SKILL(ch, SKILL_READ_MAGIC))
SET_SKILL(ch, SKILL_READ_MAGIC, 15);
create_new_spellbook(ch, BOOK_TRAVELLING);
break;
}
advance_level(ch);
sprintf(buf, "%s remorted a livello %d", GET_NAME(ch), GET_LEVEL(ch));
mudlog(buf, BRF, MAX(LVL_IMMORT, GET_INVIS_LEV(ch)), TRUE);
send_to_char(multi_message, ch);
}
/*
* this is just a rough layout of the exp needed for a ch
* to level. recommend you change the modifier, and also
* the 4000 to something that suits you better.
*/
/* Nic Suzor's Exp Formula */
int exp_to_level(int level)
{
int modifier;
if (level == 1)
return (0);
else if (level < 6) modifier = 1;
else if (level < 9) modifier = 2;
else if (level < 11) modifier = 5;
else if (level < 13) modifier = 6;
else if (level < 15) modifier = 7;
else modifier = 8;
return (MIN(20, level - 1) * modifier * 340);/* 3400 */
}
int tot_exp_to_level(int level)
{
int exp, lvl;
for (exp = 0, lvl = 1; lvl <= level; lvl++)
exp += exp_to_level(lvl);
return (exp);
}
===============================================================
il msg lo devo dividere in due risposte perche e molto lungo:p