Mercurial > mm7
annotate mm7_5.cpp @ 2223:17bc3a1eb037
LoadCursor fix
author | Ritor1 |
---|---|
date | Wed, 19 Feb 2014 13:01:36 +0600 |
parents | 3f375342de12 |
children | 6ab7d7c112bb |
rev | line source |
---|---|
1016 | 1 #include "MapInfo.h" |
2 #include "LightmapBuilder.h" | |
0 | 3 #include "mm7.h" |
4 #include "GUIWindow.h" | |
5 #include "Party.h" | |
6 #include "Outdoor.h" | |
7 #include "LOD.h" | |
8 #include "Actor.h" | |
9 #include "Viewport.h" | |
2037
7a9477135943
Renamed Math.h -> OurMath.h (file resolution was sometimes ambiguous)
Nomad
parents:
2006
diff
changeset
|
10 #include "OurMath.h" |
515
cb0ad52d6a26
LayingItem -> SpriteObject (long-waited rename, old name was inaccurate and confused people)
Nomad
parents:
513
diff
changeset
|
11 #include "SpriteObject.h" |
2044 | 12 #include "Timer.h" |
0 | 13 #include "stru298.h" |
1262 | 14 #include "Lights.h" |
1828
35c1e4ff6ba7
party_finds_gold to Party::PartyFindsGold, cleaned up, moved Level/Decoration.h reference out of Indoor.h
Grumpy7
parents:
1793
diff
changeset
|
15 #include "Level/Decoration.h" |
0 | 16 |
2207 | 17 |
0 | 18 //----- (004356FF) -------------------------------------------------------- |
1575 | 19 void back_to_game() |
0 | 20 { |
21 dword_507BF0_is_there_popup_onscreen = 0; | |
22 dword_4E455C = 1; | |
1575 | 23 |
24 extern int no_rightlick_in_inventory; | |
25 no_rightlick_in_inventory = false; | |
26 | |
0 | 27 if ( pGUIWindow_ScrollWindow ) |
28 free_book_subwindow(); | |
29 if ( !pCurrentScreen && !pGUIWindow_Settings ) | |
30 pEventTimer->Resume(); | |
31 viewparams->bRedrawGameUI = 1; | |
32 } | |
782 | 33 |
0 | 34 //----- (004369DB) -------------------------------------------------------- |
35 void Vec3_float_::Normalize() | |
36 { | |
1025 | 37 this->x = (1.0 / sqrt(this->x * this->x + this->y * this->y + this->z * this->z)) * this->x; |
38 this->y = (1.0 / sqrt(this->x * this->x + this->y * this->y + this->z * this->z)) * this->y; | |
39 this->z = (1.0 / sqrt(this->x * this->x + this->y * this->y + this->z * this->z)) * this->z; | |
0 | 40 } |
41 | |
42 //----- (00438F8F) -------------------------------------------------------- | |
1391
cc9a3a24d61d
Moved stru11, stru12 and some SW Rendering stuff to the archives.
Nomad
parents:
1384
diff
changeset
|
43 void area_of_effect__damage_evaluate() |
0 | 44 { |
2059 | 45 int attacker_type; // ecx@3 |
0 | 46 signed int v3; // eax@3 |
2059 | 47 unsigned int target_id; // edi@6 |
48 int target_type; // eax@6 | |
0 | 49 int v10; // edi@8 |
2059 | 50 Vec3_int_ attacker_coord; // ST04_12@9 |
0 | 51 int v12; // ST0C_4@10 |
52 int v15; // edx@15 | |
53 int v19; // edi@15 | |
54 int v23; // edx@18 | |
55 int v24; // eax@18 | |
56 int v30; // eax@29 | |
57 int v31; // edx@29 | |
58 int v32; // eax@29 | |
59 int v33; // ST24_4@29 | |
515
cb0ad52d6a26
LayingItem -> SpriteObject (long-waited rename, old name was inaccurate and confused people)
Nomad
parents:
513
diff
changeset
|
60 SpriteObject *v36; // [sp+0h] [bp-28h]@0 |
2059 | 61 int attacker_id; // [sp+10h] [bp-18h]@1 |
0 | 62 int v44; // [sp+14h] [bp-14h]@15 |
2059 | 63 //Vec3_int_ *pVelocity; // [sp+1Ch] [bp-Ch]@2 |
2205 | 64 signed int a1; // [sp+20h] [bp-8h]@8 |
0 | 65 int v48; // [sp+24h] [bp-4h]@8 |
66 | |
2059 | 67 |
68 for ( attacker_id = 0; attacker_id < AttackerInfo.count; ++attacker_id ) | |
0 | 69 { |
2059 | 70 attacker_type = PID_TYPE(AttackerInfo.pIDs[attacker_id]); |
71 v3 = PID_ID(AttackerInfo.pIDs[attacker_id]); | |
2057 | 72 |
2059 | 73 if ( attacker_type == 2 ) |
74 { | |
75 v36 = &pSpriteObjects[v3]; | |
76 attacker_type = PID_TYPE(pSpriteObjects[v3].spell_caster_pid); | |
77 v3 = PID_ID(pSpriteObjects[v3].spell_caster_pid); | |
78 } | |
2057 | 79 |
2059 | 80 if ( AttackerInfo.field_3EC[attacker_id] & 1 ) |
81 { | |
82 target_id = PID_ID(ai_near_actors_targets_pid[v3]); | |
83 target_type = PID_TYPE(ai_near_actors_targets_pid[v3]) - 3; | |
84 if ( target_type ) | |
0 | 85 { |
2059 | 86 if ( target_type == 1 )//party damage from monsters(повреждения группе от монстров) |
0 | 87 { |
2059 | 88 v10 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id]; |
89 a1 = pParty->vPosition.x - AttackerInfo.pXs[attacker_id]; | |
2117 | 90 v48 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id]; |
2059 | 91 if ( a1 * a1 + v10 * v10 |
92 + ((signed int)(pParty->vPosition.z + pParty->uPartyHeight) >> (1 - AttackerInfo.pZs[attacker_id])) | |
93 * ((signed int)(pParty->vPosition.z + pParty->uPartyHeight) >> (1 - AttackerInfo.pZs[attacker_id])) | |
94 < (unsigned int)((AttackerInfo.field_324[attacker_id] + 32) * (AttackerInfo.field_324[attacker_id] + 32)) ) | |
0 | 95 { |
2059 | 96 attacker_coord.x = AttackerInfo.pXs[attacker_id]; |
97 attacker_coord.y = AttackerInfo.pYs[attacker_id]; | |
98 attacker_coord.z = AttackerInfo.pZs[attacker_id]; | |
99 if ( sub_407A1C(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + pParty->sEyelevel, attacker_coord) ) | |
100 DamagePlayerFromMonster(AttackerInfo.pIDs[attacker_id], AttackerInfo.field_450[attacker_id], &AttackerInfo.vec_4B4[attacker_id], stru_50C198.which_player_to_attack(&pActors[v3])); | |
0 | 101 } |
102 } | |
2059 | 103 } |
104 else//Actor damage from monsters(повреждение местного жителя) | |
105 { | |
106 if ( SHIDWORD(pActors[target_id].pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime) > 0 | |
107 || SHIDWORD(pActors[target_id].pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime) >= 0 | |
108 && LODWORD(pActors[target_id].pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime) | |
109 || pActors[target_id].CanAct() ) | |
0 | 110 { |
2059 | 111 v15 = pActors[target_id].vPosition.y - AttackerInfo.pYs[attacker_id]; |
112 a1 = pActors[target_id].vPosition.x - AttackerInfo.pXs[attacker_id]; | |
113 v44 = pActors[target_id].vPosition.z; | |
114 v19 = AttackerInfo.pYs[attacker_id] + pActors[target_id].uActorRadius; | |
115 v48 = v15; | |
116 if ( a1 * a1 + v15 * v15 + (pActors[target_id].vPosition.z + (pActors[target_id].uActorHeight >> 1) - AttackerInfo.pZs[attacker_id]) | |
117 * (pActors[target_id].vPosition.z + (pActors[target_id].uActorHeight >> 1) - AttackerInfo.pZs[attacker_id]) < (unsigned int)(v19 * v19) ) | |
0 | 118 { |
2059 | 119 attacker_coord.x = AttackerInfo.pXs[attacker_id]; |
120 attacker_coord.y = AttackerInfo.pYs[attacker_id]; | |
121 attacker_coord.z = AttackerInfo.pZs[attacker_id]; | |
122 if ( sub_407A1C(pActors[target_id].vPosition.x, pActors[target_id].vPosition.y, pActors[target_id].vPosition.z + 50, attacker_coord) ) | |
0 | 123 { |
2059 | 124 Vec3_int_::Normalize(&a1, &v48, &v44); |
125 AttackerInfo.vec_4B4[attacker_id].x = a1; | |
126 AttackerInfo.vec_4B4[attacker_id].y = v48; | |
127 AttackerInfo.vec_4B4[attacker_id].z = v44; | |
128 ActorDamageFromMonster(AttackerInfo.pIDs[attacker_id], target_id, &AttackerInfo.vec_4B4[attacker_id], AttackerInfo.field_450[attacker_id]); | |
0 | 129 } |
130 } | |
131 } | |
132 } | |
2059 | 133 } |
134 else //damage from spells(повреждения от заклов(метеоритный дождь)) | |
135 { | |
136 v23 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id]; | |
2216 | 137 v24 = ((signed int)pParty->uPartyHeight / 2) - AttackerInfo.pZs[attacker_id]; |
2059 | 138 a1 = pParty->vPosition.x - AttackerInfo.pXs[attacker_id]; |
2117 | 139 v48 = pParty->vPosition.y - AttackerInfo.pYs[attacker_id]; |
2059 | 140 if ( a1 * a1 + v23 * v23 + (pParty->vPosition.z + v24) * (pParty->vPosition.z + v24) < (unsigned int)((AttackerInfo.field_324[attacker_id] + 32) * (AttackerInfo.field_324[attacker_id] + 32)) ) |
141 {//party damage (повреждения группе) | |
142 attacker_coord.x = AttackerInfo.pXs[attacker_id]; | |
143 attacker_coord.y = AttackerInfo.pYs[attacker_id]; | |
144 attacker_coord.z = AttackerInfo.pZs[attacker_id]; | |
145 if ( sub_407A1C(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + pParty->sEyelevel, attacker_coord) ) | |
146 { | |
147 for ( uint i = 0; i < 4; ++i ) | |
0 | 148 { |
2059 | 149 if ( !(HIDWORD(pParty->pPlayers[i].pConditions[Condition_Dead]) | LODWORD(pParty->pPlayers[i].pConditions[Condition_Dead])) |
150 && !pParty->pPlayers[i].pConditions[Condition_Pertified] && !pParty->pPlayers[i].pConditions[Condition_Eradicated] ) | |
151 DamagePlayerFromMonster(AttackerInfo.pIDs[attacker_id], AttackerInfo.field_450[attacker_id], &AttackerInfo.vec_4B4[attacker_id], i); | |
0 | 152 } |
153 } | |
2059 | 154 } |
155 if ( (signed int)uNumActors > 0 ) | |
156 {//actors damage(повреждения другим участникам) | |
157 for ( int actorID = 0; (signed int)actorID < (signed int)uNumActors; ++actorID ) | |
158 { | |
159 if ( pActors[actorID].CanAct() ) | |
0 | 160 { |
2205 | 161 //v30 = pActors[actorID].vPosition.y - AttackerInfo.pYs[attacker_id]; |
2059 | 162 a1 = pActors[actorID].vPosition.x - AttackerInfo.pXs[attacker_id]; |
163 v31 = pActors[actorID].vPosition.z; | |
2205 | 164 v48 = pActors[actorID].vPosition.y - AttackerInfo.pYs[attacker_id]; |
2059 | 165 v44 = pActors[actorID].vPosition.z; |
2205 | 166 v32 = (pActors[actorID].uActorHeight / 2) - AttackerInfo.pZs[attacker_id]; |
2059 | 167 v33 = pActors[actorID].uActorRadius + AttackerInfo.pYs[attacker_id]; |
168 if ( a1 * a1 + v48 * v48 + (v31 + v32) * (v31 + v32) < (unsigned int)(v33 * v33) ) | |
0 | 169 { |
2059 | 170 attacker_coord.x = AttackerInfo.pXs[attacker_id]; |
171 attacker_coord.y = AttackerInfo.pYs[attacker_id]; | |
172 attacker_coord.z = AttackerInfo.pZs[attacker_id]; | |
2205 | 173 if ( sub_407A1C(pActors[actorID].vPosition.x, pActors[actorID].vPosition.y, pActors[actorID].vPosition.z + 50, attacker_coord) )//что делает ф-ция? |
0 | 174 { |
2059 | 175 Vec3_int_::Normalize(&a1, &v48, &v44); |
176 AttackerInfo.vec_4B4[attacker_id].x = a1; | |
177 AttackerInfo.vec_4B4[attacker_id].y = v48; | |
178 AttackerInfo.vec_4B4[attacker_id].z = v44; | |
179 switch ( attacker_type ) | |
0 | 180 { |
2059 | 181 case OBJECT_Player: |
182 DamageMonsterFromParty(AttackerInfo.pIDs[attacker_id], actorID, &AttackerInfo.vec_4B4[attacker_id]); | |
183 break; | |
184 case OBJECT_Actor: | |
185 if ( v36 && pActors[v3].GetActorsRelation(&pActors[actorID]) ) | |
186 ActorDamageFromMonster(AttackerInfo.pIDs[attacker_id], actorID, &AttackerInfo.vec_4B4[attacker_id], v36->field_61); | |
187 break; | |
188 case OBJECT_Item: | |
2132 | 189 ItemDamageFromActor(AttackerInfo.pIDs[attacker_id], actorID, &AttackerInfo.vec_4B4[attacker_id]); |
2059 | 190 break; |
0 | 191 } |
192 } | |
193 } | |
194 } | |
195 } | |
196 } | |
197 } | |
198 } | |
2059 | 199 AttackerInfo.count = 0; |
0 | 200 } |
201 | |
202 | |
203 //----- (0043A97E) -------------------------------------------------------- | |
204 void __fastcall sub_43A97E(unsigned int uLayingItemID, signed int a2) | |
205 { | |
1979 | 206 if (PID_TYPE(a2) == OBJECT_Player) |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
207 { |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
208 layingitem_vel_50FDFC.x = pSpriteObjects[uLayingItemID].vVelocity.x; |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
209 layingitem_vel_50FDFC.y = pSpriteObjects[uLayingItemID].vVelocity.y; |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
210 layingitem_vel_50FDFC.z = pSpriteObjects[uLayingItemID].vVelocity.z; |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
211 |
0 | 212 Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z); |
2006 | 213 DamagePlayerFromMonster(PID(OBJECT_Item, uLayingItemID), pSpriteObjects[uLayingItemID].field_61, &layingitem_vel_50FDFC, -1); |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
214 } |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
215 else if (PID_TYPE(a2) == OBJECT_Actor) |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
216 { |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
217 layingitem_vel_50FDFC.x = pSpriteObjects[uLayingItemID].vVelocity.x; |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
218 layingitem_vel_50FDFC.y = pSpriteObjects[uLayingItemID].vVelocity.y; |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
219 layingitem_vel_50FDFC.z = pSpriteObjects[uLayingItemID].vVelocity.z; |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
220 |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
221 Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z); |
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
222 switch (PID_TYPE(pSpriteObjects[uLayingItemID].spell_caster_pid)) |
0 | 223 { |
224 case OBJECT_Actor: | |
2057 | 225 ActorDamageFromMonster(PID(OBJECT_Item, uLayingItemID), PID_ID(a2), &layingitem_vel_50FDFC, pSpriteObjects[uLayingItemID].field_61); |
0 | 226 break; |
227 case OBJECT_Player: | |
828
0f56abdcce94
Massive refactors of spells + PID (packed id) macros introduced.
Nomad
parents:
824
diff
changeset
|
228 DamageMonsterFromParty(PID(OBJECT_Item, uLayingItemID), PID_ID(a2), &layingitem_vel_50FDFC); |
0 | 229 break; |
230 case OBJECT_Item: | |
2132 | 231 ItemDamageFromActor(PID(OBJECT_Item, uLayingItemID), PID_ID(a2), &layingitem_vel_50FDFC); |
0 | 232 break; |
233 } | |
234 } | |
235 } | |
236 | |
237 //----- (0043AE12) -------------------------------------------------------- | |
238 double __fastcall sub_43AE12(signed int a1) | |
239 { | |
2117 | 240 //signed int v1; // ST00_4@1 |
0 | 241 signed int v2; // ecx@1 |
242 double v3; // st7@1 | |
243 double result; // st7@6 | |
244 | |
2117 | 245 v3 = (double)a1; |
246 for ( v2 = 0; v2 < 5; ++v2 ) | |
0 | 247 { |
248 if ( v3 < flt_4E4A80[v2 + 5] ) | |
249 break; | |
250 } | |
251 if ( v2 <= 0 || v2 >= 5 ) | |
252 { | |
253 if ( v2 ) | |
254 result = flt_4E4A80[4]; | |
255 else | |
256 result = flt_4E4A80[0]; | |
257 } | |
258 else | |
1469 | 259 result = (flt_4E4A80[v2] - flt_4E4A80[v2 - 1]) * (v3 - flt_4E4A80[v2 + 4]) / (flt_4E4A80[v2 + 5] - flt_4E4A80[v2 + 4]) + flt_4E4A80[v2]; |
0 | 260 return result; |
261 } | |
262 | |
263 //----- (0043B057) -------------------------------------------------------- | |
2132 | 264 void ItemDamageFromActor(unsigned int uObjID, unsigned int uActorID, Vec3_int_ *pVelocity) |
0 | 265 { |
266 int v6; // eax@4 | |
2132 | 267 int damage; // edi@4 |
0 | 268 int a2a; // [sp+Ch] [bp-4h]@8 |
269 | |
303 | 270 if ( !pActors[uActorID].IsNotAlive() ) |
0 | 271 { |
2117 | 272 if ( PID_TYPE(uObjID) == OBJECT_Item) |
848 | 273 { |
2117 | 274 if ( pSpriteObjects[PID_ID(uObjID)].spell_id ) |
0 | 275 { |
2117 | 276 v6 = _43AFE3_calc_spell_damage(pSpriteObjects[PID_ID(uObjID)].spell_id, pSpriteObjects[PID_ID(uObjID)].spell_level, pSpriteObjects[PID_ID(uObjID)].spell_skill, pActors[uActorID].sCurrentHP); |
2132 | 277 damage = stru_50C198.CalcMagicalDamageToActor(&pActors[uActorID], 0, v6); |
278 pActors[uActorID].sCurrentHP -= damage; | |
279 if ( damage ) | |
0 | 280 { |
2117 | 281 if ( pActors[uActorID].sCurrentHP > 0 ) |
282 Actor::AI_Stun(uActorID, uObjID, 0); | |
0 | 283 else |
2117 | 284 Actor::Die(uActorID); |
2132 | 285 a2a = 20 * damage / (signed int)pActors[uActorID].pMonsterInfo.uHP; |
286 if ( 20 * damage / (signed int)pActors[uActorID].pMonsterInfo.uHP > 10 ) | |
0 | 287 a2a = 10; |
2117 | 288 if ( !MonsterStats::BelongsToSupertype(pActors[uActorID].pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) ) |
0 | 289 { |
2207 | 290 pVelocity->x = fixpoint_mul(a2a, pVelocity->x); |
291 pVelocity->y = fixpoint_mul(a2a, pVelocity->y); | |
292 pVelocity->z = fixpoint_mul(a2a, pVelocity->z); | |
2117 | 293 pActors[uActorID].vVelocity.x = 50 * LOWORD(pVelocity->x); |
294 pActors[uActorID].vVelocity.y = 50 * LOWORD(pVelocity->y); | |
295 pActors[uActorID].vVelocity.z = 50 * LOWORD(pVelocity->z); | |
0 | 296 } |
2132 | 297 Actor::AddBloodsplatOnDamageOverlay(uActorID, 1, damage); |
0 | 298 } |
299 else | |
2117 | 300 Actor::AI_Stun(uActorID, uObjID, 0); |
0 | 301 } |
302 } | |
303 } | |
304 } | |
305 | |
306 //----- (0043B1B0) -------------------------------------------------------- | |
2059 | 307 void ActorDamageFromMonster(signed int attacker_id, unsigned int actor_id, Vec3_int_ *pVelocity, signed int a4) |
0 | 308 { |
309 int v4; // ebx@1 | |
1924
8cd321994943
MSVS 2012 project file & some compilation warning fixes
Nomad
parents:
1916
diff
changeset
|
310 int v6; // eax@3 |
0 | 311 __int64 v10; // qax@8 |
312 signed int v12; // ecx@20 | |
313 int v13; // ecx@22 | |
314 int v14; // edi@30 | |
315 signed int v17; // [sp+10h] [bp-4h]@1 | |
316 int v18; // [sp+20h] [bp+Ch]@34 | |
317 | |
318 v4 = 0; | |
2059 | 319 v17 = attacker_id; |
320 if ( PID_TYPE(attacker_id) == OBJECT_Item) | |
848 | 321 { |
2059 | 322 v4 = pSpriteObjects[PID_ID(attacker_id)].field_60_distance_related_prolly_lod; |
323 v17 = pSpriteObjects[PID_ID(attacker_id)].spell_caster_pid; | |
0 | 324 } |
2057 | 325 if ( PID_TYPE(v17) == OBJECT_Actor) |
0 | 326 { |
2057 | 327 v6 = pActors[actor_id].IsNotAlive(); |
0 | 328 if ( !v6 ) |
329 { | |
2059 | 330 pActors[actor_id].uLastCharacterIDToHit = v17; |
2114 | 331 if ( pActors[actor_id].uAIState == Fleeing ) |
2166 | 332 pActors[actor_id].uAttributes |= FACE_UNKNOW7; |
2114 | 333 if ( pActors[PID_ID(v17)]._4273BB_DoesHitOtherActor(&pActors[actor_id], v4, 0) ) |
0 | 334 { |
2059 | 335 v10 = (unsigned int)pActors[PID_ID(v17)]._43B3E0_CalcDamage(a4); |
336 if ( (signed __int64)pActors[PID_ID(v17)].pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime > 0 ) | |
0 | 337 { |
2114 | 338 if ( pActors[PID_ID(v17)].pActorBuffs[ACTOR_BUFF_SHRINK].uPower ) |
339 v10 = (signed int)v10 / (unsigned __int16)pActors[PID_ID(v17)].pActorBuffs[ACTOR_BUFF_SHRINK].uPower; | |
0 | 340 } |
2059 | 341 if ( SHIDWORD(pActors[actor_id].pActorBuffs[ACTOR_BUFF_STONED].uExpireTime) >= SHIDWORD(v10) |
342 && (SHIDWORD(pActors[actor_id].pActorBuffs[ACTOR_BUFF_STONED].uExpireTime) > SHIDWORD(v10) | |
343 || LODWORD(pActors[actor_id].pActorBuffs[ACTOR_BUFF_STONED].uExpireTime) > HIDWORD(v10)) ) | |
0 | 344 LODWORD(v10) = 0; |
2117 | 345 if ( a4 == HIDWORD(v10) ) |
346 v12 = pActors[PID_ID(v17)].pMonsterInfo.uAttack1Type; | |
347 else if ( a4 - HIDWORD(v10) == 1 ) | |
0 | 348 { |
2117 | 349 v12 = pActors[PID_ID(v17)].pMonsterInfo.uAttack2Type; |
350 if ( SHIDWORD(pActors[actor_id].pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime) >= SHIDWORD(v10) | |
351 && (SHIDWORD(pActors[actor_id].pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime) > SHIDWORD(v10) | |
352 || LODWORD(pActors[actor_id].pActorBuffs[ACTOR_BUFF_SHIELD].uExpireTime) > HIDWORD(v10)) ) | |
353 LODWORD(v10) = (signed int)v10 / 2; | |
354 } | |
355 else if ( a4 - HIDWORD(v10) == 2 ) | |
356 v12 = LOBYTE(pSpellStats->pInfos[pActors[actor_id].pMonsterInfo.uSpell1ID].uSchool); | |
357 else if ( a4 - HIDWORD(v10) == 3 ) | |
358 v12 = LOBYTE(pSpellStats->pInfos[pActors[actor_id].pMonsterInfo.uSpell2ID].uSchool); | |
359 else if ( a4 - HIDWORD(v10) == 4 ) | |
360 v12 = pActors[PID_ID(v17)].pMonsterInfo.field_3C_some_special_attack; | |
361 else | |
362 v12 = 4; | |
363 v14 = stru_50C198.CalcMagicalDamageToActor(&pActors[actor_id], v12, v10); | |
364 pActors[actor_id].sCurrentHP -= v14; | |
365 if ( v14 ) | |
366 { | |
367 if ( pActors[actor_id].sCurrentHP > 0 ) | |
368 Actor::AI_Stun(actor_id, v17, 0); | |
0 | 369 else |
2117 | 370 Actor::Die(actor_id); |
371 Actor::AggroSurroundingPeasants(actor_id, 0); | |
372 v18 = 20 * v14 / (signed int)pActors[actor_id].pMonsterInfo.uHP; | |
373 if ( 20 * v14 / (signed int)pActors[actor_id].pMonsterInfo.uHP > 10 ) | |
374 v18 = 10; | |
375 if ( !MonsterStats::BelongsToSupertype(pActors[actor_id].pMonsterInfo.uID, MONSTER_SUPERTYPE_TREANT) ) | |
0 | 376 { |
2207 | 377 pVelocity->x = fixpoint_mul(v18, pVelocity->x); |
378 pVelocity->y = fixpoint_mul(v18, pVelocity->y); | |
379 pVelocity->z = fixpoint_mul(v18, pVelocity->z); | |
2117 | 380 pActors[actor_id].vVelocity.x = 50 * LOWORD(pVelocity->x); |
381 pActors[actor_id].vVelocity.y = 50 * LOWORD(pVelocity->y); | |
382 pActors[actor_id].vVelocity.z = 50 * LOWORD(pVelocity->z); | |
0 | 383 } |
2117 | 384 Actor::AddBloodsplatOnDamageOverlay(actor_id, 1, v14); |
0 | 385 } |
2117 | 386 else |
387 Actor::AI_Stun(actor_id, v17, 0); | |
388 return; | |
0 | 389 } |
390 } | |
391 } | |
392 } | |
393 | |
394 //----- (0043F515) -------------------------------------------------------- | |
657 | 395 void FindBillboardsLightLevels_BLV() |
0 | 396 { |
397 for (uint i = 0; i < uNumBillboardsToDraw; ++i) | |
398 { | |
2114 | 399 if (pBillboardRenderList[i].field_1E & 2 || uCurrentlyLoadedLevelType == LEVEL_Indoor && !pBillboardRenderList[i].uIndoorSectorID) |
400 pBillboardRenderList[i].dimming_level = 0; | |
0 | 401 else |
2114 | 402 pBillboardRenderList[i].dimming_level = _43F55F_get_billboard_light_level(&pBillboardRenderList[i], -1); |
0 | 403 } |
404 } | |
405 | |
406 //----- (0043F55F) -------------------------------------------------------- | |
407 int __fastcall _43F55F_get_billboard_light_level(RenderBillboard *a1, int uBaseLightLevel) | |
408 { | |
409 signed int v3; // ecx@2 | |
410 | |
411 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor ) | |
412 v3 = pIndoor->pSectors[a1->uIndoorSectorID].uMinAmbientLightLevel; | |
413 else | |
414 { | |
415 if ( uBaseLightLevel == -1 ) | |
657 | 416 v3 = a1->dimming_level; |
0 | 417 else |
418 v3 = uBaseLightLevel; | |
419 } | |
430 | 420 return _43F5C8_get_point_light_level_with_respect_to_lights(v3, a1->uIndoorSectorID, a1->world_x, a1->world_y, a1->world_z); |
0 | 421 } |
422 | |
423 //----- (0043F5C8) -------------------------------------------------------- | |
424 int __fastcall _43F5C8_get_point_light_level_with_respect_to_lights(unsigned int uBaseLightLevel, int uSectorID, float x, float y, float z) | |
425 { | |
426 int v5; // esi@1 | |
427 signed int v6; // edi@1 | |
428 int v8; // eax@6 | |
429 int v9; // ebx@6 | |
430 unsigned int v10; // ecx@6 | |
431 unsigned int v11; // edx@9 | |
432 unsigned int v12; // edx@11 | |
433 signed int v13; // ecx@12 | |
434 BLVLightMM7 *v16; // esi@20 | |
435 int v17; // ebx@21 | |
436 int v18; // eax@24 | |
437 int v19; // ebx@24 | |
438 unsigned int v20; // ecx@24 | |
439 int v21; // edx@25 | |
440 unsigned int v22; // edx@27 | |
441 unsigned int v23; // edx@29 | |
442 signed int v24; // ecx@30 | |
443 int v26; // ebx@35 | |
444 int v27; // eax@38 | |
445 int v28; // ebx@38 | |
446 unsigned int v29; // ecx@38 | |
447 int v30; // edx@39 | |
448 unsigned int v31; // edx@41 | |
449 unsigned int v32; // edx@43 | |
450 signed int v33; // ecx@44 | |
451 int v37; // [sp+Ch] [bp-18h]@37 | |
452 int v38; // [sp+10h] [bp-14h]@5 | |
453 int v39; // [sp+10h] [bp-14h]@23 | |
454 int v40; // [sp+10h] [bp-14h]@36 | |
455 int v42; // [sp+14h] [bp-10h]@22 | |
456 unsigned int v43; // [sp+18h] [bp-Ch]@12 | |
457 unsigned int v44; // [sp+18h] [bp-Ch]@30 | |
458 unsigned int v45; // [sp+18h] [bp-Ch]@44 | |
459 | |
460 v6 = uBaseLightLevel; | |
461 for (uint i = 0; i < pMobileLightsStack->uNumLightsActive; ++i) | |
462 { | |
1980 | 463 MobileLight* p = &pMobileLightsStack->pLights[i]; |
0 | 464 |
1980 | 465 float distX = abs(p->vPosition.x - x); |
0 | 466 if ( distX <= p->uRadius) |
467 { | |
1980 | 468 float distY = abs(p->vPosition.y - y); |
0 | 469 if ( distY <= p->uRadius) |
470 { | |
1980 | 471 float distZ = abs(p->vPosition.z - z); |
0 | 472 if ( distZ <= p->uRadius) |
473 { | |
474 v8 = distX; | |
475 v9 = distY; | |
476 v10 = distZ; | |
477 if (distX < distY) | |
478 { | |
479 v8 = distY; | |
480 v9 = distX; | |
481 } | |
482 if ( v8 < distZ ) | |
483 { | |
484 v11 = v8; | |
485 v8 = distZ; | |
486 v10 = v11; | |
487 } | |
488 if ( v9 < (signed int)v10 ) | |
489 { | |
490 v12 = v10; | |
491 v10 = v9; | |
492 v9 = v12; | |
493 } | |
494 v43 = ((unsigned int)(11 * v9) / 32) + (v10 / 4) + v8; | |
495 v13 = p->uRadius; | |
496 if ( (signed int)v43 < v13 ) | |
497 v6 += ((unsigned __int64)(30i64 * (signed int)(v43 << 16) / v13) >> 16) - 30; | |
498 } | |
499 } | |
500 } | |
501 } | |
502 | |
503 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor) | |
504 { | |
1980 | 505 BLVSector* pSector = &pIndoor->pSectors[uSectorID]; |
0 | 506 |
507 for (uint i = 0; i < pSector->uNumLights; ++i) | |
508 { | |
509 v16 = pIndoor->pLights + pSector->pLights[i]; | |
510 if (~v16->uAtributes & 8) | |
511 { | |
512 v17 = abs(v16->vPosition.x - x); | |
513 if ( v17 <= v16->uRadius ) | |
514 { | |
515 v42 = abs(v16->vPosition.y - y); | |
516 if ( v42 <= v16->uRadius ) | |
517 { | |
518 v39 = abs(v16->vPosition.z - z); | |
519 if ( v39 <= v16->uRadius ) | |
520 { | |
521 v18 = v17; | |
522 v19 = v42; | |
523 v20 = v39; | |
524 if ( v18 < v42 ) | |
525 { | |
526 v21 = v18; | |
527 v18 = v42; | |
528 v19 = v21; | |
529 } | |
530 if ( v18 < v39 ) | |
531 { | |
532 v22 = v18; | |
533 v18 = v39; | |
534 v20 = v22; | |
535 } | |
536 if ( v19 < (signed int)v20 ) | |
537 { | |
538 v23 = v20; | |
539 v20 = v19; | |
540 v19 = v23; | |
541 } | |
542 v44 = ((unsigned int)(11 * v19) >> 5) + (v20 >> 2) + v18; | |
543 v24 = v16->uRadius; | |
544 if ( (signed int)v44 < v24 ) | |
545 v6 += ((unsigned __int64)(30i64 * (signed int)(v44 << 16) / v24) >> 16) - 30; | |
546 } | |
547 } | |
548 } | |
549 } | |
550 } | |
551 } | |
552 | |
553 for (uint i = 0; i < pStationaryLightsStack->uNumLightsActive; ++i) | |
554 { | |
1980 | 555 StationaryLight* p = &pStationaryLightsStack->pLights[i]; |
0 | 556 v26 = abs(p->vPosition.x - x); |
557 if ( v26 <= p->uRadius) | |
558 { | |
559 v40 = abs(p->vPosition.y - y); | |
560 if ( v40 <= p->uRadius) | |
561 { | |
562 v37 = abs(p->vPosition.z - z); | |
563 if ( v37 <= p->uRadius) | |
564 { | |
565 v27 = v26; | |
566 v28 = v40; | |
567 v29 = v37; | |
568 if ( v27 < v40 ) | |
569 { | |
570 v30 = v27; | |
571 v27 = v40; | |
572 v28 = v30; | |
573 } | |
574 if ( v27 < v37 ) | |
575 { | |
576 v31 = v27; | |
577 v27 = v37; | |
578 v29 = v31; | |
579 } | |
580 if ( v28 < (signed int)v29 ) | |
581 { | |
582 v32 = v29; | |
583 v29 = v28; | |
584 v28 = v32; | |
585 } | |
586 v45 = ((unsigned int)(11 * v28) >> 5) + (v29 >> 2) + v27; | |
587 v33 = p->uRadius; | |
588 if ( (signed int)v45 < v33 ) | |
589 v6 += ((unsigned __int64)(30i64 * (signed int)(v45 << 16) / v33) >> 16) - 30; | |
590 } | |
591 } | |
592 } | |
593 } | |
594 | |
595 if ( v6 <= 31 ) | |
596 { | |
597 if ( v6 < 0 ) | |
598 v6 = 0; | |
599 } | |
600 else | |
601 { | |
602 v6 = 31; | |
603 } | |
604 return v6; | |
605 } | |
606 | |
607 | |
608 //----- (004070EF) -------------------------------------------------------- | |
1493 | 609 bool __fastcall sub_4070EF_prolly_detect_player(unsigned int uObjID, unsigned int uObj2ID) |
0 | 610 { |
611 signed int v2; // eax@1 | |
612 int v5; // ecx@2 | |
1615 | 613 int obj1_sector; // eax@4 |
0 | 614 float v8; // ST24_4@5 |
615 double v9; // ST18_8@5 | |
616 int v11; // ecx@6 | |
617 signed int v12; // eax@7 | |
618 int v13; // esi@7 | |
619 int v14; // esi@8 | |
620 int v15; // esi@9 | |
1493 | 621 int obj2_z; // edi@11 |
622 int obj2_x; // esi@11 | |
623 int obj2_sector; // eax@13 | |
0 | 624 float v20; // ST24_4@14 |
625 double v21; // ST18_8@14 | |
1615 | 626 int dist_x; // ebx@16 |
627 signed int dist_3d; // ecx@16 | |
0 | 628 int v25; // eax@18 |
629 BLVFace *v29; // ebx@32 | |
630 Vec3_short_ *v30; // esi@32 | |
631 int v31; // eax@32 | |
632 int v32; // ST50_4@44 | |
633 int v33; // ST54_4@44 | |
634 int v34; // eax@44 | |
635 signed int v38; // esi@45 | |
636 signed __int64 v40; // qtt@50 | |
1615 | 637 __int16 next_sector; // bx@58 |
0 | 638 int v43; // [sp-8h] [bp-70h]@11 |
639 int v44; // [sp-4h] [bp-6Ch]@11 | |
640 int v47; // [sp+18h] [bp-50h]@20 | |
641 int v48; // [sp+1Ch] [bp-4Ch]@20 | |
642 int v49; // [sp+20h] [bp-48h]@20 | |
1615 | 643 int dist_z; // [sp+24h] [bp-44h]@16 |
644 signed int higher_z; // [sp+24h] [bp-44h]@27 | |
645 signed int lower_z; // [sp+28h] [bp-40h]@26 | |
646 signed int higher_y; // [sp+2Ch] [bp-3Ch]@23 | |
647 signed int lower_y; // [sp+30h] [bp-38h]@22 | |
648 signed int higher_x; // [sp+34h] [bp-34h]@21 | |
649 signed int lower_x; // [sp+38h] [bp-30h]@20 | |
650 signed int sectors_visited; // [sp+3Ch] [bp-2Ch]@28 | |
0 | 651 int v58; // [sp+44h] [bp-24h]@50 |
652 int v59; // [sp+48h] [bp-20h]@44 | |
1493 | 653 int obj2_y; // [sp+50h] [bp-18h]@11 |
1615 | 654 int obj1_x; // [sp+58h] [bp-10h]@4 |
655 int obj1_y; // [sp+5Ch] [bp-Ch]@4 | |
656 int obj1_z; // [sp+60h] [bp-8h]@4 | |
657 int current_sector; // [sp+64h] [bp-4h]@7 | |
658 int dist_y; | |
659 int v70; | |
0 | 660 |
848 | 661 v2 = PID_ID(uObjID); |
1615 | 662 switch( PID_TYPE(uObjID) ) |
0 | 663 { |
1615 | 664 case OBJECT_Decoration: |
665 obj1_x = pLevelDecorations[v2].vPosition.x; | |
666 obj1_y = pLevelDecorations[v2].vPosition.y; | |
667 obj1_z = pLevelDecorations[v2].vPosition.z; | |
668 obj1_sector = pIndoor->GetSector(obj1_x, obj1_y, obj1_z); | |
669 break; | |
670 case OBJECT_Actor: | |
671 obj1_x = pActors[v2].vPosition.x; | |
672 obj1_y = pActors[v2].vPosition.y; | |
0 | 673 v8 = (double)pActors[v2].uActorHeight * 0.69999999; |
1493 | 674 //v9 = v8 + 6.7553994e15; |
1615 | 675 //obj1_z = LODWORD(v9) + pActors[v2].vPosition.z; |
676 obj1_z = (int)v8 + pActors[v2].vPosition.z; | |
677 obj1_sector = pActors[v2].uSectorID; | |
678 break; | |
679 case OBJECT_Item: | |
680 obj1_x = pSpriteObjects[v2].vPosition.x; | |
681 obj1_y = pSpriteObjects[v2].vPosition.y; | |
682 obj1_z = pSpriteObjects[v2].vPosition.z; | |
683 obj1_sector = pSpriteObjects[v2].uSectorID; | |
684 break; | |
685 default: | |
686 return 0; | |
0 | 687 } |
1493 | 688 v12 = PID_ID(uObj2ID); |
1615 | 689 switch( PID_TYPE(uObj2ID) ) |
1493 | 690 { |
1615 | 691 case OBJECT_Decoration: |
692 obj2_z = pLevelDecorations[v12].vPosition.z; | |
693 obj2_x = pLevelDecorations[v12].vPosition.x; | |
694 obj2_y = pLevelDecorations[v12].vPosition.y; | |
695 obj2_sector = pIndoor->GetSector(obj2_x, obj2_y, obj2_z); | |
696 break; | |
697 case OBJECT_Player: | |
698 obj2_x = pParty->vPosition.x; | |
699 obj2_z = pParty->sEyelevel + pParty->vPosition.z; | |
700 obj2_y = pParty->vPosition.y; | |
2114 | 701 obj2_sector = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->sEyelevel + pParty->vPosition.z); |
1615 | 702 break; |
703 case OBJECT_Actor: | |
704 obj2_y = pActors[v12].vPosition.y; | |
705 obj2_x = pActors[v12].vPosition.x; | |
706 v20 = (double)pActors[v12].uActorHeight * 0.69999999; | |
707 //v21 = v20 + 6.7553994e15; | |
708 //obj2_z = LODWORD(v21) + pActors[v12].vPosition.z; | |
709 obj2_z = (int)v20 + pActors[v12].vPosition.z; | |
710 obj2_sector = pActors[v12].uSectorID; | |
711 break; | |
712 case OBJECT_Item: | |
713 obj2_x = pSpriteObjects[v12].vPosition.x; | |
714 obj2_z = pSpriteObjects[v12].vPosition.z; | |
715 obj2_y = pSpriteObjects[v12].vPosition.y; | |
716 obj2_sector = pSpriteObjects[v12].uSectorID; | |
717 break; | |
718 default: | |
719 return 0; | |
1493 | 720 } |
1615 | 721 dist_x = obj2_x - obj1_x; |
722 dist_z = obj2_z - obj1_z; | |
723 dist_y = obj2_y - obj1_y; | |
724 dist_3d = integer_sqrt(dist_x * dist_x + dist_y * dist_y + dist_z * dist_z); | |
725 //range check | |
726 if ( dist_3d > 5120 ) | |
0 | 727 return 0; |
728 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor) | |
729 return 1; | |
730 v25 = 65536; | |
1615 | 731 if ( dist_3d ) |
732 v25 = 65536 / dist_3d; | |
733 v49 = dist_x * v25; | |
734 v47 = dist_z * v25; | |
735 v48 = dist_y * v25; | |
736 if ( obj1_x < obj2_x ) | |
0 | 737 { |
1615 | 738 lower_x = obj1_x; |
739 higher_x = obj2_x; | |
0 | 740 } |
741 else | |
742 { | |
1615 | 743 lower_x = obj2_x; |
744 higher_x = obj1_x; | |
0 | 745 } |
1615 | 746 if ( obj1_y < obj2_y ) |
0 | 747 { |
1615 | 748 lower_y = obj1_y; |
749 higher_y = obj2_y; | |
0 | 750 } |
751 else | |
752 { | |
1615 | 753 lower_y = obj2_y; |
754 higher_y = obj1_y; | |
0 | 755 } |
1615 | 756 if ( obj1_z < obj2_z ) |
0 | 757 { |
1615 | 758 lower_z = obj1_z; |
759 higher_z = obj2_z; | |
0 | 760 } |
761 else | |
762 { | |
1615 | 763 lower_z = obj2_z; |
764 higher_z = obj1_z; | |
0 | 765 } |
1615 | 766 sectors_visited = 0; |
767 //monster in same sector with player | |
768 if ( obj1_sector == obj2_sector ) | |
0 | 769 return 1; |
1615 | 770 //search starts from monster |
771 current_sector = obj1_sector; | |
772 for( int current_portal = 0; current_portal < pIndoor->pSectors[current_sector].uNumPortals; current_portal++ ) | |
773 { | |
774 v29 = &pIndoor->pFaces[pIndoor->pSectors[current_sector].pPortals[current_portal]]; | |
775 v30 = &pIndoor->pVertices[*v29->pVertexIDs]; | |
776 v31 = v29->pFacePlane_old.vNormal.z * (v30->z - obj1_z) | |
777 + v29->pFacePlane_old.vNormal.y * (v30->y - obj1_y) | |
778 + v29->pFacePlane_old.vNormal.x * (v30->x - obj1_x); | |
779 | |
780 if ( current_sector != v29->uSectorID ) | |
781 v31 = -v31; | |
782 | |
783 if ( v31 >= 0 && v30->x != obj1_x && v30->y != obj1_y && v30->z != obj1_z) | |
784 continue; | |
785 | |
786 if( lower_x > v29->pBounding.x2 | |
787 || higher_x < v29->pBounding.x1 | |
788 || lower_y > v29->pBounding.y2 | |
789 || higher_y < v29->pBounding.y1 | |
790 || lower_z > v29->pBounding.z2 | |
791 || higher_z < v29->pBounding.z1 ) | |
792 { | |
793 continue; | |
794 } | |
795 | |
1643 | 796 v32 = fixpoint_mul(v29->pFacePlane_old.vNormal.x,v49); |
797 v33 = fixpoint_mul(v29->pFacePlane_old.vNormal.z,v47); | |
798 v34 = fixpoint_mul(v29->pFacePlane_old.vNormal.y,v48); | |
1615 | 799 v59 = v32 + v33 + v34; |
800 if ( v59 ) | |
1493 | 801 { |
1615 | 802 v70 = v29->pFacePlane_old.dist |
803 + obj1_z * v29->pFacePlane_old.vNormal.z | |
804 + obj1_x * v29->pFacePlane_old.vNormal.x | |
805 + obj1_y * v29->pFacePlane_old.vNormal.y; | |
806 v38 = -v70; | |
807 | |
808 // if ( v59 <= 0 ^ v70 <= 0 ) | |
809 | |
810 /* TEMPORARY | |
811 if ( v59 <= 0 && v70 <= 0 ) | |
812 { | |
813 continue; | |
814 } | |
815 if ( !(v59 <= 0 && v70 <= 0) ) | |
816 { | |
817 continue; | |
818 } | |
819 */ | |
820 | |
821 if( abs(v38) >> 14 > abs(v59) ) | |
822 continue; | |
823 | |
1643 | 824 v58 = fixpoint_div(v38,v59); |
1615 | 825 |
826 if( v58 < 0 ) | |
2114 | 827 continue; |
1493 | 828 |
2114 | 829 if(!sub_4075DB(obj1_x + ((fixpoint_mul(v49,v58) + 32768) >> 16), obj1_y + ((fixpoint_mul(v48,v58) + 32768) >> 16), |
830 obj1_z + ((fixpoint_mul(v47,v58) + 32768) >> 16), v29) ) | |
1615 | 831 { |
1616 | 832 continue; |
1615 | 833 } |
834 | |
835 //if there is no next sector turn back | |
836 if ( v29->uSectorID == current_sector ) | |
837 next_sector = v29->uBackSectorID; | |
838 else | |
839 next_sector = v29->uSectorID; | |
840 | |
841 //no more portals, quit | |
842 if ( next_sector == current_sector ) | |
2114 | 843 break; |
1615 | 844 |
845 ++sectors_visited; | |
846 current_sector = next_sector; | |
847 | |
848 //found player, quit | |
849 if ( next_sector == obj2_sector ) | |
850 return 1; | |
851 | |
852 current_sector = next_sector; | |
853 | |
854 //did we hit limit for portals? | |
855 //does the next room have portals? | |
856 if ( sectors_visited < 30 && pIndoor->pSectors[current_sector].uNumPortals > 0) | |
857 { | |
858 current_portal=-1; | |
859 continue; | |
860 } | |
861 else | |
862 break; | |
863 } | |
864 } | |
865 //did we stop in the sector where player is? | |
866 if ( current_sector != obj2_sector ) | |
0 | 867 return 0; |
868 return 1; | |
869 } | |
870 | |
871 //----- (004075DB) -------------------------------------------------------- | |
2114 | 872 bool __fastcall sub_4075DB(int x, int y, int z, BLVFace *face) |
0 | 873 { |
874 int v8; // edi@2 | |
875 signed int v25; // eax@22 | |
876 bool result; // eax@25 | |
877 signed int a3a; // [sp+24h] [bp+8h]@14 | |
878 int a4a; // [sp+28h] [bp+Ch]@2 | |
879 | |
2000 | 880 std::array<int, 52> dword_4F5CC8_ys; // idb |
881 std::array<int, 52> dword_4F5D98_xs; // idb | |
882 | |
1493 | 883 //__debugbreak(); |
1458 | 884 |
2114 | 885 if ( face->uAttributes & FACE_XY_PLANE ) |
0 | 886 { |
1616 | 887 a4a = x; |
888 v8 = y; | |
2114 | 889 for(int i = 0; i < face->uNumVertices; i++) |
1471 | 890 { |
2114 | 891 dword_4F5D98_xs[i] = pIndoor->pVertices[face->pVertexIDs[i]].x; |
892 dword_4F5CC8_ys[i] = pIndoor->pVertices[face->pVertexIDs[i]].y; | |
1471 | 893 } |
0 | 894 } |
895 else | |
896 { | |
1616 | 897 v8 = z; |
2114 | 898 if ( face->uAttributes & FACE_XZ_PLANE ) |
0 | 899 { |
1616 | 900 a4a = x; |
2114 | 901 for(int i = 0; i < face->uNumVertices; i++) |
1471 | 902 { |
2114 | 903 dword_4F5D98_xs[i] = pIndoor->pVertices[face->pVertexIDs[i]].x; |
904 dword_4F5CC8_ys[i] = pIndoor->pVertices[face->pVertexIDs[i]].z; | |
1471 | 905 } |
0 | 906 } |
907 else | |
908 { | |
1616 | 909 a4a = y; |
2114 | 910 for(int i = 0; i < face->uNumVertices; i++) |
1471 | 911 { |
2114 | 912 dword_4F5D98_xs[i] = pIndoor->pVertices[face->pVertexIDs[i]].y; |
913 dword_4F5CC8_ys[i] = pIndoor->pVertices[face->pVertexIDs[i]].z; | |
1471 | 914 } |
0 | 915 } |
916 } | |
917 a3a = 0; | |
2114 | 918 dword_4F5D98_xs[face->uNumVertices] = dword_4F5D98_xs[0]; |
919 dword_4F5CC8_ys[face->uNumVertices] = dword_4F5CC8_ys[0]; | |
920 for(int i = 0; i < face->uNumVertices && a3a < 2; i++) | |
0 | 921 { |
1615 | 922 if ( dword_4F5CC8_ys[i] >= v8 ^ (dword_4F5CC8_ys[i + 1] >= v8) ) |
0 | 923 { |
1615 | 924 //if( dword_4F5D98_xs[i + 1] >= a4a || dword_4F5D98_xs[i] >= a4a) |
925 if( !(dword_4F5D98_xs[i + 1] >= a4a && dword_4F5D98_xs[i] < a4a)) | |
0 | 926 { |
1615 | 927 if ( (dword_4F5D98_xs[i + 1] < a4a && dword_4F5D98_xs[i] >= a4a) ) |
928 ++a3a; | |
929 //|| (v25 = dword_4F5D98_xs[i + 1] - dword_4F5D98_xs[i],LODWORD(v26) = v25 << 16, HIDWORD(v26) = v25 >> 16, | |
930 //dword_4F5D98_xs[i] + ((signed int)(((unsigned __int64)(v26 / (dword_4F5CC4_ys[i + 2] - dword_4F5CC4_ys[i + 1])* ((v8 - dword_4F5CC4_ys[i + 1]) << 16)) >> 16) | |
931 // + 32768) >> 16) >= a4a) ) | |
932 else | |
933 { | |
1643 | 934 v25 = fixpoint_div(dword_4F5D98_xs[i + 1] - dword_4F5D98_xs[i], dword_4F5CC8_ys[i + 1] - dword_4F5CC8_ys[i]); |
2114 | 935 if( dword_4F5D98_xs[i] + (fixpoint_mul(v25, (v8 - dword_4F5CC8_ys[i]) << 16) + 0x8000 >> 16) >= a4a) |
1615 | 936 ++a3a; |
937 } | |
0 | 938 } |
939 } | |
940 } | |
941 result = 1; | |
942 if ( a3a != 1 ) | |
943 result = 0; | |
944 return result; | |
945 } | |
946 | |
947 //----- (004077F1) -------------------------------------------------------- | |
2114 | 948 bool __fastcall sub_4077F1(int a1, int a2, int a3, ODMFace *face, BSPVertexBuffer *a5) |
0 | 949 { |
950 int a4a; // [sp+28h] [bp+Ch]@2 | |
951 signed int a5a; // [sp+2Ch] [bp+10h]@14 | |
952 | |
2000 | 953 std::array<int, 52> dword_4F5B24_ys; // idb |
954 std::array<int, 52> dword_4F5BF4_xs; // idb | |
2114 | 955 |
2057 | 956 //__debugbreak(); //срабатывает при нападении стрекозавров с огнём |
1458 | 957 |
2114 | 958 if ( face->uAttributes & FACE_XY_PLANE ) |
0 | 959 { |
960 a4a = a1; | |
961 a3 = a2; | |
2114 | 962 for(int i = 0; i < face->uNumVertices; i++) |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
963 { |
2114 | 964 dword_4F5BF4_xs[i+1] = a5->pVertices[face->pVertexIDs[i]].x; |
965 dword_4F5B24_ys[i+1] = a5->pVertices[face->pVertexIDs[i]].y; | |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
966 } |
0 | 967 } |
968 else | |
969 { | |
2114 | 970 if ( face->uAttributes & FACE_XY_PLANE ) |
0 | 971 { |
972 a4a = a1; | |
2114 | 973 for(int i = 0; i < face->uNumVertices; i++) |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
974 { |
2114 | 975 dword_4F5BF4_xs[i+1] = a5->pVertices[face->pVertexIDs[i]].x; |
976 dword_4F5B24_ys[i+1] = a5->pVertices[face->pVertexIDs[i]].z; | |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
977 } |
0 | 978 } |
979 else | |
980 { | |
981 a4a = a2; | |
2114 | 982 for(int i = 0; i < face->uNumVertices; i++) |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
983 { |
2114 | 984 dword_4F5BF4_xs[i+1] = a5->pVertices[face->pVertexIDs[i]].y; |
985 dword_4F5B24_ys[i+1] = a5->pVertices[face->pVertexIDs[i]].z; | |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
986 } |
0 | 987 } |
988 } | |
989 a5a = 0; | |
2114 | 990 dword_4F5BF4_xs[face->uNumVertices + 1] = dword_4F5BF4_xs[1]; |
991 dword_4F5B24_ys[face->uNumVertices + 1] = dword_4F5B24_ys[1]; | |
992 for(int i = 0; i < face->uNumVertices; i++) | |
0 | 993 { |
994 if ( a5a >= 2 ) | |
995 break; | |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
996 if ( dword_4F5B24_ys[i + 1] >= a3 ^ (dword_4F5B24_ys[i + 2] >= a3) ) |
0 | 997 { |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
998 if( dword_4F5BF4_xs[i + 2] >= a4a || dword_4F5BF4_xs[i] >= a4a) |
0 | 999 { |
1545 | 1000 if (dword_4F5BF4_xs[i + 2] >= a4a && dword_4F5BF4_xs[i + 1] >= a4a) |
1001 ++a5a; | |
1002 else | |
1003 { | |
2114 | 1004 //v23 = (__int64)(dword_4F5BF4_xs[i + 2] - dword_4F5BF4_xs[i + 1]) << 16; |
1545 | 1005 __int64 _a = dword_4F5B24_ys[i + 2] - dword_4F5B24_ys[i + 1]; |
1006 __int64 _b = (__int64)(a3 - dword_4F5B24_ys[i + 1]) << 16; | |
1007 | |
2114 | 1008 if (dword_4F5BF4_xs[i + 1] + ((((((__int64)(dword_4F5BF4_xs[i + 2] - dword_4F5BF4_xs[i + 1]) << 16) / _a * _b) >> 16) + 0x8000) >> 16) >= a4a) |
1545 | 1009 ++a5a; |
1010 } | |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
1011 } |
0 | 1012 } |
1013 } | |
1545 | 1014 |
0 | 1015 if ( a5a != 1 ) |
1545 | 1016 return false; |
1017 return true; | |
1472
2395e99b89d0
sub_4077F1 cleaned, and fixed previous mistake in cleaning
zipi
parents:
1471
diff
changeset
|
1018 |
0 | 1019 } |
1020 | |
1021 //----- (004088E9) -------------------------------------------------------- | |
1459 | 1022 int __fastcall sub_4088E9(int x1, int y1, int x2, int y2, int x3, int y3) |
0 | 1023 { |
1024 signed int result; // eax@1 | |
1025 | |
2114 | 1026 result = integer_sqrt(abs(x2 - x1) * abs(x2 - x1) + abs(y2 - y1) * abs(y2 - y1)); |
0 | 1027 if ( result ) |
1459 | 1028 result = abs(((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / result); |
0 | 1029 return result; |
1030 } | |
1031 | |
1032 //----- (0040F82D) -------------------------------------------------------- | |
1033 void __fastcall ZBuffer_Fill(int *pZBuffer, int uTextureId, int iZValue) | |
1034 { | |
973 | 1035 assert(uTextureId != -1); |
1036 ZBuffer_DoFill(pZBuffer, pIcons_LOD->GetTexture(uTextureId), iZValue); | |
0 | 1037 } |
1038 | |
1039 //----- (0040F89C) -------------------------------------------------------- | |
1040 void __fastcall ZBuffer_DoFill(int *pZBuffer, Texture *pTex, int uZValue) | |
2114 | 1041 {//срабатывает при продаже в магазине |
0 | 1042 void *v3; // eax@3 |
2114 | 1043 //void *v4; // esi@5 |
1044 //int *v5; // edi@5 | |
1045 //int v6; // eax@5 | |
0 | 1046 int v7; // ecx@6 |
1047 int v11; // [sp+18h] [bp-8h]@1 | |
2114 | 1048 //void *v12; // [sp+1Ch] [bp-4h]@5 |
0 | 1049 |
1050 if ( pIcons_LOD->dword_011BA4 && pTex->uDecompressedSize ) | |
1051 v3 = pTex->UnzipPalette(); | |
1052 else | |
710 | 1053 v3 = pTex->pLevelOfDetail0_prolly_alpha_mask; |
2114 | 1054 //v12 = v3; |
1055 //v4 = v3; | |
1056 //v5 = pZBuffer; | |
1057 //v6 = 0; | |
1058 for ( uint i = 0; i < pTex->uTextureHeight; i++ ) | |
0 | 1059 { |
2114 | 1060 for ( uint j = 0; j < pTex->uTextureWidth; j++ ) |
0 | 1061 { |
2114 | 1062 //LOBYTE(v6) = *(char *)v4; |
1063 //v4 = (char *)v4 + 1; | |
1064 //if ( v6 ) | |
1065 *pZBuffer = uZValue; | |
1066 ++pZBuffer; | |
0 | 1067 } |
2215
e9625ad08541
fog fix and change 640,480 - window->GetWidth(), window->GetHeight()
Ritor1
parents:
2207
diff
changeset
|
1068 pZBuffer += window->GetWidth() - pTex->uTextureWidth; |
0 | 1069 } |
1070 if ( pIcons_LOD->dword_011BA4 ) | |
1071 { | |
2114 | 1072 if ( pTex->uDecompressedSize ) |
1073 free(v3); | |
0 | 1074 } |
1075 } | |
1076 | |
1077 //----- (0040F92A) -------------------------------------------------------- | |
1458 | 1078 void __fastcall ZBuffer_DoFill2(int *pZBuffer, Texture *a2, int a3) |
2114 | 1079 {//срабатывает в покупке в магазине |
0 | 1080 void *v4; // eax@3 |
2114 | 1081 //int *v5; // edi@5 |
0 | 1082 int v6; // ecx@6 |
1083 int v9; // [sp+18h] [bp-4h]@1 | |
1084 | |
1085 if ( pIcons_LOD->dword_011BA4 && a2->uDecompressedSize ) | |
1086 v4 = a2->UnzipPalette(); | |
1087 else | |
710 | 1088 v4 = a2->pLevelOfDetail0_prolly_alpha_mask; |
2114 | 1089 //v5 = pZBuffer; |
1090 for ( uint i = 0; i < a2->uTextureHeight; i++ ) | |
0 | 1091 { |
2114 | 1092 for ( uint j = 0; j < a2->uTextureWidth; j++ ) |
0 | 1093 { |
2114 | 1094 *pZBuffer = a3; |
1095 ++pZBuffer; | |
0 | 1096 } |
2215
e9625ad08541
fog fix and change 640,480 - window->GetWidth(), window->GetHeight()
Ritor1
parents:
2207
diff
changeset
|
1097 pZBuffer += window->GetWidth() - a2->uTextureWidth; |
0 | 1098 } |
1099 if ( pIcons_LOD->dword_011BA4 ) | |
1100 { | |
2114 | 1101 if ( a2->uDecompressedSize ) |
0 | 1102 free(v4); |
1103 } | |
1104 } | |
1105 | |
1106 //----- (00410D99) -------------------------------------------------------- | |
1458 | 1107 int __fastcall sub_410D99_get_map_index(int a1) |
0 | 1108 { |
1109 int v1; // edi@1 | |
1110 signed int v2; // ebp@1 | |
1111 const char **v3; // esi@2 | |
1112 char *v4; // ebx@2 | |
1113 | |
2114 | 1114 __debugbreak();//Ritor1 |
0 | 1115 v1 = a1; |
1116 v2 = 1; | |
1104 | 1117 if ( _stricmp(pMapStats->pInfos[1].pFilename, (const char *)&pGames_LOD->pSubIndices[a1]) ) |
0 | 1118 { |
1119 v3 = (const char **)&pMapStats->pInfos[1].pFilename; | |
1120 v4 = (char *)&pMapStats->pInfos[1].pFilename; | |
1121 do | |
1122 { | |
1123 if ( !*(int *)v4 ) | |
1124 break; | |
1125 v3 += 17; | |
1126 ++v2; | |
1127 v4 = (char *)v3; | |
1128 } | |
1104 | 1129 while ( _stricmp(*v3, (const char *)&pGames_LOD->pSubIndices[v1]) ); |
0 | 1130 } |
1131 return v2; | |
1132 } | |
1133 | |
1134 // 4E28F8: using guessed type int pCurrentScreen; | |
1135 | |
1136 //----- (00417AD4) -------------------------------------------------------- | |
983 | 1137 unsigned int GetSkillColor(unsigned int uPlayerClass, PLAYER_SKILL_TYPE uPlayerSkillType, signed int skill_level) |
1393 | 1138 { |
1139 switch (uPlayerClass % 4) | |
269 | 1140 { |
1393 | 1141 case 0: |
269 | 1142 { |
1393 | 1143 if (byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass][uPlayerSkillType] >= skill_level) |
1144 return ui_character_skillinfo_can_learn; | |
1145 if (byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 1][uPlayerSkillType] < skill_level && | |
1146 byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 2][uPlayerSkillType] < skill_level) | |
1147 { | |
1148 if (byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 3][uPlayerSkillType] < skill_level) | |
1149 return ui_character_skillinfo_cant_learn; | |
1150 } | |
1151 return ui_character_skillinfo_can_learn_gm; | |
0 | 1152 } |
1393 | 1153 break; |
1154 | |
1155 case 1: | |
269 | 1156 { |
1393 | 1157 if (byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass][uPlayerSkillType] >= skill_level) |
1158 return ui_character_skillinfo_can_learn; | |
1159 if (byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 1][uPlayerSkillType] < skill_level) | |
1160 { | |
1161 if (byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass + 2][uPlayerSkillType] < skill_level) | |
1162 return ui_character_skillinfo_cant_learn; | |
1163 } | |
1164 return ui_character_skillinfo_can_learn_gm; | |
0 | 1165 } |
1393 | 1166 break; |
1167 | |
1168 case 2: | |
1169 case 3: | |
1170 { | |
1171 if (byte_4ED970_skill_learn_ability_by_class_table[uPlayerClass][uPlayerSkillType] < skill_level) | |
1172 return ui_character_skillinfo_cant_learn; | |
1173 return ui_character_skillinfo_can_learn; | |
1174 } | |
1175 break; | |
0 | 1176 } |
1575 | 1177 Error("Invalid player class: %u", uPlayerClass); |
1296 | 1178 } |