1
0
Fork 0
mirror of https://git.rip/DMCA_FUCKER/re3.git synced 2024-07-01 14:03:46 +00:00

Merge pull request #3 from GTAmodding/lcs

syncing lcs with original repo
This commit is contained in:
Michael 2021-01-09 07:36:44 -08:00 committed by GitHub
commit 5a5f06ef2a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
60 changed files with 3038 additions and 1323 deletions

View file

@ -117,8 +117,8 @@ GetModelFromName(const char *name)
char playername[32]; char playername[32];
if(strncasecmp(name, "CSplay", 6) == 0 && if(strncasecmp(name, "CSplay", 6) == 0 &&
strncasecmp(CModelInfo::GetModelInfo(MI_PLAYER)->GetName(), "ig", 2) == 0){ strncasecmp(CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName(), "ig", 2) == 0){
strcpy(playername, CModelInfo::GetModelInfo(MI_PLAYER)->GetName()); strcpy(playername, CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName());
playername[0] = 'C'; playername[0] = 'C';
playername[1] = 'S'; playername[1] = 'S';
name = playername; name = playername;
@ -127,7 +127,7 @@ GetModelFromName(const char *name)
for(i = 0; i < MODELINFOSIZE; i++){ for(i = 0; i < MODELINFOSIZE; i++){
mi = CModelInfo::GetModelInfo(i); mi = CModelInfo::GetModelInfo(i);
if(mi && mi->GetRwObject() && RwObjectGetType(mi->GetRwObject()) == rpCLUMP && if(mi && mi->GetRwObject() && RwObjectGetType(mi->GetRwObject()) == rpCLUMP &&
strcmpIgnoringDigits(mi->GetName(), name)) strcmpIgnoringDigits(mi->GetModelName(), name))
return mi; return mi;
} }
return nil; return nil;
@ -149,7 +149,7 @@ CAnimBlendAssocGroup::CreateAssociations(const char *name)
CAnimBlendHierarchy *anim = CAnimManager::GetAnimation(animBlock->firstIndex + i); CAnimBlendHierarchy *anim = CAnimManager::GetAnimation(animBlock->firstIndex + i);
CBaseModelInfo *model = GetModelFromName(anim->name); CBaseModelInfo *model = GetModelFromName(anim->name);
if(model){ if(model){
debug("Associated anim %s with model %s\n", anim->name, model->GetName()); debug("Associated anim %s with model %s\n", anim->name, model->GetModelName());
RpClump *clump = (RpClump*)model->CreateInstance(); RpClump *clump = (RpClump*)model->CreateInstance();
RpAnimBlendClumpInit(clump); RpAnimBlendClumpInit(clump);
assocList[i].Init(clump, anim); assocList[i].Init(clump, anim);

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,7 @@ enum AssocGroupId
ASSOCGRP_SNIPER, ASSOCGRP_SNIPER,
ASSOCGRP_THROW, ASSOCGRP_THROW,
ASSOCGRP_FLAMETHROWER, ASSOCGRP_FLAMETHROWER,
ASSOCGRP_ROCKETLAUNCHER,
ASSOCGRP_MEDIC, ASSOCGRP_MEDIC,
ASSOCGRP_SUNBATHE, ASSOCGRP_SUNBATHE,
ASSOCGRP_PLAYER_IDLE, ASSOCGRP_PLAYER_IDLE,
@ -40,6 +41,7 @@ enum AssocGroupId
ASSOCGRP_PLAYER1ARMED, ASSOCGRP_PLAYER1ARMED,
ASSOCGRP_PLAYER2ARMED, ASSOCGRP_PLAYER2ARMED,
ASSOCGRP_PLAYERBBBAT, ASSOCGRP_PLAYERBBBAT,
ASSOCGRP_AICHAINSAW,
ASSOCGRP_PLAYERCHAINSAW, ASSOCGRP_PLAYERCHAINSAW,
ASSOCGRP_SHUFFLE, ASSOCGRP_SHUFFLE,
ASSOCGRP_OLD, ASSOCGRP_OLD,
@ -64,11 +66,33 @@ enum AssocGroupId
ASSOCGRP_ROCKETBACK, ASSOCGRP_ROCKETBACK,
ASSOCGRP_ROCKETLEFT, ASSOCGRP_ROCKETLEFT,
ASSOCGRP_ROCKETRIGHT, ASSOCGRP_ROCKETRIGHT,
ASSOCGRP_CHAINSAWBACK,
ASSOCGRP_CHAINSAWLEFT,
ASSOCGRP_CHAINSAWRIGHT,
#endif #endif
ASSOCGRP_MPNOTE,
ASSOCGRP_CSMISC,
ASSOCGRP_DONH2,
ASSOCGRP_DONH3,
ASSOCGRP_JDT2,
ASSOCGRP_JDT4,
ASSOCGRP_JDT5,
ASSOCGRP_JDT6,
ASSOCGRP_MAR1,
ASSOCGRP_MAR2,
ASSOCGRP_MAR3,
ASSOCGRP_SAL1,
ASSOCGRP_SAL2,
ASSOCGRP_SAL3,
ASSOCGRP_SAL4,
ASSOCGRP_SAL6,
ASSOCGRP_SAL7,
ASSOCGRP_VIC2,
ASSOCGRP_VIC3,
ASSOCGRP_VIC4,
ASSOCGRP_VIC6,
ASSOCGRP_TOURIST,
ASSOCGRP_MAC2,
ASSOCGRP_VIC7,
NUM_ANIM_ASSOC_GROUPS NUM_ANIM_ASSOC_GROUPS
}; };

View file

@ -40,32 +40,25 @@ enum AnimationId
ANIM_HIT_BACK, ANIM_HIT_BACK,
ANIM_HIT_RIGHT, ANIM_HIT_RIGHT,
ANIM_FLOOR_HIT, ANIM_FLOOR_HIT,
ANIM_HIT_BODYBLOW,
ANIM_HIT_CHEST,
ANIM_HIT_HEAD,
ANIM_HIT_WALK,
ANIM_HIT_WALL, ANIM_HIT_WALL,
ANIM_FLOOR_HIT_F, ANIM_FLOOR_HIT_F,
ANIM_HIT_BEHIND, ANIM_HIT_BEHIND,
ANIM_FIGHT_IDLE, ANIM_FIGHT_IDLE,
ANIM_FIGHT2_IDLE, ANIM_FIGHT2_IDLE,
ANIM_FIGHT_SH_F, ANIM_FIGHT_SH_F,
ANIM_FIGHT_BODYBLOW,
ANIM_FIGHT_HEAD,
ANIM_FIGHT_KICK,
ANIM_FIGHT_KNEE,
ANIM_FIGHT_LHOOK,
ANIM_FIGHT_PUNCH,
ANIM_FIGHT_ROUNDHOUSE,
ANIM_FIGHT_LONGKICK,
ANIM_FIGHT_PPUNCH, ANIM_FIGHT_PPUNCH,
ANIM_L_HOOK,
ANIM_FIGHT_JAB, ANIM_R_HOOK,
ANIM_FIGHT_ELBOW_L, ANIM_UPPERCUT,
ANIM_FIGHT_ELBOW_R, ANIM_HEADBUTT,
ANIM_FIGHT_BKICK_L, ANIM_FRONTKICK,
ANIM_FIGHT_BKICK_R, ANIM_ROUNDHOUSE,
ANIM_HIT_L_HOOK,
ANIM_HIT_R_HOOK,
ANIM_HIT_UPPERCUT,
ANIM_HIT_HEADBUTT,
ANIM_HIT_FRONTKICK,
ANIM_HIT_RHOUSE,
ANIM_BOMBER, ANIM_BOMBER,
ANIM_PUNCH_R, ANIM_PUNCH_R,
ANIM_FIGHT_PPUNCH2, ANIM_FIGHT_PPUNCH2,
@ -140,8 +133,8 @@ enum AnimationId
ANIM_CAR_CLOSE_RHS, ANIM_CAR_CLOSE_RHS,
ANIM_CAR_HOOKERTALK, ANIM_CAR_HOOKERTALK,
ANIM_IDLE_STANCE2, ANIM_TRAIN_GETIN,
ANIM_IDLE_STANCE3, ANIM_TRAIN_GETOUT,
ANIM_CAR_CRAWLOUT_RHS, ANIM_CAR_CRAWLOUT_RHS,
ANIM_CAR_CRAWLOUT_RHS2, ANIM_CAR_CRAWLOUT_RHS2,
@ -164,6 +157,7 @@ enum AnimationId
ANIM_EV_STEP, ANIM_EV_STEP,
ANIM_EV_DIVE, ANIM_EV_DIVE,
ANIM_COMMANDO_ROLL,
ANIM_XPRESS_SCRATCH, ANIM_XPRESS_SCRATCH,
ANIM_ROAD_CROSS, ANIM_ROAD_CROSS,
ANIM_TURN_180, ANIM_TURN_180,
@ -269,5 +263,66 @@ enum AnimationId
ANIM_STRIP_F, ANIM_STRIP_F,
ANIM_STRIP_G, ANIM_STRIP_G,
ANIM_MPNOTE,
ANIM_MPNOTE_LOOP,
ANIM_IDLE_LOOK,
ANIM_IDLE_NO,
ANIM_IDLE_YES,
ANIM_IDLE_CHAT2,
ANIM_IDLE_COUGH,
ANIM_IDLE_GIGGLE_FEMALE,
ANIM_IDLE_TOUGH_CHAT,
ANIM_IDLE_CELL_TALK,
ANIM_DONH2_CAMERA,
ANIM_DONH3_HAPPY,
ANIM_JDT2_ANXIOUS_TALK,
ANIM_JDT2_SHRUG,
ANIM_JDT4_DILDO_TALK,
ANIM_JDT5_CALM_DOWN,
ANIM_JDT5_POINT,
ANIM_JDT6_PICKUP,
ANIM_JDT6_DOORKNOCK,
ANIM_MAR1_SKIRT,
ANIM_MAR2_CELL_ANSWER,
ANIM_MAR2_CELL_END,
ANIM_MAR2_CELL_TALK,
ANIM_MAR2_FOOT_TAP,
ANIM_MAR3_HOOCHY,
ANIM_MAR3_NOTE_IDLE,
ANIM_MAR3_NOTE_PICK,
ANIM_SAL1_BIREFCASE_DOWN,
ANIM_SAL2_IDLE_SEATED,
ANIM_SAL2_SEAT_TO_STAND,
ANIM_SAL3_SEATED_TALK,
ANIM_SAL3_SEATED_IDLE,
ANIM_SAL3_SIT_DOWN,
ANIM_SAL4_DUSTDOWN,
ANIM_SAL4_GIRLRUN,
ANIM_SAL6_ANGRY_SEATED,
ANIM_SAL6_IDLE_SEATED,
ANIM_SAL7_LOOKOUT,
ANIM_VIC2_POINT_ANGRY,
ANIM_VIC3_WAFT,
ANIM_VIC3_PICKUP_ROLL,
ANIM_VIC4_CARRY_BOX,
ANIM_VIC4_CELL_LOOK,
ANIM_VIC4_CRATE_IDLE,
ANIM_VIC6_CELL_ANGRY,
ANIM_TOURIST3,
ANIM_TOURIST2,
ANIM_TOURIST1,
ANIM_MAC2_PLEAD,
ANIM_VIC7_PROD_WITH_FOOT,
NUM_ANIMS NUM_ANIMS
}; };

View file

@ -383,7 +383,7 @@ CCutsceneMgr::CreateCutsceneObject(int modelId)
CCutsceneObject *pCutsceneObject; CCutsceneObject *pCutsceneObject;
CStreaming::ImGonnaUseStreamingMemory(); CStreaming::ImGonnaUseStreamingMemory();
debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetName()); debug("Created cutscene object %s\n", CModelInfo::GetModelInfo(modelId)->GetModelName());
if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) { if (modelId >= MI_CUTOBJ01 && modelId <= MI_CUTOBJ05) {
pModelInfo = CModelInfo::GetModelInfo(modelId); pModelInfo = CModelInfo::GetModelInfo(modelId);
pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01]; pColModel = &CTempColModels::ms_colModelCutObj[modelId - MI_CUTOBJ01];
@ -569,7 +569,7 @@ CCutsceneMgr::AttachObjectToParent(CObject *pObject, CEntity *pAttachTo)
((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil;
((CCutsceneObject*)pObject)->m_pAttachTo = RpClumpGetFrame(pAttachTo->GetClump()); ((CCutsceneObject*)pObject)->m_pAttachTo = RpClumpGetFrame(pAttachTo->GetClump());
debug("Attach %s to %s\n", CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetName()); debug("Attach %s to %s\n", CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(), CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName());
} }
void void
@ -578,9 +578,9 @@ CCutsceneMgr::AttachObjectToFrame(CObject *pObject, CEntity *pAttachTo, const ch
((CCutsceneObject*)pObject)->m_pAttachmentObject = nil; ((CCutsceneObject*)pObject)->m_pAttachmentObject = nil;
((CCutsceneObject*)pObject)->m_pAttachTo = RpAnimBlendClumpFindFrame(pAttachTo->GetClump(), frame)->frame; ((CCutsceneObject*)pObject)->m_pAttachTo = RpAnimBlendClumpFindFrame(pAttachTo->GetClump(), frame)->frame;
debug("Attach %s to component %s of %s\n", debug("Attach %s to component %s of %s\n",
CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetName(), CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(),
frame, frame,
CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetName()); CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName());
if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) { if (RwObjectGetType(pObject->m_rwObject) == rpCLUMP) {
RpClump *clump = (RpClump*)pObject->m_rwObject; RpClump *clump = (RpClump*)pObject->m_rwObject;
if (IsClumpSkinned(clump)) if (IsClumpSkinned(clump))
@ -597,8 +597,8 @@ CCutsceneMgr::AttachObjectToBone(CObject *pObject, CObject *pAttachTo, int bone)
((CCutsceneObject*)pObject)->m_pAttachmentObject = pAttachTo; ((CCutsceneObject*)pObject)->m_pAttachmentObject = pAttachTo;
((CCutsceneObject*)pObject)->m_pAttachTo = &matrixArray[id]; ((CCutsceneObject*)pObject)->m_pAttachTo = &matrixArray[id];
debug("Attach %s to %s\n", debug("Attach %s to %s\n",
CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetName(), CModelInfo::GetModelInfo(pObject->GetModelIndex())->GetModelName(),
CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetName()); CModelInfo::GetModelInfo(pAttachTo->GetModelIndex())->GetModelName());
} }
void void

View file

@ -4363,14 +4363,18 @@ cAudioManager::ProcessPedOneShots(cPedParams &params)
if (weaponType == WEAPONTYPE_BRASSKNUCKLE) { if (weaponType == WEAPONTYPE_BRASSKNUCKLE) {
CPed* ped = params.m_pPed; CPed* ped = params.m_pPed;
uint32 fightMove = ped->m_curFightMove; uint32 fightMove = ped->m_curFightMove;
if (fightMove == FIGHTMOVE_BACKLEFT || fightMove == FIGHTMOVE_STDPUNCH || fightMove == FIGHTMOVE_PUNCH || // LCS:removed for now
//if (fightMove == FIGHTMOVE_BACKLEFT || fightMove == FIGHTMOVE_STDPUNCH || fightMove == FIGHTMOVE_PUNCH ||
if (
ped->m_nPedState == PED_ATTACK) { ped->m_nPedState == PED_ATTACK) {
CEntity* damageEntity = ped->m_pDamageEntity; CEntity* damageEntity = ped->m_pDamageEntity;
if (!damageEntity) if (!damageEntity)
m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1; m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1;
else if (damageEntity->GetType() != ENTITY_TYPE_PED) else if (damageEntity->GetType() != ENTITY_TYPE_PED)
m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1; m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1;
else if (((CPed*)damageEntity)->m_curFightMove != FIGHTMOVE_HITHEAD) // LCS:removed for now
//else if (((CPed*)damageEntity)->m_curFightMove != FIGHTMOVE_HITHEAD)
else if(1)
m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1; m_sQueueSample.m_nSampleIndex = m_anRandomTable[3] % 2 + SFX_HAMMER_HIT_1;
else else
m_sQueueSample.m_nSampleIndex = SFX_HAMMER_HIT_1; m_sQueueSample.m_nSampleIndex = SFX_HAMMER_HIT_1;

View file

@ -466,7 +466,7 @@ public:
void ProcessScriptObject(int32 id); // done void ProcessScriptObject(int32 id); // done
void ProcessSpecial(); // done void ProcessSpecial(); // done
#ifdef GTA_TRAIN #ifdef GTA_TRAIN
bool ProcessTrainNoise(cVehicleParams *params); //done(bcs not exists in VC) bool ProcessTrainNoise(cVehicleParams &params); //done(bcs not exists in VC)
#endif #endif
void ProcessVehicle(CVehicle *vehicle); // done void ProcessVehicle(CVehicle *vehicle); // done
bool ProcessVehicleDoors(cVehicleParams &params); // done bool ProcessVehicleDoors(cVehicleParams &params); // done

View file

@ -814,4 +814,8 @@ enum eSfxSample
SAMPLEBANK_PED_START = SFX_FOOTSTEP_SAND_4 + 1, SAMPLEBANK_PED_START = SFX_FOOTSTEP_SAND_4 + 1,
SAMPLEBANK_PED_END = 9940, SAMPLEBANK_PED_END = 9940,
SAMPLEBANK_PED_MAX = SAMPLEBANK_PED_END + 1, SAMPLEBANK_PED_MAX = SAMPLEBANK_PED_END + 1,
// LCS: TODO
SFX_TRAIN_FAR = NO_SAMPLE,
SFX_TRAIN_NEAR = NO_SAMPLE,
}; };

View file

@ -33,6 +33,7 @@ public:
static void RequestCollision(const CVector2D &pos); static void RequestCollision(const CVector2D &pos);
static void EnsureCollisionIsInMemory(const CVector2D &pos); static void EnsureCollisionIsInMemory(const CVector2D &pos);
static bool HasCollisionLoaded(const CVector2D &pos); static bool HasCollisionLoaded(const CVector2D &pos);
static bool HasCollisionLoaded(eLevelName level) { return true; }; // TODO
static ColDef *GetSlot(int slot) { static ColDef *GetSlot(int slot) {
assert(slot >= 0); assert(slot >= 0);

View file

@ -4,6 +4,7 @@
#include "Accident.h" #include "Accident.h"
#include "AutoPilot.h" #include "AutoPilot.h"
#include "Bridge.h"
#include "CarCtrl.h" #include "CarCtrl.h"
#include "General.h" #include "General.h"
#include "HandlingMgr.h" #include "HandlingMgr.h"
@ -74,6 +75,18 @@ void CCarAI::UpdateCarAI(CVehicle* pVehicle)
case STATUS_PLAYER_DISABLED: case STATUS_PLAYER_DISABLED:
break; break;
case STATUS_SIMPLE: case STATUS_SIMPLE:
{
if (pVehicle->m_pCurGroundEntity && CBridge::ThisIsABridgeObjectMovingUp(pVehicle->m_pCurGroundEntity->GetModelIndex()))
pVehicle->SetStatus(STATUS_PHYSICS);
CColPoint colPoint;
CEntity* pEntity;
if ((pVehicle->m_randomSeed & 0x3F) == (CTimer::GetFrameCounter() & 0x3F) &&
!CWorld::ProcessVerticalLine(pVehicle->GetPosition(), -2.0f, colPoint, pEntity, true, false, false, false, true, false, nil)) {
debug("FLOATING CAR TURNED INTO PHYSICS CAR!\n");
pVehicle->SetStatus(STATUS_PHYSICS);
}
}
// fallthough
case STATUS_PHYSICS: case STATUS_PHYSICS:
switch (pVehicle->AutoPilot.m_nCarMission) { switch (pVehicle->AutoPilot.m_nCarMission) {
case MISSION_RAMPLAYER_FARAWAY: case MISSION_RAMPLAYER_FARAWAY:

View file

@ -11,6 +11,7 @@
#include "Cranes.h" #include "Cranes.h"
#include "Curves.h" #include "Curves.h"
#include "CutsceneMgr.h" #include "CutsceneMgr.h"
#include "Frontend.h"
#include "Gangs.h" #include "Gangs.h"
#include "Game.h" #include "Game.h"
#include "Garages.h" #include "Garages.h"
@ -76,10 +77,11 @@
#define DISTANCE_BETWEEN_CAR_AND_DEAD_PED (6.0f) #define DISTANCE_BETWEEN_CAR_AND_DEAD_PED (6.0f)
#define PROBABILITY_OF_PASSENGER_IN_VEHICLE (0.125f) #define PROBABILITY_OF_PASSENGER_IN_VEHICLE (0.125f)
#define ONSCREEN_DESPAWN_RANGE (120.0f) #define ONSCREEN_DESPAWN_RANGE (190.0f)
#define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (100.0f) #define MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN (130.0f)
#define REQUEST_ONSCREEN_DISTANCE ((ONSCREEN_DESPAWN_RANGE + MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) / 2) #define REQUEST_ONSCREEN_DISTANCE (140.0f)
#define OFFSCREEN_DESPAWN_RANGE (40.0f) #define OFFSCREEN_DESPAWN_RANGE (60.0f)
#define MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN (40.0f)
#define EXTENDED_RANGE_DESPAWN_MULTIPLIER (1.5f) #define EXTENDED_RANGE_DESPAWN_MULTIPLIER (1.5f)
//--MIAMI: file done //--MIAMI: file done
@ -95,7 +97,7 @@ int32 CCarCtrl::NumRandomCars;
int32 CCarCtrl::NumParkedCars; int32 CCarCtrl::NumParkedCars;
int32 CCarCtrl::NumPermanentCars; int32 CCarCtrl::NumPermanentCars;
int8 CCarCtrl::CountDownToCarsAtStart; int8 CCarCtrl::CountDownToCarsAtStart;
int32 CCarCtrl::MaxNumberOfCarsInUse = 12; int32 CCarCtrl::MaxNumberOfCarsInUse = 30;
uint32 CCarCtrl::LastTimeLawEnforcerCreated; uint32 CCarCtrl::LastTimeLawEnforcerCreated;
uint32 CCarCtrl::LastTimeFireTruckCreated; uint32 CCarCtrl::LastTimeFireTruckCreated;
uint32 CCarCtrl::LastTimeAmbulanceCreated; uint32 CCarCtrl::LastTimeAmbulanceCreated;
@ -161,14 +163,19 @@ CCarCtrl::GenerateOneRandomCar()
carClass = COPS; carClass = COPS;
carModel = ChoosePoliceCarModel(); carModel = ChoosePoliceCarModel();
}else{ }else{
carModel = ChooseModel(&zone, &carClass); for (int i = 0; i < 5; i++) {
if (carModel == -1 || (carClass == COPS && pWanted->m_nWantedLevel >= 1)) carModel = ChooseModel(&zone, &carClass);
/* All cop spawns with wanted level are handled by condition above. */ if (carModel == -1)
/* In particular it means that cop cars never spawn if player has wanted level of 1. */ return;
return; if (!(carClass == COPS && pWanted->m_nWantedLevel >= 1))
/* All cop spawns with wanted level are handled by condition above. */
/* In particular it means that cop cars never spawn if player has wanted level of 1. */
break;
}
} }
float frontX, frontY; float frontX, frontY;
float preferredDistance, angleLimit; float preferredDistance, angleLimit;
float requestMultiplier;
bool invertAngleLimitTest; bool invertAngleLimitTest;
CVector spawnPosition; CVector spawnPosition;
int32 curNodeId, nextNodeId; int32 curNodeId, nextNodeId;
@ -188,11 +195,14 @@ CCarCtrl::GenerateOneRandomCar()
angleLimit = -1.0f; angleLimit = -1.0f;
bTopDownCamera = true; bTopDownCamera = true;
invertAngleLimitTest = true; invertAngleLimitTest = true;
preferredDistance = OFFSCREEN_DESPAWN_RANGE + 15.0f; preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN + 15.0f;
/* BUG: testForCollision not initialized in original game. */ /* BUG: testForCollision not initialized in original game. */
testForCollision = false; testForCollision = false;
}else if (!pPlayerVehicle){ }else if (!pPlayerVehicle){
/* Player is not in vehicle. */ /* Player is not in vehicle. */
requestMultiplier = 13.0f / 20.0f;
if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static
requestMultiplier *= 4.0f / 3.0f;
testForCollision = true; testForCollision = true;
frontX = TheCamera.CamFrontXNorm; frontX = TheCamera.CamFrontXNorm;
frontY = TheCamera.CamFrontYNorm; frontY = TheCamera.CamFrontYNorm;
@ -202,95 +212,105 @@ CCarCtrl::GenerateOneRandomCar()
/* Forward to his current direction (camera direction). */ /* Forward to his current direction (camera direction). */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = true; invertAngleLimitTest = true;
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
break; break;
case 1: case 1:
/* Spawn a vehicle close to player to his side. */ /* Spawn a vehicle close to player to his side. */
/* Kinda not within camera angle. */ /* Kinda not within camera angle. */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = false; invertAngleLimitTest = false;
preferredDistance = OFFSCREEN_DESPAWN_RANGE; preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
break; break;
} }
}else if (fPlayerVehicleSpeed > 0.4f){ /* 72 km/h */ }
else {
requestMultiplier = 13.0f / 20.0f;
if (TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen)
requestMultiplier *= 0.9f;
if (FrontEndMenuManager.m_PrefsUseWideScreen) // TODO(LCS): static
requestMultiplier *= 4.0f / 3.0f;
if (fPlayerVehicleSpeed > 0.4f) { /* 72 km/h */
/* Player is moving fast in vehicle */ /* Player is moving fast in vehicle */
/* Prefer spawning vehicles very far away from him. */ /* Prefer spawning vehicles very far away from him. */
frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed;
frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed;
testForCollision = false; testForCollision = false;
switch (CTimer::GetFrameCounter() & 3) { switch (CTimer::GetFrameCounter() & 3) {
case 0: case 0:
case 1: case 1:
/* Spawn a vehicle in a very narrow gap in front of a player */ /* Spawn a vehicle in a very narrow gap in front of a player */
angleLimit = 0.85f; /* approx 30 degrees */ angleLimit = 0.85f; /* approx 30 degrees */
invertAngleLimitTest = true; invertAngleLimitTest = true;
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
break; break;
case 2: case 2:
/* Spawn a vehicle relatively far away from player. */ /* Spawn a vehicle relatively far away from player. */
/* Forward to his current direction (camera direction). */ /* Forward to his current direction (camera direction). */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = true; invertAngleLimitTest = true;
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
break; break;
case 3: case 3:
/* Spawn a vehicle close to player to his side. */ /* Spawn a vehicle close to player to his side. */
/* Kinda not within camera angle. */ /* Kinda not within camera angle. */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = false; invertAngleLimitTest = false;
preferredDistance = OFFSCREEN_DESPAWN_RANGE; preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
break; break;
}
} }
}else if (fPlayerVehicleSpeed > 0.1f){ /* 18 km/h */ else if (fPlayerVehicleSpeed > 0.1f) { /* 18 km/h */
/* Player is moving moderately fast in vehicle */ /* Player is moving moderately fast in vehicle */
/* Spawn more vehicles to player's side. */ /* Spawn more vehicles to player's side. */
frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed; frontX = vecPlayerVehicleSpeed.x / fPlayerVehicleSpeed;
frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed; frontY = vecPlayerVehicleSpeed.y / fPlayerVehicleSpeed;
testForCollision = false; testForCollision = false;
switch (CTimer::GetFrameCounter() & 3) { switch (CTimer::GetFrameCounter() & 3) {
case 0: case 0:
/* Spawn a vehicle in a very narrow gap in front of a player */ /* Spawn a vehicle in a very narrow gap in front of a player */
angleLimit = 0.85f; /* approx 30 degrees */ angleLimit = 0.85f; /* approx 30 degrees */
invertAngleLimitTest = true; invertAngleLimitTest = true;
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
break; break;
case 1: case 1:
/* Spawn a vehicle relatively far away from player. */ /* Spawn a vehicle relatively far away from player. */
/* Forward to his current direction (camera direction). */ /* Forward to his current direction (camera direction). */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = true; invertAngleLimitTest = true;
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
break; break;
case 2: case 2:
case 3: case 3:
/* Spawn a vehicle close to player to his side. */ /* Spawn a vehicle close to player to his side. */
/* Kinda not within camera angle. */ /* Kinda not within camera angle. */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = false; invertAngleLimitTest = false;
preferredDistance = OFFSCREEN_DESPAWN_RANGE; preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
break; break;
}
} }
}else{ else {
/* Player is in vehicle but moving very slow. */ /* Player is in vehicle but moving very slow. */
/* Then use camera direction instead of vehicle direction. */ /* Then use camera direction instead of vehicle direction. */
testForCollision = true; testForCollision = true;
frontX = TheCamera.CamFrontXNorm; frontX = TheCamera.CamFrontXNorm;
frontY = TheCamera.CamFrontYNorm; frontY = TheCamera.CamFrontYNorm;
switch (CTimer::GetFrameCounter() & 1) { switch (CTimer::GetFrameCounter() & 1) {
case 0: case 0:
/* Spawn a vehicle relatively far away from player. */ /* Spawn a vehicle relatively far away from player. */
/* Forward to his current direction (camera direction). */ /* Forward to his current direction (camera direction). */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = true; invertAngleLimitTest = true;
preferredDistance = REQUEST_ONSCREEN_DISTANCE * TheCamera.GenerationDistMultiplier; preferredDistance = REQUEST_ONSCREEN_DISTANCE * requestMultiplier * TheCamera.GenerationDistMultiplier;
break; break;
case 1: case 1:
/* Spawn a vehicle close to player to his side. */ /* Spawn a vehicle close to player to his side. */
/* Kinda not within camera angle. */ /* Kinda not within camera angle. */
angleLimit = 0.707f; /* 45 degrees */ angleLimit = 0.707f; /* 45 degrees */
invertAngleLimitTest = false; invertAngleLimitTest = false;
preferredDistance = OFFSCREEN_DESPAWN_RANGE; preferredDistance = MINIMAL_DISTANCE_TO_SPAWN_OFFSCREEN;
break; break;
}
} }
} }
if (!ThePaths.GenerateCarCreationCoors(vecTargetPos.x, vecTargetPos.y, frontX, frontY, if (!ThePaths.GenerateCarCreationCoors(vecTargetPos.x, vecTargetPos.y, frontX, frontY,
@ -300,6 +320,8 @@ CCarCtrl::GenerateOneRandomCar()
CPathNode* pCurNode = &ThePaths.m_pathNodes[curNodeId]; CPathNode* pCurNode = &ThePaths.m_pathNodes[curNodeId];
CPathNode* pNextNode = &ThePaths.m_pathNodes[nextNodeId]; CPathNode* pNextNode = &ThePaths.m_pathNodes[nextNodeId];
bool bBoatGenerated = false; bool bBoatGenerated = false;
if (!OkToCreateVehicleAtThisPosition(spawnPosition))
return;
if ((CGeneral::GetRandomNumber() & 0xF) > Min(pCurNode->spawnRate, pNextNode->spawnRate)) if ((CGeneral::GetRandomNumber() & 0xF) > Min(pCurNode->spawnRate, pNextNode->spawnRate))
return; return;
if (pCurNode->bWaterPath) { if (pCurNode->bWaterPath) {
@ -599,12 +621,12 @@ CCarCtrl::GenerateOneRandomCar()
return; return;
} }
}else{ }else{
if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE || if ((vecTargetPos - pVehicle->GetPosition()).Magnitude2D() > TheCamera.GenerationDistMultiplier * requestMultiplier * (pVehicle->bExtendedRange ? EXTENDED_RANGE_DESPAWN_MULTIPLIER : 1.0f) * ONSCREEN_DESPAWN_RANGE ||
(vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) { (vecTargetPos - pVehicle->GetPosition()).Magnitude2D() < TheCamera.GenerationDistMultiplier * requestMultiplier * MINIMAL_DISTANCE_TO_SPAWN_ONSCREEN) {
delete pVehicle; delete pVehicle;
return; return;
} }
if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < 82.5f * TheCamera.GenerationDistMultiplier || bTopDownCamera) { if ((TheCamera.GetPosition() - pVehicle->GetPosition()).Magnitude2D() < 105.0f * requestMultiplier * TheCamera.GenerationDistMultiplier || bTopDownCamera) {
delete pVehicle; delete pVehicle;
return; return;
} }
@ -654,13 +676,13 @@ CCarCtrl::GenerateOneRandomCar()
int nMadDrivers; int nMadDrivers;
switch (pVehicle->GetVehicleAppearance()) { switch (pVehicle->GetVehicleAppearance()) {
case VEHICLE_APPEARANCE_BIKE: case VEHICLE_APPEARANCE_BIKE:
nMadDrivers = 30; nMadDrivers = 20;
break; break;
case VEHICLE_APPEARANCE_BOAT: case VEHICLE_APPEARANCE_BOAT:
nMadDrivers = 40; nMadDrivers = 40;
break; break;
default: default:
nMadDrivers = 6; nMadDrivers = 3;
break; break;
} }
if ((CGeneral::GetRandomNumber() & 0x7F) < nMadDrivers || bMadDriversCheat) { if ((CGeneral::GetRandomNumber() & 0x7F) < nMadDrivers || bMadDriversCheat) {
@ -719,12 +741,6 @@ CCarCtrl::GenerateOneRandomCar()
} }
} }
bool
CCarCtrl::BoatWithTallMast(int32 mi)
{
return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS;
}
int32 int32
CCarCtrl::ChooseBoatModel(int32 rating) CCarCtrl::ChooseBoatModel(int32 rating)
{ {
@ -944,6 +960,7 @@ CCarCtrl::RemoveCarsIfThePoolGetsFull(void)
} }
} }
if (pClosestVehicle) { if (pClosestVehicle) {
debug(":::::::::::\'Nearest removed\' cause pools was full -> NumRandomCars %d\n", NumRandomCars);
CWorld::Remove(pClosestVehicle); CWorld::Remove(pClosestVehicle);
delete pClosestVehicle; delete pClosestVehicle;
} }
@ -966,7 +983,10 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle)
return; return;
} }
float distanceToPlayer = (pVehicle->GetPosition() - vecPlayerPos).Magnitude2D(); float distanceToPlayer = (pVehicle->GetPosition() - vecPlayerPos).Magnitude2D();
float threshold = OFFSCREEN_DESPAWN_RANGE; float despawnMultiplier = 1.0f;
if (FindPlayerVehicle() && TheCamera.Cams[TheCamera.ActiveCam].Mode == CCam::MODE_1STPERSON && !FrontEndMenuManager.m_PrefsUseWideScreen)
despawnMultiplier = 0.75f;
float threshold = OFFSCREEN_DESPAWN_RANGE * despawnMultiplier;
if (pVehicle->GetIsOnScreen() || if (pVehicle->GetIsOnScreen() ||
TheCamera.Cams[TheCamera.ActiveCam].LookingLeft || TheCamera.Cams[TheCamera.ActiveCam].LookingLeft ||
TheCamera.Cams[TheCamera.ActiveCam].LookingRight || TheCamera.Cams[TheCamera.ActiveCam].LookingRight ||
@ -979,7 +999,7 @@ CCarCtrl::PossiblyRemoveVehicle(CVehicle* pVehicle)
pVehicle->bIsCarParkVehicle || pVehicle->bIsCarParkVehicle ||
CTimer::GetTimeInMilliseconds() < pVehicle->m_nSetPieceExtendedRangeTime CTimer::GetTimeInMilliseconds() < pVehicle->m_nSetPieceExtendedRangeTime
){ ){
threshold = ONSCREEN_DESPAWN_RANGE * TheCamera.GenerationDistMultiplier; threshold = ONSCREEN_DESPAWN_RANGE * despawnMultiplier * TheCamera.GenerationDistMultiplier;
} }
if (TheCamera.GetForward().z < -0.9f) if (TheCamera.GetForward().z < -0.9f)
threshold = 70.0f; threshold = 70.0f;
@ -1572,7 +1592,7 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float
if (pVehicle->AutoPilot.m_nCarMission == MISSION_RAMCAR_CLOSE && pOtherEntity == pVehicle->AutoPilot.m_pTargetCar) if (pVehicle->AutoPilot.m_nCarMission == MISSION_RAMCAR_CLOSE && pOtherEntity == pVehicle->AutoPilot.m_pTargetCar)
return; return;
CVector2D vecDiff = pOtherCar->GetPosition() - pVehicle->GetPosition(); CVector2D vecDiff = pOtherCar->GetPosition() - pVehicle->GetPosition();
float angleBetweenVehicles = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); float angleBetweenVehicles = GetATanOfXY(vecDiff.x, vecDiff.y);
float distance = vecDiff.Magnitude(); float distance = vecDiff.Magnitude();
if (distance < 1.0f) if (distance < 1.0f)
return; return;
@ -1582,7 +1602,7 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float
return; return;
CVector2D forward = pVehicle->GetForward(); CVector2D forward = pVehicle->GetForward();
forward.Normalise(); forward.Normalise();
float forwardAngle = CGeneral::GetATanOfXY(forward.x, forward.y); float forwardAngle = GetATanOfXY(forward.x, forward.y);
float angleDiff = angleBetweenVehicles - forwardAngle; float angleDiff = angleBetweenVehicles - forwardAngle;
float lenProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.y * sin(angleDiff)); float lenProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.y * sin(angleDiff));
float widthProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.x * cos(angleDiff)); float widthProjection = ABS(pOtherCar->GetColModel()->boundingBox.max.x * cos(angleDiff));
@ -1591,16 +1611,12 @@ void CCarCtrl::WeaveForOtherCar(CEntity* pOtherEntity, CVehicle* pVehicle, float
diffToLeftAngle = ABS(diffToLeftAngle); diffToLeftAngle = ABS(diffToLeftAngle);
float angleToWeave = lengthToEvade / 2; float angleToWeave = lengthToEvade / 2;
if (diffToLeftAngle < angleToWeave){ if (diffToLeftAngle < angleToWeave){
*pAngleToWeaveLeft = angleBetweenVehicles - angleToWeave; *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicles - angleToWeave);
while (*pAngleToWeaveLeft < -PI)
*pAngleToWeaveLeft += TWOPI;
} }
float diffToRightAngle = LimitRadianAngle(angleBetweenVehicles - *pAngleToWeaveRight); float diffToRightAngle = LimitRadianAngle(angleBetweenVehicles - *pAngleToWeaveRight);
diffToRightAngle = ABS(diffToRightAngle); diffToRightAngle = ABS(diffToRightAngle);
if (diffToRightAngle < angleToWeave){ if (diffToRightAngle < angleToWeave){
*pAngleToWeaveRight = angleBetweenVehicles + angleToWeave; *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicles + angleToWeave);
while (*pAngleToWeaveRight > PI)
*pAngleToWeaveRight -= TWOPI;
} }
} }
@ -1632,23 +1648,19 @@ void CCarCtrl::WeaveForPed(CEntity* pOtherEntity, CVehicle* pVehicle, float* pAn
return; return;
CPed* pPed = (CPed*)pOtherEntity; CPed* pPed = (CPed*)pOtherEntity;
CVector2D vecDiff = pPed->GetPosition() - pVehicle->GetPosition(); CVector2D vecDiff = pPed->GetPosition() - pVehicle->GetPosition();
float angleBetweenVehicleAndPed = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); float angleBetweenVehicleAndPed = GetATanOfXY(vecDiff.x, vecDiff.y);
float distance = vecDiff.Magnitude(); float distance = vecDiff.Magnitude();
float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + PED_WIDTH_TO_WEAVE) / distance; float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + PED_WIDTH_TO_WEAVE) / distance;
float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveLeft); float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveLeft);
diffToLeftAngle = ABS(diffToLeftAngle); diffToLeftAngle = ABS(diffToLeftAngle);
float angleToWeave = lengthToEvade / 2; float angleToWeave = lengthToEvade / 2;
if (diffToLeftAngle < angleToWeave) { if (diffToLeftAngle < angleToWeave) {
*pAngleToWeaveLeft = angleBetweenVehicleAndPed - angleToWeave; *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndPed - angleToWeave);
while (*pAngleToWeaveLeft < -PI)
*pAngleToWeaveLeft += TWOPI;
} }
float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveRight); float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndPed - *pAngleToWeaveRight);
diffToRightAngle = ABS(diffToRightAngle); diffToRightAngle = ABS(diffToRightAngle);
if (diffToRightAngle < angleToWeave) { if (diffToRightAngle < angleToWeave) {
*pAngleToWeaveRight = angleBetweenVehicleAndPed + angleToWeave; *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndPed + angleToWeave);
while (*pAngleToWeaveRight > PI)
*pAngleToWeaveRight -= TWOPI;
} }
} }
@ -1704,23 +1716,19 @@ void CCarCtrl::WeaveForObject(CEntity* pOtherEntity, CVehicle* pVehicle, float*
rightCoef * pObject->GetRight() + rightCoef * pObject->GetRight() +
forwardCoef * pObject->GetForward() - forwardCoef * pObject->GetForward() -
pVehicle->GetPosition(); pVehicle->GetPosition();
float angleBetweenVehicleAndObject = CGeneral::GetATanOfXY(vecDiff.x, vecDiff.y); float angleBetweenVehicleAndObject = GetATanOfXY(vecDiff.x, vecDiff.y);
float distance = vecDiff.Magnitude(); float distance = vecDiff.Magnitude();
float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + OBJECT_WIDTH_TO_WEAVE) / distance; float lengthToEvade = (WIDTH_COEF_TO_WEAVE_SAFELY * 2 * pVehicle->GetColModel()->boundingBox.max.x + OBJECT_WIDTH_TO_WEAVE) / distance;
float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveLeft); float diffToLeftAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveLeft);
diffToLeftAngle = ABS(diffToLeftAngle); diffToLeftAngle = ABS(diffToLeftAngle);
float angleToWeave = lengthToEvade / 2; float angleToWeave = lengthToEvade / 2;
if (diffToLeftAngle < angleToWeave) { if (diffToLeftAngle < angleToWeave) {
*pAngleToWeaveLeft = angleBetweenVehicleAndObject - angleToWeave; *pAngleToWeaveLeft = LimitRadianAngle(angleBetweenVehicleAndObject - angleToWeave);
while (*pAngleToWeaveLeft < -PI)
*pAngleToWeaveLeft += TWOPI;
} }
float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveRight); float diffToRightAngle = LimitRadianAngle(angleBetweenVehicleAndObject - *pAngleToWeaveRight);
diffToRightAngle = ABS(diffToRightAngle); diffToRightAngle = ABS(diffToRightAngle);
if (diffToRightAngle < angleToWeave) { if (diffToRightAngle < angleToWeave) {
*pAngleToWeaveRight = angleBetweenVehicleAndObject + angleToWeave; *pAngleToWeaveRight = LimitRadianAngle(angleBetweenVehicleAndObject + angleToWeave);
while (*pAngleToWeaveRight > PI)
*pAngleToWeaveRight -= TWOPI;
} }
} }
@ -1762,7 +1770,7 @@ bool CCarCtrl::PickNextNodeAccordingStrategy(CVehicle* pVehicle)
void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle) void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle)
{ {
if (pVehicle->m_nRouteSeed) if (pVehicle->m_nRouteSeed)
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++);
int32 prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode; int32 prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode;
int32 curNode = pVehicle->AutoPilot.m_nNextRouteNode; int32 curNode = pVehicle->AutoPilot.m_nNextRouteNode;
uint8 totalLinks = ThePaths.m_pathNodes[curNode].numLinks; uint8 totalLinks = ThePaths.m_pathNodes[curNode].numLinks;
@ -1848,13 +1856,15 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle)
pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode]; pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode];
if ((!pNextPathNode->bDisabled || pPrevPathNode->bDisabled) && if ((!pNextPathNode->bDisabled || pPrevPathNode->bDisabled) &&
(!pNextPathNode->bBetweenLevels || pPrevPathNode->bBetweenLevels || !pVehicle->AutoPilot.m_bStayInCurrentLevel)) (!pNextPathNode->bBetweenLevels || pPrevPathNode->bBetweenLevels || !pVehicle->AutoPilot.m_bStayInCurrentLevel))
/* Nice way to exit loop but this will fail because this is used for indexing! */ break;
nextLink = 1000;
} }
} }
if (nextLink < 999) if (nextLink >= totalLinks) {
/* If everything else failed, turn vehicle around */ /* If everything else failed, turn vehicle around */
nextLink = 0;
debug("Couldn\'t find ANYTHING. Just go back from where we came.\n");
pVehicle->AutoPilot.m_nNextRouteNode = prevNode; pVehicle->AutoPilot.m_nNextRouteNode = prevNode;
}
} }
pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode]; pNextPathNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nNextRouteNode];
pNextLink = &ThePaths.m_carPathLinks[ThePaths.m_carPathConnections[nextLink + pCurPathNode->firstLink]]; pNextLink = &ThePaths.m_carPathLinks[ThePaths.m_carPathConnections[nextLink + pCurPathNode->firstLink]];
@ -1967,7 +1977,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t
#endif #endif
{ {
if (pVehicle->m_nRouteSeed) if (pVehicle->m_nRouteSeed)
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++);
int prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode; int prevNode = pVehicle->AutoPilot.m_nCurrentRouteNode;
int curNode = pVehicle->AutoPilot.m_nNextRouteNode; int curNode = pVehicle->AutoPilot.m_nNextRouteNode;
CPathNode* pPrevNode = &ThePaths.m_pathNodes[prevNode]; CPathNode* pPrevNode = &ThePaths.m_pathNodes[prevNode];
@ -1987,7 +1997,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t
int nextLink; int nextLink;
if (numNodes != 1 && numNodes != 2 || pTargetNode[0] == pCurNode){ if (numNodes != 1 && numNodes != 2 || pTargetNode[0] == pCurNode){
if (numNodes != 2 || pTargetNode[1] == pCurNode) { if (numNodes != 2 || pTargetNode[1] == pCurNode) {
float currentAngle = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); float currentAngle = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y);
nextLink = 0; nextLink = 0;
float lowestAngleChange = 10.0f; float lowestAngleChange = 10.0f;
int numLinks = pCurNode->numLinks; int numLinks = pCurNode->numLinks;
@ -1997,7 +2007,7 @@ void CCarCtrl::PickNextNodeToChaseCar(CVehicle* pVehicle, float targetX, float t
if (conNode == prevNode && i > 1) if (conNode == prevNode && i > 1)
continue; continue;
CPathNode* pTestNode = &ThePaths.m_pathNodes[conNode]; CPathNode* pTestNode = &ThePaths.m_pathNodes[conNode];
float angle = CGeneral::GetATanOfXY(pTestNode->GetX() - pCurNode->GetX(), pTestNode->GetY() - pCurNode->GetY()); float angle = GetATanOfXY(pTestNode->GetX() - pCurNode->GetX(), pTestNode->GetY() - pCurNode->GetY());
angle = LimitRadianAngle(angle - currentAngle); angle = LimitRadianAngle(angle - currentAngle);
angle = ABS(angle); angle = ABS(angle);
if (angle < lowestAngleChange) { if (angle < lowestAngleChange) {
@ -2415,6 +2425,16 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe
*pHandbrake = true; *pHandbrake = true;
return; return;
case MISSION_CRUISE: case MISSION_CRUISE:
if (CTrafficLights::ShouldCarStopForBridge(pVehicle)) {
*pAccel = 0.0f;
*pBrake = 1.0f;
*pHandbrake = true;
#ifdef FIX_BUGS
*pSwerve = 0.0f;
#endif
break;
}
// fallthough
case MISSION_RAMPLAYER_FARAWAY: case MISSION_RAMPLAYER_FARAWAY:
case MISSION_BLOCKPLAYER_FARAWAY: case MISSION_BLOCKPLAYER_FARAWAY:
case MISSION_GOTOCOORDS: case MISSION_GOTOCOORDS:
@ -2485,11 +2505,19 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe
*pHandbrake = false; *pHandbrake = false;
return; return;
case MISSION_RAMCAR_CLOSE: case MISSION_RAMCAR_CLOSE:
if (!pVehicle->AutoPilot.m_pTargetCar) {
debug("NO TARGET VEHICLE FOR MISSION_RAMCAR_CLOSE\n");
return;
}
SteerAICarWithPhysicsHeadingForTarget(pVehicle, pVehicle->AutoPilot.m_pTargetCar, SteerAICarWithPhysicsHeadingForTarget(pVehicle, pVehicle->AutoPilot.m_pTargetCar,
pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y,
pSwerve, pAccel, pBrake, pHandbrake); pSwerve, pAccel, pBrake, pHandbrake);
return; return;
case MISSION_BLOCKCAR_CLOSE: case MISSION_BLOCKCAR_CLOSE:
if (!pVehicle->AutoPilot.m_pTargetCar) {
debug("NO TARGET VEHICLE FOR MISSION_BLOCKCAR_CLOSE\n");
return;
}
SteerAICarWithPhysicsTryingToBlockTarget(pVehicle, SteerAICarWithPhysicsTryingToBlockTarget(pVehicle,
pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x,
pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y,
@ -2498,6 +2526,9 @@ void CCarCtrl::SteerAICarWithPhysics_OnlyMission(CVehicle* pVehicle, float* pSwe
pSwerve, pAccel, pBrake, pHandbrake); pSwerve, pAccel, pBrake, pHandbrake);
return; return;
case MISSION_BLOCKCAR_HANDBRAKESTOP: case MISSION_BLOCKCAR_HANDBRAKESTOP:
if (!pVehicle->AutoPilot.m_pTargetCar) {
return;
}
SteerAICarWithPhysicsTryingToBlockTarget_Stop(pVehicle, SteerAICarWithPhysicsTryingToBlockTarget_Stop(pVehicle,
pVehicle->AutoPilot.m_pTargetCar->GetPosition().x, pVehicle->AutoPilot.m_pTargetCar->GetPosition().x,
pVehicle->AutoPilot.m_pTargetCar->GetPosition().y, pVehicle->AutoPilot.m_pTargetCar->GetPosition().y,
@ -2575,8 +2606,8 @@ void CCarCtrl::SteerAIBoatWithPhysicsHeadingForTarget(CVehicle* pVehicle, float
{ {
CVector2D forward = pVehicle->GetForward(); CVector2D forward = pVehicle->GetForward();
forward.Normalise(); forward.Normalise();
float angleToTarget = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); float angleToTarget = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y);
float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); float angleForward = GetATanOfXY(forward.x, forward.y);
float steerAngle = LimitRadianAngle(angleToTarget - angleForward); float steerAngle = LimitRadianAngle(angleToTarget - angleForward);
steerAngle = clamp(steerAngle, -DEFAULT_MAX_STEER_ANGLE, DEFAULT_MAX_STEER_ANGLE); steerAngle = clamp(steerAngle, -DEFAULT_MAX_STEER_ANGLE, DEFAULT_MAX_STEER_ANGLE);
#ifdef FIX_BUGS #ifdef FIX_BUGS
@ -2607,8 +2638,8 @@ void CCarCtrl::SteerAIBoatWithPhysicsAttackingPlayer(CVehicle* pVehicle, float*
CVector2D forward = pVehicle->GetForward(); CVector2D forward = pVehicle->GetForward();
forward.Normalise(); forward.Normalise();
CVector2D vecToProjection = FindPlayerCoors() + FindPlayerSpeed() * projection * GAME_SPEED_TO_CARAI_SPEED; CVector2D vecToProjection = FindPlayerCoors() + FindPlayerSpeed() * projection * GAME_SPEED_TO_CARAI_SPEED;
float angleToTarget = CGeneral::GetATanOfXY(vecToProjection.x - pVehicle->GetPosition().x, vecToProjection.y - pVehicle->GetPosition().y); float angleToTarget = GetATanOfXY(vecToProjection.x - pVehicle->GetPosition().x, vecToProjection.y - pVehicle->GetPosition().y);
float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); float angleForward = GetATanOfXY(forward.x, forward.y);
float steerAngle = LimitRadianAngle(angleToTarget - angleForward); float steerAngle = LimitRadianAngle(angleToTarget - angleForward);
#ifdef FIX_BUGS #ifdef FIX_BUGS
float speedTarget = pVehicle->AutoPilot.GetCruiseSpeed(); float speedTarget = pVehicle->AutoPilot.GetCruiseSpeed();
@ -2696,7 +2727,7 @@ void CCarCtrl::SteerAIHeliTowardsTargetCoors(CAutomobile* pHeli)
if (distanceToTarget < 8.0f && pHeli->m_fHeliOrientation < 0.0f) if (distanceToTarget < 8.0f && pHeli->m_fHeliOrientation < 0.0f)
ZTurnSpeedTarget = 0.0f; ZTurnSpeedTarget = 0.0f;
else { else {
float fAngleTarget = CGeneral::GetATanOfXY(vecToTarget.x, vecToTarget.y) + PI; float fAngleTarget = GetATanOfXY(vecToTarget.x, vecToTarget.y) + PI;
if (pHeli->m_fHeliOrientation >= 0.0f) if (pHeli->m_fHeliOrientation >= 0.0f)
fAngleTarget = pHeli->m_fHeliOrientation; fAngleTarget = pHeli->m_fHeliOrientation;
fAngleTarget -= pHeli->m_fOrientation; fAngleTarget -= pHeli->m_fOrientation;
@ -2739,7 +2770,7 @@ void CCarCtrl::SteerAIPlaneTowardsTargetCoors(CAutomobile* pPlane)
CVector2D vecToTarget = pPlane->AutoPilot.m_vecDestinationCoors - pPlane->GetPosition(); CVector2D vecToTarget = pPlane->AutoPilot.m_vecDestinationCoors - pPlane->GetPosition();
float fForwardZ = (pPlane->AutoPilot.m_vecDestinationCoors.z - pPlane->GetPosition().z) / vecToTarget.Magnitude(); float fForwardZ = (pPlane->AutoPilot.m_vecDestinationCoors.z - pPlane->GetPosition().z) / vecToTarget.Magnitude();
fForwardZ = clamp(fForwardZ, -0.3f, 0.3f); fForwardZ = clamp(fForwardZ, -0.3f, 0.3f);
float angle = CGeneral::GetATanOfXY(vecToTarget.x, vecToTarget.y); float angle = GetATanOfXY(vecToTarget.x, vecToTarget.y);
while (angle > TWOPI) while (angle > TWOPI)
angle -= TWOPI; angle -= TWOPI;
float difference = LimitRadianAngle(angle - pPlane->m_fOrientation); float difference = LimitRadianAngle(angle - pPlane->m_fOrientation);
@ -2836,8 +2867,8 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv
projectedPosition.y = positionOnCurrentLinkIncludingLane.y; projectedPosition.y = positionOnCurrentLinkIncludingLane.y;
} }
CVector2D distanceToProjectedPosition = projectedPosition - pVehicle->GetPosition(); CVector2D distanceToProjectedPosition = projectedPosition - pVehicle->GetPosition();
float angleCurrentLink = CGeneral::GetATanOfXY(distanceToProjectedPosition.x, distanceToProjectedPosition.y); float angleCurrentLink = GetATanOfXY(distanceToProjectedPosition.x, distanceToProjectedPosition.y);
float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); float angleForward = GetATanOfXY(forward.x, forward.y);
if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS) if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS)
angleCurrentLink = FindAngleToWeaveThroughTraffic(pVehicle, nil, angleCurrentLink, angleForward); angleCurrentLink = FindAngleToWeaveThroughTraffic(pVehicle, nil, angleCurrentLink, angleForward);
float steerAngle = LimitRadianAngle(angleCurrentLink - angleForward); float steerAngle = LimitRadianAngle(angleCurrentLink - angleForward);
@ -2882,11 +2913,11 @@ void CCarCtrl::SteerAICarWithPhysicsFollowPath(CVehicle* pVehicle, float* pSwerv
pCurrentLink->GetY() - ((pVehicle->AutoPilot.m_nCurrentLane + pCurrentLink->OneWayLaneOffset()) * LANE_WIDTH) * currentPathLinkForward.x); pCurrentLink->GetY() - ((pVehicle->AutoPilot.m_nCurrentLane + pCurrentLink->OneWayLaneOffset()) * LANE_WIDTH) * currentPathLinkForward.x);
trajectory -= pVehicle->GetPosition(); trajectory -= pVehicle->GetPosition();
float speedAngleMultiplier = FindSpeedMultiplier( float speedAngleMultiplier = FindSpeedMultiplier(
CGeneral::GetATanOfXY(trajectory.x, trajectory.y) - angleForward, GetATanOfXY(trajectory.x, trajectory.y) - angleForward,
MIN_ANGLE_FOR_SPEED_LIMITING, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT); MIN_ANGLE_FOR_SPEED_LIMITING, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT);
float tmpWideMultiplier = FindSpeedMultiplier( float tmpWideMultiplier = FindSpeedMultiplier(
CGeneral::GetATanOfXY(currentPathLinkForward.x, currentPathLinkForward.y) - GetATanOfXY(currentPathLinkForward.x, currentPathLinkForward.y) -
CGeneral::GetATanOfXY(nextPathLinkForwardX, nextPathLinkForwardY), GetATanOfXY(nextPathLinkForwardX, nextPathLinkForwardY),
MIN_ANGLE_FOR_SPEED_LIMITING_BETWEEN_NODES, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT); MIN_ANGLE_FOR_SPEED_LIMITING_BETWEEN_NODES, MAX_ANGLE_FOR_SPEED_LIMITING, MIN_LOWERING_SPEED_COEFFICIENT);
float speedNodesMultiplier; float speedNodesMultiplier;
if (scalarDistanceToNextNode > DISTANCE_TO_NEXT_NODE_TO_CONSIDER_SLOWING_DOWN || pVehicle->AutoPilot.m_nCruiseSpeed < 12) if (scalarDistanceToNextNode > DISTANCE_TO_NEXT_NODE_TO_CONSIDER_SLOWING_DOWN || pVehicle->AutoPilot.m_nCruiseSpeed < 12)
@ -2920,8 +2951,8 @@ void CCarCtrl::SteerAICarWithPhysicsHeadingForTarget(CVehicle* pVehicle, CPhysic
*pHandbrake = false; *pHandbrake = false;
CVector2D forward = pVehicle->GetForward(); CVector2D forward = pVehicle->GetForward();
forward.Normalise(); forward.Normalise();
float angleToTarget = CGeneral::GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y); float angleToTarget = GetATanOfXY(targetX - pVehicle->GetPosition().x, targetY - pVehicle->GetPosition().y);
float angleForward = CGeneral::GetATanOfXY(forward.x, forward.y); float angleForward = GetATanOfXY(forward.x, forward.y);
if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS) if (pVehicle->AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_AVOID_CARS)
angleToTarget = FindAngleToWeaveThroughTraffic(pVehicle, pTarget, angleToTarget, angleForward); angleToTarget = FindAngleToWeaveThroughTraffic(pVehicle, pTarget, angleToTarget, angleForward);
float steerAngle = LimitRadianAngle(angleToTarget - angleForward); float steerAngle = LimitRadianAngle(angleToTarget - angleForward);
@ -3127,7 +3158,7 @@ bool CCarCtrl::JoinCarWithRoadSystemGotoCoors(CVehicle* pVehicle, CVector vecTar
void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle) void CCarCtrl::FindLinksToGoWithTheseNodes(CVehicle* pVehicle)
{ {
if (pVehicle->m_nRouteSeed) if (pVehicle->m_nRouteSeed)
CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed); CGeneral::SetRandomSeed(pVehicle->m_nRouteSeed++);
int nextLink; int nextLink;
CPathNode* pCurNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nCurrentRouteNode]; CPathNode* pCurNode = &ThePaths.m_pathNodes[pVehicle->AutoPilot.m_nCurrentRouteNode];
for (nextLink = 0; nextLink < 12; nextLink++) for (nextLink = 0; nextLink < 12; nextLink++)
@ -3169,10 +3200,12 @@ void CCarCtrl::GenerateEmergencyServicesCar(void)
return; return;
if (CGame::IsInInterior()) if (CGame::IsInInterior())
return; return;
if (TheCamera.m_WideScreenOn) // TODO(LCS): verify
return;
if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars + if (NumFiretrucksOnDuty + NumAmbulancesOnDuty + NumParkedCars + NumMissionCars +
NumLawEnforcerCars + NumRandomCars > MaxNumberOfCarsInUse) NumLawEnforcerCars + NumRandomCars > MaxNumberOfCarsInUse)
return; return;
if (NumAmbulancesOnDuty == 0){ if (NumAmbulancesOnDuty == 0 /* TODO(LCS): && gbEmergencyVehiclesEnabled */){
if (gAccidentManager.CountActiveAccidents() < 2){ if (gAccidentManager.CountActiveAccidents() < 2){
if (CStreaming::HasModelLoaded(MI_AMBULAN)) if (CStreaming::HasModelLoaded(MI_AMBULAN))
CStreaming::SetModelIsDeletable(MI_MEDIC); CStreaming::SetModelIsDeletable(MI_MEDIC);
@ -3191,7 +3224,7 @@ void CCarCtrl::GenerateEmergencyServicesCar(void)
} }
} }
} }
if (NumFiretrucksOnDuty == 0){ if (NumFiretrucksOnDuty == 0 /* TODO(LCS): && gbEmergencyVehiclesEnabled */){
if (gFireManager.GetTotalActiveFires() < 3){ if (gFireManager.GetTotalActiveFires() < 3){
if (CStreaming::HasModelLoaded(MI_FIRETRUCK)) if (CStreaming::HasModelLoaded(MI_FIRETRUCK))
CStreaming::SetModelIsDeletable(MI_FIREMAN); CStreaming::SetModelIsDeletable(MI_FIREMAN);
@ -3348,6 +3381,17 @@ bool CCarCtrl::MapCouldMoveInThisArea(float x, float y)
#endif #endif
} }
bool
CCarCtrl::BoatWithTallMast(int32 mi)
{
return mi == MI_RIO || mi == MI_TROPIC || mi == MI_MARQUIS;
}
bool CCarCtrl::OkToCreateVehicleAtThisPosition(const CVector& pos)
{
return true;
}
float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type) float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type)
{ {
switch (type) switch (type)
@ -3357,3 +3401,8 @@ float CCarCtrl::FindSpeedMultiplierWithSpeedFromNodes(int8 type)
} }
return 1.0f; return 1.0f;
} }
void CCarCtrl::RenderDebugInfo(CVehicle*)
{
//TODO(LCS)
}

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "PathFind.h" #include "PathFind.h"
#include "Boat.h" #include "Boat.h"
#include "General.h"
#include "Vehicle.h" #include "Vehicle.h"
#define GAME_SPEED_TO_METERS_PER_SECOND 50.0f #define GAME_SPEED_TO_METERS_PER_SECOND 50.0f
@ -130,6 +131,10 @@ public:
static void SteerAIBoatWithPhysicsAttackingPlayer(CVehicle*, float*, float*, float*, bool*); static void SteerAIBoatWithPhysicsAttackingPlayer(CVehicle*, float*, float*, float*, bool*);
static void SteerAICarBlockingPlayerForwardAndBack(CVehicle*, float*, float*, float*, bool*); static void SteerAICarBlockingPlayerForwardAndBack(CVehicle*, float*, float*, float*, bool*);
static bool OkToCreateVehicleAtThisPosition(const CVector&);
static void RenderDebugInfo(CVehicle*);
static float GetATanOfXY(float x, float y) { float t = CGeneral::GetATanOfXY(x, y); if (t < 0.0f) t += TWOPI; return t; }
static float GetPositionAlongCurrentCurve(CVehicle* pVehicle) static float GetPositionAlongCurrentCurve(CVehicle* pVehicle)
{ {
uint32 timeInCurve = CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeEnteredCurve; uint32 timeInCurve = CTimer::GetTimeInMilliseconds() - pVehicle->AutoPilot.m_nTimeEnteredCurve;
@ -138,11 +143,7 @@ public:
static float LimitRadianAngle(float angle) static float LimitRadianAngle(float angle)
{ {
while (angle < -PI) return CGeneral::LimitRadianAngle(angle);
angle += TWOPI;
while (angle > PI)
angle -= TWOPI;
return angle;
} }
static bool bMadDriversCheat; static bool bMadDriversCheat;

View file

@ -1494,9 +1494,9 @@ void CGarage::BuildRotatedDoorMatrix(CEntity * pDoor, float fPosition)
void CGarage::UpdateCrusherAngle() void CGarage::UpdateCrusherAngle()
{ {
RefreshDoorPointers(false); RefreshDoorPointers(false);
m_pDoor2->GetMatrix().SetRotateXOnly(TWOPI - m_fDoorPos); //m_pDoor2->GetMatrix().SetRotateXOnly(TWOPI - m_fDoorPos); TODO
m_pDoor2->GetMatrix().UpdateRW(); //m_pDoor2->GetMatrix().UpdateRW();
m_pDoor2->UpdateRwFrame(); //m_pDoor2->UpdateRwFrame();
} }
void CGarage::UpdateCrusherShake(float X, float Y) void CGarage::UpdateCrusherShake(float X, float Y)

View file

@ -1287,7 +1287,7 @@ void CReplay::TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float ca
DMAudio.SetEffectsFadeVol(0); DMAudio.SetEffectsFadeVol(0);
DMAudio.SetMusicFadeVol(0); DMAudio.SetMusicFadeVol(0);
CEscalators::Shutdown(); CEscalators::Shutdown();
CWaterCreatures::RemoveAll(); //CWaterCreatures::RemoveAll();
int current; int current;
for (current = 0; current < NUM_REPLAYBUFFERS; current++) for (current = 0; current < NUM_REPLAYBUFFERS; current++)
if (BufferStatus[current] == REPLAYBUFFER_RECORD) if (BufferStatus[current] == REPLAYBUFFER_RECORD)

File diff suppressed because it is too large Load diff

View file

@ -47,7 +47,7 @@ void FlushLog();
#define KEY_LENGTH_IN_SCRIPT (8) #define KEY_LENGTH_IN_SCRIPT (8)
//#define GTA_SCRIPT_COLLECTIVE #define GTA_SCRIPT_COLLECTIVE
struct intro_script_rectangle struct intro_script_rectangle
{ {
@ -214,16 +214,34 @@ public:
bool HasCarBeenStuckForAWhile(int32); bool HasCarBeenStuckForAWhile(int32);
}; };
enum {
MAX_STACK_DEPTH = 16,
NUM_LOCAL_VARS = 96,
NUM_TIMERS = 2,
NUM_GLOBAL_SLOTS = 26
};
enum { enum {
ARGUMENT_END = 0, ARGUMENT_END = 0,
ARGUMENT_INT_ZERO,
ARGUMENT_FLOAT_ZERO,
ARGUMENT_FLOAT_1BYTE,
ARGUMENT_FLOAT_2BYTES,
ARGUMENT_FLOAT_3BYTES,
ARGUMENT_INT32, ARGUMENT_INT32,
ARGUMENT_GLOBALVAR,
ARGUMENT_LOCALVAR,
ARGUMENT_INT8, ARGUMENT_INT8,
ARGUMENT_INT16, ARGUMENT_INT16,
ARGUMENT_FLOAT ARGUMENT_FLOAT,
ARGUMENT_TIMER,
ARGUMENT_LOCAL = ARGUMENT_TIMER + NUM_TIMERS,
ARGUMENT_LOCAL_ARRAY = ARGUMENT_LOCAL + NUM_LOCAL_VARS,
ARGUMENT_GLOBAL = ARGUMENT_LOCAL_ARRAY + NUM_LOCAL_VARS,
ARGUMENT_GLOBAL_ARRAY = ARGUMENT_GLOBAL + NUM_GLOBAL_SLOTS,
MAX_ARGUMENT = ARGUMENT_GLOBAL_ARRAY + NUM_GLOBAL_SLOTS
}; };
static_assert(MAX_ARGUMENT <= 256, "MAX_ARGUMENT must be less or equal to 256");
struct tCollectiveData struct tCollectiveData
{ {
int32 colIndex; int32 colIndex;
@ -253,38 +271,31 @@ enum {
VAR_GLOBAL = 2, VAR_GLOBAL = 2,
}; };
enum {
#ifdef PS2
SIZE_MAIN_SCRIPT = 205512,
#else
SIZE_MAIN_SCRIPT = 225512,
#endif
SIZE_MISSION_SCRIPT = 35000,
SIZE_SCRIPT_SPACE = SIZE_MAIN_SCRIPT + SIZE_MISSION_SCRIPT
};
enum { enum {
MAX_NUM_SCRIPTS = 128, MAX_NUM_SCRIPTS = 128,
MAX_NUM_INTRO_TEXT_LINES = 48, MAX_NUM_INTRO_TEXT_LINES = 48,
MAX_NUM_INTRO_RECTANGLES = 16, MAX_NUM_INTRO_RECTANGLES = 16,
MAX_NUM_SCRIPT_SRPITES = 16, MAX_NUM_SCRIPT_SRPITES = 16,
MAX_NUM_SCRIPT_SPHERES = 16, MAX_NUM_SCRIPT_SPHERES = 16,
MAX_NUM_USED_OBJECTS = 220, MAX_NUM_COLLECTIVES = 32,
MAX_NUM_MISSION_SCRIPTS = 120, MAX_NUM_USED_OBJECTS = 305,
MAX_NUM_BUILDING_SWAPS = 25, MAX_NUM_MISSION_SCRIPTS = 150,
MAX_NUM_INVISIBILITY_SETTINGS = 20, MAX_NUM_BUILDING_SWAPS = 80,
MAX_NUM_STORED_LINES = 1024 MAX_NUM_INVISIBILITY_SETTINGS = 52,
MAX_NUM_STORED_LINES = 1024,
MAX_ALLOWED_COLLISIONS = 2
}; };
class CTheScripts class CTheScripts
{ {
public: public:
static uint8 ScriptSpace[SIZE_SCRIPT_SPACE]; static uint8* ScriptSpace;
static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS]; static CRunningScript ScriptsArray[MAX_NUM_SCRIPTS];
static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES]; static intro_text_line IntroTextLines[MAX_NUM_INTRO_TEXT_LINES];
static intro_script_rectangle IntroRectangles[MAX_NUM_INTRO_RECTANGLES]; static intro_script_rectangle IntroRectangles[MAX_NUM_INTRO_RECTANGLES];
static CSprite2d ScriptSprites[MAX_NUM_SCRIPT_SRPITES]; static CSprite2d ScriptSprites[MAX_NUM_SCRIPT_SRPITES];
static script_sphere_struct ScriptSphereArray[MAX_NUM_SCRIPT_SPHERES]; static script_sphere_struct ScriptSphereArray[MAX_NUM_SCRIPT_SPHERES];
static tCollectiveData CollectiveArray[MAX_NUM_COLLECTIVES];
static tUsedObject UsedObjectArray[MAX_NUM_USED_OBJECTS]; static tUsedObject UsedObjectArray[MAX_NUM_USED_OBJECTS];
static int32 MultiScriptArray[MAX_NUM_MISSION_SCRIPTS]; static int32 MultiScriptArray[MAX_NUM_MISSION_SCRIPTS];
static tBuildingSwap BuildingSwapArray[MAX_NUM_BUILDING_SWAPS]; static tBuildingSwap BuildingSwapArray[MAX_NUM_BUILDING_SWAPS];
@ -316,20 +327,22 @@ public:
static uint16 ScriptsUpdated; static uint16 ScriptsUpdated;
static uint32 LastMissionPassedTime; static uint32 LastMissionPassedTime;
static uint16 NumberOfExclusiveMissionScripts; static uint16 NumberOfExclusiveMissionScripts;
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
#define CARDS_IN_SUIT (13)
#define NUM_SUITS (4)
#define MAX_DECKS (6)
#define CARDS_IN_DECK (CARDS_IN_SUIT * NUM_SUITS)
#define CARDS_IN_STACK (CARDS_IN_DECK * MAX_DECKS)
static int16 CardStack[CARDS_IN_STACK];
static int16 CardStackPosition;
#endif
static bool bPlayerIsInTheStatium; static bool bPlayerIsInTheStatium;
static uint8 RiotIntensity; static uint8 RiotIntensity;
static bool bPlayerHasMetDebbieHarry; static bool bPlayerHasMetDebbieHarry;
static void Init(); static int AllowedCollision[MAX_ALLOWED_COLLISIONS];
static short* SavedVarIndices;
static int NumSaveVars;
static bool FSDestroyedFlag;
static int NextProcessId;
static bool InTheScripts;
static CRunningScript* pCurrent;
static uint16 NumTrueGlobals;
static uint16 MostGlobals;
static bool Init(bool loaddata = false);
static void Process(); static void Process();
static CRunningScript* StartTestScript(); static CRunningScript* StartTestScript();
@ -420,6 +433,9 @@ public:
static void SwitchToMission(int32 mission); static void SwitchToMission(int32 mission);
#endif #endif
static int GetSaveVarIndex(int);
static void Shutdown(void);
#ifdef GTA_SCRIPT_COLLECTIVE #ifdef GTA_SCRIPT_COLLECTIVE
static void AdvanceCollectiveIndex() static void AdvanceCollectiveIndex()
{ {
@ -441,12 +457,9 @@ public:
}; };
extern int ScriptParams[32];
enum { VALIDATE_SIZE(uStackReturnValue, 4);
MAX_STACK_DEPTH = 6,
NUM_LOCAL_VARS = 16,
NUM_TIMERS = 2
};
class CRunningScript class CRunningScript
{ {
@ -470,14 +483,25 @@ class CRunningScript
ORS_8 ORS_8
}; };
enum {
STACKVALUE_IP_BITS = 22,
STACKVALUE_INVERT_RETURN_BIT = STACKVALUE_IP_BITS,
STACKVALUE_IS_FUNCTION_CALL_BIT,
STACKVALUE_IP_PARAMS_OFFSET,
STACKVALUE_IP_MASK = ((1 << STACKVALUE_IP_BITS) - 1)
};
public: public:
CRunningScript* next; CRunningScript* next;
CRunningScript* prev; CRunningScript* prev;
int m_nId;
char m_abScriptName[8]; char m_abScriptName[8];
uint32 m_nIp; uint32 m_nIp;
uint32 m_anStack[MAX_STACK_DEPTH]; uint32 m_anStack[MAX_STACK_DEPTH];
uint16 m_nStackPointer; uint16 m_nStackPointer;
int32 m_anLocalVariables[NUM_LOCAL_VARS + NUM_TIMERS]; int32 m_anLocalVariables[NUM_LOCAL_VARS + 8 + NUM_TIMERS]; // TODO(LCS): figure out why 106
int32 m_nLocalsPointer;
bool m_bIsActive; bool m_bIsActive;
bool m_bCondResult; bool m_bCondResult;
bool m_bIsMissionScript; bool m_bIsMissionScript;
@ -497,8 +521,8 @@ public:
void Load(uint8*& buf); void Load(uint8*& buf);
void UpdateTimers(float timeStep) { void UpdateTimers(float timeStep) {
m_anLocalVariables[NUM_LOCAL_VARS] += timeStep; for (int i = 0; i < NUM_TIMERS; i++)
m_anLocalVariables[NUM_LOCAL_VARS + 1] += timeStep; m_anLocalVariables[NUM_LOCAL_VARS + 8 + i] += timeStep;
} }
void Init(); void Init();
@ -509,7 +533,7 @@ public:
static const uint32 nSaveStructSize; static const uint32 nSaveStructSize;
void CollectParameters(uint32*, int16); void CollectParameters(uint32*, int16, int* pParams = (int*)&ScriptParams);
int32 CollectNextParameterWithoutIncreasingPC(uint32); int32 CollectNextParameterWithoutIncreasingPC(uint32);
int32* GetPointerToScriptVariable(uint32*, int16); int32* GetPointerToScriptVariable(uint32*, int16);
void StoreParameters(uint32*, int16); void StoreParameters(uint32*, int16);
@ -534,6 +558,8 @@ public:
int8 ProcessCommands1200To1299(int32); int8 ProcessCommands1200To1299(int32);
int8 ProcessCommands1300To1399(int32); int8 ProcessCommands1300To1399(int32);
int8 ProcessCommands1400To1499(int32); int8 ProcessCommands1400To1499(int32);
int8 ProcessCommands1500To1599(int32);
int8 ProcessCommands1600To1699(int32);
void LocatePlayerCommand(int32, uint32*); void LocatePlayerCommand(int32, uint32*);
void LocatePlayerCharCommand(int32, uint32*); void LocatePlayerCharCommand(int32, uint32*);
@ -571,11 +597,11 @@ public:
float LimitAngleOnCircle(float angle) { return angle < 0.0f ? angle + 360.0f : angle; } float LimitAngleOnCircle(float angle) { return angle < 0.0f ? angle + 360.0f : angle; }
bool ThisIsAValidRandomPed(uint32 pedtype, int civ, int gang, int criminal); bool ThisIsAValidRandomPed(uint32 pedtype, int civ, int gang, int criminal);
bool CheckDamagedWeaponType(int32 actual, int32 type);
bool CheckDamagedWeaponType(int32 actual, int32 type);
static bool ThisIsAValidRandomCop(int32 mi, bool cop, bool swat, bool fbi, bool army, bool miami); static bool ThisIsAValidRandomCop(int32 mi, bool cop, bool swat, bool fbi, bool army, bool miami);
void ReturnFromGosubOrFunction();
}; };
#ifdef USE_DEBUG_SCRIPT_LOADER #ifdef USE_DEBUG_SCRIPT_LOADER
@ -600,3 +626,6 @@ void RetryMission(int, int);
#ifdef USE_DEBUG_SCRIPT_LOADER #ifdef USE_DEBUG_SCRIPT_LOADER
extern int scriptToLoad; extern int scriptToLoad;
#endif #endif
extern int gScriptsFile;

View file

@ -168,7 +168,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command)
*/ */
case COMMAND_DISPLAY_ONSCREEN_TIMER: case COMMAND_DISPLAY_ONSCREEN_TIMER:
{ {
script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR);
m_nIp++; m_nIp++;
uint16 offset = CTheScripts::Read2BytesFromScript(&m_nIp); uint16 offset = CTheScripts::Read2BytesFromScript(&m_nIp);
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
@ -177,14 +177,14 @@ int8 CRunningScript::ProcessCommands300To399(int32 command)
} }
case COMMAND_CLEAR_ONSCREEN_TIMER: case COMMAND_CLEAR_ONSCREEN_TIMER:
{ {
script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR);
m_nIp++; m_nIp++;
CUserDisplay::OnscnTimer.ClearClock((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); CUserDisplay::OnscnTimer.ClearClock((uint16)CTheScripts::Read2BytesFromScript(&m_nIp));
return 0; return 0;
} }
case COMMAND_DISPLAY_ONSCREEN_COUNTER: case COMMAND_DISPLAY_ONSCREEN_COUNTER:
{ {
script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR);
m_nIp++; m_nIp++;
int16 counter = CTheScripts::Read2BytesFromScript(&m_nIp); int16 counter = CTheScripts::Read2BytesFromScript(&m_nIp);
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
@ -193,7 +193,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command)
} }
case COMMAND_CLEAR_ONSCREEN_COUNTER: case COMMAND_CLEAR_ONSCREEN_COUNTER:
{ {
script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR); //script_assert(CTheScripts::ScriptSpace[m_nIp] == ARGUMENT_GLOBALVAR);
m_nIp++; m_nIp++;
CUserDisplay::OnscnTimer.ClearCounter((uint16)CTheScripts::Read2BytesFromScript(&m_nIp)); CUserDisplay::OnscnTimer.ClearCounter((uint16)CTheScripts::Read2BytesFromScript(&m_nIp));
return 0; return 0;
@ -590,7 +590,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command)
//case COMMAND_MOVE_CAMERA_ALONG_SPLINE: //case COMMAND_MOVE_CAMERA_ALONG_SPLINE:
//case COMMAND_GET_CAMERA_POSITION_ALONG_SPLINE: //case COMMAND_GET_CAMERA_POSITION_ALONG_SPLINE:
case COMMAND_DECLARE_MISSION_FLAG: case COMMAND_DECLARE_MISSION_FLAG:
CTheScripts::OnAMissionFlag = (uint16)CTheScripts::Read2BytesFromScript(&++m_nIp); CTheScripts::OnAMissionFlag = GetPointerToScriptVariable(&m_nIp, VAR_GLOBAL) - (int32*)CTheScripts::ScriptSpace;
return 0; return 0;
case COMMAND_DECLARE_MISSION_FLAG_FOR_CONTACT: case COMMAND_DECLARE_MISSION_FLAG_FOR_CONTACT:
return 0; return 0;

View file

@ -1639,7 +1639,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
UpdateCompareFlag(TheCamera.IsSphereVisible(pObject->GetBoundCentre(), pObject->GetBoundRadius())); UpdateCompareFlag(TheCamera.IsSphereVisible(pObject->GetBoundCentre(), pObject->GetBoundRadius()));
return 0; return 0;
} }
/*
case COMMAND_GOSUB_FILE: case COMMAND_GOSUB_FILE:
{ {
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
@ -1649,7 +1648,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
// ScriptParams[1] == filename // ScriptParams[1] == filename
return 0; return 0;
} }
*/
case COMMAND_GET_GROUND_Z_FOR_3D_COORD: case COMMAND_GET_GROUND_Z_FOR_3D_COORD:
{ {
CollectParameters(&m_nIp, 3); CollectParameters(&m_nIp, 3);
@ -2126,7 +2124,6 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], 0); CGarages::ChangeGarageType(ScriptParams[0], ScriptParams[1], 0);
return 0; return 0;
/*
case COMMAND_ACTIVATE_CRUSHER_CRANE: case COMMAND_ACTIVATE_CRUSHER_CRANE:
{ {
CollectParameters(&m_nIp, 10); CollectParameters(&m_nIp, 10);
@ -2148,6 +2145,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command)
*(float*)&ScriptParams[0], *(float*)&ScriptParams[1]); *(float*)&ScriptParams[0], *(float*)&ScriptParams[1]);
return 0; return 0;
} }
/*
case COMMAND_PRINT_WITH_2_NUMBERS: case COMMAND_PRINT_WITH_2_NUMBERS:
{ {
wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp); wchar* text = CTheScripts::GetTextByKeyFromScript(&m_nIp);

View file

@ -1781,7 +1781,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
*/ */
case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_STRING: case COMMAND_DISPLAY_ONSCREEN_TIMER_WITH_STRING:
{ {
script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); //script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR);
uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp);
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ???
@ -1792,7 +1792,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command)
} }
case COMMAND_DISPLAY_ONSCREEN_COUNTER_WITH_STRING: case COMMAND_DISPLAY_ONSCREEN_COUNTER_WITH_STRING:
{ {
script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); //script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR);
uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp);
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ???

View file

@ -2556,7 +2556,7 @@ void CTheScripts::SetObjectiveForAllPedsInCollective(int colIndex, eObjective ob
} }
else { else {
pPed->bScriptObjectiveCompleted = false; pPed->bScriptObjectiveCompleted = false;
pPed->SetObjective(objective, p1, p2); //pPed->SetObjective(objective, p1, p2); TODO!
} }
} }
} }
@ -2740,6 +2740,9 @@ void CTheScripts::ReadObjectNamesFromScript()
{ {
int32 varSpace = GetSizeOfVariableSpace(); int32 varSpace = GetSizeOfVariableSpace();
uint32 ip = varSpace + 8; uint32 ip = varSpace + 8;
NumSaveVars = Read4BytesFromScript(&ip);
SavedVarIndices = (short*)&ScriptParams[ip];
ip += 2 * NumSaveVars;
NumberOfUsedObjects = Read2BytesFromScript(&ip); NumberOfUsedObjects = Read2BytesFromScript(&ip);
ip += 2; ip += 2;
for (uint16 i = 0; i < NumberOfUsedObjects; i++) { for (uint16 i = 0; i < NumberOfUsedObjects; i++) {
@ -2759,7 +2762,7 @@ void CTheScripts::UpdateObjectIndices()
CBaseModelInfo* pModel = CModelInfo::GetModelInfo(j); CBaseModelInfo* pModel = CModelInfo::GetModelInfo(j);
if (!pModel) if (!pModel)
continue; continue;
strcpy(name, pModel->GetName()); strcpy(name, pModel->GetModelName());
#ifdef FIX_BUGS #ifdef FIX_BUGS
for (int k = 0; k < USED_OBJECT_NAME_LENGTH && name[k]; k++) for (int k = 0; k < USED_OBJECT_NAME_LENGTH && name[k]; k++)
#else #else
@ -2784,7 +2787,8 @@ void CTheScripts::ReadMultiScriptFileOffsetsFromScript()
uint32 ip = varSpace + 3; uint32 ip = varSpace + 3;
int32 objectSize = Read4BytesFromScript(&ip); int32 objectSize = Read4BytesFromScript(&ip);
ip = objectSize + 8; ip = objectSize + 8;
MainScriptSize = Read4BytesFromScript(&ip); NumTrueGlobals = Read2BytesFromScript(&ip);
MostGlobals = Read2BytesFromScript(&ip);
LargestMissionScriptSize = Read4BytesFromScript(&ip); LargestMissionScriptSize = Read4BytesFromScript(&ip);
NumberOfMissionScripts = Read2BytesFromScript(&ip); NumberOfMissionScripts = Read2BytesFromScript(&ip);
NumberOfExclusiveMissionScripts = Read2BytesFromScript(&ip); NumberOfExclusiveMissionScripts = Read2BytesFromScript(&ip);

View file

@ -374,32 +374,30 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
{ {
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
if (CTheScripts::NumberOfExclusiveMissionScripts > 0 && ScriptParams[0] <= UINT16_MAX - 2) if (CTheScripts::NumberOfExclusiveMissionScripts > 0) {
return 0; if (ScriptParams[0] < UINT16_MAX - 1)
return 0;
ScriptParams[0] = UINT16_MAX - ScriptParams[0];
}
#ifdef MISSION_REPLAY #ifdef MISSION_REPLAY
missionRetryScriptIndex = ScriptParams[0]; missionRetryScriptIndex = ScriptParams[0];
if (missionRetryScriptIndex == 19) if (missionRetryScriptIndex == 19)
CStats::LastMissionPassedName[0] = '\0'; CStats::LastMissionPassedName[0] = '\0';
#endif #endif
CTimer::Suspend(); CTimer::Suspend();
int offset = CTheScripts::MultiScriptArray[ScriptParams[0]]; int offset = CTheScripts::MultiScriptArray[ScriptParams[0]] + 8;
#ifdef USE_DEBUG_SCRIPT_LOADER int size = CTheScripts::MultiScriptArray[ScriptParams[0] + 1] - CTheScripts::MultiScriptArray[ScriptParams[0]];
CFileMgr::ChangeDir("\\data\\"); if (size <= 0)
int handle = CFileMgr::OpenFile(scriptfile, "rb"); size = CTheScripts::LargestMissionScriptSize;
CFileMgr::ChangeDir("\\"); CFileMgr::Seek(gScriptsFile, offset, 0);
#else CFileMgr::Read(gScriptsFile, (const char*)&CTheScripts::ScriptSpace[CTheScripts::MainScriptSize], size); // TODO
CFileMgr::ChangeDir("\\"); CRunningScript* pMissionScript = CTheScripts::StartNewScript(CTheScripts::MainScriptSize);
int handle = CFileMgr::OpenFile("data\\main.scm", "rb");
#endif
CFileMgr::Seek(handle, offset, 0);
CFileMgr::Read(handle, (const char*)&CTheScripts::ScriptSpace[SIZE_MAIN_SCRIPT], SIZE_MISSION_SCRIPT);
CFileMgr::CloseFile(handle);
CRunningScript* pMissionScript = CTheScripts::StartNewScript(SIZE_MAIN_SCRIPT);
CTimer::Resume(); CTimer::Resume();
pMissionScript->m_bIsMissionScript = true; pMissionScript->m_bIsMissionScript = true;
pMissionScript->m_bMissionFlag = true; pMissionScript->m_bMissionFlag = true;
CTheScripts::bAlreadyRunningAMissionScript = true; CTheScripts::bAlreadyRunningAMissionScript = true;
CGameLogic::ClearShortCut(); memset(&CTheScripts::ScriptSpace[CTheScripts::NumTrueGlobals * 4 + 8], 0, CTheScripts::MostGlobals * 4);
pMissionScript->Process();
return 0; return 0;
} }
case COMMAND_SET_OBJECT_DRAW_LAST: case COMMAND_SET_OBJECT_DRAW_LAST:

View file

@ -540,7 +540,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
case COMMAND_DISPLAY_NTH_ONSCREEN_COUNTER_WITH_STRING: case COMMAND_DISPLAY_NTH_ONSCREEN_COUNTER_WITH_STRING:
{ {
char onscreen_str[12]; char onscreen_str[12];
script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); //script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR);
uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp);
CollectParameters(&m_nIp, 2); CollectParameters(&m_nIp, 2);
wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ??? wchar* text = TheText.Get((char*)&CTheScripts::ScriptSpace[m_nIp]); // ???
@ -625,7 +625,7 @@ int8 CRunningScript::ProcessCommands1200To1299(int32 command)
key[i] = tolower(key[i]); key[i] = tolower(key[i]);
CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed; CPed* pPed = CWorld::Players[ScriptParams[0]].m_pPed;
script_assert(pPed); script_assert(pPed);
UpdateCompareFlag(strcmp(key, CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetName()) == 0); UpdateCompareFlag(strcmp(key, CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetModelName()) == 0);
return 0; return 0;
} }
case COMMAND_SET_PLAYER_CAN_DO_DRIVE_BY: case COMMAND_SET_PLAYER_CAN_DO_DRIVE_BY:

View file

@ -384,7 +384,6 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
} }
return 0; return 0;
} }
#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT)
case COMMAND_IS_JAPANESE_GAME: case COMMAND_IS_JAPANESE_GAME:
#ifdef MORE_LANGUAGES #ifdef MORE_LANGUAGES
UpdateCompareFlag(FrontEndMenuManager.m_PrefsLanguage == LANGUAGE_JAPANESE); UpdateCompareFlag(FrontEndMenuManager.m_PrefsLanguage == LANGUAGE_JAPANESE);
@ -394,218 +393,697 @@ int8 CRunningScript::ProcessCommands1400To1499(int32 command)
UpdateCompareFlag(false); UpdateCompareFlag(false);
#endif #endif
return 0; return 0;
#elif (!defined GTA_PS2) case COMMAND_1442:
case COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED: script_assert(false);
script_assert(CTheScripts::ScriptSpace[m_nIp++] == ARGUMENT_GLOBALVAR); return 0;
uint16 var = CTheScripts::Read2BytesFromScript(&m_nIp); case COMMAND_1443:
script_assert(false);
return 0;
case COMMAND_1444:
script_assert(false);
return 0;
case COMMAND_1445:
script_assert(false);
return 0;
case COMMAND_1446:
script_assert(false);
return 0;
case COMMAND_1447:
script_assert(false);
return 0;
case COMMAND_1448:
script_assert(false);
return 0;
case COMMAND_1449:
script_assert(false);
return 0;
case COMMAND_1450:
script_assert(false);
return 0;
case COMMAND_1451:
script_assert(false);
return 0;
case COMMAND_1452:
script_assert(false);
return 0;
case COMMAND_1453:
script_assert(false);
return 0;
case COMMAND_CALL:
case COMMAND_NOTCALL:
{
m_anStack[m_nStackPointer++] = m_nIp | BIT(STACKVALUE_IS_FUNCTION_CALL_BIT) | ((command == COMMAND_NOTCALL) ? BIT(STACKVALUE_INVERT_RETURN_BIT) : 0);
uint8 nInputParams = CTheScripts::Read1ByteFromScript(&m_nIp);
uint8 nOutputParameters = CTheScripts::Read1ByteFromScript(&m_nIp);
uint8 nLocalsOffset = CTheScripts::Read1ByteFromScript(&m_nIp);
uint32 nIPBeforeParameters = m_nIp;
CollectParameters(&m_nIp, 1); CollectParameters(&m_nIp, 1);
//CUserDisplay::OnscnTimer.SetCounterFlashWhenFirstDisplayed(var, ScriptParams[0]); if (nInputParams)
break; CollectParameters(&m_nIp, nInputParams, &m_anLocalVariables[m_nLocalsPointer + nLocalsOffset]);
#endif m_nLocalsPointer += nLocalsOffset;
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) m_anStack[m_nStackPointer - 1] |= (m_nIp - nIPBeforeParameters) << STACKVALUE_IP_PARAMS_OFFSET;
case COMMAND_SHUFFLE_CARD_DECKS: if (ScriptParams[0] < 0)
{ m_nIp = CTheScripts::MainScriptSize - ScriptParams[0];
CollectParameters(&m_nIp, 1);
script_assert(ScriptParams[0] >= 0 && ScriptParams[0] <= 6);
for (int i = 0; i < CARDS_IN_STACK; i++)
CTheScripts::CardStack[i] = 0;
int16 seq[CARDS_IN_STACK];
for (int i = 0; i < MAX_DECKS * CARDS_IN_DECK; i++)
seq[i] = i;
int cards_left = CARDS_IN_DECK * ScriptParams[0];
for (int k = 1; k < CARDS_IN_DECK + 1; k++) {
for (int deck = 0; deck < ScriptParams[0]; deck++) {
int index = CGeneral::GetRandomNumberInRange(0, cards_left);
CTheScripts::CardStack[seq[index]] = k;
for (int l = index; l < cards_left; l++) {
if (l + 1 < CARDS_IN_STACK)
seq[l] = seq[l + 1];
else
seq[l] = 0;
}
--cards_left;
}
}
CTheScripts::CardStackPosition = 0;
return 0;
}
case COMMAND_FETCH_NEXT_CARD:
{
if (CTheScripts::CardStack[CTheScripts::CardStackPosition] == 0)
CTheScripts::CardStackPosition = 0;
ScriptParams[0] = CTheScripts::CardStack[CTheScripts::CardStackPosition++];
if (CTheScripts::CardStackPosition == CARDS_IN_DECK * MAX_DECKS)
CTheScripts::CardStackPosition = 0;
StoreParameters(&m_nIp, 1);
return 0;
}
case COMMAND_GET_OBJECT_VELOCITY:
{
CollectParameters(&m_nIp, 1);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
*(CVector*)ScriptParams[0] = GAME_SPEED_TO_METERS_PER_SECOND * pObject->GetMoveSpeed();
StoreParameters(&m_nIp, 3);
return 0;
}
case COMMAND_IS_DEBUG_CAMERA_ON:
UpdateCompareFlag(TheCamera.WorldViewerBeingUsed);
return 0;
case COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY:
{
CollectParameters(&m_nIp, 4);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
CVector newSpeed = pObject->GetTurnSpeed() + *(CVector*)ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND;
if (pObject->bIsStatic) {
pObject->SetIsStatic(false);
pObject->AddToMovingList();
}
pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z);
return 0;
}
case COMMAND_SET_OBJECT_ROTATION_VELOCITY:
{
CollectParameters(&m_nIp, 4);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
CVector newSpeed = *(CVector*)ScriptParams[1] / GAME_SPEED_TO_METERS_PER_SECOND;
if (pObject->bIsStatic) {
pObject->SetIsStatic(false);
pObject->AddToMovingList();
}
pObject->SetTurnSpeed(newSpeed.x, newSpeed.y, newSpeed.z);
return 0;
}
case COMMAND_IS_OBJECT_STATIC:
{
CollectParameters(&m_nIp, 1);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
UpdateCompareFlag(pObject->GetIsStatic());
return 0;
}
case COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS:
{
CollectParameters(&m_nIp, 4);
CVector2D v1 = *(CVector2D*)ScriptParams[0];
CVector2D v2 = *(CVector2D*)ScriptParams[2];
float c = DotProduct2D(v1, v2) / (v1.Magnitude() * v2.Magnitude());
#ifdef FIX_BUGS // command is a SA leftover where it was fixed to this
*(float*)ScriptParams[0] = RADTODEG(Acos(c));
#else
*(float*)ScriptParams[0] = Acos(c);
#endif
return 0;
}
case COMMAND_DO_2D_RECTANGLES_COLLIDE:
{
CollectParameters(&m_nIp, 8);
float infX1 = *(float*)&ScriptParams[0] - *(float*)&ScriptParams[2] * 0.5; // NB: not float
float supX1 = *(float*)&ScriptParams[0] + *(float*)&ScriptParams[2] * 0.5;
float infX2 = *(float*)&ScriptParams[4] - *(float*)&ScriptParams[6] * 0.5;
float supX2 = *(float*)&ScriptParams[4] + *(float*)&ScriptParams[6] * 0.5;
float infY1 = *(float*)&ScriptParams[1] - *(float*)&ScriptParams[3] * 0.5;
float supY1 = *(float*)&ScriptParams[1] + *(float*)&ScriptParams[3] * 0.5;
float infY2 = *(float*)&ScriptParams[5] - *(float*)&ScriptParams[7] * 0.5;
float supY2 = *(float*)&ScriptParams[5] + *(float*)&ScriptParams[7] * 0.5;
bool collide = true;
if (infY2 > supY1)
collide = false;
if (infY1 > supY2)
collide = false;
if (infX2 > supX1)
collide = false;
if (infX1 > supX2)
collide = false;
UpdateCompareFlag(collide);
return 0;
}
case COMMAND_GET_OBJECT_ROTATION_VELOCITY:
{
CollectParameters(&m_nIp, 1);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
*(CVector*)ScriptParams[0] = pObject->GetTurnSpeed() * GAME_SPEED_TO_METERS_PER_SECOND;
StoreParameters(&m_nIp, 3);
return 0;
}
case COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY:
{
CollectParameters(&m_nIp, 4);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
CVector vecAddition = *(CVector*)&ScriptParams[1] * CTimer::GetTimeStep() / GAME_SPEED_TO_METERS_PER_SECOND;
if (!pObject->bIsStatic) {
CVector vecCurrSpeed = pObject->GetSpeed();
vecCurrSpeed.Normalise();
if (vecCurrSpeed.z != 1.0) { // NB: not float!
CVector vx = CrossProduct(vecCurrSpeed, CVector(0.0f, 0.0f, 1.0f));
vx.Normalise();
CVector vz = CrossProduct(vx, vecCurrSpeed);
vz.Normalise();
CVector vecNewSpeed = pObject->GetSpeed() + vecAddition.x * vx + vecAddition.y * vecCurrSpeed + vecAddition.z * vecCurrSpeed;
if (pObject->bIsStatic) {
pObject->SetIsStatic(false);
pObject->AddToMovingList();
}
pObject->SetMoveSpeed(vecNewSpeed);
}
}
return 0;
}
case COMMAND_GET_OBJECT_SPEED:
{
CollectParameters(&m_nIp, 1);
CObject* pObject = CPools::GetObjectPool()->GetAt(ScriptParams[0]);
*(float*)ScriptParams[0] = pObject->GetMoveSpeed().Magnitude() * GAME_SPEED_TO_METERS_PER_SECOND;
StoreParameters(&m_nIp, 1);
return 0;
}
#endif
#if (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT)
case COMMAND_IS_MISSION_SKIP:
#ifdef MISSION_REPLAY
ScriptParams[0] = MissionSkipLevel;
#else
ScriptParams[0] = 0;
#endif
StoreParameters(&m_nIp, 1);
return 0;
case COMMAND_SET_IN_AMMUNATION:
CollectParameters(&m_nIp, 1);
#ifdef MISSION_REPLAY
IsInAmmunation = ScriptParams[0];
#endif
return 0;
case COMMAND_DO_SAVE_GAME:
CollectParameters(&m_nIp, 1);
#ifdef MISSION_REPLAY
SaveGameForPause(ScriptParams[0]);
#endif
return 0;
case COMMAND_IS_RETRY:
#ifdef MISSION_REPLAY
if (strcmp(m_abScriptName, "porno4") != 0)
ScriptParams[0] = AllowMissionReplay;
#ifdef FIX_BUGS
else else
ScriptParams[0] = gbTryingPorn4Again; m_nIp = ScriptParams[0];
#else
else if (gbTryingPorn4Again)
ScriptParams[0] = 1;
#endif
#else
ScriptParams[0] = 0;
#endif
StoreParameters(&m_nIp, 1);
return 0; return 0;
case COMMAND_DUMMY: }
case COMMAND_1456:
script_assert(false);
return 0; return 0;
#endif case COMMAND_1457:
#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) script_assert(false);
// it is unknown what these commands do but they don't take parameters
case COMMAND_MARK_CUTSCENE_START:
return 0; return 0;
case COMMAND_MARK_CUTSCENE_END: case COMMAND_1458:
script_assert(false);
return 0; return 0;
case COMMAND_CUTSCENE_SCROLL: case COMMAND_1459:
script_assert(false);
return 0;
case COMMAND_1460:
script_assert(false);
return 0;
case COMMAND_1461:
script_assert(false);
return 0;
case COMMAND_1462:
script_assert(false);
return 0;
case COMMAND_1463:
script_assert(false);
return 0;
case COMMAND_1464:
script_assert(false);
return 0;
case COMMAND_1465:
script_assert(false);
return 0;
case COMMAND_1466:
script_assert(false);
return 0;
case COMMAND_1467:
script_assert(false);
return 0;
case COMMAND_1468:
script_assert(false);
return 0;
case COMMAND_1469:
script_assert(false);
return 0;
case COMMAND_1470:
script_assert(false);
return 0;
case COMMAND_1471:
script_assert(false);
return 0;
case COMMAND_1472:
script_assert(false);
return 0;
case COMMAND_1473:
script_assert(false);
return 0;
case COMMAND_1474:
script_assert(false);
return 0;
case COMMAND_1475:
script_assert(false);
return 0;
case COMMAND_1476:
script_assert(false);
return 0;
case COMMAND_1477:
script_assert(false);
return 0;
case COMMAND_1478:
script_assert(false);
return 0;
case COMMAND_1479:
script_assert(false);
return 0;
case COMMAND_1480:
script_assert(false);
return 0;
case COMMAND_1481:
script_assert(false);
return 0;
case COMMAND_1482:
script_assert(false);
return 0;
case COMMAND_1483:
script_assert(false);
return 0;
case COMMAND_1484:
script_assert(false);
return 0;
case COMMAND_1485:
script_assert(false);
return 0;
case COMMAND_1486:
script_assert(false);
return 0;
case COMMAND_1487:
script_assert(false);
return 0;
case COMMAND_1488:
script_assert(false);
return 0;
case COMMAND_1489:
script_assert(false);
return 0;
case COMMAND_1490:
script_assert(false);
return 0;
case COMMAND_1491:
script_assert(false);
return 0;
case COMMAND_1492:
script_assert(false);
return 0;
case COMMAND_1493:
script_assert(false);
return 0;
case COMMAND_1494:
script_assert(false);
return 0;
case COMMAND_1495:
script_assert(false);
return 0;
case COMMAND_1496:
script_assert(false);
return 0;
case COMMAND_1497:
script_assert(false);
return 0;
case COMMAND_1498:
script_assert(false);
return 0;
case COMMAND_1499:
script_assert(false);
return 0;
default:
script_assert(0);
}
return -1;
}
int8 CRunningScript::ProcessCommands1500To1599(int32 command)
{
switch (command) {
case COMMAND_1500:
script_assert(false);
return 0;
case COMMAND_1501:
script_assert(false);
return 0;
case COMMAND_1502:
script_assert(false);
return 0;
case COMMAND_1503:
script_assert(false);
return 0;
case COMMAND_1504:
script_assert(false);
return 0;
case COMMAND_1505:
script_assert(false);
return 0;
case COMMAND_1506:
script_assert(false);
return 0;
case COMMAND_1507:
script_assert(false);
return 0;
case COMMAND_1508:
script_assert(false);
return 0;
case COMMAND_1509:
script_assert(false);
return 0;
case COMMAND_1510:
script_assert(false);
return 0;
case COMMAND_1511:
script_assert(false);
return 0;
case COMMAND_1512:
script_assert(false);
return 0;
case COMMAND_1513:
script_assert(false);
return 0;
case COMMAND_1514:
script_assert(false);
return 0;
case COMMAND_1515:
script_assert(false);
return 0;
case COMMAND_1516:
script_assert(false);
return 0;
case COMMAND_1517:
script_assert(false);
return 0;
case COMMAND_1518:
script_assert(false);
return 0;
case COMMAND_1519:
CollectParameters(&m_nIp, 1);
// TODO (SET_NUMBER_USJ_FOUND?)
return 0;
case COMMAND_1520:
CollectParameters(&m_nIp, 1);
// TODO (SET_TOTAL_HIDDEN_PACKAGES?)
return 0;
case COMMAND_1521:
script_assert(false);
return 0;
case COMMAND_1522:
script_assert(false);
return 0;
case COMMAND_1523:
script_assert(false);
return 0;
case COMMAND_1524:
script_assert(false);
return 0;
case COMMAND_1525:
script_assert(false);
return 0;
case COMMAND_1526:
script_assert(false);
return 0;
case COMMAND_1527:
script_assert(false);
return 0;
case COMMAND_1528:
script_assert(false);
return 0;
case COMMAND_1529:
script_assert(false);
return 0;
case COMMAND_1530:
script_assert(false);
return 0;
case COMMAND_1531:
script_assert(false);
return 0;
case COMMAND_1532:
script_assert(false);
return 0;
case COMMAND_1533:
script_assert(false);
return 0;
case COMMAND_1534:
script_assert(false);
return 0;
case COMMAND_1535:
script_assert(false);
return 0;
case COMMAND_1536:
script_assert(false);
return 0;
case COMMAND_1537:
script_assert(false);
return 0;
case COMMAND_1538:
script_assert(false);
return 0;
case COMMAND_1539:
script_assert(false);
return 0;
case COMMAND_1540:
script_assert(false);
return 0;
case COMMAND_1541:
script_assert(false);
return 0;
case COMMAND_1542:
script_assert(false);
return 0;
case COMMAND_1543:
script_assert(false);
return 0;
case COMMAND_1544:
script_assert(false);
return 0;
case COMMAND_1545:
script_assert(false);
return 0;
case COMMAND_1546:
script_assert(false);
return 0;
case COMMAND_1547:
script_assert(false);
return 0;
case COMMAND_1548:
script_assert(false);
return 0;
case COMMAND_1549:
CollectParameters(&m_nIp, 1);
// TODO (SET_ONFOOT_CAMERA_MODE?)
return 0;
case COMMAND_1550:
script_assert(false);
return 0;
case COMMAND_1551:
script_assert(false);
return 0;
case COMMAND_1552:
script_assert(false);
return 0;
case COMMAND_1553:
script_assert(false);
return 0;
case COMMAND_1554:
script_assert(false);
return 0;
case COMMAND_1555:
CollectParameters(&m_nIp, 1);
// TODO (FREEZE_ONFOOT_CAMERA_MODE?)
return 0;
case COMMAND_1556:
script_assert(false);
return 0;
case COMMAND_1557:
script_assert(false);
return 0;
case COMMAND_1558:
script_assert(false);
return 0;
case COMMAND_1559:
script_assert(false);
return 0;
case COMMAND_1560:
// TODO (IS_E3_BUILD?)
UpdateCompareFlag(false);
return 0;
case COMMAND_1561:
script_assert(false);
return 0;
case COMMAND_1562:
script_assert(false);
return 0;
case COMMAND_1563:
script_assert(false);
return 0;
case COMMAND_1564:
script_assert(false);
return 0;
case COMMAND_1565:
script_assert(false);
return 0;
case COMMAND_1566:
script_assert(false);
return 0;
case COMMAND_1567:
script_assert(false);
return 0;
case COMMAND_1568:
script_assert(false);
return 0;
case COMMAND_1569:
// TODO (IS_MULTIPLAYER_ACTIVE?)
UpdateCompareFlag(false);
return 0;
case COMMAND_1570:
script_assert(false);
return 0;
case COMMAND_1571:
script_assert(false);
return 0;
case COMMAND_1572:
script_assert(false);
return 0;
case COMMAND_1573:
script_assert(false);
return 0;
case COMMAND_1574:
script_assert(false);
return 0;
case COMMAND_1575:
script_assert(false);
return 0;
case COMMAND_1576:
script_assert(false);
return 0;
case COMMAND_1577:
script_assert(false);
return 0;
case COMMAND_1578:
script_assert(false);
return 0;
case COMMAND_1579:
script_assert(false);
return 0;
case COMMAND_1580:
script_assert(false);
return 0;
case COMMAND_1581:
script_assert(false);
return 0;
case COMMAND_1582:
script_assert(false);
return 0;
case COMMAND_1583:
script_assert(false);
return 0;
case COMMAND_1584:
script_assert(false);
return 0;
case COMMAND_1585:
script_assert(false);
return 0;
case COMMAND_1586:
script_assert(false);
return 0;
case COMMAND_1587:
script_assert(false);
return 0;
case COMMAND_1588:
script_assert(false);
return 0;
case COMMAND_1589:
CollectParameters(&m_nIp, 2);
// TODO (SWAP_BUILDING?)
return 0;
case COMMAND_1590:
script_assert(false);
return 0;
case COMMAND_1591:
script_assert(false);
return 0;
case COMMAND_1592:
script_assert(false);
return 0;
case COMMAND_1593:
script_assert(false);
return 0;
case COMMAND_1594:
script_assert(false);
return 0;
case COMMAND_1595:
script_assert(false);
return 0;
case COMMAND_1596:
script_assert(false);
return 0;
case COMMAND_1597:
script_assert(false);
return 0;
case COMMAND_1598:
script_assert(false);
return 0;
case COMMAND_1599:
script_assert(false);
return 0;
default:
script_assert(0);
}
return -1;
}
int8 CRunningScript::ProcessCommands1600To1699(int32 command)
{
switch (command) {
case COMMAND_1600:
script_assert(false);
return 0;
case COMMAND_1601:
script_assert(false);
return 0;
case COMMAND_1602:
script_assert(false);
return 0;
case COMMAND_1603:
script_assert(false);
return 0;
case COMMAND_1604:
script_assert(false);
return 0;
case COMMAND_1605:
script_assert(false);
return 0;
case COMMAND_1606:
script_assert(false);
return 0;
case COMMAND_1607:
script_assert(false);
return 0;
case COMMAND_1608:
script_assert(false);
return 0;
case COMMAND_1609:
script_assert(false);
return 0;
case COMMAND_1610:
script_assert(false);
return 0;
case COMMAND_1611:
script_assert(false);
return 0;
case COMMAND_1612:
script_assert(false);
return 0;
case COMMAND_1613:
script_assert(false);
return 0;
case COMMAND_1614:
script_assert(false);
return 0;
case COMMAND_1615:
script_assert(false);
return 0;
case COMMAND_1616:
script_assert(false);
return 0;
case COMMAND_1617:
script_assert(false);
return 0;
case COMMAND_1618:
script_assert(false);
return 0;
case COMMAND_1619:
script_assert(false);
return 0;
case COMMAND_1620:
script_assert(false);
return 0;
case COMMAND_1621:
script_assert(false);
return 0;
case COMMAND_1622:
script_assert(false);
return 0;
case COMMAND_1623:
script_assert(false);
return 0;
case COMMAND_1624:
script_assert(false);
return 0;
case COMMAND_1625:
script_assert(false);
return 0;
case COMMAND_1626:
script_assert(false);
return 0;
case COMMAND_1627:
script_assert(false);
return 0;
case COMMAND_1628:
script_assert(false);
return 0;
case COMMAND_1629:
script_assert(false);
return 0;
case COMMAND_1630:
script_assert(false);
return 0;
case COMMAND_1631:
script_assert(false);
return 0;
case COMMAND_1632:
script_assert(false);
return 0;
case COMMAND_1633:
script_assert(false);
return 0;
case COMMAND_1634:
script_assert(false);
return 0;
case COMMAND_1635:
{
char tmp[12]; // TODO
CTheScripts::ReadTextLabelFromScript(&m_nIp, tmp);
m_nIp += KEY_LENGTH_IN_SCRIPT;
// TODO (CHANGE_STORED_PLAYER_OUTFIT?)
return 0;
}
case COMMAND_1636:
script_assert(false);
return 0;
case COMMAND_1637:
script_assert(false);
return 0;
case COMMAND_1638:
script_assert(false);
return 0;
case COMMAND_1639:
script_assert(false);
return 0;
case COMMAND_1640:
CollectParameters(&m_nIp, 2);
// TODO (LOCK_GARAGE?)
return 0;
case COMMAND_1641:
script_assert(false);
return 0;
case COMMAND_1642:
script_assert(false);
return 0;
case COMMAND_1643:
script_assert(false);
return 0;
case COMMAND_1644:
script_assert(false);
return 0;
case COMMAND_1645:
script_assert(false);
return 0;
case COMMAND_1646:
CollectParameters(&m_nIp, 1);
// TODO (DISABLE_PAUSE_MENU?)
return 0;
case COMMAND_1647:
script_assert(false);
return 0;
case COMMAND_1648:
CollectParameters(&m_nIp, 3);
// TODO (SET_CLOCK_EVENT_WARNING);
return 0;
case COMMAND_1649:
script_assert(false);
return 0;
case COMMAND_1650:
script_assert(false);
return 0;
case COMMAND_1651:
script_assert(false);
return 0;
case COMMAND_1652:
script_assert(false);
return 0;
case COMMAND_1653:
script_assert(false);
return 0;
case COMMAND_1654:
script_assert(false);
return 0;
case COMMAND_1655:
script_assert(false);
return 0;
case COMMAND_1656:
script_assert(false);
return 0; return 0;
#endif
default: default:
script_assert(0); script_assert(0);
} }

View file

@ -215,6 +215,11 @@ enum {
COMMAND_WHILE, COMMAND_WHILE,
COMMAND_WHILENOT, COMMAND_WHILENOT,
COMMAND_ENDWHILE, COMMAND_ENDWHILE,
COMMAND_214,
COMMAND_215,
COMMAND_216,
COMMAND_217,
COMMAND_218,
COMMAND_ANDOR, COMMAND_ANDOR,
COMMAND_LAUNCH_MISSION, COMMAND_LAUNCH_MISSION,
COMMAND_MISSION_HAS_FINISHED, COMMAND_MISSION_HAS_FINISHED,
@ -1437,39 +1442,222 @@ enum {
COMMAND_REGISTER_FIRE_LEVEL, COMMAND_REGISTER_FIRE_LEVEL,
COMMAND_IS_AUSTRALIAN_GAME, COMMAND_IS_AUSTRALIAN_GAME,
COMMAND_DISARM_CAR_BOMB, COMMAND_DISARM_CAR_BOMB,
#if (defined GTAVC_JP_PATCH || defined SUPPORT_JAPANESE_SCRIPT)
COMMAND_IS_JAPANESE_GAME, COMMAND_IS_JAPANESE_GAME,
#elif (!defined GTA_PS2) COMMAND_1442,
COMMAND_SET_ONSCREEN_COUNTER_FLASH_WHEN_FIRST_DISPLAYED, COMMAND_1443,
#endif COMMAND_1444,
#if (defined GTA_PC && !defined GTAVC_JP_PATCH || defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT || defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) COMMAND_1445,
COMMAND_SHUFFLE_CARD_DECKS, COMMAND_1446,
COMMAND_FETCH_NEXT_CARD, COMMAND_1447,
COMMAND_GET_OBJECT_VELOCITY, COMMAND_1448,
COMMAND_IS_DEBUG_CAMERA_ON, COMMAND_1449,
COMMAND_ADD_TO_OBJECT_ROTATION_VELOCITY, COMMAND_1450,
COMMAND_SET_OBJECT_ROTATION_VELOCITY, COMMAND_1451,
COMMAND_IS_OBJECT_STATIC, COMMAND_1452,
COMMAND_GET_ANGLE_BETWEEN_2D_VECTORS, COMMAND_1453,
COMMAND_DO_2D_RECTANGLES_COLLIDE, COMMAND_CALL,
COMMAND_GET_OBJECT_ROTATION_VELOCITY, COMMAND_NOTCALL,
COMMAND_ADD_VELOCITY_RELATIVE_TO_OBJECT_VELOCITY, COMMAND_1456,
COMMAND_GET_OBJECT_SPEED, COMMAND_1457,
#endif COMMAND_1458,
#if (defined GTA_XBOX || defined SUPPORT_XBOX_SCRIPT) COMMAND_1459,
COMMAND_MARK_CUTSCENE_START, COMMAND_1460,
COMMAND_MARK_CUTSCENE_END, COMMAND_1461,
COMMAND_CUTSCENE_SCROLL, COMMAND_1462,
#elif (defined GTA_MOBILE || defined SUPPORT_MOBILE_SCRIPT) COMMAND_1463,
COMMAND_IS_MISSION_SKIP, COMMAND_1464,
COMMAND_SET_IN_AMMUNATION, COMMAND_1465,
COMMAND_DO_SAVE_GAME, COMMAND_1466,
COMMAND_IS_RETRY, COMMAND_1467,
COMMAND_DUMMY, COMMAND_1468,
COMMAND_MARK_CUTSCENE_START, COMMAND_1469,
COMMAND_MARK_CUTSCENE_END, COMMAND_1470,
COMMAND_CUTSCENE_SCROLL, COMMAND_1471,
#endif COMMAND_1472,
COMMAND_1473,
COMMAND_1474,
COMMAND_1475,
COMMAND_1476,
COMMAND_1477,
COMMAND_1478,
COMMAND_1479,
COMMAND_1480,
COMMAND_1481,
COMMAND_1482,
COMMAND_1483,
COMMAND_1484,
COMMAND_1485,
COMMAND_1486,
COMMAND_1487,
COMMAND_1488,
COMMAND_1489,
COMMAND_1490,
COMMAND_1491,
COMMAND_1492,
COMMAND_1493,
COMMAND_1494,
COMMAND_1495,
COMMAND_1496,
COMMAND_1497,
COMMAND_1498,
COMMAND_1499,
COMMAND_1500,
COMMAND_1501,
COMMAND_1502,
COMMAND_1503,
COMMAND_1504,
COMMAND_1505,
COMMAND_1506,
COMMAND_1507,
COMMAND_1508,
COMMAND_1509,
COMMAND_1510,
COMMAND_1511,
COMMAND_1512,
COMMAND_1513,
COMMAND_1514,
COMMAND_1515,
COMMAND_1516,
COMMAND_1517,
COMMAND_1518,
COMMAND_1519,
COMMAND_1520,
COMMAND_1521,
COMMAND_1522,
COMMAND_1523,
COMMAND_1524,
COMMAND_1525,
COMMAND_1526,
COMMAND_1527,
COMMAND_1528,
COMMAND_1529,
COMMAND_1530,
COMMAND_1531,
COMMAND_1532,
COMMAND_1533,
COMMAND_1534,
COMMAND_1535,
COMMAND_1536,
COMMAND_1537,
COMMAND_1538,
COMMAND_1539,
COMMAND_1540,
COMMAND_1541,
COMMAND_1542,
COMMAND_1543,
COMMAND_1544,
COMMAND_1545,
COMMAND_1546,
COMMAND_1547,
COMMAND_1548,
COMMAND_1549,
COMMAND_1550,
COMMAND_1551,
COMMAND_1552,
COMMAND_1553,
COMMAND_1554,
COMMAND_1555,
COMMAND_1556,
COMMAND_1557,
COMMAND_1558,
COMMAND_1559,
COMMAND_1560,
COMMAND_1561,
COMMAND_1562,
COMMAND_1563,
COMMAND_1564,
COMMAND_1565,
COMMAND_1566,
COMMAND_1567,
COMMAND_1568,
COMMAND_1569,
COMMAND_1570,
COMMAND_1571,
COMMAND_1572,
COMMAND_1573,
COMMAND_1574,
COMMAND_1575,
COMMAND_1576,
COMMAND_1577,
COMMAND_1578,
COMMAND_1579,
COMMAND_1580,
COMMAND_1581,
COMMAND_1582,
COMMAND_1583,
COMMAND_1584,
COMMAND_1585,
COMMAND_1586,
COMMAND_1587,
COMMAND_1588,
COMMAND_1589,
COMMAND_1590,
COMMAND_1591,
COMMAND_1592,
COMMAND_1593,
COMMAND_1594,
COMMAND_1595,
COMMAND_1596,
COMMAND_1597,
COMMAND_1598,
COMMAND_1599,
COMMAND_1600,
COMMAND_1601,
COMMAND_1602,
COMMAND_1603,
COMMAND_1604,
COMMAND_1605,
COMMAND_1606,
COMMAND_1607,
COMMAND_1608,
COMMAND_1609,
COMMAND_1610,
COMMAND_1611,
COMMAND_1612,
COMMAND_1613,
COMMAND_1614,
COMMAND_1615,
COMMAND_1616,
COMMAND_1617,
COMMAND_1618,
COMMAND_1619,
COMMAND_1620,
COMMAND_1621,
COMMAND_1622,
COMMAND_1623,
COMMAND_1624,
COMMAND_1625,
COMMAND_1626,
COMMAND_1627,
COMMAND_1628,
COMMAND_1629,
COMMAND_1630,
COMMAND_1631,
COMMAND_1632,
COMMAND_1633,
COMMAND_1634,
COMMAND_1635,
COMMAND_1636,
COMMAND_1637,
COMMAND_1638,
COMMAND_1639,
COMMAND_1640,
COMMAND_1641,
COMMAND_1642,
COMMAND_1643,
COMMAND_1644,
COMMAND_1645,
COMMAND_1646,
COMMAND_1647,
COMMAND_1648,
COMMAND_1649,
COMMAND_1650,
COMMAND_1651,
COMMAND_1652,
COMMAND_1653,
COMMAND_1654,
COMMAND_1655,
COMMAND_1656,
#ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT #ifdef USE_ADVANCED_SCRIPT_DEBUG_OUTPUT
LAST_SCRIPT_COMMAND LAST_SCRIPT_COMMAND
#endif #endif
@ -1488,7 +1676,9 @@ enum eScriptArgument
ARGTYPE_PED_HANDLE, ARGTYPE_PED_HANDLE,
ARGTYPE_VEHICLE_HANDLE, ARGTYPE_VEHICLE_HANDLE,
ARGTYPE_OBJECT_HANDLE, ARGTYPE_OBJECT_HANDLE,
ARGTYPE_ANDOR ARGTYPE_ANDOR,
ARGTYPE_LIST,
ARGTYPE_FUNCTION
}; };
struct tScriptCommandData struct tScriptCommandData

View file

@ -3947,11 +3947,11 @@ CCam::Process_Debug(const CVector&, float, float, float)
} }
// stay inside sectors // stay inside sectors
while(CWorld::GetSectorX(Source.x) > 75.0f) while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f)
Source.x -= 1.0f; Source.x -= 1.0f;
while(CWorld::GetSectorX(Source.x) < 5.0f) while(CWorld::GetSectorX(Source.x) < 5.0f)
Source.x += 1.0f; Source.x += 1.0f;
while(CWorld::GetSectorY(Source.y) > 75.0f) while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f)
Source.y -= 1.0f; Source.y -= 1.0f;
while(CWorld::GetSectorY(Source.y) < 5.0f) while(CWorld::GetSectorY(Source.y) < 5.0f)
Source.y += 1.0f; Source.y += 1.0f;
@ -4018,11 +4018,11 @@ CCam::Process_Debug(const CVector&, float, float, float)
} }
// stay inside sectors // stay inside sectors
while(CWorld::GetSectorX(Source.x) > 75.0f) while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f)
Source.x -= 1.0f; Source.x -= 1.0f;
while(CWorld::GetSectorX(Source.x) < 5.0f) while(CWorld::GetSectorX(Source.x) < 5.0f)
Source.x += 1.0f; Source.x += 1.0f;
while(CWorld::GetSectorY(Source.y) > 75.0f) while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f)
Source.y -= 1.0f; Source.y -= 1.0f;
while(CWorld::GetSectorY(Source.y) < 5.0f) while(CWorld::GetSectorY(Source.y) < 5.0f)
Source.y += 1.0f; Source.y += 1.0f;
@ -4099,11 +4099,11 @@ CCam::Process_Editor(const CVector&, float, float, float)
} }
// stay inside sectors // stay inside sectors
while(CWorld::GetSectorX(Source.x) > 75.0f) while(CWorld::GetSectorX(Source.x) > NUMSECTORS_X-5.0f)
Source.x -= 1.0f; Source.x -= 1.0f;
while(CWorld::GetSectorX(Source.x) < 5.0f) while(CWorld::GetSectorX(Source.x) < 5.0f)
Source.x += 1.0f; Source.x += 1.0f;
while(CWorld::GetSectorY(Source.y) > 75.0f) while(CWorld::GetSectorY(Source.y) > NUMSECTORS_X-5.0f)
Source.y -= 1.0f; Source.y -= 1.0f;
while(CWorld::GetSectorY(Source.y) < 5.0f) while(CWorld::GetSectorY(Source.y) < 5.0f)
Source.y += 1.0f; Source.y += 1.0f;

View file

@ -492,7 +492,7 @@ bool
CFileLoader::StartLoadClumpFile(RwStream *stream, uint32 id) CFileLoader::StartLoadClumpFile(RwStream *stream, uint32 id)
{ {
if(RwStreamFindChunk(stream, rwID_CLUMP, nil, nil)){ if(RwStreamFindChunk(stream, rwID_CLUMP, nil, nil)){
printf("Start loading %s\n", CModelInfo::GetModelInfo(id)->GetName()); printf("Start loading %s\n", CModelInfo::GetModelInfo(id)->GetModelName());
return RpClumpGtaStreamRead1(stream); return RpClumpGtaStreamRead1(stream);
}else{ }else{
printf("FAILED\n"); printf("FAILED\n");
@ -506,7 +506,7 @@ CFileLoader::FinishLoadClumpFile(RwStream *stream, uint32 id)
RpClump *clump; RpClump *clump;
CClumpModelInfo *mi; CClumpModelInfo *mi;
printf("Finish loading %s\n", CModelInfo::GetModelInfo(id)->GetName()); printf("Finish loading %s\n", CModelInfo::GetModelInfo(id)->GetModelName());
clump = RpClumpGtaStreamRead2(stream); clump = RpClumpGtaStreamRead2(stream);
if(clump){ if(clump){
@ -739,7 +739,7 @@ CFileLoader::LoadObject(const char *line)
} }
mi = CModelInfo::AddSimpleModel(id); mi = CModelInfo::AddSimpleModel(id);
mi->SetName(model); mi->SetModelName(model);
mi->SetNumAtomics(numObjs); mi->SetNumAtomics(numObjs);
mi->SetLodDistances(dist); mi->SetLodDistances(dist);
SetModelInfoFlags(mi, flags); SetModelInfoFlags(mi, flags);
@ -787,7 +787,7 @@ CFileLoader::LoadTimeObject(const char *line)
} }
mi = CModelInfo::AddTimeModel(id); mi = CModelInfo::AddTimeModel(id);
mi->SetName(model); mi->SetModelName(model);
mi->SetNumAtomics(numObjs); mi->SetNumAtomics(numObjs);
mi->SetLodDistances(dist); mi->SetLodDistances(dist);
SetModelInfoFlags(mi, flags); SetModelInfoFlags(mi, flags);
@ -813,7 +813,7 @@ CFileLoader::LoadWeaponObject(const char *line)
sscanf(line, "%d %s %s %s %d %f", &id, model, txd, animFile, &numObjs, &dist); sscanf(line, "%d %s %s %s %d %f", &id, model, txd, animFile, &numObjs, &dist);
mi = CModelInfo::AddWeaponModel(id); mi = CModelInfo::AddWeaponModel(id);
mi->SetName(model); mi->SetModelName(model);
mi->SetNumAtomics(1); mi->SetNumAtomics(1);
mi->m_lodDistances[0] = dist; mi->m_lodDistances[0] = dist;
mi->SetTexDictionary(txd); mi->SetTexDictionary(txd);
@ -832,7 +832,7 @@ CFileLoader::LoadClumpObject(const char *line)
if(sscanf(line, "%d %s %s", &id, model, txd) == 3){ if(sscanf(line, "%d %s %s", &id, model, txd) == 3){
mi = CModelInfo::AddClumpModel(id); mi = CModelInfo::AddClumpModel(id);
mi->SetName(model); mi->SetModelName(model);
mi->SetTexDictionary(txd); mi->SetTexDictionary(txd);
mi->SetColModel(&CTempColModels::ms_colModelBBox); mi->SetColModel(&CTempColModels::ms_colModelBBox);
} }
@ -857,7 +857,7 @@ CFileLoader::LoadVehicleObject(const char *line)
&normalSplay); &normalSplay);
mi = CModelInfo::AddVehicleModel(id); mi = CModelInfo::AddVehicleModel(id);
mi->SetName(model); mi->SetModelName(model);
mi->SetTexDictionary(txd); mi->SetTexDictionary(txd);
mi->SetAnimFile(animFile); mi->SetAnimFile(animFile);
for(p = gamename; *p; p++) for(p = gamename; *p; p++)
@ -938,7 +938,7 @@ CFileLoader::LoadPedObject(const char *line)
animFile, &radio1, &radio2); animFile, &radio1, &radio2);
mi = CModelInfo::AddPedModel(id); mi = CModelInfo::AddPedModel(id);
mi->SetName(model); mi->SetModelName(model);
mi->SetTexDictionary(txd); mi->SetTexDictionary(txd);
mi->SetAnimFile(animFile); mi->SetAnimFile(animFile);
mi->SetColModel(&CTempColModels::ms_colModelPed1); mi->SetColModel(&CTempColModels::ms_colModelPed1);
@ -1208,7 +1208,7 @@ CFileLoader::LoadObjectInstance(const char *line)
assert(mi->IsSimple()); assert(mi->IsSimple());
if(!CStreaming::IsObjectInCdImage(id)) if(!CStreaming::IsObjectInCdImage(id))
debug("Not in cdimage %s\n", mi->GetName()); debug("Not in cdimage %s\n", mi->GetModelName());
angle = -RADTODEG(2.0f * acosf(angle)); angle = -RADTODEG(2.0f * acosf(angle));
xform = RwMatrixCreate(); xform = RwMatrixCreate();
@ -1441,7 +1441,7 @@ CFileLoader::ReloadObject(const char *line)
#ifdef FIX_BUGS #ifdef FIX_BUGS
mi && mi &&
#endif #endif
mi->GetModelType() == MITYPE_SIMPLE && !strcmp(mi->GetName(), model) && mi->m_numAtomics == numObjs) { mi->GetModelType() == MITYPE_SIMPLE && !strcmp(mi->GetModelName(), model) && mi->m_numAtomics == numObjs) {
mi->SetLodDistances(dist); mi->SetLodDistances(dist);
SetModelInfoFlags(mi, flags); SetModelInfoFlags(mi, flags);
} else { } else {

View file

@ -661,8 +661,8 @@ public:
int32 m_nSelectedScreenMode; int32 m_nSelectedScreenMode;
#endif #endif
#ifdef MULTISAMPLING #ifdef MULTISAMPLING
static int8 m_nPrefsMSAALevel; int8 m_nPrefsMSAALevel;
static int8 m_nDisplayMSAALevel; int8 m_nDisplayMSAALevel;
#endif #endif
enum LANGUAGE enum LANGUAGE

View file

@ -587,7 +587,7 @@ bool CGame::ShutDown(void)
CPlane::Shutdown(); CPlane::Shutdown();
CTrain::Shutdown(); CTrain::Shutdown();
CScriptPaths::Shutdown(); CScriptPaths::Shutdown();
CWaterCreatures::RemoveAll(); //CWaterCreatures::RemoveAll();
CSpecialFX::Shutdown(); CSpecialFX::Shutdown();
CGarages::Shutdown(); CGarages::Shutdown();
CMovingThings::Shutdown(); CMovingThings::Shutdown();
@ -749,7 +749,7 @@ void CGame::ShutDownForRestart(void)
CRadar::RemoveRadarSections(); CRadar::RemoveRadarSections();
FrontEndMenuManager.UnloadTextures(); FrontEndMenuManager.UnloadTextures();
CParticleObject::RemoveAllExpireableParticleObjects(); CParticleObject::RemoveAllExpireableParticleObjects();
CWaterCreatures::RemoveAll(); //CWaterCreatures::RemoveAll();
CSetPieces::Init(); CSetPieces::Init();
CPedType::Shutdown(); CPedType::Shutdown();
CSpecialFX::Shutdown(); CSpecialFX::Shutdown();

View file

@ -6,8 +6,9 @@ enum eLevelName {
LEVEL_INDUSTRIAL, LEVEL_INDUSTRIAL,
LEVEL_COMMERCIAL, LEVEL_COMMERCIAL,
LEVEL_SUBURBAN, LEVEL_SUBURBAN,
LEVEL_UNDERGROUND,
NUM_LEVELS // LCS: should be 5 eventually... NUM_LEVELS
}; };
enum eAreaName { enum eAreaName {

View file

@ -10,7 +10,7 @@
// --MIAMI: file done // --MIAMI: file done
float CIniFile::PedNumberMultiplier = 0.6f; float CIniFile::PedNumberMultiplier = 0.6f;
float CIniFile::CarNumberMultiplier = 0.6f; float CIniFile::CarNumberMultiplier = 0.8f;
void CIniFile::LoadIniFile() void CIniFile::LoadIniFile()
{ {
@ -27,5 +27,5 @@ void CIniFile::LoadIniFile()
} }
CPopulation::MaxNumberOfPedsInUse = 25.0f * PedNumberMultiplier; CPopulation::MaxNumberOfPedsInUse = 25.0f * PedNumberMultiplier;
CPopulation::MaxNumberOfPedsInUseInterior = 40.0f * PedNumberMultiplier; CPopulation::MaxNumberOfPedsInUseInterior = 40.0f * PedNumberMultiplier;
CCarCtrl::MaxNumberOfCarsInUse = 12.0f * CarNumberMultiplier; CCarCtrl::MaxNumberOfCarsInUse = 30.0f * CarNumberMultiplier;
} }

106
src/core/KeyGen.cpp Normal file
View file

@ -0,0 +1,106 @@
#include "common.h"
#include "KeyGen.h"
#include <ctype.h>
uint32 CKeyGen::keyTable[256] =
{
0, 0x77073096, 0xEE0E612C, 0x990951BA,
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
uint32
CKeyGen::GetKey(const char *str, int size)
{
uint32 key = 0xffffffff;
for (int i = 0; i < size; i++)
key = keyTable[(key ^ str[i]) & 0xFF] ^ (key >> 8);
return key;
}
uint32
CKeyGen::GetKey(const char *str)
{
uint32 key = 0xffffffff;
while(*str != '\0')
key = keyTable[(key ^ *(str++)) & 0xFF] ^ (key >> 8);
return key;
}
uint32
CKeyGen::GetUppercaseKey(const char *str)
{
uint32 key = 0xffffffff;
while (*str != '\0')
key = keyTable[(key ^ toupper(*(str++))) & 0xFF] ^ (key >> 8);
return key;
}
uint32
CKeyGen::AppendStringToKey(uint32 key, const char *str)
{
while (*str != '\0')
key = keyTable[(key ^ *(str++)) & 0xFF] ^ (key >> 8);
return key;
}

11
src/core/KeyGen.h Normal file
View file

@ -0,0 +1,11 @@
#pragma once
class CKeyGen
{
static uint32 keyTable[256];
public:
static uint32 GetKey(const char *str, int size);
static uint32 GetKey(const char *str);
static uint32 GetUppercaseKey(const char *str);
static uint32 AppendStringToKey(uint32 key, const char *str);
};

View file

@ -164,6 +164,8 @@ public:
int32 LastTimeTouched; int32 LastTimeTouched;
int32 AverageWeapon; int32 AverageWeapon;
int32 AverageEntries; int32 AverageEntries;
float unk_B4;
float unk_B8;
#ifdef DETECT_PAD_INPUT_SWITCH #ifdef DETECT_PAD_INPUT_SWITCH
static bool IsAffectedByController; static bool IsAffectedByController;

View file

@ -536,7 +536,7 @@ INITSAVEBUF
#endif #endif
CopyToBuf(buf, CWanted::MaximumWantedLevel); CopyToBuf(buf, CWanted::MaximumWantedLevel);
CopyToBuf(buf, CWanted::nMaximumWantedLevel); CopyToBuf(buf, CWanted::nMaximumWantedLevel);
memcpy(buf, CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetName(), MAX_MODEL_NAME); memcpy(buf, CModelInfo::GetModelInfo(pPed->GetModelIndex())->GetModelName(), MAX_MODEL_NAME);
SkipSaveBuf(buf, MAX_MODEL_NAME); SkipSaveBuf(buf, MAX_MODEL_NAME);
} }
} }

View file

@ -497,7 +497,7 @@ GetObjectName(int streamId)
{ {
static char objname[32]; static char objname[32];
if(streamId < STREAM_OFFSET_TXD) if(streamId < STREAM_OFFSET_TXD)
sprintf(objname, "%s.dff", CModelInfo::GetModelInfo(streamId)->GetName()); sprintf(objname, "%s.dff", CModelInfo::GetModelInfo(streamId)->GetModelName());
else if(streamId >= STREAM_OFFSET_TXD && streamId < STREAM_OFFSET_COL) else if(streamId >= STREAM_OFFSET_TXD && streamId < STREAM_OFFSET_COL)
sprintf(objname, "%s.txd", CTxdStore::GetTxdName(streamId-STREAM_OFFSET_TXD)); sprintf(objname, "%s.txd", CTxdStore::GetTxdName(streamId-STREAM_OFFSET_TXD));
else if(streamId >= STREAM_OFFSET_COL && streamId < STREAM_OFFSET_ANIM) else if(streamId >= STREAM_OFFSET_COL && streamId < STREAM_OFFSET_ANIM)
@ -592,7 +592,7 @@ CStreaming::ConvertBufferToObject(int8 *buf, int32 streamId)
} }
if(!success){ if(!success){
debug("Failed to load %s\n", CModelInfo::GetModelInfo(streamId)->GetName()); debug("Failed to load %s\n", CModelInfo::GetModelInfo(streamId)->GetModelName());
RemoveModel(streamId); RemoveModel(streamId);
ReRequestModel(streamId); ReRequestModel(streamId);
RwStreamClose(stream, &mem); RwStreamClose(stream, &mem);
@ -1009,7 +1009,7 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag
mi = CModelInfo::GetModelInfo(modelId); mi = CModelInfo::GetModelInfo(modelId);
if(strncasecmp("CSPlay", modelName, 6) == 0){ if(strncasecmp("CSPlay", modelName, 6) == 0){
char *curname = CModelInfo::GetModelInfo(MI_PLAYER)->GetName(); char *curname = CModelInfo::GetModelInfo(MI_PLAYER)->GetModelName();
for(int i = 0; CSnames[i][0]; i++){ for(int i = 0; CSnames[i][0]; i++){
if(strcasecmp(curname, IGnames[i]) == 0){ if(strcasecmp(curname, IGnames[i]) == 0){
modelName = CSnames[i]; modelName = CSnames[i];
@ -1017,7 +1017,7 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag
} }
} }
} }
if(!CGeneral::faststrcmp(mi->GetName(), modelName)){ if(!CGeneral::faststrcmp(mi->GetModelName(), modelName)){
// Already have the correct name, just request it // Already have the correct name, just request it
RequestModel(modelId, flags); RequestModel(modelId, flags);
return; return;
@ -1042,8 +1042,8 @@ CStreaming::RequestSpecialModel(int32 modelId, const char *modelName, int32 flag
} }
} }
strcpy(oldName, mi->GetName()); strcpy(oldName, mi->GetModelName());
mi->SetName(modelName); mi->SetModelName(modelName);
// What exactly is going on here? // What exactly is going on here?
if(CModelInfo::GetModelInfo(oldName, nil)){ if(CModelInfo::GetModelInfo(oldName, nil)){
@ -1151,12 +1151,9 @@ CStreaming::RemoveModel(int32 id)
void void
CStreaming::RemoveUnusedBuildings(eLevelName level) CStreaming::RemoveUnusedBuildings(eLevelName level)
{ {
if(level != LEVEL_INDUSTRIAL) for(int i = LEVEL_INDUSTRIAL; i < NUM_LEVELS; i++)
RemoveBuildings(LEVEL_INDUSTRIAL); if(level != i)
if(level != LEVEL_COMMERCIAL) RemoveBuildings((eLevelName)i);
RemoveBuildings(LEVEL_COMMERCIAL);
if(level != LEVEL_SUBURBAN)
RemoveBuildings(LEVEL_SUBURBAN);
} }
void void
@ -1279,12 +1276,9 @@ CStreaming::RemoveUnusedBigBuildings(eLevelName level)
{ {
ISLAND_LOADING_IS(LOW) ISLAND_LOADING_IS(LOW)
{ {
if(level != LEVEL_INDUSTRIAL) for(int i = LEVEL_INDUSTRIAL; i < NUM_LEVELS; i++)
RemoveBigBuildings(LEVEL_INDUSTRIAL); if(level != i)
if(level != LEVEL_COMMERCIAL) RemoveBuildings((eLevelName)i);
RemoveBigBuildings(LEVEL_COMMERCIAL);
if(level != LEVEL_SUBURBAN)
RemoveBigBuildings(LEVEL_SUBURBAN);
} }
RemoveIslandsNotUsed(level); RemoveIslandsNotUsed(level);
} }
@ -1324,8 +1318,11 @@ CStreaming::RemoveIslandsNotUsed(eLevelName level)
} }
#ifdef NO_ISLAND_LOADING #ifdef NO_ISLAND_LOADING
if(FrontEndMenuManager.m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_HIGH) { if(FrontEndMenuManager.m_PrefsIslandLoading == CMenuManager::ISLAND_LOADING_HIGH) {
DeleteIsland(pIslandLODmainlandEntity); DeleteIsland(pIslandLODindustEntity);
DeleteIsland(pIslandLODbeachEntity); DeleteIsland(pIslandLODcomIndEntity);
DeleteIsland(pIslandLODcomSubEntity);
DeleteIsland(pIslandLODsubIndEntity);
DeleteIsland(pIslandLODsubComEntity);
} else } else
#endif #endif
switch(level){ switch(level){
@ -1842,11 +1839,11 @@ CStreaming::StreamZoneModels(const CVector &pos)
int newMI = CPopulation::ms_pPedGroups[ms_currentPedGrp].models[j]; int newMI = CPopulation::ms_pPedGroups[ms_currentPedGrp].models[j];
if(newMI != oldMI){ if(newMI != oldMI){
RequestModel(newMI, STREAMFLAGS_DEPENDENCY); RequestModel(newMI, STREAMFLAGS_DEPENDENCY);
debug("Request Ped %s\n", CModelInfo::GetModelInfo(newMI)->GetName()); debug("Request Ped %s\n", CModelInfo::GetModelInfo(newMI)->GetModelName());
if(ms_numPedsLoaded == MAXZONEPEDSLOADED){ if(ms_numPedsLoaded == MAXZONEPEDSLOADED){
SetModelIsDeletable(oldMI); SetModelIsDeletable(oldMI);
SetModelTxdIsDeletable(oldMI); SetModelTxdIsDeletable(oldMI);
debug("Remove Ped %s\n", CModelInfo::GetModelInfo(oldMI)->GetName()); debug("Remove Ped %s\n", CModelInfo::GetModelInfo(oldMI)->GetModelName());
}else }else
ms_numPedsLoaded++; ms_numPedsLoaded++;
timeBeforeNextLoad = 300; timeBeforeNextLoad = 300;
@ -3242,7 +3239,7 @@ CStreaming::PrintStreamingBufferState()
sprintf(str, "txd %s, refs %d, size %dK, flags 0x%x", CTxdStore::GetTxdName(modelIndex - STREAM_OFFSET_TXD), sprintf(str, "txd %s, refs %d, size %dK, flags 0x%x", CTxdStore::GetTxdName(modelIndex - STREAM_OFFSET_TXD),
CTxdStore::GetNumRefs(modelIndex - STREAM_OFFSET_TXD), 2 * size, streamingInfo->m_flags); CTxdStore::GetNumRefs(modelIndex - STREAM_OFFSET_TXD), 2 * size, streamingInfo->m_flags);
else else
sprintf(str, "model %d,%s, refs%d, size%dK, flags%x", modelIndex, modelInfo->GetName(), modelInfo->GetNumRefs(), 2 * size, sprintf(str, "model %d,%s, refs%d, size%dK, flags%x", modelIndex, modelInfo->GetModelName(), modelInfo->GetNumRefs(), 2 * size,
streamingInfo->m_flags); streamingInfo->m_flags);
AsciiToUnicode(str, wstr); AsciiToUnicode(str, wstr);
CFont::PrintString(24.0f, y, wstr); CFont::PrintString(24.0f, y, wstr);

View file

@ -123,6 +123,7 @@ public:
static bool HasColLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_COL); } static bool HasColLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_COL); }
static bool HasAnimLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_ANIM); } static bool HasAnimLoaded(int32 id) { return HasModelLoaded(id+STREAM_OFFSET_ANIM); }
static bool CanRemoveModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_CANT_REMOVE) == 0; } static bool CanRemoveModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_CANT_REMOVE) == 0; }
static bool IsScriptOwnedModel(int32 id) { return (ms_aInfoForModel[id].m_flags & STREAMFLAGS_SCRIPTOWNED); }
static bool CanRemoveTxd(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_TXD); } static bool CanRemoveTxd(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_TXD); }
static bool CanRemoveCol(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_COL); } static bool CanRemoveCol(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_COL); }
static bool CanRemoveAnim(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_ANIM); } static bool CanRemoveAnim(int32 id) { return CanRemoveModel(id+STREAM_OFFSET_ANIM); }
@ -213,3 +214,10 @@ public:
static void PrintStreamingBufferState(); static void PrintStreamingBufferState();
}; };
// LCS(TODO): put them into CStreaming::mspInst
extern int32 islandLODindust;
extern int32 islandLODcomInd;
extern int32 islandLODcomSub;
extern int32 islandLODsubInd;
extern int32 islandLODsubCom;

View file

@ -4,14 +4,14 @@
#include "Lists.h" #include "Lists.h"
#include "PlayerInfo.h" #include "PlayerInfo.h"
/* Sectors span from -2400 to 1600 in x and -2000 to 2000 y. /* Sectors span from -2000 to 2000 in x and y.
* With 80x80 sectors, each is 50x50 units. */ * With 100x100 sectors, each is 40x40 units. */
#define SECTOR_SIZE_X (50.0f) #define SECTOR_SIZE_X (40.0f)
#define SECTOR_SIZE_Y (50.0f) #define SECTOR_SIZE_Y (40.0f)
#define NUMSECTORS_X (80) #define NUMSECTORS_X (100)
#define NUMSECTORS_Y (80) #define NUMSECTORS_Y (100)
#define WORLD_SIZE_X (NUMSECTORS_X * SECTOR_SIZE_X) #define WORLD_SIZE_X (NUMSECTORS_X * SECTOR_SIZE_X)
#define WORLD_SIZE_Y (NUMSECTORS_Y * SECTOR_SIZE_Y) #define WORLD_SIZE_Y (NUMSECTORS_Y * SECTOR_SIZE_Y)

View file

@ -97,7 +97,7 @@ enum Config {
NUMPACMANPICKUPS = 256, NUMPACMANPICKUPS = 256,
NUMEVENTS = 64, NUMEVENTS = 64,
NUM_CARGENS = 185, NUM_CARGENS = 500,
NUM_PATH_NODES_IN_AUTOPILOT = 8, NUM_PATH_NODES_IN_AUTOPILOT = 8,
@ -197,6 +197,8 @@ enum Config {
//#define COMPRESSED_COL_VECTORS // use compressed vectors for collision vertices //#define COMPRESSED_COL_VECTORS // use compressed vectors for collision vertices
//#define ANIM_COMPRESSION // only keep most recently used anims uncompressed //#define ANIM_COMPRESSION // only keep most recently used anims uncompressed
#define GTA_TRAIN
#if defined GTA_PS2 #if defined GTA_PS2
# define GTA_PS2_STUFF # define GTA_PS2_STUFF
# define RANDOMSPLASH # define RANDOMSPLASH
@ -312,7 +314,7 @@ enum Config {
# define GRAPHICS_MENU_OPTIONS // otherwise Display settings will be scrollable # define GRAPHICS_MENU_OPTIONS // otherwise Display settings will be scrollable
//# define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU //# define NO_ISLAND_LOADING // disable loadscreen between islands via loading all island data at once, consumes more memory and CPU
# define CUTSCENE_BORDERS_SWITCH # define CUTSCENE_BORDERS_SWITCH
//# define MULTISAMPLING // adds MSAA option # define MULTISAMPLING // adds MSAA option
# define INVERT_LOOK_FOR_PAD // enable the hidden option # define INVERT_LOOK_FOR_PAD // enable the hidden option
# endif # endif
#endif #endif
@ -382,7 +384,6 @@ static_assert(false, "SUPPORT_XBOX_SCRIPT and SUPPORT_MOBILE_SCRIPT are mutually
#ifdef LIBRW #ifdef LIBRW
// these are not supported with librw yet // these are not supported with librw yet
# undef MULTISAMPLING
#endif #endif
// IMG // IMG
#define BIG_IMG // allows to read larger img files #define BIG_IMG // allows to read larger img files

View file

@ -4,6 +4,7 @@
#include "RwHelper.h" #include "RwHelper.h"
#include "ModelIndices.h" #include "ModelIndices.h"
#include "Timer.h" #include "Timer.h"
#include "Streaming.h"
#include "Entity.h" #include "Entity.h"
#include "Object.h" #include "Object.h"
#include "World.h" #include "World.h"
@ -623,10 +624,15 @@ CEntity::SetupBigBuilding(void)
m_level = CTheZones::GetLevelFromPosition(&GetPosition()); m_level = CTheZones::GetLevelFromPosition(&GetPosition());
if(mi->m_lodDistances[0] <= 2000.0f) if(mi->m_lodDistances[0] <= 2000.0f)
bStreamBIGBuilding = true; bStreamBIGBuilding = true;
if(mi->m_lodDistances[0] > 2500.0f || mi->m_ignoreDrawDist) if(m_modelIndex == islandLODindust ||
m_modelIndex == islandLODcomInd ||
m_modelIndex == islandLODcomSub ||
m_modelIndex == islandLODsubInd ||
m_modelIndex == islandLODsubCom ||
mi->m_lodDistances[0] > 5000.0f || mi->m_ignoreDrawDist)
m_level = LEVEL_GENERIC; m_level = LEVEL_GENERIC;
else if(m_level == LEVEL_GENERIC) // else if(m_level == LEVEL_GENERIC)
printf("%s isn't in a level\n", mi->GetName()); // printf("%s isn't in a level\n", mi->GetModelName());
} }
float WindTabel[] = { float WindTabel[] = {

View file

@ -64,12 +64,12 @@ void* operator new[](size_t size)
return base::cMainMemoryManager::Instance()->Allocate(size); return base::cMainMemoryManager::Instance()->Allocate(size);
} }
void operator delete(void* buf) void operator delete(void* buf) noexcept
{ {
base::cMainMemoryManager::Instance()->Free(buf); base::cMainMemoryManager::Instance()->Free(buf);
} }
void operator delete[](void* buf) void operator delete[](void* buf) noexcept
{ {
base::cMainMemoryManager::Instance()->Free(buf); base::cMainMemoryManager::Instance()->Free(buf);
} }

View file

@ -35,5 +35,5 @@ namespace base
void* operator new(size_t size); void* operator new(size_t size);
void* operator new[](size_t size); void* operator new[](size_t size);
void operator delete(void* buf); void operator delete(void* buf) noexcept;
void operator delete[](void* buf); void operator delete[](void* buf) noexcept;

View file

@ -0,0 +1,36 @@
#include "common.h"
#include "relocatableChunk.h"
namespace base
{
// TODO(LCS): add actual code (all of these are stubs)
void* cRelocatableChunk::Load(void* data, bool bShrink) { return nil; }
void* cRelocatableChunk::Load(const char* name, bool bShrink) { return nil; }
void cRelocatableChunk::Fixup(const sChunkHeader& header, void* data) {}
void cRelocatableChunk::Fixup(void* data) {}
void* cRelocatableChunk::Shrink(const sChunkHeader& header, void* data) { return nil; }
void* cRelocatableChunk::Shrink(void* data) { return nil; }
cRelocatableChunkClassInfo::cRelocatableChunkClassInfo(const char* class_name, const void* pVmt, int size) {}
cRelocatableChunkWriter::cRelocatableChunkWriter() {}
cRelocatableChunkWriter::~cRelocatableChunkWriter() {}
void cRelocatableChunkWriter::AddPatch(void* addr) {}
void cRelocatableChunkWriter::AddPatchWithInfo(const char* str, int unk, void* addr) {}
void cRelocatableChunkWriter::AllocateRaw(void* addr, uint32 size, uint32 align, bool a5, bool a6) {}
void cRelocatableChunkWriter::Clear() {}
void cRelocatableChunkWriter::Class(void* ptr, const cRelocatableChunkClassInfo& classInfo) {}
void cRelocatableChunkWriter::DebugFileLine(void*) {}
void cRelocatableChunkWriter::PatchFunc(void* ptr) {}
bool cRelocatableChunkWriter::IsAllocated(void* addr) { return false; }
void cRelocatableChunkWriter::Reserve(int, int) {}
void cRelocatableChunkWriter::Save(const char* filename, uint32 a3, uint32 a4, bool a5) {}
void cRelocatableChunkWriter::Save(void* file, uint32 a3, uint32 a4, bool a5, sChunkHeader* pHeader) {}
};

View file

@ -0,0 +1,51 @@
#pragma once
namespace base
{
// TODO(LCS): add actual struct fields
struct sChunkHeader;
struct sDataBlock;
struct sFileLine;
class cRelocatableChunk
{
public:
void* Load(void* data, bool bShrink);
void* Load(const char* name, bool bShrink);
void Fixup(const sChunkHeader& header, void* data);
void Fixup(void* data);
void* Shrink(const sChunkHeader& header, void* data);
void* Shrink(void* data);
};
class cRelocatableChunkClassInfo
{
public:
cRelocatableChunkClassInfo(const char* class_name, const void* pVmt, int size);
};
class cRelocatableChunkWriter
{
public:
cRelocatableChunkWriter();
~cRelocatableChunkWriter();
void AddPatch(void* addr);
void AddPatchWithInfo(const char* str, int unk, void* addr);
void AllocateRaw(void* addr, uint32 size, uint32 align, bool a5 = false, bool a6 = false);
void Clear();
void Class(void* ptr, const cRelocatableChunkClassInfo& classInfo);
void DebugFileLine(void*);
void PatchFunc(void* ptr);
bool IsAllocated(void* addr);
void Reserve(int, int);
void Save(const char* filename, uint32 a3, uint32 a4, bool a5);
void Save(void* file, uint32 a3, uint32 a4, bool a5, sChunkHeader* pHeader);
};
};

View file

@ -50,8 +50,8 @@ public:
bool IsBuilding(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; } bool IsBuilding(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME; }
bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME || m_type == MITYPE_WEAPON; } bool IsSimple(void) { return m_type == MITYPE_SIMPLE || m_type == MITYPE_TIME || m_type == MITYPE_WEAPON; }
bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE; } bool IsClump(void) { return m_type == MITYPE_CLUMP || m_type == MITYPE_PED || m_type == MITYPE_VEHICLE; }
char *GetName(void) { return m_name; } char *GetModelName(void) { return m_name; }
void SetName(const char *name) { strncpy(m_name, name, MAX_MODEL_NAME); } void SetModelName(const char *name) { strncpy(m_name, name, MAX_MODEL_NAME); }
void SetColModel(CColModel *col, bool owns = false){ void SetColModel(CColModel *col, bool owns = false){
m_colModel = col; m_bOwnsColModel = owns; } m_colModel = col; m_bOwnsColModel = owns; }
CColModel *GetColModel(void) { return m_colModel; } CColModel *GetColModel(void) { return m_colModel; }

View file

@ -280,7 +280,7 @@ enum
MI_PEREN, MI_PEREN,
MI_SENTINEL, MI_SENTINEL,
MI_PATRIOT, MI_PATRIOT,
MI_FIRETRUK, MI_FIRETRUCK,
MI_TRASH, MI_TRASH,
MI_STRETCH, MI_STRETCH,
MI_MANANA, MI_MANANA,
@ -371,7 +371,6 @@ enum
MI_BAGGAGE, MI_BAGGAGE,
MI_FBIRANCH, MI_FBIRANCH,
MI_VICECHEE, MI_VICECHEE,
MI_FIRETRUCK,
MI_RIO, MI_RIO,
MI_SQUALO, MI_SQUALO,
MI_JETMAX, MI_JETMAX,

View file

@ -189,7 +189,7 @@ CModelInfo::GetModelInfo(const char *name, int *id)
CBaseModelInfo *modelinfo; CBaseModelInfo *modelinfo;
for(int i = 0; i < MODELINFOSIZE; i++){ for(int i = 0; i < MODELINFOSIZE; i++){
modelinfo = CModelInfo::ms_modelInfoPtrs[i]; modelinfo = CModelInfo::ms_modelInfoPtrs[i];
if(modelinfo && !CGeneral::faststricmp(modelinfo->GetName(), name)){ if(modelinfo && !CGeneral::faststricmp(modelinfo->GetModelName(), name)){
if(id) if(id)
*id = i; *id = i;
return modelinfo; return modelinfo;
@ -207,7 +207,7 @@ CModelInfo::GetModelInfo(const char *name, int minIndex, int maxIndex)
CBaseModelInfo *modelinfo; CBaseModelInfo *modelinfo;
for(int i = minIndex; i <= maxIndex; i++){ for(int i = minIndex; i <= maxIndex; i++){
modelinfo = CModelInfo::ms_modelInfoPtrs[i]; modelinfo = CModelInfo::ms_modelInfoPtrs[i];
if(modelinfo && !CGeneral::faststricmp(modelinfo->GetName(), name)) if(modelinfo && !CGeneral::faststricmp(modelinfo->GetModelName(), name))
return modelinfo; return modelinfo;
} }
return nil; return nil;

View file

@ -48,7 +48,7 @@ CPedModelInfo::SetClump(RpClump *clump)
if(m_hitColModel == nil) if(m_hitColModel == nil)
CreateHitColModelSkinned(clump); CreateHitColModelSkinned(clump);
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPedCB);
if(strcmp(GetName(), "player") == 0) if(strcmp(GetModelName(), "player") == 0)
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, (void*)CVisibilityPlugins::RenderPlayerCB);
} }

View file

@ -167,7 +167,7 @@ CSimpleModelInfo::FindRelatedModel(int32 minID, int32 maxID)
for(i = minID; i <= maxID; i++){ for(i = minID; i <= maxID; i++){
mi = CModelInfo::GetModelInfo(i); mi = CModelInfo::GetModelInfo(i);
if(mi && mi != this && if(mi && mi != this &&
!CGeneral::faststrcmp(GetName()+3, mi->GetName()+3)){ !CGeneral::faststrcmp(GetModelName()+3, mi->GetModelName()+3)){
assert(mi->IsSimple()); assert(mi->IsSimple());
this->SetRelatedModel((CSimpleModelInfo*)mi); this->SetRelatedModel((CSimpleModelInfo*)mi);
return; return;
@ -189,7 +189,7 @@ CSimpleModelInfo::SetupBigBuilding(int32 minID, int32 maxID)
m_lodDistances[2] = related->GetLargestLodDistance()/TheCamera.LODDistMultiplier; m_lodDistances[2] = related->GetLargestLodDistance()/TheCamera.LODDistMultiplier;
if(m_drawLast){ if(m_drawLast){
m_drawLast = false; m_drawLast = false;
debug("%s was draw last\n", GetName()); debug("%s was draw last\n", GetModelName());
} }
}else }else
m_lodDistances[2] = NEAR_DRAW_DIST; m_lodDistances[2] = NEAR_DRAW_DIST;

View file

@ -11,7 +11,7 @@ CTimeModelInfo::FindOtherTimeModel(void)
char *p; char *p;
int i; int i;
strcpy(name, GetName()); strcpy(name, GetModelName());
// change _nt to _dy // change _nt to _dy
if(p = strstr(name, "_nt")) if(p = strstr(name, "_nt"))
strncpy(p, "_dy", 4); strncpy(p, "_dy", 4);
@ -24,7 +24,7 @@ CTimeModelInfo::FindOtherTimeModel(void)
for(i = 0; i < MODELINFOSIZE; i++){ for(i = 0; i < MODELINFOSIZE; i++){
CBaseModelInfo *mi = CModelInfo::GetModelInfo(i); CBaseModelInfo *mi = CModelInfo::GetModelInfo(i);
if (mi && mi->GetModelType() == MITYPE_TIME && if (mi && mi->GetModelType() == MITYPE_TIME &&
!CGeneral::faststrncmp(name, mi->GetName(), MAX_MODEL_NAME)){ !CGeneral::faststrncmp(name, mi->GetModelName(), MAX_MODEL_NAME)){
m_otherTimeModelID = i; m_otherTimeModelID = i;
return (CTimeModelInfo*)mi; return (CTimeModelInfo*)mi;
} }

View file

@ -100,9 +100,31 @@ enum PedFightMoves
{ {
FIGHTMOVE_NULL, FIGHTMOVE_NULL,
// Attacker // Attacker
FIGHTMOVE_STDPUNCH, // FIGHTMOVE_STDPUNCH,
FIGHTMOVE_IDLE, FIGHTMOVE_IDLE,
FIGHTMOVE_SHUFFLE_F, FIGHTMOVE_SHUFFLE_F,
// Combos
FIGHTMOVE_COMBO_A1,
FIGHTMOVE_COMBO_A2,
FIGHTMOVE_COMBO_A3,
FIGHTMOVE_COMBO_B1,
FIGHTMOVE_COMBO_B2,
FIGHTMOVE_COMBO_B3,
// Melee
FIGHTMOVE_MELEE1,
FIGHTMOVE_MELEE2,
FIGHTMOVE_MELEE3,
// Special
FIGHTMOVE_GROUNDKICK,
// Opponent
FIGHTMOVE_HITFRONT,
FIGHTMOVE_HITBACK,
FIGHTMOVE_HITRIGHT,
FIGHTMOVE_HITLEFT,
FIGHTMOVE_HITONFLOOR,
FIGHTMOVE_HITBEHIND,
FIGHTMOVE_IDLE2NORM,
/*
FIGHTMOVE_KNEE, FIGHTMOVE_KNEE,
FIGHTMOVE_PUNCHHOOK, FIGHTMOVE_PUNCHHOOK,
FIGHTMOVE_PUNCHJAB, FIGHTMOVE_PUNCHJAB,
@ -134,7 +156,16 @@ enum PedFightMoves
FIGHTMOVE_MELEE2, FIGHTMOVE_MELEE2,
FIGHTMOVE_MELEE3, FIGHTMOVE_MELEE3,
FIGHTMOVE_IDLE2NORM, FIGHTMOVE_IDLE2NORM,
NUM_FIGHTMOVES */
NUM_FIGHTMOVES,
// LCS replacements for the old names:
// NB: this may be totally bogus, i just need it to compile
FIGHTMOVE_PUNCH = FIGHTMOVE_COMBO_A2,
FIGHTMOVE_FWDRIGHT = FIGHTMOVE_COMBO_B1,
FIGHTMOVE_LONGKICK = FIGHTMOVE_COMBO_B2,
FIGHTMOVE_ROUNDHOUSE = FIGHTMOVE_COMBO_B3,
}; };
enum ePedPieceTypes enum ePedPieceTypes

View file

@ -4914,8 +4914,8 @@ CPed::SetAnimOffsetForEnterOrExitVehicle(void)
vecPedVanRearDoorAnimOffset = lastFrame->translation; vecPedVanRearDoorAnimOffset = lastFrame->translation;
} }
} }
// I think this is leftover and ANIM_TRAIN_GETOUT
enterAssoc = CAnimManager::GetAnimAssociation(ASSOCGRP_STD, ANIM_IDLE_STANCE3)->hierarchy; enterAssoc = CAnimManager::GetAnimAssociation(ASSOCGRP_STD, ANIM_TRAIN_GETOUT)->hierarchy;
seq = enterAssoc->sequences; seq = enterAssoc->sequences;
CAnimManager::UncompressAnimation(enterAssoc); CAnimManager::UncompressAnimation(enterAssoc);
if (seq->numFrames > 0) { if (seq->numFrames > 0) {

View file

@ -33,6 +33,7 @@ RpClump* flyingClumpTemp;
FightMove tFightMoves[NUM_FIGHTMOVES] = FightMove tFightMoves[NUM_FIGHTMOVES] =
{ {
/*
{ NUM_STD_ANIMS, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 }, { NUM_STD_ANIMS, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 },
{ ANIM_PUNCH_R, 0.2f, 8.f/30.f, 0.0f, 0.3f, 1.0f, HITLEVEL_HIGH, 1, 0 }, { ANIM_PUNCH_R, 0.2f, 8.f/30.f, 0.0f, 0.3f, 1.0f, HITLEVEL_HIGH, 1, 0 },
{ ANIM_FIGHT_IDLE, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 }, { ANIM_FIGHT_IDLE, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 },
@ -65,6 +66,7 @@ FightMove tFightMoves[NUM_FIGHTMOVES] =
{ ANIM_WEAPON_CROUCHFIRE, 4.f/30.f, 7.f/30.f, 10.f/30.f, 0.4f, 1.0f, HITLEVEL_HIGH, 1, 0 }, { ANIM_WEAPON_CROUCHFIRE, 4.f/30.f, 7.f/30.f, 10.f/30.f, 0.4f, 1.0f, HITLEVEL_HIGH, 1, 0 },
{ ANIM_WEAPON_SPECIAL, 4.f / 30.f, 7.f / 30.f, 10.f / 30.f, 0.4f, 1.0f, HITLEVEL_HIGH, 1, 0 }, { ANIM_WEAPON_SPECIAL, 4.f / 30.f, 7.f / 30.f, 10.f / 30.f, 0.4f, 1.0f, HITLEVEL_HIGH, 1, 0 },
{ ANIM_FIGHT2_IDLE, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 } { ANIM_FIGHT2_IDLE, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, HITLEVEL_NULL, 0, 0 }
*/
}; };
static PedOnGroundState static PedOnGroundState
@ -1115,10 +1117,7 @@ CPed::StartFightAttack(uint8 buttonPressure)
break; break;
} }
} else { } else {
if (m_curFightMove == FIGHTMOVE_BACKKICK) animAssoc->speed = 0.8f;
animAssoc->speed = 1.15f;
else
animAssoc->speed = 0.8f;
} }
if (IsPlayer()) if (IsPlayer())
animAssoc->SetCurrentTime(0.08f); animAssoc->SetCurrentTime(0.08f);
@ -1227,12 +1226,14 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk)
default: default:
if (hitLevel == HITLEVEL_LOW) { if (hitLevel == HITLEVEL_LOW) {
hitAnim = ANIM_KO_SHOT_STOM; hitAnim = ANIM_KO_SHOT_STOM;
/* LCS: removed
} else if (CGeneral::GetRandomNumber() & 1) { } else if (CGeneral::GetRandomNumber() & 1) {
fall = false; fall = false;
hitAnim = ANIM_HIT_WALK; hitAnim = ANIM_HIT_WALK;
} else if (CGeneral::GetRandomNumber() & 1) { } else if (CGeneral::GetRandomNumber() & 1) {
fall = false; fall = false;
hitAnim = ANIM_HIT_HEAD; hitAnim = ANIM_HIT_HEAD;
*/
} else { } else {
hitAnim = ANIM_KO_SHOT_FACE; hitAnim = ANIM_KO_SHOT_FACE;
} }
@ -1267,7 +1268,7 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk)
Say(SOUND_PED_DEFEND); Say(SOUND_PED_DEFEND);
return; return;
} }
m_curFightMove = FIGHTMOVE_HITBODY; m_curFightMove = FIGHTMOVE_HITFRONT; // LCS
break; break;
case HITLEVEL_HIGH: case HITLEVEL_HIGH:
switch (direction) { switch (direction) {
@ -1281,10 +1282,12 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk)
m_curFightMove = FIGHTMOVE_HITRIGHT; m_curFightMove = FIGHTMOVE_HITRIGHT;
break; break;
default: default:
if (unk <= 5) // LCS: removed
m_curFightMove = FIGHTMOVE_HITHEAD; //if (unk <= 5)
else // m_curFightMove = FIGHTMOVE_HITHEAD;
m_curFightMove = FIGHTMOVE_HITBIGSTEP; //else
// m_curFightMove = FIGHTMOVE_HITBIGSTEP;
m_curFightMove = FIGHTMOVE_HITFRONT;
break; break;
} }
break; break;
@ -1300,10 +1303,12 @@ CPed::StartFightDefend(uint8 direction, uint8 hitLevel, uint8 unk)
m_curFightMove = FIGHTMOVE_HITRIGHT; m_curFightMove = FIGHTMOVE_HITRIGHT;
break; break;
default: default:
if (unk <= 5) // LCS: removed
m_curFightMove = FIGHTMOVE_HITCHEST; //if (unk <= 5)
else // m_curFightMove = FIGHTMOVE_HITCHEST;
m_curFightMove = FIGHTMOVE_HITBIGSTEP; //else
// m_curFightMove = FIGHTMOVE_HITBIGSTEP;
m_curFightMove = FIGHTMOVE_HITFRONT;
break; break;
} }
break; break;
@ -1457,30 +1462,30 @@ CPed::Fight(void)
CVector touchingNodePos(0.0f, 0.0f, 0.0f); CVector touchingNodePos(0.0f, 0.0f, 0.0f);
switch (m_curFightMove) { switch (m_curFightMove) {
case FIGHTMOVE_KNEE: // case FIGHTMOVE_KNEE:
TransformToNode(touchingNodePos, PED_LOWERLEGR); // TransformToNode(touchingNodePos, PED_LOWERLEGR);
break; // break;
case FIGHTMOVE_PUNCHHOOK: // case FIGHTMOVE_PUNCHHOOK:
case FIGHTMOVE_PUNCHJAB: // case FIGHTMOVE_PUNCHJAB:
TransformToNode(touchingNodePos, PED_HANDL); // TransformToNode(touchingNodePos, PED_HANDL);
break; // break;
case FIGHTMOVE_LONGKICK: case FIGHTMOVE_LONGKICK:
case FIGHTMOVE_ROUNDHOUSE: case FIGHTMOVE_ROUNDHOUSE:
case FIGHTMOVE_FWDLEFT: // case FIGHTMOVE_FWDLEFT:
case FIGHTMOVE_BACKRIGHT: // case FIGHTMOVE_BACKRIGHT:
case FIGHTMOVE_GROUNDKICK: case FIGHTMOVE_GROUNDKICK:
TransformToNode(touchingNodePos, PED_FOOTR); TransformToNode(touchingNodePos, PED_FOOTR);
break; break;
case FIGHTMOVE_FWDRIGHT: case FIGHTMOVE_FWDRIGHT:
TransformToNode(touchingNodePos, PED_HEAD); TransformToNode(touchingNodePos, PED_HEAD);
break; break;
case FIGHTMOVE_BACKKICK: // case FIGHTMOVE_BACKKICK:
case FIGHTMOVE_BACKFLIP: // case FIGHTMOVE_BACKFLIP:
TransformToNode(touchingNodePos, PED_FOOTL); // TransformToNode(touchingNodePos, PED_FOOTL);
break; // break;
case FIGHTMOVE_BACKLEFT: // case FIGHTMOVE_BACKLEFT:
TransformToNode(touchingNodePos, PED_UPPERARML); // TransformToNode(touchingNodePos, PED_UPPERARML);
break; // break;
default: default:
TransformToNode(touchingNodePos, PED_HANDR); TransformToNode(touchingNodePos, PED_HANDR);
break; break;
@ -1532,10 +1537,7 @@ CPed::Fight(void)
tFightMoves[m_curFightMove].animId, 8.0f); tFightMoves[m_curFightMove].animId, 8.0f);
if (weaponInfo->m_AnimToPlay != ASSOCGRP_KNIFE || m_curFightMove < FIGHTMOVE_MELEE1) { if (weaponInfo->m_AnimToPlay != ASSOCGRP_KNIFE || m_curFightMove < FIGHTMOVE_MELEE1) {
if (m_curFightMove == FIGHTMOVE_BACKKICK) animAssoc->speed = 0.8f;
animAssoc->speed = 1.15f;
else
animAssoc->speed = 0.8f;
} else { } else {
switch (GetWeapon()->m_eWeaponType) { switch (GetWeapon()->m_eWeaponType) {
case WEAPONTYPE_SCREWDRIVER: case WEAPONTYPE_SCREWDRIVER:
@ -1676,8 +1678,9 @@ CPed::ChooseAttackAI(uint8 buttonPressure, bool fightWithWeapon)
return FIGHTMOVE_IDLE; return FIGHTMOVE_IDLE;
} }
} }
if (dist < 0.95f && canKneeHead) // LCS: removed
return FIGHTMOVE_KNEE; //if (dist < 0.95f && canKneeHead)
// return FIGHTMOVE_KNEE;
if (dist < 1.4f) if (dist < 1.4f)
return FIGHTMOVE_PUNCH; return FIGHTMOVE_PUNCH;
if (dist < 2.f && canKick) { if (dist < 2.f && canKick) {
@ -1796,9 +1799,11 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon)
switch (dir) { switch (dir) {
case 0: // forward case 0: // forward
if (fightWithWeapon) { if (fightWithWeapon) {
if (distToVictim < 0.95f - 0.2f && m_nPedState == PED_FIGHT) { // LCS: removed
choosenMove = FIGHTMOVE_KNEE; //if (distToVictim < 0.95f - 0.2f && m_nPedState == PED_FIGHT) {
} else { // choosenMove = FIGHTMOVE_KNEE;
//} else
{
if (GetWeapon()->m_eWeaponType == WEAPONTYPE_CLEAVER) { if (GetWeapon()->m_eWeaponType == WEAPONTYPE_CLEAVER) {
if (distToVictim < 0.85f * weaponInfo->m_fRange) if (distToVictim < 0.85f * weaponInfo->m_fRange)
choosenMove = FIGHTMOVE_MELEE1; choosenMove = FIGHTMOVE_MELEE1;
@ -1821,18 +1826,20 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon)
} }
} }
} }
} else if (distToVictim < 0.95f && m_nPedState == PED_FIGHT) { // LCS: removed
choosenMove = FIGHTMOVE_KNEE; //} else if (distToVictim < 0.95f && m_nPedState == PED_FIGHT) {
// choosenMove = FIGHTMOVE_KNEE;
} else if (distToVictim < 1.4f) { } else if (distToVictim < 1.4f) {
if (m_curFightMove == FIGHTMOVE_PUNCHJAB) { // LCS: removed
/*if (m_curFightMove == FIGHTMOVE_PUNCHJAB) {
choosenMove = FIGHTMOVE_PUNCH; choosenMove = FIGHTMOVE_PUNCH;
} else if (m_curFightMove != FIGHTMOVE_PUNCH || randVal != 1) { } else*/ if (m_curFightMove != FIGHTMOVE_PUNCH || randVal != 1) {
if (randVal == 2) //if (randVal == 2)
choosenMove = FIGHTMOVE_PUNCH; choosenMove = FIGHTMOVE_PUNCH;
else //else
choosenMove = FIGHTMOVE_PUNCHJAB; // choosenMove = FIGHTMOVE_PUNCHJAB;
} else { } else {
choosenMove = FIGHTMOVE_LONGKICK; choosenMove = FIGHTMOVE_LONGKICK;
} }
@ -1840,6 +1847,7 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon)
choosenMove = FIGHTMOVE_LONGKICK; choosenMove = FIGHTMOVE_LONGKICK;
} }
break; break;
/* LCS: removed
case 1: case 1:
choosenMove = FIGHTMOVE_FWDLEFT; choosenMove = FIGHTMOVE_FWDLEFT;
break; break;
@ -1852,6 +1860,7 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon)
case 4: case 4:
choosenMove = FIGHTMOVE_BACKRIGHT; choosenMove = FIGHTMOVE_BACKRIGHT;
break; break;
*/
default: default:
choosenMove = FIGHTMOVE_FWDRIGHT; choosenMove = FIGHTMOVE_FWDRIGHT;
break; break;
@ -1917,20 +1926,22 @@ CPed::ChooseAttackPlayer(uint8 buttonPressure, bool fightWithWeapon)
#else #else
switch (CGeneral::GetRandomNumberInRange(0,3)) { switch (CGeneral::GetRandomNumberInRange(0,3)) {
#endif #endif
case 0: // LCS: hack hack
choosenMove = FIGHTMOVE_PUNCHJAB; // case 0:
break; // choosenMove = FIGHTMOVE_PUNCHJAB;
// break;
default:
case 1: case 1:
choosenMove = FIGHTMOVE_PUNCH; choosenMove = FIGHTMOVE_PUNCH;
break; break;
case 2: case 2:
choosenMove = FIGHTMOVE_LONGKICK; choosenMove = FIGHTMOVE_LONGKICK;
break; break;
case 3: // case 3:
choosenMove = FIGHTMOVE_KNEE; // choosenMove = FIGHTMOVE_KNEE;
break; // break;
default: // default:
break; // break;
} }
} }
return choosenMove; return choosenMove;
@ -1975,6 +1986,7 @@ CPed::EndFight(uint8 endType)
void void
CPed::PlayHitSound(CPed *hitTo) CPed::PlayHitSound(CPed *hitTo)
{ {
#if 0 // LCS: temporarily removed
// That was very complicated to reverse for me... // That was very complicated to reverse for me...
// First index is our fight move ID (from 1 to 17, total 17), second is the one of we fight with (from 18 to 27, total 10). // First index is our fight move ID (from 1 to 17, total 17), second is the one of we fight with (from 18 to 27, total 10).
enum { enum {
@ -2045,6 +2057,7 @@ CPed::PlayHitSound(CPed *hitTo)
if (soundId != NO_SND) if (soundId != NO_SND)
DMAudio.PlayOneShot(m_audioEntityId, soundId, (weapon << 8) | ENTITY_TYPE_PED); DMAudio.PlayOneShot(m_audioEntityId, soundId, (weapon << 8) | ENTITY_TYPE_PED);
#endif
} }
// --MIAMI: Done // --MIAMI: Done
@ -2178,8 +2191,9 @@ CPed::FightHitPed(CPed *victim, CVector &touchPoint, CVector &dir, int16 piece)
bool brassKnucklePunch = false; bool brassKnucklePunch = false;
if (GetWeapon()->m_eWeaponType == WEAPONTYPE_BRASSKNUCKLE) { if (GetWeapon()->m_eWeaponType == WEAPONTYPE_BRASSKNUCKLE) {
if (m_curFightMove == FIGHTMOVE_PUNCHHOOK || m_curFightMove == FIGHTMOVE_PUNCHJAB || m_curFightMove == FIGHTMOVE_BACKLEFT || // LCS: removed
m_curFightMove == FIGHTMOVE_STDPUNCH || m_curFightMove == FIGHTMOVE_PUNCH) { if (/*m_curFightMove == FIGHTMOVE_PUNCHHOOK || m_curFightMove == FIGHTMOVE_PUNCHJAB || m_curFightMove == FIGHTMOVE_BACKLEFT ||
m_curFightMove == FIGHTMOVE_STDPUNCH ||*/ m_curFightMove == FIGHTMOVE_PUNCH) {
brassKnucklePunch = true; brassKnucklePunch = true;
damageMult *= 1.5f; damageMult *= 1.5f;
} }

View file

@ -1172,7 +1172,8 @@ void
CPlayerPed::ProcessAnimGroups(void) CPlayerPed::ProcessAnimGroups(void)
{ {
AssocGroupId groupToSet; AssocGroupId groupToSet;
#ifdef PC_PLAYER_CONTROLS //#ifdef PC_PLAYER_CONTROLS
#if 0 // chainsaw anims missing in LCS
if ((m_fWalkAngle <= -DEGTORAD(50.0f) || m_fWalkAngle >= DEGTORAD(50.0f)) if ((m_fWalkAngle <= -DEGTORAD(50.0f) || m_fWalkAngle >= DEGTORAD(50.0f))
&& TheCamera.Cams[TheCamera.ActiveCam].Using3rdPersonMouseCam() && TheCamera.Cams[TheCamera.ActiveCam].Using3rdPersonMouseCam()
&& CanStrafeOrMouseControl()) { && CanStrafeOrMouseControl()) {

View file

@ -481,7 +481,7 @@ void CHud::Draw()
CBaseModelInfo *weaponModel = CModelInfo::GetModelInfo(weaponInfo->m_nModelId); CBaseModelInfo *weaponModel = CModelInfo::GetModelInfo(weaponInfo->m_nModelId);
RwTexDictionary *weaponTxd = CTxdStore::GetSlot(weaponModel->GetTxdSlot())->texDict; RwTexDictionary *weaponTxd = CTxdStore::GetSlot(weaponModel->GetTxdSlot())->texDict;
if (weaponTxd) { if (weaponTxd) {
RwTexture *weaponIcon = RwTexDictionaryFindNamedTexture(weaponTxd, weaponModel->GetName()); RwTexture *weaponIcon = RwTexDictionaryFindNamedTexture(weaponTxd, weaponModel->GetModelName());
if (weaponIcon) { if (weaponIcon) {
RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR); RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void*)rwFILTERLINEAR);
#ifndef FIX_BUGS #ifndef FIX_BUGS

View file

@ -7,6 +7,7 @@
#include "config.h" #include "config.h"
#include "General.h" #include "General.h"
/*
int CWaterCreatures::nNumActiveSeaLifeForms; int CWaterCreatures::nNumActiveSeaLifeForms;
CWaterCreature CWaterCreatures::aWaterCreatures[NUM_WATER_CREATURES]; CWaterCreature CWaterCreatures::aWaterCreatures[NUM_WATER_CREATURES];
@ -271,4 +272,5 @@ void CWaterCreatures::RemoveAll() {
nNumActiveSeaLifeForms--; nNumActiveSeaLifeForms--;
} }
} }
} }
*/

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "Object.h" #include "Object.h"
/*
enum eFishSlotState { enum eFishSlotState {
WATER_CREATURE_INIT = 0, WATER_CREATURE_INIT = 0,
WATER_CREATURE_ACTIVE, WATER_CREATURE_ACTIVE,
@ -45,4 +46,4 @@ struct WaterCreatureProperties {
float fLevel; float fLevel;
float fUnknown; //unused float fUnknown; //unused
float fWaterDepth; float fWaterDepth;
}; };*/

View file

@ -1175,13 +1175,13 @@ CWaterLevel::RenderWater()
if ( WavesCalculatedThisFrame ) if ( WavesCalculatedThisFrame )
{ {
RenderSeaBirds(); RenderSeaBirds();
RenderShipsOnHorizon(); //RenderShipsOnHorizon();
CParticle::HandleShipsAtHorizonStuff(); //CParticle::HandleShipsAtHorizonStuff();
HandleBeachToysStuff(); //HandleBeachToysStuff();
} }
if ( _bSeaLife ) //if ( _bSeaLife )
HandleSeaLifeForms(); // HandleSeaLifeForms();
DefinedState(); DefinedState();
} }
@ -3105,6 +3105,7 @@ CWaterLevel::RenderShipsOnHorizon()
} }
} }
/*
void void
CWaterLevel::HandleSeaLifeForms() CWaterLevel::HandleSeaLifeForms()
{ {
@ -3145,7 +3146,7 @@ CWaterLevel::HandleSeaLifeForms()
} }
CWaterCreatures::UpdateAll(); CWaterCreatures::UpdateAll();
} }*/
void void
CWaterLevel::HandleBeachToysStuff(void) CWaterLevel::HandleBeachToysStuff(void)

View file

@ -399,7 +399,7 @@ RsInitialize(void)
*/ */
RwBool result; RwBool result;
RsGlobal.appName = RWSTRING("GTA: Vice City"); RsGlobal.appName = RWSTRING("GTA: Liberty City Stories");
RsGlobal.maximumWidth = DEFAULT_SCREEN_WIDTH; RsGlobal.maximumWidth = DEFAULT_SCREEN_WIDTH;
RsGlobal.maximumHeight = DEFAULT_SCREEN_HEIGHT; RsGlobal.maximumHeight = DEFAULT_SCREEN_HEIGHT;
RsGlobal.width = DEFAULT_SCREEN_WIDTH; RsGlobal.width = DEFAULT_SCREEN_WIDTH;

View file

@ -1641,13 +1641,13 @@ CAutomobile::ProcessControl(void)
// TODO: make the numbers defines // TODO: make the numbers defines
float heading; float heading;
if(GetPosition().x > 1950.0f-400.0f){ if(GetPosition().x > 1950.0f){
if(m_vecMoveSpeed.x > 0.0f) if(m_vecMoveSpeed.x > 0.0f)
m_vecMoveSpeed.x *= -1.0f; m_vecMoveSpeed.x *= -1.0f;
heading = GetForward().Heading(); heading = GetForward().Heading();
if(heading > 0.0f) // going west if(heading > 0.0f) // going west
SetHeading(-heading); SetHeading(-heading);
}else if(GetPosition().x < -1950.0f-400.0f){ }else if(GetPosition().x < -1950.0f){
if(m_vecMoveSpeed.x < 0.0f) if(m_vecMoveSpeed.x < 0.0f)
m_vecMoveSpeed.x *= -1.0f; m_vecMoveSpeed.x *= -1.0f;
heading = GetForward().Heading(); heading = GetForward().Heading();
@ -5615,7 +5615,7 @@ CAutomobile::SetBumperDamage(int32 component, ePanels panel, bool noFlyingCompon
int status = Damage.GetPanelStatus(panel); int status = Damage.GetPanelStatus(panel);
if(m_aCarNodes[component] == nil){ if(m_aCarNodes[component] == nil){
printf("Trying to damage component %d of %s\n", printf("Trying to damage component %d of %s\n",
component, CModelInfo::GetModelInfo(GetModelIndex())->GetName()); component, CModelInfo::GetModelInfo(GetModelIndex())->GetModelName());
return; return;
} }
if(status == PANEL_STATUS_SMASHED1){ if(status == PANEL_STATUS_SMASHED1){
@ -5635,7 +5635,7 @@ CAutomobile::SetDoorDamage(int32 component, eDoors door, bool noFlyingComponents
int status = Damage.GetDoorStatus(door); int status = Damage.GetDoorStatus(door);
if(m_aCarNodes[component] == nil){ if(m_aCarNodes[component] == nil){
printf("Trying to damage component %d of %s\n", printf("Trying to damage component %d of %s\n",
component, CModelInfo::GetModelInfo(GetModelIndex())->GetName()); component, CModelInfo::GetModelInfo(GetModelIndex())->GetModelName());
return; return;
} }

View file

@ -459,11 +459,11 @@ CTrain::InitTrains(void)
CStreaming::LoadAllRequestedModels(false); CStreaming::LoadAllRequestedModels(false);
// El-Train wagons // El-Train wagons
float wagonPositions[] = { 0.0f, 20.0f, 40.0f, 0.0f, 20.0f }; float wagonPositions[] = { 0.0f, 20.0f, 0.0f, 20.0f };
int8 firstWagon[] = { 1, 0, 0, 1, 0 }; int8 firstWagon[] = { 1, 0, 1, 0 };
int8 lastWagon[] = { 0, 0, 1, 0, 1 }; int8 lastWagon[] = { 0, 1, 0, 1 };
int16 wagonGroup[] = { 0, 0, 0, 1, 1 }; int16 wagonGroup[] = { 0, 0, 1, 1 };
for(i = 0; i < 5; i++){ for(i = 0; i < 4; i++){
train = new CTrain(MI_TRAIN, PERMANENT_VEHICLE); train = new CTrain(MI_TRAIN, PERMANENT_VEHICLE);
train->GetMatrix().SetTranslate(0.0f, 0.0f, 0.0f); train->GetMatrix().SetTranslate(0.0f, 0.0f, 0.0f);
train->SetStatus(STATUS_ABANDONED); train->SetStatus(STATUS_ABANDONED);
@ -649,52 +649,6 @@ CTrain::ReadAndInterpretTrackFile(Const char *filename, CTrainNode **nodes, int1
#endif #endif
} }
void
PlayAnnouncement(uint8 sound, uint8 station)
{
// this was gone in a PC version but inlined on PS2
cAudioScriptObject *obj = new cAudioScriptObject;
obj->AudioId = sound;
obj->Posn = CTrain::aStationCoors[station];
obj->AudioEntity = AEHANDLE_NONE;
DMAudio.CreateOneShotScriptObject(obj);
}
void
ProcessTrainAnnouncements(void)
{
#ifdef GTA_TRAIN
for (int i = 0; i < ARRAY_SIZE(StationDist); i++) {
for (int j = 0; j < ARRAY_SIZE(EngineTrackPosition); j++) {
if (!bTrainArrivalAnnounced[i]) {
float preDist = StationDist[i] - 100.0f;
if (preDist < 0.0f)
preDist += TotalLengthOfTrack;
if (EngineTrackPosition[j] > preDist && EngineTrackPosition[j] < StationDist[i]) {
bTrainArrivalAnnounced[i] = true;
PlayAnnouncement(SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_1, i);
break;
}
} else {
float postDist = StationDist[i] + 10.0f;
#ifdef FIX_BUGS
if (postDist > TotalLengthOfTrack)
postDist -= TotalLengthOfTrack;
#else
if (postDist < 0.0f) // does this even make sense here?
postDist += TotalLengthOfTrack;
#endif
if (EngineTrackPosition[j] > StationDist[i] && EngineTrackPosition[j] < postDist) {
bTrainArrivalAnnounced[i] = false;
PlayAnnouncement(SCRIPT_SOUND_TRAIN_ANNOUNCEMENT_2, i);
break;
}
}
}
}
#endif
}
void void
CTrain::UpdateTrains(void) CTrain::UpdateTrains(void)
{ {
@ -732,8 +686,6 @@ CTrain::UpdateTrains(void)
// time offset for each train // time offset for each train
time += 0x20000/2; time += 0x20000/2;
} }
ProcessTrainAnnouncements();
} }
// Update Subway // Update Subway