diff --git a/docs/tr2/progress.svg b/docs/tr2/progress.svg index c58178d48..aa0c468c8 100644 --- a/docs/tr2/progress.svg +++ b/docs/tr2/progress.svg @@ -69,10 +69,10 @@ Tomb2.exe progress according to the physical function order: -63.71% (776) · 33.83% (412) · 0% (0) · 2.46% (30) +63.79% (777) · 33.74% (411) · 0% (0) · 2.46% (30) - - + + @@ -281,7 +281,7 @@ void __cdecl Dragon_Control(int16_t back_num); void __cdecl Bartoli_Initialise(int16_t item_num); void __cdecl Bartoli_Control(int16_t item_num); -void __cdecl DinoControl(int16_t item_num); +void __cdecl TRex_Control(int16_t item_num); int32_t __cdecl Game_DrawCinematic(void); int32_t __cdecl Game_Draw(void); void __cdecl Room_DrawAllRooms(int16_t current_room); @@ -315,8 +315,8 @@ BOUNDS_16 *__cdecl Item_GetBoundsAccurate(const ITEM *item); FRAME_INFO *__cdecl Item_GetBestFrame(const ITEM *item); void __cdecl AddDynamicLight(int32_t x, int32_t y, int32_t z, int32_t intensity, int32_t falloff); -void __cdecl BigEelControl(int16_t item_num); -void __cdecl EelControl(int16_t item_num); +void __cdecl BigEel_Control(int16_t item_num); +void __cdecl Eel_Control(int16_t item_num); int32_t __cdecl Lara_IsNearItem(PHD_3DPOS *pos, int32_t distance); void __cdecl Sound_UpdateEffects(void); int16_t __cdecl DoBloodSplat(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE direction, int16_t room_num); @@ -373,15 +373,15 @@ void __cdecl AssaultReset(ITEM *item); void __cdecl AssaultFinished(ITEM *item); int16_t __cdecl Knife(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num); -void __cdecl Cult2Control(int16_t item_num); -void __cdecl MonkControl(int16_t item_num); -void __cdecl Worker3Control(int16_t item_num); -void __cdecl DrawXianLord(ITEM *item); +void __cdecl Cultist2_Control(int16_t item_num); +void __cdecl Monk_Control(int16_t item_num); +void __cdecl Worker3_Control(int16_t item_num); +void __cdecl XianKnight_Draw(const ITEM *item); void __cdecl XianDamage(ITEM *item, CREATURE *xian, int32_t damage); -void __cdecl InitialiseXianLord(int16_t item_num); -void __cdecl XianLordControl(int16_t item_num); +void __cdecl XianKnight_Initialise(int16_t item_num); +void __cdecl XianSpearman_Control(int16_t item_num); void __cdecl WarriorSparkleTrail(ITEM *item); -void __cdecl WarriorControl(int16_t item_num); +void __cdecl XianKnight_Control(int16_t item_num); int32_t __cdecl GF_LoadScriptFile(const char *fname); int32_t __cdecl GF_DoFrontendSequence(void); int32_t __cdecl GF_DoLevelSequence(int32_t level, GAMEFLOW_LEVEL_TYPE type); @@ -689,8 +689,8 @@ int32_t __cdecl TestBlockPush(ITEM *item, int32_t block_height, uint16_t quadrant); int32_t __cdecl TestBlockPull(ITEM *item, int32_t block_height, uint16_t quadrant); void __cdecl Room_AlterFloorHeight(ITEM *item, int32_t height); -void __cdecl DrawMovableBlock(ITEM *item); -void __cdecl DrawUnclippedItem(ITEM *item); +void __cdecl DrawMovableBlock(const ITEM *item); +void __cdecl Object_DrawUnclippedItem(const ITEM *item); void __cdecl EarthQuake(int16_t item_num); void __cdecl ControlCutShotgun(int16_t item_num); void __cdecl InitialiseFinalLevel(void); @@ -737,15 +737,15 @@ int16_t __cdecl GunHit(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num); int16_t __cdecl GunMiss(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num); int32_t __cdecl ShotLara(ITEM *item, AI_INFO *info, BITE *gun, int16_t extra_rotation, int32_t damage); -void __cdecl InitialiseCult1(int16_t item_num); -void __cdecl Cult1Control(int16_t item_num); -void __cdecl InitialiseCult3(int16_t item_num); -void __cdecl Cult3Control(int16_t item_num); -void __cdecl Worker1Control(int16_t item_num); -void __cdecl Worker2Control(int16_t item_num); -void __cdecl BanditControl(int16_t item_num); -void __cdecl Bandit2Control(int16_t item_num); -void __cdecl WinstonControl(int16_t item_num); +void __cdecl Cultist1_Initialise(int16_t item_num); +void __cdecl Cultist1_Control(int16_t item_num); +void __cdecl Cultist3_Initialise(int16_t item_num); +void __cdecl Cultist3_Control(int16_t item_num); +void __cdecl Worker1_Control(int16_t item_num); +void __cdecl Worker2_Control(int16_t item_num); +void __cdecl Bandit1_Control(int16_t item_num); +void __cdecl Bandit2_Control(int16_t item_num); +void __cdecl Winston_Control(int16_t item_num); void __cdecl Pickup_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); void __cdecl Switch_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); void __cdecl Switch_CollisionUW(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); @@ -757,7 +757,7 @@ int32_t __cdecl Keyhole_Trigger(int16_t item_num); int32_t __cdecl Pickup_Trigger(int16_t item_num); void __cdecl SecretControl(int16_t item_num); -void __cdecl MouseControl(int16_t item_num); +void __cdecl Mouse_Control(int16_t item_num); void __cdecl InitialiseStartInfo(void); void __cdecl ModifyStartInfo(int32_t level_num); void __cdecl CreateStartInfo(int32_t level_num); @@ -769,14 +769,14 @@ int32_t __cdecl Level_Initialise(int32_t level_num, int32_t level_type); void __cdecl InitialiseGameFlags(void); void __cdecl InitialiseLevelFlags(void); -void __cdecl Object_SetupBaddyObjects(void); +void __cdecl Object_SetupBaddyObjects(void); void __cdecl Object_SetupTrapObjects(void); void __cdecl Object_SetupGeneralObjects(void); void __cdecl Object_SetupAllObjects(void); void __cdecl GetCarriedItems(void); -void __cdecl JellyControl(int16_t item_num); -void __cdecl BaracuddaControl(int16_t item_num); -void __cdecl SharkControl(int16_t item_num); +void __cdecl Jelly_Control(int16_t item_num); +void __cdecl Baracudda_Control(int16_t item_num); +void __cdecl Shark_Control(int16_t item_num); void __cdecl InitialiseSkidoo(int16_t item_num); int32_t __cdecl SkidooCheckGeton(int16_t item_num, COLL_INFO *coll); void __cdecl SkidooCollision(int16_t item_num, ITEM *litem, COLL_INFO *coll); @@ -794,11 +794,11 @@ int32_t __cdecl SkidooCheckGetOff(void); void __cdecl SkidooGuns(void); int32_t __cdecl SkidooControl(void); -void __cdecl DrawSkidoo(ITEM *item); -void __cdecl InitialiseSkidman(int16_t item_num); -void __cdecl SkidManControl(int16_t rider_num); +void __cdecl SkidooArmed_Draw(const ITEM *item); +void __cdecl SkidooDriver_Initialise(int16_t item_num); +void __cdecl SkidooDriver_Control(int16_t rider_num); void __cdecl SkidmanPush(ITEM *item, ITEM *lara_item, int32_t radius); -void __cdecl SkidmanCollision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); +void __cdecl SkidooDriver_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); int32_t __cdecl Music_GetRealTrack(int32_t track); void __cdecl Sound_Effect(int32_t sample_id, const XYZ_32 *pos, uint32_t flags); void __cdecl Sound_StopEffect(int32_t sample_id); @@ -809,9 +809,9 @@ int32_t __cdecl Collide_GetSpheres(const ITEM *item, SPHERE *spheres, bool world_space); void __cdecl Collide_GetJointAbsPosition(const ITEM *item, const XYZ_32 *vec, int32_t joint); void __cdecl BaddieBiteEffect(ITEM *item, BITE *bite); -void __cdecl SpiderLeap(int16_t item_num, int16_t angle); -void __cdecl SpiderControl(int16_t item_num); -void __cdecl BigSpiderControl(int16_t item_num); +void __cdecl Spider_Leap(int16_t item_num, int16_t angle); +void __cdecl Spider_Control(int16_t item_num); +void __cdecl BigSpider_Control(int16_t item_num); void __cdecl Text_Init(void); TEXTSTRING *__cdecl Text_Create(int32_t x, int32_t y, int32_t z, const char *text); void __cdecl Text_ChangeText(TEXTSTRING *string, const char *text); @@ -868,8 +868,8 @@ void __cdecl Lara_TouchLava(ITEM *item); void __cdecl EmberEmitter_Control(int16_t item_num); void __cdecl Ember_Control(int16_t fx_num); -void __cdecl GiantYetiControl(int16_t item_num); -void __cdecl YetiControl(int16_t item_num); +void __cdecl GiantYeti_Control(int16_t item_num); +void __cdecl Yeti_Control(int16_t item_num); void __cdecl BGND_Make640x480(uint8_t *bitmap, RGB_888 *palette); int32_t __cdecl BGND_AddTexture(int32_t tile_idx, BYTE *bitmap, int32_t pal_index, RGB_888 *bmp_pal); void __cdecl BGND_GetPageHandles(void); @@ -1298,16 +1298,16 @@ Tomb2.exe progress according to the function sizes: -67.85% · 31.83% · 0% · 0.33% +69.06% · 30.61% · 0% · 0.33% - - + + void __cdecl Output_WGTMapPersp32FP(int32_t y1, int32_t y2, uint8_t *tex_page); int32_t __cdecl Inv_Display(int32_t inventory_mode); -void __cdecl Object_SetupBaddyObjects(void); +void __cdecl Object_SetupBaddyObjects(void); void __cdecl Output_GTMapPersp32FP(int32_t y1, int32_t y2, uint8_t *tex_page); void __cdecl Lara_Draw(const ITEM *item); void __cdecl GF_ModifyInventory(int32_t level, int32_t type); @@ -1333,11 +1333,11 @@ void __cdecl Output_InsertGT3_ZBuffered(const PHD_VBUF *vtx0, const PHD_VBUF *vtx1, const PHD_VBUF *vtx2, const PHD_TEXTURE *texture, const PHD_UV *uv0, const PHD_UV *uv1, const PHD_UV *uv2); void __cdecl Boat_Control(int16_t item_num); void __cdecl Object_SetupTrapObjects(void); -void __cdecl YetiControl(int16_t item_num); -void __cdecl Worker3Control(int16_t item_num); -void __cdecl XianLordControl(int16_t item_num); +void __cdecl Yeti_Control(int16_t item_num); +void __cdecl Worker3_Control(int16_t item_num); +void __cdecl XianSpearman_Control(int16_t item_num); BOOL __cdecl Level_LoadObjects(HANDLE handle); -void __cdecl Cult3Control(int16_t item_num); +void __cdecl Cultist3_Control(int16_t item_num); void __cdecl CreateSaveGameInfo(void); void __cdecl Dragon_Control(int16_t back_num); int32_t __cdecl Output_XYGUVClipper(int32_t vtx_count, VERTEX_INFO *vtx); @@ -1347,7 +1347,7 @@ void __cdecl Option_Controls_ShowControls(void); void __cdecl Camera_Update(void); void __cdecl Output_InsertTrans8(const PHD_VBUF *vbuf, int16_t shade); -void __cdecl MonkControl(int16_t item_num); +void __cdecl Monk_Control(int16_t item_num); LRESULT __stdcall WinVidGameWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); int32_t __cdecl SkidooDynamics(ITEM *skidoo); void __cdecl Option_Sound(INVENTORY_ITEM *item); @@ -1359,23 +1359,23 @@ int32_t __cdecl SkidooControl(void); void __cdecl Creature_Mood(ITEM *item, AI_INFO *info, int32_t violent); const int16_t *__cdecl Output_InsertObjectG4_Sorted(const int16_t *obj_ptr, int32_t num, SORT_TYPE sort_type); -void __cdecl Worker2Control(int16_t item_num); +void __cdecl Worker2_Control(int16_t item_num); void __cdecl ShowEndStatsText(void); int32_t __cdecl Output_XYGClipper(int32_t vtx_count, VERTEX_INFO *vtx); void __cdecl Inv_DrawInventoryItem(INVENTORY_ITEM *inv_item); -void __cdecl Cult2Control(int16_t item_num); -void __cdecl Bandit2Control(int16_t item_num); -void __cdecl Cult1Control(int16_t item_num); +void __cdecl Cultist2_Control(int16_t item_num); +void __cdecl Bandit2_Control(int16_t item_num); +void __cdecl Cultist1_Control(int16_t item_num); void __cdecl Rocket_Control(int16_t item_num); -void __cdecl DrawXianLord(ITEM *item); -void __cdecl SkidManControl(int16_t rider_num); +void __cdecl XianKnight_Draw(const ITEM *item); +void __cdecl SkidooDriver_Control(int16_t rider_num); void __cdecl InitialiseDoor(int16_t item_num); int32_t __cdecl Collide_CollideStaticObjects(COLL_INFO *coll, int32_t x, int32_t y, int32_t z, int16_t room_num, int32_t height); void __cdecl Room_Clip(ROOM *r); void __cdecl Text_DrawText(const TEXTSTRING *string); const int16_t *__cdecl Output_InsertObjectG4(const int16_t *obj_ptr, int32_t num, SORT_TYPE sort_type); -void __cdecl Worker1Control(int16_t item_num); -void __cdecl WarriorControl(int16_t item_num); +void __cdecl Worker1_Control(int16_t item_num); +void __cdecl XianKnight_Control(int16_t item_num); HRESULT __stdcall EnumDisplayModesCallback(LPDDSDESC lpDDSurfaceDesc, LPVOID lpContext); void __cdecl RenderStart(bool is_reset); BOOL __cdecl Level_LoadRooms(HANDLE handle); @@ -1407,7 +1407,7 @@ void __cdecl CheckCheatMode(void); const int16_t *__cdecl Output_InsertObjectG3(const int16_t *obj_ptr, int32_t num, SORT_TYPE sort_type); void __cdecl Lara_GetJointAbsPosition_I(ITEM *item, XYZ_32 *vec, int16_t *frame1, int16_t *frame2, int32_t frac, int32_t rate); -void __cdecl BanditControl(int16_t item_num); +void __cdecl Bandit1_Control(int16_t item_num); void __cdecl Lara_Push(ITEM *item, ITEM *lara_item, COLL_INFO *coll, int32_t spaz_on, int32_t big_push); int32_t __cdecl LOS_CheckSmashable(const GAME_VECTOR *start, GAME_VECTOR *target); void __fastcall Output_GTMapA(int32_t y0, int32_t y1, uint8_t *tex_page); // actually, __watcall, which is esoteric and rarely supported @@ -1420,24 +1420,24 @@ bool __cdecl SE_ShowSetupDialog(HWND hParent, bool isDefault); void __cdecl Option_Detail(INVENTORY_ITEM *item); int32_t __cdecl Collide_GetSpheres(const ITEM *item, SPHERE *spheres, bool world_space); -void __cdecl DrawSkidoo(ITEM *item); +void __cdecl SkidooArmed_Draw(const ITEM *item); const int16_t *__cdecl Output_InsertObjectG3_ZBuffered(const int16_t *obj_ptr, int32_t num, SORT_TYPE sort_type); int32_t __cdecl Output_XYClipper(int32_t vtx_count, VERTEX_INFO *vtx); void __cdecl ControlMissile(int16_t fx_num); BOOL __cdecl Shell_Main(void); void __cdecl Lara_Animate(ITEM *item); -void __cdecl GiantYetiControl(int16_t item_num); +void __cdecl GiantYeti_Control(int16_t item_num); void __cdecl Output_DrawSprite(uint32_t flags, int32_t x, int32_t y, int32_t z, int16_t sprite_idx, int16_t shade, int16_t scale); void __cdecl Lara_Initialise(int32_t type); void __cdecl SkidooAnimation(ITEM *skidoo, int32_t collide, int32_t dead); void __cdecl Room_DrawAllRooms(int16_t current_room); void __cdecl PuzzleHole_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); void __cdecl ControlDeathSlide(int16_t item_num); -void __cdecl DinoControl(int16_t item_num); +void __cdecl TRex_Control(int16_t item_num); int32_t __cdecl Output_XGenXGUVPerspFP(const int16_t *obj_ptr); void __cdecl Tiger_Control(int16_t item_num); const int16_t *__cdecl Output_CalcRoomVertices(const int16_t *obj_ptr, int32_t far_clip); -void __cdecl SharkControl(int16_t item_num); +void __cdecl Shark_Control(int16_t item_num); int32_t __cdecl DoShift(ITEM *skidoo, XYZ_32 *pos, XYZ_32 *old); int32_t __cdecl S_GetObjectBounds(const BOUNDS_16 *bounds); void __cdecl Flare_Control(int16_t item_num); @@ -1471,13 +1471,13 @@ void __cdecl BGND_DrawInGameBackground(void); void __cdecl Gun_GetNewTarget(WEAPON_INFO *winfo); int32_t __cdecl Lara_TestWaterClimbOut(ITEM *item, COLL_INFO *coll); -void __cdecl BaracuddaControl(int16_t item_num); +void __cdecl Baracudda_Control(int16_t item_num); int32_t __cdecl Output_XGenXGUV(const int16_t *obj_ptr); void __cdecl Room_DrawSingleRoomObjects(int16_t room_num); void __cdecl FinalLevelCounter_Control(int16_t item_num); void __cdecl Lara_Col_ClimbStance(ITEM *item, COLL_INFO *coll); void __cdecl Switch_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); -void __cdecl SpiderControl(int16_t item_num); +void __cdecl Spider_Control(int16_t item_num); void __cdecl S_LightRoom(ROOM *room); bool __cdecl ApplySettings(APP_SETTINGS *new_settings); void __cdecl CreateStartInfo(int32_t level_num); @@ -1493,9 +1493,9 @@ int32_t __cdecl GF_LoadScriptFile(const char *fname); void __cdecl Matrix_RotYXZpack(uint32_t rpack); void __cdecl Camera_Look(const ITEM *item); -void __cdecl EelControl(int16_t item_num); +void __cdecl Eel_Control(int16_t item_num); void __cdecl Matrix_RotYXZ(int16_t ry, int16_t rx, int16_t rz); -void __cdecl MouseControl(int16_t item_num); +void __cdecl Mouse_Control(int16_t item_num); void __cdecl SE_GraphicsDlgFullScreenModesUpdate(HWND hwndDlg); void __cdecl Creature_GetBaddieTarget(int16_t item_num, int32_t goody); void __cdecl Flare_Create(int32_t thrown); @@ -1521,12 +1521,12 @@ bool __cdecl LOT_EnableBaddieAI(int16_t item_num, bool always); void __cdecl Output_InsertClippedPoly_Textured(int32_t vtx_count, float z, int16_t poly_type, int16_t tex_page); void __cdecl Matrix_Interpolate(void); -void __cdecl BigSpiderControl(int16_t item_num); +void __cdecl BigSpider_Control(int16_t item_num); void __cdecl ClearBuffers(DWORD flags, DWORD fill_color); void __cdecl Output_DrawPolyLine(const int16_t *obj_ptr); int32_t __cdecl Camera_ShiftClamp(GAME_VECTOR *pos, int32_t clamp); int32_t __cdecl Lara_TestHangJump(ITEM *item, COLL_INFO *coll); -void __cdecl BigEelControl(int16_t item_num); +void __cdecl BigEel_Control(int16_t item_num); void __cdecl Lara_Col_ClimbDown(ITEM *item, COLL_INFO *coll); void __cdecl Collide_GetJointAbsPosition(const ITEM *item, const XYZ_32 *vec, int32_t joint); SECTOR *__cdecl Room_GetSector(int32_t x, int32_t y, int32_t z, int16_t *room_num); @@ -1557,7 +1557,7 @@ void __cdecl Output_InsertPoly_Gouraud(int32_t vtx_count, float z, int32_t red, int32_t green, int32_t blue, int16_t poly_type); void __cdecl Boat_DoWakeEffect(ITEM *boat); bool __cdecl TexturePageInit(TEXPAGE_DESC *page); -void __cdecl WinstonControl(int16_t item_num); +void __cdecl Winston_Control(int16_t item_num); int32_t __cdecl Boat_CheckGeton(int16_t item_num, COLL_INFO *coll); void __cdecl Creature_Kill(ITEM *item, int32_t kill_anim, int32_t kill_state, int32_t lara_kill_state); int32_t __cdecl Game_Cutscene_Control(int32_t nframes); @@ -1634,7 +1634,7 @@ void __cdecl SE_SoundDlgUpdate(HWND hwndDlg); HRESULT __stdcall EnumTextureFormatsCallback(LPDDSDESC lpDdsd, LPVOID lpContext); void __cdecl SkidmanPush(ITEM *item, ITEM *lara_item, int32_t radius); -void __cdecl JellyControl(int16_t item_num); +void __cdecl Jelly_Control(int16_t item_num); void __cdecl S_DrawScreenBox(int32_t sx, int32_t sy, int32_t z, int32_t width, int32_t height, BYTE color_idx, const GOURAUD_OUTLINE *gour, uint16_t flags); void __cdecl ControlCeilingSpikes(int16_t item_num); void __cdecl Bartoli_Initialise(int16_t item_num); @@ -1804,7 +1804,7 @@ void __cdecl SyncSurfacePalettes(void *src_data, int32_t width, int32_t height, int32_t src_pitch, RGB_888 *src_palette, void *dst_data, int32_t dst_pitch, RGB_888 *dst_palette, bool preserve_sys_palette); int32_t __cdecl Lara_TestEdgeCatch(ITEM *item, COLL_INFO *coll, int32_t *edge); void __cdecl Requester_AddItem(REQUEST_INFO *req, const char *text1, uint32_t flags1, const char *text2, uint32_t flags2); -void __cdecl SpiderLeap(int16_t item_num, int16_t angle); +void __cdecl Spider_Leap(int16_t item_num, int16_t angle); bool __cdecl Matrix_TranslateRel(int32_t x, int32_t y, int32_t z); int32_t __cdecl Item_GetAnimChange(ITEM *item, const ANIM *anim); int16_t __cdecl Effect_MissileFlame(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num); @@ -1930,11 +1930,11 @@ int32_t __cdecl AddAssaultTime(uint32_t time); void __cdecl Lara_Col_Stop(ITEM *item, COLL_INFO *coll); void __cdecl Lara_Col_Roll(ITEM *item, COLL_INFO *coll); -void __cdecl SkidmanCollision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); +void __cdecl SkidooDriver_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); int32_t __cdecl Room_FindByPos(int32_t x, int32_t y, int32_t z); void __cdecl ControlExplosion1(int16_t fx_num); int32_t __cdecl Lara_DeflectEdge(ITEM *item, COLL_INFO *coll); -void __cdecl InitialiseSkidman(int16_t item_num); +void __cdecl SkidooDriver_Initialise(int16_t item_num); bool __cdecl WinInputInit(void); void __cdecl Random_Seed(void); void __cdecl Option_DoInventory(INVENTORY_ITEM *item); @@ -1994,7 +1994,7 @@ void *__cdecl game_malloc(size_t alloc_size, GAME_BUFFER buf_index); void __cdecl Output_SetFarZ(int32_t far_z); void __cdecl Lara_State_Swim(ITEM *item, COLL_INFO *coll); -void __cdecl DrawUnclippedItem(ITEM *item); +void __cdecl Object_DrawUnclippedItem(const ITEM *item); bool __cdecl PlayFMV(const char *file_name); void __cdecl Direct3DRelease(void); void __cdecl GameWindowCalculateSizeFromClientByZero(int32_t *width, int32_t *height); @@ -2062,7 +2062,7 @@ void __cdecl Lara_Col_Splat(ITEM *item, COLL_INFO *coll); void __cdecl Lara_Col_ClimbRight(ITEM *item, COLL_INFO *coll); void __cdecl HWR_ResetZBuffer(void); -void __cdecl InitialiseXianLord(int16_t item_num); +void __cdecl XianKnight_Initialise(int16_t item_num); void __cdecl Item_ClearKilled(void); void __cdecl Lara_State_Hang(ITEM *item, COLL_INFO *coll); void __cdecl Lara_State_PickupFlare(ITEM *item, COLL_INFO *coll); @@ -2095,7 +2095,7 @@ LPCTSTR __cdecl GuidBinaryToString(GUID *guid); void __cdecl Creature_Underwater(ITEM *item, int32_t depth); const SECTOR *__cdecl Camera_GoodPosition(int32_t x, int32_t y, int32_t z, int16_t room_num); -void __cdecl InitialiseCult3(int16_t item_num); +void __cdecl Cultist3_Initialise(int16_t item_num); void __cdecl Gun_Pistols_SetArmInfo(LARA_ARM *arm, int32_t frame); void __cdecl LOT_DisableBaddieAI(int16_t item_num); void __cdecl TrapDoorControl(int16_t item_num); @@ -2153,7 +2153,7 @@ void __cdecl GetValidLevelsList(REQUEST_INFO *req); void __cdecl draw_right_gun(ITEM *item); void __cdecl draw_left_gun(ITEM *item); -void __cdecl InitialiseCult1(int16_t item_num); +void __cdecl Cultist1_Initialise(int16_t item_num); void __cdecl WinVidShowGameWindow(int32_t nCmdShow); void __cdecl S_FadeToBlack(void); void __cdecl ShutThatDoor(DOORPOS_DATA *d); @@ -2369,7 +2369,7 @@ void __cdecl FreePalette(int32_t palette_idx); void __cdecl Matrix_Pop_I(void); void __cdecl Inv_Ring_MotionRotation(RING_INFO *ring, int16_t rotation, int16_t target); -void __cdecl DrawMovableBlock(ITEM *item); +void __cdecl DrawMovableBlock(const ITEM *item); void __cdecl WinVidFreeWindow(void); bool __cdecl DInputCreate(void); bool __cdecl HWR_Init(void); diff --git a/docs/tr2/progress.txt b/docs/tr2/progress.txt index 6881f99bd..6ea6b6ce0 100644 --- a/docs/tr2/progress.txt +++ b/docs/tr2/progress.txt @@ -3076,7 +3076,7 @@ typedef enum { 0x00417E90 0x0519 + void __cdecl Dragon_Control(int16_t back_num); 0x004183E0 0x0114 + void __cdecl Bartoli_Initialise(int16_t item_num); 0x00418500 0x0193 + void __cdecl Bartoli_Control(int16_t item_num); -0x004186A0 0x0287 -R void __cdecl DinoControl(int16_t item_num); +0x004186A0 0x0287 - void __cdecl TRex_Control(int16_t item_num); # game/draw.c 0x00418950 0x0037 + int32_t __cdecl Game_DrawCinematic(void); @@ -3114,8 +3114,8 @@ typedef enum { 0x0041C0F0 0x0048 -R void __cdecl AddDynamicLight(int32_t x, int32_t y, int32_t z, int32_t intensity, int32_t falloff); # game/eel.c -0x0041C140 0x019D -R void __cdecl BigEelControl(int16_t item_num); -0x0041C2E0 0x01E1 -R void __cdecl EelControl(int16_t item_num); +0x0041C140 0x019D - void __cdecl BigEel_Control(int16_t item_num); +0x0041C2E0 0x01E1 - void __cdecl Eel_Control(int16_t item_num); # game/effects.c 0x0041C4D0 0x008C + int32_t __cdecl Lara_IsNearItem(PHD_3DPOS *pos, int32_t distance); @@ -3176,15 +3176,15 @@ typedef enum { # game/enemies.c 0x0041DB50 0x0076 -R int16_t __cdecl Knife(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num); -0x0041DBD0 0x040B -R void __cdecl Cult2Control(int16_t item_num); -0x0041E000 0x04A1 -R void __cdecl MonkControl(int16_t item_num); -0x0041E4D0 0x05BD -R void __cdecl Worker3Control(int16_t item_num); -0x0041EAE0 0x03F7 -R void __cdecl DrawXianLord(ITEM *item); +0x0041DBD0 0x040B - void __cdecl Cultist2_Control(int16_t item_num); +0x0041E000 0x04A1 - void __cdecl Monk_Control(int16_t item_num); +0x0041E4D0 0x05BD -R void __cdecl Worker3_Control(int16_t item_num); +0x0041EAE0 0x03F7 - void __cdecl XianKnight_Draw(const ITEM *item); 0x0041EEE0 0x00A8 -R void __cdecl XianDamage(ITEM *item, CREATURE *xian, int32_t damage); -0x0041EF90 0x0058 -R void __cdecl InitialiseXianLord(int16_t item_num); -0x0041EFF0 0x0590 -R void __cdecl XianLordControl(int16_t item_num); +0x0041EF90 0x0058 - void __cdecl XianKnight_Initialise(int16_t item_num); +0x0041EFF0 0x0590 -R void __cdecl XianSpearman_Control(int16_t item_num); 0x0041F5D0 0x0098 -R void __cdecl WarriorSparkleTrail(ITEM *item); -0x0041F670 0x03BA -R void __cdecl WarriorControl(int16_t item_num); +0x0041F670 0x03BA - void __cdecl XianKnight_Control(int16_t item_num); # game/gameflow.c 0x0041FA60 0x01E9 + int32_t __cdecl GF_LoadScriptFile(const char *fname); @@ -3530,8 +3530,8 @@ typedef enum { 0x00433D20 0x0137 -R int32_t __cdecl TestBlockPush(ITEM *item, int32_t block_height, uint16_t quadrant); 0x00433E70 0x0225 -R int32_t __cdecl TestBlockPull(ITEM *item, int32_t block_height, uint16_t quadrant); 0x004340B0 0x00BB + void __cdecl Room_AlterFloorHeight(ITEM *item, int32_t height); -0x00434170 0x0022 -R void __cdecl DrawMovableBlock(ITEM *item); -0x004341A0 0x006B -R void __cdecl DrawUnclippedItem(ITEM *item); +0x00434170 0x0022 -R void __cdecl DrawMovableBlock(const ITEM *item); +0x004341A0 0x006B - void __cdecl Object_DrawUnclippedItem(const ITEM *item); # game/objects.c 0x00434210 0x00DB -R void __cdecl EarthQuake(int16_t item_num); @@ -3582,15 +3582,15 @@ typedef enum { 0x00435F90 0x00B9 -R int16_t __cdecl GunHit(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num); 0x00436050 0x00A7 -R int16_t __cdecl GunMiss(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num); 0x00436100 0x01C4 -R int32_t __cdecl ShotLara(ITEM *item, AI_INFO *info, BITE *gun, int16_t extra_rotation, int32_t damage); -0x004362D0 0x0043 -R void __cdecl InitialiseCult1(int16_t item_num); -0x00436320 0x0401 -R void __cdecl Cult1Control(int16_t item_num); -0x00436750 0x0050 -R void __cdecl InitialiseCult3(int16_t item_num); -0x004367A0 0x053C -R void __cdecl Cult3Control(int16_t item_num); -0x00436D10 0x03CA -R void __cdecl Worker1Control(int16_t item_num); -0x00437110 0x042A -R void __cdecl Worker2Control(int16_t item_num); -0x00437570 0x030B -R void __cdecl BanditControl(int16_t item_num); -0x004378B0 0x0408 -R void __cdecl Bandit2Control(int16_t item_num); -0x00437CF0 0x0172 -R void __cdecl WinstonControl(int16_t item_num); +0x004362D0 0x0043 - void __cdecl Cultist1_Initialise(int16_t item_num); +0x00436320 0x0401 - void __cdecl Cultist1_Control(int16_t item_num); +0x00436750 0x0050 - void __cdecl Cultist3_Initialise(int16_t item_num); +0x004367A0 0x053C - void __cdecl Cultist3_Control(int16_t item_num); +0x00436D10 0x03CA - void __cdecl Worker1_Control(int16_t item_num); +0x00437110 0x042A - void __cdecl Worker2_Control(int16_t item_num); +0x00437570 0x030B - void __cdecl Bandit1_Control(int16_t item_num); +0x004378B0 0x0408 - void __cdecl Bandit2_Control(int16_t item_num); +0x00437CF0 0x0172 - void __cdecl Winston_Control(int16_t item_num); # game/pickup.c 0x00437E70 0x0480 + void __cdecl Pickup_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); @@ -3606,7 +3606,7 @@ typedef enum { 0x00438EC0 0x0023 -R void __cdecl SecretControl(int16_t item_num); # game/rat.c -0x00438EF0 0x01DC -R void __cdecl MouseControl(int16_t item_num); +0x00438EF0 0x01DC - void __cdecl Mouse_Control(int16_t item_num); # game/savegame.c 0x004390E0 0x0062 *R void __cdecl InitialiseStartInfo(void); @@ -3622,16 +3622,16 @@ typedef enum { 0x0043A280 0x015F + int32_t __cdecl Level_Initialise(int32_t level_num, int32_t level_type); 0x0043A3E0 0x0061 -R void __cdecl InitialiseGameFlags(void); 0x0043A450 0x0027 -R void __cdecl InitialiseLevelFlags(void); -0x0043A480 0x103B - void __cdecl Object_SetupBaddyObjects(void); +0x0043A480 0x103B + void __cdecl Object_SetupBaddyObjects(void); 0x0043B4C0 0x05FD - void __cdecl Object_SetupTrapObjects(void); 0x0043BAC0 0x0C4C - void __cdecl Object_SetupGeneralObjects(void); 0x0043C710 0x0068 + void __cdecl Object_SetupAllObjects(void); 0x0043C780 0x00CE -R void __cdecl GetCarriedItems(void); # game/shark.c -0x0043C850 0x0116 -R void __cdecl JellyControl(int16_t item_num); -0x0043C970 0x021B -R void __cdecl BaracuddaControl(int16_t item_num); -0x0043CBA0 0x027C -R void __cdecl SharkControl(int16_t item_num); +0x0043C850 0x0116 -R void __cdecl Jelly_Control(int16_t item_num); +0x0043C970 0x021B -R void __cdecl Baracudda_Control(int16_t item_num); +0x0043CBA0 0x027C -R void __cdecl Shark_Control(int16_t item_num); # game/skidoo.c 0x0043CE30 0x0040 -R void __cdecl InitialiseSkidoo(int16_t item_num); @@ -3651,11 +3651,11 @@ typedef enum { 0x0043E2A0 0x0233 -R int32_t __cdecl SkidooCheckGetOff(void); 0x0043E4E0 0x011B -R void __cdecl SkidooGuns(void); 0x0043E600 0x0440 -R int32_t __cdecl SkidooControl(void); -0x0043EA60 0x02D5 -R void __cdecl DrawSkidoo(ITEM *item); -0x0043ED40 0x007F -R void __cdecl InitialiseSkidman(int16_t item_num); -0x0043EDD0 0x03E2 -R void __cdecl SkidManControl(int16_t rider_num); +0x0043EA60 0x02D5 -R void __cdecl SkidooArmed_Draw(const ITEM *item); +0x0043ED40 0x007F -R void __cdecl SkidooDriver_Initialise(int16_t item_num); +0x0043EDD0 0x03E2 - void __cdecl SkidooDriver_Control(int16_t rider_num); 0x0043F1D0 0x0119 -R void __cdecl SkidmanPush(ITEM *item, ITEM *lara_item, int32_t radius); -0x0043F2F0 0x0081 -R void __cdecl SkidmanCollision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); +0x0043F2F0 0x0081 - void __cdecl SkidooDriver_Collision(int16_t item_num, ITEM *lara_item, COLL_INFO *coll); # game/sound.c 0x0043F380 0x0031 * int32_t __cdecl Music_GetRealTrack(int32_t track); @@ -3672,9 +3672,9 @@ typedef enum { 0x0043FF60 0x005D -R void __cdecl BaddieBiteEffect(ITEM *item, BITE *bite); # game/spider.c -0x0043FFC0 0x00AC -R void __cdecl SpiderLeap(int16_t item_num, int16_t angle); -0x00440070 0x0206 -R void __cdecl SpiderControl(int16_t item_num); -0x00440290 0x01A5 -R void __cdecl BigSpiderControl(int16_t item_num); +0x0043FFC0 0x00AC - void __cdecl Spider_Leap(int16_t item_num, int16_t angle); +0x00440070 0x0206 - void __cdecl Spider_Control(int16_t item_num); +0x00440290 0x01A5 - void __cdecl BigSpider_Control(int16_t item_num); # game/text.c 0x00440450 0x002C + void __cdecl Text_Init(void); @@ -3737,8 +3737,8 @@ typedef enum { 0x00442F40 0x010B + void __cdecl Ember_Control(int16_t fx_num); # game/yeti.c -0x00443050 0x02CA -R void __cdecl GiantYetiControl(int16_t item_num); -0x00443350 0x05ED -R void __cdecl YetiControl(int16_t item_num); +0x00443050 0x02CA - void __cdecl GiantYeti_Control(int16_t item_num); +0x00443350 0x05ED - void __cdecl Yeti_Control(int16_t item_num); 0x00443990 0x01B8 +R void __cdecl BGND_Make640x480(uint8_t *bitmap, RGB_888 *palette); 0x00443B50 0x00B9 +R int32_t __cdecl BGND_AddTexture(int32_t tile_idx, BYTE *bitmap, int32_t pal_index, RGB_888 *bmp_pal); diff --git a/src/tr2/game/objects/common.c b/src/tr2/game/objects/common.c index 68ce23983..3e35549b2 100644 --- a/src/tr2/game/objects/common.c +++ b/src/tr2/game/objects/common.c @@ -10,6 +10,10 @@ OBJECT *Object_GetObject(GAME_OBJECT_ID object_id) return &g_Objects[object_id]; } +void Object_DrawDummyItem(const ITEM *const item) +{ +} + void __cdecl Object_Collision( const int16_t item_num, ITEM *const lara_item, COLL_INFO *const coll) { diff --git a/src/tr2/game/objects/common.h b/src/tr2/game/objects/common.h index 4232a542a..cc639bb4e 100644 --- a/src/tr2/game/objects/common.h +++ b/src/tr2/game/objects/common.h @@ -4,5 +4,7 @@ #include +void Object_DrawDummyItem(const ITEM *item); + void __cdecl Object_Collision( int16_t item_num, ITEM *lara_item, COLL_INFO *coll); diff --git a/src/tr2/game/objects/creatures/bandit.c b/src/tr2/game/objects/creatures/bandit.c new file mode 100644 index 000000000..b78e6641b --- /dev/null +++ b/src/tr2/game/objects/creatures/bandit.c @@ -0,0 +1,92 @@ +#include "game/objects/creatures/bandit.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/funcs.h" +#include "global/vars.h" + +#include + +#define BANDIT1_HITPOINTS 45 +#define BANDIT2_HITPOINTS 50 +#define BANDIT_RADIUS (WALL_L / 10) // = 102 + +void Bandit1_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_BANDIT_1); + if (!obj->loaded) { + return; + } + + obj->control = Bandit1_Control; + obj->collision = Creature_Collision; + + obj->hit_points = BANDIT1_HITPOINTS; + obj->radius = BANDIT_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 32] |= BF_ROT_Y; +} + +void Bandit2_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_BANDIT_2); + if (!obj->loaded) { + return; + } + + obj->control = Bandit2_Control; + obj->collision = Creature_Collision; + + obj->hit_points = BANDIT2_HITPOINTS; + obj->radius = BANDIT_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 32] |= BF_ROT_Y; +} + +void Bandit2B_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_BANDIT_2B); + if (!obj->loaded) { + return; + } + + const OBJECT *const ref_obj = Object_GetObject(O_BANDIT_2); + assert(ref_obj->loaded); + obj->anim_idx = ref_obj->anim_idx; + obj->frame_base = ref_obj->frame_base; + + obj->control = Bandit2_Control; + obj->collision = Creature_Collision; + + obj->hit_points = BANDIT2_HITPOINTS; + obj->radius = BANDIT_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 32] |= BF_ROT_Y; +} diff --git a/src/tr2/game/objects/creatures/bandit.h b/src/tr2/game/objects/creatures/bandit.h new file mode 100644 index 000000000..00c28e151 --- /dev/null +++ b/src/tr2/game/objects/creatures/bandit.h @@ -0,0 +1,5 @@ +#pragma once + +void Bandit1_Setup(void); +void Bandit2_Setup(void); +void Bandit2B_Setup(void); diff --git a/src/tr2/game/objects/creatures/barracuda.c b/src/tr2/game/objects/creatures/barracuda.c new file mode 100644 index 000000000..620b1acb4 --- /dev/null +++ b/src/tr2/game/objects/creatures/barracuda.c @@ -0,0 +1,34 @@ +#include "game/objects/creatures/barracuda.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define BARRACUDA_HITPOINTS 12 +#define BARRACUDA_RADIUS (WALL_L / 5) // = 204 + +void Barracuda_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_BARRACUDA); + if (!obj->loaded) { + return; + } + + obj->control = Baracudda_Control; + obj->collision = Creature_Collision; + + obj->hit_points = BARRACUDA_HITPOINTS; + obj->radius = BARRACUDA_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 200; + + obj->intelligent = 1; + obj->water_creature = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; +} diff --git a/src/tr2/game/objects/creatures/barracuda.h b/src/tr2/game/objects/creatures/barracuda.h new file mode 100644 index 000000000..57a6914b4 --- /dev/null +++ b/src/tr2/game/objects/creatures/barracuda.h @@ -0,0 +1,3 @@ +#pragma once + +void Barracuda_Setup(void); diff --git a/src/tr2/game/objects/creatures/bartoli.c b/src/tr2/game/objects/creatures/bartoli.c index 539306f14..f51a9e9fa 100644 --- a/src/tr2/game/objects/creatures/bartoli.c +++ b/src/tr2/game/objects/creatures/bartoli.c @@ -62,6 +62,20 @@ static bool M_CheckLaraProximity(const ITEM *const origin_item) return dx < BARTOLI_RANGE && dz < BARTOLI_RANGE; } +void Bartoli_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_BARTOLI); + if (!obj->loaded) { + return; + } + + obj->initialise = Bartoli_Initialise; + obj->control = Bartoli_Control; + + obj->save_flags = 1; + obj->save_anim = 1; +} + void __cdecl Bartoli_Initialise(const int16_t item_num) { ITEM *const item = Item_Get(item_num); diff --git a/src/tr2/game/objects/creatures/bartoli.h b/src/tr2/game/objects/creatures/bartoli.h index 2694b3f14..eddeae60b 100644 --- a/src/tr2/game/objects/creatures/bartoli.h +++ b/src/tr2/game/objects/creatures/bartoli.h @@ -2,5 +2,7 @@ #include +void Bartoli_Setup(void); + void __cdecl Bartoli_Initialise(int16_t item_num); void __cdecl Bartoli_Control(int16_t item_num); diff --git a/src/tr2/game/objects/creatures/big_eel.c b/src/tr2/game/objects/creatures/big_eel.c new file mode 100644 index 000000000..3360d7899 --- /dev/null +++ b/src/tr2/game/objects/creatures/big_eel.c @@ -0,0 +1,26 @@ +#include "game/objects/creatures/big_eel.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" + +#define BIG_EEL_HITPOINTS 20 + +void BigEel_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_BIG_EEL); + if (!obj->loaded) { + return; + } + + obj->control = BigEel_Control; + obj->collision = Creature_Collision; + + obj->hit_points = BIG_EEL_HITPOINTS; + + obj->water_creature = 1; + obj->save_hitpoints = 1; + obj->save_anim = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/big_eel.h b/src/tr2/game/objects/creatures/big_eel.h new file mode 100644 index 000000000..ea85ab315 --- /dev/null +++ b/src/tr2/game/objects/creatures/big_eel.h @@ -0,0 +1,3 @@ +#pragma once + +void BigEel_Setup(void); diff --git a/src/tr2/game/objects/creatures/big_spider.c b/src/tr2/game/objects/creatures/big_spider.c new file mode 100644 index 000000000..a38c2e98b --- /dev/null +++ b/src/tr2/game/objects/creatures/big_spider.c @@ -0,0 +1,29 @@ +#include "game/objects/creatures/big_spider.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/funcs.h" + +#define BIG_SPIDER_HITPOINTS 40 +#define BIG_SPIDER_RADIUS (WALL_L / 3) // = 341 + +void BigSpider_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_BIG_SPIDER); + if (!obj->loaded) { + return; + } + + obj->control = BigSpider_Control; + obj->collision = Creature_Collision; + + obj->hit_points = BIG_SPIDER_HITPOINTS; + obj->radius = BIG_SPIDER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/big_spider.h b/src/tr2/game/objects/creatures/big_spider.h new file mode 100644 index 000000000..601c06f78 --- /dev/null +++ b/src/tr2/game/objects/creatures/big_spider.h @@ -0,0 +1,3 @@ +#pragma once + +void BigSpider_Setup(void); diff --git a/src/tr2/game/objects/creatures/bird.c b/src/tr2/game/objects/creatures/bird.c index 61a9f40b1..7f93a15f6 100644 --- a/src/tr2/game/objects/creatures/bird.c +++ b/src/tr2/game/objects/creatures/bird.c @@ -8,6 +8,17 @@ #include +#define BIRD_DAMAGE 20 +#define BIRD_RADIUS (WALL_L / 5) // = 204 +#define BIRD_ATTACK_RANGE SQUARE(WALL_L / 2) // = 262144 +#define BIRD_TURN (PHD_DEGREE * 3) // = 546 +#define BIRD_START_ANIM 5 +#define BIRD_DIE_ANIM 8 +#define EAGLE_HITPOINTS 20 +#define CROW_HITPOINTS 15 +#define CROW_START_ANIM 14 +#define CROW_DIE_ANIM 1 + typedef enum { BIRD_ANIM_EMPTY = 0, BIRD_ANIM_FLY = 1, @@ -28,13 +39,51 @@ static const BITE m_CrowBite = { .mesh_num = 14, }; -#define BIRD_DAMAGE 20 -#define BIRD_ATTACK_RANGE SQUARE(WALL_L / 2) // = 262144 -#define BIRD_TURN (PHD_DEGREE * 3) // = 546 -#define BIRD_START_ANIM 5 -#define BIRD_DIE_ANIM 8 -#define CROW_START_ANIM 14 -#define CROW_DIE_ANIM 1 +void Bird_SetupEagle(void) +{ + OBJECT *const obj = &g_Objects[O_EAGLE]; + if (!obj->loaded) { + return; + } + + obj->initialise = Bird_Initialise; + obj->control = Bird_Control; + obj->collision = Creature_Collision; + + obj->hit_points = EAGLE_HITPOINTS; + obj->radius = BIRD_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} + +void Bird_SetupCrow(void) +{ + OBJECT *const obj = &g_Objects[O_CROW]; + if (!obj->loaded) { + return; + } + + obj->initialise = Bird_Initialise; + obj->control = Bird_Control; + obj->collision = Creature_Collision; + + obj->shadow_size = UNIT_SHADOW / 2; + obj->hit_points = CROW_HITPOINTS; + obj->radius = BIRD_RADIUS; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} void __cdecl Bird_Initialise(const int16_t item_num) { diff --git a/src/tr2/game/objects/creatures/bird.h b/src/tr2/game/objects/creatures/bird.h index 459e68585..777c4a110 100644 --- a/src/tr2/game/objects/creatures/bird.h +++ b/src/tr2/game/objects/creatures/bird.h @@ -2,5 +2,8 @@ #include +void Bird_SetupEagle(void); +void Bird_SetupCrow(void); + void __cdecl Bird_Initialise(int16_t item_num); void __cdecl Bird_Control(int16_t item_num); diff --git a/src/tr2/game/objects/creatures/cultist.c b/src/tr2/game/objects/creatures/cultist.c new file mode 100644 index 000000000..28b596671 --- /dev/null +++ b/src/tr2/game/objects/creatures/cultist.c @@ -0,0 +1,144 @@ +#include "game/objects/creatures/cultist.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#include + +#define CULTIST_1_HITPOINTS 25 +#define CULTIST_2_HITPOINTS 60 +#define CULTIST_3_HITPOINTS 150 +#define CULTIST_RADIUS (WALL_L / 10) // = 102 + +void Cultist1_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_CULT_1]; + if (!obj->loaded) { + return; + } + + obj->initialise = Cultist1_Initialise; + obj->control = Cultist1_Control; + obj->collision = Creature_Collision; + + obj->hit_points = CULTIST_1_HITPOINTS; + obj->radius = CULTIST_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 50; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx] |= BF_ROT_Y; +} + +void Cultist1A_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_CULT_1A]; + if (!obj->loaded) { + return; + } + + assert(g_Objects[O_CULT_1].loaded); + obj->frame_base = g_Objects[O_CULT_1].frame_base; + obj->anim_idx = g_Objects[O_CULT_1].anim_idx; + + obj->initialise = Cultist1_Initialise; + obj->control = Cultist1_Control; + obj->collision = Creature_Collision; + + obj->hit_points = CULTIST_1_HITPOINTS; + obj->radius = CULTIST_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 50; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx] |= BF_ROT_Y; +} + +void Cultist1B_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_CULT_1B]; + if (!obj->loaded) { + return; + } + + assert(g_Objects[O_CULT_1].loaded); + obj->frame_base = g_Objects[O_CULT_1].frame_base; + obj->anim_idx = g_Objects[O_CULT_1].anim_idx; + + obj->initialise = Cultist1_Initialise; + obj->control = Cultist1_Control; + obj->collision = Creature_Collision; + + obj->hit_points = CULTIST_1_HITPOINTS; + obj->radius = CULTIST_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 50; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx] |= BF_ROT_Y; +} + +void Cultist2_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_CULT_2]; + if (!obj->loaded) { + return; + } + + obj->control = Cultist2_Control; + obj->collision = Creature_Collision; + + obj->hit_points = CULTIST_2_HITPOINTS; + obj->radius = CULTIST_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 50; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 32] |= BF_ROT_Y; +} + +void Cultist3_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_CULT_3]; + if (!obj->loaded) { + return; + } + + obj->initialise = Cultist3_Initialise; + obj->control = Cultist3_Control; + obj->collision = Creature_Collision; + + obj->hit_points = CULTIST_3_HITPOINTS; + obj->radius = CULTIST_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/cultist.h b/src/tr2/game/objects/creatures/cultist.h new file mode 100644 index 000000000..e0c972122 --- /dev/null +++ b/src/tr2/game/objects/creatures/cultist.h @@ -0,0 +1,7 @@ +#pragma once + +void Cultist1_Setup(void); +void Cultist1A_Setup(void); +void Cultist1B_Setup(void); +void Cultist2_Setup(void); +void Cultist3_Setup(void); diff --git a/src/tr2/game/objects/creatures/diver.c b/src/tr2/game/objects/creatures/diver.c index aa053b0d2..075960bf2 100644 --- a/src/tr2/game/objects/creatures/diver.c +++ b/src/tr2/game/objects/creatures/diver.c @@ -6,6 +6,12 @@ #include "global/funcs.h" #include "global/vars.h" +#define DIVER_SWIM_TURN (3 * PHD_DEGREE) // = 546 +#define DIVER_FRONT_ARC PHD_45 +#define DIVER_DIE_ANIM 16 +#define DIVER_HITPOINTS 20 +#define DIVER_RADIUS (WALL_L / 3) // = 341 + static BITE m_DiverBite = { .pos = { .x = 17, .y = 164, .z = 44, }, .mesh_num = 18 }; typedef enum { @@ -21,9 +27,31 @@ typedef enum { DIVER_ANIM_DEATH = 9, } DIVER_ANIM; -#define DIVER_SWIM_TURN (3 * PHD_DEGREE) // = 546 -#define DIVER_FRONT_ARC PHD_45 -#define DIVER_DIE_ANIM 16 +void Diver_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_DIVER]; + if (!obj->loaded) { + return; + } + + obj->control = Diver_Control; + obj->collision = Creature_Collision; + + obj->hit_points = DIVER_HITPOINTS; + obj->radius = DIVER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 50; + + obj->intelligent = 1; + obj->water_creature = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 40] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 56] |= BF_ROT_Z; +} void __cdecl Diver_Control(int16_t item_num) { diff --git a/src/tr2/game/objects/creatures/diver.h b/src/tr2/game/objects/creatures/diver.h index 477984439..7cb907c77 100644 --- a/src/tr2/game/objects/creatures/diver.h +++ b/src/tr2/game/objects/creatures/diver.h @@ -2,4 +2,6 @@ #include +void Diver_Setup(void); + void __cdecl Diver_Control(int16_t item_num); diff --git a/src/tr2/game/objects/creatures/dog.c b/src/tr2/game/objects/creatures/dog.c new file mode 100644 index 000000000..7c6444697 --- /dev/null +++ b/src/tr2/game/objects/creatures/dog.c @@ -0,0 +1,32 @@ +#include "game/objects/creatures/dog.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define DOG_HITPOINTS 10 +#define DOG_RADIUS (WALL_L / 3) // = 341 + +void Dog_Setup(void) +{ + OBJECT *const obj = Object_GetObject(O_DOG); + if (!obj->loaded) { + return; + } + + obj->control = Dog_Control; + obj->collision = Creature_Collision; + + obj->hit_points = DOG_HITPOINTS; + obj->radius = DOG_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 300; + + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + obj->intelligent = 1; +} diff --git a/src/tr2/game/objects/creatures/dog.h b/src/tr2/game/objects/creatures/dog.h new file mode 100644 index 000000000..bbd55a2fd --- /dev/null +++ b/src/tr2/game/objects/creatures/dog.h @@ -0,0 +1,3 @@ +#pragma once + +void Dog_Setup(void); diff --git a/src/tr2/game/objects/creatures/dragon.c b/src/tr2/game/objects/creatures/dragon.c index f093c3c96..8850db959 100644 --- a/src/tr2/game/objects/creatures/dragon.c +++ b/src/tr2/game/objects/creatures/dragon.c @@ -7,11 +7,15 @@ #include "game/lara/misc.h" #include "game/lot.h" #include "game/math.h" +#include "game/objects/common.h" #include "game/random.h" #include "game/sound.h" +#include "global/const.h" #include "global/funcs.h" #include "global/vars.h" +#include + #define DRAGON_CLOSE 900 #define DRAGON_FAR 2300 #define DRAGON_MID ((DRAGON_CLOSE + DRAGON_FAR) / 2) // = 1600 @@ -27,6 +31,8 @@ #define DRAGON_TOUCH_L 0x7F000000 #define DRAGON_TOUCH_R 0x000000FE #define DRAGON_LIVE_TIME 330 +#define DRAGON_HITPOINTS 300 +#define DRAGON_RADIUS (WALL_L / 3) // = 341 typedef enum { // clang-format off @@ -111,6 +117,47 @@ static void M_PullDagger(ITEM *const lara_item, ITEM *const dragon_back_item) M_MarkDragonDead(dragon_back_item); } +void Dragon_SetupFront(void) +{ + OBJECT *const obj = &g_Objects[O_DRAGON_FRONT]; + if (!obj->loaded) { + return; + } + + assert(g_Objects[O_DRAGON_BACK].loaded); + obj->control = Dragon_Control; + obj->collision = Dragon_Collision; + + obj->hit_points = DRAGON_HITPOINTS; + obj->radius = DRAGON_RADIUS; + obj->pivot_length = 300; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 40] |= BF_ROT_Z; +} + +void Dragon_SetupBack(void) +{ + OBJECT *const obj = &g_Objects[O_DRAGON_BACK]; + if (!obj->loaded) { + return; + } + + obj->control = Dragon_Control; + obj->collision = Dragon_Collision; + + obj->radius = DRAGON_RADIUS; + + obj->save_position = 1; + obj->save_flags = 1; + obj->save_anim = 1; +} + void __cdecl Dragon_Collision( const int16_t item_num, ITEM *const lara_item, COLL_INFO *const coll) { @@ -413,5 +460,4 @@ void __cdecl Dragon_Control(const int16_t item_num) if (dragon_back_item->room_num != dragon_front_item->room_num) { Item_NewRoom(dragon_back_item_num, dragon_front_item->room_num); } - return; } diff --git a/src/tr2/game/objects/creatures/dragon.h b/src/tr2/game/objects/creatures/dragon.h index bf9c964b5..0bea4e094 100644 --- a/src/tr2/game/objects/creatures/dragon.h +++ b/src/tr2/game/objects/creatures/dragon.h @@ -3,6 +3,9 @@ #include "game/items.h" #include "global/types.h" +void Dragon_SetupFront(void); +void Dragon_SetupBack(void); + void __cdecl Dragon_Collision( int16_t item_num, ITEM *lara_item, COLL_INFO *coll); diff --git a/src/tr2/game/objects/creatures/eel.c b/src/tr2/game/objects/creatures/eel.c new file mode 100644 index 000000000..15c0822ce --- /dev/null +++ b/src/tr2/game/objects/creatures/eel.c @@ -0,0 +1,26 @@ +#include "game/objects/creatures/eel.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define EEL_HITPOINTS 5 + +void Eel_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_EEL]; + if (!obj->loaded) { + return; + } + + obj->control = Eel_Control; + obj->collision = Creature_Collision; + + obj->hit_points = EEL_HITPOINTS; + + obj->water_creature = 1; + obj->save_hitpoints = 1; + obj->save_anim = 1; +} diff --git a/src/tr2/game/objects/creatures/eel.h b/src/tr2/game/objects/creatures/eel.h new file mode 100644 index 000000000..ad1576a69 --- /dev/null +++ b/src/tr2/game/objects/creatures/eel.h @@ -0,0 +1,3 @@ +#pragma once + +void Eel_Setup(void); diff --git a/src/tr2/game/objects/creatures/giant_yeti.c b/src/tr2/game/objects/creatures/giant_yeti.c new file mode 100644 index 000000000..952e2a43b --- /dev/null +++ b/src/tr2/game/objects/creatures/giant_yeti.c @@ -0,0 +1,30 @@ +#include "game/objects/creatures/giant_yeti.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define GIANT_YETI_HITPOINTS 200 +#define GIANT_YETI_RADIUS (WALL_L / 3) // = 341 + +void GiantYeti_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_GIANT_YETI]; + if (!obj->loaded) { + return; + } + + obj->control = GiantYeti_Control; + obj->collision = Creature_Collision; + + obj->hit_points = GIANT_YETI_HITPOINTS; + obj->radius = GIANT_YETI_RADIUS; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/giant_yeti.h b/src/tr2/game/objects/creatures/giant_yeti.h new file mode 100644 index 000000000..0e4697b4e --- /dev/null +++ b/src/tr2/game/objects/creatures/giant_yeti.h @@ -0,0 +1,3 @@ +#pragma once + +void GiantYeti_Setup(void); diff --git a/src/tr2/game/objects/creatures/jelly.c b/src/tr2/game/objects/creatures/jelly.c new file mode 100644 index 000000000..fb2d26490 --- /dev/null +++ b/src/tr2/game/objects/creatures/jelly.c @@ -0,0 +1,31 @@ +#include "game/objects/creatures/jelly.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define JELLY_HITPOINTS 10 +#define JELLY_RADIUS (WALL_L / 10) // = 102 + +void Jelly_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_JELLY]; + if (!obj->loaded) { + return; + } + + obj->control = Jelly_Control; + obj->collision = Creature_Collision; + + obj->hit_points = JELLY_HITPOINTS; + obj->radius = JELLY_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/jelly.h b/src/tr2/game/objects/creatures/jelly.h new file mode 100644 index 000000000..e6f962576 --- /dev/null +++ b/src/tr2/game/objects/creatures/jelly.h @@ -0,0 +1,3 @@ +#pragma once + +void Jelly_Setup(void); diff --git a/src/tr2/game/objects/creatures/monk.c b/src/tr2/game/objects/creatures/monk.c new file mode 100644 index 000000000..d57feb7ea --- /dev/null +++ b/src/tr2/game/objects/creatures/monk.c @@ -0,0 +1,55 @@ +#include "game/objects/creatures/monk.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define MONK_HITPOINTS 30 +#define MONK_RADIUS (WALL_L / 10) // = 102 + +void Monk1_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_MONK_1]; + if (!obj->loaded) { + return; + } + + obj->control = Monk_Control; + obj->collision = Creature_Collision; + + obj->hit_points = MONK_HITPOINTS; + obj->radius = MONK_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; +} + +void Monk2_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_MONK_2]; + if (!obj->loaded) { + return; + } + + obj->control = Monk_Control; + obj->collision = Creature_Collision; + + obj->hit_points = MONK_HITPOINTS; + obj->radius = MONK_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/monk.h b/src/tr2/game/objects/creatures/monk.h new file mode 100644 index 000000000..01dad9947 --- /dev/null +++ b/src/tr2/game/objects/creatures/monk.h @@ -0,0 +1,4 @@ +#pragma once + +void Monk1_Setup(void); +void Monk2_Setup(void); diff --git a/src/tr2/game/objects/creatures/mouse.c b/src/tr2/game/objects/creatures/mouse.c new file mode 100644 index 000000000..62580cc28 --- /dev/null +++ b/src/tr2/game/objects/creatures/mouse.c @@ -0,0 +1,32 @@ +#include "game/objects/creatures/mouse.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define MOUSE_HITPOINTS 4 +#define MOUSE_RADIUS (WALL_L / 10) // = 102 + +void Mouse_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_MOUSE]; + if (!obj->loaded) { + return; + } + + obj->control = Mouse_Control; + obj->collision = Creature_Collision; + + obj->hit_points = MOUSE_HITPOINTS; + obj->radius = MOUSE_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 50; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/mouse.h b/src/tr2/game/objects/creatures/mouse.h new file mode 100644 index 000000000..aeced6da3 --- /dev/null +++ b/src/tr2/game/objects/creatures/mouse.h @@ -0,0 +1,3 @@ +#pragma once + +void Mouse_Setup(void); diff --git a/src/tr2/game/objects/creatures/shark.c b/src/tr2/game/objects/creatures/shark.c new file mode 100644 index 000000000..16abd3225 --- /dev/null +++ b/src/tr2/game/objects/creatures/shark.c @@ -0,0 +1,34 @@ +#include "game/objects/creatures/shark.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define SHARK_HITPOINTS 30 +#define SHARK_RADIUS (WALL_L / 3) // = 341 + +void Shark_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_SHARK]; + if (!obj->loaded) { + return; + } + + obj->control = Shark_Control; + obj->draw_routine = Object_DrawUnclippedItem; + obj->collision = Creature_Collision; + + obj->hit_points = SHARK_HITPOINTS; + obj->radius = SHARK_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 200; + + obj->intelligent = 1; + obj->water_creature = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/shark.h b/src/tr2/game/objects/creatures/shark.h new file mode 100644 index 000000000..95fc89213 --- /dev/null +++ b/src/tr2/game/objects/creatures/shark.h @@ -0,0 +1,3 @@ +#pragma once + +void Shark_Setup(void); diff --git a/src/tr2/game/objects/creatures/skidoo_driver.c b/src/tr2/game/objects/creatures/skidoo_driver.c new file mode 100644 index 000000000..da4836095 --- /dev/null +++ b/src/tr2/game/objects/creatures/skidoo_driver.c @@ -0,0 +1,47 @@ +#include "game/objects/creatures/skidoo_driver.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define SKIDOO_DRIVER_HITPOINTS 100 +#define SKIDOO_ARMED_RADIUS (WALL_L / 3) // = 341 + +void SkidooArmed_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_SKIDOO_ARMED]; + if (!obj->loaded) { + return; + } + + obj->collision = SkidooDriver_Collision; + + obj->hit_points = SKIDOO_DRIVER_HITPOINTS; + obj->radius = SKIDOO_ARMED_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} + +void SkidooDriver_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_SKIDMAN]; + if (!obj->loaded) { + return; + } + + obj->initialise = SkidooDriver_Initialise; + obj->control = SkidooDriver_Control; + + obj->hit_points = 1; + + obj->save_position = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/skidoo_driver.h b/src/tr2/game/objects/creatures/skidoo_driver.h new file mode 100644 index 000000000..ba6fa835a --- /dev/null +++ b/src/tr2/game/objects/creatures/skidoo_driver.h @@ -0,0 +1,4 @@ +#pragma once + +void SkidooArmed_Setup(void); +void SkidooDriver_Setup(void); diff --git a/src/tr2/game/objects/creatures/spider.c b/src/tr2/game/objects/creatures/spider.c new file mode 100644 index 000000000..87c2fb8f2 --- /dev/null +++ b/src/tr2/game/objects/creatures/spider.c @@ -0,0 +1,31 @@ +#include "game/objects/creatures/spider.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define SPIDER_HITPOINTS 5 +#define SPIDER_RADIUS (WALL_L / 10) // = 102 + +void Spider_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_SPIDER]; + if (!obj->loaded) { + return; + } + + obj->control = Spider_Control; + obj->collision = Creature_Collision; + + obj->hit_points = SPIDER_HITPOINTS; + obj->radius = SPIDER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/spider.h b/src/tr2/game/objects/creatures/spider.h new file mode 100644 index 000000000..26f127a64 --- /dev/null +++ b/src/tr2/game/objects/creatures/spider.h @@ -0,0 +1,3 @@ +#pragma once + +void Spider_Setup(void); diff --git a/src/tr2/game/objects/creatures/tiger.c b/src/tr2/game/objects/creatures/tiger.c new file mode 100644 index 000000000..af1555a5f --- /dev/null +++ b/src/tr2/game/objects/creatures/tiger.c @@ -0,0 +1,32 @@ +#include "game/objects/creatures/tiger.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define TIGER_HITPOINTS 20 +#define TIGER_RADIUS (WALL_L / 3) // = 341 + +void Tiger_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_TIGER]; + if (!obj->loaded) { + return; + } + + obj->control = Tiger_Control; + obj->collision = Creature_Collision; + + obj->hit_points = TIGER_HITPOINTS; + obj->radius = TIGER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 200; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; +} diff --git a/src/tr2/game/objects/creatures/tiger.h b/src/tr2/game/objects/creatures/tiger.h new file mode 100644 index 000000000..ac408a305 --- /dev/null +++ b/src/tr2/game/objects/creatures/tiger.h @@ -0,0 +1,3 @@ +#pragma once + +void Tiger_Setup(void); diff --git a/src/tr2/game/objects/creatures/trex.c b/src/tr2/game/objects/creatures/trex.c new file mode 100644 index 000000000..18751462c --- /dev/null +++ b/src/tr2/game/objects/creatures/trex.c @@ -0,0 +1,34 @@ +#include "game/objects/creatures/trex.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define TREX_HITPOINTS 100 +#define TREX_RADIUS (WALL_L / 3) // = 341 + +void TRex_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_DINO]; + if (!obj->loaded) { + return; + } + + obj->control = TRex_Control; + obj->collision = Creature_Collision; + + obj->hit_points = TREX_HITPOINTS; + obj->radius = TREX_RADIUS; + obj->shadow_size = 64; + obj->pivot_length = 1800; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 40] |= BF_ROT_Y; +} diff --git a/src/tr2/game/objects/creatures/trex.h b/src/tr2/game/objects/creatures/trex.h new file mode 100644 index 000000000..30b0c286c --- /dev/null +++ b/src/tr2/game/objects/creatures/trex.h @@ -0,0 +1,3 @@ +#pragma once + +void TRex_Setup(void); diff --git a/src/tr2/game/objects/creatures/winston.c b/src/tr2/game/objects/creatures/winston.c new file mode 100644 index 000000000..139af5b64 --- /dev/null +++ b/src/tr2/game/objects/creatures/winston.c @@ -0,0 +1,28 @@ +#include "game/objects/creatures/winston.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define WINSTON_RADIUS (WALL_L / 10) // = 102 + +void Winston_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_WINSTON]; + if (!obj->loaded) { + return; + } + + obj->control = Winston_Control; + obj->collision = Object_Collision; + + obj->hit_points = DONT_TARGET; + obj->radius = WINSTON_RADIUS; + obj->shadow_size = UNIT_SHADOW / 4; + + obj->intelligent = 1; + obj->save_position = 1; + obj->save_anim = 1; +} diff --git a/src/tr2/game/objects/creatures/winston.h b/src/tr2/game/objects/creatures/winston.h new file mode 100644 index 000000000..404aa7f91 --- /dev/null +++ b/src/tr2/game/objects/creatures/winston.h @@ -0,0 +1,3 @@ +#pragma once + +void Winston_Setup(void); diff --git a/src/tr2/game/objects/creatures/worker.c b/src/tr2/game/objects/creatures/worker.c new file mode 100644 index 000000000..d3ce8dfbd --- /dev/null +++ b/src/tr2/game/objects/creatures/worker.c @@ -0,0 +1,138 @@ +#include "game/objects/creatures/worker.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define WORKER_1_HITPOINTS 25 +#define WORKER_2_HITPOINTS 20 +#define WORKER_3_HITPOINTS 27 +#define WORKER_4_HITPOINTS 27 +#define WORKER_5_HITPOINTS 20 +#define WORKER_RADIUS (WALL_L / 10) // = 102 + +void Worker1_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_WORKER_1]; + if (!obj->loaded) { + return; + } + + obj->control = Worker1_Control; + obj->collision = Creature_Collision; + + obj->hit_points = WORKER_1_HITPOINTS; + obj->radius = WORKER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 16] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 52] |= BF_ROT_Y; +} + +void Worker2_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_WORKER_2]; + if (!obj->loaded) { + return; + } + + obj->control = Worker2_Control; + obj->collision = Creature_Collision; + + obj->hit_points = WORKER_2_HITPOINTS; + obj->radius = WORKER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 16] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 52] |= BF_ROT_Y; +} + +void Worker3_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_WORKER_3]; + if (!obj->loaded) { + return; + } + + obj->control = Worker3_Control; + obj->collision = Creature_Collision; + + obj->hit_points = WORKER_3_HITPOINTS; + obj->radius = WORKER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 16] |= BF_ROT_Y; +} + +void Worker4_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_WORKER_4]; + if (!obj->loaded) { + return; + } + + obj->control = Worker3_Control; + obj->collision = Creature_Collision; + + obj->hit_points = WORKER_4_HITPOINTS; + obj->radius = WORKER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx] |= BF_ROT_Y; + g_AnimBones[obj->bone_idx + 16] |= BF_ROT_Y; +} + +void Worker5_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_WORKER_5]; + if (!obj->loaded) { + return; + } + + obj->control = Worker2_Control; + obj->collision = Creature_Collision; + + obj->hit_points = WORKER_5_HITPOINTS; + obj->radius = WORKER_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 16] |= BF_ROT_Y; +} diff --git a/src/tr2/game/objects/creatures/worker.h b/src/tr2/game/objects/creatures/worker.h new file mode 100644 index 000000000..afe80b960 --- /dev/null +++ b/src/tr2/game/objects/creatures/worker.h @@ -0,0 +1,7 @@ +#pragma once + +void Worker1_Setup(void); +void Worker2_Setup(void); +void Worker3_Setup(void); +void Worker4_Setup(void); +void Worker5_Setup(void); diff --git a/src/tr2/game/objects/creatures/xian_knight.c b/src/tr2/game/objects/creatures/xian_knight.c new file mode 100644 index 000000000..9fdebc018 --- /dev/null +++ b/src/tr2/game/objects/creatures/xian_knight.c @@ -0,0 +1,40 @@ +#include "game/objects/creatures/xian_knight.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#include + +#define XIAN_KNIGHT_HITPOINTS 80 +#define XIAN_KNIGHT_RADIUS (WALL_L / 5) // = 204 + +void XianKnight_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_XIAN_KNIGHT]; + if (!obj->loaded) { + return; + } + + assert(g_Objects[O_XIAN_KNIGHT_STATUE].loaded); + + obj->initialise = XianKnight_Initialise; + obj->draw_routine = XianKnight_Draw; + obj->control = XianKnight_Control; + obj->collision = Creature_Collision; + + obj->hit_points = XIAN_KNIGHT_HITPOINTS; + obj->radius = XIAN_KNIGHT_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; +} diff --git a/src/tr2/game/objects/creatures/xian_knight.h b/src/tr2/game/objects/creatures/xian_knight.h new file mode 100644 index 000000000..8e2737070 --- /dev/null +++ b/src/tr2/game/objects/creatures/xian_knight.h @@ -0,0 +1,3 @@ +#pragma once + +void XianKnight_Setup(void); diff --git a/src/tr2/game/objects/creatures/xian_spearman.c b/src/tr2/game/objects/creatures/xian_spearman.c new file mode 100644 index 000000000..028093af3 --- /dev/null +++ b/src/tr2/game/objects/creatures/xian_spearman.c @@ -0,0 +1,39 @@ +#include "game/objects/creatures/xian_spearman.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#include + +#define XIAN_SPEARMAN_HITPOINTS 100 +#define XIAN_SPEARMAN_RADIUS (WALL_L / 5) // = 204 + +void XianSpearman_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_XIAN_SPEARMAN]; + if (!obj->loaded) { + return; + } + + assert(g_Objects[O_XIAN_SPEARMAN_STATUE].loaded); + obj->initialise = XianKnight_Initialise; + obj->draw_routine = XianKnight_Draw; + obj->control = XianSpearman_Control; + obj->collision = Creature_Collision; + + obj->hit_points = XIAN_SPEARMAN_HITPOINTS; + obj->radius = XIAN_SPEARMAN_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 0; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; +} diff --git a/src/tr2/game/objects/creatures/xian_spearman.h b/src/tr2/game/objects/creatures/xian_spearman.h new file mode 100644 index 000000000..b0a257eba --- /dev/null +++ b/src/tr2/game/objects/creatures/xian_spearman.h @@ -0,0 +1,3 @@ +#pragma once + +void XianSpearman_Setup(void); diff --git a/src/tr2/game/objects/creatures/yeti.c b/src/tr2/game/objects/creatures/yeti.c new file mode 100644 index 000000000..6a28caa92 --- /dev/null +++ b/src/tr2/game/objects/creatures/yeti.c @@ -0,0 +1,34 @@ +#include "game/objects/creatures/yeti.h" + +#include "game/creature.h" +#include "game/objects/common.h" +#include "global/const.h" +#include "global/funcs.h" +#include "global/vars.h" + +#define YETI_HITPOINTS 30 +#define YETI_RADIUS (WALL_L / 8) // = 128 + +void Yeti_Setup(void) +{ + OBJECT *const obj = &g_Objects[O_YETI]; + if (!obj->loaded) { + return; + } + + obj->control = Yeti_Control; + obj->collision = Creature_Collision; + + obj->hit_points = YETI_HITPOINTS; + obj->radius = YETI_RADIUS; + obj->shadow_size = UNIT_SHADOW / 2; + obj->pivot_length = 100; + + obj->intelligent = 1; + obj->save_anim = 1; + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + + g_AnimBones[obj->bone_idx + 24] |= BF_ROT_Y; +} diff --git a/src/tr2/game/objects/creatures/yeti.h b/src/tr2/game/objects/creatures/yeti.h new file mode 100644 index 000000000..4d2e5334d --- /dev/null +++ b/src/tr2/game/objects/creatures/yeti.h @@ -0,0 +1,3 @@ +#pragma once + +void Yeti_Setup(void); diff --git a/src/tr2/game/objects/setup.c b/src/tr2/game/objects/setup.c index f88280404..16cda60ea 100644 --- a/src/tr2/game/objects/setup.c +++ b/src/tr2/game/objects/setup.c @@ -1,11 +1,108 @@ #include "game/objects/setup.h" +#include "game/lara/control.h" #include "game/objects/common.h" +#include "game/objects/creatures/bandit.h" +#include "game/objects/creatures/barracuda.h" +#include "game/objects/creatures/bartoli.h" +#include "game/objects/creatures/big_eel.h" +#include "game/objects/creatures/big_spider.h" +#include "game/objects/creatures/bird.h" +#include "game/objects/creatures/cultist.h" +#include "game/objects/creatures/diver.h" +#include "game/objects/creatures/dog.h" +#include "game/objects/creatures/dragon.h" +#include "game/objects/creatures/eel.h" +#include "game/objects/creatures/giant_yeti.h" +#include "game/objects/creatures/jelly.h" +#include "game/objects/creatures/monk.h" +#include "game/objects/creatures/mouse.h" +#include "game/objects/creatures/shark.h" +#include "game/objects/creatures/skidoo_driver.h" +#include "game/objects/creatures/spider.h" +#include "game/objects/creatures/tiger.h" +#include "game/objects/creatures/trex.h" +#include "game/objects/creatures/winston.h" +#include "game/objects/creatures/worker.h" +#include "game/objects/creatures/xian_knight.h" +#include "game/objects/creatures/xian_spearman.h" +#include "game/objects/creatures/yeti.h" #include "global/funcs.h" #include "global/types.h" +#include "global/vars.h" #define DEFAULT_RADIUS 10 +static void M_SetupLara(void); +static void M_SetupLaraExtra(void); + +static void M_SetupLara(void) +{ + OBJECT *const obj = &g_Objects[O_LARA]; + obj->initialise = Lara_InitialiseLoad; + + obj->shadow_size = (UNIT_SHADOW / 16) * 10; + obj->hit_points = LARA_MAX_HITPOINTS; + obj->draw_routine = Object_DrawDummyItem; + + obj->save_position = 1; + obj->save_hitpoints = 1; + obj->save_flags = 1; + obj->save_anim = 1; +} + +static void M_SetupLaraExtra(void) +{ + OBJECT *const obj = &g_Objects[O_LARA_EXTRA]; + obj->control = Lara_ControlExtra; +} + +void __cdecl Object_SetupBaddyObjects(void) +{ + M_SetupLara(); + M_SetupLaraExtra(); + + Dog_Setup(); + Mouse_Setup(); + Cultist1_Setup(); + Cultist1A_Setup(); + Cultist1B_Setup(); + Cultist2_Setup(); + Cultist3_Setup(); + Shark_Setup(); + Tiger_Setup(); + Barracuda_Setup(); + Spider_Setup(); + BigSpider_Setup(); + Yeti_Setup(); + Jelly_Setup(); + Diver_Setup(); + Worker1_Setup(); + Worker2_Setup(); + Worker3_Setup(); + Worker4_Setup(); + Worker5_Setup(); + Monk1_Setup(); + Monk2_Setup(); + Bird_SetupEagle(); + Bird_SetupCrow(); + SkidooArmed_Setup(); + SkidooDriver_Setup(); + Bartoli_Setup(); + Dragon_SetupFront(); + Dragon_SetupBack(); + Bandit1_Setup(); + Bandit2_Setup(); + Bandit2B_Setup(); + BigEel_Setup(); + Eel_Setup(); + XianKnight_Setup(); + XianSpearman_Setup(); + GiantYeti_Setup(); + TRex_Setup(); + Winston_Setup(); +} + void __cdecl Object_SetupAllObjects(void) { for (int32_t i = 0; i < O_NUMBER_OF; i++) { diff --git a/src/tr2/game/objects/setup.h b/src/tr2/game/objects/setup.h index 2dc779453..f7363247c 100644 --- a/src/tr2/game/objects/setup.h +++ b/src/tr2/game/objects/setup.h @@ -1,3 +1,4 @@ #pragma once void __cdecl Object_SetupAllObjects(void); +void __cdecl Object_SetupBaddyObjects(void); diff --git a/src/tr2/global/const.h b/src/tr2/global/const.h index 4ee20c9e8..2c7454058 100644 --- a/src/tr2/global/const.h +++ b/src/tr2/global/const.h @@ -227,3 +227,5 @@ #define LOW_LIGHT 5120 #define HIGH_LIGHT 4096 + +#define UNIT_SHADOW 256 diff --git a/src/tr2/global/funcs.h b/src/tr2/global/funcs.h index 751deb1fa..48d9a6e32 100644 --- a/src/tr2/global/funcs.h +++ b/src/tr2/global/funcs.h @@ -10,14 +10,14 @@ #define Diver_GetWaterSurface ((int32_t __cdecl (*)(int32_t x, int32_t y, int32_t z, int16_t room_num))0x00416CA0) #define Dog_Control ((void __cdecl (*)(int16_t item_num))0x00417160) #define Tiger_Control ((void __cdecl (*)(int16_t item_num))0x00417510) -#define DinoControl ((void __cdecl (*)(int16_t item_num))0x004186A0) +#define TRex_Control ((void __cdecl (*)(int16_t item_num))0x004186A0) #define Object_DrawSpriteItem ((void __cdecl (*)(const ITEM *item))0x004199E0) #define Object_DrawAnimatingItem ((void __cdecl (*)(const ITEM *item))0x00419A70) #define Gun_DrawFlash ((void __cdecl (*)(LARA_GUN_TYPE weapon_type, int32_t clip))0x0041BD30) #define Output_CalculateObjectLighting ((void __cdecl (*)(const ITEM *item, const FRAME_INFO *frame))0x0041BEA0) #define AddDynamicLight ((void __cdecl (*)(int32_t x, int32_t y, int32_t z, int32_t intensity, int32_t falloff))0x0041C0F0) -#define BigEelControl ((void __cdecl (*)(int16_t item_num))0x0041C140) -#define EelControl ((void __cdecl (*)(int16_t item_num))0x0041C2E0) +#define BigEel_Control ((void __cdecl (*)(int16_t item_num))0x0041C140) +#define Eel_Control ((void __cdecl (*)(int16_t item_num))0x0041C2E0) #define DoBloodSplat ((int16_t __cdecl (*)(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE direction, int16_t room_num))0x0041C5D0) #define DoLotsOfBlood ((void __cdecl (*)(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE direction, int16_t room_num, int32_t num))0x0041C630) #define ControlBlood1 ((void __cdecl (*)(int16_t fx_num))0x0041C6E0) @@ -72,15 +72,15 @@ #define AssaultReset ((void __cdecl (*)(ITEM *item))0x0041DA70) #define AssaultFinished ((void __cdecl (*)(ITEM *item))0x0041DA90) #define Knife ((int16_t __cdecl (*)(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num))0x0041DB50) -#define Cult2Control ((void __cdecl (*)(int16_t item_num))0x0041DBD0) -#define MonkControl ((void __cdecl (*)(int16_t item_num))0x0041E000) -#define Worker3Control ((void __cdecl (*)(int16_t item_num))0x0041E4D0) -#define DrawXianLord ((void __cdecl (*)(ITEM *item))0x0041EAE0) +#define Cultist2_Control ((void __cdecl (*)(int16_t item_num))0x0041DBD0) +#define Monk_Control ((void __cdecl (*)(int16_t item_num))0x0041E000) +#define Worker3_Control ((void __cdecl (*)(int16_t item_num))0x0041E4D0) +#define XianKnight_Draw ((void __cdecl (*)(const ITEM *item))0x0041EAE0) #define XianDamage ((void __cdecl (*)(ITEM *item, CREATURE *xian, int32_t damage))0x0041EEE0) -#define InitialiseXianLord ((void __cdecl (*)(int16_t item_num))0x0041EF90) -#define XianLordControl ((void __cdecl (*)(int16_t item_num))0x0041EFF0) +#define XianKnight_Initialise ((void __cdecl (*)(int16_t item_num))0x0041EF90) +#define XianSpearman_Control ((void __cdecl (*)(int16_t item_num))0x0041EFF0) #define WarriorSparkleTrail ((void __cdecl (*)(ITEM *item))0x0041F5D0) -#define WarriorControl ((void __cdecl (*)(int16_t item_num))0x0041F670) +#define XianKnight_Control ((void __cdecl (*)(int16_t item_num))0x0041F670) #define InitialiseHair ((void __cdecl (*)(void))0x00420EA0) #define HairControl ((void __cdecl (*)(int32_t in_cutscene))0x00420F20) #define DrawHair ((void __cdecl (*)(void))0x00421920) @@ -106,8 +106,8 @@ #define TestBlockMovable ((int32_t __cdecl (*)(ITEM *item, int32_t block_height))0x00433CD0) #define TestBlockPush ((int32_t __cdecl (*)(ITEM *item, int32_t block_height, uint16_t quadrant))0x00433D20) #define TestBlockPull ((int32_t __cdecl (*)(ITEM *item, int32_t block_height, uint16_t quadrant))0x00433E70) -#define DrawMovableBlock ((void __cdecl (*)(ITEM *item))0x00434170) -#define DrawUnclippedItem ((void __cdecl (*)(ITEM *item))0x004341A0) +#define DrawMovableBlock ((void __cdecl (*)(const ITEM *item))0x00434170) +#define Object_DrawUnclippedItem ((void __cdecl (*)(const ITEM *item))0x004341A0) #define EarthQuake ((void __cdecl (*)(int16_t item_num))0x00434210) #define ControlCutShotgun ((void __cdecl (*)(int16_t item_num))0x004342F0) #define InitialiseFinalLevel ((void __cdecl (*)(void))0x00434330) @@ -150,17 +150,17 @@ #define GunHit ((int16_t __cdecl (*)(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num))0x00435F90) #define GunMiss ((int16_t __cdecl (*)(int32_t x, int32_t y, int32_t z, int16_t speed, PHD_ANGLE yrot, int16_t room_num))0x00436050) #define ShotLara ((int32_t __cdecl (*)(ITEM *item, AI_INFO *info, BITE *gun, int16_t extra_rotation, int32_t damage))0x00436100) -#define InitialiseCult1 ((void __cdecl (*)(int16_t item_num))0x004362D0) -#define Cult1Control ((void __cdecl (*)(int16_t item_num))0x00436320) -#define InitialiseCult3 ((void __cdecl (*)(int16_t item_num))0x00436750) -#define Cult3Control ((void __cdecl (*)(int16_t item_num))0x004367A0) -#define Worker1Control ((void __cdecl (*)(int16_t item_num))0x00436D10) -#define Worker2Control ((void __cdecl (*)(int16_t item_num))0x00437110) -#define BanditControl ((void __cdecl (*)(int16_t item_num))0x00437570) -#define Bandit2Control ((void __cdecl (*)(int16_t item_num))0x004378B0) -#define WinstonControl ((void __cdecl (*)(int16_t item_num))0x00437CF0) +#define Cultist1_Initialise ((void __cdecl (*)(int16_t item_num))0x004362D0) +#define Cultist1_Control ((void __cdecl (*)(int16_t item_num))0x00436320) +#define Cultist3_Initialise ((void __cdecl (*)(int16_t item_num))0x00436750) +#define Cultist3_Control ((void __cdecl (*)(int16_t item_num))0x004367A0) +#define Worker1_Control ((void __cdecl (*)(int16_t item_num))0x00436D10) +#define Worker2_Control ((void __cdecl (*)(int16_t item_num))0x00437110) +#define Bandit1_Control ((void __cdecl (*)(int16_t item_num))0x00437570) +#define Bandit2_Control ((void __cdecl (*)(int16_t item_num))0x004378B0) +#define Winston_Control ((void __cdecl (*)(int16_t item_num))0x00437CF0) #define SecretControl ((void __cdecl (*)(int16_t item_num))0x00438EC0) -#define MouseControl ((void __cdecl (*)(int16_t item_num))0x00438EF0) +#define Mouse_Control ((void __cdecl (*)(int16_t item_num))0x00438EF0) #define InitialiseStartInfo ((void __cdecl (*)(void))0x004390E0) #define ModifyStartInfo ((void __cdecl (*)(int32_t level_num))0x00439150) #define CreateStartInfo ((void __cdecl (*)(int32_t level_num))0x00439230) @@ -171,13 +171,12 @@ #define ReadSG ((void __cdecl (*)(void *pointer, int32_t size))0x0043A240) #define InitialiseGameFlags ((void __cdecl (*)(void))0x0043A3E0) #define InitialiseLevelFlags ((void __cdecl (*)(void))0x0043A450) -#define Object_SetupBaddyObjects ((void __cdecl (*)(void))0x0043A480) #define Object_SetupTrapObjects ((void __cdecl (*)(void))0x0043B4C0) #define Object_SetupGeneralObjects ((void __cdecl (*)(void))0x0043BAC0) #define GetCarriedItems ((void __cdecl (*)(void))0x0043C780) -#define JellyControl ((void __cdecl (*)(int16_t item_num))0x0043C850) -#define BaracuddaControl ((void __cdecl (*)(int16_t item_num))0x0043C970) -#define SharkControl ((void __cdecl (*)(int16_t item_num))0x0043CBA0) +#define Jelly_Control ((void __cdecl (*)(int16_t item_num))0x0043C850) +#define Baracudda_Control ((void __cdecl (*)(int16_t item_num))0x0043C970) +#define Shark_Control ((void __cdecl (*)(int16_t item_num))0x0043CBA0) #define InitialiseSkidoo ((void __cdecl (*)(int16_t item_num))0x0043CE30) #define SkidooCheckGeton ((int32_t __cdecl (*)(int16_t item_num, COLL_INFO *coll))0x0043CE70) #define SkidooCollision ((void __cdecl (*)(int16_t item_num, ITEM *litem, COLL_INFO *coll))0x0043CF60) @@ -195,19 +194,19 @@ #define SkidooCheckGetOff ((int32_t __cdecl (*)(void))0x0043E2A0) #define SkidooGuns ((void __cdecl (*)(void))0x0043E4E0) #define SkidooControl ((int32_t __cdecl (*)(void))0x0043E600) -#define DrawSkidoo ((void __cdecl (*)(ITEM *item))0x0043EA60) -#define InitialiseSkidman ((void __cdecl (*)(int16_t item_num))0x0043ED40) -#define SkidManControl ((void __cdecl (*)(int16_t rider_num))0x0043EDD0) +#define SkidooArmed_Draw ((void __cdecl (*)(const ITEM *item))0x0043EA60) +#define SkidooDriver_Initialise ((void __cdecl (*)(int16_t item_num))0x0043ED40) +#define SkidooDriver_Control ((void __cdecl (*)(int16_t rider_num))0x0043EDD0) #define SkidmanPush ((void __cdecl (*)(ITEM *item, ITEM *lara_item, int32_t radius))0x0043F1D0) -#define SkidmanCollision ((void __cdecl (*)(int16_t item_num, ITEM *lara_item, COLL_INFO *coll))0x0043F2F0) +#define SkidooDriver_Collision ((void __cdecl (*)(int16_t item_num, ITEM *lara_item, COLL_INFO *coll))0x0043F2F0) #define Music_GetRealTrack ((int32_t __cdecl (*)(int32_t track))0x0043F380) #define Collide_TestCollision ((int32_t __cdecl (*)(ITEM *item, const ITEM *lara_item))0x0043F9B0) #define Collide_GetSpheres ((int32_t __cdecl (*)(const ITEM *item, SPHERE *spheres, bool world_space))0x0043FAE0) #define Collide_GetJointAbsPosition ((void __cdecl (*)(const ITEM *item, const XYZ_32 *vec, int32_t joint))0x0043FDC0) #define BaddieBiteEffect ((void __cdecl (*)(ITEM *item, BITE *bite))0x0043FF60) -#define SpiderLeap ((void __cdecl (*)(int16_t item_num, int16_t angle))0x0043FFC0) -#define SpiderControl ((void __cdecl (*)(int16_t item_num))0x00440070) -#define BigSpiderControl ((void __cdecl (*)(int16_t item_num))0x00440290) +#define Spider_Leap ((void __cdecl (*)(int16_t item_num, int16_t angle))0x0043FFC0) +#define Spider_Control ((void __cdecl (*)(int16_t item_num))0x00440070) +#define BigSpider_Control ((void __cdecl (*)(int16_t item_num))0x00440290) #define MineControl ((void __cdecl (*)(int16_t mine_num))0x00440F10) #define ControlSpikeWall ((void __cdecl (*)(int16_t item_num))0x00441110) #define ControlCeilingSpikes ((void __cdecl (*)(int16_t item_num))0x00441250) @@ -237,8 +236,8 @@ #define DartEmitterControl ((void __cdecl (*)(int16_t item_num))0x00442840) #define DartsControl ((void __cdecl (*)(int16_t item_num))0x00442980) #define DartEffectControl ((void __cdecl (*)(int16_t fx_num))0x00442AE0) -#define GiantYetiControl ((void __cdecl (*)(int16_t item_num))0x00443050) -#define YetiControl ((void __cdecl (*)(int16_t item_num))0x00443350) +#define GiantYeti_Control ((void __cdecl (*)(int16_t item_num))0x00443050) +#define Yeti_Control ((void __cdecl (*)(int16_t item_num))0x00443350) #define WinInReadJoystick ((DWORD __cdecl (*)(int32_t *x, int32_t *y))0x004472A0) #define WinInputInit ((bool __cdecl (*)(void))0x004473B0) #define DInputEnumDevices ((bool __cdecl (*)(JOYSTICK_LIST *joystickList))0x00447430) diff --git a/src/tr2/inject_exec.c b/src/tr2/inject_exec.c index 9907994f7..92c234d46 100644 --- a/src/tr2/inject_exec.c +++ b/src/tr2/inject_exec.c @@ -981,6 +981,7 @@ static void M_Objects(const bool enable) INJECT(enable, 0x00438D80, Switch_Trigger); INJECT(enable, 0x00438E40, Keyhole_Trigger); INJECT(enable, 0x00438E80, Pickup_Trigger); + INJECT(enable, 0x0043A480, Object_SetupBaddyObjects); INJECT(enable, 0x0043C710, Object_SetupAllObjects); INJECT(enable, 0x00442B30, FlameEmitter_Control); INJECT(enable, 0x00442BC0, Flame_Control); diff --git a/src/tr2/meson.build b/src/tr2/meson.build index 1fd2578ef..56cae88cd 100644 --- a/src/tr2/meson.build +++ b/src/tr2/meson.build @@ -133,6 +133,27 @@ dll_sources = [ 'game/music/music_main.c', 'game/objects/common.c', 'game/objects/creatures/bartoli.c', + 'game/objects/creatures/dog.c', + 'game/objects/creatures/yeti.c', + 'game/objects/creatures/bandit.c', + 'game/objects/creatures/winston.c', + 'game/objects/creatures/spider.c', + 'game/objects/creatures/tiger.c', + 'game/objects/creatures/xian_knight.c', + 'game/objects/creatures/xian_spearman.c', + 'game/objects/creatures/eel.c', + 'game/objects/creatures/big_eel.c', + 'game/objects/creatures/giant_yeti.c', + 'game/objects/creatures/worker.c', + 'game/objects/creatures/monk.c', + 'game/objects/creatures/shark.c', + 'game/objects/creatures/jelly.c', + 'game/objects/creatures/skidoo_driver.c', + 'game/objects/creatures/trex.c', + 'game/objects/creatures/barracuda.c', + 'game/objects/creatures/mouse.c', + 'game/objects/creatures/cultist.c', + 'game/objects/creatures/big_spider.c', 'game/objects/creatures/bird.c', 'game/objects/creatures/diver.c', 'game/objects/creatures/dragon.c',