just wanted to drop my stance code to the list..had to condense it a bit to meet the 200 line quota, but it should still be legible..any comments? suggestions? siv /* File: stance.c * * Usage: stances and utils.. */ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #define MAX_STANCE_AFF 4 #define STANCE_NAME_LENGTH 15 struct stance_aff { int location; int amount; }; struct { char name[STANCE_NAME_LENGTH]; int skill; struct stance_aff affs[MAX_STANCE_AFF]; } stances[] = { { "normal", -1, {{APPLY_NONE, -1}, {APPLY_NONE, -1}, {APPLY_NONE, -1}, {APPLY_NONE, -1}}}, { "bull", STANCE_BULL, {{APPLY_AC, -30}, {APPLY_HITROLL, 3}, {APPLY_DAMROLL, -3}, {APPLY_NONE, -1}}}, { "viper", STANCE_VIPER, {{APPLY_HITROLL, 4}, {APPLY_DAMROLL, 4}, {APPLY_AC, 40}, {APPLY_NONE, -1}}}, { "monkey", STANCE_MONKEY, {{APPLY_AC, -30}, {APPLY_DEX, 1}, {APPLY_NONE,-1}, {APPLY_NONE,-1}}}, { "drunk", STANCE_DRUNK, {{APPLY_CON, 1}, {APPLY_STR, 1}, {APPLY_NONE,-1}, {APPLY_NONE, -1}}}, { "\n", -1, {{-1,-1},{-1,-1},{-1,-1},{-1,-1}}} }; int find_stance(char *name) { int index = -1, ok; char *temp, *temp2; char first[256], first2[256]; while (*stances[++index].name != '\n') { if (is_abbrev(name, stances[index].name)) return index; ok = 1; temp = any_one_arg(stances[index].name, first); temp2 = any_one_arg(name, first2); while (*first && *first2 && ok) { if (!is_abbrev(first2, first)) ok = 0; temp = any_one_arg(temp, first); temp2 = any_one_arg(temp2, first2); } if (ok && !*first2) return index; } return -1; } void perform_stance_message(struct char_data *ch) { char *message[][2] = { {"$n relaxes into the normal fighting stance.", "You relax into the normal fighting stance."}, {"$n crouches low into the bull fighting stance.", "You crouch low into the bull fighting stance."}, {"$n rises into the viper fighting stance.", "You rise into the viper fighting stance."}, {"$n begins using the monkey fighting stance.", "You begin using the monkey fighting stance."}, {"$n staggers into the drunken fighting stance.", "You stagger into the drunken fighting stance."} }; act(message[(int) (GET_STANCE(ch))][0], TRUE, ch, 0, 0, TO_ROOM); send_to_char(message[(int) GET_STANCE(ch)][1], ch); } void stance_affect(struct char_data *ch, int loc, int mod, bool add) { int maxabil = (IS_NPC(ch) ? 25 : 18); if (!add) mod = -mod; switch (loc) { case APPLY_NONE: break; case APPLY_STR: GET_STR(ch) += mod; break; case APPLY_DEX: GET_DEX(ch) += mod; break; case APPLY_INT: GET_INT(ch) += mod; break; case APPLY_WIS: GET_WIS(ch) += mod; break; case APPLY_CON: GET_CON(ch) += mod; break; case APPLY_CHA: GET_CHA(ch) += mod; break; case APPLY_AGE: ch->player.time.birth -= (mod * SECS_PER_MUD_YEAR); break; case APPLY_CHAR_WEIGHT: GET_WEIGHT(ch) += mod; break; case APPLY_CHAR_HEIGHT: GET_HEIGHT(ch) += mod; break; case APPLY_MANA: GET_MAX_MANA(ch) += mod; break; case APPLY_HIT: GET_MAX_HIT(ch) += mod; break; case APPLY_MOVE: GET_MAX_MOVE(ch) += mod; break; case APPLY_AC: GET_AC(ch) += mod; break; case APPLY_HITROLL: GET_HITROLL(ch) += mod; break; case APPLY_DAMROLL: GET_DAMROLL(ch) += mod; break; case APPLY_SAVING_PARA: GET_SAVE(ch, SAVING_PARA) += mod; break; case APPLY_SAVING_ROD: GET_SAVE(ch, SAVING_ROD) += mod; break; case APPLY_SAVING_PETRI: GET_SAVE(ch, SAVING_PETRI) += mod; break; case APPLY_SAVING_BREATH: GET_SAVE(ch, SAVING_BREATH) += mod; break; case APPLY_SAVING_SPELL: GET_SAVE(ch, SAVING_SPELL) += mod; break; default: log("SYSERR: Unknown apply adjust attempt (stance_affect)."); break; } /* switch */ } ACMD(do_stance) { int stance, skill, i; if (!*arg) { send_to_char("You must specify a stance to switch to.\r\n", ch); return; } stance = find_stance(argument); if ((stance < 0) || (stance >= NUM_STANCES)) { send_to_char("What stance is THAT??\r\n", ch); return; } if (stance == GET_STANCE(ch)) { send_to_char("You are already using that stance.\r\n", ch); return; } skill = stances[stance].skill; if ((skill > 1) && !GET_SKILL(ch, skill)) { send_to_char("You don't know how to use that stance.\r\n", ch); return; } for (i = 0; i < MAX_STANCE_AFF; i++) stance_affect(ch, stances[(int)GET_STANCE(ch)].affs[i].location, stances[(int)GET_STANCE(ch)].affs[i].amount, FALSE); GET_STANCE(ch) = stance; for (i = 0; i < MAX_STANCE_AFF; i++) stance_affect(ch, stances[(int)GET_STANCE(ch)].affs[i].location, stances[(int)GET_STANCE(ch)].affs[i].amount, FALSE); affect_total(ch); perform_stance_message(ch); return; } +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST