Moderator
M
Moderator
18:12, 7th Jan 2013
Magtheridon96: Approved.
vJASS version
GUI version
Magtheridon96: Approved.
vJASS version
GUI version
CSS Config

Events


Map initialization

Conditions

Actions


-------- Set how frequently the shake loop will run --------


Set CSS_LoopPeriod = 0.10


-------- How much shake magnitude is lost each loop --------


Set CSS_MagnitudeReduceFlat = 0.50


-------- What percentage of shake magnitude is lost every loop --------


Set CSS_MagnitudeReducePercent = 0.05


-------- How low the shakiness must be to be considered stopped --------


Set CSS_StopShakeThreshold = 0.50


-------- -------------------------------------------------------------------------------------------- --------


Trigger - Add to CSS Loop Shake <gen> the event (Time - Every CSS_LoopPeriod seconds of game time)
CSS New Event

Events

Conditions

Actions


Player Group - Pick every player in (All players) and do (Actions)



Loop - Actions




Set tempPlayer = (Picked player)




Set tempId = (Player number of tempPlayer)




-------- Get enum player's camera location --------




Custom script: if GetLocalPlayer() == udg_tempPlayer then




Set tempX = (Target X of current camera view)




Set tempY = (Target Y of current camera view)




Custom script: endif




Set CSS_PlayerCameraLocation = (Point(tempX, tempY))




-------- Check if it is in range of point --------




Set tempDistance = (Distance between CSS_EventLocation and CSS_PlayerCameraLocation)




If (All Conditions are True) then do (Then Actions) else do (Else Actions)





If - Conditions






tempDistance Less than or equal to CSS_EventMaxRange





Then - Actions






Set CSS_AddedShakiness = (CSS_EventMagnitude x ((CSS_EventMaxRange - tempDistance) / (CSS_EventMaxRange + tempDistance)))






Set CSS_PlayerCurrentShake[tempId] = (CSS_PlayerCurrentShake[tempId] + CSS_AddedShakiness)






If (All Conditions are True) then do (Then Actions) else do (Else Actions)







If - Conditions








(tempPlayer is in CSS_ShakingPlayers) Equal to False







Then - Actions








Player Group - Add tempPlayer to CSS_ShakingPlayers







Else - Actions





Else - Actions




Custom script: call RemoveLocation(udg_CSS_PlayerCameraLocation)


Custom script: call RemoveLocation(udg_CSS_EventLocation)
CSS New Player Shake

Events

Conditions

Actions


Set CSS_tempId = (Player number of CSS_EventPlayer)


Set CSS_PlayerCurrentShake[CSS_tempId] = (CSS_PlayerCurrentShake[CSS_tempId] + CSS_EventMagnitude)


If (All Conditions are True) then do (Then Actions) else do (Else Actions)



If - Conditions




(CSS_EventPlayer is in CSS_ShakingPlayers) Equal to False



Then - Actions




Player Group - Add CSS_EventPlayer to CSS_ShakingPlayers



Else - Actions
CSS Loop Shake

Events

Conditions

Actions


Player Group - Pick every player in CSS_ShakingPlayers and do (Actions)



Loop - Actions




Set tempPlayer = (Picked player)




Set tempId = (Player number of tempPlayer)




Camera - Shake the camera for tempPlayer with magnitude CSS_PlayerCurrentShake[tempId]




Set CSS_PlayerCurrentShake[tempId] = (CSS_PlayerCurrentShake[tempId] - (CSS_PlayerCurrentShake[tempId] x CSS_MagnitudeReducePercent))




Set CSS_PlayerCurrentShake[tempId] = (CSS_PlayerCurrentShake[tempId] - CSS_MagnitudeReduceFlat)




If (All Conditions are True) then do (Then Actions) else do (Else Actions)





If - Conditions






CSS_PlayerCurrentShake[tempId] Less than CSS_StopShakeThreshold





Then - Actions






Camera - Stop swaying/shaking the camera for tempPlayer






Player Group - Remove tempPlayer from CSS_ShakingPlayers





Else - Actions
Set CSS_EventLocation = (Position of (Triggering unit))
Set CSS_EventMagnitude = 15.00
Set CSS_EventMaxRange = 1000.00
Trigger - Run CSS New Event <gen> (ignoring conditions)
library RCSS initializer Init
//-------------------------------------------------------------------
//---- Camera Shake System ----
//by rulerofiron99
//
// Functions:
// RCSS_NewEventLoc takes real TargetX, real TargetY, real Magnitude, real MaxRange
// TargetX/Y location of origin of shake
// Magnitude the magnitude of the camera shake at origin point
// MaxRange the maximum range at which players are added
//
// RCSS_NewEventPlayer takes player TargetPlayer, real Magnitude
// TargetPlayer the player to be shaken, not stirred
// Magnitude the amount of camera shake to be added to the player
//
// Configurables:
// LOOP_PERIOD the time between loops - how often the loop will run
// SHAKE_REDUCE_FLAT flat shake magnitude lost per loop
// SHAKE_REDUCE_PERCENT percent of current shake magnitude lost per loop
// SHAKE_THRESHOLD when shakiness goes below the threshold, it stops completely
// RICHTER_MAX the maximum magnitude of the shaking
// RICHTER_MIN the minimum magnitude of the shaking
// Note: The shake variable still goes above,
// and is then just to determine duration.
//-------------------------------------------------------------------
globals
//---- Camera Shake System ----
//Configurables
private constant real LOOP_PERIOD = 0.10
private constant real SHAKE_REDUCE_FLAT = 0.50
private constant real SHAKE_REDUCE_PERCENT = 0.05
private constant real SHAKE_THRESHOLD = 0.50
private constant real RICHTER_MAX = 5.0
private constant real RICHTER_MIN = 2.0
//System Variables
private force shakingPlayers = CreateForce()
private real array playerCurrentShake
private real eventShake
private real eventRange
private real eventX
private real eventY
endglobals
//Loop through players for camera shake
private function LoopPerPlayer takes nothing returns nothing
local player p = GetEnumPlayer()
local integer i = GetPlayerId(p)
local real richter = playerCurrentShake[i]
local real temprichter
if (richter > RICHTER_MAX) then
set richter = RICHTER_MAX
endif
if (richter < RICHTER_MIN) then
set richter = RICHTER_MIN
endif
if (GetLocalPlayer() == p) then
set temprichter = playerCurrentShake[i] * Pow(10, richter)
call CameraSetTargetNoiseEx(playerCurrentShake[i] * 2.0, temprichter, true)
call CameraSetSourceNoiseEx(playerCurrentShake[i] * 2.0, temprichter, true)
endif
set playerCurrentShake[i] = ( playerCurrentShake[i] - ( playerCurrentShake[i] * SHAKE_REDUCE_PERCENT ) )
set playerCurrentShake[i] = ( playerCurrentShake[i] - SHAKE_REDUCE_FLAT )
if ( playerCurrentShake[i] < SHAKE_THRESHOLD ) then
if (GetLocalPlayer() == p) then
call CameraSetSourceNoise(0, 0)
call CameraSetTargetNoise(0, 0)
endif
call ForceRemovePlayer(shakingPlayers, p)
endif
set p = null
endfunction
//Loop through players for location event
private function NewEventLocPerPlayer takes nothing returns nothing
local player p = GetEnumPlayer()
local integer i = GetPlayerId(p)
local real x
local real y
local real dist
if GetLocalPlayer() == p then // Get enum player's camera location
set x = GetCameraTargetPositionX()
set y = GetCameraTargetPositionY()
endif
set dist = (x - eventX)*(x - eventX) + (y - eventY)*(y - eventY)
if (dist <= eventRange*eventRange) then // Check if it is in range of point
set playerCurrentShake[i] = ( playerCurrentShake[i] + ( eventShake * ( ( eventRange - dist ) / ( eventRange + dist ) ) ) ) //add shakiness
if not (IsPlayerInForce(p, shakingPlayers)) then
call ForceAddPlayer(shakingPlayers, p) //add player to shaking group
endif
endif
set p = null
endfunction
//Register new location shake event
public function NewEventLoc takes real x, real y, real m, real r returns nothing
set eventX = x
set eventY = y
set eventShake = m
set eventRange = r
call ForForce( bj_FORCE_ALL_PLAYERS, function NewEventLocPerPlayer )
endfunction
//Register new player shake event
public function NewEventPlayer takes player p, real m returns nothing
local integer i = GetPlayerId(p)
set playerCurrentShake[i] = (playerCurrentShake[i] + m)
if not (IsPlayerInForce(p, shakingPlayers)) then
call ForceAddPlayer(shakingPlayers, p)
endif
endfunction
//Main loop for camera shaking
private function Loop takes nothing returns nothing
call ForForce(shakingPlayers, function LoopPerPlayer)
endfunction
private function Init takes nothing returns nothing
call TimerStart(CreateTimer(), LOOP_PERIOD, true, function Loop)
endfunction
endlibrary