Difference between revisions of "Script - Corridor Mode"
From FreeSpace Wiki
(added the script here too) |
(fix) |
||
| Line 77: | Line 77: | ||
---Get players 'nose vector' | ---Get players 'nose vector' | ||
vectorPointer = orientationCurrent:unrotateVector(vectorFrontDirection) | vectorPointer = orientationCurrent:unrotateVector(vectorFrontDirection) | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
--Set chase camera position according to the ships position | --Set chase camera position according to the ships position | ||
| Line 136: | Line 127: | ||
if objectPlayer.Position["x"] > floatHLimit then | if objectPlayer.Position["x"] > floatHLimit then | ||
vectorPlayerVelocity["x"] = vectorPlayerVelocity["x"] - (vectorCurrentPos["x"] - floatHLimit) | vectorPlayerVelocity["x"] = vectorPlayerVelocity["x"] - (vectorCurrentPos["x"] - floatHLimit) | ||
| + | vectorPointer["x"] = vectorPointer["x"] + (vectorCurrentPos["x"] - floatHLimit) | ||
elseif vectorCurrentPos["x"] < (-1 * floatHLimit) then | elseif vectorCurrentPos["x"] < (-1 * floatHLimit) then | ||
vectorPlayerVelocity["x"] = vectorPlayerVelocity["x"] - (vectorCurrentPos["x"] + floatHLimit) | vectorPlayerVelocity["x"] = vectorPlayerVelocity["x"] - (vectorCurrentPos["x"] + floatHLimit) | ||
| + | vectorPointer["x"] = vectorPointer["x"] + (vectorCurrentPos["x"] + floatHLimit) | ||
end | end | ||
| Line 143: | Line 136: | ||
if objectPlayer.Position["y"] > floatVLimit then | if objectPlayer.Position["y"] > floatVLimit then | ||
vectorPlayerVelocity["y"] = vectorPlayerVelocity["y"] - (vectorCurrentPos["y"] - floatVLimit) | vectorPlayerVelocity["y"] = vectorPlayerVelocity["y"] - (vectorCurrentPos["y"] - floatVLimit) | ||
| + | vectorPointer["y"] = vectorPointer["y"] + (vectorCurrentPos["y"] - floatVLimit) | ||
elseif vectorCurrentPos["y"] < (-1 * floatVLimit) then | elseif vectorCurrentPos["y"] < (-1 * floatVLimit) then | ||
vectorPlayerVelocity["y"] = vectorPlayerVelocity["y"] - (vectorCurrentPos["y"] + floatVLimit) | vectorPlayerVelocity["y"] = vectorPlayerVelocity["y"] - (vectorCurrentPos["y"] + floatVLimit) | ||
| + | vectorPointer["y"] = vectorPointer["y"] + (vectorCurrentPos["y"] + floatVLimit) | ||
end | end | ||
| + | |||
| + | ---Set 3D aiming aid positions | ||
| + | vectorNewTargetPos = vectorCurrentPos + vectorPointer/(1/1.25) | ||
| + | objectAimingAid1.Position = vectorNewTargetPos | ||
| + | vectorNewTargetPos = vectorCurrentPos + vectorPointer/(1/2.5) | ||
| + | objectAimingAid2.Position = vectorNewTargetPos | ||
| + | vectorNewTargetPos = vectorCurrentPos + vectorPointer/(1/5) | ||
| + | objectAimingAid3.Position = vectorNewTargetPos | ||
--Update Player Rotational Velocity, Position and Orientation | --Update Player Rotational Velocity, Position and Orientation | ||
Revision as of 06:40, 6 October 2007
Function
Uses modular version of the scripting.tbl, xxx-sct.tbm. Script enables a simple tube flying mode for the game.
Table Entry
tube-sct.tbm
#Conditional Hooks
$State: GS_STATE_GAME_PLAY
$On Frame:
[
floatMissionTime = mn.getMissionTime()
if floatMissionTime ~= nil then
if booleanCorridorInit == nil and floatMissionTime < 0.5 then
--Setup all the needed values
booleanCorridorInit = "true"
---Create 'blank' orientation
orientationBlank = mn.Ships[1].Orientation
orientationBlank["p"] = 0
orientationBlank["b"] = 0
orientationBlank["h"] = 0
---Set the initial camera position and orientation
vectorCCameraPos = ba.createVector(0,15,-75)
orientationCCamera = orientationBlank
---Create chase camera
objectCCamera = ts.createCamera("Chase Camera",vectorCCameraPos, orientationCCamera)
---Use the new chase camera
ts.setCamera(objectCCamera)
---Create front vector
vectorFrontDirection = ba.createVector(0,0,100)
---
objectAimingAid1 = mn.Ships["AimingAid I"]
objectAimingAid2 = mn.Ships["AimingAid II"]
objectAimingAid3 = mn.Ships["AimingAid III"]
---Set movement box limits
floatHLimit = 30
floatVLimit = 22.5
end
if floatMissionTime > 0.5 then
if booleanCorridorInit ~= nil then
booleanCorridorInit = nil
end
objectPlayer = hv.Player
if objectPlayer:isValid() then --Player Validity Check
--Make sure that we needed info
if orientationLast == nil then
orientationLast = objectPlayer.Orientation
end
--Get Position and Orientation and Speed
orientationCurrent = objectPlayer.Orientation
vectorCurrentPos = objectPlayer.Position
floatPlayerSpeed = objectPlayer.Physics:getSpeed()
vectorPlayerVelocity = objectPlayer.Physics.Velocity
--Set the 3D aiming aid system
---Get Aiming Aids
---Get players 'nose vector'
vectorPointer = orientationCurrent:unrotateVector(vectorFrontDirection)
--Set chase camera position according to the ships position
vectorCCameraPos["y"] = vectorCCameraPos["y"] - ((vectorCCameraPos["y"] -15) - vectorCurrentPos["y"]) / 150
vectorCCameraPos["x"] = vectorCCameraPos["x"] - (vectorCCameraPos["x"] - vectorCurrentPos["x"]) / 150
vectorCCameraPos["z"] = vectorCurrentPos["z"] - 50 - 0.2 * floatPlayerSpeed
--Set chase camera orientation according to ship position
---Create vector components
floatCCameraOriVec_y = -((vectorCCameraPos["y"] - 15) - vectorCurrentPos["y"])/3
floatCCameraOriVec_x = -(vectorCCameraPos["x"] - vectorCurrentPos["x"])/3
floatCCameraOriVec_z = 50 + 0.2 * floatPlayerSpeed
---Create vector from the vector components
vectorCCameraNewOri = ba.createVector(floatCCameraOriVec_x,floatCCameraOriVec_y,floatCCameraOriVec_z)
---Create orientation object from the vector object
orientationCCameraNew = vectorCCameraNewOri:getOrientation()
--Update chase camera position and orientation
objectCCamera:setPosition(vectorCCameraPos)
objectCCamera:setOrientation(orientationCCameraNew)
--Get current rotational velocity data
vectorRealRotVel = objectPlayer.Physics.RotationalVelocity
--Set limit for turning for horizontal axis
if math.pow(orientationCurrent["h"],2) > math.pow(orientationLast["h"],2) then
vectorRealRotVel[2] = vectorRealRotVel[2] - 1*(orientationCurrent["h"])/3
else
vectorRealRotVel[2] = vectorRealRotVel[2] - 1*(orientationCurrent["h"])/5
end
--Set limit for turning for vertical axis
if math.pow(orientationCurrent["p"],2) > math.pow(orientationLast["p"],2) then
vectorRealRotVel[1] = vectorRealRotVel[1] - 1*(orientationCurrent["p"])/3
else
vectorRealRotVel[1] = vectorRealRotVel[1] - 1*(orientationCurrent["p"])/5
end
--Prevent rolling
floatCurrentRoll = orientationCurrent["b"]
if floatCurrentRoll ~= 0 then
vectorRealRotVel[3] = -2*floatCurrentRoll/2
end
--Horizontal Position Limit
if objectPlayer.Position["x"] > floatHLimit then
vectorPlayerVelocity["x"] = vectorPlayerVelocity["x"] - (vectorCurrentPos["x"] - floatHLimit)
vectorPointer["x"] = vectorPointer["x"] + (vectorCurrentPos["x"] - floatHLimit)
elseif vectorCurrentPos["x"] < (-1 * floatHLimit) then
vectorPlayerVelocity["x"] = vectorPlayerVelocity["x"] - (vectorCurrentPos["x"] + floatHLimit)
vectorPointer["x"] = vectorPointer["x"] + (vectorCurrentPos["x"] + floatHLimit)
end
--Vertical Position Limit
if objectPlayer.Position["y"] > floatVLimit then
vectorPlayerVelocity["y"] = vectorPlayerVelocity["y"] - (vectorCurrentPos["y"] - floatVLimit)
vectorPointer["y"] = vectorPointer["y"] + (vectorCurrentPos["y"] - floatVLimit)
elseif vectorCurrentPos["y"] < (-1 * floatVLimit) then
vectorPlayerVelocity["y"] = vectorPlayerVelocity["y"] - (vectorCurrentPos["y"] + floatVLimit)
vectorPointer["y"] = vectorPointer["y"] + (vectorCurrentPos["y"] + floatVLimit)
end
---Set 3D aiming aid positions
vectorNewTargetPos = vectorCurrentPos + vectorPointer/(1/1.25)
objectAimingAid1.Position = vectorNewTargetPos
vectorNewTargetPos = vectorCurrentPos + vectorPointer/(1/2.5)
objectAimingAid2.Position = vectorNewTargetPos
vectorNewTargetPos = vectorCurrentPos + vectorPointer/(1/5)
objectAimingAid3.Position = vectorNewTargetPos
--Update Player Rotational Velocity, Position and Orientation
objectPlayer.Physics.RotationalVelocity = vectorRealRotVel
objectPlayer.Physics.Velocity = vectorPlayerVelocity
--Reference Orientation for next frame
orientationLast = objectPlayer.Orientation
--new section to remove excess enemy fighters and bombers
integerShips = #mn.Ships
--Get rid off excess enemies
for g=1,integerShips do
objectDisposableShip = mn.Ships[g]
--Check team and hitpoint status
stringDisposableShipTeam = objectDisposableShip.Team.Name
floatDisposableShipHitpoints = objectDisposableShip.HitpointsLeft
if stringDisposableShipTeam ~= "Friendly" and floatDisposableShipHitpoints > 0 then
--Only fighters & bombers
stringDisposableShipType = objectDisposableShip.Class.Type.Name
if stringDisposableShipType == "Fighter" or stringDisposableShipType == "Bomber" then
--Move ship only if it has flown past the player
vectorDisposableShipPosition = objectDisposableShip.Position
floatFrontDistance = vectorDisposableShipPosition["z"] - vectorCurrentPos["z"]
if floatFrontDistance < -100 then
vectorDispose = ba.createVector(0,0,-50000)
--Update the moved ships position and get rid off it
objectDisposableShip.Position = vectorDispose
objectDisposableShip.HitpointsLeft = 0
objectDisposableShip:kill(objectDisposableShip)
end
end
end
end
end --Player Validity Check
end
end
]
#End
Notes
Script avoids directly changing the position data of the player ship to avoid several potential physics problems. Handles 3D targeting controls should proper models be included to the mission. Script also removes all hostile fighters and bombers that have passed the player ship and kills them. Radar-set-max-range SEXP should be used to prevent the targeting of the disposed ships.