void If::doSemanticCheck() { Node* condition = children_[0]; Node* thenClause = children_[1]; Node* elseClause = children_[2]; // The resulting type is Void type_ = Void::get(context_->evalMode()); // Semantic check the condition condition->semanticCheck(); // Check that the type of the condition is 'Testable' if ( !isTestable(condition) ) REP_ERROR(condition->location(), "The condition of the if is not Testable"); // Dereference the condition as much as possible while ( condition->type() && condition->type()->noReferences() > 0 ) { condition = mkMemLoad(condition->location(), condition); condition->setContext(childrenContext()); condition->semanticCheck(); } children_[0] = condition; // TODO (if): Remove this dereference from here if ( nodeEvalMode(this) == modeCt ) { if ( !isCt(condition) ) REP_ERROR(condition->location(), "The condition of the ct if should be available at compile-time (%1%)") % condition->type(); // Get the CT value from the condition, and select an active branch Node* c = theCompiler().ctEval(condition); Node* selectedBranch = getBoolCtValue(c) ? thenClause : elseClause; // Expand only the selected branch if ( selectedBranch ) setExplanation(selectedBranch); else setExplanation(mkNop(location_)); return; } // Semantic check the clauses if ( thenClause ) thenClause->semanticCheck(); if ( elseClause ) elseClause->semanticCheck(); }
int Player::displayCreature(Creature* target) { int percent=0, align=0, rank=0, chance=0, flags = displayFlags(); Player *pTarget = target->getAsPlayer(); Monster *mTarget = target->getAsMonster(); std::ostringstream oStr; bstring str = ""; bool space=false; if(mTarget) { oStr << "You see " << mTarget->getCrtStr(this, flags, 1) << ".\n"; if(mTarget->getDescription() != "") oStr << mTarget->getDescription() << "\n"; else oStr << "There is nothing special about " << mTarget->getCrtStr(this, flags, 0) << ".\n"; if(mTarget->getMobTrade()) { rank = mTarget->getSkillLevel()/10; oStr << "^y" << mTarget->getCrtStr(this, flags | CAP, 0) << " is a " << get_trade_string(mTarget->getMobTrade()) << ". " << mTarget->upHisHer() << " skill level: " << get_skill_string(rank) << ".^x\n"; } } else if(pTarget) { oStr << "You see " << pTarget->fullName() << " the " << gConfig->getRace(pTarget->getDisplayRace())->getAdjective(); // will they see through the illusion? if(willIgnoreIllusion() && pTarget->getDisplayRace() != pTarget->getRace()) oStr << " (" << gConfig->getRace(pTarget->getRace())->getAdjective() << ")"; oStr << " " << pTarget->getTitle() << ".\n"; if(gConfig->getCalendar()->isBirthday(pTarget)) { oStr << "^yToday is " << pTarget->getCName() << "'s birthday! " << pTarget->upHeShe() << " is " << pTarget->getAge() << " years old.^x\n"; } if(pTarget->description != "") oStr << pTarget->description << "\n"; } if(target->isEffected("vampirism")) { chance = intelligence.getCur()/10 + piety.getCur()/10; // vampires and werewolves can sense each other if(isEffected("vampirism") || isEffected("lycanthropy")) chance = 101; if(chance > mrand(0,100)) { switch(mrand(1,4)) { case 1: oStr << target->upHeShe() << " looks awfully pale.\n"; break; case 2: oStr << target->upHeShe() << " has an unearthly presence.\n"; break; case 3: oStr << target->upHeShe() << " has hypnotic eyes.\n"; break; default: oStr << target->upHeShe() << " looks rather pale.\n"; } } } if(target->isEffected("lycanthropy")) { chance = intelligence.getCur()/10 + piety.getCur()/10; // vampires and werewolves can sense each other if(isEffected("vampirism") || isEffected("lycanthropy")) chance = 101; if(chance > mrand(0,100)) { switch(mrand(1,3)) { case 1: oStr << target->upHeShe() << " looks awfully shaggy.\n"; break; case 2: oStr << target->upHeShe() << " has a feral presence.\n"; break; default: oStr << target->upHeShe() << " looks rather shaggy.\n"; } } } if(target->isEffected("slow")) oStr << target->upHeShe() << " is moving very slowly.\n"; else if(target->isEffected("haste")) oStr << target->upHeShe() << " is moving unnaturally quick.\n"; if((cClass == CreatureClass::CLERIC && deity == JAKAR && level >=7) || isCt()) oStr << "^y" << target->getCrtStr(this, flags | CAP, 0 ) << " is carrying " << target->coins[GOLD] << " gold coin" << (target->coins[GOLD] != 1 ? "s" : "") << ".^x\n"; if(isEffected("know-aura") || cClass==CreatureClass::PALADIN) { space = true; oStr << target->getCrtStr(this, flags | CAP, 0) << " "; align = target->getAdjustedAlignment(); switch(align) { case BLOODRED: oStr << "has a blood red aura."; break; case REDDISH: oStr << "has a reddish aura."; break; case PINKISH: oStr << "has a pinkish aura."; break; case NEUTRAL: oStr << "has a grey aura."; break; case LIGHTBLUE: oStr << "has a light blue aura."; break; case BLUISH: oStr << "has a bluish aura."; break; case ROYALBLUE: oStr << "has a royal blue aura."; break; default: oStr << "has a grey aura."; break; } } if(mTarget && mTarget->getRace()) { if(space) oStr << " "; space = true; oStr << mTarget->upHeShe() << " is ^W" << gConfig->getRace(mTarget->getRace())->getAdjective().toLower() << "^x."; } if(target->getSize() != NO_SIZE) { if(space) oStr << " "; space = true; oStr << target->upHeShe() << " is ^W" << getSizeName(target->getSize()) << "^x."; } if(space) oStr << "\n"; if(target->hp.getCur() > 0 && target->hp.getMax()) percent = (100 * (target->hp.getCur())) / (target->hp.getMax()); else percent = -1; if(!(mTarget && mTarget->flagIsSet(M_UNKILLABLE))) { oStr << target->upHeShe(); if(percent >= 100 || !target->hp.getMax()) oStr << " is in excellent condition.\n"; else if(percent >= 90) oStr << " has a few scratches.\n"; else if(percent >= 75) oStr << " has some small wounds and bruises.\n"; else if(percent >= 60) oStr << " is wincing in pain.\n"; else if(percent >= 35) oStr << " has quite a few wounds.\n"; else if(percent >= 20) oStr << " has some big nasty wounds and scratches.\n"; else if(percent >= 10) oStr << " is bleeding awfully from big wounds.\n"; else if(percent >= 5) oStr << " is barely clinging to life.\n"; else if(percent >= 0) oStr << " is nearly dead.\n"; } if(pTarget) { if(pTarget->isEffected("mist")) { oStr << pTarget->upHeShe() << "%s is currently in mist form.\n"; printColor("%s", oStr.str().c_str()); return(0); } if(pTarget->flagIsSet(P_UNCONSCIOUS)) oStr << pTarget->getName() << " is " << (pTarget->flagIsSet(P_SLEEPING) ? "sleeping" : "unconscious") << ".\n"; if(pTarget->isEffected("petrification")) oStr << pTarget->getName() << " is petrified.\n"; if(pTarget->isBraindead()) oStr << pTarget->getName() << "%M is currently brain dead.\n"; } else { if(mTarget->isEnemy(this)) oStr << mTarget->upHeShe() << " looks very angry at you.\n"; else if(mTarget->getPrimeFaction() != "") oStr << mTarget->upHeShe() << " " << getFactionMessage(mTarget->getPrimeFaction()) << ".\n"; Creature* firstEnm = nullptr; if((firstEnm = mTarget->getTarget(false)) != nullptr) { if(firstEnm == this) { if( !mTarget->flagIsSet(M_HIDDEN) && !(mTarget->isInvisible() && isEffected("detect-invisible"))) oStr << mTarget->upHeShe() << " is attacking you.\n"; } else oStr << mTarget->upHeShe() << " is attacking " << firstEnm->getName() << ".\n"; /// print all the enemies if a CT or DM is looking if(isCt()) oStr << mTarget->threatTable; } oStr << consider(mTarget); // pet code if(mTarget->isPet() && mTarget->getMaster() == this) { str = mTarget->listObjects(this, true); oStr << mTarget->upHeShe() << " "; if(str == "") oStr << "isn't holding anything.\n"; else oStr << "is carrying: " << str << ".\n"; } } printColor("%s", oStr.str().c_str()); target->printEquipList(this); return(0); }