truth commandsystem::GoDown(character* Char) { if(!Char->TryToUnStickTraps(ZERO_V2)) return false; /*if(!game::IsInWilderness() && game::WizardModeIsActive() && game::GetCurrentLevelIndex() < game::GetLevels() - 1) if(game::TryTravel(game::GetCurrentDungeonIndex(), game::GetCurrentLevelIndex() + 1, RANDOM, true)) return true;*/ oterrain* Terrain = Char->GetSquareUnder()->GetOTerrain(); if(!Terrain) { if(game::IsInWilderness()) ADD_MESSAGE("There seems to be nothing of interest here."); else ADD_MESSAGE("You can't go down."); return false; } if(Terrain->Enter(false)) { Char->EditExperience(AGILITY, 150, 1 << 6); Char->EditNP(-10); Char->EditAP(-100000 / APBonus(Char->GetAttribute(AGILITY))); return true; } else return false; }
truth commandsystem::Zap(character* Char) { if(!Char->CheckZap()) return false; if(!Char->PossessesItem(&item::IsZappable)) { ADD_MESSAGE("You have nothing to zap with, %s.", game::Insult()); return false; } item* Item = Char->SelectFromPossessions(CONST_S("What do you want to zap with?"), &item::IsZappable); if(Item) { int Answer = game::DirectionQuestion(CONST_S("In what direction do you wish to zap? " "[press a direction key or '.']"), false, true); if(Answer == DIR_ERROR) return false; if(Item->Zap(Char, Char->GetPos(), Answer)) { Char->EditAP(-100000 / APBonus(Char->GetAttribute(PERCEPTION))); return true; } else return false; } else return false; }
truth commandsystem::Kick(character* Char) { /** No multi-tile support */ if(!Char->CheckKick()) return false; if(Char->GetBurdenState() == OVER_LOADED) { ADD_MESSAGE("You try to kick, but you collapse under your load."); Char->EditAP(-100000 / APBonus(Char->GetAttribute(AGILITY))); return true; } int Dir = game::DirectionQuestion(CONST_S("In what direction do you wish to kick? [press a direction key]"), false); if(Dir == DIR_ERROR || !Char->GetArea()->IsValidPos(Char->GetPos() + game::GetMoveVector(Dir))) return false; lsquare* Square = Char->GetNearLSquare(Char->GetPos() + game::GetMoveVector(Dir)); if(!Square->CheckKick(Char)) return false; character* Enemy = Square->GetCharacter(); if(Enemy && !(Enemy->IsMasochist() && Char->GetRelation(Enemy) == FRIEND) && Char->GetRelation(Enemy) != HOSTILE && !game::TruthQuestion(CONST_S("This might cause a hostile reaction. Are you sure? [y/N]"))) return false; /*if(Square->GetCharacter() && Char->GetRelation(Square->GetCharacter()) != HOSTILE) if(!game::TruthQuestion(CONST_S("This might cause a hostile reaction. Are you sure? [y/N]"))) return false; else */ Char->Hostility(Square->GetCharacter()); Char->Kick(Square, Dir); return true; }
truth commandsystem::GoUp(character* Char) { if(!Char->TryToUnStickTraps(ZERO_V2)) return false; /*if(!game::IsInWilderness() && game::WizardModeIsActive() && game::GetCurrentLevelIndex() >= 1) if(game::TryTravel(game::GetCurrentDungeonIndex(), game::GetCurrentLevelIndex() - 1, RANDOM, true)) return true;*/ oterrain* Terrain = Char->GetSquareUnder()->GetOTerrain(); if(!Terrain) { if(game::IsInWilderness()) { if(!Char->IsFlying()) ADD_MESSAGE("You jump into the air. For some reason you don't get too far above."); else ADD_MESSAGE("You fly around for some time."); } else ADD_MESSAGE("You can't go up."); return false; } if(Terrain->Enter(true)) { Char->EditExperience(LEG_STRENGTH, 150, 1 << 6); Char->EditNP(-20); Char->EditAP(-100000 / APBonus(Char->GetAttribute(AGILITY))); return true; } else return false; }
void dig::Handle() { character* Actor = GetActor(); item* Digger = Actor->GetMainWielded(); if(!Digger) { Terminate(false); return; } lsquare* Square = Actor->GetNearLSquare(SquareDug); olterrain* Terrain = Square->GetOLTerrain(); if(!Terrain || !Terrain->CanBeDestroyed() || !Terrain->GetMainMaterial()->CanBeDug(Digger->GetMainMaterial())) { Terminate(false); return; } int Damage = Actor->GetAttribute(ARM_STRENGTH) * Digger->GetMainMaterial()->GetStrengthValue() / 500; Terrain->EditHP(-Max(Damage, 1)); Actor->EditExperience(ARM_STRENGTH, 200, 1 << 5); Actor->EditAP(-200000 / APBonus(Actor->GetAttribute(DEXTERITY))); Actor->EditNP(-500); if(Terrain->GetHP() <= 0) { if(Square->CanBeSeenByPlayer()) ADD_MESSAGE("%s", Terrain->GetDigMessage().CStr()); Terrain->Break(); /* If the door was boobytrapped etc. and the character is dead, Action has already been deleted */ if(!Actor->IsEnabled()) return; if(MoveDigger && Actor->GetMainWielded()) Actor->GetMainWielded()->MoveTo(Actor->GetStack()); item* RightBackup = game::SearchItem(RightBackupID); if(RightBackup && RightBackup->Exists() && Actor->IsOver(RightBackup)) { RightBackup->RemoveFromSlot(); Actor->SetRightWielded(RightBackup); } item* LeftBackup = game::SearchItem(LeftBackupID); if(LeftBackup && LeftBackup->Exists() && Actor->IsOver(LeftBackup)) { LeftBackup->RemoveFromSlot(); Actor->SetLeftWielded(LeftBackup); } Terminate(true); } else game::DrawEverything(); }