📄 entities.bas
字号:
If ObjModels(.ModelIndex).Abilities(ABILITY_REQUIRESTRACTION) = True Then
TurnSpeed = ObjTurnSpeed / 4
End If
End If
DestYaw = Math.GetYawFromXY(.Position.X, .Position.Y, ObjDest.X, ObjDest.Y)
If .Vector.Yaw - 3 < DestYaw Then
If .Vector.Yaw + 3 > DestYaw Then
.Vector.Yaw = DestYaw
SteerObjectDirection = True
Exit Function
End If
End If
If DestYaw > .Vector.Yaw Then
If DestYaw - .Vector.Yaw < 180 Then
.Vector.Yaw = .Vector.Yaw + TurnSpeed
Else
.Vector.Yaw = .Vector.Yaw - TurnSpeed
End If
Else
If .Vector.Yaw - DestYaw < 180 Then
.Vector.Yaw = .Vector.Yaw - TurnSpeed
Else
.Vector.Yaw = .Vector.Yaw + TurnSpeed
End If
End If
If .Vector.Yaw + (TurnSpeed + 2) > DestYaw Then
If .Vector.Yaw - (TurnSpeed + 2) < DestYaw Then
.Vector.Yaw = DestYaw
SteerObjectDirection = True
End If
End If
Call Math.CheckVector(.Vector)
.Vector.ZIncline = 0
Call SetDisplayDirection(ObjIndex)
End With
End Function
Function SteerTurretDirection(ObjIndex, ObjDest As Point3D) As Boolean
Dim TempVector As Vect3D
With Objects(ObjIndex)
DestYaw = Math.GetYawFromXY(.Position.X, .Position.Y, ObjDest.X, ObjDest.Y)
If .TopDirection - 6 < DestYaw Then
If .TopDirection + 6 > DestYaw Then
.TopDirection = DestYaw
SteerTurretDirection = True
Exit Function
End If
End If
If DestYaw > .TopDirection Then
If DestYaw - .TopDirection < 180 Then
.TopDirection = .TopDirection + 6
Else
.TopDirection = .TopDirection - 6
End If
Else
If .TopDirection - DestYaw < 180 Then
.TopDirection = .TopDirection - 6
Else
.TopDirection = .TopDirection + 6
End If
End If
If .TopDirection + 8 > DestYaw Then
If .TopDirection - 8 < DestYaw Then
.TopDirection = DestYaw
SteerTurretDirection = True
End If
End If
TempVector.Yaw = .TopDirection
Call Math.CheckVector(TempVector)
.TopDirection = TempVector.Yaw
Call SetDisplayDirection(ObjIndex)
End With
End Function
Sub SetDisplayDirection(ObjIndex)
With Objects(ObjIndex)
If ObjModels(.ModelIndex).Attributes(ATTRIBUTE_DIRECTIONAMOUNT) <> 1 Then
.DisplayDirection = Int((.Vector.Yaw + ObjModels(.ModelIndex).Consts(CONST_DIRECTIONDIVDIV)) / ObjModels(.ModelIndex).Consts(CONST_DIRECTIONDIV))
If .DisplayDirection = ObjModels(.ModelIndex).Attributes(ATTRIBUTE_DIRECTIONAMOUNT) Then .DisplayDirection = 0
Else
.DisplayDirection = 0
End If
If ObjModels(.ModelIndex).Attributes(ATTRIBUTE_TOPDIRECTIONAMOUNT) <> 1 Then
If ObjModels(.ModelIndex).Abilities(ABILITY_BODYISBISECTED) = True Then
.TopDisplayDirection = Int((.TopDirection + ObjModels(.ModelIndex).Consts(CONST_TOPDIRECTIONDIVDIV)) / ObjModels(.ModelIndex).Consts(CONST_TOPDIRECTIONDIV))
If .TopDisplayDirection = ObjModels(.ModelIndex).Attributes(ATTRIBUTE_TOPDIRECTIONAMOUNT) Then .TopDisplayDirection = 0
End If
Else
.TopDisplayDirection = 0
End If
End With
End Sub
Public Function SpawnObject(ClassNum, Side, X, Y, Z, Yaw, ZIncline) As Integer
If ObjModels(ClassNum).Abilities(ABILITY_ISPHYSICAL) = True Then
If GroundBlocks(X, Y).Occupied = True Then
GoTo DontSpawn
End If
End If
If ObjModels(ClassNum).Attributes(ATTRIBUTE_MAPIMPRINT) <> NOMAPIMPRINT Then
If Map.IsImprintSpaceNonGrass(X, Y, ObjModels(ClassNum).Attributes(ATTRIBUTE_MAPIMPRINT)) = True Then
GoTo DontSpawn
End If
If Map.IsImprintSpaceOccupied(X, Y, ObjModels(ClassNum).Attributes(ATTRIBUTE_MAPIMPRINT)) = True Then
GoTo DontSpawn
End If
End If
For I = 1 To MAXOBJECTS
If Objects(I).Active = False Then
NewObject = I
Exit For
End If
Next I
If ObjectsActive < NewObject Then ObjectsActive = NewObject
With Objects(NewObject)
'Clears all it's properties so it doesn't do something wacky!
For I = 1 To MAXOBJECTPROPERTIES
.Properties(I) = 0
Next I
'Initializes the object
.Frozen = False
.Active = True
.Side = Side
.ModelIndex = ClassNum
.CurrentSpeed = 0
.Position.X = Map.UnProjectToMapX(X)
.Position.Y = Map.UnProjectToMapY(Y)
.Position.Z = Z
.Objective.MainDestination = Map.ProjectToMap3DPoint(.Position)
.Objective.MainDestination.Z = Z
.Objective.CurrentDestination = .Objective.MainDestination
.DisplayDirection = 0
.Vector.Yaw = Yaw
.Vector.ZIncline = ZIncline
.Objective.Goal = GOAL_NOTHING
.States(STATE_MOVING) = False
.Sprite.SpriteNumber = ObjModels(ClassNum).Attributes(ATTRIBUTE_SPRITE)
.Sprite.SpriteFrameNumber = 1
.Sprite.SpriteGroupNumber = 1
.TopSprite.SpriteNumber = ObjModels(ClassNum).Attributes(ATTRIBUTE_TOPSPRITE)
.TopSprite.SpriteFrameNumber = 1
.TopSprite.SpriteGroupNumber = 1
.TopDirection = .Vector.Yaw
.DisplayDirection = .DisplayDirection
.Properties(PROPERTY_TIMEUNTILADJUSTDIRECTION) = OBJCONST_TimeTillAdjustDirection
.Properties(PROPERTY_WEAPONOBJECTTYPE) = ObjModels(ClassNum).Attributes(ATTRIBUTE_DEFAULTWEAPONOBJECT)
.Properties(PROPERTY_HEALTH) = ObjModels(ClassNum).Attributes(ATTRIBUTE_HEALTH)
If ObjModels(ClassNum).Abilities(ABILITY_HASDNA) = True Then Call Assign_DNA(NewObject)
Call SetObjectMapPosition(NewObject)
If ObjModels(.ModelIndex).BehaviorType = BEHAVIORMODE_TANK Then
Dim TempPos As Point3D
For I = 1 To 10
SparkDirection = Int(360 * Rnd)
TempPos = Math.GetPropelCoordinates(.Position, SparkDirection, 0, 7 + (5 * Rnd))
Call SpawnSpark(TempPos.X, TempPos.Y, .Position.Z, PALLETE_BLUE, SparkDirection, 2, 10, 7, 1)
Next I
Call ObjectCommand_MoveSomewhere(NewObject, .MapPosition.X, .MapPosition.Y)
End If
If CheckObject(NewObject, OBJCHECK_OCCUPIESMAPSPACE) = True Then Call SetGroundOccupiedByObject(NewObject)
'returns the handle of the object
If ObjModels(ClassNum).Abilities(ABILITY_BUILDS) = True Then
Call BuildObjectsChanged(Side)
End If
End With
If ObjModels(ClassNum).Attributes(ATTRIBUTE_MAPIMPRINT) <> NOMAPIMPRINT Then
Call Map.PlaceMapImprint(ObjModels(ClassNum).Attributes(ATTRIBUTE_MAPIMPRINT), X, Y, NewObject)
End If
Call Object_PlaySound(NewObject, SoundEvent_Spawn)
SpawnObject = NewObject
Exit Function
DontSpawn:
SpawnObject = NOOBJECT
End Function
Public Sub LoadObjectData()
Dim MaxMods As Integer, a$, propvalue$, I As Integer, DeployObjectList(MaxObjModels) As String, WepObjs(MaxObjModels) As String
On Error Resume Next
MaxMods = 0
Call FileFunctions.OpenGameFile(File_UnitDefinitions, 1)
Do
Line Input #1, a$
Select Case MiscFunctions.GetPropertyName(a$)
Case FILETAG_ENDFILE
Exit Do
Case "[OBJECTDEFSTART]"
MaxMods = MaxMods + 1
Line Input #1, a$
ObjModels(MaxMods).ObjClassName = MiscFunctions.GetPropertyValue(a$)
Line Input #1, a$
ObjModels(MaxMods).ObjName = MiscFunctions.GetPropertyValue(a$)
Line Input #1, a$
Select Case MiscFunctions.GetPropertyValue(a$)
Case "-NONE-"
BehavType = BEHAVIORMODE_NONE
Case "BEHAVIORMODE_INANIMATE"
BehavType = BEHAVIORMODE_INANIMATE
Case "BEHAVIORMODE_BUILDING"
BehavType = BEHAVIORMODE_BUILDING
Case "BEHAVIORMODE_SOLDIER"
BehavType = BEHAVIORMODE_SOLDIER
Case "BEHAVIORMODE_SHIP"
BehavType = BEHAVIORMODE_SHIP
Case "BEHAVIORMODE_TANK"
BehavType = BEHAVIORMODE_TANK
Case "BEHAVIORMODE_AIRCRAFT"
BehavType = BEHAVIORMODE_AIRCRAFT
Case "BEHAVIORMODE_SPACECRAFT"
BehavType = BEHAVIORMODE_SPACECRAFT
Case "BEHAVIORMODE_WEAPON"
BehavType = BEHAVIORMODE_WEAPON
End Select
ObjModels(MaxMods).BehaviorType = BehavType
For I = 1 To MAXABILITIES
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Abilities(I) = MiscFunctions.ConvertTrueFalse(a$)
Next I
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_SPRITE) = SpriteStuff.GetSpriteIndex(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_SIZE) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_LENGTHX) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_LENGTHY) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_LENGTHZ) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_MAXSPEED) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_BULLETARMOR) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_SHELLARMOR) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_BOMBARMOR) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_FIREARMOR) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_ELECTROMAGNETICARMOR) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_RADIATIONARMOR) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_MAXAMMO) = Val(a$)
Line Input #1, a$
Select Case MiscFunctions.GetPropertyValue(a$)
Case "EXPLODETYPE_BULLET"
ExplodeType = EXPLODETYPE_BULLET
Case "EXPLODETYPE_SHELL"
ExplodeType = EXPLODETYPE_SHELL
Case "EXPLODETYPE_BOMB"
ExplodeType = EXPLODETYPE_BOMB
Case "EXPLODETYPE_FIRE"
ExplodeType = EXPLODETYPE_FIRE
Case "EXPLODETYPE_ELECTROMAGNETIC"
ExplodeType = EXPLODETYPE_ELECTROMAGNETIC
Case "EXPLODETYPE_RADIATION"
ExplodeType = EXPLODETYPE_RADIATION
End Select
ObjModels(MaxMods).Attributes(ATTRIBUTE_EXPLOSIONTYPE) = ExplodeType
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_EXPLOSIONINTENSITY) = Val(a$)
Line Input #1, a$
a$ = MiscFunctions.GetPropertyValue(a$)
ObjModels(MaxMods).Attributes(ATTRIBUTE_EXPLOSIONRADIUS) = Val(a$)
Line Input #1, a$
a$ = Misc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -