/*
* special1.cpp
* Special routines.
* ____ _
* | _ \ ___ __ _| |_ __ ___ ___
* | |_) / _ \/ _` | | '_ ` _ \/ __|
* | _ < __/ (_| | | | | | | \__ \
* |_| \_\___|\__,_|_|_| |_| |_|___/
*
* Permission to use, modify and distribute is granted via the
* Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
* http://creativecommons.org/licenses/by-nc-sa/3.0/
*
* Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell
* Contributions by Tim Callahan, Jonathan Hseu
* Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
*
*/
#include "mud.h"
//*********************************************************************
// doSpecial
//*********************************************************************
int Object::doSpecial(Player* player) {
BaseRoom* room = player->getRoomParent();
Socket* sock = player->getSock();
char str[80], str2[160];
unsigned int i=0;
switch(special) {
case SP_MAPSC:
strcpy(str, getCName());
for(i=0; i<strlen(str); i++)
if(str[i] == ' ')
str[i] = '_';
sprintf(str2, "%s/%s.txt", Path::Sign, str);
if(flagIsSet(O_LOGIN_FILE))
viewLoginFile(player->getSock(), str2);
else
viewFile(player->getSock(), str2);
break;
case SP_COMBO:
char str[80];
int dmg, i;
str[0] = damage.getSides()+'0';
str[1] = 0;
if(damage.getNumber() == 1 || strlen(sock->tempstr[3]) > 70)
strcpy(sock->tempstr[3], str);
else
strcat(sock->tempstr[3], str);
player->print("Click.\n");
if(player->getName() == "Bane")
player->print("Combo so far: %s\n", sock->tempstr[3]);
broadcast(sock, room, "%M presses %P^x.", player, this);
if(strlen(sock->tempstr[3]) >= strlen(use_output)) {
if(strcmp(sock->tempstr[3], use_output)) {
dmg = mrand(20,40 + player->getLevel());
player->hp.decrease(dmg);
player->printColor("You were zapped for %s%d^x damage!\n", player->customColorize("*CC:DAMAGE*").c_str(), dmg);
broadcast(sock, room, "%M was zapped by %P^x!", player, this);
sock->tempstr[3][0] = 0;
if(player->hp.getCur() < 1) {
player->print("You died.\n");
player->die(ZAPPED);
}
} else {
Exit* toOpen = 0;
i = 1;
for(Exit* ext : room->exits) {
if(i++ >= damage.getPlus())
toOpen = ext;
}
// for(i=1, xp = room->first_ext;
// xp && i < damage.getPlus();
// i++, xp = xp->next_tag)
// ;
if(!toOpen)
return(0);
player->statistics.combo();
player->print("You opened the %s!\n", toOpen->getCName());
broadcast(player->getSock(), player->getParent(),
"%M opened the %s!", player, toOpen->getCName());
toOpen->clearFlag(X_LOCKED);
toOpen->clearFlag(X_CLOSED);
toOpen->ltime.ltime = time(0);
}
}
break;
default:
player->print("Nothing.\n");
break;
}
return(0);
}