Files
2025-09-29 00:52:08 +02:00

289 lines
8.9 KiB
XML
Executable File

// Range_Target.sch
CONST_INT iMAX_ENTITIES 50
CONST_FLOAT CONST_TARGET_HP 100.0
CONST_FLOAT CONST_ROT_TIME_ENTER 0.6 // How long it should take to enter
CONST_FLOAT CONST_ROT_TIME_EXIT 0.5 // How long it should take to exit
CONST_FLOAT CONST_FLIP_TIME 0.5 // How long it should take to flip the target
CONST_FLOAT CONST_CENTER_Z_OFFSET 1.155
CONST_INT CONST_SHOTTY_2TARGS 3
CONST_INT CONST_SHOTTY_3TARGS 5
CONST_INT CONST_SHOTTY_4TARGS 7
CONST_INT CONST_SHOTTY_5TARGS 7
CONST_INT CONST_SHOTTY_6TARGS 7
CONST_INT CONST_MINI_3RD_ROW 2
CONST_INT CONST_MINI_4TH_ROW 4
CONST_INT CONST_ZONE_1_REWARD 100
CONST_INT CONST_ZONE_2_REWARD 50
CONST_INT CONST_ZONE_3_REWARD 25
CONST_INT CONST_ZONE_4_REWARD 10
CONST_INT CONST_TARG_DESTRUCT 100
CONST_INT CONST_REWARD_HIT1 25
CONST_INT CONST_REWARD_HIT2 10
CONST_INT CONST_REWARD_HIT3 5
CONST_INT CONST_REWARD_HIT_ELSE 1
// Used for Moving targets
CONST_FLOAT MOVE_VERY_SLOW_SPEED 6.0 // 6 seconds to destination
CONST_FLOAT MOVE_SLOW_SPEED 5.0 // 5 seconds to destination
CONST_FLOAT MOVE_NORMAL_SPEED 4.0 // 4 seconds to destination
CONST_FLOAT MOVE_FAST_SPEED 3.0 // 3 seconds to destination
CONST_FLOAT MOVE_VERY_FAST_SPEED 2.0 // 2 seconds to destination
CONST_FLOAT MOVE_LUDICROUS_SPEED 1.0 // 1 second to destination
// Used to time respawns
CONST_FLOAT TARGET_RESPAWN_SHORT 1.0
CONST_FLOAT TARGET_RESPAWN_NORMAL 1.75
CONST_FLOAT TARGET_RESPAWN_LONG 3.5
TWEAK_FLOAT fTgtBullseyeRadius 0.075
TWEAK_FLOAT fTgtRing1Radius 0.145
TWEAK_FLOAT fTgtRing2Radius 0.215
TWEAK_FLOAT fTgtRing3Radius 0.285
// IF YOU MESS WITH THE ABOVE, YOU MUST FIX THESE.
TWEAK_FLOAT fTgtBullseyeRadius_SQ 0.005625
TWEAK_FLOAT fTgtRing1Radius_SQ 0.021025
TWEAK_FLOAT fTgtRing2Radius_SQ 0.046225
TWEAK_FLOAT fTgtRing3Radius_SQ 0.081225
TWEAK_FLOAT fRotateCoeffInc 0.32
CONST_FLOAT WOBBLE_COEFF_MAX 4.0
CONST_FLOAT WOBBLE_COEFF_MIN 1.0
CONST_FLOAT WOBBLE_COEFF_DONE 0.5
CONST_FLOAT WOBBLE_COEFF_DEC_MAX 0.15
CONST_FLOAT WOBBLE_COEFF_DEC_MIN 0.05
ENUM TARGET_MOVE_BEHAVIOR
TMB_STATIC, // Static target, does'nt flip
TMB_STATIC_FLIP, // Static target, flips after specified time
TMB_NULL
ENDENUM
ENUM TARGET_STATUS
TS_NO_STATUS = BIT0,
TS_MOVING = BIT1,
TS_FLIPPED = BIT2,
TS_FLIPPING = BIT3,
TS_ENTERING = BIT4,
TS_EXITING = BIT5,
TS_ASSIGNED = BIT6,
TS_CREATED = BIT7,
TS_DESTROYED = BIT8,
TS_WOBBLING = BIT10,
// Flags to set on creation.
TS_DONT_PLAY_ENTRY_SOUND = BIT11,
TS_DONT_PLAY_SLIDE_SOUND = BIT12,
TS_RESPAWNS = BIT20,
TS_RESPAWN_SHORT = BIT21,
TS_RESPAWN_LONG = BIT22,
TS_GIVE_FLOAT_HELP = BIT23,
TS_HEIGHT_RANDOM = BIT27,
TS_HEIGHT_MID = BIT28,
TS_HEIGHT_HIGH = BIT29,
TS_HEIGHT_LOW = BIT30
ENDENUM
// The actual physical target
STRUCT MODERN_TARGET
VECTOR vPos // The postion of the target, all models share this
VECTOR vCenter // The center of the bullseye
VECTOR vRot // The rotation of the target
FLOAT fHeading // The orientation of the BULLSEYE
OBJECT_INDEX objArm // The object handle of the targets arm
OBJECT_INDEX objBacking // The object handle of the targets backing
OBJECT_INDEX objTarget // The object handle of the targets
ENDSTRUCT
// Different behaviors these actions can do
ENUM ACTION_BEHAVIOR
AB_MOVE,
AB_MOVE_AT_TIME_VERY_SLOW,
AB_MOVE_AT_TIME_SLOW,
AB_MOVE_AT_TIME_NORMAL,
AB_MOVE_AT_TIME_FAST,
AB_MOVE_AT_TIME_VERYFAST,
AB_MOVE_AT_TIME_LUDICROUS,
AB_FLIP,
AB_DESTROY_WHEN_AT_LOC,
AB_DESTROY_AT_TIME,
AB_DESTROY_AFTER_TIME_CREATED,
AB_CREATE_AT_TIME,
AB_INVALID
ENDENUM
// Action Struct
STRUCT TARGET_ACTION
ACTION_BEHAVIOR eBehavior = AB_INVALID
FLOAT fTime
BOOL bPerformed
INT iTargetIndex
GRID_INDEX eDestIndex // Used for move commands
ENDSTRUCT
/// PURPOSE:
STRUCT TARGET_ENTITY
GRID_INDEX eGridIndex = INVALID_LOC // Which grid this entity is in
GRID_INDEX eMoveDest = INVALID_LOC // When we are moving, this is where we will move too
MODERN_TARGET target // The actual physical target
INT iCreateNumber // The amount of targets that need to be destroyed before it will be created
INT iStatus // Bitfield used to check our status
INT iMovingSound = -1 // Sound ID to store the moving sound.
FLOAT fTargCreateTime = -1.0 // What time we were created
FLOAT fHp // The targets HP
FLOAT fMoveLength // How long when moving, should we take
FLOAT fRotFrameTime // Used for rotating the arm down
FLOAT fWobbleFrameTime // Used to wobble the target.
FLOAT fFlipFrameTime // Used for flipping the bullseye around
FLOAT fMoveFrame
FLOAT fWobbleCoeff // Used to make the target wobble on entry.
FLOAT fWobbleChange
FLOAT fRespawnAtTime = -1.0 // Used for respawning targets.
FLOAT fRotateCoeff // USed to accelerate the rortate in as a target enters.
VECTOR vMoveStart // Where our old start position was
BOOL bHitThisRound = FALSE
ENDSTRUCT
STRUCT Range_Targets
TARGET_ENTITY sTargetEntities[iMAX_ENTITIES]
TARGET_ACTION sQueuedActions[iMAX_ACTIONS]
INT iActionIndex
ENDSTRUCT
/// PURPOSE:
/// Checks a target for any combination of statuses, if they are set, then we return true
/// PARAMS:
/// entityToCheck - Which targets status we want to check
/// checkStatus - Which status we want to check
/// RETURNS:
/// TRUE if the status exists on the target.
FUNC BOOL CHECK_TARGET_STATUS(TARGET_ENTITY entityToCheck, TARGET_STATUS checkStatus)
RETURN IS_BITMASK_AS_ENUM_SET(entityToCheck.iStatus, checkStatus)
ENDFUNC
/// PURPOSE:
/// Sets a specific status to an entity
/// PARAMS:
/// entityToSet - The target we want to set the status on
/// statusToSet - What status do we we want to set
PROC ADD_TARGET_STATUS(TARGET_ENTITY &entityToSet, TARGET_STATUS statusToSet)
SET_BITMASK_AS_ENUM(entityToSet.iStatus, statusToSet)
ENDPROC
/// PURPOSE:
/// Removes a specific status from a target
/// PARAMS:
/// entity - The entity that we want to remove the status from
/// statusToRem - Which status do we want to remove
PROC REMOVE_TARGET_STATUS(TARGET_ENTITY &entity, TARGET_STATUS statusToRem)
CLEAR_BITMASK_AS_ENUM(entity.iStatus, statusToRem)
ENDPROC
/// PURPOSE:
/// Checks to see if an entity is fully entered (created and all the way down)
/// PARAMS:
/// entity - The entity we want to check
/// RETURNS:
/// TRUE once fully down and shootable
FUNC BOOL IS_TARGET_ENTERED(TARGET_ENTITY entity)
RETURN (NOT CHECK_TARGET_STATUS(entity, TS_ENTERING) AND CHECK_TARGET_STATUS(entity, TS_CREATED))
ENDFUNC
/// PURPOSE:
/// Cleans up a target
/// PARAMS:
/// stTarget - The target we want to clean up
PROC DESTROY_TARGET(MODERN_TARGET & stTarget)
IF DOES_ENTITY_EXIST(stTarget.objTarget)
DELETE_OBJECT(stTarget.objArm)
DELETE_OBJECT(stTarget.objTarget)
ENDIF
IF DOES_ENTITY_EXIST(stTarget.objBacking)
DELETE_OBJECT(stTarget.objBacking)
ENDIF
ENDPROC
/// PURPOSE:
/// Destroys the target at the passed in grid location.. if there is one
/// PARAMS:
/// eGridLoc - The targets grid location that we want to destroy
FUNC BOOL DESTROY_TARGET_ENTITY(TARGET_ENTITY & tEntity, GRID_LOCATION & sGridData[])
// Destroy the target
DESTROY_TARGET(tEntity.target)
// Mark this grid as un occupided - eGridIndex is -1 for some reason...
IF (tEntity.eGridIndex <> INVALID_LOC)
sGridData[tEntity.eGridIndex].bOccupied = FALSE
ENDIF
tEntity.fTargCreateTime = -1.0
tEntity.iStatus = 0
ADD_TARGET_STATUS(tEntity, TS_DESTROYED)
ADD_TARGET_STATUS(tEntity, TS_CREATED)
tEntity.fHp = CONST_TARGET_HP
tEntity.fRespawnAtTime = -1.0
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// General check to see if a target is Entering, Moving, Exiting, Rotating, Flipping....
/// RETURNS:
/// TRUE if any of these are true
FUNC BOOL ARE_ANY_TARGET_ENTITIES_MOVING(Range_RoundInfo & sRndInfo, TARGET_ENTITY & sTargetEnts[])
INT iTer
REPEAT sRndInfo.iMaxTargets iTer
IF CHECK_TARGET_STATUS(sTargetEnts[iTer], TS_MOVING)
CDEBUG2LN(DEBUG_SHOOTRANGE, "AreAnyTargetsMobile -- Entity #", iTer, " is still moving..")
RETURN TRUE
ENDIF
IF CHECK_TARGET_STATUS(sTargetEnts[iTer], TS_ENTERING)
CDEBUG2LN(DEBUG_SHOOTRANGE, "AreAnyTargetsMobile -- Entity #", iTer, " is still entering..")
RETURN TRUE
ENDIF
IF CHECK_TARGET_STATUS(sTargetEnts[iTer], TS_EXITING)
CDEBUG2LN(DEBUG_SHOOTRANGE, "AreAnyTargetsMobile -- Entity #", iTer, " is still exiting..")
RETURN TRUE
ENDIF
IF CHECK_TARGET_STATUS(sTargetEnts[iTer], TS_FLIPPING)
CDEBUG2LN(DEBUG_SHOOTRANGE, "AreAnyTargetsMobile -- Entity #", iTer, " is still flipping..")
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC