⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 players.bas

📁 超级C&C有没有搞错,VB还能编出这种即时策略游戏来!没错,这就是我们的超级C&C!虽然游戏经常无故退出,但是原码仍有很多可圈可点的地方.祝你早日编出中国的超级RA,超级KKND,超级星际,超级家园
💻 BAS
字号:
Attribute VB_Name = "Players"
Global Const FACTION_EDF = 1
Global Const FACTION_ = 1
Global Const PLAYERTYPE_COMPUTER = 1
Global Const PLAYERTYPE_PERSON = 2
Global Const PLAYERTYPE_GAMESCRIPT = 3
Private Type PlayerData
  PlayerIndex As Integer
  NickName As String
End Type
Global LocalPlayer As PlayerData

Private Type BuildClass
  Active As Boolean
  Enabled As Boolean
  ClassReference As Integer
End Type
Private Type BuildingType
  Enabled As Boolean
  CanBePlaced As Boolean
  GoldRequired As Integer
  GoldGathered As Integer
  ClassReference As Integer
  Active As Boolean
End Type
Private Type Side
  Active As Boolean
  Money As Long
  NickName As String
  PlayerType As Integer
  BuildClasses(MaxObjModels) As BuildClass
  BuildClassesActive As Integer
  BuildsInProgress(MaxObjModels) As BuildingType
  BuildsInProgressesActive As Integer
  PrimaryBuildObjects(MAXBEHAVIORMODES) As Integer
  BuildSpeeds(MAXBEHAVIORMODES) As Integer
  TechLevel As Integer
  Faction As Integer
  CurrentlySelectedBuildClass As Integer
End Type
Global Const MAXPLAYERS = 10
Global PlayerMax As Integer
Global Player(MAXPLAYERS) As Side
Global Const SIDE_SCENERY = -1 'For scenery
Sub EvaluateBuildingAbility(PlayerIndex)
Dim BuildableTypes(MaxObjModels) As Boolean
For I = 1 To ObjectsActive
  If Objects(I).Side = PlayerIndex Then
    If CheckObject(I, OBJCHECK_ALIVE) = True Then
      If ObjModels(Objects(I).ModelIndex).Abilities(ABILITY_BUILDS) = True Then
        BuildableTypes(ObjModels(Objects(I).ModelIndex).Attributes(ATTRIBUTE_OBJECTBUILDTYPE)) = True
      End If
    End If
  End If
Next I
For I = 1 To Player(PlayerIndex).BuildsInProgressesActive
  If BuildableTypes(ObjModels(Player(PlayerIndex).BuildsInProgress(I).ClassReference).BehaviorType) = False Then
    Call RemoveFromBuildStack(PlayerIndex, I)
  End If
Next I
End Sub
Sub KillAllPlayers()
For I = 1 To PlayerMax
  Call KillPlayer(I)
Next I
PlayerMax = 0
End Sub
Sub KillPlayer(PlayerIndex)
Player(PlayerIndex).Active = False
End Sub
Function SpawnPlayer(Faction, Money, TechLevel)
For I = 1 To MAXPLAYERS
  If Player(I).Active = False Then
    NewIndex = I
    Exit For
  End If
Next I
With Player(NewIndex)
  .Active = True
  .CurrentlySelectedBuildClass = 1
  .Faction = Faction
  .Money = Money
  .TechLevel = TechLevel
End With
PlayerMax = PlayerMax + 1
SpawnPlayer = NewIndex
End Function
Sub RecompilePrimaryBuildObjects(PlayerIndex)
For I = 1 To MAXBEHAVIORMODES
  If Player(PlayerIndex).PrimaryBuildObjects(I) = NOOBJECT Then
    For I2 = 1 To ObjectsActive
      If ObjModels(Objects(I2).ModelIndex).Abilities(ABILITY_BUILDS) = True Then
        If ObjModels(Objects(I2).ModelIndex).Attributes(ATTRIBUTE_OBJECTBUILDTYPE) = I Then
          If Objects(I2).Side = PlayerIndex Then
            If CheckObject(I2, OBJCHECK_ALIVE) = True Then
              Player(PlayerIndex).PrimaryBuildObjects(I) = I2
              Exit For
            End If
          End If
        End If
      End If
    Next I2
  Else 'If it's already got an object
    KeepIt = False
    If CheckObject(Player(PlayerIndex).PrimaryBuildObjects(I), OBJCHECK_ALIVE) = True Then
      If ObjModels(Objects(Player(PlayerIndex).PrimaryBuildObjects(I)).ModelIndex).Abilities(ABILITY_BUILDS) = True Then
        If ObjModels(Objects(Player(PlayerIndex).PrimaryBuildObjects(I)).ModelIndex).Attributes(ATTRIBUTE_OBJECTBUILDTYPE) = I Then
          KeepIt = True
        End If
      End If
    End If
    If KeepIt = False Then
      Player(PlayerIndex).PrimaryBuildObjects(I) = NOOBJECT
    End If
  End If
Next I
End Sub
Sub RecompileBuildEnables(PlayerIndex)
For I = 1 To Player(PlayerIndex).BuildClassesActive
  Player(PlayerIndex).BuildClasses(I).Enabled = True
  For I2 = 1 To Player(PlayerIndex).BuildsInProgressesActive
    If ObjModels(Player(PlayerIndex).BuildClasses(I).ClassReference).BehaviorType = ObjModels(Player(PlayerIndex).BuildsInProgress(I2).ClassReference).BehaviorType Then
      Player(PlayerIndex).BuildClasses(I).Enabled = False
    End If
  Next I2
Next I
End Sub
Sub RecompileBuildOptions(PlayerIndex)
Player(PlayerIndex).BuildClassesActive = 0
For I = 1 To ObjectsActive
  If Objects(I).Side = PlayerIndex Then
    If Objects(I).Active = True Then
      If ObjModels(Objects(I).ModelIndex).Abilities(ABILITY_BUILDS) = True Then
        For I2 = 1 To MaxObjModTypes
          If Player(PlayerIndex).TechLevel >= ObjModels(I2).Attributes(ATTRIBUTE_TECHLEVEL) Then
            If ObjModels(I2).BehaviorType = ObjModels(Objects(I).ModelIndex).Attributes(ATTRIBUTE_OBJECTBUILDTYPE) Then
              If ObjModels(I2).Abilities(ABILITY_BUILDABLE) = True Then
                If ObjModels(I2).Attributes(ATTRIBUTE_SIDE) = Player(PlayerIndex).Faction Then
                  BuildIt = True
                  If ObjModels(I2).Attributes(ATTRIBUTE_REQUIREDBEFOREBUILD) <> NOOBJECT Then
                    BuildIt = False
                    For i3 = 1 To ObjectsActive
                      If Objects(i3).Side = PlayerIndex Then
                        If Objects(i3).Active = True Then
                          If Objects(i3).ModelIndex = ObjModels(I2).Attributes(ATTRIBUTE_REQUIREDBEFOREBUILD) Then
                            BuildIt = True
                          End If
                        End If
                      End If
                    Next i3
                  End If
                  For i3 = 1 To Player(PlayerIndex).BuildClassesActive
                    If Player(PlayerIndex).BuildClasses(i3).ClassReference = I2 Then
                      BuildIt = False
                      Exit For
                    End If
                  Next i3
                  If BuildIt = True Then
                    Player(PlayerIndex).BuildClassesActive = Player(PlayerIndex).BuildClassesActive + 1
                    Player(PlayerIndex).BuildClasses(Player(PlayerIndex).BuildClassesActive).Active = True
                    Player(PlayerIndex).BuildClasses(Player(PlayerIndex).BuildClassesActive).ClassReference = I2
                  End If
                End If
              End If
            End If
          End If
        Next I2
      End If
    End If
  End If
Next I
Call RecompileBuildEnables(PlayerIndex)

If Player(PlayerIndex).CurrentlySelectedBuildClass > Player(PlayerIndex).BuildClassesActive Then Player(PlayerIndex).CurrentlySelectedBuildClass = Player(PlayerIndex).BuildClassesActive
If Player(PlayerIndex).CurrentlySelectedBuildClass = 0 Then Player(PlayerIndex).CurrentlySelectedBuildClass = 1
Call RecompileBuildSpeeds(PlayerIndex)
If PlayerIndex = LocalPlayer.PlayerIndex Then
  Call RedrawControlPanel
End If
End Sub
Sub BuildObjectsChanged(PlayerIndex)
Call RecompileBuildSpeeds(PlayerIndex)
Call Players.RecompilePrimaryBuildObjects(PlayerIndex)
Call Players.EvaluateBuildingAbility(PlayerIndex)
Call Players.RecompileBuildOptions(PlayerIndex)
Call Players.RecompileBuildSpeeds(PlayerIndex)
If PlayerIndex = LocalPlayer.PlayerIndex Then
  Call RedrawControlPanel
End If
End Sub
Sub RecompileBuildSpeeds(PlayerIndex)
For I = 1 To MAXBEHAVIORMODES
  Player(PlayerIndex).BuildSpeeds(I) = 1
Next I
End Sub
Function StartBuilding(PlayerIndex, ClassOptionsIndex) As Integer
For I = 1 To Player(PlayerIndex).BuildsInProgressesActive
  If ObjModels(Player(PlayerIndex).BuildsInProgress(I).ClassReference).BehaviorType = ObjModels(Player(PlayerIndex).BuildClasses(ClassOptionsIndex).ClassReference).BehaviorType Then
    If Player(PlayerIndex).BuildsInProgress(I).Active = True Then
      DoNotBuild = True
    End If
  End If
Next I
If DoNotBuild = False Then
  Player(PlayerIndex).BuildsInProgressesActive = Player(PlayerIndex).BuildsInProgressesActive + 1
  Player(PlayerIndex).BuildsInProgress(Player(PlayerIndex).BuildsInProgressesActive).Enabled = True
  Player(PlayerIndex).BuildsInProgress(Player(PlayerIndex).BuildsInProgressesActive).Active = True
  Player(PlayerIndex).BuildsInProgress(Player(PlayerIndex).BuildsInProgressesActive).GoldGathered = 0
  Player(PlayerIndex).BuildsInProgress(Player(PlayerIndex).BuildsInProgressesActive).GoldRequired = ObjModels(Player(PlayerIndex).BuildClasses(ClassOptionsIndex).ClassReference).Attributes(ATTRIBUTE_COST)
  Player(PlayerIndex).BuildsInProgress(Player(PlayerIndex).BuildsInProgressesActive).ClassReference = Player(PlayerIndex).BuildClasses(ClassOptionsIndex).ClassReference
  Call RecompileBuildEnables(PlayerIndex)
  Call RedrawBuildWindows
  StartBuilding = Player(PlayerIndex).BuildsInProgressesActive
Else
  StartBuilding = NOOBJECT
End If
End Function
Sub RunBuilds()
For I = 1 To PlayerMax
  If Player(I).Active = True Then
    For I2 = 1 To Player(I).BuildsInProgressesActive
      If Player(I).BuildsInProgress(I2).GoldGathered < Player(I).BuildsInProgress(I2).GoldRequired Then
        Player(I).BuildsInProgress(I2).GoldGathered = Player(I).BuildsInProgress(I2).GoldGathered + Withdraw(I, Player(I).BuildSpeeds(ObjModels(Player(I).BuildsInProgress(I2).ClassReference).BehaviorType))
        If Player(I).BuildsInProgress(I2).GoldGathered >= Player(I).BuildsInProgress(I2).GoldRequired Then
          If ObjModels(Player(I).BuildsInProgress(I2).ClassReference).BehaviorType = BEHAVIORMODE_BUILDING Then
            If Player(I).BuildsInProgress(I2).CanBePlaced = False Then
              Player(I).BuildsInProgress(I2).CanBePlaced = True
              Call RedrawBuildWindows
            End If
          Else
            ReturnGold = (Player(I).BuildsInProgress(I2).GoldGathered - Player(I).BuildsInProgress(I2).GoldRequired) + 1
            Call Deposit(I, ReturnGold)
            Call ObjectCommand_BuildThis(Player(I).PrimaryBuildObjects(ObjModels(Player(I).BuildsInProgress(I2).ClassReference).BehaviorType), Player(I).BuildsInProgress(I2).ClassReference)
            Player(I).BuildsInProgress(I2).GoldGathered = 0
            Call RemoveFromBuildStack(I, I2)
            Call RecompileBuildEnables(I)
            Call RedrawBuildWindows
          End If
        End If
      End If
    Next I2
  End If
Next I
End Sub
Sub RemoveFromBuildStack(PlayerIndex, Buildnum)
Call Deposit(PlayerIndex, Player(PlayerIndex).BuildsInProgress(Buildnum).GoldGathered)
For I = Buildnum To Player(PlayerIndex).BuildsInProgressesActive - 1
  Player(PlayerIndex).BuildsInProgress(I) = Player(PlayerIndex).BuildsInProgress(I + 1)
Next I
Player(PlayerIndex).BuildsInProgress(Player(PlayerIndex).BuildsInProgressesActive).Active = False
Player(PlayerIndex).BuildsInProgressesActive = Player(PlayerIndex).BuildsInProgressesActive - 1
If Player(PlayerIndex).BuildsInProgressesActive < 0 Then Player(PlayerIndex).BuildsInProgressesActive = 0
Call RecompileBuildEnables(PlayerIndex)
End Sub
Sub CancelBuild(PlayerIndex, Buildnum)
For I = 1 To Player(PlayerIndex).BuildsInProgressesActive
  If Player(PlayerIndex).BuildsInProgress(I).ClassReference = Player(PlayerIndex).BuildClasses(Buildnum).ClassReference Then
    If Player(PlayerIndex).BuildsInProgress(I).Active = True Then
      Call RemoveFromBuildStack(PlayerIndex, I)
      Exit For
    End If
  End If
Next I
Call GraphicsEngine.RedrawBuildWindows
End Sub
Function Withdraw(PlayerIndex, GoldAmount) As Integer
Withdraw = GoldAmount
Player(PlayerIndex).Money = Player(PlayerIndex).Money - GoldAmount
If Player(PlayerIndex).Money < 0 Then
  Player(PlayerIndex).Money = 0
  Withdraw = Withdraw + Player(PlayerIndex).Money
End If
End Function
Sub Deposit(PlayerIndex, GoldAmount)
Player(PlayerIndex).Money = Player(PlayerIndex).Money + GoldAmount
End Sub
Public Sub BuildBuilding(X, Y, Side)
For I = 1 To Player(Side).BuildsInProgressesActive
  Call SpawnObject(Player(Side).BuildsInProgress(I).ClassReference, Side, X, Y, 0, 0, 0)
  If Side = LocalPlayer.PlayerIndex Then
    InterfaceFlags.PlacingABuilding = False
    InterfaceFlags.PlaceIndex = I
    Player(Side).BuildsInProgress(I).CanBePlaced = False
  End If
  Call RemoveFromBuildStack(Side, I)
  Exit For
Next I
Call RecompileBuildEnables(Side)
Call RedrawBuildWindows
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -