3 * Iter Vehemens ad Necem (IVAN)
4 * Copyright (C) Timo Kiviluoto
5 * Released under the GNU General
8 * See LICENSING which should be included
9 * along with this file for more details
26 dungeon::dungeon(int Index
) : Index(Index
) {
28 for (int c
= 0; c
< GetLevels(); ++c
) Generated
[c
] = false;
32 dungeon::~dungeon () {
33 for (int c
= 0; c
< GetLevels(); ++c
) delete Level
[c
];
39 void dungeon::Initialize () {
40 std::map
<int, dungeonscript
>::const_iterator DungeonIterator
= game::GetGameScript()->GetDungeon().find(Index
);
41 if (DungeonIterator
!= game::GetGameScript()->GetDungeon().end()) {
42 DungeonScript
= &DungeonIterator
->second
;
44 ABORT("Unknown dungeon #%d requested!", int(Index
));
47 Level
= new level
*[GetLevels()];
48 Generated
= new truth
[GetLevels()];
49 for (int c
= 0; c
< GetLevels(); ++c
) Level
[c
] = 0;
53 const levelscript
*dungeon::GetLevelScript (int I
) {
54 std::map
<int, levelscript
>::const_iterator LevelIterator
= DungeonScript
->GetLevel().find(I
);
55 const levelscript
*LevelScript
;
56 if (LevelIterator
!= DungeonScript
->GetLevel().end()) LevelScript
= &LevelIterator
->second
;
57 else LevelScript
= DungeonScript
->GetLevelDefault();
62 /* Returns whether the level has been visited before */
63 truth
dungeon::PrepareLevel (int Index
, truth Visual
) {
64 if (Generated
[Index
]) {
65 level
*NewLevel
= LoadLevel(game::SaveName(), Index
);
66 game::SetCurrentArea(NewLevel
);
67 game::SetCurrentLevel(NewLevel
);
68 game::SetCurrentLSquareMap(NewLevel
->GetMap());
71 level
*NewLevel
= Level
[Index
] = new level
;
72 NewLevel
->SetDungeon(this);
73 NewLevel
->SetIndex(Index
);
74 const levelscript
*LevelScript
= GetLevelScript(Index
);
75 NewLevel
->SetLevelScript(LevelScript
);
77 if (LevelScript
->GetEnterImage()) {
78 cbitmap
*EnterImage
= new bitmap(game::GetGameDir() + "Graphics/" + *LevelScript
->GetEnterImage());
79 game::SetEnterImage(EnterImage
);
80 v2 Displacement
= *LevelScript
->GetEnterTextDisplacement();
81 game::SetEnterTextDisplacement(Displacement
);
82 game::TextScreen(CONST_S("Entering ")+GetLevelDescription(Index
)+CONST_S("...\n\nThis may take some time, please wait."), Displacement
, WHITE
, false, true, &game::BusyAnimation
);
83 game::TextScreen(CONST_S("Entering ")+GetLevelDescription(Index
)+CONST_S("...\n\nPress any key to continue."), Displacement
, WHITE
, true, false, &game::BusyAnimation
);
84 game::SetEnterImage(0);
87 game::TextScreen(CONST_S("Entering ")+GetLevelDescription(Index
)+CONST_S("...\n\nThis may take some time, please wait."), ZERO_V2
, WHITE
, false, true, &game::BusyAnimation
);
90 NewLevel
->Generate(Index
);
91 game::SetCurrentLSquareMap(NewLevel
->GetMap());
92 Generated
[Index
] = true;
93 game::BusyAnimation();
94 if (*NewLevel
->GetLevelScript()->GenerateMonsters()) NewLevel
->GenerateNewMonsters(NewLevel
->GetIdealPopulation(), false);
99 void dungeon::SaveLevel (cfestring
&SaveName
, int Number
, truth DeleteAfterwards
) {
100 outputfile
SaveFile(SaveName
+'.'+Index
+Number
);
101 SaveFile
<< Level
[Number
];
102 if (DeleteAfterwards
) {
103 delete Level
[Number
];
109 level
*dungeon::LoadLevel(cfestring
&SaveName
, int Number
) {
110 inputfile
SaveFile(SaveName
+'.'+Index
+Number
);
111 return LoadLevel(SaveFile
, Number
);
115 void dungeon::Save (outputfile
&SaveFile
) const {
116 SaveFile
<< Index
<< WorldMapPos
;
117 for (int c
= 0; c
< GetLevels(); ++c
) SaveFile
<< Generated
[c
];
121 void dungeon::Load (inputfile
&SaveFile
) {
122 SaveFile
>> Index
>> WorldMapPos
;
124 for (int c
= 0; c
< GetLevels(); ++c
) SaveFile
>> Generated
[c
];
128 int dungeon::GetLevels () const {
129 return *DungeonScript
->GetLevels();
133 festring
dungeon::GetLevelDescription (int I
) {
134 if (GetLevel(I
)->GetLevelScript()->GetDescription()) return *GetLevel(I
)->GetLevelScript()->GetDescription();
135 return *DungeonScript
->GetDescription()+" level "+(I
+1);
139 festring
dungeon::GetShortLevelDescription (int I
) {
140 if (GetLevel(I
)->GetLevelScript()->GetShortDescription()) return *GetLevel(I
)->GetLevelScript()->GetShortDescription();
141 return *DungeonScript
->GetShortDescription()+" level "+(I
+1);
145 outputfile
&operator << (outputfile
&SaveFile
, const dungeon
*Dungeon
) {
148 Dungeon
->Save(SaveFile
);
156 inputfile
&operator >> (inputfile
&SaveFile
, dungeon
*&Dungeon
) {
157 if (SaveFile
.Get()) {
158 Dungeon
= new dungeon
;
159 Dungeon
->Load(SaveFile
);
165 level
*dungeon::LoadLevel(inputfile
&SaveFile
, int Number
) {
166 SaveFile
>> Level
[Number
];
167 Level
[Number
]->SetDungeon(this);
168 Level
[Number
]->SetIndex(Number
);
169 Level
[Number
]->SetLevelScript(GetLevelScript(Number
));
170 return Level
[Number
];
174 int dungeon::GetLevelTeleportDestination (int From
) const {
176 if (Index
== ELPURI_CAVE
) {
178 To
= From
+RAND_2
+RAND_2
+RAND_2
+RAND_2
+1;
179 if (To
> DARK_LEVEL
) To
= From
;
181 To
= From
-RAND_2
-RAND_2
-RAND_2
-RAND_2
-1;
186 if (Index
== UNDER_WATER_TUNNEL
) return RAND_N(3);