0136
- Description
- Shakes the in-game camera
- Syntax
- 0136: shake_camera [int] with_point [flt1] [flt2] [flt3]
- Parameter
- [int]
- Intensity and duration of the shaking
- [flt1]
- X-coordinate
- [flt2]
- Y-coordinate
- [flt3]
- Z-coordinate
This opcode shakes the in-game camera for a while. The higher the integer value is, the more and the longer the camera shakes. The shaking of the camera depends if the camera's location, not the player's location, is within 100 units of the specified coordinates point. The duration and intensity is independent of that point. Leaving or entering the area after the opcode is called does not change the behavior of the shaking. This opcode was never called in the original script of GTA III.
Example
The following example spawns a Trashmaster close to the player. If the Trashmaster's health is below 90%, it creates an explosion larger than a regular car explosion.
// set constants const CAR_MODEL = #TRASH CAR_HANDLE = 0@ X_POS = 1@ Y_POS = 2@ Z_POS = 3@ end // spawn vehicle 0247: request_model CAR_MODEL 038B: load_requested_models 0054: store_player $PLAYER_CHAR position_to X_POS Y_POS Z_POS X_POS += 4.0 00A5: CAR_HANDLE = create_car CAR_MODEL at X_POS Y_POS Z_POS 0249: release_model CAR_MODEL while 8119: not car CAR_HANDLE wrecked wait 10 if 8185: not car CAR_HANDLE health >= 900 then // generate larger car explosion 00AA: store_car CAR_HANDLE position_to X_POS Y_POS Z_POS 020C: create_explosion 5 at X_POS Y_POS Z_POS // EXPLOSION_HELI 0136: shake_camera 1600 with_point X_POS Y_POS Z_POS 020B: explode_car CAR_HANDLE end end 01C3: mark_car_as_no_longer_needed CAR_HANDLE
For Vice City
This opcode does not exist in Vice City but it is possible to recreate this opcode since camera shaking based on location is already featured in the game (like when cars explode). Vice City improved upon this feature in that the initial duration and intensity of the shaking is dependent on the camera's distance from the point. The following example is a stand-alone CLEO script for Vice City tested on US v1.0 and should work similarly to the example above.
{$CLEO .cs} // set constants const CAR_MODEL = #TRASH CAR_HANDLE = 0@ X_POS = 1@ Y_POS = 2@ Z_POS = 3@ end // spawn vehicle 0247: request_model CAR_MODEL 038B: load_requested_models 0054: store_player $PLAYER_CHAR position_to X_POS Y_POS Z_POS X_POS += 4.0 00A5: CAR_HANDLE = create_car CAR_MODEL at X_POS Y_POS Z_POS 0249: release_model CAR_MODEL while 8119: not car CAR_HANDLE wrecked wait 10 if 8185: not car CAR_HANDLE health >= 900 then // generate larger car explosion 00AA: store_car CAR_HANDLE position_to X_POS Y_POS Z_POS 020C: create_explosion 6 at X_POS Y_POS Z_POS // EXPLOSION_HELI 05F5: call_scm_func @opcode_0136 inputs 4 -- shake_camera 1600 with_point X_POS Y_POS Z_POS // 0136 substitute 020B: explode_car CAR_HANDLE end end 01C3: mark_car_as_no_longer_needed CAR_HANDLE 05DC: end_custom_thread :opcode_0136 // 0@ - input param (intensity/duration) // 1@ - input param (x-coordinate) // 2@ - input param (y-coordinate) // 3@ - input param (z-coordinate) 0093: 0@ = integer_to_float 0@ 0@ *= 0.001 05E3: call_method 0x46FF21 0x7E4688 num_params 4 pop 0 z 3@ y 2@ x 1@ intensity 0@ // CCamera::CamShake 05F6: ret 0
Disassembled code
This is disassembled code for this opcode from PC v1.0 US.
loc_43EDCA:
lea eax, [ebp+10h] ; get address of script's current instruction pointer
mov ecx, ebp ; get address of script for thiscall
push 4 ; push 4 for four parameters to collect
push eax ; push address of script's current instruction pointer
call CRunningScript::CollectParameters ; call CRunningScript::CollectParameters(uint *,short)
fild ds:ScriptParams[0] ; get value of first parameter, the intensity, and push onto floating-point stack
push ds:ScriptParams[3] ; push value of fourth parameter, the z-coordinate
push ds:ScriptParams[2] ; push value of third parameter, the y-coordinate
fmul flt_5EEDB4 ; multiply the intensity by 0.001
push ds:ScriptParams[1] ; push value of second parameter, the x-coordinate
push eax ; push to make space for the intensity
mov ecx, offset TheCamera ; get address of TheCamera for thiscall
fstp [esp] ; store the intensity and pop floating-point stack
call CCamera::CamShake ; call CCamera::CamShake(float,float,float,float)
xor al, al ; return 0
Keywords
shake, jostle, cam, camera, point
See also
- 0003, shake camera without point