/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik Strfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
**************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
**************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
/* item type list */
const struct item_type item_table[] = {
{ITEM_LIGHT, "light"},
{ITEM_SCROLL, "scroll"},
{ITEM_WAND, "wand"},
{ITEM_STAFF, "staff"},
{ITEM_WEAPON, "weapon"},
{ITEM_TREASURE, "treasure"},
{ITEM_ARMOR, "armor"},
{ITEM_POTION, "potion"},
{ITEM_CLOTHING, "clothing"},
{ITEM_FURNITURE, "furniture"},
{ITEM_TRASH, "trash"},
{ITEM_CONTAINER, "container"},
{ITEM_DRINK_CON, "drink"},
{ITEM_KEY, "key"},
{ITEM_FOOD, "food"},
{ITEM_MONEY, "money"},
{ITEM_BOAT, "boat"},
{ITEM_CORPSE_NPC, "npc_corpse"},
{ITEM_CORPSE_PC, "pc_corpse"},
{ITEM_FOUNTAIN, "fountain"},
{ITEM_PILL, "pill"},
{ITEM_PROTECT, "protect"},
{ITEM_MAP, "map"},
{ITEM_PORTAL, "portal"},
{ITEM_WARP_STONE, "warp_stone"},
{ITEM_ROOM_KEY, "room_key"},
{ITEM_GEM, "gem"},
{ITEM_JEWELRY, "jewelry"},
{ITEM_JUKEBOX, "jukebox"},
{0, NULL}
};
/* weapon selection table */
const struct weapon_type weapon_table[] = {
{"sword", OBJ_VNUM_SCHOOL_SWORD, WEAPON_SWORD, &gsn_sword},
{"mace", OBJ_VNUM_SCHOOL_MACE, WEAPON_MACE, &gsn_mace},
{"dagger", OBJ_VNUM_SCHOOL_DAGGER, WEAPON_DAGGER, &gsn_dagger},
{"axe", OBJ_VNUM_SCHOOL_AXE, WEAPON_AXE, &gsn_axe},
{"staff", OBJ_VNUM_SCHOOL_STAFF, WEAPON_SPEAR, &gsn_spear},
{"flail", OBJ_VNUM_SCHOOL_FLAIL, WEAPON_FLAIL, &gsn_flail},
{"whip", OBJ_VNUM_SCHOOL_WHIP, WEAPON_WHIP, &gsn_whip},
{"polearm", OBJ_VNUM_SCHOOL_POLEARM, WEAPON_POLEARM, &gsn_polearm},
{NULL, 0, 0, NULL}
};
/* wiznet table and prototype for future flag setting */
const struct wiznet_type wiznet_table[] = {
{"on", WIZ_ON, IM},
{"prefix", WIZ_PREFIX, IM},
{"ticks", WIZ_TICKS, IM},
{"logins", WIZ_LOGINS, IM},
{"sites", WIZ_SITES, L2},
{"links", WIZ_LINKS, IM},
{"newbies", WIZ_NEWBIE, IM},
{"spam", WIZ_SPAM, IM},
{"deaths", WIZ_DEATHS, IM},
{"resets", WIZ_RESETS, L2},
{"memcheck", WIZ_MEMCHECK, L1},
{"mobdeaths", WIZ_MOBDEATHS, IM},
{"flags", WIZ_FLAGS, IM},
{"penalties", WIZ_PENALTIES, IM},
{"saccing", WIZ_SACCING, IM},
{"levels", WIZ_LEVELS, IM},
{"load", WIZ_LOAD, L1},
{"restore", WIZ_RESTORE, L1},
{"snoops", WIZ_SNOOPS, L1},
{"switches", WIZ_SWITCHES, L1},
{"secure", WIZ_SECURE, L1},
{NULL, 0, 0}
};
/* attack table -- not very organized :( */
const struct attack_type attack_table[MAX_DAMAGE_MESSAGE] = {
{"none", "hit", -1}, /* 0 */
{"slice", "slice", DAM_SLASH},
{"stab", "stab", DAM_PIERCE},
{"slash", "slash", DAM_SLASH},
{"whip", "whip", DAM_SLASH},
{"claw", "claw", DAM_SLASH}, /* 5 */
{"blast", "blast", DAM_BASH},
{"pound", "pound", DAM_BASH},
{"crush", "crush", DAM_BASH},
{"grep", "grep", DAM_SLASH},
{"bite", "bite", DAM_PIERCE}, /* 10 */
{"pierce", "pierce", DAM_PIERCE},
{"suction", "suction", DAM_BASH},
{"beating", "beating", DAM_BASH},
{"digestion", "digestion", DAM_ACID},
{"charge", "charge", DAM_BASH}, /* 15 */
{"slap", "slap", DAM_BASH},
{"punch", "punch", DAM_BASH},
{"wrath", "wrath", DAM_ENERGY},
{"magic", "magic", DAM_ENERGY},
{"divine", "divine power", DAM_HOLY}, /* 20 */
{"cleave", "cleave", DAM_SLASH},
{"scratch", "scratch", DAM_PIERCE},
{"peck", "peck", DAM_PIERCE},
{"peckb", "peck", DAM_BASH},
{"chop", "chop", DAM_SLASH}, /* 25 */
{"sting", "sting", DAM_PIERCE},
{"smash", "smash", DAM_BASH},
{"shbite", "shocking bite", DAM_LIGHTNING},
{"flbite", "flaming bite", DAM_FIRE},
{"frbite", "freezing bite", DAM_COLD}, /* 30 */
{"acbite", "acidic bite", DAM_ACID},
{"chomp", "chomp", DAM_PIERCE},
{"drain", "life drain", DAM_NEGATIVE},
{"thrust", "thrust", DAM_PIERCE},
{"slime", "slime", DAM_ACID},
{"shock", "shock", DAM_LIGHTNING},
{"thwack", "thwack", DAM_BASH},
{"flame", "flame", DAM_FIRE},
{"chill", "chill", DAM_COLD},
{NULL, NULL, 0}
};
/* race table */
const struct race_type race_table[] = {
/*
{
name, pc_race?,
act bits, aff_by bits, off bits,
imm, res, vuln,
form, parts
},
*/
{"unique", FALSE, 0, 0, 0, 0, 0, 0, 0, 0, FALSE},
{
"human", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, TRUE},
{
"saiya-jin", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, TRUE},
{
"namek", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, TRUE},
{
"half-breed", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, TRUE},
{
"icer", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, TRUE},
{
"majin", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, FALSE},
{
"android", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, TRUE},
{
"bio-android", TRUE,
0, 0, 0,
0, 0, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, TRUE},
{
"elf", FALSE,
0, AFF_INFRARED, 0,
0, RES_CHARM, VULN_IRON,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, FALSE},
{
"dwarf", FALSE,
0, AFF_INFRARED, 0,
0, RES_POISON | RES_DISEASE, VULN_DROWNING,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, FALSE},
{
"giant", FALSE,
0, 0, 0,
0, RES_FIRE | RES_COLD, VULN_MENTAL | VULN_LIGHTNING,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, FALSE},
{
"bat", FALSE,
0, AFF_FLYING | AFF_DARK_VISION, OFF_DODGE | OFF_FAST,
0, 0, VULN_LIGHT,
A | G | V, A | C | D | E | F | H | J | K | P, FALSE},
{
"bear", FALSE,
0, 0, OFF_CRUSH | OFF_DISARM | OFF_BERSERK,
0, RES_BASH | RES_COLD, 0,
A | G | V, A | B | C | D | E | F | H | J | K | U | V, FALSE},
{
"cat", FALSE,
0, AFF_DARK_VISION, OFF_FAST | OFF_DODGE,
0, 0, 0,
A | G | V, A | C | D | E | F | H | J | K | Q | U | V, FALSE},
{
"centipede", FALSE,
0, AFF_DARK_VISION, 0,
0, RES_PIERCE | RES_COLD, VULN_BASH,
A | B | G | O, A | C | K, FALSE},
{
"dog", FALSE,
0, 0, OFF_FAST,
0, 0, 0,
A | G | V, A | C | D | E | F | H | J | K | U | V, FALSE},
{
"doll", FALSE,
0, 0, 0,
IMM_COLD | IMM_POISON | IMM_HOLY | IMM_NEGATIVE | IMM_MENTAL |
IMM_DISEASE | IMM_DROWNING, RES_BASH | RES_LIGHT,
VULN_SLASH | VULN_FIRE | VULN_ACID | VULN_LIGHTNING | VULN_ENERGY,
E | J | M | cc, A | B | C | G | H | K, FALSE},
{"dragon", FALSE,
0, AFF_INFRARED | AFF_FLYING, 0,
0, RES_FIRE | RES_BASH | RES_CHARM,
VULN_PIERCE | VULN_COLD,
A | H | Z, A | C | D | E | F | G | H | I | J | K | P | Q | U | V | X, FALSE},
{
"fido", FALSE,
0, 0, OFF_DODGE | ASSIST_RACE,
0, 0, VULN_MAGIC,
A | B | G | V, A | C | D | E | F | H | J | K | Q | V, FALSE},
{
"fox", FALSE,
0, AFF_DARK_VISION, OFF_FAST | OFF_DODGE,
0, 0, 0,
A | G | V, A | C | D | E | F | H | J | K | Q | V, FALSE},
{
"goblin", FALSE,
0, AFF_INFRARED, 0,
0, RES_DISEASE, VULN_MAGIC,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, FALSE},
{
"hobgoblin", FALSE,
0, AFF_INFRARED, 0,
0, RES_DISEASE | RES_POISON, 0,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K | Y, FALSE},
{
"kobold", FALSE,
0, AFF_INFRARED, 0,
0, RES_POISON, VULN_MAGIC,
A | B | H | M | V, A | B | C | D | E | F | G | H | I | J | K | Q, FALSE},
{
"lizard", FALSE,
0, 0, 0,
0, RES_POISON, VULN_COLD,
A | G | X | cc, A | C | D | E | F | H | K | Q | V, FALSE},
{
"modron", FALSE,
0, AFF_INFRARED, ASSIST_RACE | ASSIST_ALIGN,
IMM_CHARM | IMM_DISEASE | IMM_MENTAL | IMM_HOLY | IMM_NEGATIVE,
RES_FIRE | RES_COLD | RES_ACID, 0,
H, A | B | C | G | H | J | K, FALSE},
{
"orc", FALSE,
0, AFF_INFRARED, 0,
0, RES_DISEASE, VULN_LIGHT,
A | H | M | V, A | B | C | D | E | F | G | H | I | J | K, FALSE},
{
"pig", FALSE,
0, 0, 0,
0, 0, 0,
A | G | V, A | C | D | E | F | H | J | K, FALSE},
{
"rabbit", FALSE,
0, 0, OFF_DODGE | OFF_FAST,
0, 0, 0,
A | G | V, A | C | D | E | F | H | J | K, FALSE},
{
"school monster", FALSE,
ACT_NOALIGN, 0, 0,
IMM_CHARM | IMM_SUMMON, 0, VULN_MAGIC,
A | M | V, A | B | C | D | E | F | H | J | K | Q | U, FALSE},
{
"snake", FALSE,
0, 0, 0,
0, RES_POISON, VULN_COLD,
A | G | X | Y | cc, A | D | E | F | K | L | Q | V | X, FALSE},
{
"song bird", FALSE,
0, AFF_FLYING, OFF_FAST | OFF_DODGE,
0, 0, 0,
A | G | W, A | C | D | E | F | H | K | P, FALSE},
{
"troll", FALSE,
0, AFF_REGENERATION | AFF_INFRARED | AFF_DETECT_HIDDEN,
OFF_BERSERK,
0, RES_CHARM | RES_BASH, VULN_FIRE | VULN_ACID,
A | B | H | M | V, A | B | C | D | E | F | G | H | I | J | K | U | V, FALSE},
{
"water fowl", FALSE,
0, AFF_SWIM | AFF_FLYING, 0,
0, RES_DROWNING, 0,
A | G | W, A | C | D | E | F | H | K | P, FALSE},
{
"wolf", FALSE,
0, AFF_DARK_VISION, OFF_FAST | OFF_DODGE,
0, 0, 0,
A | G | V, A | C | D | E | F | J | K | Q | V, FALSE},
{
"wyvern", FALSE,
0, AFF_FLYING | AFF_DETECT_INVIS | AFF_DETECT_HIDDEN,
OFF_BASH | OFF_FAST | OFF_DODGE,
IMM_POISON, 0, VULN_LIGHT,
A | B | G | Z, A | C | D | E | F | H | J | K | Q | V | X, FALSE},
{
"unique", FALSE,
0, 0, 0,
0, 0, 0,
0, 0, FALSE},
{
NULL, 0, 0, 0, 0, 0, 0, FALSE}
};
const struct pc_race_type pc_race_table[] = {
{"null race", "",
{""}, {13, 13, 13, 13, 13}, {18, 18, 18, 18, 18}, {10,10,10,10,10}, 0},
/*
{
"race name", short name,
{ bonus skills },
{ base stats }, { max stats }, { stat train cost }, size
},
*/
{
"human", "Human",
{""},
{10, 10, 10, 10, 10}, {180, 180, 180, 180, 180}, {6,6,6,6,6}, SIZE_MEDIUM},
{
"saiya-jin", "Saiya",
{""},
{12, 8, 8, 12, 10}, {160, 200, 180, 210, 150}, {5,7,7,5,6}, SIZE_MEDIUM},
{
"namek", "Namek",
{"fast healing", ""},
{8, 10, 10, 10, 12}, {160, 200, 180, 210, 150}, {7,6,6,6,5}, SIZE_MEDIUM},
{
"half-breed", "Halfb",
{""},
{11, 9, 9, 11, 10}, {160, 200, 180, 210, 150}, {5,7,7,5,6}, SIZE_MEDIUM},
{
"icer", "Icer",
{""},
{12, 10, 10, 8, 10}, {160, 200, 180, 210, 150}, {5,6,6,7,6}, SIZE_MEDIUM},
{
"majin", "Majin",
{""},
{12, 14, 13, 15, 11}, {160, 200, 180, 210, 150}, {4,4,4,4,4}, SIZE_MEDIUM},
{
"android", "Droid",
{""},
{11, 8, 10, 10, 11}, {160, 200, 180, 210, 150}, {5,7,6,6,5}, SIZE_MEDIUM},
{
"bio-android", "Bio",
{""},
{12, 6, 10, 10, 12}, {160, 200, 180, 210, 150}, {5,8,6,6,5}, SIZE_MEDIUM},
};
/*
* Titles.
*/
char *const title_table[MAX_LEVEL + 1][2] = {
{"Man", "Woman"},
{"Player", "Player"},
{"Hero", "Hero"},
{"Builder", "Builder"},
{"Head Builder", "Head Builder"},
{"Coder", "Coder"},
{"Implementor", "Implementor"}
};
// Names of the transformations
char *const trans_table[MAX_TRANS] = {
"not transformed",
"Super Saiya-Jin Level 1",
"Super Saiya-Jin Level 2",
"Super Saiya-Jin Level 3",
"Super Saiya-Jin Level 4",
"Super Saiya-Jin Level 5",
"Mystic",
"Super Human",
"Hyper Namek",
"Super Namek",
"Android Level 1",
"Android Level 2",
"Android Level 3",
"Self-Fused Android",
"Icer Form 2",
"Icer Form 3",
"Icer Form 4",
"Icer Form 5",
"Imperfect Bio-Android",
"Semi-Perfect Bio-Android",
"Perfect Bio-Android",
"Ultra-Perfect Bio-Android"
};
// Stances
char *const stance_table[] = {
"normal",
"offensive",
"defensive",
"kamikaze",
NULL
};
/*
* Liquid properties.
* Used in world.obj.
*/
/* Liquid Affects:
#define COND_DRUNK 0
#define COND_FULL 1
#define COND_THIRST 2
#define COND_HUNGER 3
*/
const struct liq_type liq_table[] = {
/* (drunk) (amount */
/* drank per use) */
/* name color proof,full,thirst,hunger,ssize, regen*/
{"water", "clear", { 0, 1, 10, 0, 16, 0}},
{"beer", "amber", { 12, 1, 8, 1, 12, 0}},
{"red wine", "burgundy", { 30, 1, 8, 1, 5, 0}},
{"ale", "brown", { 15, 1, 8, 1, 12, 0}},
{"dark ale", "dark", { 16, 1, 8, 1, 12, 0}},
{"whisky", "golden", {120, 1, 5, 0, 2, 0}},
{"lemonade", "pink", { 0, 1, 9, 2, 12, 0}},
{"firebreather", "boiling", {190, 0, 4, 0, 2, 0}},
{"local specialty", "clear", {151, 1, 3, 0, 2, 0}},
{"slime mold juice","green", { 0, 2, -8, 1, 2, 0}},
{"milk", "white", { 0, 2, 9, 3, 12, 0}},
{"tea", "tan", { 0, 1, 8, 0, 6, 0}},
{"coffee", "black", { 0, 1, 8, 0, 6, 0}},
{"blood", "red", { 0, 2, -1, 2, 6, 0}},
{"salt water", "clear", { 0, 1, -2, 0, 1, 0}},
{"coke", "brown", { 0, 2, 9, 2, 12, 0}},
{"root beer", "brown", { 0, 2, 9, 2, 12, 0}},
{"elvish wine", "green", { 35, 2, 8, 1, 5, 0}},
{"white wine", "golden", { 28, 1, 8, 1, 5, 0}},
{"champagne", "golden", { 32, 1, 8, 1, 5, 0}},
{"mead", "honey-colored", { 34, 2, 8, 2, 12, 0}},
{"rose wine", "pink", { 26, 1, 8, 1, 5, 0}},
{"benedictine wine","burgundy", { 40, 1, 8, 1, 5, 0}},
{"vodka", "clear", {130, 1, 5, 0, 2, 0}},
{"cranberry juice", "red", { 0, 1, 9, 2, 12, 0}},
{"orange juice", "orange", { 0, 2, 9, 3, 12, 0}},
{"absinthe", "green", {200, 1, 4, 0, 2, 0}},
{"brandy", "golden", { 80, 1, 5, 0, 4, 0}},
{"aquavit", "clear", {140, 1, 5, 0, 2, 0}},
{"schnapps", "clear", { 90, 1, 5, 0, 2, 0}},
{"icewine", "purple", { 50, 2, 6, 1, 5, 0}},
{"amontillado", "burgundy", { 35, 2, 8, 1, 5, 0}},
{"sherry", "red", { 38, 2, 7, 1, 5, 0}},
{"framboise", "red", { 50, 1, 7, 1, 5, 0}},
{"rum", "amber", {151, 1, 4, 0, 2, 0}},
{"cordial", "clear", {100, 1, 5, 0, 2, 0}},
{NULL, NULL, { 0, 0, 0, 0, 0, 0}}
};
/*
* The skill and spell table.
* Slot numbers must never be changed as they appear in #OBJECTS sections.
\ */
#define SLOT(n) n
struct skill_type skill_table[MAX_SKILL] = {
/* combat and weapons skills */
/*struct:
* { "name", &gsn_, skill_fun, command?,
* points, {"skillpre"}, {skill values}, {str,int,wis,dex,con}, pl_pre, {"race"},
* TAR_, POS_, ki, type (SKILL_IMM, SKILL_DELAY, SKILL_CHARGE), wait,
* "damage", "off", "obj off", "immediate 1", "imm 2", "delay 1", "delay 2" },
*/
/*
{ "", &gsn_, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 15, 0, 0,
"", "!error!", "", "", "", },
*/
{ "axe", "", &gsn_axe, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 10, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "dagger", "", &gsn_dagger, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 10, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "sword", "", &gsn_sword, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "flail", "", &gsn_flail, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "mace", "", &gsn_mace, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "polearm", "", &gsn_polearm, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "spear", "", &gsn_spear, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "whip", "", &gsn_whip, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "exotic", "", &gsn_exotic, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "hand to hand", "", &gsn_hand_to_hand, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"", "!error!", "", "", "", "", "" },
{ "shield block", "", &gsn_shield_block, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 3, SKILL_NONE, 0,
"", "!error!", "", "", "", "", "" },
{ "dodge", "", &gsn_dodge, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 3, SKILL_NONE, 0,
"", "!error!", "", "", "", "", "" },
{ "parry", "", &gsn_parry, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 3, SKILL_NONE, 0,
"", "!error!", "", "", "", "", "" },
{ "fast healing", "", &gsn_fast_healing, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_SLEEPING, 1, SKILL_NONE, 0,
"", "!error!", "", "", "", "", "" },
{ "meditation", "", &gsn_meditation, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_SLEEPING, 1, SKILL_NONE, 0,
"", "!error!", "", "", "", "", "" },
// Not updated:
{ "berserk", "", &gsn_berserk, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 5, SKILL_IMM, 24,
"", "You feel your pulse slow down.", "", "", "", "", "" },
{ "disarm", "", &gsn_disarm, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 5, SKILL_IMM, 24,
"", "!error!", "", "", "", "", "" },
{ "rescue", "", &gsn_rescue, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 1, SKILL_IMM, 12,
"", "!error!", "", "", "", "", "" },
/* non-combat skills */
{ "haggle", "", &gsn_haggle, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_RESTING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "hide", "", &gsn_hide, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_RESTING, 1, SKILL_IMM, 12,
"", "!error!", "", "", "", "", "" },
{ "lore", "", &gsn_lore, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 1, SKILL_IMM, 36,
"", "!error!", "", "", "", "", "" },
{ "peek", "", &gsn_peek, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_FIGHTING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "pick lock", "", &gsn_pick_lock, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 12,
"", "!error!", "", "", "", "", "" },
{ "sneak", "", &gsn_sneak, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 12,
"", "You no longer feel stealthy.", "", "", "", "", "" },
{ "steal", "", &gsn_steal, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 24,
"", "!error!", "", "", "", "", "" },
{ "scrolls", "", &gsn_scrolls, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 24,
"", "!error!", "", "", "", "", "" },
{ "staves", "", &gsn_staves, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 12,
"", "!error!", "", "", "", "", "" },
{ "wands", "", &gsn_wands, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 12,
"", "!error!", "", "", "", "", "" },
{ "recall", "", &gsn_recall, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 12,
"", "!error!", "", "", "", "", "" },
//other new ones:
{ "perception", "", &gsn_perception, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 12,
"", "!error!", "", "", "", "", "" },
{ "defend", "", &gsn_defend, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "kamikaze", "", &gsn_kamikaze, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 100000, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "fusion", "", &gsn_fusion, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 1000000, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "kaioken", "", &gsn_kaioken, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 500000, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "fly", "", &gsn_fly, NULL, FALSE,
0, {}, {}, {0,0,0,0,0}, 500000, {},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
// Transformations:
/*
{ "super saiya-jin", "", &gsn_supersaiyan, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {"saiya-jin", "half-breed"},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "mystic", "", &gsn_mystic, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 2500000000, {"half-breed"},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "super human", "", &gsn_superhuman, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 50000000, {"human"},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "namek transform", "", &gsn_namektrans, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {"namek"},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "icer form", "", &gsn_icerform, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 0, {"icer"},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
{ "self-fuse", "", &gsn_selffuse, NULL, FALSE,
0, {}, {0}, {0,0,0,0,0}, 2000000000, {"android"},
TAR_IGNORE, POS_STANDING, 1, SKILL_IMM, 0,
"", "!error!", "", "", "", "", "" },
*/
// Updated:
{ "bash", "", &gsn_bash, skill_bash, TRUE,
0, {"hand to hand"}, {3}, {0,0,0,15,0}, 10000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 24, SKILL_IMM, 5*PULSE_SECOND,
"bash", "!error!", "", "", "", "", "" },
{ "kick", "", &gsn_kick, skill_kick, TRUE,
0, {}, {0}, {0,0,0,0,0}, 0, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 15, SKILL_IMM, 5*PULSE_SECOND,
"kick", "!error!", "", "", "", "", "" },
{ "sweep", "", &gsn_sweep, skill_sweep, TRUE,
0, {"kick"}, {0}, {0,0,0,15,0}, 10000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 12, SKILL_IMM, 3*PULSE_SECOND,
"sweep", "!error!", "", "", "", "", "" },
{ "throat shot", "", &gsn_throat_shot, skill_throat_shot, TRUE,
0, {"hand to hand"}, {5}, {0,0,0,0,0}, 50000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 12, SKILL_IMM, 4*PULSE_SECOND,
"throat shot", "!error!", "", "", "", "", "" },
{ "knee", "", &gsn_knee, skill_knee, TRUE,
0, {"kick", "sweep"}, {3,3}, {15,0,0,20,0}, 20000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 12, SKILL_IMM, 5*PULSE_SECOND,
"knee", "!error!", "", "", "", "", "" },
{ "elbow", "", &gsn_elbow, skill_elbow, TRUE,
0, {"hand to hand"}, {4}, {20,0,0,20,0}, 20000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 9, SKILL_IMM, 2*PULSE_SECOND,
"elbow", "!error!", "", "", "", "", "" },
{ "eye gouge", "", &gsn_eye_gouge, skill_eye_gouge, TRUE,
0, {"hand to hand"}, {4}, {0,0,0,0,20}, 25000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 10, SKILL_IMM, 5*PULSE_SECOND,
"eye gouge", "Your eyes no longer hurt, and you can see!", "", "", "", "", "" },
{ "heart shot", "", &gsn_heart_shot, skill_heart_shot, TRUE,
0, {"hand to hand"}, {5}, {20,0,0,0,0}, 50000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 24, SKILL_IMM, 5*PULSE_SECOND,
"heart shot", "!error!", "", "", "", "", "" },
/* DBZ abilites */
// HACK:
// Kamehameha must be the first ki skill in the table, and all the ki skills
// must come at the end of the table! Search for FIRST_KI_SN for references.
// Basically, FIRST_KI_SN lets us determine which skills
// are ki skills or not (every sn >= FIRST_KI_SN is a ki skill) (FIRST_KI_SN = gsn_kamehameha)
{ "kamehameha", "", &gsn_kamehameha, skill_kamehameha, TRUE,
0, {"energy beam"}, {3}, {0,0,15,0,0}, 2000000, {"human", "saiya-jin", "bio-android", "half-breed"},
TAR_HYBRID6, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"blast", "!error!", "", "You place your palms together and begin to create a ball of energy.", "$n places $s palms together and begins to create a ball of energy.", "You release a massive energy beam!", "$n releases a massive energy beam!" },
{ "scattershot", "", &gsn_scattershot, skill_scattershot, TRUE,
0, {"energy ball"}, {3}, {0,0,15,0,20}, 500000, {"namek", "bio-android", "android", "human", "saiya-jin", "half-breed"},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 4, SKILL_DELAY, 8*PULSE_SECOND,
"ball", "!error!", "", "You concentrate and point your fingers at your target.", "$n concentrates and points $s fingers at $s target.", "You release a stream of energy balls!", "$n releases a stream of energy balls!" },
{ "timestop", "", &gsn_timestop, skill_timestop, TRUE,
0, {}, {0}, {0,0,0,0,0}, 50000000000000, {},
TAR_AREA_OFF, POS_FIGHTING, 2, SKILL_CHARGE, 20*PULSE_SECOND,
"!error!", "!error!", "", "You concentrate.", "$n concentrates.", "You finish and time seems to s l ow d o w n.", "$n finishes and time seems to s l ow d o w n." },
{ "energy ball", "ball", &gsn_energy_ball, skill_energy_ball, TRUE,
0, {}, {0}, {0,0,0,0,0}, 5000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 3, SKILL_CHARGE, 6*PULSE_SECOND,
"energy ball", "!error!", "", "Placing your palms together, you begin to generate a small ball of energy.", "Placing $s palms together, $n begin to generate a small ball of energy.", "You throw a small ball of energy!", "$n throws a small ball of energy!" },
{ "energy beam", "beam", &gsn_energy_beam, skill_energy_beam, TRUE,
0, {}, {0}, {0,0,0,0,0}, 5000, {},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 3, SKILL_CHARGE, 6*PULSE_SECOND,
"energy beam", "!error!", "", "A point of light begins to grow between your palms.", "A point of light begins grow between $n's palms.", "You release a beam of energy!", "$n releases a beam of energy!" },
{ "final flash", "", &gsn_finalflash, skill_finalflash, TRUE,
0, {"energy beam"}, {7}, {0,0,25,0,30}, 50000000, {"android", "saiya-jin", "half-breed"},
TAR_HYBRID6, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"final flash", "!error!", "", "You stretch your arms out and build up energy in either palm.", "$n stretches $s arms out and builds up energy in either palm.", "With an amazing flash, you throw your arms forward and release!", "With an amazing flash, $n throws $s arms forward and releases!" },
{ "special beam cannon", "sbc", &gsn_specialbeam, skill_specialbeam, TRUE,
0, {"energy beam"}, {4}, {0,0,15,0,0}, 2000000, {"namek", "bio-android"},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"special beam", "!error!", "", "You concentrate and point your fingers at your target.", "$n concentrates and points $s fingers at $s target.", "A yellow beam, rotating around a thin ray, ignites from your fingers!", "A green beam, rotating around a thin ray, ignites from $n's fingers!" },
{ "solar flare", "", &gsn_solarflare, skill_solarflare, TRUE,
0, {"energy ball", "energy beam"}, {3,3}, {0,0,15,0,15}, 250000, {"human", "namek", "saiya-jin", "half-breed", "bio-android"},
TAR_AREA_OFF, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"!error!", "The blinding light resides, and you can once again see.", "", "You create a bright light.", "$n creates a bright light.", "A blinding light erupts from you!", "A blinding light erupts from $n!" },
{ "destructo disk", "", &gsn_destructo_disk, skill_destructo_disk, TRUE,
0, {"energy ball"}, {5}, {0,0,15,0,20}, 4000000, {"human", "bio-android", "icer"},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"destructo disk", "!error!", "", "Placing your hands at your sides, energy begins to build in your palms.", "Placing $s hands at $s sides, energy begins to build in $n's palms.", "You launch your destructo disk spinning towards your foe!", "$n launches $s destructo disk spinning towards $s foe!" },
{ "masenko", "", &gsn_masenko, skill_masenko, TRUE,
0, {"energy beam"}, {7}, {0,0,25,0,0}, 250000000, {"namek"},
TAR_HYBRID6, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"energy ball", "!error!", "", "With your hands behind your head, you begin to weave a ball of energy into existence.", "With $s hands behind $s head, $n begins to weave a ball of energy into existence.", "You throw your ball of energy forward, sending it exploding in a giant splash!", "$n throws $s ball of energy forward, sending it exploding in a giant splash!" },
{ "eye beam", "eyebeam", &gsn_eyebeam, skill_eyebeam, TRUE,
0, {"energy beam"}, {2}, {0,0,0,0,0}, 100000, {"namek", "icer"},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"eye beam", "!error!", "", "You stare at your target.", "$n begins to stare at $s target.", "A beam erupts from your eyes!", "A beam erupts from $n's eyes!" },
{ "mouth beam", "", &gsn_mouthbeam, skill_mouthbeam, TRUE,
0, {"energy beam"}, {3}, {0,0,0,0,0}, 500000, {"majin", "namek"},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 3, SKILL_CHARGE, 10*PULSE_SECOND,
"mouth beam", "!error!", "", "Your mouth slowly opens.", "$n's mouth slowly opens.", "A beam erupts from your mouth!", "A beam erupts from $n's mouth!"},
{ "finger beam", "", &gsn_fingerbeam, skill_fingerbeam, TRUE,
0, {"energy beam"}, {4}, {0,0,20,0,0}, 1000000, {"icer", "bio-android"},
TAR_CHAR_OFFENSIVE, POS_FIGHTING, 3, SKILL_CHARGE, 20*PULSE_SECOND,
"finger beam", "!error!", "", "You point at your target.", "$n points at $s target.", "A beam erupts from your finger!", "A beam erupts from $n's finger!" },
{ "spirit bomb", "", &gsn_spirit_bomb, skill_spirit_bomb, TRUE,
0, {"energy ball", "kamehameha"}, {6,3}, {0,0,0,0,100}, 20000000, {"saiya-jin", "human", "half-breed"},
TAR_AREA_OFF, POS_FIGHTING, 1, SKILL_CHARGE, 120*PULSE_SECOND,
"spirit bomb", "!error!", "", "You begin to charge an enormous ball of energy.", "$n begins to charge an enormous ball of energy.", "You release a massive ball of energy!", "$n relases a massive ball of energy!" },
{ "power bomb", "powerbomb", &gsn_power_bomb, skill_power_bomb, TRUE,
0, {}, {0}, {0,0,0,0,0}, 500000000, {"majin"},
TAR_AREA_OFF, POS_FIGHTING, 2, SKILL_CHARGE, 40*PULSE_SECOND,
"power bomb", "!error!", "", "You begin to charge an enormous ball of energy.", "$n begins to charge an enormous ball of energy.", "You release a massive ball of energy!", "$n relases a massive ball of energy!" },
{ "death ball", "", &gsn_death_ball, skill_death_ball, TRUE,
0, {"finger beam"}, {5}, {0,0,0,0,0}, 500000000, {"icer"},
TAR_AREA_OFF, POS_FIGHTING, 1, SKILL_CHARGE, 120*PULSE_SECOND,
"death ball", "!error!", "", "You point your finger out, creating a swirling red ball of energy at the tip.", "$n points $s finger out, creating a swirling red ball of energy at the tip.", "With a flick of the finger, you throw your planet-sized ball of coalescing, red energy!", "With a flick of the finger, $n throws $s planet-sized ball of coalescing, red energy!" },
{ "heal", "", &gsn_heal, skill_heal, TRUE,
0, {}, {}, {0,0,0,0,0}, 25000000, {"namek"},
TAR_CHAR_DEFENSIVE, POS_FIGHTING, 4, SKILL_CHARGE, 10*PULSE_SECOND,
"!error!", "!error!", "", "You begin to utter some words.", "$n begins to utters some words.", "You finish your littany!", "$n finishes $s littany!" },
{ "revive", "", &gsn_revive, skill_revive, TRUE,
0, {}, {}, {0,0,0,0,0}, 500000000, {"namek"},
TAR_CHAR_DEFENSIVE, POS_FIGHTING, 4, SKILL_DELAY, 25*PULSE_SECOND,
"!error!", "!error!", "", "You begin to shout some words.", "$n begins to shout some words.", "You finish your shout!", "$n finishes $s shout!" },
{ "regeneration", "", &gsn_regen, skill_regen, TRUE,
0, {}, {}, {0,0,0,0,0}, 500000000, {"namek"},
TAR_CHAR_DEFENSIVE, POS_FIGHTING, 4, SKILL_DELAY, 40*PULSE_SECOND,
"!error!", "Your stamina suddenly weakens.", "", "You begin to utter some words.", "$n begins to utters some words.", "You finish your littany!", "$n finishes $s littany!" }
};