function PlaySoundPlayer takes player pPlayer, sound soundHandle returns nothing
if ( GetLocalPlayer() == pPlayer ) then
call PlaySoundBJ(soundHandle)
endif
endfunction
function ShowDebugMsg takes string fp_strMsg returns nothing
if (udg_ItsForDebug) then
call DisplayTextToForce( GetPlayersAll(), fp_strMsg )
endif
endfunction
function ShowAssertMsg takes string fp_strFunction, string fp_strMsg returns nothing
call ShowDebugMsg( "Function: " + fp_strFunction + " " + fp_strMsg )
endfunction
function ShowDisplayOrderID takes nothing returns nothing
call ShowDebugMsg( "OrderId = " + I2S(GetIssuedOrderIdBJ()) + " -> " + OrderId2String(GetIssuedOrderIdBJ()) )
endfunction
function ShowDebugMsgLocation takes string fp_strMsg, location loc returns nothing
if ( loc == null ) then
call ShowDebugMsg( fp_strMsg + " = null" )
else
call ShowDebugMsg( fp_strMsg + " = (" + R2S(GetLocationX(loc)) + ", " + R2S(GetLocationY(loc)) + ")" )
endif
endfunction
function ShowQuestMsg takes string fp_strTitle, string fp_strMsg returns nothing
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_ALWAYSHINT, "\r|cffffcc00REQUIRED QUEST|r\n" + StringCase(fp_strTitle, true) + "\n" + fp_strMsg )
endfunction
function ShowQuestHintMsg takes string fp_strMsg returns nothing
call PlaySoundBJ( gg_snd_Hint )
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_ALWAYSHINT, "\r|cffffcc00HINT|r - " + fp_strMsg )
endfunction
function ShowTipMsg takes string fp_strMsg returns nothing
call PlaySoundBJ( gg_snd_Hint )
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_ALWAYSHINT, "\r|cff00ff00TIP|r - " + fp_strMsg )
endfunction
function ShowTipMsgPlayer takes player fp_Player, string fp_strMsg returns nothing
call PlaySoundPlayer( fp_Player, gg_snd_Hint )
call DisplayTextToPlayer( fp_Player, 0, 0, "\r|cff00ff00TIP|r - " + fp_strMsg )
endfunction
function ShowWarningMsg takes player fp_Player, string fp_strMsg returns nothing
call DisplayTextToPlayer ( fp_Player, 0, 0, "\r|cffff0000WARNING|r - " + fp_strMsg )
endfunction
function ShowGeneralMsg takes string fp_strMsg, boolean fp_snd returns nothing
if (fp_snd) then
call PlaySoundBJ( gg_snd_Hint )
endif
call QuestMessageBJ( GetPlayersAll(), bj_QUESTMESSAGE_ALWAYSHINT, "\r|cffffcc00" + StringCase(fp_strMsg, true) + "|r")
endfunction
function ShowMsgToAll takes string message returns nothing
call DisplayTimedTextToForce( GetPlayersAll(), 3, message )
endfunction
function IsLocationInRect takes rect fp_rc, location fp_loc returns boolean
if ( GetLocationX(fp_loc) >= GetRectMaxX(fp_rc) or GetLocationX(fp_loc) <= GetRectMinX(fp_rc) ) then
return false
endif
if ( GetLocationY(fp_loc) >= GetRectMaxY(fp_rc) or GetLocationY(fp_loc) <= GetRectMinY(fp_rc) ) then
return false
endif
return true
endfunction
function CreateTextTagLocForPlayer takes player pl, string s, location loc, real zOffset, real size, real red, real green, real blue, real transparency returns texttag
local texttag tt
// loop
set tt = CreateTextTagLocBJ( s, loc, zOffset, size, red, green, blue, transparency )
if ( tt == null ) then
call ShowDebugMsg( "CreateTextTagLocForPlayer tt = null" )
endif
// exitwhen tt != null
// call TriggerSleepAction(0)
// endloop
if ( GetLocalPlayer() == pl ) then
call SetTextTagVisibility( tt, true )
else
call SetTextTagVisibility( tt, false )
endif
return tt
endfunction
function CreateTextTagLocForFriend takes player pl, string s, location loc, real zOffset, real size, real red, real green, real blue, real transparency returns texttag
local texttag tt
// loop
set tt = CreateTextTagLocBJ( s, loc, zOffset, size, red, green, blue, transparency )
if ( tt == null ) then
call ShowDebugMsg( "CreateTextTagLocForFriend tt = null" )
endif
// exitwhen tt != null
// call TriggerSleepAction(0)
// endloop
if ( IsPlayerAlly( GetLocalPlayer(), pl) ) then
call SetTextTagVisibility( tt, true )
else
call SetTextTagVisibility( tt, false )
endif
return tt
endfunction
function PingMinimapForPlayerEx takes player fp_pl, real x, real y, real duration, integer red, integer green, integer blue, boolean extraEffects returns nothing
if ( GetLocalPlayer() == fp_pl ) then
call PingMinimapEx( x, y, duration, red, green, blue, extraEffects )
endif
endfunction
function Integer2String2 takes integer n returns string
local integer n1 = 0
local integer n2 = 0
if ( n > 99 ) then
set n = ModuloInteger( n, 100 )
endif
set n1 = n / 10
set n2 = n - n1 * 10
return I2S(n1) + I2S(n2)
endfunction
function Second2String takes integer nSeconds, boolean bHour returns string
local string str = null
if ( bHour ) then
set str = Integer2String2( nSeconds / 3600 ) + ":"
if ( SubString(str, 0, 1) == "0" ) then
set str = SubString( str, 1, StringLength(str) )
endif
else
set str = ""
endif
set nSeconds = ModuloInteger( nSeconds, 3600 )
set str = str + Integer2String2( nSeconds / 60 )
set nSeconds = ModuloInteger( nSeconds, 60 )
set str = str + ":" + Integer2String2( nSeconds )
return str
endfunction
function GetTimeElapsed takes nothing returns string
local integer nSeconds = R2I( TimerGetElapsed( udg_GameTimer ) )
return Second2String( nSeconds, true )
endfunction
Name | Type | is_array | initial_value |
__TempImage | image | No | |
__TempPoint | location | No | |
_AIRPORTCNT_INIT | integer | No | 6 |
_AIRPORTCNT_MAX | integer | No | 8 |
_AP_TRAININGBAR_MAXLEN | integer | No | 90 |
_AP_TRAININGBAR_MAXTICK | integer | No | 400 |
_BOMBERTECHTYPE_CLUSTER | integer | No | 5 |
_BOMBERTECHTYPE_FREEZING | integer | No | 2 |
_BOMBERTECHTYPE_INCENDARY | integer | No | 1 |
_BOMBERTECHTYPE_NORMAL | integer | No | |
_BOMBERTECHTYPE_NUCLEAR | integer | No | 4 |
_BOMBERTECHTYPE_STEALTH | integer | No | 3 |
_FIGHTER_ROTATIONRADIUS | real | No | 900.00 |
_FORCE1 | player | No | Player03 |
_FORCE2 | player | No | Player07 |
_FREEZINGBOMBER_RADIUS | real | No | 400.00 |
_HERO_REVIVETIME | integer | No | 20 |
_HOUSESTATE_BUILDING | integer | No | 2 |
_HOUSESTATE_DIED | integer | No | 1 |
_HOUSESTATE_NORMAL | integer | No | |
_HOUSESTATE_ORDERREBUILD | integer | No | 4 |
_HOUSESTATE_REMOVED | integer | No | 3 |
_ISSLOTPLAYER | boolean | Yes | |
_NUCLEAR_STAGE_CEILING | integer | No | 3 |
_NUCLEAR_STAGE_CEILING_TICKMAX | integer | No | 25 |
_NUCLEAR_STAGE_NO | integer | No | |
_NUCLEAR_STAGE_ROTATE | integer | No | 4 |
_NUCLEAR_STAGE_ROTATE_TICKMAX | integer | No | 300 |
_NUCLEAR_STAGE_WORKERB | integer | No | 1 |
_NUCLEAR_STAGE_WORKERB_TICKMAX | integer | No | 50 |
_NUCLEAR_STAGE_WORKERT | integer | No | 2 |
_NUCLEAR_STAGE_WORKERT_TICKMAX | integer | No | 40 |
_NUCLEARBOMBER_ID | integer | No | |
_NUCLEARCREAT_RADIUS | real | No | 300.00 |
_NUCLEARCREAT_WORKERNUM | integer | No | 8 |
_NUCLEARNUMCAP | integer | No | 3 |
_PEONNUM_PERHOUSE | integer | No | 3 |
_PEONSTATE_BUILDING | integer | No | 4 |
_PEONSTATE_RETURN | integer | No | 6 |
_PEONSTATE_START1 | integer | No | 1 |
_PEONSTATE_START2 | integer | No | 2 |
_PEONSTATE_START3 | integer | No | 3 |
_PEONSTATE_WORK | integer | No | 5 |
_PLANEANIM_INITSCALE | real | No | 4.00 |
_PLANECATEGORY_BOMBER | integer | No | 1 |
_PLANECATEGORY_CARRIER | integer | No | 4 |
_PLANECATEGORY_DROPPER | integer | No | 3 |
_PLANECATEGORY_FIGHTER | integer | No | 2 |
_PLANESTATE_ACTING | integer | No | 3 |
_PLANESTATE_BUILDING | integer | No | 1 |
_PLANESTATE_FINISHING | integer | No | 4 |
_PLANESTATE_FLYING | integer | No | 2 |
_PLAYERINITGOLD | integer | No | 500 |
_PLAYERINITLUMBER | integer | No | 500 |
_PLAYERTOTALNUMBER | integer | No | 8 |
_POINTVALUE_AIRBORNE | integer | No | 2 |
_POINTVALUE_DAMAGER | integer | No | 11 |
_POINTVALUE_PEON | integer | No | 3 |
_POINTVALUE_PLANE | integer | No | 1 |
_STR_AIRPORTFLOATINGTEXT | string | No | |
_STR_AIRPORTWAITFORMONEY | string | No | |
_STR_COMMANDCENTERKILLED | string | No | |
_STR_DEFEAT | string | No | |
_STR_DEFEATEDSINGLE_OTHER1 | string | No | |
_STR_DEFEATEDSINGLE_OTHER2 | string | No | |
_STR_DEFEATEDSINGLE_SELF | string | No | |
_STR_DEMATRIXEXISTED | string | No | |
_STR_HEROREVIVED | string | No | |
_STR_HEROREZ | string | No | |
_STR_KILLHOUSEBONUS_1 | string | No | |
_STR_KILLHOUSEBONUS_2 | string | No | |
_STR_KILLHOUSEBONUS_3 | string | No | |
_STR_MULTIBOARD_PLAYERLEFT | string | No | |
_STR_MULTIBOARD_TITLE | string | No | |
_STR_MULTIBOARD_TITLE_PLANES | string | No | |
_STR_MULTIBOARD_TITLE_PLAYER | string | No | |
_STR_MULTIBOARD_TITLE_TECH | string | No | |
_STR_NOENOUGHMONEY_BUILDPLANE | string | No | |
_STR_NOMONEYFORNUCLEAR | string | No | |
_STR_NUCLEARLAUNCHED | string | No | |
_STR_NUCLEARREADY | string | No | |
_STR_NUCLEARSILOFULL | string | No | |
_STR_PLAYERLEFT | string | No | |
_STR_SCOREBOARD_AIRPORTSBUILT | string | No | |
_STR_SCOREBOARD_BOMBERACCURACY | string | No | |
_STR_SCOREBOARD_CATHEROES | string | No | |
_STR_SCOREBOARD_CATMISC | string | No | |
_STR_SCOREBOARD_CATPLANES | string | No | |
_STR_SCOREBOARD_CATTOWERS | string | No | |
_STR_SCOREBOARD_DEFEAT | string | No | |
_STR_SCOREBOARD_FAVHEROSPELL | string | No | |
_STR_SCOREBOARD_FAVPLANE | string | No | |
_STR_SCOREBOARD_FAVTOWER | string | No | |
_STR_SCOREBOARD_FINALSCORE | string | No | |
_STR_SCOREBOARD_HEROKILLED | string | No | |
_STR_SCOREBOARD_HEROLVL | string | No | |
_STR_SCOREBOARD_HEROSPELL | string | No | |
_STR_SCOREBOARD_HOUSERAZED | string | No | |
_STR_SCOREBOARD_HOUSESAVED | string | No | |
_STR_SCOREBOARD_NUCLEAR | string | No | |
_STR_SCOREBOARD_PLANESBUILT | string | No | |
_STR_SCOREBOARD_PLANESKILLED | string | No | |
_STR_SCOREBOARD_PLANEVARIETY | string | No | |
_STR_SCOREBOARD_PLAYERS | string | No | |
_STR_SCOREBOARD_RESOURCES | string | No | |
_STR_SCOREBOARD_TECHLEVEL | string | No | |
_STR_SCOREBOARD_TITLE1 | string | No | |
_STR_SCOREBOARD_TITLE2 | string | No | |
_STR_SCOREBOARD_TITLE3 | string | No | |
_STR_SCOREBOARD_TOTALSCORE | string | No | |
_STR_SCOREBOARD_TOWERKILLED | string | No | |
_STR_SCOREBOARD_TOWERSBUILT | string | No | |
_STR_SCOREBOARD_TOWERVARIETY | string | No | |
_STR_SCOREBOARD_VICTORY | string | No | |
_STR_SCOREBOARD_YOURSCORE | string | No | |
_STR_SIDE_NORTH | string | No | |
_STR_SIDE_SOUTH | string | No | |
_STR_TIP_PLANE | string | No | |
_STR_TIP_TECH | string | No | |
_STR_TIP_TOWER | string | No | |
_STR_TIP_WIN | string | No | |
_STR_TIPF9 | string | No | |
_STR_YOULOSE | string | No | |
_STR_YOUWIN | string | No | |
_TempBarStyle | integer | No | |
_TIP_INTERVAL | real | No | 15.00 |
_UT_WORKER_ALLIANCE | unitcode | No | n007 |
_UT_WORKER_HORDE | unitcode | No | o00F |
_Y_CENTER | real | No | |
_Y_NORTH | real | No | |
_Y_NORTH_AIRPORT | real | No | |
_Y_SOUTH | real | No | |
_Y_SOUTH_AIRPORT | real | No | |
AirborneDrop_P1 | integer | No | |
Airport | unit | Yes | |
Airport_BuffNum | integer | No | 1 |
Airport_Targets | location | Yes | |
Airport_TBar | texttag | Yes | |
Airport_Training | integer | Yes | |
Airport_TrainingCount | real | Yes | |
Airport_TrainingPlane | integer | Yes | |
Airport_WarpGating | boolean | Yes | |
Base | unit | Yes | |
BaseCity | unit | Yes | |
BaseLightning | lightning | Yes | |
BasePos | location | Yes | |
BaseRect | rect | Yes | |
BaseWallTypes | destructablecode | Yes | |
BaseWallTypesNum | integer | No | |
BoardPlayerIndexes | integer | Yes | |
BoardTimer | timer | No | |
BombTarget_BuffNum | integer | No | |
BombTarget_Direction | real | Yes | |
BombTarget_DoDamage | boolean | Yes | |
BombTarget_Dropper | unit | Yes | |
BombTarget_IncScoreId | integer | Yes | |
BombTarget_Loc | location | Yes | |
BombTarget_PlaneTypeId | integer | Yes | |
BombTarget_PlayerId | integer | Yes | |
CameraTimer | timer | No | |
ColorBlue | integer | Yes | |
ColorGreen | integer | Yes | |
ColorRed | integer | Yes | |
ColorString | string | Yes | |
DEBUG_GOLD | integer | No | |
DEBUG_INCOMETIMER | timer | No | |
DefensiveMatrixHP | integer | Yes | |
DefensiveMatrixLvl | integer | Yes | |
DefensiveMatrixUnits | unit | Yes | UnitNull |
EnumDefenseBuildingFilter_PL | player | No | |
EnumDefenseBuildingFilter_UT | integer | No | |
FakeAirport | unit | Yes | |
Fun_AddScoreBombDrop_Pl | integer | No | |
Fun_AddScoreBombHit_Pl | integer | No | |
Fun_AddScoreHeroSpellCast_Pl | integer | No | |
Fun_AddScoreNuclearLanded_Pl | integer | No | |
Fun_AddScoreNuclearUsed_Pl | integer | No | |
Fun_AddScorePlanesBuilt_Pl | integer | No | |
Fun_AddScorePlanesKilled_Pl | integer | No | |
Fun_AddScorePlanesKilledCost_1 | integer | No | |
Fun_AddScorePlanesKilledCost_2 | integer | No | |
Fun_AddScorePlaneType_Player | integer | No | |
Fun_AddScorePlaneType_PTId | integer | No | |
Fun_AddScoreResources_Pl | integer | No | |
Fun_AddScoreResources_Resource | integer | No | |
Fun_AddScoreTowersBuilt_Pl | integer | No | |
Fun_AddScoreTowerType_Player | integer | No | |
Fun_AddScoreTowerType_TTId | integer | No | |
Fun_CancelTrainingPlane_P1 | integer | No | |
Fun_CancelTrainingPlane_P2 | boolean | No | |
Fun_ImageFadeout_P1 | image | No | |
Fun_ImageFadeout_P2 | integer | No | |
Fun_KillAllUnitOfPlayer_P1 | integer | No | |
Fun_MagneticFieldFrozen_P1 | unit | No | |
Fun_PlaneFinishing_P1 | integer | No | |
Fun_ScoutTowerFrozen_P1 | unit | No | |
Fun_TimedVision_Center | location | No | |
Fun_TimedVision_Last | real | No | |
Fun_TimedVision_Player | player | No | |
Fun_TimedVision_Radius | real | No | |
Fun_WarpGateJump_P1 | integer | No | |
Fun_WarpGateJump_P2 | unit | No | |
Fun_WarpGateJump_P3 | integer | No | |
GameOver | boolean | No | |
GameTimer | timer | No | |
HasPlayerBuiltPlane | boolean | Yes | |
HeroAbilities | abilcode | Yes | |
HeroAbilityIcons | string | Yes | |
HeroAbilityNum | integer | No | |
Heroes | unit | Yes | |
HeroRezTimer | timer | Yes | |
HeroRezTimerWnd | timerdialog | Yes | |
HeroSpawnPos | location | Yes | |
HouseBaseAttackedWarning | boolean | Yes | |
IncBombTargetGlobalScored | boolean | Yes | |
IncBombTargetGlobalScoreId | integer | No | |
IncomeIndex | integer | No | |
IncomeTimer | timer | No | |
IsScorePlayer | boolean | Yes | |
ItsForDebug | boolean | No | true |
MagneticField | unit | Yes | |
MagneticField_BuffNum | integer | No | 1 |
MagneticField_DisabledId | integer | Yes | |
MagneticField_Effect | unit | Yes | |
MagneticFieldTimer | timer | No | |
mb | multiboard | Yes | |
NuclearBomber | unit | Yes | |
NuclearBomber_BuffNum | integer | No | |
NuclearBomber_Caster | unit | Yes | |
NuclearBomber_Ceiling | lightning | Yes | |
NuclearBomber_CeilingLen | real | Yes | |
NuclearBomber_EffectOrigin | effect | Yes | |
NuclearBomber_Lightning | lightning | Yes | |
NuclearBomber_Stage | integer | Yes | |
NuclearBomber_Target | location | Yes | |
NuclearBomber_Tick | integer | Yes | |
NuclearBomber_WorkerB | unit | Yes | |
NuclearBomber_WorkerT | unit | Yes | |
NuclearBomber_WorkerTHeight | real | Yes | |
NuclearBomberTimer | timer | No | |
NuclearSiloSpace | unit | Yes | |
PeonGold | integer | Yes | 10 |
PeonHouse | unit | Yes | |
PeonHouse_Entrance | location | Yes | |
PeonHouse_Num | integer | No | |
PeonHouse_Pos | location | Yes | |
PeonHouse_State | integer | Yes | |
PeonHouse_Type | integer | Yes | |
PeonHouseTypes | unitcode | Yes | |
PeonHouseTypesNum | integer | No | |
PeonLumber | integer | Yes | 6 |
PeonPath_InitRect | rect | Yes | |
PeonPath_NodeNum | integer | Yes | |
PeonPath_Num | integer | No | |
PeonPath_PlayerIndex | integer | Yes | |
PeonPath_StartNodeIndex | integer | Yes | |
PeonPathNodes | location | Yes | |
PeonPathNodesNum | integer | No | |
PeonReadyTimerTick | integer | No | |
Plane | unit | Yes | |
Plane_ActionDone | boolean | Yes | |
Plane_ActionTick | integer | Yes | |
Plane_Airport | integer | Yes | |
Plane_BuffNum | integer | No | |
Plane_Direction | real | Yes | |
Plane_FlyTick | integer | Yes | |
Plane_IncScoreId | integer | Yes | |
Plane_InMagneticField | boolean | Yes | |
Plane_PlayerId | integer | Yes | |
Plane_State | integer | Yes | |
Plane_Target | location | Yes | |
Plane_TargetSign | unit | Yes | |
PlaneActionTimer | timer | No | |
PlaneType_ActionRange | real | Yes | |
PlaneType_ActionTime | integer | Yes | |
PlaneType_BuildId | integer | Yes | |
PlaneType_BuildIdNoTarget | integer | Yes | |
PlaneType_BuildTime | integer | Yes | |
PlaneType_CatDataId | integer | Yes | |
PlaneType_Category | integer | Yes | |
PlaneType_FlyHeight | integer | Yes | |
PlaneType_Icon | string | Yes | |
PlaneType_Num | integer | No | |
PlaneType_OneShot | boolean | Yes | |
PlaneType_OrderId | integer | Yes | |
PlaneType_Price | integer | Yes | |
PlaneType_UnitType | integer | Yes | |
PlaneTypeBomber_Damager1 | integer | Yes | |
PlaneTypeBomber_Damager2 | integer | Yes | |
PlaneTypeBomber_Dropper | integer | Yes | |
PlaneTypeBomber_Num | integer | No | |
PlaneTypeBomber_Number | integer | Yes | |
PlaneTypeBomber_Radius | real | Yes | |
PlaneTypeBomber_Scale | real | Yes | |
PlaneTypeBomber_TechType | integer | Yes | |
PlaneTypeCarrier_Caster | integer | Yes | |
PlaneTypeCarrier_InterLife | real | Yes | |
PlaneTypeCarrier_Num | integer | No | |
PlaneTypeDropper_AbNumber | integer | Yes | |
PlaneTypeDropper_Airborne | integer | Yes | |
PlaneTypeDropper_LandUT | integer | Yes | |
PlaneTypeDropper_LifeDur | integer | Yes | |
PlaneTypeDropper_Num | integer | No | |
PlaneTypeFighter_Num | integer | No | |
PlaneTypeFighter_Weapon | integer | Yes | |
PlayerDefeated | boolean | Yes | |
PrePlacedAirport | unit | Yes | |
PrePlacedHero | unit | Yes | |
Score_AirportsBuilt | integer | Yes | |
Score_BombsDropped | integer | Yes | |
Score_BombsHit | integer | Yes | |
Score_CCRazed | integer | Yes | |
Score_HeroKilled | integer | Yes | |
Score_HeroSpellCast | integer | Yes | |
Score_HouseRazed | integer | Yes | |
Score_NuclearLanded | integer | Yes | |
Score_NuclearUsed | integer | Yes | |
Score_PlanesBuilt | integer | Yes | |
Score_PlanesKilled | integer | Yes | |
Score_PlanesKilledCost | integer | Yes | |
Score_PlaneTypeBuild | integer | Yes | |
Score_Resources | integer | Yes | |
Score_RowValue | integer | Yes | |
Score_TowerRazed | integer | Yes | |
Score_TowerRazedCost | integer | Yes | |
Score_TowersBuilt | integer | Yes | |
Score_TowerTypeBuild | integer | Yes | |
ScoutTower | unit | Yes | |
ScoutTower_BuffNum | integer | No | 1 |
ScoutTower_DisabledId | integer | Yes | |
ScoutTower_Effect | unit | Yes | |
ScoutTower_InConstruction | boolean | Yes | |
SideAllience | force | No | |
SideHorde | force | No | |
Tech | integer | Yes | |
Tech_BuffNum | integer | No | |
Tech_Cost_1 | integer | Yes | |
Tech_Cost_2 | integer | Yes | |
TowerTypes | unitcode | Yes | |
TowerTypes_Icon | string | Yes | |
TowerTypes_Price | integer | Yes | |
TowerTypesNum | integer | No | |
TownWallTypes | destructablecode | Yes | |
TownWallTypesNum | integer | No | |
TrainPlaneTick | real | No | 0.10 |
TrainPlaneTimer | timer | No | |
WarpGateLoc | location | Yes |
function GetPlayerColorIndex takes integer nPlayerIndex returns integer
local playercolor pc = GetPlayerColor(Player(nPlayerIndex))
if ( pc == PLAYER_COLOR_RED ) then
return 0
elseif ( pc == PLAYER_COLOR_BLUE ) then
return 1
elseif ( pc == PLAYER_COLOR_CYAN ) then
return 2
elseif ( pc == PLAYER_COLOR_PURPLE ) then
return 3
elseif ( pc == PLAYER_COLOR_YELLOW ) then
return 4
elseif ( pc == PLAYER_COLOR_ORANGE ) then
return 5
elseif ( pc == PLAYER_COLOR_GREEN ) then
return 6
elseif ( pc == PLAYER_COLOR_PINK ) then
return 7
elseif ( pc == PLAYER_COLOR_LIGHT_GRAY ) then
return 8
elseif ( pc == PLAYER_COLOR_LIGHT_BLUE ) then
return 9
elseif ( pc == PLAYER_COLOR_AQUA ) then
return 10
elseif ( pc == PLAYER_COLOR_BROWN ) then
return 11
endif
return 0
endfunction
function GetColoredString takes integer nPlayerIndex, string str returns string
return udg_ColorString[GetPlayerColorIndex(nPlayerIndex)] + str + "|r"
endfunction
function GetColoredPlayerName takes integer nPlayerIndex returns string
return GetColoredString( nPlayerIndex, GetPlayerName(Player(nPlayerIndex)) )
endfunction
function InitColor takes nothing returns nothing
local integer nIndex = 0
set udg_ColorRed[nIndex] = 255
set udg_ColorGreen[nIndex] = 0
set udg_ColorBlue[nIndex] = 0
set udg_ColorString[nIndex] = "|cffff0000" //red
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 0
set udg_ColorGreen[nIndex] = 0
set udg_ColorBlue[nIndex] = 255
set udg_ColorString[nIndex] = "|cff0000ff" //blue
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 0
set udg_ColorGreen[nIndex] = 245
set udg_ColorBlue[nIndex] = 255
set udg_ColorString[nIndex] = "|cff00f5ff" //Teal
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 85
set udg_ColorGreen[nIndex] = 26
set udg_ColorBlue[nIndex] = 139
set udg_ColorString[nIndex] = "|cff551A8B" //Purple
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 255
set udg_ColorGreen[nIndex] = 255
set udg_ColorBlue[nIndex] = 0
set udg_ColorString[nIndex] = "|cffffff00" //Yellow
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 248
set udg_ColorGreen[nIndex] = 154
set udg_ColorBlue[nIndex] = 0
set udg_ColorString[nIndex] = "|cffEE9A00" //Orange
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 0
set udg_ColorGreen[nIndex] = 255
set udg_ColorBlue[nIndex] = 0
set udg_ColorString[nIndex] = "|cff00CD00" //Green
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 255
set udg_ColorGreen[nIndex] = 105
set udg_ColorBlue[nIndex] = 180
set udg_ColorString[nIndex] = "|cffFF69B4" //Pink
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 192
set udg_ColorGreen[nIndex] = 192
set udg_ColorBlue[nIndex] = 192
set udg_ColorString[nIndex] = "|cffC0C0C0" //Gray
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 176
set udg_ColorGreen[nIndex] = 226
set udg_ColorBlue[nIndex] = 255
set udg_ColorString[nIndex] = "|cffB0E2FF" //Light Blue
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 0
set udg_ColorGreen[nIndex] = 100
set udg_ColorBlue[nIndex] = 0
set udg_ColorString[nIndex] = "|cff006400" //Dark Green
set nIndex = nIndex + 1
set udg_ColorRed[nIndex] = 139
set udg_ColorGreen[nIndex] = 69
set udg_ColorBlue[nIndex] = 19
set udg_ColorString[nIndex] = "|cff8B4513" //Brown
endfunction
function ResetPlayerNameColor takes boolean bColored returns nothing
local integer nIndex = 0
loop
exitwhen nIndex >= 8
if ( bColored ) then
call SetPlayerName( Player(nIndex), GetColoredPlayerName( nIndex) )
else
call SetPlayerName( Player(nIndex), GetPlayerName(Player(nIndex)) )
endif
set nIndex = nIndex + 1
endloop
endfunction
//===========================================================================
function InitTrig_Color_Functions takes nothing returns nothing
endfunction
function GetPlayerTotalNum takes nothing returns integer
return udg__PLAYERTOTALNUMBER
endfunction
function GetEnemyForceId takes integer fp_nForceId returns integer
return 1 - fp_nForceId
endfunction
function GetPlayerForceId takes integer fp_nPlayer returns integer
return fp_nPlayer / (GetPlayerTotalNum()/2)
endfunction
function GetForcePlayer takes integer fp_nForceId returns player
return Player( (fp_nForceId+1) * GetPlayerTotalNum()/2 - 1 )
endfunction
function GetEnemyForcePlayer takes integer fp_nForceId returns player
return GetForcePlayer( GetEnemyForceId(fp_nForceId) )
endfunction
function GetPlayerForcePlayer takes player pl returns player
local integer nPlayerId
local integer nForceId
set nPlayerId = GetPlayerId( pl )
set nForceId = GetPlayerForceId( nPlayerId )
return GetForcePlayer( nForceId )
endfunction
function GetPlayerEnemyForcePlayer takes player pl returns player
local integer nPlayerId
local integer nForceId
set nPlayerId = GetPlayerId(pl)
set nForceId = GetPlayerForceId( nPlayerId )
return GetEnemyForcePlayer( nForceId )
endfunction
function IsSlotPlayer takes integer nPlayerIndex returns boolean
return GetPlayerController(Player(nPlayerIndex)) == MAP_CONTROL_USER and udg__ISSLOTPLAYER[nPlayerIndex]
endfunction
function IsPlayerDefeated takes integer fp_nPlayer returns boolean
return udg_PlayerDefeated[fp_nPlayer]
endfunction
function IsSlotCurrentPlayer takes integer nPlayerIndex returns boolean
return GetPlayerController(Player(nPlayerIndex)) == MAP_CONTROL_USER and GetPlayerSlotState(Player(nPlayerIndex)) == PLAYER_SLOT_STATE_PLAYING and not IsPlayerDefeated(nPlayerIndex)
endfunction
function GetForcePlayerNum takes integer fp_nForceId returns integer
local integer nNum
local integer nIndex
local integer nPlayerId
set nIndex = 0
set nPlayerId = fp_nForceId * GetPlayerTotalNum() / 2
set nNum = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()/2 - 1
if ( IsSlotPlayer(nPlayerId) ) then
set nNum = nNum + 1
endif
set nIndex = nIndex + 1
set nPlayerId = nPlayerId + 1
endloop
return nNum
endfunction
function GetForceCurrentPlayerNum takes integer fp_nForceId returns integer
local integer nNum
local integer nIndex
local integer nPlayerId
set nIndex = 0
set nPlayerId = fp_nForceId * GetPlayerTotalNum() / 2
set nNum = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()/2 - 1
if ( IsSlotCurrentPlayer(nPlayerId) ) then
set nNum = nNum + 1
endif
set nIndex = nIndex + 1
set nPlayerId = nPlayerId + 1
endloop
return nNum
endfunction
function GetPlayerGold takes integer fp_nPlayerIndex returns integer
return GetPlayerState(Player(fp_nPlayerIndex), PLAYER_STATE_RESOURCE_GOLD)
endfunction
function SetPlayerGold takes integer fp_nPlayerIndex, integer fp_nGold returns nothing
call SetPlayerState( Player(fp_nPlayerIndex), PLAYER_STATE_RESOURCE_GOLD, fp_nGold )
endfunction
function GetPlayerLumber takes integer fp_nPlayerIndex returns integer
return GetPlayerState(Player(fp_nPlayerIndex), PLAYER_STATE_RESOURCE_LUMBER)
endfunction
function SetPlayerLumber takes integer fp_nPlayerIndex, integer fp_nLumber returns nothing
call SetPlayerState( Player(fp_nPlayerIndex), PLAYER_STATE_RESOURCE_GOLD, fp_nLumber )
endfunction
function TakeMoneyFromPlayer takes integer fp_nPlayerIndex, integer fp_nGold returns boolean
local integer nCurGold
set nCurGold = GetPlayerGold( fp_nPlayerIndex )
if ( nCurGold < fp_nGold ) then
return false
endif
call SetPlayerGold( fp_nPlayerIndex, nCurGold - fp_nGold )
return true
endfunction
function GetSideArea takes integer fp_nPlayer returns rect
if ( fp_nPlayer <= 3 ) then
return gg_rct_Allience_Side
else
return gg_rct_Horde_Side
endif
endfunction
function IsForceDefeated takes integer fp_nForce returns boolean
local integer nPlayerId
local integer nPlayerIdEnd
if ( GetForceCurrentPlayerNum(fp_nForce) == 0 ) then
return true
endif
set nPlayerId = fp_nForce * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2 - 1
loop
exitwhen nPlayerId >= nPlayerIdEnd
if ( udg_Base[nPlayerId] != null and IsUnitAliveBJ(udg_Base[nPlayerId]) ) then
return false
endif
set nPlayerId = nPlayerId + 1
endloop
return true
endfunction
function PlayerLeft takes player fp_pl, boolean fp_bShowMessage returns nothing
local integer nPlayerId
local integer nPlayer
local integer nIndex
set nPlayerId = GetPlayerId(fp_pl)
if ( IsPlayerDefeated(nPlayerId) ) then
return
endif
if ( fp_bShowMessage ) then
call ShowMsgToAll( GetColoredPlayerName( nPlayerId ) + udg__STR_PLAYERLEFT )
endif
if ( udg_GameOver ) then
return
endif
set nPlayer = GetPlayerForceId(nPlayerId) * GetPlayerTotalNum() / 2
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()/2 - 1
if ( IsSlotCurrentPlayer(nPlayer) and nPlayer != nPlayerId ) then
call SetPlayerAllianceBJ( Player(nPlayerId), ALLIANCE_SHARED_CONTROL, true, Player(nPlayer) )
call SetPlayerAllianceBJ( Player(nPlayerId), ALLIANCE_SHARED_ADVANCED_CONTROL, true, Player(nPlayer) )
endif
set nIndex = nIndex + 1
set nPlayer = nPlayer + 1
endloop
call ConditionalTriggerExecute( gg_trg_Display_MultiBoard )
//System doesnt know that one player is leaving although an event has already been fired
//So the slot status is still playing
call TriggerSleepAction(0.1)
if ( IsForceDefeated(GetPlayerForceId(nPlayerId)) ) then
call ConditionalTriggerExecute( gg_trg_Function_CheckGameOver )
return
endif
endfunction
function InitPlayers takes nothing returns nothing
local integer nPlayerIndex
//if ( udg_ItsForDebug ) then
//set nPlayerIndex = 0
//loop
// exitwhen nPlayerIndex >= GetPlayerTotalNum()
// if ( IsSlotPlayer(nPlayerIndex) ) then
// call SetPlayerState( Player(nPlayerIndex), PLAYER_STATE_RESOURCE_GOLD, udg__PLAYERINITGOLD )
// call SetPlayerState( Player(nPlayerIndex), PLAYER_STATE_RESOURCE_LUMBER, udg__PLAYERINITLUMBER )
// call SetPlayerState( Player(nPlayerIndex), PLAYER_STATE_RESOURCE_FOOD_CAP, udg__AIRPORTCNT_INIT )
// endif
// set nPlayerIndex = nPlayerIndex + 1
// endloop
// return
// endif
//Defeated
//Pre placed base, airports and heroes
set nPlayerIndex = 0
loop
exitwhen nPlayerIndex >= GetPlayerTotalNum()
if ( not IsSlotPlayer(nPlayerIndex) ) then
// call PlayerLeft( Player(nPlayerIndex), false )
if ( udg_PrePlacedAirport[nPlayerIndex * 2] != null ) then
call RemoveUnit( udg_PrePlacedAirport[nPlayerIndex * 2] )
set udg_PrePlacedAirport[nPlayerIndex * 2] = null
endif
if ( udg_PrePlacedAirport[nPlayerIndex * 2 + 1] != null ) then
call RemoveUnit( udg_PrePlacedAirport[nPlayerIndex * 2 + 1] )
set udg_PrePlacedAirport[nPlayerIndex * 2 + 1] = null
endif
if ( udg_PrePlacedHero[nPlayerIndex] != null ) then
call RemoveUnit( udg_PrePlacedHero[nPlayerIndex] )
set udg_PrePlacedHero[nPlayerIndex] = null
endif
if ( udg_Base[nPlayerIndex] != null ) then
call RemoveUnit( udg_Base[nPlayerIndex] )
set udg_Base[nPlayerIndex] = null
endif
else
call SelectUnitForPlayerSingle( udg_PrePlacedHero[nPlayerIndex], Player(nPlayerIndex) )
endif
set nPlayerIndex = nPlayerIndex + 1
endloop
//Player resource
set nPlayerIndex = 0
loop
exitwhen nPlayerIndex >= GetPlayerTotalNum()
call SetPlayerState( Player(nPlayerIndex), PLAYER_STATE_RESOURCE_GOLD, udg__PLAYERINITGOLD )
call SetPlayerState( Player(nPlayerIndex), PLAYER_STATE_RESOURCE_LUMBER, udg__PLAYERINITLUMBER )
call SetPlayerState( Player(nPlayerIndex), PLAYER_STATE_RESOURCE_FOOD_CAP, udg__AIRPORTCNT_INIT )
set nPlayerIndex = nPlayerIndex + 1
endloop
endfunction
function TurnUnitIntoSheep takes unit fp_uUnit returns nothing
local unit uSheeper
call IssueImmediateOrder( fp_uUnit, "stop" )
set uSheeper = CreateUnit( Player(PLAYER_NEUTRAL_PASSIVE), 'n017', GetUnitX(fp_uUnit), GetUnitY(fp_uUnit), 0 )
call SetUnitPathing( uSheeper, false )
call UnitApplyTimedLife( uSheeper, 'BTLF', 5 )
call IssueTargetOrder( uSheeper, "polymorph", fp_uUnit )
endfunction
function TimedVision takes player fp_pl, location fp_locCenter, real fp_rRadius, real fp_rLast returns nothing
local fogmodifier fm
set fm = CreateFogModifierRadiusLocBJ( true, fp_pl, FOG_OF_WAR_VISIBLE, fp_locCenter, fp_rRadius )
call PolledWait( fp_rLast )
call DestroyFogModifier( fm )
endfunction
function IsThereEnemyInRangeFilter takes nothing returns boolean
return IsUnitAliveBJ(GetFilterUnit()) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING) and IsPlayerEnemy( GetOwningPlayer(GetFilterUnit()), bj_groupEnumOwningPlayer )
endfunction
function IsThereEnemyBombTargetInRange takes player fp_pl, location fp_locCenter, real fp_rRadius returns boolean
local group grp
local boolean bResult
set bj_groupEnumOwningPlayer = fp_pl
set grp = GetUnitsInRangeOfLocMatching( fp_rRadius, fp_locCenter, Filter(function IsThereEnemyInRangeFilter) )
set bResult = FirstOfGroup(grp) != null
call DestroyGroup( grp )
return bResult
endfunction
//===========================================================================
function InitTrig_Player_Related_Functions takes nothing returns nothing
endfunction
function UpdateCameras takes nothing returns nothing
local integer nPlayerIndex
//Adjust camera
//if ( not udg_ItsForDebug ) then
set nPlayerIndex = 0
loop
exitwhen nPlayerIndex >= GetPlayerTotalNum()
if ( IsSlotPlayer(nPlayerIndex) ) then
call SetCameraFieldForPlayer( Player(nPlayerIndex), CAMERA_FIELD_FIELD_OF_VIEW, 120.00, 0 )
endif
set nPlayerIndex = nPlayerIndex + 1
endloop
//endif
endfunction
function InitCameras takes nothing returns nothing
call UpdateCameras()
endfunction
//===========================================================================
function InitTrig_Camera_Functions takes nothing returns nothing
endfunction
//===========================================================================
function InitTrig_Initialization_Functions takes nothing returns nothing
endfunction
function IsUnitCommandCenter takes integer fp_nUT returns boolean
return fp_nUT == 'h000' or fp_nUT == 'h007' or fp_nUT == 'o00G' or fp_nUT == 'o00H'
endfunction
function GetBase takes integer fp_nPlayerIndex returns unit
return udg_Base[fp_nPlayerIndex]
endfunction
function TownHallBuild takes unit fp_uBuilder, integer fp_Building, location fp_Loc returns nothing
local player pl
local unit uBuilder
local rect rc
set pl = GetOwningPlayer( fp_uBuilder )
call TriggerSleepAction( 0 )
call IssueImmediateOrder( fp_uBuilder, "stop" )
set rc = GetSideArea( GetPlayerId(pl) )
if ( not IsLocationInRect(rc, fp_Loc) ) then
return
endif
set uBuilder = CreateUnitAtLoc( pl, 'n000', fp_Loc, bj_UNIT_FACING )
call IssuePointOrderByIdLoc( uBuilder, fp_Building, fp_Loc )
call TriggerSleepAction( 2.00 )
call RemoveUnit( uBuilder )
endfunction
function RearrangeCommandCenter takes integer fp_nForceId returns nothing
local integer nCount
local integer nPlayerId
local integer nPlayerIdEnd
local integer nIndex
set nCount = GetForcePlayerNum( fp_nForceId )
if ( nCount == 1 ) then
set nPlayerId = fp_nForceId * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2
loop
exitwhen nPlayerId >= nPlayerIdEnd
if ( udg_Base[nPlayerId] != null ) then
call SetUnitY( udg_Base[nPlayerId], udg__Y_CENTER )
call SetUnitY( udg_PrePlacedAirport[nPlayerId*2], udg__Y_CENTER )
call SetUnitY( udg_PrePlacedAirport[nPlayerId*2+1], udg__Y_CENTER )
call SetUnitY( udg_PrePlacedHero[nPlayerId], udg__Y_CENTER )
return
endif
set nPlayerId = nPlayerId + 1
endloop
elseif ( nCount == 2 ) then
set nIndex = 0
set nPlayerId = fp_nForceId * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2
loop
exitwhen nPlayerId >= nPlayerIdEnd
if ( udg_Base[nPlayerId] != null ) then
if ( nIndex == 0 ) then
call SetUnitY( udg_Base[nPlayerId], udg__Y_SOUTH )
call SetUnitY( udg_PrePlacedAirport[nPlayerId*2], udg__Y_SOUTH_AIRPORT )
call SetUnitY( udg_PrePlacedAirport[nPlayerId*2+1], udg__Y_SOUTH_AIRPORT )
call SetUnitY( udg_PrePlacedHero[nPlayerId], udg__Y_SOUTH )
elseif ( nIndex == 1 ) then
call SetUnitY( udg_Base[nPlayerId], udg__Y_NORTH )
call SetUnitY( udg_PrePlacedAirport[nPlayerId*2], udg__Y_NORTH_AIRPORT )
call SetUnitY( udg_PrePlacedAirport[nPlayerId*2+1], udg__Y_NORTH_AIRPORT )
call SetUnitY( udg_PrePlacedHero[nPlayerId], udg__Y_NORTH )
return
endif
set nIndex = nIndex + 1
endif
set nPlayerId = nPlayerId + 1
endloop
elseif ( nCount == 3 ) then
endif
endfunction
//===========================================================================
function InitTrig_Command_Center_Functions takes nothing returns nothing
endfunction
function IsBomberDamageSource takes integer fp_nUT returns boolean
return (fp_nUT == 'n001') or (fp_nUT == 'n00E')
endfunction
function GetBomberTypeNumber takes integer fp_nIndex returns integer
return udg_PlaneTypeBomber_Number[fp_nIndex]
endfunction
function SetBomberTypeNumber takes integer fp_nIndex, integer fp_nNumber returns nothing
set udg_PlaneTypeBomber_Number[fp_nIndex] = fp_nNumber
endfunction
function GetBomberTypeDropper takes integer fp_nIndex returns integer
return udg_PlaneTypeBomber_Dropper[fp_nIndex]
endfunction
function SetBomberTypeDropper takes integer fp_nIndex, integer fp_nDropperUT returns nothing
set udg_PlaneTypeBomber_Dropper[fp_nIndex] = fp_nDropperUT
endfunction
function GetBomberTypeDamager1 takes integer fp_nIndex returns integer
return udg_PlaneTypeBomber_Damager1[fp_nIndex]
endfunction
function SetBomberTypeDamager1 takes integer fp_nIndex, integer fp_nDamagerUT returns nothing
set udg_PlaneTypeBomber_Damager1[fp_nIndex] = fp_nDamagerUT
endfunction
function GetBomberTypeDamager2 takes integer fp_nIndex returns integer
return udg_PlaneTypeBomber_Damager2[fp_nIndex]
endfunction
function SetBomberTypeDamager2 takes integer fp_nIndex, integer fp_nDamagerUT returns nothing
set udg_PlaneTypeBomber_Damager2[fp_nIndex] = fp_nDamagerUT
endfunction
function GetBomberTypeRadius takes integer fp_nIndex returns real
return udg_PlaneTypeBomber_Radius[fp_nIndex]
endfunction
function SetBomberTypeRadius takes integer fp_nIndex, real fp_rRadius returns nothing
set udg_PlaneTypeBomber_Radius[fp_nIndex] = fp_rRadius
endfunction
function GetBomberTypeScale takes integer fp_nIndex returns real
return udg_PlaneTypeBomber_Scale[fp_nIndex]
endfunction
function SetBomberTypeScale takes integer fp_nIndex, real fp_rScale returns nothing
set udg_PlaneTypeBomber_Scale[fp_nIndex] = fp_rScale
endfunction
function GetBomberTypeTechType takes integer fp_nIndex returns integer
return udg_PlaneTypeBomber_TechType[fp_nIndex]
endfunction
function SetBomberTypeTechType takes integer fp_nIndex, integer fp_nTechType returns nothing
set udg_PlaneTypeBomber_TechType[fp_nIndex] = fp_nTechType
endfunction
function AddBomberType takes integer fp_nNumber, integer fp_nDropperUT, integer fp_nDamagerUT1, integer fp_nDamagerUT2, real fp_rRadius, real fp_rScale, integer fp_nTechType returns integer
call SetBomberTypeNumber( udg_PlaneTypeBomber_Num, fp_nNumber )
call SetBomberTypeDropper( udg_PlaneTypeBomber_Num, fp_nDropperUT )
call SetBomberTypeDamager1( udg_PlaneTypeBomber_Num, fp_nDamagerUT1 )
call SetBomberTypeDamager2( udg_PlaneTypeBomber_Num, fp_nDamagerUT2 )
call SetBomberTypeRadius( udg_PlaneTypeBomber_Num, fp_rRadius )
call SetBomberTypeScale( udg_PlaneTypeBomber_Num, fp_rScale )
call SetBomberTypeTechType( udg_PlaneTypeBomber_Num, fp_nTechType )
set udg_PlaneTypeBomber_Num = udg_PlaneTypeBomber_Num + 1
return udg_PlaneTypeBomber_Num - 1
endfunction
//===========================================================================
function InitTrig_Plane_Type_Bomber_Functions takes nothing returns nothing
endfunction
function GetFighterTypeWeapon takes integer fp_nIndex returns integer
return udg_PlaneTypeFighter_Weapon[fp_nIndex]
endfunction
function SetFighterTypeWeapon takes integer fp_nIndex, integer fp_nWeaponUT returns nothing
set udg_PlaneTypeFighter_Weapon[fp_nIndex] = fp_nWeaponUT
endfunction
function AddFighterType takes integer fp_nWeaponUT returns integer
call SetFighterTypeWeapon( udg_PlaneTypeFighter_Num, fp_nWeaponUT )
set udg_PlaneTypeFighter_Num = udg_PlaneTypeFighter_Num + 1
return udg_PlaneTypeFighter_Num - 1
endfunction
//===========================================================================
function InitTrig_Plane_Type_Fighter_Functions takes nothing returns nothing
endfunction
function GetDropperTypeAirborne takes integer fp_nIndex returns integer
return udg_PlaneTypeDropper_Airborne[fp_nIndex]
endfunction
function SetDropperTypeAirborne takes integer fp_nIndex, integer fp_nAirborneUT returns nothing
set udg_PlaneTypeDropper_Airborne[fp_nIndex] = fp_nAirborneUT
endfunction
function GetDropperTypeLandUT takes integer fp_nIndex returns integer
return udg_PlaneTypeDropper_LandUT[fp_nIndex]
endfunction
function SetDropperTypeLandUT takes integer fp_nIndex, integer fp_nLandUT returns nothing
set udg_PlaneTypeDropper_LandUT[fp_nIndex] = fp_nLandUT
endfunction
function GetDropperTypeAbNumber takes integer fp_nIndex returns integer
return udg_PlaneTypeDropper_AbNumber[fp_nIndex]
endfunction
function SetDropperTypeAbNumber takes integer fp_nIndex, integer fp_nAbNumber returns nothing
set udg_PlaneTypeDropper_AbNumber[fp_nIndex] = fp_nAbNumber
endfunction
function GetDropperTypeLifeDur takes integer fp_nIndex returns integer
return udg_PlaneTypeDropper_LifeDur[fp_nIndex]
endfunction
function SetDropperTypeLifeDur takes integer fp_nIndex, integer fp_nLifeDur returns nothing
set udg_PlaneTypeDropper_LifeDur[fp_nIndex] = fp_nLifeDur
endfunction
function AddDropperType takes integer fp_nAirborneUT, integer fp_nLandUT, integer fp_nAbNumber, integer fp_nLifeDur returns integer
call SetDropperTypeAirborne( udg_PlaneTypeDropper_Num, fp_nAirborneUT )
call SetDropperTypeLandUT( udg_PlaneTypeDropper_Num, fp_nLandUT )
call SetDropperTypeAbNumber( udg_PlaneTypeDropper_Num, fp_nAbNumber )
call SetDropperTypeLifeDur( udg_PlaneTypeDropper_Num, fp_nLifeDur )
set udg_PlaneTypeDropper_Num = udg_PlaneTypeDropper_Num + 1
return udg_PlaneTypeDropper_Num - 1
endfunction
function IsUnitAirborne takes integer fp_nUT returns boolean
return fp_nUT == 'z000' and fp_nUT == 'z001' and fp_nUT == 'h00F' and fp_nUT == 'h00G'
endfunction
//===========================================================================
function InitTrig_Plane_Type_Dropper_Functions takes nothing returns nothing
endfunction
function GetCarrierTypeCaster takes integer fp_nIndex returns integer
return udg_PlaneTypeCarrier_Caster[fp_nIndex]
endfunction
function SetCarrierTypeCaster takes integer fp_nIndex, integer fp_nCaster returns nothing
set udg_PlaneTypeCarrier_Caster[fp_nIndex] = fp_nCaster
endfunction
function GetCarrierTypeInterLife takes integer fp_nIndex returns real
return udg_PlaneTypeCarrier_InterLife[fp_nIndex]
endfunction
function SetCarrierTypeInterLife takes integer fp_nIndex, real fp_rSecond returns nothing
set udg_PlaneTypeCarrier_InterLife[fp_nIndex] = fp_rSecond
endfunction
function AddCarrierType takes integer fp_nCaster, real fp_rInterLife returns integer
call SetCarrierTypeCaster( udg_PlaneTypeCarrier_Num, fp_nCaster )
call SetCarrierTypeInterLife( udg_PlaneTypeCarrier_Num, fp_rInterLife )
set udg_PlaneTypeCarrier_Num = udg_PlaneTypeCarrier_Num + 1
return udg_PlaneTypeCarrier_Num - 1
endfunction
//===========================================================================
function InitTrig_Plane_Type_Carrier_Functions takes nothing returns nothing
endfunction
function GetPlaneTypesNumber takes nothing returns integer
return udg_PlaneType_Num
endfunction
function GetPlaneTypeIcon takes integer fp_nIndex returns string
return udg_PlaneType_Icon[fp_nIndex]
endfunction
function SetPlaneTypeIcon takes integer fp_nIndex, string fp_strIcon returns nothing
set udg_PlaneType_Icon[fp_nIndex] = fp_strIcon
endfunction
function GetPlaneTypeUnitType takes integer fp_nIndex returns integer
return udg_PlaneType_UnitType[fp_nIndex]
endfunction
function SetPlaneTypeUnitType takes integer fp_nIndex, integer fp_nPlaneTypeUnitType returns nothing
set udg_PlaneType_UnitType[fp_nIndex] = fp_nPlaneTypeUnitType
endfunction
function GetPlaneTypeCategory takes integer fp_nIndex returns integer
return udg_PlaneType_Category[fp_nIndex]
endfunction
function SetPlaneTypeCategory takes integer fp_nIndex, integer fp_nCategory returns nothing
set udg_PlaneType_Category[fp_nIndex] = fp_nCategory
endfunction
function GetPlaneTypeCategoryDataId takes integer fp_nIndex returns integer
return udg_PlaneType_CatDataId[fp_nIndex]
endfunction
function SetPlaneTypeCategoryDataId takes integer fp_nIndex, integer fp_nCatDataId returns nothing
set udg_PlaneType_CatDataId[fp_nIndex] = fp_nCatDataId
endfunction
function GetPlaneTypeActionRange takes integer fp_nIndex returns real
return udg_PlaneType_ActionRange[fp_nIndex]
endfunction
function SetPlaneTypeActionRange takes integer fp_nIndex, real fp_rPlaneTypeActionRange returns nothing
set udg_PlaneType_ActionRange[fp_nIndex] = fp_rPlaneTypeActionRange
endfunction
function GetPlaneTypeBuildTime takes integer fp_nIndex returns integer
return udg_PlaneType_BuildTime[fp_nIndex]
endfunction
function SetPlaneTypeBuildTime takes integer fp_nIndex, integer fp_nPlaneTypeBuildTime returns nothing
set udg_PlaneType_BuildTime[fp_nIndex] = fp_nPlaneTypeBuildTime
endfunction
function GetPlaneTypeBuildId takes integer fp_nIndex returns integer
return udg_PlaneType_BuildId[fp_nIndex]
endfunction
function SetPlaneTypeBuildId takes integer fp_nIndex, integer fp_nBuildId returns nothing
set udg_PlaneType_BuildId[fp_nIndex] = fp_nBuildId
endfunction
function GetPlaneTypeBuildIdNoTarget takes integer fp_nIndex returns integer
return udg_PlaneType_BuildIdNoTarget[fp_nIndex]
endfunction
function SetPlaneTypeBuildIdNoTarget takes integer fp_nIndex, integer fp_nBuildIdNoTarget returns nothing
set udg_PlaneType_BuildIdNoTarget[fp_nIndex] = fp_nBuildIdNoTarget
endfunction
function IsPlaneTypeOneShot takes integer fp_nIndex returns boolean
return udg_PlaneType_OneShot[fp_nIndex]
endfunction
function SetPlaneTypeOneShot takes integer fp_nIndex, boolean fp_bOneShot returns nothing
set udg_PlaneType_OneShot[fp_nIndex] = fp_bOneShot
endfunction
function GetPlaneTypeOrderId takes integer fp_nIndex returns integer
return udg_PlaneType_OrderId[fp_nIndex]
endfunction
function SetPlaneTypeOrderId takes integer fp_nIndex, integer fp_nOrderId returns nothing
set udg_PlaneType_OrderId[fp_nIndex] = fp_nOrderId
endfunction
function GetPlaneTypeActionTime takes integer fp_nIndex returns integer
return udg_PlaneType_ActionTime[fp_nIndex]
endfunction
function SetPlaneTypeActionTime takes integer fp_nIndex, integer fp_nPlaneTypeActionTime returns nothing
set udg_PlaneType_ActionTime[fp_nIndex] = fp_nPlaneTypeActionTime
endfunction
function GetPlaneTypeFlyHeight takes integer fp_nIndex returns integer
return udg_PlaneType_FlyHeight[fp_nIndex]
endfunction
function SetPlaneTypeFlyHeight takes integer fp_nIndex, integer fp_nFlyHeight returns nothing
set udg_PlaneType_FlyHeight[fp_nIndex] = fp_nFlyHeight
endfunction
function GetPlaneTypePrice takes integer fp_nIndex returns integer
return udg_PlaneType_Price[fp_nIndex]
endfunction
function SetPlaneTypePrice takes integer fp_nIndex, integer fp_nPrice returns nothing
set udg_PlaneType_Price[fp_nIndex] = fp_nPrice
endfunction
function GetPlaneTypeBomberNumber takes integer fp_nIndex returns integer
return GetBomberTypeNumber( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeBomberDropper takes integer fp_nIndex returns integer
return GetBomberTypeDropper( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeBomberDamager1 takes integer fp_nIndex returns integer
return GetBomberTypeDamager1( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeBomberDamager2 takes integer fp_nIndex returns integer
return GetBomberTypeDamager2( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeBomberRadius takes integer fp_nIndex returns real
return GetBomberTypeRadius( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeBomberScale takes integer fp_nIndex returns real
return GetBomberTypeScale( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeBomberTechType takes integer fp_nIndex returns integer
return GetBomberTypeTechType( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeFighterWeapon takes integer fp_nIndex returns integer
return GetFighterTypeWeapon( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeDropperAirborne takes integer fp_nIndex returns integer
return GetDropperTypeAirborne( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeDropperLandUT takes integer fp_nIndex returns integer
return GetDropperTypeLandUT( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeDropperAbNumber takes integer fp_nIndex returns integer
return GetDropperTypeAbNumber( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeDropperLifeDur takes integer fp_nIndex returns integer
return GetDropperTypeLifeDur( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeCarrierCaster takes integer fp_nIndex returns integer
return GetCarrierTypeCaster( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeCarrierInterLife takes integer fp_nIndex returns real
return GetCarrierTypeInterLife( GetPlaneTypeCategoryDataId(fp_nIndex) )
endfunction
function GetPlaneTypeIndex takes integer fp_nUnitType returns integer
local integer nIndex
set nIndex = 0
loop
exitwhen nIndex >= udg_PlaneType_Num
if ( fp_nUnitType == GetPlaneTypeUnitType(nIndex) ) then
return nIndex
endif
set nIndex = nIndex + 1
endloop
return -1
endfunction
function GetPlaneTypeIndexByBuildId takes integer fp_nBuildId returns integer
local integer nIndex
set nIndex = 0
loop
exitwhen nIndex >= udg_PlaneType_Num
if ( fp_nBuildId == GetPlaneTypeBuildId(nIndex) ) then
return nIndex
endif
set nIndex = nIndex + 1
endloop
return -1
endfunction
function InitPlaneTypes takes nothing returns nothing
set udg_PlaneType_Num = 0
//Basic bomber
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h001' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNFlyingMachine.tga" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 8 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A000' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00A' )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("absorb") )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 500 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 0 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(1, 'n001', 'n004', 'n004', 20, 1, udg__BOMBERTECHTYPE_NORMAL) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Heavy bomber
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h00O' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNBlackDragon.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 14 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A01E' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A01F' )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("berserk") )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 450 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 50 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(1, 'n001', 'n00W', 'n00W', 20, 2, udg__BOMBERTECHTYPE_NORMAL) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Cluster bomber
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h004' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNWindSerpent.tga" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 14 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A008' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00B' )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("ambush") )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 500 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 70 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(6, 'n00E', 'n00A', 'n015', 200, 1, udg__BOMBERTECHTYPE_CLUSTER) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Fighter
set udg__FIGHTER_ROTATIONRADIUS = 900.
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h002' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNFaerieDragon.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 15 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A001' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00D' )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("acidbomb") )
call SetPlaneTypeActionRange( udg_PlaneType_Num, udg__FIGHTER_ROTATIONRADIUS + 300 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 60 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 80 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_FIGHTER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddFighterType('A002') )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Marine Dropper
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h003' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNChaosSpaceOrc.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A005' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00C' )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("acolyteharvest") )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 100 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 10 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 100 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_DROPPER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddDropperType('z000', 'z001', 2, 35) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Incendiary bomber
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h009' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNMarkOfFire.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A00L' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00M' )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("animatedead") )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 800 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 12 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 200 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(1, 'n00F', 'n00R', 'n00R', 100, 2, udg__BOMBERTECHTYPE_INCENDARY) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Freezing bomber
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h00B' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNFrostWyrm.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 16 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A00P' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00Q' )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("antimagicshell") )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 500 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 100 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(1, 0, 'n00H', 'n00H', 400, 2, udg__BOMBERTECHTYPE_FREEZING) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Stealth bomber
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h00D' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNShade.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 14 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A00R' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00T' )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("banish") )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 450 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 60 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(1, 'n001', 'n00O', 'n00O', 20, 2, udg__BOMBERTECHTYPE_STEALTH) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Heavy Cluster bomber
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h00E' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNNetherDragon.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A00U' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00V' )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("barkskin") )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 500 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 150 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(8, 'n001', 'n00P', 'n016', 200, 1, udg__BOMBERTECHTYPE_CLUSTER) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Carrier
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h005' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNBloodElfSupplyWagon.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 25 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A00J' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00K' )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("ancestralspirit") )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 0 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 60 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 300 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_CARRIER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddCarrierType('n006', 1.5) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Stealth Tank Dropper
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h00H' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNSeigeEngine.blp" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 40 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 'A00W' )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 'A00X' )
call SetPlaneTypeOneShot( udg_PlaneType_Num, false )
call SetPlaneTypeOrderId( udg_PlaneType_Num, OrderId("battleroar") )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 100 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 10 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 450 )
call SetPlaneTypePrice( udg_PlaneType_Num, 500 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_DROPPER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddDropperType('h00G', 'h00F', 1, 70) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
//Nuclear Bomber
set udg__NUCLEARBOMBER_ID = udg_PlaneType_Num
call SetPlaneTypeUnitType( udg_PlaneType_Num, 'h00P' )
call SetPlaneTypeIcon( udg_PlaneType_Num, "ReplaceableTextures\\CommandButtons\\BTNUndeadAirBarge.tga" )
call SetPlaneTypeBuildTime( udg_PlaneType_Num, 60 )
call SetPlaneTypeBuildId( udg_PlaneType_Num, 0 )
call SetPlaneTypeBuildIdNoTarget( udg_PlaneType_Num, 0 )
call SetPlaneTypeOrderId( udg_PlaneType_Num, 0 )
call SetPlaneTypeOneShot( udg_PlaneType_Num, true )
call SetPlaneTypeActionRange( udg_PlaneType_Num, 500 )
call SetPlaneTypeActionTime( udg_PlaneType_Num, 20 )
call SetPlaneTypeFlyHeight( udg_PlaneType_Num, 600 )
call SetPlaneTypePrice( udg_PlaneType_Num, 2000 )
call SetPlaneTypeCategory( udg_PlaneType_Num, udg__PLANECATEGORY_BOMBER )
call SetPlaneTypeCategoryDataId( udg_PlaneType_Num, AddBomberType(1, 'n011', 'n00Y', 'n00Y', 0, 4, udg__BOMBERTECHTYPE_NUCLEAR) )
set udg_PlaneType_Num = udg_PlaneType_Num + 1
endfunction
//===========================================================================
function InitTrig_Plane_Type_Functions takes nothing returns nothing
endfunction
function GetAirportBuffNum takes nothing returns integer
return udg_Airport_BuffNum
endfunction
function IsUnitAirport takes integer fp_nUnitType returns boolean
return fp_nUnitType == 'n002' or fp_nUnitType == 'n00V'
endfunction
function IsValidAirportIndex takes integer fp_nIndex returns boolean
return fp_nIndex < GetAirportBuffNum() and fp_nIndex >= 1
endfunction
function GetAirportIndex takes unit fp_uAirport returns integer
return GetUnitUserData( fp_uAirport )
endfunction
function GetAirport takes integer fp_nIndex returns unit
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return null
endif
return udg_Airport[fp_nIndex]
endfunction
function SetAirport takes integer fp_nIndex, unit fp_uAirport returns nothing
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return
endif
set udg_Airport[fp_nIndex] = fp_uAirport
call SetUnitUserData( fp_uAirport, fp_nIndex )
endfunction
function GetAirportTarget takes integer fp_nIndex returns location
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return null
endif
return udg_Airport_Targets[fp_nIndex]
endfunction
function SetAirportTarget takes integer fp_nIndex, location fp_locTarget returns nothing
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return
endif
call ShowDebugMsgLocation( "Airport locTarget", fp_locTarget )
if ( fp_locTarget == null ) then
if ( udg_Airport_Targets[fp_nIndex] != null ) then
call RemoveLocation( udg_Airport_Targets[fp_nIndex] )
set udg_Airport_Targets[fp_nIndex] = null
endif
else
if ( udg_Airport_Targets[fp_nIndex] == null ) then
set udg_Airport_Targets[fp_nIndex] = Location(0,0)
endif
call MoveLocation( udg_Airport_Targets[fp_nIndex], GetLocationX(fp_locTarget), GetLocationY(fp_locTarget) )
endif
endfunction
function GetAirportTraining takes integer fp_nIndex returns integer
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return 0
endif
return udg_Airport_Training[fp_nIndex]
endfunction
function SetAirportTraining takes integer fp_nIndex, integer fp_nPlaneId returns nothing
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return
endif
set udg_Airport_Training[fp_nIndex] = fp_nPlaneId
endfunction
function IsAirportTraining takes integer fp_nIndex returns boolean
return GetAirportTarget(fp_nIndex) != null and GetAirportTraining(fp_nIndex) >= 0
endfunction
function GetAirportTrainingCount takes integer fp_nIndex returns real
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return 0
endif
return udg_Airport_TrainingCount[fp_nIndex]
endfunction
function SetAirportTrainingCount takes integer fp_nIndex, real fp_rTrainingCount returns nothing
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return
endif
set udg_Airport_TrainingCount[fp_nIndex] = fp_rTrainingCount
endfunction
function GetAirportTrainingPlane takes integer fp_nIndex returns integer
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return null
endif
return udg_Airport_TrainingPlane[fp_nIndex]
endfunction
function SetAirportTrainingPlane takes integer fp_nIndex, integer fp_nPlane returns nothing
if ( not IsValidAirportIndex( fp_nIndex ) ) then
return
endif
set udg_Airport_TrainingPlane[fp_nIndex] = fp_nPlane
endfunction
function GetAirportTrainingBar takes integer fp_nIndex returns texttag
return udg_Airport_TBar[fp_nIndex]
endfunction
function SetAirportTrainingBar takes integer fp_nIndex, texttag fp_tb returns nothing
if ( udg_Airport_TBar[fp_nIndex] != null ) then
call DestroyTextTag( udg_Airport_TBar[fp_nIndex] )
endif
set udg_Airport_TBar[fp_nIndex] = fp_tb
endfunction
function IsAirportWarpGating takes integer fp_nIndex returns boolean
return udg_Airport_WarpGating[fp_nIndex]
endfunction
function SetAirportWarpGating takes integer fp_nIndex, boolean fp_bWarpGating returns nothing
set udg_Airport_WarpGating[fp_nIndex] = fp_bWarpGating
endfunction
function AddAirport takes unit fp_uAirport returns integer
local integer nIndex = 1
loop
exitwhen nIndex >= udg_Airport_BuffNum
exitwhen GetAirport(nIndex) == null
set nIndex = nIndex + 1
endloop
call SetUnitUserData( fp_uAirport, nIndex )
if ( nIndex == udg_Airport_BuffNum ) then
set udg_Airport_BuffNum = udg_Airport_BuffNum + 1
endif
call SetAirport( nIndex, fp_uAirport )
call SetAirportTarget( nIndex, null )
call SetAirportTraining( nIndex, -1 )
call SetAirportTrainingCount( nIndex, -1 )
call SetAirportTrainingPlane( nIndex, -1 )
call SetAirportTrainingBar( nIndex, null )
call SetAirportWarpGating( nIndex, false )
return nIndex
endfunction
function RemoveAirport takes integer fp_nIndex returns nothing
local texttag tt
call SetAirport( fp_nIndex, null )
call SetAirportTarget( fp_nIndex, null )
call SetAirportTrainingBar( fp_nIndex, null )
endfunction
function AirportUp takes unit fp_uAirport returns nothing
local integer nPTIndex
local location locFT
local texttag tt
local integer nAPId
call ShowDebugMsg( "AirportUp 1" )
call UnitAddAbility( fp_uAirport, 'A003' ) //Set Fly Target
set nPTIndex = 0
loop
exitwhen nPTIndex >= GetPlaneTypesNumber()
if ( not IsPlaneTypeOneShot(nPTIndex) ) then
call UnitAddAbility( fp_uAirport, GetPlaneTypeBuildIdNoTarget(nPTIndex) )
endif
set nPTIndex = nPTIndex + 1
endloop
set nAPId = AddAirport( fp_uAirport )
call ShowDebugMsg( "AirportUp 3" )
set locFT = Location( GetUnitX(fp_uAirport) - 140, GetUnitY(fp_uAirport) )
set tt = CreateTextTagLocForPlayer( GetOwningPlayer(fp_uAirport), udg__STR_AIRPORTFLOATINGTEXT, locFT, 200.00, 10, 100, 100, 100, 0 )
call RemoveLocation( locFT )
if ( tt == null ) then
call ShowDebugMsg( "Airport Up tt = null" )
return
endif
call SetTextTagPermanent( tt, true )
call SetTextTagVelocity( tt, 0, 0 )
call SetAirportTrainingBar( nAPId, tt )
call ShowDebugMsg( "AirportUp 4" )
endfunction
function AirportDown takes unit fp_uAirport returns nothing
local integer nIndex
set nIndex = GetUnitUserData( fp_uAirport )
if ( not IsValidAirportIndex(nIndex) ) then
call ShowAssertMsg( "AirportDown", "Invalid Airport index." )
return
endif
if ( IsAirportTraining(nIndex) ) then
set udg_Fun_CancelTrainingPlane_P1 = nIndex
set udg_Fun_CancelTrainingPlane_P2 = false
call TriggerExecute( gg_trg_Function_CancelTrainingPlane )
endif
call RemoveAirport( nIndex )
endfunction
function AirportSelected takes player fp_pl, unit fp_uAirport returns nothing
local player plAirport
local integer nAPId
local location locTarget
set plAirport = GetOwningPlayer( fp_uAirport )
if ( fp_pl != plAirport ) then
return
endif
if ( not IsUnitAirport(GetUnitTypeId(fp_uAirport)) ) then
return
endif
set nAPId = GetAirportIndex( fp_uAirport )
if ( not IsValidAirportIndex(nAPId) ) then
call ShowAssertMsg( "AirportSelected", "Invalid Airport index." )
return
endif
set locTarget = GetAirportTarget( nAPId )
if ( locTarget == null ) then
return
endif
call PingMinimapForPlayerEx( fp_pl, GetLocationX(locTarget), GetLocationY(locTarget), 1, 255, 255, 255, false )
endfunction
function InitAirports takes nothing returns nothing
local group grp
local unit u
set grp = GetUnitsOfTypeIdAll( 'n002' )
loop
set u = FirstOfGroup( grp )
exitwhen u == null
call GroupRemoveUnit( grp, u )
if ( IsUnitAliveBJ(u) ) then
call AirportUp( u )
endif
endloop
call DestroyGroup( grp )
set grp = GetUnitsOfTypeIdAll( 'n00V' )
loop
set u = FirstOfGroup( grp )
exitwhen u == null
call GroupRemoveUnit( grp, u )
if ( IsUnitAliveBJ(u) ) then
call AirportUp( u )
endif
endloop
call DestroyGroup( grp )
endfunction
//===========================================================================
function InitTrig_Airport_Functions takes nothing returns nothing
endfunction
function GetPlaneBuffNum takes nothing returns integer
return udg_Plane_BuffNum
endfunction
function IsValidPlaneIndex takes integer fp_nIndex returns boolean
return fp_nIndex < GetPlaneBuffNum() and fp_nIndex >= 0
endfunction
function GetPlaneIndex takes unit fp_uPlane returns integer
return GetUnitUserData( fp_uPlane )
endfunction
function GetPlane takes integer fp_nPlaneId returns unit
return udg_Plane[fp_nPlaneId]
endfunction
function SetPlane takes integer fp_nPlaneId, unit fp_uPlane returns nothing
set udg_Plane[fp_nPlaneId] = fp_uPlane
endfunction
function GetPlanePlayerId takes integer fp_nPlaneId returns integer
return udg_Plane_PlayerId[fp_nPlaneId]
endfunction
function SetPlanePlayerId takes integer fp_nPlaneId, integer nPlayerId returns nothing
set udg_Plane_PlayerId[fp_nPlaneId] = nPlayerId
endfunction
function GetPlaneAirport takes integer fp_nPlaneId returns integer
return udg_Plane_Airport[fp_nPlaneId]
endfunction
function SetPlaneAirport takes integer fp_nPlaneId, integer fp_nAirportId returns nothing
set udg_Plane_Airport[fp_nPlaneId] = fp_nAirportId
endfunction
function GetPlaneState takes integer fp_nPlaneId returns integer
return udg_Plane_State[fp_nPlaneId]
endfunction
function SetPlaneState takes integer fp_nPlaneId, integer fp_nState returns nothing
set udg_Plane_State[fp_nPlaneId] = fp_nState
endfunction
function GetPlaneTarget takes integer fp_nPlaneId returns location
return udg_Plane_Target[fp_nPlaneId]
endfunction
function SetPlaneTarget takes integer fp_nPlaneId, location fp_locTarget returns nothing
if ( fp_locTarget == null ) then
if ( udg_Plane_Target[fp_nPlaneId] != null ) then
call RemoveLocation( udg_Plane_Target[fp_nPlaneId] )
set udg_Plane_Target[fp_nPlaneId] = null
endif
else
if ( udg_Plane_Target[fp_nPlaneId] == null ) then
set udg_Plane_Target[fp_nPlaneId] = Location(0,0)
endif
call MoveLocation( udg_Plane_Target[fp_nPlaneId], GetLocationX(fp_locTarget), GetLocationY(fp_locTarget) )
endif
endfunction
function GetPlaneTargetSign takes integer fp_nPlaneId returns unit
return udg_Plane_TargetSign[fp_nPlaneId]
endfunction
function SetPlaneTargetSign takes integer fp_nPlaneId, unit fp_uSign returns nothing
set udg_Plane_TargetSign[fp_nPlaneId] = fp_uSign
endfunction
function GetPlaneDirection takes integer fp_nPlaneId returns real
return udg_Plane_Direction[fp_nPlaneId]
endfunction
function SetPlaneDirection takes integer fp_nPlaneId, real rDir returns nothing
set udg_Plane_Direction[fp_nPlaneId] = rDir
endfunction
function GetPlaneFlyTick takes integer fp_nPlaneId returns integer
return udg_Plane_FlyTick[fp_nPlaneId]
endfunction
function SetPlaneFlyTick takes integer fp_nPlaneId, integer fp_nTick returns nothing
set udg_Plane_FlyTick[fp_nPlaneId] = fp_nTick
endfunction
function GetPlaneActionTick takes integer fp_nPlaneId returns integer
return udg_Plane_ActionTick[fp_nPlaneId]
endfunction
function SetPlaneActionTick takes integer fp_nPlaneId, integer fp_nTick returns nothing
set udg_Plane_ActionTick[fp_nPlaneId] = fp_nTick
endfunction
function GetPlaneActionDone takes integer fp_nPlaneId returns boolean
return udg_Plane_ActionDone[fp_nPlaneId]
endfunction
function SetPlaneActionDone takes integer fp_nPlaneId, boolean fp_bActionDone returns nothing
set udg_Plane_ActionDone[fp_nPlaneId] = fp_bActionDone
endfunction
function GetPlaneInMagneticField takes integer fp_nPlaneId returns boolean
return udg_Plane_InMagneticField[fp_nPlaneId]
endfunction
function SetPlaneInMagneticField takes integer fp_nPlaneId, boolean fp_bMF returns nothing
set udg_Plane_InMagneticField[fp_nPlaneId] = fp_bMF
endfunction
function GetPlaneIncScoreId takes integer fp_nIndex returns integer
return udg_Plane_IncScoreId[fp_nIndex]
endfunction
function SetPlaneIncScoreId takes integer fp_nIndex, integer fp_nScoreId returns nothing
set udg_Plane_IncScoreId[fp_nIndex] = fp_nScoreId
endfunction
function AddPlane takes unit fp_uPlane, integer fp_nAirportId returns integer
local integer nPlaneId
set nPlaneId = 0
loop
exitwhen nPlaneId >= udg_Plane_BuffNum
exitwhen GetPlane(nPlaneId) == null
set nPlaneId = nPlaneId + 1
endloop
call SetPlane( nPlaneId, fp_uPlane )
call SetPlaneAirport( nPlaneId, fp_nAirportId )
call SetPlaneState( nPlaneId, udg__PLANESTATE_BUILDING )
call SetPlaneTarget( nPlaneId, null )
call SetPlaneTargetSign( nPlaneId, null )
call SetPlaneActionTick( nPlaneId, -1 )
call SetPlaneActionDone( nPlaneId, false )
call SetPlanePlayerId( nPlaneId, GetPlayerId(GetOwningPlayer(GetAirport(fp_nAirportId))) )
call SetPlaneInMagneticField( nPlaneId, false )
call SetUnitUserData( fp_uPlane, nPlaneId )
if ( nPlaneId == udg_Plane_BuffNum ) then
set udg_Plane_BuffNum = udg_Plane_BuffNum + 1
endif
return nPlaneId
endfunction
function RemovePlane takes integer fp_nPlaneId returns nothing
call SetPlane( fp_nPlaneId, null )
call SetPlaneTarget( fp_nPlaneId, null )
if ( GetPlaneTargetSign(fp_nPlaneId) != null ) then
call RemoveUnit( GetPlaneTargetSign(fp_nPlaneId) )
endif
endfunction
function IsUnitPlane takes unit fp_unit returns boolean
return GetUnitPointValue(fp_unit) == udg__POINTVALUE_PLANE
endfunction
function PlaneDies takes unit fp_uPlane, unit fp_uKiller returns nothing
local integer nPlaneId
local player pl
local integer nUT
local integer nPTId
if ( not IsUnitPlane(fp_uPlane) ) then
return
endif
set nPlaneId = GetPlaneIndex( fp_uPlane )
if ( not IsValidPlaneIndex(nPlaneId) ) then
return
endif
call RemovePlane( nPlaneId )
//Add score to killer
if ( fp_uKiller == null ) then
return
endif
set pl = GetOwningPlayer( fp_uKiller )
set udg_Fun_AddScorePlanesKilled_Pl = GetPlayerId(pl)
call TriggerExecute( gg_trg_Function_AddScorePlanesKilled )
set udg_Fun_AddScorePlanesKilledCost_1 = GetPlayerId(GetOwningPlayer(fp_uPlane))
set nUT = GetUnitTypeId( fp_uPlane )
set nPTId = GetPlaneTypeIndex( nUT )
set udg_Fun_AddScorePlanesKilledCost_2 = GetPlaneTypePrice( nPTId )
call TriggerExecute( gg_trg_Function_AddScorePlanesKilledCost )
endfunction
//===========================================================================
function InitTrig_Plane_Functions takes nothing returns nothing
endfunction
function GetNuclearBomber takes integer fp_nPlayer returns unit
return udg_NuclearBomber[fp_nPlayer]
endfunction
function SetNuclearBomber takes integer fp_nPlayer, unit fp_uBomber returns nothing
set udg_NuclearBomber[fp_nPlayer] = fp_uBomber
endfunction
function GetNuclearBomberCaster takes integer fp_nPlayer returns unit
return udg_NuclearBomber_Caster[fp_nPlayer]
endfunction
function SetNuclearBomberCaster takes integer fp_nPlayer, unit fp_uCaster returns nothing
set udg_NuclearBomber_Caster[fp_nPlayer] = fp_uCaster
endfunction
function GetNuclearBomberTarget takes integer fp_nPlayer returns location
return udg_NuclearBomber_Target[fp_nPlayer]
endfunction
function SetNuclearBomberTarget takes integer fp_nPlayer, location fp_locTarget returns nothing
if ( fp_locTarget == null ) then
if ( udg_NuclearBomber_Target[fp_nPlayer] != null ) then
call RemoveLocation( udg_NuclearBomber_Target[fp_nPlayer] )
set udg_NuclearBomber_Target[fp_nPlayer] = null
endif
else
if ( udg_NuclearBomber_Target[fp_nPlayer] == null ) then
set udg_NuclearBomber_Target[fp_nPlayer] = Location(0,0)
endif
call MoveLocation( udg_NuclearBomber_Target[fp_nPlayer], GetLocationX(fp_locTarget), GetLocationY(fp_locTarget) )
endif
endfunction
function GetNuclearBomberStage takes integer fp_nPlayer returns integer
return udg_NuclearBomber_Stage[fp_nPlayer]
endfunction
function SetNuclearBomberStage takes integer fp_nPlayer, integer fp_nStage returns nothing
set udg_NuclearBomber_Stage[fp_nPlayer] = fp_nStage
endfunction
function GetNuclearBomberTick takes integer fp_nPlayer returns integer
return udg_NuclearBomber_Tick[fp_nPlayer]
endfunction
function SetNuclearBomberTick takes integer fp_nPlayer, integer fp_nTick returns nothing
set udg_NuclearBomber_Tick[fp_nPlayer] = fp_nTick
endfunction
function GetNuclearBomberEffectOrigin takes integer fp_nPlayer returns effect
return udg_NuclearBomber_EffectOrigin[fp_nPlayer]
endfunction
function SetNuclearBomberEffectOrigin takes integer fp_nPlayer, effect fp_effect returns nothing
local effect eff
set eff = GetNuclearBomberEffectOrigin( fp_nPlayer )
if ( eff != null ) then
call DestroyEffect( eff )
endif
set udg_NuclearBomber_EffectOrigin[fp_nPlayer] = fp_effect
endfunction
function GetNuclearBomberWorkerIndex takes integer fp_nPlayer, integer fp_nWorkerIndex returns integer
return fp_nPlayer * udg__NUCLEARCREAT_WORKERNUM + fp_nWorkerIndex
endfunction
function GetNuclearBomberWorkerBottom takes integer fp_nPlayer, integer fp_nWorkerIndex returns unit
return udg_NuclearBomber_WorkerB[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)]
endfunction
function SetNuclearBomberWorkerBottom takes integer fp_nPlayer, integer fp_nWorkerIndex, unit fp_uWorker returns nothing
set udg_NuclearBomber_WorkerB[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)] = fp_uWorker
endfunction
function GetNuclearBomberWorkerTop takes integer fp_nPlayer, integer fp_nWorkerIndex returns unit
return udg_NuclearBomber_WorkerT[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)]
endfunction
function SetNuclearBomberWorkerTop takes integer fp_nPlayer, integer fp_nWorkerIndex, unit fp_uWorker returns nothing
set udg_NuclearBomber_WorkerT[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)] = fp_uWorker
endfunction
function GetNuclearBomberWorkerTHeight takes integer fp_nPlayer returns real
return udg_NuclearBomber_WorkerTHeight[fp_nPlayer]
endfunction
function SetNuclearBomberWorkerTHeight takes integer fp_nPlayer, real fp_rHeight returns nothing
set udg_NuclearBomber_WorkerTHeight[fp_nPlayer] = fp_rHeight
endfunction
function GetNuclearBomberLightning takes integer fp_nPlayer, integer fp_nWorkerIndex returns lightning
return udg_NuclearBomber_Lightning[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)]
endfunction
function SetNuclearBomberLightning takes integer fp_nPlayer, integer fp_nWorkerIndex, lightning fp_lightning returns nothing
local lightning l
set l = GetNuclearBomberLightning( fp_nPlayer, fp_nWorkerIndex )
if ( l != null ) then
call DestroyLightning( l )
endif
set udg_NuclearBomber_Lightning[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)] = fp_lightning
endfunction
function GetNuclearBomberCeiling takes integer fp_nPlayer, integer fp_nWorkerIndex returns lightning
return udg_NuclearBomber_Ceiling[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)]
endfunction
function SetNuclearBomberCeiling takes integer fp_nPlayer, integer fp_nWorkerIndex, lightning fp_lightning returns nothing
local lightning l
set l = GetNuclearBomberCeiling( fp_nPlayer, fp_nWorkerIndex )
if ( l != null ) then
call DestroyLightning( l )
endif
set udg_NuclearBomber_Ceiling[GetNuclearBomberWorkerIndex(fp_nPlayer, fp_nWorkerIndex)] = fp_lightning
endfunction
function GetNuclearBomberCeilingLen takes integer fp_nPlayer returns real
return udg_NuclearBomber_CeilingLen[fp_nPlayer]
endfunction
function SetNuclearBomberCeilingLen takes integer fp_nPlayer, real fp_rLen returns nothing
set udg_NuclearBomber_CeilingLen[fp_nPlayer] = fp_rLen
endfunction
function RemoveNuclearBomber takes integer fp_nPlayer returns nothing
local integer nIndex
call RemoveUnit( GetNuclearBomber(fp_nPlayer) )
call SetNuclearBomber( fp_nPlayer, null )
call SetNuclearBomberStage( fp_nPlayer, udg__NUCLEAR_STAGE_NO )
call SetNuclearBomberTarget( fp_nPlayer, null )
call SetNuclearBomberEffectOrigin( fp_nPlayer, null )
set nIndex = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
call SetNuclearBomberLightning( fp_nPlayer, nIndex, null )
call SetNuclearBomberCeiling( fp_nPlayer, nIndex, null )
call KillUnit( GetNuclearBomberWorkerTop(fp_nPlayer, nIndex) )
call SetNuclearBomberWorkerTop( fp_nPlayer, nIndex, null )
call KillUnit( GetNuclearBomberWorkerBottom(fp_nPlayer, nIndex) )
call SetNuclearBomberWorkerBottom( fp_nPlayer, nIndex, null )
set nIndex = nIndex + 1
endloop
endfunction
function StartBuildingNuclearBomber takes unit fp_uHero, location fp_locTarget returns nothing
local unit uBomber
local player pl
local integer nPlayerId
local location locCaster
local real rFacing
local integer nBomberId
local location loc
local unit uWorkerBottom
local lightning l
local integer nIndex
local real rAngle
set pl = GetOwningPlayer( fp_uHero )
set nPlayerId = GetPlayerId( pl )
if ( GetNuclearBomberStage(nPlayerId) != udg__NUCLEAR_STAGE_NO ) then
return
endif
set locCaster = GetUnitLoc( fp_uHero )
set rFacing = AngleBetweenPoints( locCaster, fp_locTarget )
//Create Bomber
set uBomber = CreateUnitAtLoc( pl, 'h00Q', locCaster, rFacing )
call SetUnitVertexColor( uBomber, 0, 0, 0, 0 )
call SetUnitFlyHeight( uBomber, 900, 900 )
call SetNuclearBomber( nPlayerId, uBomber )
call SetNuclearBomberCaster( nPlayerId, fp_uHero )
call SetNuclearBomberTarget( nPlayerId, fp_locTarget )
set loc = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, 0 )
call RemoveLocation( locCaster )
set uWorkerBottom = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00I', loc, 0 )
call RemoveLocation( loc )
call SetUnitPathing( uWorkerBottom, false )
call SetNuclearBomberWorkerBottom( nPlayerId, 0, uWorkerBottom )
call SetNuclearBomberStage( nPlayerId, udg__NUCLEAR_STAGE_WORKERB )
call SetNuclearBomberTick( nPlayerId, 0 )
call SetNuclearBomberEffectOrigin( nPlayerId, AddSpecialEffectTarget( "Abilities\\Spells\\Orc\\Voodoo\\VoodooAura.mdl", fp_uHero, "origin" ) )
endfunction
function NuclearAttack takes unit fp_uHero, location fp_locTarget returns nothing
local integer nPlayerIndex
set nPlayerIndex = GetPlayerId( GetOwningPlayer(fp_uHero) )
//if ( not TakeMoneyFromPlayer(nPlayerIndex, GetPlaneTypePrice(udg__NUCLEARBOMBER_ID) ) ) then
// call ShowWarningMsg( Player(nPlayerIndex), udg__STR_NOMONEYFORNUCLEAR )
// return
//endif
call StartBuildingNuclearBomber( fp_uHero, fp_locTarget )
endfunction
function NuclearBomberStageWorkerB takes integer fp_nPlayerId returns nothing
local integer nTick
local integer nIndex
local unit uCaster
local unit uWorker
local unit uWorkerPre
local location locPre
local location loc
local location locCaster
local unit uEffect
set nTick = GetNuclearBomberTick( fp_nPlayerId )
if ( ModuloInteger(nTick, udg__NUCLEAR_STAGE_WORKERB_TICKMAX/udg__NUCLEARCREAT_WORKERNUM) != 0 ) then
return
endif
set nIndex = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
set uWorker = GetNuclearBomberWorkerBottom( fp_nPlayerId, nIndex )
if ( uWorker == null ) then
set uWorkerPre = GetNuclearBomberWorkerBottom( fp_nPlayerId, nIndex - 1 )
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
set locCaster = GetUnitLoc( uCaster )
set locPre = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, (nIndex - 1) * 360 / udg__NUCLEARCREAT_WORKERNUM )
set uWorker = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00I', locPre, 0 )
call SetUnitPathing( uWorker, false )
call RemoveLocation( locPre )
set loc = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, nIndex * 360 / udg__NUCLEARCREAT_WORKERNUM )
call RemoveLocation( locCaster )
call IssuePointOrderLoc( uWorker, "move", loc )
call RemoveLocation( loc )
call SetNuclearBomberWorkerBottom( fp_nPlayerId, nIndex, uWorker )
exitwhen true
endif
set nIndex = nIndex + 1
endloop
endfunction
function FinishNuclearStageWorkerB takes integer fp_nPlayerId returns nothing
local integer nIndex
local real rAngle
local unit uCaster
local unit uWorker
local unit uWorkerPre
local location locPre
local location loc
local location locCaster
local unit uWorkerBottom
local unit array uWorkerTop
local lightning l
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
set locCaster = GetUnitLoc( uCaster )
set nIndex = 0
set rAngle = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
set loc = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, rAngle )
set uWorkerTop[nIndex] = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00J', loc, 0 )
call SetUnitPathing( uWorkerTop[nIndex], false )
call SetNuclearBomberWorkerTop( fp_nPlayerId, nIndex, uWorkerTop[nIndex] )
set uWorkerBottom = GetNuclearBomberWorkerBottom( fp_nPlayerId, nIndex )
set l = AddLightningEx( "AFOD", true, GetLocationX(loc)-20, GetLocationY(loc)-10, GetUnitFlyHeight(uWorkerBottom), GetLocationX(loc)-20, GetLocationY(loc)-10, GetUnitFlyHeight(uWorkerTop[nIndex]) )
call SetNuclearBomberLightning( fp_nPlayerId, nIndex, l )
call RemoveLocation( loc )
set nIndex = nIndex + 1
set rAngle = rAngle + 360 / udg__NUCLEARCREAT_WORKERNUM
endloop
call RemoveLocation( locCaster )
call SetNuclearBomberWorkerTHeight( fp_nPlayerId, GetUnitFlyHeight(uWorkerTop[0]) )
//Order worker going up
set nIndex = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
call SetUnitFlyHeight( uWorkerTop[nIndex], 500, 200 )
set nIndex = nIndex + 1
endloop
endfunction
function NuclearBomberStageWorkerT takes integer fp_nPlayerId returns nothing
local integer nIndex
local unit uWorkerB
local unit uWorkerT
local real rHeight
set rHeight = GetNuclearBomberWorkerTHeight( fp_nPlayerId ) + 10
call SetNuclearBomberWorkerTHeight( fp_nPlayerId, rHeight )
set nIndex = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
set uWorkerB = GetNuclearBomberWorkerBottom( fp_nPlayerId, nIndex )
set uWorkerT = GetNuclearBomberWorkerTop( fp_nPlayerId, nIndex )
call MoveLightningEx( GetNuclearBomberLightning(fp_nPlayerId, nIndex), true, GetUnitX(uWorkerB)-20, GetUnitY(uWorkerB)-10, GetUnitFlyHeight(uWorkerB), GetUnitX(uWorkerT)-20, GetUnitY(uWorkerT)-10, rHeight )
set nIndex = nIndex + 1
endloop
endfunction
function FinishNuclearStageWorkerT takes integer fp_nPlayerId returns nothing
local integer nIndex
local real rAngle
local unit uCaster
local location loc
local location loc1
local location locCaster
local unit uWorker
local lightning l
local real rLen
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
set locCaster = GetUnitLoc( uCaster )
set rLen = udg__NUCLEARCREAT_RADIUS - 10
call SetNuclearBomberCeilingLen( fp_nPlayerId, rLen )
set nIndex = 0
set rAngle = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
set loc = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, rAngle )
set loc1 = PolarProjectionBJ( locCaster, rLen, rAngle )
set uWorker = GetNuclearBomberWorkerTop( fp_nPlayerId, nIndex )
set l = AddLightningEx( "AFOD", true, GetLocationX(loc)-20, GetLocationY(loc)-10, GetUnitFlyHeight(uWorker), GetLocationX(loc1)-20, GetLocationY(loc1)-10, GetUnitFlyHeight(uWorker) )
call SetNuclearBomberCeiling( fp_nPlayerId, nIndex, l )
call RemoveLocation( loc )
call RemoveLocation( loc1 )
set nIndex = nIndex + 1
set rAngle = rAngle + 360 / udg__NUCLEARCREAT_WORKERNUM
endloop
call RemoveLocation( locCaster )
call SetNuclearBomberCeilingLen( fp_nPlayerId, rLen )
call ShowDebugMsg( "end of FinishNuclearStageWorkerT" )
endfunction
function NuclearBomberStageCeiling takes integer fp_nPlayerId returns nothing
local integer nIndex
local real rAngle
local lightning l
local real rLen
local unit uCaster
local location locCaster
local location loc
local location loc1
local real rHeight
set rLen = GetNuclearBomberCeilingLen( fp_nPlayerId ) - 10
call SetNuclearBomberCeilingLen( fp_nPlayerId, rLen )
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
set locCaster = GetUnitLoc( uCaster )
set rHeight = GetUnitFlyHeight( GetNuclearBomberWorkerTop(fp_nPlayerId, 0) )
set nIndex = 0
set rAngle = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
set loc = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, rAngle )
set loc1 = PolarProjectionBJ( locCaster, rLen, rAngle )
call MoveLightningEx( GetNuclearBomberCeiling(fp_nPlayerId, nIndex), true, GetLocationX(loc)-20, GetLocationY(loc)-10, rHeight, GetLocationX(loc1)-20, GetLocationY(loc1)-10, rHeight )
call RemoveLocation( loc )
call RemoveLocation( loc1 )
set nIndex = nIndex + 1
set rAngle = rAngle + 360. / udg__NUCLEARCREAT_WORKERNUM
endloop
call RemoveLocation( locCaster )
endfunction
function FinishNuclearBomberStageCeiling takes integer fp_nPlayerId returns nothing
local unit uEffect
local unit uCaster
local location locCaster
return
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
set locCaster = GetUnitLoc( uCaster )
set uEffect = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00X', locCaster, 0 )
call SetUnitPathing( uEffect, false )
call UnitApplyTimedLife( uEffect, 'BTLF', 4 )
call RemoveLocation( locCaster )
endfunction
function NuclearBomberStageRotate takes integer fp_nPlayerId returns nothing
local integer nTick
local real rSpeed
local integer nIndex
local real rAngle
local lightning l
local real rLen
local unit uCaster
local location locCaster
local location loc
local location locB
local location locT
local location locC
local real rHeight
local unit uWorkerT
local unit uWorkerB
local unit uEffect
local integer nNum
local integer nValue
local real rValue
local unit uBomber
local real rHeight
local real g = 10
set nTick = GetNuclearBomberTick( fp_nPlayerId )
set rSpeed = nTick / 10
if ( rSpeed > 10 ) then
set rSpeed = 10
endif
set rLen = GetNuclearBomberCeilingLen( fp_nPlayerId )
set rHeight = GetUnitFlyHeight( GetNuclearBomberWorkerTop(fp_nPlayerId, 0) )
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
set locCaster = GetUnitLoc( uCaster )
set nIndex = 0
set rAngle = 0
loop
exitwhen nIndex >= udg__NUCLEARCREAT_WORKERNUM
set uWorkerB = GetNuclearBomberWorkerBottom(fp_nPlayerId, nIndex)
set uWorkerT = GetNuclearBomberWorkerTop(fp_nPlayerId, nIndex)
set loc = GetUnitLoc( uWorkerB )
set rAngle = AngleBetweenPoints( locCaster, loc )
if ( nTick < 50 ) then
set rAngle = rAngle + rSpeed * ( nTick / 50. )
else
set rAngle = rAngle + rSpeed
endif
set locB = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, rAngle )
set loc = GetUnitLoc( uWorkerT )
set rAngle = AngleBetweenPoints( locCaster, loc ) + rSpeed
set locT = PolarProjectionBJ( locCaster, udg__NUCLEARCREAT_RADIUS, rAngle )
set locC = PolarProjectionBJ( locCaster, rLen, rAngle )
call SetUnitPositionLoc( uWorkerB, locB )
call SetUnitPositionLoc( uWorkerT, locT )
call MoveLightningEx( GetNuclearBomberLightning(fp_nPlayerId, nIndex), true, GetLocationX(locB)-20, GetLocationY(locB)-10, GetUnitFlyHeight(uWorkerB), GetLocationX(locT)-20, GetLocationY(locT)-10, rHeight )
call MoveLightningEx( GetNuclearBomberCeiling(fp_nPlayerId, nIndex), true, GetLocationX(locT)-20, GetLocationY(locT)-10, rHeight, GetLocationX(locC)-20, GetLocationY(locC)-10, rHeight )
call RemoveLocation( loc )
call RemoveLocation( locB )
call RemoveLocation( locT )
call RemoveLocation( locC )
//call SetUnitFacing( GetNuclearBomber(fp_nPlayerId), GetUnitFacing(GetNuclearBomber(fp_nPlayerId)) + rSpeed )
set nIndex = nIndex + 1
endloop
call RemoveLocation( locCaster )
if ( ModuloInteger(nTick, 8) == 0 ) then
set uBomber = GetNuclearBomber( fp_nPlayerId )
set nValue = 255 * (nTick + 200) / 600
call SetUnitVertexColor( uBomber, nValue, nValue, nValue, nValue )
//set rValue = I2R((nTick + 400)* 2) / 800
//call SetUnitScale( GetNuclearBomber(fp_nPlayerId), rValue, rValue, rValue )
if ( nTick > 60 and nTick <= 240 ) then
call SetUnitFlyHeight( uBomber, 0, g * 0.4 * (nTick/8) )
elseif ( nTick > 240 ) then
call SetUnitFlyHeight( uBomber, 500, 975 - nTick * 3.25 )
endif
endif
endfunction
function FinishNuclearBomberStageRotate takes integer fp_nPlayerId returns nothing
local unit uCaster
local location locCaster
local unit uEffect
local integer nPlaneId
local real rAngle
local location locTargetFurther
local unit uPlane
local integer nPTId
local unit uTarget
local integer nPlayerId
local string strNuclear
local fogmodifier array fm
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
set locCaster = GetUnitLoc( uCaster )
set uEffect = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00X', locCaster, 0 )
call SetUnitPathing( uEffect, false )
call UnitApplyTimedLife( uEffect, 'BTLF', 4 )
call TriggerSleepAction( 3 )
set uEffect = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00U', locCaster, 0 )
call SetUnitPathing( uEffect, false )
call UnitApplyTimedLife( uEffect, 'BTLF', 4 )
set uPlane = GetNuclearBomber(fp_nPlayerId)
call RemoveUnit( uPlane )
call SetNuclearBomber( fp_nPlayerId, null )
set rAngle = AngleBetweenPoints( locCaster, GetNuclearBomberTarget(fp_nPlayerId) )
set uPlane = CreateUnitAtLoc( Player(fp_nPlayerId), GetPlaneTypeUnitType(udg__NUCLEARBOMBER_ID), locCaster, rAngle )
set nPlaneId = AddPlane( uPlane, -1 )
call SetPlanePlayerId( nPlaneId, fp_nPlayerId )
call SetPlaneTarget( nPlaneId, GetNuclearBomberTarget(fp_nPlayerId) )
call SetPlaneState( nPlaneId, udg__PLANESTATE_FLYING )
call SetPlaneFlyTick( nPlaneId, 0 )
call SetPlaneDirection( nPlaneId, rAngle )
//Create target sign
set uTarget = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00T', GetNuclearBomberTarget(fp_nPlayerId), bj_UNIT_FACING )
call SetPlaneTargetSign( nPlaneId, uTarget )
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
set fm[nPlayerId] = CreateFogModifierRadiusLocBJ( true, Player(nPlayerId), FOG_OF_WAR_VISIBLE, GetNuclearBomberTarget(fp_nPlayerId), 640 )
set nPlayerId = nPlayerId + 1
endloop
set locTargetFurther = PolarProjectionBJ( locCaster, 1000, rAngle )
call IssuePointOrderLoc( uPlane, "move", locTargetFurther )
call RemoveLocation( locTargetFurther )
set nPTId = GetPlaneTypeIndex( GetUnitTypeId(uPlane) )
call SetUnitFlyHeight( uPlane, GetPlaneTypeFlyHeight(nPTId), 50.00 )
call RemoveLocation( locCaster )
call RemoveNuclearBomber( fp_nPlayerId )
//Score
set udg_Fun_AddScoreNuclearUsed_Pl = fp_nPlayerId
call TriggerExecute( gg_trg_Function_AddScoreNuclearUsed )
//Nuclear Launch Detected
call PlaySoundBJ( gg_snd_nuclear )
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
if ( IsSlotPlayer(nPlayerId) ) then
if ( IsPlayerEnemy(Player(nPlayerId), Player(fp_nPlayerId)) ) then
set strNuclear = "|cffff0000"
else
set strNuclear = "|cff00ffff"
endif
set strNuclear = strNuclear + GetPlayerName(Player(fp_nPlayerId)) + udg__STR_NUCLEARLAUNCHED + "|r"
call DisplayTimedTextToPlayer( Player(nPlayerId), 0, 0, 20, strNuclear )
endif
set nPlayerId = nPlayerId + 1
endloop
//Destroy target sign vision modifier
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
call DestroyFogModifier( fm[nPlayerId] )
set nPlayerId = nPlayerId + 1
endloop
endfunction
function NuclearBomberCreateSingle takes integer fp_nPlayerId returns nothing
local unit uCaster
local integer nStage
local integer nTick
local integer nWorkerIndex
local unit uWorkerB
local unit uWorkerT
local real rHeight
set uCaster = GetNuclearBomberCaster( fp_nPlayerId )
if ( uCaster == null or IsUnitDeadBJ(uCaster) ) then
call RemoveNuclearBomber( fp_nPlayerId )
return
endif
set nStage = GetNuclearBomberStage( fp_nPlayerId )
set nTick = GetNuclearBomberTick( fp_nPlayerId )
if ( nStage == udg__NUCLEAR_STAGE_WORKERB ) then
if ( nTick >= udg__NUCLEAR_STAGE_WORKERB_TICKMAX ) then
call SetNuclearBomberStage( fp_nPlayerId, nStage + 1 )
call SetNuclearBomberTick( fp_nPlayerId, 0 )
call FinishNuclearStageWorkerB( fp_nPlayerId )
else
call NuclearBomberStageWorkerB( fp_nPlayerId )
call SetNuclearBomberTick( fp_nPlayerId, nTick + 1 )
endif
elseif ( nStage == udg__NUCLEAR_STAGE_WORKERT ) then
if ( nTick >= udg__NUCLEAR_STAGE_WORKERT_TICKMAX ) then
call SetNuclearBomberStage( fp_nPlayerId, nStage + 1 )
call SetNuclearBomberTick( fp_nPlayerId, 0 )
call FinishNuclearStageWorkerT( fp_nPlayerId )
else
call NuclearBomberStageWorkerT( fp_nPlayerId )
call SetNuclearBomberTick( fp_nPlayerId, nTick + 1 )
endif
elseif ( nStage == udg__NUCLEAR_STAGE_CEILING ) then
if ( nTick >= udg__NUCLEAR_STAGE_CEILING_TICKMAX ) then
call SetNuclearBomberStage( fp_nPlayerId, nStage + 1 )
call SetNuclearBomberTick( fp_nPlayerId, 0 )
call FinishNuclearBomberStageCeiling( fp_nPlayerId )
else
call NuclearBomberStageCeiling( fp_nPlayerId )
call SetNuclearBomberTick( fp_nPlayerId, nTick + 1 )
endif
elseif ( nStage == udg__NUCLEAR_STAGE_ROTATE ) then
if ( nTick >= udg__NUCLEAR_STAGE_ROTATE_TICKMAX ) then
call SetNuclearBomberStage( fp_nPlayerId, udg__NUCLEAR_STAGE_NO )
call SetNuclearBomberTick( fp_nPlayerId, 0 )
call FinishNuclearBomberStageRotate( fp_nPlayerId )
else
call NuclearBomberStageRotate( fp_nPlayerId )
call SetNuclearBomberTick( fp_nPlayerId, nTick + 1 )
endif
endif
endfunction
function NuclearBomberTimerExpires takes nothing returns nothing
local integer nPlayerId
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
if ( IsSlotPlayer(nPlayerId) and GetNuclearBomberStage(nPlayerId) > udg__NUCLEAR_STAGE_NO ) then
call NuclearBomberCreateSingle( nPlayerId )
endif
set nPlayerId = nPlayerId + 1
endloop
endfunction
//===========================================================================
function InitTrig_Nuclear_Bomb_Functions takes nothing returns nothing
endfunction
function ReroutePlane takes integer fp_nPlaneId returns nothing
local unit uPlane
local location locPlane
local location locTarget
local real rDir
local real rDir1
local real rDis
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
if ( GetPlaneState(fp_nPlaneId) != udg__PLANESTATE_FLYING ) then
return
endif
set locPlane = GetUnitLoc( uPlane )
set locTarget = GetAirportTarget(GetPlaneAirport(fp_nPlaneId))
set rDir = AngleBetweenPoints( locPlane, locTarget )
set rDir1 = rDir - GetPlaneDirection(fp_nPlaneId)
set rDir1 = ModuloReal( rDir1, 360 )
call ShowDebugMsg( "rDir1 = " + R2S(rDir1) )
if ( rDir1 > 45 and rDir1 < 315 ) then
call RemoveLocation( locPlane )
return
endif
set rDis = DistanceBetweenPoints( locPlane, GetPlaneTarget(fp_nPlaneId) )
call RemoveLocation( locPlane )
if ( rDis < 200 ) then
return
endif
call SetPlaneTarget( fp_nPlaneId, locTarget )
call SetPlaneDirection( fp_nPlaneId, rDir )
call SetPlaneFlyTick( fp_nPlaneId, 4 )
endfunction
function AirportChangeRoute takes integer fp_nAPId returns nothing
local integer nPlaneId
set nPlaneId = 0
loop
exitwhen nPlaneId >= GetPlaneBuffNum()
if ( GetPlaneAirport( nPlaneId ) == fp_nAPId ) then
call ReroutePlane( nPlaneId )
endif
set nPlaneId = nPlaneId + 1
endloop
endfunction
function CreateAirportTrainingBar takes integer fp_nAPIndex returns nothing
local unit uAirport
local location loc
local texttag tt
set uAirport = GetAirport( fp_nAPIndex )
if ( uAirport == null ) then
return
endif
set loc = Location( GetUnitX(uAirport) - 170, GetUnitY(uAirport) )
set tt = CreateTextTagLocForFriend( GetOwningPlayer(uAirport), "", loc, 200.00, 10, 100, 100, 100, 0 )
call RemoveLocation( loc )
call SetTextTagPermanent( tt, true )
call SetAirportTrainingBar( fp_nAPIndex, tt )
endfunction
function FormatAirportTrainingBar takes integer fp_n returns string
local string str = ""
if ( fp_n <= 0 ) then
return str
endif
loop
exitwhen fp_n < 10
if ( udg__TempBarStyle == 0 ) then
set str = str + "''''''''''"
else
set str = str + "||||||||||||||||||||"
endif
set fp_n = fp_n - 10
endloop
loop
exitwhen fp_n <= 0
if ( udg__TempBarStyle == 0 ) then
set str = str + "'"
else
set str = str + "||"
endif
set fp_n = fp_n - 1
endloop
return str
endfunction
function UpdateAirportTrainingBar takes integer fp_nAPId, integer fp_nTick, integer fp_nTickMax returns nothing
local texttag tt
local integer nProgress
local integer nLen
local string strTT1
local string strTT2
set tt = GetAirportTrainingBar( fp_nAPId )
if ( tt == null ) then
call CreateAirportTrainingBar( fp_nAPId )
set tt = GetAirportTrainingBar( fp_nAPId )
if ( tt == null ) then
call ShowDebugMsg( "text tag == null" )
return
endif
endif
set nLen = R2I(I2R(fp_nTickMax) / udg__AP_TRAININGBAR_MAXTICK * udg__AP_TRAININGBAR_MAXLEN)
set nProgress = R2I(I2R(nLen) / fp_nTickMax * fp_nTick)
set strTT1 = "" + FormatAirportTrainingBar( nProgress )
set strTT2 = FormatAirportTrainingBar( nLen - nProgress ) + ""
call SetTextTagText( tt, "|cff0080c0" + strTT1 + "|r|cffc0c0c0" + strTT2 + "|r", 0.023 )
endfunction
function FakeAirportToRemoveLag takes nothing returns nothing
local integer nPTId
set nPTId = 0
loop
exitwhen nPTId >= GetPlaneTypesNumber()
if ( not IsPlaneTypeOneShot(nPTId) ) then
call UnitRemoveAbility( udg_FakeAirport[0], GetPlaneTypeBuildIdNoTarget(nPTId) )
call UnitAddAbility( udg_FakeAirport[0], GetPlaneTypeBuildId(nPTId) )
call UnitRemoveAbility( udg_FakeAirport[1], GetPlaneTypeBuildIdNoTarget(nPTId) )
call UnitAddAbility( udg_FakeAirport[1], GetPlaneTypeBuildId(nPTId) )
endif
set nPTId = nPTId + 1
endloop
call RemoveUnit( udg_FakeAirport[0] )
call RemoveUnit( udg_FakeAirport[1] )
endfunction
function AirportBombTarget takes unit fp_uAirport, location fp_locTarget returns nothing
local integer nIndex
local integer nPTId
local integer nPlaneId
local unit uPlane
local location locAirport
local location locTarget
local real rAngle
local texttag tt
if ( not IsUnitAirport(GetUnitTypeId(fp_uAirport)) ) then
return
endif
set nIndex = GetAirportIndex( fp_uAirport )
if ( not IsValidAirportIndex(nIndex) ) then
return
endif
if ( GetAirportTarget(nIndex) == null ) then
call SetAirportTrainingBar( nIndex, null )
call CreateAirportTrainingBar( nIndex )
set nPTId = 0
loop
exitwhen nPTId >= GetPlaneTypesNumber()
if ( not IsPlaneTypeOneShot(nPTId) ) then
call UnitRemoveAbility( fp_uAirport, GetPlaneTypeBuildIdNoTarget(nPTId) )
call UnitAddAbility( fp_uAirport, GetPlaneTypeBuildId(nPTId) )
endif
set nPTId = nPTId + 1
endloop
call SetAirportTarget( nIndex, fp_locTarget )
call TriggerSleepAction(0.1)
call IssuePointOrderLoc( fp_uAirport, "setrally", fp_locTarget )
return
endif
call SetAirportTarget( nIndex, fp_locTarget )
set nPTId = GetAirportTraining(nIndex)
if ( nPTId < 0 ) then
call IssueImmediateOrderById( fp_uAirport, GetPlaneTypeOrderId(0) )
return
endif
set nPlaneId = GetAirportTrainingPlane( nIndex )
if ( nPlaneId >= 0 ) then
set uPlane = GetPlane( nPlaneId )
set locAirport = GetUnitLoc( fp_uAirport )
set locTarget = GetAirportTarget( nIndex )
set rAngle = AngleBetweenPoints( locAirport, locTarget )
call RemoveLocation( locAirport )
call SetUnitFacing( uPlane, rAngle )
endif
call TriggerSleepAction(0.1)
call IssueImmediateOrderById( fp_uAirport, GetPlaneTypeOrderId(nPTId) )
call AirportChangeRoute( nIndex )
endfunction
function CreatePlane takes integer fp_nAPIndex returns integer
local integer nPTIndex
local player pl
local integer nPlayerId
local location locAirport
local location locTarget
local real rAngle
local unit uPlane
local unit uAirport
local integer nPlaneUT
local texttag tt
local integer nPlaneId
set uAirport = GetAirport( fp_nAPIndex )
set pl = GetOwningPlayer( uAirport )
set nPlayerId = GetPlayerId( pl )
set nPTIndex = GetAirportTraining( fp_nAPIndex )
set nPlaneUT = GetPlaneTypeUnitType( nPTIndex )
if ( not TakeMoneyFromPlayer(nPlayerId, GetPlaneTypePrice(nPTIndex)) ) then
//call IssueImmediateOrderById( uAirport, GetPlaneTypeOrderId(0) )
set tt = GetAirportTrainingBar( fp_nAPIndex )
call SetTextTagText( tt, udg__STR_AIRPORTWAITFORMONEY, 0.023 )
call SetAirportTrainingPlane( fp_nAPIndex, -1 )
return -1
endif
set locAirport = GetUnitLoc( uAirport )
set locTarget = GetAirportTarget( fp_nAPIndex )
set rAngle = AngleBetweenPoints( locAirport, locTarget )
set uPlane = CreateUnitAtLoc( pl, nPlaneUT, locAirport, rAngle )
call RemoveLocation( locAirport )
call SetUnitPathing( uPlane, false )
call SetUnitInvulnerable( uPlane, true )
call UnitAddAbility( uPlane, 'Aloc' )
set nPlaneId = AddPlane( uPlane, fp_nAPIndex )
call SetAirportTrainingPlane( fp_nAPIndex, nPlaneId )
call SetPlaneState( nPlaneId, udg__PLANESTATE_BUILDING )
call ShowDebugMsg( "CreatePlane ended here" )
return nPlaneId
endfunction
function ReplacePlane takes integer fp_nAPIndex, integer fp_nPTIdNew returns integer
local integer nPTIndex
local player pl
local integer nPlayerId
local location locAirport
local location locTarget
local real rAngle
local unit uPlane
local unit uAirport
local integer nPlaneUT
local integer nPlaneId
set uAirport = GetAirport( fp_nAPIndex )
set pl = GetOwningPlayer( uAirport )
set nPlayerId = GetPlayerId( pl )
set nPTIndex = GetAirportTraining( fp_nAPIndex )
if ( not TakeMoneyFromPlayer(nPlayerId, GetPlaneTypePrice(fp_nPTIdNew) - GetPlaneTypePrice(nPTIndex)) ) then
return
endif
set nPlaneId = GetAirportTrainingPlane( fp_nAPIndex )
set uPlane = GetPlane( nPlaneId )
if ( uPlane != null ) then
call RemoveUnit( uPlane )
else
call ShowAssertMsg( "ReplacePlane", "old plane is invalid" )
endif
set locAirport = GetUnitLoc( uAirport )
set locTarget = GetAirportTarget( fp_nAPIndex )
set rAngle = AngleBetweenPoints( locAirport, locTarget )
set nPlaneUT = GetPlaneTypeUnitType( fp_nPTIdNew )
set uPlane = CreateUnitAtLoc( pl, nPlaneUT, locAirport, rAngle )
call RemoveLocation( locAirport )
call SetUnitPathing( uPlane, false )
call SetUnitInvulnerable( uPlane, true )
call UnitAddAbility( uPlane, 'Aloc' )
call SetPlane( nPlaneId, uPlane )
call SetAirportTraining( fp_nAPIndex, fp_nPTIdNew )
call SetAirportTrainingPlane( fp_nAPIndex, nPlaneId )
call SetPlaneState( nPlaneId, udg__PLANESTATE_BUILDING )
call ShowDebugMsg( "ReplacePlane ended here" )
return nPlaneId
endfunction
function TakeOff takes integer fp_nAPIndex returns nothing
local unit uPlane
local integer nPlaneId
local player pl
local integer nPlayerId
local integer nPlaneUT
local integer nPTId
local location locTarget
local location locPlane
local real rAngle
local location locTargetFurther
set nPlaneId = GetAirportTrainingPlane( fp_nAPIndex )
call SetAirportTrainingPlane( fp_nAPIndex, -1 )
set pl = GetOwningPlayer( GetAirport(fp_nAPIndex) )
set nPlayerId = GetPlayerId( pl )
//set pl = GetForcePlayer( pl )
set uPlane = GetPlane( nPlaneId )
set nPlaneUT = GetUnitTypeId( uPlane )
call RemoveUnit( uPlane )
set locPlane = GetUnitLoc( uPlane )
set locTarget = GetAirportTarget( fp_nAPIndex )
set rAngle = AngleBetweenPoints( locPlane, locTarget )
set uPlane = CreateUnitAtLoc( pl, nPlaneUT, locPlane, rAngle )
call SetUnitUserData( uPlane, nPlaneId )
call SetPlane( nPlaneId, uPlane )
call SetUnitPathing( uPlane, false )
call SetPlaneTarget( nPlaneId, locTarget )
call ShowDebugMsgLocation( "Take Off", locTarget )
call SetPlaneState( nPlaneId, udg__PLANESTATE_FLYING )
call SetPlaneFlyTick( nPlaneId, 0 )
call SetPlaneDirection( nPlaneId, rAngle )
set locTargetFurther = PolarProjectionBJ( locPlane, 1000, rAngle )
call RemoveLocation( locPlane )
call IssuePointOrderLoc( uPlane, "move", locTargetFurther )
call RemoveLocation( locTargetFurther )
set nPTId = GetPlaneTypeIndex( nPlaneUT )
call SetUnitFlyHeight( uPlane, GetPlaneTypeFlyHeight(nPTId), 300.00 )
//Add to player score
set udg_Fun_AddScorePlanesBuilt_Pl = GetPlayerId(pl)
call TriggerExecute( gg_trg_Function_AddScorePlanesBuilt )
set udg_Fun_AddScorePlaneType_Player = GetPlayerId(pl)
set udg_Fun_AddScorePlaneType_PTId = nPTId
call TriggerExecute( gg_trg_Function_AddScorePlaneTypeBuild )
//For incendiary bomber, need to assign a unique score id
if ( GetPlaneTypeBomberTechType(nPTId) == udg__BOMBERTECHTYPE_INCENDARY ) then
call SetPlaneIncScoreId( nPlaneId, udg_IncBombTargetGlobalScoreId )
set udg_IncBombTargetGlobalScoreId = udg_IncBombTargetGlobalScoreId + 1
endif
endfunction
function PlaneAnimation takes integer fp_nAPId, integer fp_nPlaneId, integer fp_nTick, integer fp_nTickMax returns nothing
local unit uPlane
local real rScale
local integer nVertex
//call ShowDebugMsg( "PlaneAnimation entered" )
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null ) then
call ShowAssertMsg( "PlaneAnimation", "Invalid Plane." )
return
endif
//call ShowDebugMsg( "nTick = " + I2S(fp_nTick) )
//call ShowDebugMsg( "nTickMax = " + I2S(fp_nTickMax) )
if ( ModuloInteger(fp_nTick, 2) == 0 ) then
call UpdateAirportTrainingBar( fp_nAPId, fp_nTick, fp_nTickMax )
endif
set fp_nTick = fp_nTick + 1
set rScale = 1. + ( udg__PLANEANIM_INITSCALE - 1 ) * ( fp_nTickMax - fp_nTick ) / fp_nTickMax
set nVertex = 210 * fp_nTick / fp_nTickMax
call SetUnitScale( uPlane, rScale, rScale, rScale )
call SetUnitVertexColor( uPlane, nVertex, nVertex, nVertex, nVertex )
//call ShowDebugMsg( "PlaneAnimation ended here" )
endfunction
function CancelTrainingPlane takes integer fp_nAPIndex, boolean fp_bRefund returns nothing
local integer nPlaneId
local unit uPlane
local integer nPlaneUT
local integer nPTId
set nPlaneId = GetAirportTrainingPlane( fp_nAPIndex )
call SetAirportTraining( fp_nAPIndex, -1 )
call SetAirportTrainingPlane( fp_nAPIndex, -1 )
if ( IsValidPlaneIndex( nPlaneId ) ) then
set uPlane = GetPlane(nPlaneId)
if ( fp_bRefund ) then
set nPlaneUT = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUT )
if ( nPTId >= 0 ) then
call TakeMoneyFromPlayer( GetPlayerId(GetOwningPlayer(GetAirport(fp_nAPIndex))), -GetPlaneTypePrice(nPTId) )
endif
endif
call RemoveUnit( uPlane )
call RemovePlane( nPlaneId )
endif
endfunction
function StartTrainPlaneLoop takes unit fp_uAirport, integer fp_nPlaneTypeBuildId returns nothing
local integer nIndex
local integer nPlaneType
local integer nPlaneTypeBuilding
local player pl
local integer nGold
local integer nGoldBuilding
local integer nGoldCur
call ShowDebugMsg( "Enter Start TrainPlaneLoop" )
set nIndex = GetAirportIndex( fp_uAirport )
if ( not IsValidAirportIndex(nIndex) ) then
call ShowAssertMsg( "TrainPlane", "Invalid Airport index." )
return
endif
set nPlaneType = GetPlaneTypeIndexByBuildId( fp_nPlaneTypeBuildId )
if ( nPlaneType < 0 ) then
call ShowAssertMsg( "TrainPlane", "Invalid Plane Type index." )
return
endif
set nPlaneTypeBuilding = GetAirportTraining(nIndex)
if ( nPlaneTypeBuilding == nPlaneType ) then
return
endif
set pl = GetOwningPlayer(fp_uAirport)
set udg_HasPlayerBuiltPlane[GetPlayerId(pl)] = true
set nGold = GetPlaneTypePrice( nPlaneType )
set nGoldCur = GetPlayerGold( GetPlayerId(pl) )
if ( nPlaneTypeBuilding >= 0 ) then //If there's plane building
call CancelTrainingPlane( nIndex, true )
endif
call SetAirportTrainingCount( nIndex, -1 )
call SetAirportTraining( nIndex, nPlaneType )
return
//Old code for replacing plane if change building type
if ( nPlaneTypeBuilding < 0 ) then //If there's no plane building
if ( nGoldCur < nGold ) then
call ShowWarningMsg( pl, udg__STR_NOENOUGHMONEY_BUILDPLANE + GetObjectName(GetPlaneTypeUnitType(nPlaneType)) )
call TriggerSleepAction(0.1)
call IssueImmediateOrderById( fp_uAirport, GetPlaneTypeOrderId(0) )
return
endif
call SetAirportTraining( nIndex, nPlaneType )
else //If the airport is building a plane
set nGoldBuilding = GetPlaneTypePrice( nPlaneTypeBuilding )
if ( nGoldBuilding + nGoldCur < nGold ) then
call ShowWarningMsg( pl, udg__STR_NOENOUGHMONEY_BUILDPLANE + GetObjectName(GetPlaneTypeUnitType(nPlaneType)) )
return
endif
call ReplacePlane( nIndex, nPlaneType )
endif
endfunction
function TrainPlaneTimerExpiresSingle takes integer fp_nAPIndex returns nothing
local unit uPlane
local unit uAirport
local integer nPlaneType
local integer nPTIndex
local real rTick
local real rTickMax
local integer nPlaneId
local integer nPlayerId
//call ShowDebugMsg( "Enter TrainPlanesTimerExpiresSingle(" + I2S(fp_nAPIndex) + ")" )
set uAirport = GetAirport(fp_nAPIndex)
if ( uAirport == null ) then
return
endif
if ( not IsAirportTraining(fp_nAPIndex) or IsAirportWarpGating(fp_nAPIndex) ) then
return
endif
set nPTIndex = GetAirportTraining(fp_nAPIndex)
set rTickMax = I2R(GetPlaneTypeBuildTime(nPTIndex)) / udg_TrainPlaneTick
set nPlayerId = GetPlayerId( GetOwningPlayer(uAirport) )
set rTick = GetAirportTrainingCount( fp_nAPIndex )
if ( GetNuclearBomber(nPlayerId) != null ) then
if ( rTick < 0 ) then
set rTick = 0
else
set rTick = rTick + 0.5
endif
else
set rTick = rTick + 1
endif
if ( rTick == 0 ) then //Start training plane
set nPlaneId = CreatePlane( fp_nAPIndex )
if ( IsValidPlaneIndex(nPlaneId) ) then
call PlaneAnimation( fp_nAPIndex, nPlaneId, R2I(rTick), R2I(rTickMax) )
else
set rTick = -1.
endif
elseif ( rTick >= rTickMax ) then //Plane takes off
call UpdateAirportTrainingBar( fp_nAPIndex, R2I(rTickMax), R2I(rTickMax) )
set rTick = -1.
call TakeOff( fp_nAPIndex )
else //During training (playing animation)
set nPlaneId = GetAirportTrainingPlane( fp_nAPIndex )
if ( IsValidPlaneIndex(nPlaneId) ) then
call PlaneAnimation( fp_nAPIndex, nPlaneId, R2I(rTick), R2I(rTickMax) )
else
set rTick = -1.
endif
endif
call SetAirportTrainingCount( fp_nAPIndex, rTick )
endfunction
function TrainPlaneTimerExpires takes nothing returns nothing
local integer nAPIndex
set nAPIndex = 1
loop
exitwhen nAPIndex >= udg_Airport_BuffNum
call TrainPlaneTimerExpiresSingle( nAPIndex )
set nAPIndex = nAPIndex + 1
endloop
endfunction
//===========================================================================
function InitTrig_Train_Plane_Functions takes nothing returns nothing
endfunction
function GetBombTarget takes integer fp_nIndex returns location
return udg_BombTarget_Loc[fp_nIndex]
endfunction
function SetBombTarget takes integer fp_nIndex, location fp_locTarget returns nothing
if ( fp_locTarget == null ) then
if ( udg_BombTarget_Loc[fp_nIndex] != null ) then
call RemoveLocation( udg_BombTarget_Loc[fp_nIndex] )
set udg_BombTarget_Loc[fp_nIndex] = null
endif
else
if ( udg_BombTarget_Loc[fp_nIndex] == null ) then
set udg_BombTarget_Loc[fp_nIndex] = Location(0,0)
endif
call MoveLocation( udg_BombTarget_Loc[fp_nIndex], GetLocationX(fp_locTarget), GetLocationY(fp_locTarget) )
endif
endfunction
function GetBombTargetDirection takes integer fp_nIndex returns real
return udg_BombTarget_Direction[fp_nIndex]
endfunction
function SetBombTargetDirection takes integer fp_nIndex, real fp_rDir returns nothing
set udg_BombTarget_Direction[fp_nIndex] = fp_rDir
endfunction
function GetBombTargetDropper takes integer fp_nIndex returns unit
return udg_BombTarget_Dropper[fp_nIndex]
endfunction
function SetBombTargetDropper takes integer fp_nIndex, unit fp_uDropper returns nothing
set udg_BombTarget_Dropper[fp_nIndex] = fp_uDropper
endfunction
function GetBombTargetPlaneTypeId takes integer fp_nIndex returns integer
return udg_BombTarget_PlaneTypeId[fp_nIndex]
endfunction
function SetBombTargetPlaneTypeId takes integer fp_nIndex, integer fp_nPTId returns nothing
set udg_BombTarget_PlaneTypeId[fp_nIndex] = fp_nPTId
endfunction
function GetBombTargetPlayerId takes integer fp_nIndex returns integer
return udg_BombTarget_PlayerId[fp_nIndex]
endfunction
function SetBombTargetPlayerId takes integer fp_nIndex, integer fp_nPlayerId returns nothing
set udg_BombTarget_PlayerId[fp_nIndex] = fp_nPlayerId
endfunction
function GetBombTargetIncScoreId takes integer fp_nIndex returns integer
return udg_BombTarget_IncScoreId[fp_nIndex]
endfunction
function SetBombTargetIncScoreId takes integer fp_nIndex, integer fp_nScoreId returns nothing
set udg_BombTarget_IncScoreId[fp_nIndex] = fp_nScoreId
endfunction
function GetBombTargetDoDamage takes integer fp_nIndex returns boolean
return udg_BombTarget_DoDamage[fp_nIndex]
endfunction
function SetBombTargetDoDamage takes integer fp_nIndex, boolean fp_bDoDamage returns nothing
set udg_BombTarget_DoDamage[fp_nIndex] = fp_bDoDamage
endfunction
function AddBombTarget takes unit fp_uTarget, real fp_rDir, unit fp_uDropper, location fp_locTarget, integer fp_nPTId, integer fp_nPlayerId, boolean fp_bDoDamage returns integer
local integer nTargetId
set nTargetId = 0
loop
exitwhen nTargetId >= udg_BombTarget_BuffNum
exitwhen GetBombTarget(nTargetId) == null
set nTargetId = nTargetId + 1
endloop
call SetBombTarget( nTargetId, fp_locTarget )
call SetBombTargetDirection( nTargetId, fp_rDir )
call SetBombTargetDropper( nTargetId, fp_uDropper )
call SetBombTargetPlaneTypeId( nTargetId, fp_nPTId )
call SetBombTargetPlayerId( nTargetId, fp_nPlayerId )
call SetBombTargetDoDamage( nTargetId, fp_bDoDamage )
call SetUnitUserData( fp_uTarget, nTargetId )
if ( nTargetId == udg_BombTarget_BuffNum ) then
set udg_BombTarget_BuffNum = udg_BombTarget_BuffNum + 1
endif
return nTargetId
endfunction
function RemoveBombTarget takes integer fp_nIndex returns nothing
call SetBombTarget( fp_nIndex, null )
endfunction
//===========================================================================
function InitTrig_Bomb_Target_Functions takes nothing returns nothing
endfunction
function PlaneWithinActionRange takes integer fp_nPlaneId returns boolean
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local location locPlane
local location locTarget
local real rDis
local real rAngle
set uPlane = GetPlane( fp_nPlaneId )
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
set locPlane = GetUnitLoc( uPlane )
set locTarget = GetPlaneTarget( fp_nPlaneId )
set rAngle = AngleBetweenPoints(locPlane, locTarget) - GetPlaneDirection( fp_nPlaneId )
set rAngle = ModuloReal( rAngle, 360 )
if ( rAngle > 90 and rAngle < 275 ) then
call RemoveLocation( locPlane )
return true
endif
set rDis = DistanceBetweenPoints( locPlane, locTarget )
call RemoveLocation( locPlane )
return rDis < GetPlaneTypeActionRange(nPTId)
endfunction
function PlaneFlyFurther takes integer fp_nPlaneId returns nothing
local integer nFlyTick
local unit uPlane
local location locPlane
local location locTargetFurther
set nFlyTick = GetPlaneFlyTick( fp_nPlaneId ) + 1
if ( nFlyTick == 5 ) then
set nFlyTick = 0
set uPlane = GetPlane( fp_nPlaneId )
set locPlane = GetUnitLoc( uPlane )
set locTargetFurther = PolarProjectionBJ( locPlane, 1000, GetPlaneDirection(fp_nPlaneId) )
call IssuePointOrderLoc( uPlane, "move", locTargetFurther )
call RemoveLocation( locPlane )
call RemoveLocation( locTargetFurther )
endif
call SetPlaneFlyTick( fp_nPlaneId, nFlyTick )
endfunction
function CheckPlaneActionTimeExpire takes integer fp_nPlaneId returns boolean
local integer nTick
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local integer nActionTime
if ( GetPlaneActionDone(fp_nPlaneId) ) then
return true
endif
set nTick = GetPlaneActionTick( fp_nPlaneId ) + 1
call SetPlaneActionTick( fp_nPlaneId, nTick )
set uPlane = GetPlane( fp_nPlaneId )
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return true
endif
set nActionTime = GetPlaneTypeActionTime( nPTId )
if ( nTick < nActionTime ) then
return false
endif
call SetPlaneActionDone( fp_nPlaneId, true )
return true
endfunction
function FinishPlaneFlight takes integer fp_nPlaneId returns nothing
local unit uTarget
if ( GetPlaneState(fp_nPlaneId) == udg__PLANESTATE_FINISHING ) then
return
endif
//If it is nuclear bomber, now it is time to remove the target sign
set uTarget = GetPlaneTargetSign( fp_nPlaneId )
if ( uTarget != null ) then
call RemoveUnit( uTarget )
call SetPlaneTargetSign( fp_nPlaneId, null )
endif
call SetPlaneState( fp_nPlaneId, udg__PLANESTATE_FINISHING )
set udg_Fun_PlaneFinishing_P1 = fp_nPlaneId
call TriggerExecute( gg_trg_Function_PlaneFinishing )
endfunction
//===========================================================================
function InitTrig_General_Plane_Action_Functions takes nothing returns nothing
endfunction
function RetrieveIncBombScoreId takes nothing returns integer
set udg_IncBombTargetGlobalScoreId = udg_IncBombTargetGlobalScoreId + 1
set udg_IncBombTargetGlobalScored[udg_IncBombTargetGlobalScoreId] = false
return udg_IncBombTargetGlobalScoreId
endfunction
function SetIncBombHitScored takes integer fp_nScoreId returns nothing
set udg_IncBombTargetGlobalScored[fp_nScoreId] = true
endfunction
function IsIncBombHitScored takes integer fp_nScoreId returns boolean
return udg_IncBombTargetGlobalScored[fp_nScoreId]
endfunction
function BombExplosionEffect takes location fp_locTarget, real fp_rRadius returns nothing
local string strEff1 = "Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl"
local string strEff2 = "Abilities\\Weapons\\BallsOfFireMissile\\BallsOfFireMissile.mdl"
local string strEff3 = "Doodads\\Cinematic\\FireRockSmall\\FireRockSmall.mdl"
local integer nNumEffect
local real rAngleUnit
local effect array effFires
local integer n
local location loc
local rect rec
local real r
local real a
local real rEffSingle = 150
local real rRad = fp_rRadius - rEffSingle
set nNumEffect = ( R2I(fp_rRadius) - 50 ) / 50
set rAngleUnit = 360.0 / nNumEffect
set n = 0
loop
exitwhen n >= nNumEffect
set loc = PolarProjectionBJ( fp_locTarget, rRad, n * rAngleUnit )
call DestroyEffect( AddSpecialEffectLoc(strEff1, loc) )
call RemoveLocation(loc)
set loc = PolarProjectionBJ( fp_locTarget, rRad, rAngleUnit/2 + n * rAngleUnit )
call DestroyEffect( AddSpecialEffectLoc(strEff2, loc) )
call RemoveLocation(loc)
set n = n + 1
endloop
call DestroyEffect( AddSpecialEffectLoc(strEff1, fp_locTarget) )
set n = 0
loop
exitwhen n > 5
set r = GetRandomReal( 0, fp_rRadius )
set a = GetRandomInt( 0, 360 )
set loc = PolarProjectionBJ( fp_locTarget, r, a )
set effFires[n] = AddSpecialEffectLoc( strEff3, loc)
call RemoveLocation( loc )
set n = n + 1
endloop
set n = 0
loop
exitwhen n > 5
call PolledWait( 0.1 )
call DestroyEffect( effFires[n] )
set n = n + 1
endloop
endfunction
function IncendaryBombTargetDamageAction takes integer fp_nTargetId returns nothing
local location locTarget
local real rDir
local integer nPlayerId
local integer nPTId
local integer nAttackerUT
local location loc
local unit uFire
local real rRadius
local integer nIndex
set locTarget = GetBombTarget( fp_nTargetId )
set rDir = GetBombTargetDirection( fp_nTargetId )
set nPlayerId = GetBombTargetPlayerId( fp_nTargetId )
set nPTId = GetBombTargetPlaneTypeId( fp_nTargetId )
set nAttackerUT = GetPlaneTypeBomberDamager1(nPTId)
set rRadius = GetPlaneTypeBomberRadius( nPTId )
set nIndex = -1
loop
exitwhen nIndex > 1
set loc = PolarProjectionBJ( locTarget, 50, rDir + 90*nIndex )
set uFire = CreateUnitAtLoc( Player(nPlayerId), nAttackerUT, loc, rDir )
call SetUnitPathing( uFire, false )
call UnitApplyTimedLife( uFire, 'BTLF', 7 )
//Score
if ( not IsIncBombHitScored(GetBombTargetIncScoreId(fp_nTargetId)) and IsThereEnemyBombTargetInRange(Player(nPlayerId), loc, rRadius) ) then
call SetIncBombHitScored( GetBombTargetIncScoreId(fp_nTargetId) )
set udg_Fun_AddScoreBombHit_Pl = nPlayerId
call TriggerExecute( gg_trg_Function_AddScoreBombsHit )
endif
call RemoveLocation( loc )
set nIndex = nIndex + 2
endloop
endfunction
function NuclearBombTargetDamageAction takes integer fp_nTargetId returns nothing
local integer nPlayerId
local location locTarget
local integer nPTId
local unit uAttacker
local unit uEffect
local image img
local integer nIndex
set locTarget = GetBombTarget( fp_nTargetId )
set nPlayerId = GetBombTargetPlayerId( fp_nTargetId )
set nPTId = GetBombTargetPlaneTypeId( fp_nTargetId )
set udg_Fun_TimedVision_Player = Player( nPlayerId )
set udg_Fun_TimedVision_Center = locTarget
set udg_Fun_TimedVision_Radius = 1024
set udg_Fun_TimedVision_Last = 6
call TriggerExecute( gg_trg_Function_TimedVision )
set uAttacker = CreateUnitAtLoc( Player(nPlayerId), GetPlaneTypeBomberDamager1(nPTId), locTarget, 0 )
call SetUnitPathing( uAttacker, false )
call IssuePointOrderLoc( uAttacker, "attackground", locTarget )
call UnitApplyTimedLife( uAttacker, 'BTLF', 2 )
set uAttacker = CreateUnitAtLoc( Player(nPlayerId), 'n013', locTarget, 0 )
call SetUnitPathing( uAttacker, false )
call IssuePointOrderLoc( uAttacker, "flamestrike", locTarget )
call UnitApplyTimedLife( uAttacker, 'BTLF', 10 )
set uEffect = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00S', locTarget, 0 )
call SetUnitTimeScale( uEffect, 0.15 )
call KillUnit( uEffect )
set uEffect = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n00Z', locTarget, 0 )
call SetUnitTimeScale( uEffect, 0.15 )
call KillUnit( uEffect )
set uEffect = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n010', locTarget, 0 )
call SetUnitTimeScale( uEffect, 0.15 )
call KillUnit( uEffect )
set uEffect = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n012', locTarget, 0 )
call SetUnitTimeScale( uEffect, 0.12 )
call UnitApplyTimedLife( uEffect, 'BTLF', 6 )
call TerrainDeformationRippleBJ( 3.00, true, locTarget, 200.00, 1024, 64.00, 2.00, 512 )
//set img = CreateImage( "war3mapImported\\ScorchedUberSplat.BLP", 1024, 1024, 1024, GetLocationX(locTarget), GetLocationY(locTarget), 0, 512, 512, 0, 2 )
set img = CreateImage( "ReplaceableTextures\\Splats\\ScorchedUberSplat.BLP", 1024, 1024, 1024, GetLocationX(locTarget), GetLocationY(locTarget), 0, 512, 512, 0, 2 )
call SetImageRenderAlways( img, true )
call SetImageRender( img, true )
call ShowImageBJ( true, img )
set udg_Fun_ImageFadeout_P1 = img
set udg_Fun_ImageFadeout_P2 = 10
call TriggerExecute( gg_trg_Function_ImageFadeout )
call PlaySoundAtPointBJ( gg_snd_BuildingDeathLargeHuman, 100, locTarget, 0 )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraSetEQNoiseForPlayer( Player(nIndex), 20.00 )
set nIndex = nIndex + 1
endloop
call TriggerSleepAction( 0.3 )
call StopSound( gg_snd_BuildingDeathLargeHuman, false, false )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraClearNoiseForPlayer( Player(nIndex) )
set nIndex = nIndex + 1
endloop
call TriggerSleepAction( 0.2 )
call PlaySoundAtPointBJ( gg_snd_BuildingDeathLargeHuman01, 100, locTarget, 0 )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraSetEQNoiseForPlayer( Player(nIndex), 20.00 )
set nIndex = nIndex + 1
endloop
call TriggerSleepAction( 0.3 )
call StopSound( gg_snd_BuildingDeathLargeHuman, false, false )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraClearNoiseForPlayer( Player(nIndex) )
set nIndex = nIndex + 1
endloop
call TriggerSleepAction( 0.2 )
call PlaySoundAtPointBJ( gg_snd_BuildingDeathLargeHuman02, 100, locTarget, 0 )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraSetEQNoiseForPlayer( Player(nIndex), 20.00 )
set nIndex = nIndex + 1
endloop
call TriggerSleepAction( 1 )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraClearNoiseForPlayer( Player(nIndex) )
set nIndex = nIndex + 1
endloop
endfunction
function BombTargetDamagedAction takes nothing returns nothing
local unit uDmgSource
local unit uDmgTarget
local integer nTargetId
local integer nPlayerId
local location locTarget
local integer nPTId
local integer nTechType
local integer nAttackerUT
local unit uAttacker
local real rRadius
set uDmgTarget = GetTriggerUnit()
set nTargetId = GetUnitUserData( uDmgTarget )
set uDmgSource = GetEventDamageSource()
if ( uDmgSource != GetBombTargetDropper(nTargetId) ) then
return
endif
call DestroyTrigger( GetTriggeringTrigger() )
call RemoveUnit( uDmgSource )
call RemoveUnit( uDmgTarget )
if ( GetBombTargetDoDamage(nTargetId) ) then
set locTarget = GetBombTarget( nTargetId )
set nPlayerId = GetBombTargetPlayerId( nTargetId )
set nPTId = GetBombTargetPlaneTypeId( nTargetId )
set nTechType = GetPlaneTypeBomberTechType( nPTId )
if ( nTechType == udg__BOMBERTECHTYPE_NORMAL or nTechType == udg__BOMBERTECHTYPE_STEALTH ) then
set uAttacker = CreateUnitAtLoc( Player(nPlayerId), GetPlaneTypeBomberDamager1(nPTId), locTarget, 0 )
call SetUnitPathing( uAttacker, false )
call IssuePointOrderLoc( uAttacker, "attackground", locTarget )
call UnitApplyTimedLife( uAttacker, 'BTLF', 2 )
elseif ( nTechType == udg__BOMBERTECHTYPE_CLUSTER ) then
if ( GetPlayerTechCount(Player(nPlayerId), 'R002', true) >= 2 ) then
set nAttackerUT = GetPlaneTypeBomberDamager2(nPTId)
else
set nAttackerUT = GetPlaneTypeBomberDamager1(nPTId)
endif
set uAttacker = CreateUnitAtLoc( Player(nPlayerId), nAttackerUT, locTarget, 0 )
call SetUnitPathing( uAttacker, false )
call IssuePointOrderLoc( uAttacker, "attackground", locTarget )
call UnitApplyTimedLife( uAttacker, 'BTLF', 2 )
elseif ( nTechType == udg__BOMBERTECHTYPE_INCENDARY ) then
call IncendaryBombTargetDamageAction( nTargetId )
elseif ( nTechType == udg__BOMBERTECHTYPE_NUCLEAR ) then
call NuclearBombTargetDamageAction( nTargetId )
endif
//Caculate score
if ( nTechType == udg__BOMBERTECHTYPE_NORMAL or nTechType == udg__BOMBERTECHTYPE_STEALTH or nTechType == udg__BOMBERTECHTYPE_CLUSTER ) then
set rRadius = GetPlaneTypeBomberRadius( nPTId )
//Cluster Tech Level 2
if ( nTechType == udg__BOMBERTECHTYPE_CLUSTER and GetPlayerTechCount(Player(nPlayerId), 'R002', true) >= 2 ) then
set rRadius = rRadius * 1.3
endif
if ( IsThereEnemyBombTargetInRange(Player(nPlayerId), GetBombTarget(nTargetId), rRadius) ) then
set udg_Fun_AddScoreBombHit_Pl = GetBombTargetPlayerId(nTargetId)
call TriggerExecute( gg_trg_Function_AddScoreBombsHit )
endif
endif
endif
//call BombExplosionEffect( locTarget, GetPlaneTypeBomberRadius(nPTId) )
call RemoveBombTarget( nTargetId )
endfunction
function ThrowBomb takes integer fp_nPlaneId returns nothing
local unit uDropper
local unit uTarget
local unit uPlane
local location locSrc
local location locTarget
local location locTarget1
local real rAngle
local real rRadius
local integer nPlaneUnitType
local integer nPTId
local integer nTech
local integer nTargetId
local real rScale
local trigger trg
local integer nNum
local integer nIndex
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
set nTech = GetPlaneTypeBomberTechType(nPTId)
set locSrc = GetUnitLoc( uPlane )
if ( nTech == udg__BOMBERTECHTYPE_INCENDARY ) then
set rAngle = GetPlaneDirection( fp_nPlaneId )
set locTarget = PolarProjectionBJ( locSrc, 200, rAngle )
else
set locTarget = GetPlaneTarget( fp_nPlaneId )
set rAngle = AngleBetweenPoints( locSrc, locTarget )
endif
set rScale = GetPlaneTypeBomberScale( nPTId )
set uDropper = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), GetPlaneTypeBomberDropper(nPTId), locSrc, rAngle )
call SetUnitPathing( uDropper, false )
call SetUnitScale( uDropper, rScale, rScale, rScale )
set uTarget = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n003', locTarget, 0 )
call SetUnitPathing( uTarget, false )
call SetUnitPositionLoc( uTarget, locTarget )
set nTargetId = AddBombTarget( uTarget, GetPlaneDirection(fp_nPlaneId), uDropper, locTarget, nPTId, GetPlanePlayerId(fp_nPlaneId), true )
set trg = CreateTrigger()
call TriggerRegisterUnitEvent( trg, uTarget, EVENT_UNIT_DAMAGED )
call TriggerAddAction( trg, function BombTargetDamagedAction )
call IssueTargetOrder( uDropper, "thunderbolt", uTarget )
if ( nTech == udg__BOMBERTECHTYPE_INCENDARY ) then
call SetBombTargetIncScoreId( nTargetId, GetPlaneIncScoreId(fp_nPlaneId) )
endif
if ( nTech != udg__BOMBERTECHTYPE_CLUSTER ) then
call RemoveLocation( locSrc )
call RemoveLocation( locTarget )
return
endif
//Now for cluster bomber effect
set rRadius = GetPlaneTypeBomberRadius( nPTId )
//Cluster Tech Level 2
if ( GetPlayerTechCount(Player(GetPlanePlayerId(fp_nPlaneId)), 'R002', true) >= 2 ) then
set rRadius = rRadius * 1.3
endif
set rRadius = rRadius - 50
set nNum = GetPlaneTypeBomberNumber( nPTId ) - 1
set nIndex = 0
loop
exitwhen nIndex >= nNum
set uDropper = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), GetPlaneTypeBomberDropper(nPTId), locSrc, rAngle )
call SetUnitPathing( uDropper, false )
call SetUnitScale( uDropper, rScale, rScale, rScale )
set locTarget1 = PolarProjectionBJ( locTarget, rRadius, nIndex * 360. / nNum )
set uTarget = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'n003', locTarget1, 0 )
call SetUnitPathing( uTarget, false )
call SetUnitPositionLoc( uTarget, locTarget1 )
call AddBombTarget( uTarget, GetPlaneDirection(fp_nPlaneId), uDropper, locTarget1, nPTId, GetPlanePlayerId(fp_nPlaneId), false )
set trg = CreateTrigger()
call TriggerRegisterUnitEvent( trg, uTarget, EVENT_UNIT_DAMAGED )
call TriggerAddAction( trg, function BombTargetDamagedAction )
call IssueTargetOrder( uDropper, "thunderbolt", uTarget )
call RemoveLocation( locTarget1 )
set nIndex = nIndex + 1
endloop
call RemoveLocation( locSrc )
call RemoveLocation( locTarget )
endfunction
function FreezingBombTargetAction takes nothing returns nothing
local unit uDmgSource
local unit uDmgTarget
local integer nTargetId
set uDmgTarget = GetTriggerUnit()
set nTargetId = GetUnitUserData( uDmgTarget )
set uDmgSource = GetEventDamageSource()
if ( uDmgSource != GetBombTargetDropper(nTargetId) ) then
return
endif
call DestroyTrigger( GetTriggeringTrigger() )
//Caculate score
if ( IsThereEnemyBombTargetInRange(Player(GetBombTargetPlayerId(nTargetId)), GetBombTarget(nTargetId), udg__FREEZINGBOMBER_RADIUS) ) then
set udg_Fun_AddScoreBombHit_Pl = GetBombTargetPlayerId(nTargetId)
call TriggerExecute( gg_trg_Function_AddScoreBombsHit )
endif
//Do vision modifier
set udg_Fun_TimedVision_Player = Player( GetBombTargetPlayerId(nTargetId) )
set udg_Fun_TimedVision_Center = GetBombTarget(nTargetId)
set udg_Fun_TimedVision_Radius = udg__FREEZINGBOMBER_RADIUS
set udg_Fun_TimedVision_Last = 3
call TriggerExecute( gg_trg_Function_TimedVision )
call RemoveUnit( uDmgTarget )
call RemoveUnit( uDmgSource )
call RemoveBombTarget( nTargetId )
endfunction
function FreezingBombAttack takes integer fp_nPlaneId returns nothing
local unit uDamager
local unit uTarget
local unit uPlane
local location locSrc
local location locTarget
local location locTarget1
local real rAngle
local real rRadius
local integer nPlaneUnitType
local integer nPTId
local real rScale
local trigger trg
local integer nNum
local integer nIndex
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
set locSrc = GetUnitLoc( uPlane )
set locTarget = GetPlaneTarget( fp_nPlaneId )
set rAngle = AngleBetweenPoints( locSrc, locTarget )
set rScale = GetPlaneTypeBomberScale( nPTId )
set uDamager = CreateUnitAtLoc( GetOwningPlayer(uPlane), GetPlaneTypeBomberDamager1(nPTId), locSrc, rAngle )
call SetUnitPathing( uDamager, false )
call SetUnitScale( uDamager, rScale, rScale, rScale )
set uTarget = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_AGGRESSIVE), 'h00C', locTarget, 0 )
call SetUnitPathing( uTarget, false )
call SetUnitPositionLoc( uTarget, locTarget )
call AddBombTarget( uTarget, GetPlaneDirection(fp_nPlaneId), uDamager, locTarget, nPTId, GetPlanePlayerId(fp_nPlaneId), true )
set trg = CreateTrigger()
call TriggerRegisterUnitEvent( trg, uTarget, EVENT_UNIT_DAMAGED )
call TriggerAddAction( trg, function FreezingBombTargetAction )
call IssueTargetOrder( uDamager, "attack", uTarget )
set rRadius = GetPlaneTypeBomberRadius( nPTId )
set nNum = GetPlaneTypeBomberNumber( nPTId ) - 1
set nIndex = 0
loop
exitwhen nIndex >= nNum
set uDamager = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), GetPlaneTypeBomberDamager1(nPTId), locSrc, rAngle )
call SetUnitPathing( uDamager, false )
call SetUnitScale( uDamager, rScale, rScale, rScale )
set locTarget1 = PolarProjectionBJ( locTarget, rRadius, nIndex * 360. / nNum )
set uTarget = CreateUnitAtLoc( Player(PLAYER_NEUTRAL_PASSIVE), 'h00C', locTarget1, 0 )
call SetUnitPathing( uTarget, false )
call SetUnitPositionLoc( uTarget, locTarget1 )
call AddBombTarget( uTarget, GetPlaneDirection(fp_nPlaneId), uDamager, locTarget, nPTId, GetPlanePlayerId(fp_nPlaneId), false )
set trg = CreateTrigger()
call TriggerRegisterUnitEvent( trg, uTarget, EVENT_UNIT_DAMAGED )
call TriggerAddAction( trg, function FreezingBombTargetAction )
call IssueTargetOrder( uDamager, "attack", uTarget )
call RemoveLocation( locTarget1 )
set nIndex = nIndex + 1
endloop
call RemoveLocation( locSrc )
endfunction
function IncendaryBomberAction takes integer fp_nPlaneId returns nothing
local integer nTick
if ( CheckPlaneActionTimeExpire(fp_nPlaneId) ) then
return
endif
//set nTick = GetPlaneActionTick( fp_nPlaneId )
//if ( ModuloInteger(nTick, 2) != 0 ) then
// return
//endif
call ThrowBomb( fp_nPlaneId )
endfunction
function BomberAction takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nState
local integer nPlaneUnitType
local integer nPTId
local integer nTech
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
call PlaneFlyFurther( fp_nPlaneId )
if ( GetPlaneState(fp_nPlaneId) == udg__PLANESTATE_FLYING ) then
if ( not PlaneWithinActionRange(fp_nPlaneId) ) then
return
endif
endif
set nState = GetPlaneState(fp_nPlaneId)
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
set nTech = GetPlaneTypeBomberTechType(nPTId)
if ( nState == udg__PLANESTATE_FLYING ) then
call SetPlaneState( fp_nPlaneId, udg__PLANESTATE_ACTING )
call SetPlaneActionTick( fp_nPlaneId, 0 )
if ( nTech == udg__BOMBERTECHTYPE_INCENDARY ) then
call SetPlaneIncScoreId( fp_nPlaneId, RetrieveIncBombScoreId() )
endif
if ( nTech == udg__BOMBERTECHTYPE_FREEZING ) then
call FreezingBombAttack( fp_nPlaneId )
else
call ThrowBomb( fp_nPlaneId )
endif
//Add score for throwing a bomb
if ( nTech == udg__BOMBERTECHTYPE_NUCLEAR ) then
set udg_Fun_AddScoreNuclearLanded_Pl = GetPlanePlayerId( fp_nPlaneId )
call TriggerExecute( gg_trg_Function_AddScoreNuclearLanded )
else
set udg_Fun_AddScoreBombDrop_Pl = GetPlanePlayerId( fp_nPlaneId )
call TriggerExecute( gg_trg_Function_AddScoreBombsDropped )
endif
elseif ( nState == udg__PLANESTATE_ACTING ) then
if ( nTech == udg__BOMBERTECHTYPE_INCENDARY ) then
call IncendaryBomberAction( fp_nPlaneId )
else
//So the player jumped by stealth plane has a chance to know who's attacking him
if ( nTech == udg__BOMBERTECHTYPE_STEALTH ) then
call UnitRemoveAbility( uPlane, 'Apiv' )
endif
call SetPlaneActionDone( fp_nPlaneId, true )
endif
endif
endfunction
//===========================================================================
function InitTrig_Bomber_Functions takes nothing returns nothing
endfunction
function IsPointInRiver takes location fp_loc returns boolean
if ( RectContainsLoc(gg_rct_RIVER_1, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_2, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_3, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_4, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_5, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_6, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_7, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_8, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_9, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_10, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_11, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_12, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_13, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_14, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_15, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_16, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_17, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_18, fp_loc) ) then
return true
endif
if ( RectContainsLoc(gg_rct_RIVER_19, fp_loc) ) then
return true
endif
return false
endfunction
function DropAirborne takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nState
local integer nTick
local integer nPlaneUnitType
local integer nPTId
local integer nAbUT
local integer nLandUT
local location locTarget
local location locTemp
local location locDrop
local real rFacing
local integer nHP
local unit uAirborne
local unit uLand
local player plOriginal
local player pl
local real rHeight
local effect eff
local location locPlane
local real rDis
local real rAngle
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
call PlaneFlyFurther( fp_nPlaneId )
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
if ( GetPlaneState(fp_nPlaneId) == udg__PLANESTATE_FLYING ) then
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
set locPlane = GetUnitLoc( uPlane )
set locTarget = GetPlaneTarget( fp_nPlaneId )
set rDis = DistanceBetweenPoints( locPlane, locTarget )
call RemoveLocation( locPlane )
if ( rDis >= GetPlaneTypeActionRange(nPTId) ) then
return
endif
endif
set nAbUT = GetPlaneTypeDropperAirborne( nPTId )
set nLandUT = GetPlaneTypeDropperLandUT( nPTId )
set locTemp = GetPlaneTarget( fp_nPlaneId )
set locTarget = Location( GetLocationX(locTemp), GetLocationY(locTemp) )
set locDrop = GetUnitLoc( uPlane )
set plOriginal = GetOwningPlayer(uPlane)
set pl = GetPlayerForcePlayer( plOriginal )
set uAirborne = CreateUnitAtLoc( pl, nAbUT, locDrop, GetUnitFacing(uPlane) )
call SetUnitPathing( uAirborne, false )
call SetUnitColor( uAirborne, GetPlayerColor(plOriginal) )
set rHeight = GetUnitDefaultFlyHeight( uAirborne )
call SetUnitFlyHeight( uAirborne, 0, rHeight / 2 )
call TriggerSleepAction(2)
if ( IsUnitDeadBJ(uAirborne) ) then
call RemoveLocation( locDrop )
call RemoveLocation( locTarget )
return
endif
if ( IsPointInRiver(locDrop) ) then
call RemoveUnit( uAirborne )
call RemoveLocation( locDrop )
call RemoveLocation( locTarget )
return
endif
set locDrop = GetUnitLoc( uAirborne )
set rFacing = GetUnitFacing(uAirborne)
call RemoveUnit( uAirborne )
set uLand = CreateUnitAtLoc( plOriginal, nLandUT, locDrop, rFacing )
call UnitApplyTimedLife( uLand, 'BTLF', GetPlaneTypeDropperLifeDur(nPTId) )
call RemoveLocation( locDrop )
//call SetUnitColor( uLand, GetPlayerColor(plOriginal) )
call IssuePointOrderLoc( uLand, "attack", locTarget )
call RemoveLocation( locTarget )
endfunction
function DropperAction takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local integer nState
local integer nTick
local integer nActionTime
local integer nAbNum
local integer nInterval
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
call PlaneFlyFurther( fp_nPlaneId )
if ( GetPlaneState(fp_nPlaneId) == udg__PLANESTATE_FLYING ) then
if ( not PlaneWithinActionRange(fp_nPlaneId) ) then
return
endif
endif
set nState = GetPlaneState(fp_nPlaneId)
if ( nState == udg__PLANESTATE_FLYING ) then
call SetPlaneState( fp_nPlaneId, udg__PLANESTATE_ACTING )
call SetPlaneActionTick( fp_nPlaneId, 0 )
call DropAirborne( fp_nPlaneId )
elseif ( nState == udg__PLANESTATE_ACTING ) then
if ( CheckPlaneActionTimeExpire(fp_nPlaneId) ) then
return
endif
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
set nAbNum = GetPlaneTypeDropperAbNumber( nPTId )
if ( nAbNum <= 1 ) then
return
endif
set nTick = GetPlaneActionTick( fp_nPlaneId ) + 1
set nActionTime = GetPlaneTypeActionTime( nPTId )
set nInterval = ( nActionTime - 1 ) / nAbNum
if ( ModuloInteger(nTick - 1, nInterval) != 0 or (nTick - 1)/nInterval >= nAbNum ) then
return
endif
call DropAirborne( fp_nPlaneId )
endif
endfunction
//===========================================================================
function InitTrig_Dropper_Functions takes nothing returns nothing
endfunction
function FighterEquipWeapon takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local integer nWeaponUT
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
call ShowDebugMsg( "aaa Equiped" )
set nWeaponUT = GetPlaneTypeFighterWeapon( nPTId )
if ( GetUnitAbilityLevel(uPlane, nWeaponUT) > 0 ) then
return
endif
call UnitAddAbility( uPlane, nWeaponUT )
endfunction
function FighterRemoveWeapon takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local integer nWeaponUT
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
call ShowDebugMsg( "aaa Removed" )
set nWeaponUT = GetPlaneTypeFighterWeapon( nPTId )
call UnitRemoveAbility( uPlane, nWeaponUT )
endfunction
function FighterAction takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nState
local location locPlane
local location locTarget
local location locNext
local real rDir
local integer nTick
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
set nState = GetPlaneState(fp_nPlaneId)
if ( nState == udg__PLANESTATE_FLYING ) then
call FighterEquipWeapon(fp_nPlaneId)
if ( not PlaneWithinActionRange(fp_nPlaneId) ) then
call PlaneFlyFurther( fp_nPlaneId )
else
call SetPlaneState( fp_nPlaneId, udg__PLANESTATE_ACTING )
call SetPlaneActionTick( fp_nPlaneId, 0 )
endif
return
elseif ( nState != udg__PLANESTATE_ACTING ) then
return
endif
if ( CheckPlaneActionTimeExpire( fp_nPlaneId ) ) then
call FighterRemoveWeapon( fp_nPlaneId )
return
endif
set nTick = GetPlaneActionTick( fp_nPlaneId )
if ( ModuloInteger(nTick, 2) != 1 ) then
return
endif
set locPlane = GetUnitLoc( uPlane )
set locTarget = GetPlaneTarget( fp_nPlaneId )
set rDir = AngleBetweenPoints(locTarget, locPlane) + 15
call RemoveLocation( locPlane )
set locNext = PolarProjectionBJ( locTarget, udg__FIGHTER_ROTATIONRADIUS, rDir )
call IssuePointOrderLoc( uPlane, "move", locNext )
call RemoveLocation( locNext )
endfunction
//===========================================================================
function InitTrig_Fighter_Functions takes nothing returns nothing
endfunction
function CarrierAttack takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local unit uCaster
local location loc
local real rTime
local real rLife
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
set loc = GetUnitLoc( uPlane )
set uCaster = CreateUnitAtLoc( GetOwningPlayer(uPlane), GetPlaneTypeCarrierCaster(nPTId), loc, GetUnitFacing(uPlane) )
call RemoveLocation( loc )
call SetUnitPathing( uCaster, false )
call IssueImmediateOrder( uCaster, "Locustswarm" )
set rLife = GetPlaneTypeActionTime( nPTId ) / 5.
set rTime = 0
loop
if ( IsUnitDeadBJ(uPlane) ) then
if ( rLife > rTime + GetPlaneTypeCarrierInterLife( nPTId ) ) then
set rLife = rTime + GetPlaneTypeCarrierInterLife( nPTId )
endif
endif
exitwhen rTime >= rLife
set rTime = rTime + 1
call TriggerSleepAction( 1 )
endloop
call RemoveUnit( uCaster )
endfunction
function CarrierAction takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nState
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
if ( GetPlaneState(fp_nPlaneId) == udg__PLANESTATE_FLYING ) then
if ( not PlaneWithinActionRange(fp_nPlaneId) ) then
call PlaneFlyFurther( fp_nPlaneId )
return
endif
endif
set nState = GetPlaneState(fp_nPlaneId)
if ( nState == udg__PLANESTATE_FLYING ) then
call SetPlaneState( fp_nPlaneId, udg__PLANESTATE_ACTING )
call SetPlaneActionTick( fp_nPlaneId, 0 )
call IssueImmediateOrder( uPlane, "stop" )
call UnitRemoveAbility( uPlane, 'Amov' )
call CarrierAttack( fp_nPlaneId )
elseif ( nState == udg__PLANESTATE_ACTING ) then
call CheckPlaneActionTimeExpire( fp_nPlaneId )
endif
endfunction
//===========================================================================
function InitTrig_Carrier_Functions takes nothing returns nothing
endfunction
function PlaneActionTimerExpiresSingle takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local integer nFlyTick
local integer nType
if ( GetPlaneState(fp_nPlaneId) != udg__PLANESTATE_FLYING and GetPlaneState(fp_nPlaneId) != udg__PLANESTATE_ACTING ) then
return
endif
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
if ( GetPlaneActionDone(fp_nPlaneId) ) then
call FinishPlaneFlight( fp_nPlaneId )
return
endif
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
set nType = GetPlaneTypeCategory( nPTId )
if ( nType == udg__PLANECATEGORY_BOMBER ) then
call BomberAction( fp_nPlaneId )
elseif ( nType == udg__PLANECATEGORY_FIGHTER ) then
call FighterAction( fp_nPlaneId )
elseif ( nType == udg__PLANECATEGORY_DROPPER ) then
call DropperAction( fp_nPlaneId )
elseif ( nType == udg__PLANECATEGORY_CARRIER ) then
call CarrierAction( fp_nPlaneId )
endif
endfunction
function PlaneActionTimerExpires takes nothing returns nothing
local integer nPlaneId
set nPlaneId = 0
loop
exitwhen nPlaneId >= GetPlaneBuffNum()
call PlaneActionTimerExpiresSingle( nPlaneId )
set nPlaneId = nPlaneId + 1
endloop
endfunction
function PlaneOrdered takes unit fp_uPlane returns nothing
local integer nPlaneId
local location locPlane
local location locTargetFurther
if ( not IsUnitPlane( fp_uPlane ) ) then
return
endif
set nPlaneId = GetPlaneIndex( fp_uPlane )
set locPlane = GetUnitLoc( fp_uPlane )
set locTargetFurther = PolarProjectionBJ( locPlane, 1000, GetPlaneDirection(nPlaneId) )
call IssuePointOrderLoc( fp_uPlane, "move", locTargetFurther )
call RemoveLocation( locPlane )
call RemoveLocation( locTargetFurther )
endfunction
//===========================================================================
function InitTrig_Plane_Action_Functions takes nothing returns nothing
endfunction
function PlaneFinishing takes integer fp_nPlaneId returns nothing
local unit uPlane
local integer nPlaneUnitType
local integer nPTId
local boolean bClockWise
local real rDir
local real rRadius = 1000
local location locCurrent
local location locTarget
local integer nIndex
local real rScale
local integer nAlpha
local real rHeight
set uPlane = GetPlane( fp_nPlaneId )
set bClockWise = GetRandomInt(0, 1) == 0
set locCurrent = GetUnitLoc( uPlane )
set rDir = GetPlaneDirection( fp_nPlaneId)
set nPlaneUnitType = GetUnitTypeId( uPlane )
set nPTId = GetPlaneTypeIndex( nPlaneUnitType )
if ( nPTId < 0 ) then
return
endif
if ( GetPlaneTypeCategory (nPTId) != udg__PLANECATEGORY_FIGHTER ) then
if ( bClockWise ) then
set rDir = rDir - 60
else
set rDir = rDir + 60
endif
endif
set locTarget = PolarProjectionBJ( locCurrent, rRadius, rDir )
call RemoveLocation( locCurrent )
call SetUnitInvulnerable( uPlane, true )
call UnitAddAbility( uPlane, 'Aloc' )
call SetUnitMoveSpeed( uPlane, 522 )
call IssuePointOrderLoc( uPlane, "move", locTarget )
call RemoveLocation( locTarget )
set rHeight = GetUnitFlyHeight( uPlane ) + 500
set nIndex = 1
set rScale = 1
set nAlpha = 200
loop
exitwhen IsUnitDeadBJ( uPlane )
exitwhen nIndex >= 10
set rScale = rScale + 0.2
set nAlpha = nAlpha - 20
//call SetUnitScale( uPlane, rScale, rScale, rScale )
call SetUnitVertexColor( uPlane, nAlpha, nAlpha, nAlpha, nAlpha )
set nIndex = nIndex + 1
call SetUnitFlyHeight( uPlane, rHeight, 30 * (2 * nIndex + 1) )
call TriggerSleepAction( 0.1 )
endloop
if ( IsUnitAliveBJ(uPlane) ) then
call RemoveUnit( uPlane )
call RemovePlane( fp_nPlaneId )
endif
endfunction
//===========================================================================
function InitTrig_Plane_Finishing_Functions takes nothing returns nothing
endfunction
function IsUnitPeonHouse takes integer fp_nUT returns boolean
local integer nIndex
set nIndex = 0
loop
exitwhen nIndex >= udg_PeonHouseTypesNum
if ( fp_nUT == udg_PeonHouseTypes[nIndex] ) then
return true
endif
set nIndex = nIndex + 1
endloop
return false
endfunction
function IsDestructibleWall takes destructable fp_destr returns boolean
local integer nIndex
local integer nDT
set nDT = GetDestructableTypeId( fp_destr )
set nIndex = 0
loop
exitwhen nIndex >= udg_TownWallTypesNum
if ( nDT == udg_TownWallTypes[nIndex] ) then
return true
endif
set nIndex = nIndex + 1
endloop
set nIndex = 0
loop
exitwhen nIndex >= udg_BaseWallTypesNum
if ( nDT == udg_BaseWallTypes[nIndex] ) then
return true
endif
set nIndex = nIndex + 1
endloop
return false
endfunction
function GetPeonHouseNum takes nothing returns integer
return udg_PeonHouse_Num
endfunction
function GetPeonHouse takes integer fp_nIndex returns unit
return udg_PeonHouse[fp_nIndex]
endfunction
function SetPeonHouse takes integer fp_nIndex, unit fp_uHouse returns nothing
set udg_PeonHouse[fp_nIndex] = fp_uHouse
endfunction
function GetPeonHouseIndex takes unit fp_uHouse returns integer
return GetUnitUserData( fp_uHouse )
endfunction
function GetPeonHouseEntrance takes integer fp_nIndex returns location
return udg_PeonHouse_Entrance[fp_nIndex]
endfunction
function GetPeonHouseState takes integer fp_nIndex returns integer
return udg_PeonHouse_State[fp_nIndex]
endfunction
function SetPeonHouseState takes integer fp_nIndex, integer fp_nState returns nothing
set udg_PeonHouse_State[fp_nIndex] = fp_nState
endfunction
function GetPeonHousePos takes integer fp_nIndex returns location
return udg_PeonHouse_Pos[fp_nIndex]
endfunction
function SetPeonHousePos takes integer fp_nIndex, location fp_loc returns nothing
set udg_PeonHouse_Pos[fp_nIndex] = fp_loc
endfunction
function GetPeonHouseType takes integer fp_nIndex returns integer
return udg_PeonHouse_Type[fp_nIndex]
endfunction
function SetPeonHouseType takes integer fp_nIndex, integer fp_nType returns nothing
set udg_PeonHouse_Type[fp_nIndex] = fp_nType
endfunction
function InitPeonHouseFilter takes nothing returns boolean
return IsUnitPeonHouse( GetUnitTypeId(GetFilterUnit()) )
endfunction
function PeonHouseWarningAction takes nothing returns nothing
local unit uAttacked
local player pl
local integer nForceId
local integer nPlayerId
local integer nIndex
local location loc
if ( udg_GameOver == true ) then
return
endif
set uAttacked = GetTriggerUnit()
if ( not IsUnitPeonHouse(GetUnitTypeId(uAttacked)) ) then
return
endif
set pl = GetOwningPlayer( uAttacked )
set nPlayerId = GetPlayerId( pl )
set nForceId = GetPlayerForceId( nPlayerId )
if ( udg_HouseBaseAttackedWarning[nForceId] ) then
return
endif
set udg_HouseBaseAttackedWarning[nForceId] = true
set loc = GetUnitLoc( uAttacked )
set nPlayerId = nForceId * 4
set nIndex = 0
loop
exitwhen nIndex >= 3
call PingMinimapForPlayerEx( pl, GetLocationX(loc), GetLocationY(loc), 4, 255, 0, 0, true )
call SetCameraQuickPositionLocForPlayer( Player(nPlayerId), loc )
set pl = Player( nPlayerId )
if ( nForceId == 0 ) then
call PlaySoundPlayer( pl, gg_snd_KnightTownAttack1 )
else
call PlaySoundPlayer( pl, gg_snd_GruntTownAttack1 )
endif
set nIndex = nIndex + 1
set nPlayerId = nPlayerId + 1
endloop
call RemoveLocation( loc )
call PolledWait( 7.00 )
set udg_HouseBaseAttackedWarning[nForceId] = false
endfunction
function InitPeonHouse takes nothing returns nothing
local group grp
local integer nForce
local unit uHouse
local trigger trg
set udg_PeonHouse_Num = 0
set nForce = 0
loop
exitwhen nForce >= 2
set grp = GetUnitsOfPlayerMatching( GetForcePlayer(nForce), Condition(function InitPeonHouseFilter) )
loop
set uHouse = GroupPickRandomUnit( grp )
exitwhen uHouse == null
call SetPeonHouse( udg_PeonHouse_Num, uHouse )
call SetUnitUserData( uHouse, udg_PeonHouse_Num )
set udg_PeonHouse_Num = udg_PeonHouse_Num + 1
set trg = CreateTrigger()
call TriggerRegisterUnitEvent( trg, uHouse, EVENT_UNIT_DAMAGED )
call TriggerAddAction( trg, function PeonHouseWarningAction )
call GroupRemoveUnit( grp, uHouse )
endloop
call DestroyGroup( grp )
set nForce = nForce + 1
endloop
call ShowDebugMsg( "House Num = " + I2S(GetPeonHouseNum()) )
endfunction
function IncomePlayerHouse takes integer fp_nPlayerId, unit fp_uHouse returns nothing
local texttag ttGold
local texttag ttLumber
local location loc
local location loc1
local integer nGold
local integer nLumber
local integer nPlayerNum
local integer nPlayerNum1
set nPlayerNum = GetForcePlayerNum( GetPlayerForceId(fp_nPlayerId) )
if ( nPlayerNum == 0 ) then
return
endif
set nPlayerNum1 = GetForcePlayerNum( 1 - GetPlayerForceId(fp_nPlayerId) )
if ( nPlayerNum1 < nPlayerNum ) then
set nPlayerNum1 = nPlayerNum
endif
set nGold = udg_PeonGold[fp_nPlayerId] * nPlayerNum1 / nPlayerNum
set nLumber = udg_PeonLumber[fp_nPlayerId] * nPlayerNum1 / nPlayerNum
set loc = GetUnitLoc( fp_uHouse )
set loc1 = Location( GetLocationX(loc) - 100, GetLocationY(loc) )
set ttGold = CreateTextTagLocBJ( "+"+I2S(nGold), loc1, 50, 10, 100, 100, 0, 0 )
call RemoveLocation( loc1 )
call SetTextTagPermanent( ttGold, false )
call SetTextTagVelocityBJ( ttGold, 64, 90 )
call SetTextTagLifespan( ttGold, 3 )
call SetTextTagFadepoint( ttGold, 1 )
set loc1 = Location( GetLocationX(loc), GetLocationY(loc) )
set ttLumber = CreateTextTagLocBJ( "+"+I2S(nLumber), loc1, 50, 10, 0, 100, 0, 0 )
call RemoveLocation( loc1 )
call SetTextTagPermanent( ttLumber, false )
call SetTextTagVelocityBJ( ttLumber, 64, 90 )
call SetTextTagLifespan( ttLumber, 3 )
call SetTextTagFadepoint( ttLumber, 1 )
if ( Player(fp_nPlayerId) != GetLocalPlayer() ) then
call SetTextTagVisibility( ttGold, false )
call SetTextTagVisibility( ttLumber, false )
endif
//call PlaySoundAtPointBJ( gg_snd_ReceiveGold, 100, loc, 0 )
call RemoveLocation( loc )
call SetPlayerStateBJ( Player(fp_nPlayerId), PLAYER_STATE_RESOURCE_GOLD, GetPlayerState(Player(fp_nPlayerId), PLAYER_STATE_RESOURCE_GOLD) + nGold )
call SetPlayerStateBJ( Player(fp_nPlayerId), PLAYER_STATE_RESOURCE_LUMBER, GetPlayerState(Player(fp_nPlayerId), PLAYER_STATE_RESOURCE_LUMBER) + nLumber )
//Score
set udg_Fun_AddScoreResources_Pl = fp_nPlayerId
set udg_Fun_AddScoreResources_Resource = udg_PeonGold[fp_nPlayerId] + udg_PeonLumber[fp_nPlayerId]
call TriggerExecute( gg_trg_Function_AddScoreResources )
endfunction
function Income takes nothing returns nothing
local integer nForce
local unit uHouse
local integer nIndex
local integer nPlayerId
if ( udg_IncomeIndex >= GetPeonHouseNum() / 2 ) then
set udg_IncomeIndex = 0
endif
set nForce = 0
loop
exitwhen nForce >= 2
set uHouse = GetPeonHouse( udg_IncomeIndex + nForce * GetPeonHouseNum() / 2 )
if ( uHouse != null and IsUnitAliveBJ(uHouse) ) then
set nIndex = 0
set nPlayerId = nForce * 4
loop
exitwhen nIndex >= 3
call IncomePlayerHouse( nPlayerId, uHouse )
set nIndex = nIndex + 1
set nPlayerId = nPlayerId + 1
endloop
endif
set nForce = nForce + 1
endloop
set udg_IncomeIndex = udg_IncomeIndex + 1
endfunction
function KillHouseBonus takes player fp_plKiller returns nothing
local integer nPlayerIdKiller
local integer nForceIdKiller
local integer nPlayerId
local integer nPlayerIdEnd
local integer CN_GoldBonus = 100
local integer CN_LumberBonus = 50
local integer nGoldBonus
local integer nLumberBonus
if ( fp_plKiller == null ) then
return
endif
set nPlayerIdKiller = GetPlayerId( fp_plKiller )
set nForceIdKiller = GetPlayerForceId( nPlayerIdKiller )
set nPlayerId = nForceIdKiller * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2
loop
exitwhen nPlayerId >= nPlayerIdEnd
if ( IsSlotPlayer(nPlayerId) ) then
if ( nPlayerId == nPlayerIdKiller ) then
set nGoldBonus = CN_GoldBonus * 2
set nLumberBonus = CN_LumberBonus * 2
else
set nGoldBonus = CN_GoldBonus
set nLumberBonus = CN_LumberBonus
endif
call SetPlayerGold( nPlayerId, GetPlayerGold(nPlayerId) + nGoldBonus )
call SetPlayerLumber( nPlayerId, GetPlayerLumber(nPlayerId) + nLumberBonus )
call DisplayTimedTextToPlayer( Player(nPlayerId), 0, 0, 20, udg__STR_KILLHOUSEBONUS_1 + I2S(nGoldBonus) + udg__STR_KILLHOUSEBONUS_2 + I2S(nLumberBonus) + udg__STR_KILLHOUSEBONUS_3 )
endif
set nPlayerId = nPlayerId + 1
endloop
endfunction
function HouseDies takes unit fp_uHouse, player fp_plKiller returns nothing
local integer nIndex
local integer nPlayerId
local integer nPlayerIdEnd
local integer nPlayerIdHouse
local integer nForceIdHouse
local sound array snds
if ( not IsUnitPeonHouse(GetUnitTypeId(fp_uHouse)) ) then
return
endif
set snds[0] = gg_snd_H06VillagerF24
set snds[1] = gg_snd_H06VillagerM25
set nIndex = GetPeonHouseIndex( fp_uHouse )
call SetPeonHouse( nIndex, null )
set nPlayerIdHouse = GetPlayerId( GetOwningPlayer(fp_uHouse) )
set nForceIdHouse = GetPlayerForceId( nPlayerIdHouse )
set nPlayerId = nForceIdHouse * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2
loop
exitwhen nPlayerId >= nPlayerIdEnd
call CameraSetEQNoiseForPlayer( Player(nPlayerId), 10.00 )
call PlaySoundPlayer( Player(nPlayerId), snds[GetRandomInt(0, 1)] )
set nPlayerId = nPlayerId + 1
endloop
//call KillHouseBonus( fp_plKiller )
call TriggerSleepAction( 2 )
set nPlayerId = nForceIdHouse * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2
loop
exitwhen nPlayerId >= nPlayerIdEnd
call CameraClearNoiseForPlayer( Player(nPlayerId) )
set nPlayerId = nPlayerId + 1
endloop
endfunction
//===========================================================================
function InitTrig_Income_Functions takes nothing returns nothing
endfunction
function GetTowerTypesNum takes nothing returns integer
return udg_TowerTypesNum
endfunction
function GetTowerType takes integer fp_nIndex returns integer
return udg_TowerTypes[fp_nIndex]
endfunction
function GetTowerTypeIndex takes integer fp_nUT returns integer
local integer nIndex
set nIndex = 0
loop
exitwhen nIndex >= GetTowerTypesNum()
if ( fp_nUT == GetTowerType(nIndex) ) then
return nIndex
endif
set nIndex = nIndex + 1
endloop
return -1
endfunction
function IsUnitTower takes integer fp_nUT returns boolean
return GetTowerTypeIndex( fp_nUT ) >= 0
endfunction
function GetTowerTypePrice takes integer fp_nIndex returns integer
return udg_TowerTypes_Price[fp_nIndex]
endfunction
function GetTowerTypeIcon takes integer fp_nIndex returns string
return udg_TowerTypes_Icon[fp_nIndex]
endfunction
//===========================================================================
function InitTrig_Tower_Type_Functions takes nothing returns nothing
endfunction
function GetMagneticFieldBuffNum takes nothing returns integer
return udg_MagneticField_BuffNum
endfunction
function GetMagneticFieldIndex takes unit fp_uField returns integer
return GetUnitUserData( fp_uField )
endfunction
function IsValidMagneticFieldIndex takes integer fp_nIndex returns boolean
return fp_nIndex >= 1 and fp_nIndex < udg_MagneticField_BuffNum
endfunction
function GetMagneticField takes integer fp_nIndex returns unit
return udg_MagneticField[fp_nIndex]
endfunction
function SetMagneticField takes integer fp_nIndex, unit fp_uMF returns nothing
set udg_MagneticField[fp_nIndex] = fp_uMF
endfunction
function GetMagneticFieldEffect takes integer fp_nIndex returns unit
return udg_MagneticField_Effect[fp_nIndex]
endfunction
function SetMagneticFieldEffect takes integer fp_nIndex, unit fp_uEffect returns nothing
set udg_MagneticField_Effect[fp_nIndex] = fp_uEffect
endfunction
function GetMagneticFieldDisabledId takes integer fp_nIndex returns integer
return udg_MagneticField_DisabledId[fp_nIndex]
endfunction
function SetMagneticFieldDisabledId takes integer fp_nIndex, integer fp_nDisabledId returns nothing
set udg_MagneticField_DisabledId[fp_nIndex] = fp_nDisabledId
endfunction
function AddMagneticField takes unit fp_uMF, unit fp_uEffect returns integer
local integer nIndex = 1
loop
exitwhen nIndex >= udg_MagneticField_BuffNum
exitwhen GetMagneticField(nIndex) == null
set nIndex = nIndex + 1
endloop
if ( nIndex == udg_MagneticField_BuffNum ) then
set udg_MagneticField_BuffNum = udg_MagneticField_BuffNum + 1
endif
call SetMagneticField( nIndex, fp_uMF )
call SetMagneticFieldEffect( nIndex, fp_uEffect )
call SetMagneticFieldDisabledId( nIndex, 0 )
call SetUnitUserData( fp_uMF, nIndex )
call SetUnitUserData( fp_uEffect, nIndex )
return nIndex
endfunction
function RemoveMagneticField takes integer fp_nIndex returns nothing
local unit u
call SetMagneticField( fp_nIndex, null )
set u = GetMagneticFieldEffect( fp_nIndex )
if ( u != null ) then
call RemoveUnit( u )
call SetMagneticFieldEffect( fp_nIndex, null )
endif
endfunction
function UnitIsInMagneticField takes unit fp_unit returns boolean
return UnitHasBuffBJ( fp_unit, 'B002' )
endfunction
function MagneticFieldUp takes unit fp_uField returns nothing
local location loc
local unit u
set loc = GetUnitLoc( fp_uField )
set u = CreateUnitAtLoc( GetOwningPlayer(fp_uField), 'n00M', loc, 0 )
call IssuePointOrderLoc( u, "deathanddecay", loc )
call RemoveLocation( loc )
call AddMagneticField( fp_uField, u )
endfunction
function MagneticFieldDown takes unit fp_uField returns nothing
local integer nIndex
set nIndex = GetMagneticFieldIndex( fp_uField )
if ( not IsValidMagneticFieldIndex(nIndex) ) then
return
endif
if ( GetMagneticField(nIndex) != fp_uField ) then
return
endif
call RemoveMagneticField( nIndex )
endfunction
function TreatPlaneMagneticField takes integer fp_nPlaneId returns nothing
local unit uPlane
set uPlane = GetPlane( fp_nPlaneId )
if ( uPlane == null or IsUnitDeadBJ(uPlane) ) then
return
endif
if ( UnitIsInMagneticField(uPlane) ) then
if ( not GetPlaneInMagneticField(fp_nPlaneId) ) then
call SetPlaneInMagneticField(fp_nPlaneId, true)
call SetUnitVertexColor(uPlane, 128, 0, 128, 255)
endif
else
if ( GetPlaneInMagneticField(fp_nPlaneId) ) then
call SetPlaneInMagneticField(fp_nPlaneId, false)
call SetUnitVertexColor(uPlane, 255, 255, 255, 255)
endif
endif
endfunction
function MagneticFieldTimerExpires takes nothing returns nothing
local integer nPlaneId
set nPlaneId = 0
loop
exitwhen nPlaneId >= GetPlaneBuffNum()
call TreatPlaneMagneticField( nPlaneId )
set nPlaneId = nPlaneId + 1
endloop
endfunction
function MagneticFieldFrozen takes unit fp_uField returns nothing
local integer nIndex
local unit uEffect
local integer nDisabled
local location loc
set nIndex = GetMagneticFieldIndex( fp_uField )
if ( not IsValidMagneticFieldIndex(nIndex) ) then
return
endif
set nDisabled = GetMagneticFieldDisabledId( nIndex )
if ( nDisabled == 0 ) then
set uEffect = GetMagneticFieldEffect( nIndex )
call ShowUnit( uEffect, false )
endif
set nDisabled = nDisabled + 1
call SetMagneticFieldDisabledId( nIndex, nDisabled )
call PolledWait( 7 )
if ( not IsUnitAliveBJ(fp_uField) ) then
return
endif
if ( GetMagneticField(nIndex) != fp_uField ) then
return
endif
if ( nDisabled != GetMagneticFieldDisabledId(nIndex) ) then
return
endif
call ShowUnit( uEffect, true )
call SetMagneticFieldDisabledId( nIndex, 0 )
set loc = GetUnitLoc( fp_uField )
call IssuePointOrderLoc( uEffect, "deathanddecay", loc )
call RemoveLocation( loc )
endfunction
function CastMagneticField takes unit fp_uEffect returns nothing
local integer nIndex
local unit uField
local location loc
set nIndex = GetUnitUserData( fp_uEffect )
if ( not IsValidMagneticFieldIndex(nIndex) ) then
return
endif
set uField = GetMagneticField( nIndex )
call ShowDebugMsg( "Death and Decay recasting = " + I2S(nIndex) )
call TriggerSleepAction(0.1)
if ( not IsUnitAliveBJ(uField) ) then
return
endif
set loc = GetUnitLoc( uField )
call IssuePointOrderLoc( fp_uEffect, "deathanddecay", loc )
call RemoveLocation( loc )
endfunction
//===========================================================================
function InitTrig_Magnetic_Field_Functions takes nothing returns nothing
endfunction
function GetScoutTowerIndex takes unit fp_uScout returns integer
return GetUnitUserData( fp_uScout )
endfunction
function GetScoutTowerBuffNum takes nothing returns integer
return udg_ScoutTower_BuffNum
endfunction
function IsValidScoutTowerIndex takes integer fp_nIndex returns boolean
return fp_nIndex >= 1 and fp_nIndex < udg_ScoutTower_BuffNum
endfunction
function GetScoutTower takes integer fp_nIndex returns unit
return udg_ScoutTower[fp_nIndex]
endfunction
function SetScoutTower takes integer fp_nIndex, unit fp_uScout returns nothing
set udg_ScoutTower[fp_nIndex] = fp_uScout
endfunction
function GetScoutTowerInConstruction takes integer fp_nIndex returns boolean
return udg_ScoutTower_InConstruction[fp_nIndex]
endfunction
function SetScoutTowerInConstruction takes integer fp_nIndex, boolean fp_bIn returns nothing
set udg_ScoutTower_InConstruction[fp_nIndex] = fp_bIn
endfunction
function GetScoutTowerEffect takes integer fp_nIndex returns unit
return udg_ScoutTower_Effect[fp_nIndex]
endfunction
function SetScoutTowerEffect takes integer fp_nIndex, unit fp_uEffect returns nothing
set udg_ScoutTower_Effect[fp_nIndex] = fp_uEffect
endfunction
function GetScoutTowerDisabledId takes integer fp_nIndex returns integer
return udg_ScoutTower_DisabledId[fp_nIndex]
endfunction
function SetScoutTowerDisabledId takes integer fp_nIndex, integer fp_nDisabledId returns nothing
set udg_ScoutTower_DisabledId[fp_nIndex] = fp_nDisabledId
endfunction
function AddScoutTower takes unit fp_uScout, unit fp_uEffect, boolean fp_bIn returns integer
local integer nIndex
set nIndex = 1
loop
exitwhen nIndex >= udg_ScoutTower_BuffNum
exitwhen GetScoutTower(nIndex) == null
set nIndex = nIndex + 1
endloop
if ( nIndex == udg_ScoutTower_BuffNum ) then
set udg_ScoutTower_BuffNum = udg_ScoutTower_BuffNum + 1
endif
call SetScoutTower( nIndex, fp_uScout )
call SetScoutTowerInConstruction( nIndex, fp_bIn )
call SetScoutTowerEffect( nIndex, fp_uEffect )
call SetScoutTowerDisabledId( nIndex, 0 )
call SetUnitUserData( fp_uScout, nIndex )
return nIndex
endfunction
function RemoveScoutTower takes integer fp_nIndex returns nothing
local unit u
call SetScoutTower( fp_nIndex, null )
set u = GetScoutTowerEffect( fp_nIndex )
if ( u != null ) then
call KillUnit( u )
call RemoveUnit( u )
call SetScoutTowerEffect( fp_nIndex, null )
endif
endfunction
function ScoutTowerConstruction takes unit fp_uScout returns nothing
call AddScoutTower( fp_uScout, null, true )
call ShowDebugMsg( "ScoutTowerConstruction" )
endfunction
function UpgradeScoutTower takes unit fp_uScout returns nothing
local integer nIndex
local unit u
if ( not IsUnitAliveBJ(fp_uScout) ) then
return
endif
set nIndex = GetScoutTowerIndex( fp_uScout )
if ( not GetScoutTowerInConstruction(nIndex) ) then
set u = ReplaceUnitBJ( fp_uScout, 'h006', bj_UNIT_STATE_METHOD_RELATIVE )
call SetScoutTower( nIndex, u )
call SetUnitUserData( u, nIndex )
endif
endfunction
function UpgradePlayerScoutTowers takes player fp_pl returns nothing
local group grp
local unit u
local integer nIndex
set grp = GetUnitsOfPlayerAndTypeId( fp_pl, 'h00L')
loop
set u = FirstOfGroup( grp )
exitwhen u == null
call GroupRemoveUnit( grp, u )
call UpgradeScoutTower( u )
endloop
call DestroyGroup( grp )
endfunction
function ScoutTowerUp takes unit fp_uScout returns nothing
local integer nIndex
local location loc
local unit u
set nIndex = GetScoutTowerIndex( fp_uScout )
if ( not IsValidScoutTowerIndex(nIndex) ) then
call ShowAssertMsg( "ScoutTowerUp", "Invalid Scout Tower Index." )
return
endif
if ( GetScoutTowerEffect(nIndex) == null ) then
set loc = GetUnitLoc( fp_uScout )
set u = CreateUnitAtLoc( GetOwningPlayer(fp_uScout), 'n018', loc, 0 )
call RemoveLocation( loc )
call SetScoutTowerEffect( nIndex, u )
else
call ShowAssertMsg( "ScoutTowerUp", "Effect is not null when up." )
endif
call SetScoutTowerInConstruction( nIndex, false )
if ( GetUnitTypeId(fp_uScout) == 'h00L' and GetPlayerTechCountSimple('R009', GetOwningPlayer(fp_uScout)) > 0 ) then
call UpgradeScoutTower( fp_uScout )
endif
call ShowDebugMsg( "ScoutTowerUp" )
endfunction
function ScoutTowerDown takes unit fp_uScout returns nothing
local integer nIndex
call ShowDebugMsg( "ScoutTowerDown1" )
set nIndex = GetScoutTowerIndex( fp_uScout )
if ( not IsValidScoutTowerIndex(nIndex) ) then
return
endif
call ShowDebugMsg( "ScoutTowerDown2" )
if ( GetScoutTower(nIndex) != fp_uScout ) then
return
endif
call RemoveScoutTower( nIndex )
call ShowDebugMsg( "ScoutTowerDown3" )
endfunction
function ScoutTowerFrozen takes unit fp_uScout returns nothing
local integer nIndex
local unit uEffect
local integer nDisabled
call ShowDebugMsg( "ScoutTowerFrozen1 = " + GetUnitName(fp_uScout) )
set nIndex = GetScoutTowerIndex( fp_uScout )
if ( not IsValidScoutTowerIndex(nIndex) ) then
return
endif
set nDisabled = GetScoutTowerDisabledId( nIndex )
if ( nDisabled == 0 ) then
set uEffect = GetScoutTowerEffect( nIndex )
call ShowUnit( uEffect, false )
endif
set nDisabled = nDisabled + 1
call SetScoutTowerDisabledId( nIndex, nDisabled )
call ShowDebugMsg( "ScoutTowerFrozen2" )
call PolledWait( 7 )
if ( not IsUnitAliveBJ(fp_uScout) ) then
return
endif
if ( GetScoutTower(nIndex) != fp_uScout ) then
return
endif
if ( nDisabled != GetScoutTowerDisabledId(nIndex) ) then
return
endif
call ShowUnit( uEffect, true )
call SetScoutTowerDisabledId( nIndex, 0 )
call ShowDebugMsg( "ScoutTowerFrozen3" )
endfunction
function InitScoutTowers takes nothing returns nothing
local group grp
local unit u
local integer nIndex
set grp = GetUnitsOfTypeIdAll( 'h006' )
loop
set u = FirstOfGroup( grp )
exitwhen u == null
call GroupRemoveUnit( grp, u )
call AddScoutTower( u, null, false )
call ScoutTowerUp( u )
endloop
call DestroyGroup( grp )
endfunction
//===========================================================================
function InitTrig_Scout_Tower_Functions takes nothing returns nothing
endfunction
function EnumDefenseBuildingFilter takes nothing returns boolean
return GetOwningPlayer(GetFilterUnit()) == udg_EnumDefenseBuildingFilter_PL and GetUnitTypeId(GetFilterUnit()) == udg_EnumDefenseBuildingFilter_UT
endfunction
function TowerBuild takes unit fp_uBuilder, integer fp_Building, location fp_Loc returns nothing
local player pl
local unit uBuilder
local group g
local unit u
local rect rc
local boolean b
if ( fp_Building == OrderId("move") or fp_Building == OrderId("attack") ) then
return
endif
if ( fp_Building == OrderId("patrol") or fp_Building == OrderId("smart") ) then
return
endif
//call ShowDisplayOrderID()
call ShowDebugMsg( "Id = " + I2S(fp_Building) )
//Warp gate
if ( fp_Building == 852504 ) then
return
endif
//Far Sight
if ( fp_Building == 852122 ) then
return
endif
//Nuclear Attack
if ( fp_Building == 852529 ) then
return
endif
call PauseUnit( fp_uBuilder, true )
set pl = GetOwningPlayer( fp_uBuilder )
set rc = GetSideArea( GetPlayerId(pl) )
if ( not IsLocationInRect(rc, fp_Loc) ) then
return
endif
set udg_EnumDefenseBuildingFilter_UT = fp_Building
set udg_EnumDefenseBuildingFilter_PL = pl
set g = GetUnitsInRangeOfLocMatching( 10, fp_Loc, Filter(function EnumDefenseBuildingFilter) )
if ( FirstOfGroup(g) != null ) then
call DestroyGroup( g )
call PauseUnit( fp_uBuilder, false )
return
endif
call DestroyGroup( g )
// loop
// set u = FirstOfGroup(g)
// exitwhen u == null
// call GroupRemoveUnit(g, u)
// call RemoveUnit(u)
// endloop
// call DestroyGroup( g )
set uBuilder = CreateUnitAtLoc( pl, 'n000', fp_Loc, bj_UNIT_FACING )
call IssuePointOrderByIdLoc( uBuilder, fp_Building, fp_Loc )
call TriggerSleepAction( 0.1 )
call IssueImmediateOrder( fp_uBuilder, "stop" )
call PauseUnit( fp_uBuilder, false )
call TriggerSleepAction( 2.00 )
call RemoveUnit( uBuilder )
endfunction
function SimulateLifeDrainSlow takes unit fp_uAttacker, unit fp_uAttacked returns nothing
local location loc
local unit u
set loc = GetRectCenter( gg_rct_TempArea )
set u = CreateUnitAtLoc( GetOwningPlayer(fp_uAttacker), 'n00K', loc, 0 )
call RemoveLocation( loc )
call IssueTargetOrder( u, "slow", fp_uAttacked )
call SetUnitPathing( u, false )
call UnitApplyTimedLife( u, 'BTLF', 2 )
endfunction
function TowerFrozenFilter takes nothing returns boolean
if ( IsUnitDeadBJ(GetFilterUnit()) ) then
return false
endif
if ( GetUnitTypeId(GetFilterUnit()) == 'h00L' ) then //Scout Tower
return true
endif
if ( GetUnitTypeId(GetFilterUnit()) == 'h006' ) then //Stealth Detection
return true
endif
if ( GetUnitTypeId(GetFilterUnit()) == 'n00N' ) then //Magnetic Field
return true
endif
return false
endfunction
function TowerFrozen takes unit fp_uAttacker, unit fp_uTarget returns nothing
local location loc
local group grp
local unit u
local player pl
local integer nType
call ShowDebugMsg( "TowerFrozen1" )
call PolledWait(1)
set pl = GetOwningPlayer( fp_uAttacker )
set loc = GetUnitLoc( fp_uTarget )
set grp = GetUnitsInRangeOfLocMatching( 500, loc, Condition(function TowerFrozenFilter) )
call RemoveLocation( loc )
loop
set u = FirstOfGroup( grp )
exitwhen u == null
call GroupRemoveUnit( grp, u )
call ShowDebugMsg( "TowerFrozen1-1" )
if ( IsPlayerEnemy(GetOwningPlayer(u), pl) ) then
set nType = GetUnitTypeId( u )
if ( nType == 'n00N' ) then
call ShowDebugMsg( "TowerFrozen2" )
set udg_Fun_MagneticFieldFrozen_P1 = u
call TriggerExecute( gg_trg_Function_MagneticFieldFrozen )
elseif ( nType == 'h00L' or nType == 'h006' ) then
call ShowDebugMsg( "TowerFrozen3" )
set udg_Fun_ScoutTowerFrozen_P1 = u
call TriggerExecute( gg_trg_Function_ScoutTowerFrozen )
endif
endif
endloop
call DestroyGroup( grp )
endfunction
//===========================================================================
function InitTrig_Towers_Functions takes nothing returns nothing
endfunction
function GetTechBuffNum takes nothing returns integer
return udg_Tech_BuffNum
endfunction
function GetTech takes integer fp_nIndex returns integer
return udg_Tech[fp_nIndex]
endfunction
function SetTech takes integer fp_nIndex, integer fp_nTech returns nothing
set udg_Tech[fp_nIndex] = fp_nTech
endfunction
function GetTechCost1 takes integer fp_nIndex returns integer
return udg_Tech_Cost_1[fp_nIndex]
endfunction
function SetTechCost1 takes integer fp_nIndex, integer fp_nTechCost1 returns nothing
set udg_Tech_Cost_1[fp_nIndex] = fp_nTechCost1
endfunction
function GetTechCost2 takes integer fp_nIndex returns integer
return udg_Tech_Cost_2[fp_nIndex]
endfunction
function SetTechCost2 takes integer fp_nIndex, integer fp_nTechCost2 returns nothing
set udg_Tech_Cost_2[fp_nIndex] = fp_nTechCost2
endfunction
function InitTech takes nothing returns nothing
set udg_Tech_BuffNum = 0
//Jet
call SetTech( udg_Tech_BuffNum, 'R000' )
call SetTechCost1( udg_Tech_BuffNum, 600 )
call SetTechCost2( udg_Tech_BuffNum, 900 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
//Cluster
call SetTech( udg_Tech_BuffNum, 'R002' )
call SetTechCost1( udg_Tech_BuffNum, 600 )
call SetTechCost2( udg_Tech_BuffNum, 900 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
//Electro
call SetTech( udg_Tech_BuffNum, 'R003' )
call SetTechCost1( udg_Tech_BuffNum, 800 )
call SetTechCost2( udg_Tech_BuffNum, 1200 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
//Chemical
call SetTech( udg_Tech_BuffNum, 'R005' )
call SetTechCost1( udg_Tech_BuffNum, 800 )
call SetTechCost2( udg_Tech_BuffNum, 1200 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
//Shield
call SetTech( udg_Tech_BuffNum, 'R007' )
call SetTechCost1( udg_Tech_BuffNum, 1000 )
call SetTechCost2( udg_Tech_BuffNum, 1500 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
//Stealth
call SetTech( udg_Tech_BuffNum, 'R006' )
call SetTechCost1( udg_Tech_BuffNum, 1000 )
call SetTechCost2( udg_Tech_BuffNum, 1500 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
//Economic
call SetTech( udg_Tech_BuffNum, 'R004' )
call SetTechCost1( udg_Tech_BuffNum, 800 )
call SetTechCost2( udg_Tech_BuffNum, 1600 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
return
//Stealth Detection
call SetTech( udg_Tech_BuffNum, 'R009' )
call SetTechCost1( udg_Tech_BuffNum, 800 )
call SetTechCost2( udg_Tech_BuffNum, 0 )
set udg_Tech_BuffNum = udg_Tech_BuffNum + 1
endfunction
function GetTechTotalCost takes nothing returns integer
local integer nIndex
local integer nCost
set nIndex = 0
set nCost = 0
loop
exitwhen nIndex >= GetTechBuffNum()
set nCost = nCost + GetTechCost1( nIndex )
set nCost = nCost + GetTechCost2( nIndex )
set nIndex = nIndex + 1
endloop
return nCost
endfunction
function GetPlayerTechPercentage takes integer fp_nPlayerIndex returns integer
local integer nIndex
local integer nCost
local integer nTech
local integer nTechLvl
local integer nPercent
set nIndex = 0
set nCost = 0
loop
exitwhen nIndex >= GetTechBuffNum()
set nTech = GetTech( nIndex )
set nTechLvl = GetPlayerTechCountSimple( nTech, Player(fp_nPlayerIndex) )
if ( nTechLvl >= 1 ) then
set nCost = nCost + GetTechCost1( nIndex )
endif
if ( nTechLvl >= 2 ) then
set nCost = nCost + GetTechCost2( nIndex )
endif
set nIndex = nIndex + 1
endloop
//call ShowDebugMsg( "nCost/TCost = " + I2S(nCost) + "/" + I2S(GetTechTotalCost()) )
set nPercent = R2I( I2R(nCost) / GetTechTotalCost() * 100. )
return nPercent
endfunction
//===========================================================================
function InitTrig_Tech_Functions takes nothing returns nothing
endfunction
function GetHeroAbilityNum takes nothing returns integer
return udg_HeroAbilityNum
endfunction
function GetHeroAbility takes integer fp_nIndex returns integer
return udg_HeroAbilities[fp_nIndex]
endfunction
function GetHeroAbilityIndex takes integer fp_nAbility returns integer
local integer nIndex
set nIndex = 0
loop
exitwhen nIndex >= GetHeroAbilityNum()
if ( GetHeroAbility(nIndex) == fp_nAbility ) then
return nIndex
endif
set nIndex = nIndex + 1
endloop
return -1
endfunction
function GetHeroAbilityIcon takes integer fp_nIndex returns string
return udg_HeroAbilityIcons[fp_nIndex]
endfunction
function LimitHeroNumber takes nothing returns nothing
local integer index
set index = 0
loop
exitwhen index >= GetPlayerTotalNum()
// max heroes per player
call SetPlayerMaxHeroesAllowed( 1, Player(index) )
// each player is restricted to a limit per hero type as well
call ReducePlayerTechMaxAllowed( Player(index), 'H00A', 1 )
if ( IsSlotPlayer(index) ) then
endif
set index = index + 1
endloop
endfunction
function WarpGateJump takes integer fp_nAPId, unit fp_uGate, integer fp_nJumpId returns nothing
local unit uAP
local unit uPlane
local integer nPlaneId
local player pl
local integer nPlayerId
local integer nPlaneUT
local integer nPTId
local location locTarget
local location locPlane
local real rAngle
local location locTargetFurther
local lightning l
local unit uGate
set uAP = GetAirport( fp_nAPId )
if ( uAP == null ) then
return
endif
call SetAirportWarpGating( fp_nAPId, true )
set locPlane = GetUnitLoc( fp_uGate )
set l = AddLightningEx( "FORK", true, GetUnitX(uAP), GetUnitY(uAP), 50, GetLocationX(locPlane), GetLocationY(locPlane), 90 )
set locTarget = GetAirportTarget( fp_nAPId )
set rAngle = AngleBetweenPoints( locPlane, locTarget )
call TriggerSleepAction( (fp_nJumpId + 2) * 0.5 )
set nPlaneId = GetAirportTrainingPlane( fp_nAPId )
call SetAirportTrainingPlane( fp_nAPId, -1 )
call SetAirportTrainingCount( fp_nAPId, -1 )
call SetAirportWarpGating( fp_nAPId, false )
set pl = GetOwningPlayer( GetAirport(fp_nAPId) )
set nPlayerId = GetPlayerId( pl )
set uPlane = GetPlane( nPlaneId )
set nPlaneUT = GetUnitTypeId( uPlane )
call RemoveUnit( uPlane )
set uPlane = CreateUnitAtLoc( pl, nPlaneUT, locPlane, rAngle )
call SetUnitUserData( uPlane, nPlaneId )
call SetPlane( nPlaneId, uPlane )
call SetUnitPathing( uPlane, false )
call SetPlaneTarget( nPlaneId, locTarget )
call ShowDebugMsgLocation( "Take Off", locTarget )
call SetPlaneState( nPlaneId, udg__PLANESTATE_FLYING )
call SetPlaneFlyTick( nPlaneId, 0 )
call SetPlaneDirection( nPlaneId, rAngle )
set locTargetFurther = PolarProjectionBJ( locPlane, 1000, rAngle )
call RemoveLocation( locPlane )
call IssuePointOrderLoc( uPlane, "move", locTargetFurther )
call RemoveLocation( locTargetFurther )
set nPTId = GetPlaneTypeIndex( nPlaneUT )
call SetUnitFlyHeight( uPlane, GetPlaneTypeFlyHeight(nPTId), 300.00 )
call TriggerSleepAction( 1 )
call DestroyLightning( l )
endfunction
function AdjustWarpGateTarget takes unit fp_uCaster, location fp_loc returns nothing
local location locCaster
local location locTarget
local real rDis
local integer nLvlGate
local real rDisMax
local real rAngle
set locCaster = GetUnitLoc( fp_uCaster )
set rDis = DistanceBetweenPoints( locCaster, fp_loc )
set nLvlGate = GetUnitAbilityLevel( fp_uCaster, 'A01J' )
call ShowDebugMsg( "nLvlGate = " + I2S(nLvlGate) )
if ( nLvlGate == 1 ) then
set rDisMax = 2000
elseif ( nLvlGate == 2 ) then
set rDisMax = 2500
elseif ( nLvlGate == 3 ) then
set rDisMax = 2500
else
return
endif
call ShowDebugMsg( "rDis/rDisMax = " + R2S(rDis) + "/" + R2S(rDisMax) )
if ( rDis > rDisMax ) then
set rAngle = AngleBetweenPoints( locCaster, fp_loc )
set locTarget = PolarProjectionBJ( locCaster, rDisMax, rAngle )
call MoveLocation( fp_loc, GetLocationX(locTarget), GetLocationY(locTarget) )
call RemoveLocation( locTarget )
endif
call RemoveLocation( locCaster )
endfunction
function WarpGate takes unit fp_uCaster, location fp_loc returns nothing
local integer nPlayerId
local unit uGate
local integer nAPId
local unit uAP
local integer nIndex
local location locTarget = Location( GetLocationX(fp_loc), GetLocationY(fp_loc) )
call AdjustWarpGateTarget( fp_uCaster, locTarget )
set nPlayerId = GetPlayerId( GetOwningPlayer(fp_uCaster) )
set uGate = CreateUnitAtLoc( Player(nPlayerId), 'h00K', locTarget, bj_UNIT_FACING )
if ( udg_WarpGateLoc[nPlayerId] != null ) then
call RemoveLocation( udg_WarpGateLoc[nPlayerId] )
endif
set udg_WarpGateLoc[nPlayerId] = GetUnitLoc( uGate )
//call UnitApplyTimedLife( uGate, 'BTLF', 60 )
call SetUnitAnimation( uGate, "birth" )
call SetUnitTimeScalePercent( uGate, 200 )
call TriggerSleepAction( 1 )
set nAPId = 1
set nIndex = 0
loop
exitwhen nAPId >= GetAirportBuffNum()
set uAP = GetAirport( nAPId )
if ( uAP != null and GetOwningPlayer(uAP) == Player(nPlayerId) and IsAirportTraining(nAPId) and not IsAirportWarpGating(nAPId) ) then
set udg_Fun_WarpGateJump_P1 = nAPId
set udg_Fun_WarpGateJump_P2 = uGate
set udg_Fun_WarpGateJump_P3 = nIndex
call TriggerExecute( gg_trg_Function_WarpGateJump )
set nIndex = nIndex + 1
endif
set nAPId = nAPId + 1
endloop
call TriggerSleepAction( (nIndex + 2)*0.5 + 2 )
call KillUnit( uGate )
endfunction
function WarpGateDown takes unit fp_uGate returns nothing
local integer nPlayerId
set nPlayerId = GetPlayerId( GetOwningPlayer(fp_uGate) )
if ( udg_WarpGateLoc[nPlayerId] != null ) then
call RemoveLocation( udg_WarpGateLoc[nPlayerId] )
set udg_WarpGateLoc[nPlayerId] = null
endif
endfunction
function GetDefensiveMatrixIndex takes unit fp_uUnit returns integer
local integer nPlayerId
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
if ( udg_DefensiveMatrixUnits[nPlayerId] == fp_uUnit ) then
return nPlayerId
endif
set nPlayerId = nPlayerId + 1
endloop
return -1
endfunction
function DefensiveMatrix takes unit fp_uCaster, unit fp_uTarget returns nothing
local integer nLvl
local integer nLvlOld
local integer nDMId
local integer nHPInit
local integer nHPBuff
local integer nHP
local integer nIndex
local integer array nLifeBonusAbility
set nLifeBonusAbility[1] = 'A01Q'
set nLifeBonusAbility[2] = 'A01R'
set nLifeBonusAbility[3] = 'A01S'
if ( IsUnitDeadBJ(fp_uTarget) ) then
return
endif
set nLvl = GetUnitAbilityLevel( fp_uCaster, 'A01K' )
set nHP = R2I( GetUnitState(fp_uTarget, UNIT_STATE_LIFE) )
set nDMId = GetDefensiveMatrixIndex( fp_uTarget )
call ShowDebugMsg( "nDMId = " + I2S(nDMId) )
if ( nDMId >= 0 ) then
set udg_DefensiveMatrixUnits[nDMId] = null
set nHPInit = udg_DefensiveMatrixHP[nDMId]
set nLvlOld = udg_DefensiveMatrixLvl[nDMId]
if ( nHP > nHPInit ) then
set nHP = nHPInit
endif
if ( nLvlOld > nLvl ) then
call DisplayTextToPlayer ( GetOwningPlayer(fp_uCaster), 0, 0, udg__STR_DEMATRIXEXISTED )
return
else
call UnitRemoveAbility( fp_uTarget, nLifeBonusAbility[nLvlOld] )
set udg_DefensiveMatrixUnits[nDMId] = null
endif
endif
call ShowDebugMsg( "nHP = " + I2S(nHP) )
set nDMId = GetPlayerId( GetOwningPlayer(fp_uCaster) )
set udg_DefensiveMatrixUnits[nDMId] = fp_uTarget
call ShowDebugMsg( "nLvl = " + I2S(nLvl) )
set nHPBuff = 300 + 200 * nLvl
if ( nLvl == 3 ) then
set nHPBuff = nHPBuff + 100
endif
set nHPInit = nHP
set nHP = nHPInit + nHPBuff
set udg_DefensiveMatrixHP[nDMId] = nHPInit
set udg_DefensiveMatrixLvl[nDMId] = nLvl
call UnitAddAbility( fp_uTarget, nLifeBonusAbility[nLvl] )
call ShowDebugMsg( "nHPBuff = " + I2S(nHPBuff) )
call SetUnitState(fp_uTarget, UNIT_STATE_LIFE, nHP)
call ShowDebugMsg( "nHP = " + I2S(nHP) )
set nIndex = 0
loop
call TriggerSleepAction( 0.1 )
exitwhen nIndex >= 200
exitwhen not UnitHasBuffBJ( fp_uTarget, 'B009' )
exitwhen udg_DefensiveMatrixUnits[nDMId] == null
call ShowDebugMsg( "Loop " + I2S(nIndex) )
if ( IsUnitDeadBJ(fp_uTarget) ) then
call ShowDebugMsg( "Unit Dies" )
set udg_DefensiveMatrixUnits[nDMId] = null
exitwhen true
endif
set nHP = R2I( GetUnitState(fp_uTarget, UNIT_STATE_LIFE) )
if ( nHP <= nHPInit ) then
call ShowDebugMsg( "HP is smaller the original" )
call UnitRemoveBuffBJ( 'B009', fp_uTarget )
exitwhen true
endif
set nIndex = nIndex + 1
endloop
call ShowDebugMsg( "nIndex = " + I2S(nIndex) )
if ( udg_DefensiveMatrixUnits[nDMId] == null ) then
return
endif
set nHP = R2I( GetUnitState(fp_uTarget, UNIT_STATE_LIFE) )
call UnitRemoveAbility( fp_uTarget, nLifeBonusAbility[nLvl] )
call ShowDebugMsg( "Remove ability lvl " + I2S(nLvl) )
if ( nHP > nHPInit ) then
set nHP = nHPInit
endif
call SetUnitState(fp_uTarget, UNIT_STATE_LIFE, nHP)
set udg_DefensiveMatrixUnits[nDMId] = null
endfunction
function HeroDies takes unit fp_uHero returns nothing
local integer nPlayerId
local integer nIndex
set nPlayerId = GetPlayerId( GetOwningPlayer(fp_uHero) )
if ( IsPlayerDefeated(nPlayerId) ) then
return
endif
call TimerStart( udg_HeroRezTimer[nPlayerId], udg__HERO_REVIVETIME, false, null )
set udg_HeroRezTimerWnd[nPlayerId] = CreateTimerDialogBJ( udg_HeroRezTimer[nPlayerId], udg__STR_HEROREZ )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
if ( nIndex == nPlayerId ) then
call TimerDialogDisplayForPlayerBJ( true, udg_HeroRezTimerWnd[nPlayerId], Player(nIndex) )
else
call TimerDialogDisplayForPlayerBJ( false, udg_HeroRezTimerWnd[nPlayerId], Player(nIndex) )
endif
set nIndex = nIndex + 1
endloop
endfunction
function HeroRespawn takes timer fp_timer returns nothing
local integer nIndex
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
if ( fp_timer == udg_HeroRezTimer[nIndex] ) then
exitwhen true
endif
set nIndex = nIndex + 1
endloop
if ( nIndex >= GetPlayerTotalNum() ) then
return
endif
call DestroyTimerDialog( udg_HeroRezTimerWnd[nIndex] )
if ( IsPlayerDefeated(nIndex) ) then
return
endif
call ReviveHeroLoc( udg_Heroes[nIndex], udg_HeroSpawnPos[nIndex], true )
call DisplayTextToPlayer( Player(nIndex), 0, 0, udg__STR_HEROREVIVED )
//call SelectUnitForPlayerSingle( udg_Heroes[nIndex], Player(nIndex) )
//call PanCameraToTimedLocForPlayer( Player(nIndex), udg_HeroSpawnPos[nIndex], 1.00 )
endfunction
function HeroLearnSpellAtLevel10 takes unit fp_Hero returns nothing
local integer array anAbility
local integer array anLvl
local integer nAbNum
local integer nIndex
local integer nLvlTotal
set nAbNum = 0
set anAbility[nAbNum] = 'A01N' //Repair
set nAbNum = nAbNum + 1
set anAbility[nAbNum] = 'A01B' //Far Sight
set nAbNum = nAbNum + 1
set anAbility[nAbNum] = 'A01K' //DeMatrix
set nAbNum = nAbNum + 1
set anAbility[nAbNum] = 'A01J' //Warp Gate
set nAbNum = nAbNum + 1
set anAbility[nAbNum] = 'A00N' //Nukes
set nAbNum = nAbNum + 1
set nIndex = 0
set nLvlTotal = 0
loop
exitwhen nIndex >= nAbNum
set anLvl[nIndex] = GetUnitAbilityLevel( fp_Hero, anAbility[nIndex] )
set nLvlTotal = nLvlTotal + anLvl[nIndex]
set nIndex = nIndex + 1
endloop
if ( nLvlTotal < 10 ) then
return
endif
set fp_Hero = ReplaceUnitBJ( fp_Hero, 'H00J', bj_UNIT_STATE_METHOD_ABSOLUTE )
set nIndex = 0
set nLvlTotal = 0
loop
exitwhen nIndex >= nAbNum
if ( anLvl[nIndex] > 0 ) then
call UnitAddAbility( fp_Hero, anAbility[nIndex] )
call SetUnitAbilityLevel( fp_Hero, anAbility[nIndex], anLvl[nIndex] )
endif
set nIndex = nIndex + 1
endloop
endfunction
function GetLevelExp takes integer fp_nLvl returns integer
local integer a = 25
local integer b = 5
local integer c = 5
local real rFactor = 1.4
return R2I( rFactor * (25 + b * (fp_nLvl - 1) * fp_nLvl + c * (fp_nLvl - 1)) )
endfunction
function HeroExp takes unit fp_uKiller, unit fp_uDying returns nothing
local integer nUT
local integer nExp
local integer nExpKiller
local player pl
local integer nPlayerId
local integer nForceId
local integer nPlayerNum
local integer nIndex
local integer nIndexEnd
set pl = GetOwningPlayer( fp_uKiller )
if ( not IsPlayerEnemy(pl, GetOwningPlayer(fp_uDying) ) ) then
return
endif
set nUT = GetUnitTypeId( fp_uDying )
if ( not IsUnitPlane(fp_uDying) and not IsUnitTower(nUT) and not IsUnitPeonHouse(nUT) and not IsUnitAirborne(nUT) and not IsUnitCommandCenter(nUT) and not IsUnitType(fp_uDying, UNIT_TYPE_HERO) ) then
return
endif
set nExp = GetLevelExp( GetUnitLevel(fp_uDying) )
call ShowDebugMsg( "nExp1 = " + I2S(nExp) )
if ( IsUnitPlane(fp_uDying) or IsUnitAirborne(nUT) ) then
set nExp = nExp / 3
endif
call ShowDebugMsg( "nExp2 = " + I2S(nExp) )
set nExpKiller = nExp / 2
set nPlayerId = GetPlayerId( pl )
set nForceId = GetPlayerForceId( nPlayerId )
set nIndex = nForceId * ( GetPlayerTotalNum() / 2 )
set nIndexEnd = ( nForceId + 1 ) * ( GetPlayerTotalNum() / 2 ) - 1
set nPlayerNum = 0
loop
exitwhen nIndex > nIndexEnd
if ( IsSlotPlayer(nIndex) and IsUnitAliveBJ(udg_Heroes[nIndex]) ) then
set nPlayerNum = nPlayerNum + 1
endif
set nIndex = nIndex + 1
endloop
if ( nPlayerNum == 0 ) then
return
endif
set nExp = nExp / nPlayerNum
call ShowDebugMsg( "nExp3 = " + I2S(nExp) )
set nIndex = nForceId * ( GetPlayerTotalNum() / 2 )
set nIndexEnd = ( nForceId + 1 ) * ( GetPlayerTotalNum() / 2 ) - 1
loop
exitwhen nIndex > nIndexEnd
if ( IsSlotPlayer(nIndex) and IsUnitAliveBJ(udg_Heroes[nIndex]) ) then
call AddHeroXP( udg_Heroes[nIndex], nExp, true )
endif
set nIndex = nIndex + 1
endloop
call ShowDebugMsg( "nExpKiller = " + I2S(nExp) )
if ( IsSlotPlayer(nPlayerId) and IsUnitAliveBJ(udg_Heroes[nPlayerId]) ) then
call AddHeroXP( udg_Heroes[nPlayerId], nExpKiller, true )
endif
endfunction
//===========================================================================
function InitTrig_Hero_Functions takes nothing returns nothing
endfunction
function DestroyBaseWallsFilter takes nothing returns boolean
return IsDestructibleWall( GetFilterDestructable() )
endfunction
function DestroyBaseWallsAction takes nothing returns nothing
call KillDestructable( GetEnumDestructable() )
endfunction
function DestroyBaseWalls takes integer fp_nPlayerId returns nothing
call EnumDestructablesInRect( udg_BaseRect[fp_nPlayerId], Condition(function DestroyBaseWallsFilter), function DestroyBaseWallsAction )
endfunction
function IsUnitDamager takes unit fp_unit returns boolean
return GetUnitPointValue(fp_unit) == udg__POINTVALUE_DAMAGER
endfunction
function KillAllUnitsOfPlayerExceptTowers takes integer fp_nPlayerId returns nothing
local group grp
local unit u
local integer nNum
local integer nHouse
local integer nHouseId
local integer nPeon
local integer nPeonId
local integer nTown
local integer nTownId
call DestroyBaseWalls( fp_nPlayerId )
set nNum = 0
set grp = GetUnitsOfPlayerAll( Player(fp_nPlayerId) )
loop
set u = FirstOfGroup( grp )
exitwhen u == null
//Kill everything except towers
if ( IsUnitAliveBJ(u) and not IsUnitTower(GetUnitTypeId(u)) and not IsUnitDamager(u) ) then
call KillUnit( u )
endif
set nNum = nNum + 1
if ( nNum >= 10 ) then
set nNum = 0
//call TriggerSleepAction( 0 )
endif
call GroupRemoveUnit( grp, u )
endloop
call DestroyGroup( grp )
endfunction
function KillAllUnitsOfPlayer takes integer fp_nPlayerId returns nothing
local group grp
local unit u
local integer nNum
call DestroyBaseWalls( fp_nPlayerId )
set nNum = 0
set grp = GetUnitsOfPlayerAll( Player(fp_nPlayerId) )
loop
set u = FirstOfGroup( grp )
exitwhen u == null
//Kill everything except towers
if ( IsUnitAliveBJ(u) ) then
call KillUnit( u )
endif
set nNum = nNum + 1
if ( nNum >= 10 ) then
set nNum = 0
//call TriggerSleepAction( 0 )
endif
call GroupRemoveUnit( grp, u )
endloop
call DestroyGroup( grp )
endfunction
function GameOver takes nothing returns nothing
local integer nPlayerId
local integer nPlayerIdEnd
local integer nForceId
set udg_GameOver = true
if ( IsForceDefeated(0) ) then
set nForceId = 0
elseif ( IsForceDefeated(1) ) then
set nForceId = 1
endif
set nPlayerId = nForceId * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2
loop
exitwhen nPlayerId >= nPlayerIdEnd
set udg_PlayerDefeated[nPlayerId] = true
set nPlayerId = nPlayerId + 1
endloop
call TriggerExecute( gg_trg_Create_Final_Score_Boards )
return
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
if ( IsSlotPlayer(nPlayerId) ) then
set nForceId = GetPlayerForceId( nPlayerId )
if ( IsForceDefeated(nForceId) ) then
call CustomDefeatBJ( Player(nPlayerId), udg__STR_DEFEAT )
else
call CustomVictoryBJ( Player(nPlayerId), true, true )
endif
endif
set nPlayerId = nPlayerId + 1
endloop
endfunction
function Defeat takes player fp_pl returns nothing
local integer nPlayerIndex
local integer nIndex
local integer nForceId
if ( udg_GameOver ) then
return
endif
set nPlayerIndex = GetPlayerId( fp_pl )
//set udg_PlayerDefeated[nPlayerIndex] = true
//set udg_Fun_KillAllUnitOfPlayer_P1 = nPlayerIndex
//call ConditionalTriggerExecute( gg_trg_Kill_All_Unit_Of_Player )
set udg_Base[nPlayerIndex] = null
set nForceId = GetPlayerForceId( nPlayerIndex )
if ( IsForceDefeated(nForceId) ) then
call GameOver()
else
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
if ( GetPlayerForceId(nIndex) == nForceId) then
call DisplayTimedTextToPlayer( Player(nIndex), 0, 0, 60, "|cffff0000" + GetPlayerName(fp_pl) + udg__STR_COMMANDCENTERKILLED + "|r")
else
call DisplayTimedTextToPlayer( Player(nIndex), 0, 0, 60, "|cff00ff00" + GetPlayerName(fp_pl) + udg__STR_COMMANDCENTERKILLED + "|r")
endif
// if ( nIndex == nPlayerIndex ) then
// call DisplayTimedTextToPlayer( Player(nIndex), 0, 0, 60, udg__STR_DEFEATEDSINGLE_SELF )
// else
// call DisplayTimedTextToPlayer( Player(nIndex), 0, 0, 60, udg__STR_DEFEATEDSINGLE_OTHER1 + GetPlayerName(Player(nPlayerIndex)) + udg__STR_DEFEATEDSINGLE_OTHER2 )
// endif
set nIndex = nIndex + 1
endloop
endif
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraSetEQNoiseForPlayer( Player(nIndex), 20.00 )
set nIndex = nIndex + 1
endloop
call TriggerSleepAction( 2 )
set nIndex = 0
loop
exitwhen nIndex >= GetPlayerTotalNum()
call CameraClearNoiseForPlayer( Player(nIndex) )
set nIndex = nIndex + 1
endloop
endfunction
//===========================================================================
function InitTrig_Victory_Defeat_Functions takes nothing returns nothing
endfunction
function MultiBoardDisplayPlayer takes player fp_pl, multiboard fp_mb, boolean fp_bShow, boolean fp_bMinimize returns nothing
if ( GetLocalPlayer() == fp_pl ) then
call MultiboardDisplay( fp_mb, fp_bShow )
call MultiboardMinimize( fp_mb, fp_bMinimize )
endif
endfunction
function GetSideBaseHouseInfo takes integer fp_nSide, location fp_locInfoBase, location fp_locInfoHouse returns nothing
local integer nRowNum
local integer nRow
local integer nPlayerIndex
local integer nBaseTotal
local integer nBase
local integer nHouseTotal
local integer nHouse
local integer nHouseId
local integer nHouseIdEnd
set nRowNum = MultiboardGetRowCount( udg_mb[fp_nSide] ) - 3
set nBaseTotal = 0
set nBase = 0
set nRow = 1
loop
exitwhen nRow >= nRowNum
set nPlayerIndex = udg_BoardPlayerIndexes[fp_nSide*3+nRow-1]
set nBaseTotal = nBaseTotal + 1
if ( GetBase(nPlayerIndex) != null and IsUnitAliveBJ(GetBase(nPlayerIndex)) ) then
set nBase = nBase + 1
endif
set nRow = nRow + 1
endloop
set nHouseTotal = GetPeonHouseNum() / 2
set nHouseId = fp_nSide * GetPeonHouseNum() / 2
set nHouseIdEnd = (fp_nSide + 1) * GetPeonHouseNum() / 2
set nHouse = 0
loop
exitwhen nHouseId >= nHouseIdEnd
if ( GetPeonHouse(nHouseId) != null and IsUnitAliveBJ(GetPeonHouse(nHouseId)) ) then
set nHouse = nHouse + 1
endif
set nHouseId = nHouseId + 1
endloop
call MoveLocation( fp_locInfoBase, nBaseTotal, nBase )
call MoveLocation( fp_locInfoHouse, nHouseTotal, nHouse )
endfunction
function RefreshBoard takes integer fp_nSide returns nothing
local integer nPlayerIndex = 0
local multiboarditem mbitem = null
local integer nRow
local integer nRowNum
local integer nCol
local integer nAirport
local unit uAirport
local integer nPlaneType
local location locInfoBase
local location locInfoHouse
local integer COLUMN_NUM = 1 + 1 + udg__AIRPORTCNT_MAX
set nRowNum = MultiboardGetRowCount( udg_mb[fp_nSide] )
set nRow = 1
loop
exitwhen nRow >= nRowNum - 3
set nPlayerIndex = udg_BoardPlayerIndexes[fp_nSide*3+nRow-1]
set nCol = 0
//Player
if ( GetPlayerSlotState(Player(nPlayerIndex)) != PLAYER_SLOT_STATE_PLAYING ) then
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemValue( mbitem, udg__STR_MULTIBOARD_PLAYERLEFT )
call MultiboardReleaseItem( mbitem )
endif
set nCol = nCol + 1
//Tech
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemValue( mbitem, I2S(GetPlayerTechPercentage(nPlayerIndex)) + "%" )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
//Airports building
set nAirport = 0
loop
exitwhen nAirport >= GetAirportBuffNum()
set uAirport = GetAirport( nAirport )
if ( uAirport != null and GetOwningPlayer(uAirport) == Player(nPlayerIndex) and IsUnitAliveBJ(uAirport) ) then
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
if ( IsAirportTraining(nAirport) ) then
set nPlaneType = GetAirportTraining(nAirport)
call MultiboardSetItemStyle( mbitem, false, true )
call MultiboardSetItemIcon( mbitem, GetPlaneTypeIcon(nPlaneType) )
else
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "-" )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endif
set nAirport = nAirport + 1
endloop
//Empty Slots
loop
exitwhen nCol >= COLUMN_NUM
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, " " )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
set nPlayerIndex = nPlayerIndex + 1
set nRow = nRow + 1
endloop
set nRow = nRow + 1
set locInfoBase = Location( 0, 0 )
set locInfoHouse = Location( 0, 0 )
//North
call GetSideBaseHouseInfo( 0, locInfoBase, locInfoHouse )
set nCol = 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemValue( mbitem, I2S(R2I(GetLocationY(locInfoBase))) + "/" + I2S(R2I(GetLocationX(locInfoBase))) )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemValue( mbitem, I2S(R2I(GetLocationY(locInfoHouse))) + "/" + I2S(R2I(GetLocationX(locInfoHouse))) )
call MultiboardReleaseItem( mbitem )
set nRow = nRow + 1
//South
call GetSideBaseHouseInfo( 1, locInfoBase, locInfoHouse )
set nCol = 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemValue( mbitem, I2S(R2I(GetLocationY(locInfoBase))) + "/" + I2S(R2I(GetLocationX(locInfoBase))) )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemValue( mbitem, I2S(R2I(GetLocationY(locInfoHouse))) + "/" + I2S(R2I(GetLocationX(locInfoHouse))) )
call MultiboardReleaseItem( mbitem )
call RemoveLocation( locInfoBase )
call RemoveLocation( locInfoHouse )
endfunction
function RefreshBoards takes nothing returns nothing
call RefreshBoard( 0 )
call RefreshBoard( 1 )
endfunction
function CreateBoard takes integer fp_nSide returns nothing
local integer nPlayerIndex = 0
local multiboarditem mbitem = null
local integer nRow
local integer nCol
local real array rWidthTitle
local real array rWidth
local real rWidthTotal
local string array strIcon
local string array strTitle
local integer COLUMN_NUM = 1 + 1 + udg__AIRPORTCNT_MAX
set rWidth[0] = 0.08
set rWidth[1] = 0.035
set rWidth[2] = 0.012
set rWidth[3] = 0.012
set rWidth[4] = 0.012
set rWidth[5] = 0.012
set rWidth[6] = 0.012
set rWidth[7] = 0.012
set rWidth[8] = 0.012
set rWidth[9] = 0.012
set nCol = 0
set rWidthTotal = 0
loop
exitwhen nCol >= COLUMN_NUM
set rWidthTotal = rWidthTotal + rWidth[nCol]
set nCol = nCol + 1
endloop
set rWidthTitle[0] = 0.075
set rWidthTitle[1] = 0.035
set rWidthTitle[2] = 0.005
set rWidthTitle[3] = rWidthTotal - ( rWidthTitle[0] + rWidthTitle[1] + rWidthTitle[2] )
set rWidthTitle[4] = 0.0
set rWidthTitle[5] = 0.0
set rWidthTitle[6] = 0.0
set rWidthTitle[7] = 0.0
set rWidthTitle[8] = 0.0
set rWidthTitle[9] = 0.0
set strTitle[0] = udg__STR_MULTIBOARD_TITLE_PLAYER
set strTitle[1] = udg__STR_MULTIBOARD_TITLE_TECH
set strTitle[2] = ""
set strTitle[3] = udg__STR_MULTIBOARD_TITLE_PLANES
set strTitle[4] = ""
set strTitle[5] = ""
set strTitle[6] = ""
set strTitle[7] = ""
set strTitle[8] = ""
set strTitle[9] = ""
set udg_mb[fp_nSide] = CreateMultiboard()
call MultiboardSetTitleText( udg_mb[fp_nSide], udg__STR_MULTIBOARD_TITLE )
call MultiboardSetColumnCount( udg_mb[fp_nSide], COLUMN_NUM )
set nRow = 0
call MultiboardSetRowCount( udg_mb[fp_nSide], nRow + 1 )
set nCol = 0
loop
exitwhen nCol >= COLUMN_NUM
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, strTitle[nCol] )
call MultiboardSetItemValueColor( mbitem, 255, 255, 255, 255 )
call MultiboardSetItemWidth( mbitem, rWidthTitle[nCol] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
set nPlayerIndex = fp_nSide * 4
loop
exitwhen nPlayerIndex >= fp_nSide * 4 + 3
if ( IsSlotPlayer(nPlayerIndex) ) then
set udg_BoardPlayerIndexes[fp_nSide * 3 + nRow] = nPlayerIndex
set nRow = nRow + 1
call MultiboardSetRowCount( udg_mb[fp_nSide], nRow + 1 )
set nCol = 0
//Player
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetPlayerName( Player(nPlayerIndex) ) )
call MultiboardSetItemValueColor( mbitem, udg_ColorRed[GetPlayerColorIndex(nPlayerIndex)], udg_ColorGreen[GetPlayerColorIndex(nPlayerIndex)], udg_ColorBlue[GetPlayerColorIndex(nPlayerIndex)], 255 )
call MultiboardSetItemWidth( mbitem, rWidth[nCol] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
//Tech
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, " " )
call MultiboardSetItemValueColor( mbitem, 255, 255, 255, 255 )
call MultiboardSetItemWidth( mbitem, rWidth[nCol] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
//Airports building
loop
exitwhen nCol >= COLUMN_NUM
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, " " )
call MultiboardSetItemWidth( mbitem, rWidth[nCol] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
endif
set nPlayerIndex = nPlayerIndex + 1
endloop
//Empty Line
set nRow = nRow + 1
call MultiboardSetRowCount( udg_mb[fp_nSide], nRow + 1 )
set nCol = 0
loop
exitwhen nCol >= COLUMN_NUM
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, 0.0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
set rWidth[0] = 0.08
set rWidth[1] = 0.06
set rWidth[2] = 0.06
//North
set nRow = nRow + 1
call MultiboardSetRowCount( udg_mb[fp_nSide], nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SIDE_NORTH )
call MultiboardSetItemWidth( mbitem, rWidth[0] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, true )
call MultiboardSetItemValue( mbitem, "")
call MultiboardSetItemIcon( mbitem, "ReplaceableTextures\\CommandButtons\\BTNCastle.tga")
call MultiboardSetItemWidth( mbitem, rWidth[1] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, true )
call MultiboardSetItemValue( mbitem, "")
call MultiboardSetItemIcon( mbitem, "ReplaceableTextures\\CommandButtons\\BTNFarm.tga")
call MultiboardSetItemWidth( mbitem, rWidth[2] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= COLUMN_NUM
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, 0.0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
//South
set nRow = nRow + 1
call MultiboardSetRowCount( udg_mb[fp_nSide], nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SIDE_SOUTH)
call MultiboardSetItemWidth( mbitem, rWidth[0] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, true )
call MultiboardSetItemValue( mbitem, "")
call MultiboardSetItemIcon( mbitem, "ReplaceableTextures\\CommandButtons\\BTNFortress.tga" )
call MultiboardSetItemWidth( mbitem, rWidth[1] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, true )
call MultiboardSetItemValue( mbitem, "")
call MultiboardSetItemIcon( mbitem, "ReplaceableTextures\\CommandButtons\\BTNSpiritLodge.tga" )
call MultiboardSetItemWidth( mbitem, rWidth[2] )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= COLUMN_NUM
set mbitem = MultiboardGetItem( udg_mb[fp_nSide], nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, 0.0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
endfunction
function DisplayBoards takes nothing returns nothing
local integer nPlayer = 0
loop
exitwhen nPlayer >= GetPlayerTotalNum()
if ( IsSlotPlayer(nPlayer) ) then
call MultiBoardDisplayPlayer( Player(nPlayer), udg_mb[GetPlayerForceId(nPlayer)], true, false )
endif
set nPlayer = nPlayer + 1
endloop
endfunction
function CreateBoards takes nothing returns nothing
local integer nPlayerIndex = 0
//Create board for North
call CreateBoard( 0 )
//Create board for South
call CreateBoard( 1 )
call TimerStart( udg_BoardTimer, 0.50, true, null )
call RefreshBoards()
call DisplayBoards()
endfunction
//===========================================================================
function InitTrig_MultiBoard_Functions takes nothing returns nothing
endfunction
function GetScorePlanesBuilt takes integer fp_nPlayer returns integer
return udg_Score_PlanesBuilt[fp_nPlayer]
endfunction
function AddScorePlanesBuilt takes integer fp_nPlayer returns nothing
set udg_Score_PlanesBuilt[fp_nPlayer] = udg_Score_PlanesBuilt[fp_nPlayer] + 1
endfunction
function GetScorePlaneTypeBuild takes integer fp_nPlayer, integer fp_nPlaneTypeId returns integer
local integer nPTNum
set nPTNum = GetPlaneTypesNumber()
return udg_Score_PlaneTypeBuild[fp_nPlayer*nPTNum+fp_nPlaneTypeId]
endfunction
function AddScorePlaneTypeBuild takes integer fp_nPlayer, integer fp_nPlaneTypeId returns nothing
local integer nPTNum
local integer nScoreIndex
set nPTNum = GetPlaneTypesNumber()
set nScoreIndex = fp_nPlayer * nPTNum + fp_nPlaneTypeId
set udg_Score_PlaneTypeBuild[nScoreIndex] = udg_Score_PlaneTypeBuild[nScoreIndex] + 1
endfunction
function GetScorePlaneTypeBuildCost takes integer fp_nPlayer, integer fp_nPlaneTypeId returns integer
return IMaxBJ(1, GetPlaneTypePrice(fp_nPlaneTypeId)) * GetScorePlaneTypeBuild(fp_nPlayer, fp_nPlaneTypeId)
endfunction
function GetScoreFavoritePlaneTypeId takes integer fp_nPlayer returns integer
local integer nPTNum
local integer nIndex
local integer nIndexMax
local integer nScore
local integer nScoreMax
set nPTNum = GetPlaneTypesNumber()
set nIndexMax = 0
set nScoreMax = 0
set nIndex = 0
loop
exitwhen nIndex >= nPTNum
set nScore = GetScorePlaneTypeBuildCost(fp_nPlayer, nIndex)
if ( not IsPlaneTypeOneShot(nIndex) and nScore > nScoreMax ) then
set nIndexMax = nIndex
set nScoreMax = nScore
endif
set nIndex = nIndex + 1
endloop
if ( nScoreMax == 0 and GetScorePlanesBuilt(fp_nPlayer) == 0 ) then
return -1
endif
return nIndexMax
endfunction
function GetScorePlaneCostPercentage takes integer fp_nPlayer, integer fp_nPTId returns integer
local integer nPTNum
local integer nScoreIndex
local integer nIndex
local integer nIndexMax
local integer nScoreTotal
set nScoreTotal = 0
set nPTNum = GetPlaneTypesNumber()
set nIndex = 0
loop
exitwhen nIndex >= nPTNum
if ( not IsPlaneTypeOneShot(nIndex) ) then
set nScoreTotal = nScoreTotal + GetScorePlaneTypeBuildCost(fp_nPlayer, nIndex)
endif
set nIndex = nIndex + 1
endloop
if ( nScoreTotal == 0 ) then
if ( GetScorePlanesBuilt(fp_nPlayer) == 0 ) then
return 0
else
return 100
endif
endif
return R2I( I2R(GetScorePlaneTypeBuildCost(fp_nPlayer, fp_nPTId)) * 100 / nScoreTotal )
endfunction
function GetScorePlaneVarietyPercentage takes integer fp_nPlayer returns real
local integer array buildtime
local integer buildtimeMax
local integer buildtimeTotal
local integer bt
local integer nbtNum
local integer nPTId
local integer nPTNum
local integer nBuilt
local real rVariety
set nPTNum = GetPlaneTypesNumber()
set nPTId = 0
set nbtNum = 0
set buildtimeMax = 0
set buildtimeTotal = 0
loop
exitwhen nPTId >= nPTNum
if ( not IsPlaneTypeOneShot(nPTId) ) then
set nBuilt = GetScorePlaneTypeBuild(fp_nPlayer, nPTId)
if ( nBuilt > 0 ) then
set nBuilt = nBuilt + 10
endif
set buildtime[nPTId] = nBuilt * GetPlaneTypeBuildTime(nPTId)
if ( buildtime[nPTId] > buildtimeMax ) then
set buildtimeMax = buildtime[nPTId]
endif
set buildtimeTotal = buildtimeTotal + buildtime[nPTId]
set nbtNum = nbtNum + 1
endif
set nPTId = nPTId + 1
endloop
if ( buildtimeMax == 0 ) then
return 0
endif
set nPTId = 0
set bt = 0
loop
exitwhen nPTId >= nPTNum
if ( not IsPlaneTypeOneShot(nPTId) ) then
set bt = bt + ( buildtimeMax - buildtime[nPTId] )
endif
set nPTId = nPTId + 1
endloop
set rVariety = 1.0 - I2R(bt) / (nbtNum * buildtimeMax)
call ShowDebugMsg( "rVariety = " + R2S(rVariety) )
//For normalization
set rVariety = (rVariety - 1.0/nbtNum) / (1.0 - 1.0/nbtNum)
call ShowDebugMsg( "rVariety = " + R2S(rVariety) )
return rVariety * 100
endfunction
function GetScorePlanesKilled takes integer fp_nPlayer returns integer
return udg_Score_PlanesKilled[fp_nPlayer]
endfunction
function AddScorePlanesKilled takes integer fp_nPlayer returns nothing
set udg_Score_PlanesKilled[fp_nPlayer] = udg_Score_PlanesKilled[fp_nPlayer] + 1
endfunction
function GetScorePlanesKilledCost takes integer fp_nPlayer returns integer
return udg_Score_PlanesKilledCost[fp_nPlayer]
endfunction
function AddScorePlanesKilledCost takes integer fp_nPlayer, integer fp_nAdd returns nothing
set udg_Score_PlanesKilledCost[fp_nPlayer] = udg_Score_PlanesKilledCost[fp_nPlayer] + fp_nAdd
endfunction
function GetScorePlanesKilledCostTotal takes nothing returns integer
local integer nPlayerId
local integer nTotal
set nPlayerId = 0
set nTotal = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
set nTotal = nTotal + GetScorePlanesKilledCost( nPlayerId )
set nPlayerId = nPlayerId + 1
endloop
return nTotal
endfunction
function GetScorePlanesKilledCostPercentage takes integer fp_nPlayer returns real
local integer nTotal
set nTotal = GetScorePlanesKilledCostTotal()
if ( nTotal == 0 ) then
return 0
endif
return I2R(GetScorePlanesKilledCost(fp_nPlayer)*100) / nTotal
endfunction
function GetScoreBombsDropped takes integer fp_nPlayer returns integer
return udg_Score_BombsDropped[fp_nPlayer]
endfunction
function AddScoreBombsDropped takes integer fp_nPlayer returns nothing
set udg_Score_BombsDropped[fp_nPlayer] = udg_Score_BombsDropped[fp_nPlayer] + 1
endfunction
function GetScoreBombsHit takes integer fp_nPlayer returns integer
return udg_Score_BombsHit[fp_nPlayer]
endfunction
function AddScoreBombsHit takes integer fp_nPlayer returns nothing
set udg_Score_BombsHit[fp_nPlayer] = udg_Score_BombsHit[fp_nPlayer] + 1
endfunction
function GetScoreBomberAccuracy takes integer fp_nPlayer returns real
if ( GetScoreBombsDropped(fp_nPlayer) == 0 ) then
return 0
else
return I2R(GetScoreBombsHit(fp_nPlayer))/GetScoreBombsDropped(fp_nPlayer)
endif
endfunction
function GetScoreAirportsBuilt takes integer fp_nPlayer returns integer
return udg_Score_AirportsBuilt[fp_nPlayer]
endfunction
function AddScoreAirportsBuilt takes integer fp_nPlayer returns nothing
set udg_Score_AirportsBuilt[fp_nPlayer] = udg_Score_AirportsBuilt[fp_nPlayer] + 1
endfunction
function GetScoreNuclearUsed takes integer fp_nPlayer returns integer
return udg_Score_NuclearUsed[fp_nPlayer]
endfunction
function AddScoreNuclearUsed takes integer fp_nPlayer returns nothing
set udg_Score_NuclearUsed[fp_nPlayer] = udg_Score_NuclearUsed[fp_nPlayer] + 1
endfunction
function GetScoreNuclearLanded takes integer fp_nPlayer returns integer
return udg_Score_NuclearLanded[fp_nPlayer]
endfunction
function AddScoreNuclearLanded takes integer fp_nPlayer returns nothing
set udg_Score_NuclearLanded[fp_nPlayer] = udg_Score_NuclearLanded[fp_nPlayer] + 1
endfunction
function GetScoreTowersBuilt takes integer fp_nPlayer returns integer
return udg_Score_TowersBuilt[fp_nPlayer]
endfunction
function AddScoreTowersBuilt takes integer fp_nPlayer returns nothing
set udg_Score_TowersBuilt[fp_nPlayer] = udg_Score_TowersBuilt[fp_nPlayer] + 1
endfunction
function GetScoreTowerTypeBuild takes integer fp_nPlayer, integer fp_nTowerTypeId returns integer
local integer nTTNum
set nTTNum = GetTowerTypesNum()
return udg_Score_TowerTypeBuild[fp_nPlayer*nTTNum+fp_nTowerTypeId]
endfunction
function AddScoreTowerTypeBuild takes integer fp_nPlayer, integer fp_nTowerTypeId returns nothing
local integer nTTNum
local integer nScoreIndex
set nTTNum = GetTowerTypesNum()
set nScoreIndex = fp_nPlayer * nTTNum + fp_nTowerTypeId
set udg_Score_TowerTypeBuild[nScoreIndex] = udg_Score_TowerTypeBuild[nScoreIndex] + 1
endfunction
function GetScoreTowerTypeBuildCost takes integer fp_nPlayer, integer fp_nTowerTypeId returns integer
local integer nTTNum
set nTTNum = GetTowerTypesNum()
return GetScoreTowerTypeBuild(fp_nPlayer, fp_nTowerTypeId) * GetTowerTypePrice( fp_nTowerTypeId )
endfunction
function GetFavoriteTowerTypeId takes integer fp_nPlayer returns integer
local integer nTTNum
local integer nIndex
local integer nIndexMax
local integer nScore
local integer nScoreMax
set nTTNum = GetTowerTypesNum()
set nIndexMax = -1
set nScoreMax = 0
set nIndex = 0
loop
exitwhen nIndex >= nTTNum
set nScore = GetScoreTowerTypeBuildCost( fp_nPlayer, nIndex )
if ( nScore > nScoreMax ) then
set nIndexMax = nIndex
set nScoreMax = nScore
endif
set nIndex = nIndex + 1
endloop
return nIndexMax
endfunction
function GetScoreTowerCostPercentage takes integer fp_nPlayer, integer fp_nTTId returns integer
local integer nTTNum
local integer nIndex
local integer nScoreTotal
set nScoreTotal = 0
set nTTNum = GetTowerTypesNum()
set nIndex = 0
loop
exitwhen nIndex >= nTTNum
set nScoreTotal = nScoreTotal + GetScoreTowerTypeBuildCost(fp_nPlayer, nIndex)
set nIndex = nIndex + 1
endloop
if ( nScoreTotal == 0 ) then
return 0
endif
return R2I( I2R(GetScoreTowerTypeBuildCost(fp_nPlayer, fp_nTTId)) * 100 / nScoreTotal )
endfunction
function GetScoreTowerVarietyPercentage takes integer fp_nPlayer returns real
local integer array costArray
local integer costMax
local integer costTotal
local integer cost
local integer nTTId
local integer nTTNum
local integer nBuilt
local real rVariety
set nTTNum = GetTowerTypesNum()
set nTTId = 0
set costMax = 0
set costTotal = 0
loop
exitwhen nTTId >= nTTNum
set nBuilt = GetScoreTowerTypeBuild(fp_nPlayer, nTTId)
if ( nBuilt > 0 ) then
set nBuilt = nBuilt + 10
endif
set costArray[nTTId] = nBuilt * GetTowerTypePrice( nTTId )
if ( costArray[nTTId] > costMax ) then
set costMax = costArray[nTTId]
endif
set costTotal = costTotal + costArray[nTTId]
set nTTId = nTTId + 1
endloop
if ( costMax == 0 ) then
return 0
endif
set nTTId = 0
set cost = 0
loop
exitwhen nTTId >= nTTNum
set cost = cost + ( costMax - costArray[nTTId] )
set nTTId = nTTId + 1
endloop
set rVariety = 1.0 - I2R(cost) / (nTTNum * costMax)
call ShowDebugMsg( "rVariety = " + R2S(rVariety) )
//For normalization
set rVariety = (rVariety - 1.0/nTTNum) / (1.0 - 1.0/nTTNum)
call ShowDebugMsg( "rVariety = " + R2S(rVariety) )
return rVariety * 100
endfunction
function GetScoreTowerRazed takes integer fp_nPlayer returns integer
return udg_Score_TowerRazed[fp_nPlayer]
endfunction
function AddScoreTowerRazed takes integer fp_nPlayer returns nothing
set udg_Score_TowerRazed[fp_nPlayer] = udg_Score_TowerRazed[fp_nPlayer] + 1
endfunction
function GetScoreTowerRazedCost takes integer fp_nPlayer returns integer
return udg_Score_TowerRazedCost[fp_nPlayer]
endfunction
function AddScoreTowerRazedCost takes integer fp_nPlayer, integer fp_nAdd returns nothing
set udg_Score_TowerRazedCost[fp_nPlayer] = udg_Score_TowerRazedCost[fp_nPlayer] + fp_nAdd
endfunction
function GetScoreTowerRazedCostTotal takes nothing returns integer
local integer nPlayerId
local integer nTotal
set nPlayerId = 0
set nTotal = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
set nTotal = nTotal + GetScoreTowerRazedCost( nPlayerId )
set nPlayerId = nPlayerId + 1
endloop
return nTotal
endfunction
function GetScoreTowerRazedCostPercentage takes integer fp_nPlayer returns real
local integer nTotal
set nTotal = GetScoreTowerRazedCostTotal()
if ( nTotal == 0 ) then
return 0
endif
return I2R(GetScoreTowerRazedCost(fp_nPlayer)*100) / nTotal
endfunction
function GetScoreHeroLevel takes integer fp_nPlayer returns integer
return GetHeroLevel( udg_Heroes[fp_nPlayer] )
endfunction
function GetScoreHeroSpellCast takes integer fp_nPlayer returns integer
local integer nIndex
local integer nIndexEnd
local integer nScore
set nScore = 0
set nIndex = fp_nPlayer * GetHeroAbilityNum()
set nIndexEnd = nIndex + GetHeroAbilityNum()
loop
exitwhen nIndex >= nIndexEnd
set nScore = nScore + udg_Score_HeroSpellCast[nIndex]
set nIndex = nIndex + 1
endloop
return nScore
endfunction
function AddScoreHeroSpellCast takes integer fp_nPlayer, integer fp_nAbility returns nothing
local integer nIndex
local integer nSpellIndex
set nSpellIndex = GetHeroAbilityIndex( fp_nAbility )
if ( nSpellIndex < 0 ) then
return
endif
set nIndex = fp_nPlayer * GetHeroAbilityNum() + nSpellIndex
set udg_Score_HeroSpellCast[nIndex] = udg_Score_HeroSpellCast[nIndex] + 1
endfunction
function GetScoreHeroFavoriteSpell takes integer fp_nPlayer returns integer
local integer nSpellIndex
local integer nIndex
local integer nIndexMax
local integer nCastMax
set nCastMax = 0
set nIndexMax = -1
set nSpellIndex = 0
set nIndex = fp_nPlayer * GetHeroAbilityNum()
loop
exitwhen nSpellIndex >= GetHeroAbilityNum()
if ( udg_Score_HeroSpellCast[nIndex] > nCastMax ) then
set nIndexMax = nSpellIndex
set nCastMax = udg_Score_HeroSpellCast[nIndex]
endif
set nIndex = nIndex + 1
set nSpellIndex = nSpellIndex + 1
endloop
return nIndexMax
endfunction
function GetScoreHeroSpellPencentage takes integer fp_nPlayer, integer fp_nSpell returns integer
local integer nIndex
local integer nCast
local integer nCastTotal
set nIndex = fp_nPlayer * GetHeroAbilityNum() + fp_nSpell
set nCast = udg_Score_HeroSpellCast[nIndex]
set nCastTotal = GetScoreHeroSpellCast( fp_nPlayer )
if ( nCastTotal == 0 ) then
return 0
endif
return R2I( I2R(nCast * 100) / nCastTotal )
endfunction
function GetScoreHeroKilled takes integer fp_nPlayer returns integer
return udg_Score_HeroKilled[fp_nPlayer]
endfunction
function AddScoreHeroKilled takes integer fp_nPlayer returns nothing
set udg_Score_HeroKilled[fp_nPlayer] = udg_Score_HeroKilled[fp_nPlayer] + 1
endfunction
function GetScoreTechLevel takes integer fp_nPlayer returns integer
return GetPlayerTechPercentage(fp_nPlayer)
endfunction
function GetScoreResources takes integer fp_nPlayer returns integer
return udg_Score_Resources[fp_nPlayer]
endfunction
function AddScoreResources takes integer fp_nPlayer, integer fp_nAdd returns nothing
set udg_Score_Resources[fp_nPlayer] = udg_Score_Resources[fp_nPlayer] + fp_nAdd
endfunction
function GetScoreHouseRazed takes integer fp_nPlayer returns integer
return udg_Score_HouseRazed[fp_nPlayer]
endfunction
function AddScoreHouseRazed takes integer fp_nPlayer returns nothing
set udg_Score_HouseRazed[fp_nPlayer] = udg_Score_HouseRazed[fp_nPlayer] + 1
endfunction
function GetScoreHouseRazedPercentage takes integer fp_nPlayer returns real
local integer nPlayerId
local integer nTotal
set nPlayerId = 0
set nTotal = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
set nTotal = nTotal + GetScoreHouseRazed( nPlayerId )
set nPlayerId = nPlayerId + 1
endloop
if ( nTotal == 0 ) then
return 0
endif
return I2R(GetScoreHouseRazed(fp_nPlayer)*100) / nTotal
endfunction
function GetScoreCCRazed takes integer fp_nPlayer returns integer
return udg_Score_CCRazed[fp_nPlayer]
endfunction
function AddScoreCCRazed takes integer fp_nPlayer returns nothing
set udg_Score_CCRazed[fp_nPlayer] = udg_Score_CCRazed[fp_nPlayer] + 1
endfunction
function GetScoreCCRazedPercentage takes integer fp_nPlayer returns real
local integer nPlayerId
local integer nTotal
set nPlayerId = 0
set nTotal = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
set nTotal = nTotal + GetScoreCCRazed( nPlayerId )
set nPlayerId = nPlayerId + 1
endloop
if ( nTotal == 0 ) then
return 0
endif
return I2R(GetScoreCCRazed(fp_nPlayer)*100) / nTotal
endfunction
function GetScoreCCSaved takes integer fp_nPlayer returns integer
local integer nForceId
local integer nPlayerId
local integer nPlayerIdEnd
local integer nBaseNum
if ( not IsSlotPlayer(fp_nPlayer) or IsPlayerDefeated(fp_nPlayer) ) then
return 0
endif
set nForceId = GetPlayerForceId( fp_nPlayer )
set nPlayerId = nForceId * GetPlayerTotalNum() / 2
set nPlayerIdEnd = nPlayerId + GetPlayerTotalNum() / 2 - 1
set nBaseNum = 0
loop
exitwhen nPlayerId >= nPlayerIdEnd
if ( udg_Base[nPlayerId] != null and IsUnitAliveBJ(udg_Base[nPlayerId]) ) then
set nBaseNum = nBaseNum + 1
endif
set nPlayerId = nPlayerId + 1
endloop
return nBaseNum
endfunction
function GetPlayerTotalScore takes integer fp_nPlayerId returns integer
local integer nScore = 0
set nScore = nScore + R2I(GetScorePlanesKilledCostPercentage(fp_nPlayerId)*100)
set nScore = nScore + R2I(GetScoreTowerRazedCostPercentage(fp_nPlayerId)*200)
set nScore = nScore + R2I(GetScoreBomberAccuracy(fp_nPlayerId)*100*20)
set nScore = nScore + R2I(GetScoreHouseRazedPercentage(fp_nPlayerId)*100)
set nScore = nScore + R2I(GetScoreCCSaved(fp_nPlayerId)*1000)
return nScore
endfunction
function GetDataTitleColoredString takes string fp_str returns string
return "|cff20B2AA" + fp_str + "|r"
endfunction
function FormatScoreBoardPlayerName takes string fp_strName, integer fp_nNum returns string
local integer nLen
local integer nLeft
local integer nRight
local integer nIndex
set nLen = StringLength( fp_strName )
if ( nLen > fp_nNum ) then
return SubString( fp_strName, 0, fp_nNum )
elseif ( nLen == fp_nNum ) then
return fp_strName
endif
set nLeft = ( fp_nNum - nLen ) / 2
set nIndex = 0
loop
exitwhen nIndex >= nLeft
set fp_strName = " " + fp_strName
set nIndex = nIndex + 1
endloop
set nRight = fp_nNum - nLen - nLeft
set nIndex = 0
loop
exitwhen nIndex >= nRight
set fp_strName = fp_strName + " "
set nIndex = nIndex + 1
endloop
return fp_strName
endfunction
function GetMaxRowScore takes integer fp_nColNum returns integer
local integer nCol
local integer nValueMax
set nCol = 0
set nValueMax = 0
loop
exitwhen nCol >= fp_nColNum
if ( udg_Score_RowValue[nCol] > nValueMax ) then
set nValueMax = udg_Score_RowValue[nCol]
endif
set nCol = nCol + 1
endloop
return nValueMax
endfunction
function CreateFinalScoreBoard takes integer fp_nPlayerId returns nothing
local multiboard mb
local multiboarditem mbitem
local string strTitle
local integer nForceId
local integer array anPlayerId
local integer nColNum
local integer nPlayerId
local real COLWIDTH_INDENT = 0.02
local real COLWIDTH_TITLE = 0.12
local real COLWIDTH_DATA = 0.08
local real COLWIDTH_VS = 0.03
local integer array COLOR_OTHERPPL
local integer array COLOR_TOPSCORE
local integer array COLOR_SELF
local real rWidthTotal
local integer nRow
local integer nCol
local integer nIndex
local integer nCol1
local integer nPlayerColorId
local integer nFav
local string str
local integer nValueMax
call ShowDebugMsg( "Scoreboard 1" )
set COLOR_OTHERPPL[0] = 128
set COLOR_OTHERPPL[1] = 128
set COLOR_OTHERPPL[2] = 128
set COLOR_TOPSCORE[0] = 255
set COLOR_TOPSCORE[1] = 255
set COLOR_TOPSCORE[2] = 0
set COLOR_SELF[0] = 255
set COLOR_SELF[1] = 255
set COLOR_SELF[2] = 255
//Create multiboard
set mb = CreateMultiboard()
call ShowDebugMsg( "Scoreboard 1-1" )
//Format title
set nForceId = GetPlayerForceId( fp_nPlayerId )
if ( IsForceDefeated(nForceId) ) then
set strTitle = udg__STR_SCOREBOARD_DEFEAT
else
set strTitle = udg__STR_SCOREBOARD_VICTORY
endif
set strTitle = strTitle + udg__STR_SCOREBOARD_TITLE1
set strTitle = strTitle + udg__STR_SCOREBOARD_TITLE2 + GetTimeElapsed()
set strTitle = strTitle + udg__STR_SCOREBOARD_TITLE3
call MultiboardSetTitleText( mb, strTitle )
call ShowDebugMsg( "Scoreboard 2" )
//Calculate column count and width
set nPlayerId = 0
set nColNum = 3
set rWidthTotal = COLWIDTH_INDENT + COLWIDTH_TITLE + COLWIDTH_VS
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
if ( udg_IsScorePlayer[nPlayerId] ) then
set nColNum = nColNum + 1
set rWidthTotal = rWidthTotal + COLWIDTH_DATA
endif
set nPlayerId = nPlayerId + 1
endloop
call MultiboardSetColumnCount( mb, nColNum )
call ShowDebugMsg( "Scoreboard 3" )
//Blank line
set nRow = 0
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, rWidthTotal )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, 0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Init anPlayerId
set nCol = 0
loop
exitwhen nCol >= nColNum
set anPlayerId[nCol] = -1
set nCol = nCol + 1
endloop
//Players
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SCOREBOARD_PLAYERS )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE - 0.01 )
call MultiboardReleaseItem( mbitem )
set nCol1 = nCol + 1
if ( nForceId == 0 ) then
set nCol1 = nCol1 + 1
set anPlayerId[nCol1] = fp_nPlayerId
endif
set nIndex = 0
set nPlayerId = 0
loop
exitwhen nIndex >= GetPlayerTotalNum() / 2 - 1
if ( udg_IsScorePlayer[nPlayerId] and nPlayerId != fp_nPlayerId ) then
set nCol1 = nCol1 + 1
set anPlayerId[nCol1] = nPlayerId
endif
set nIndex = nIndex + 1
set nPlayerId = nPlayerId + 1
endloop
set nCol1 = nCol1 + 1
set anPlayerId[nCol1] = -1
if ( nForceId == 1 ) then
set nCol1 = nCol1 + 1
set anPlayerId[nCol1] = fp_nPlayerId
endif
set nIndex = 0
set nPlayerId = GetPlayerTotalNum() / 2
loop
exitwhen nIndex >= GetPlayerTotalNum() / 2 - 1
if ( udg_IsScorePlayer[nPlayerId] and nPlayerId != fp_nPlayerId ) then
set nCol1 = nCol1 + 1
set anPlayerId[nCol1] = nPlayerId
endif
set nIndex = nIndex + 1
set nPlayerId = nPlayerId + 1
endloop
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT - 0.01 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
if ( anPlayerId[nCol] >= 0 ) then
call ShowDebugMsg( FormatScoreBoardPlayerName(GetPlayerName(Player(anPlayerId[nCol])), 10) )
call MultiboardSetItemValue( mbitem, FormatScoreBoardPlayerName(GetPlayerName(Player(anPlayerId[nCol])), 10) )
set nPlayerColorId = GetPlayerColorIndex( anPlayerId[nCol] )
call MultiboardSetItemValueColor( mbitem, udg_ColorRed[nPlayerColorId], udg_ColorGreen[nPlayerColorId], udg_ColorBlue[nPlayerColorId], 255 )
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemValue( mbitem, "vs" )
call MultiboardSetItemValueColor( mbitem, 255, 255, 255, 255 )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Category Planes
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SCOREBOARD_CATPLANES )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, 0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Planes Killed
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_PLANESKILLED) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScorePlanesKilled(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Planes Built
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_PLANESBUILT) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScorePlanesBuilt(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Favorite Plane
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_FAVPLANE) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
set nFav = GetScoreFavoritePlaneTypeId(anPlayerId[nCol])
call ShowDebugMsg( "nFav = " + I2S(nFav) )
if ( nFav < 0 ) then
call MultiboardSetItemStyle( mbitem, false, false )
else
call MultiboardSetItemStyle( mbitem, true, true )
call MultiboardSetItemIcon( mbitem, GetPlaneTypeIcon(nFav) )
call MultiboardSetItemValue( mbitem, I2S(GetScorePlaneCostPercentage(anPlayerId[nCol], nFav)) + "%" )
if ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Plane Variety
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_PLANEVARIETY) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = R2I(GetScorePlaneVarietyPercentage(anPlayerId[nCol1]))
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) + "%" )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Bomber Accuracy
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_BOMBERACCURACY) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = R2I(GetScoreBomberAccuracy(anPlayerId[nCol1])*100)
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) + "%" )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Airports Built
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_AIRPORTSBUILT) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreAirportsBuilt(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Category Towers
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SCOREBOARD_CATTOWERS )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, 0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Towers Killed
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_TOWERKILLED) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreTowerRazed(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Towers Built
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_TOWERSBUILT) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreTowersBuilt(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Favorite Tower
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_FAVTOWER) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
set nFav = GetFavoriteTowerTypeId(anPlayerId[nCol])
call ShowDebugMsg( "nFav = " + I2S(nFav) )
if ( nFav < 0 ) then
call MultiboardSetItemStyle( mbitem, false, false )
else
call MultiboardSetItemStyle( mbitem, true, true )
call MultiboardSetItemIcon( mbitem, GetTowerTypeIcon(nFav) )
call MultiboardSetItemValue( mbitem, I2S(GetScoreTowerCostPercentage(anPlayerId[nCol], nFav)) + "%" )
if ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Tower Variety
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_TOWERVARIETY) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = R2I(GetScoreTowerVarietyPercentage(anPlayerId[nCol1]))
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) + "%" )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Category Heroes
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SCOREBOARD_CATHEROES )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, 0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Spell Cast
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_HEROSPELL) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreHeroSpellCast(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
//Favorite Spell
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_FAVHEROSPELL) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
set nFav = GetScoreHeroFavoriteSpell(anPlayerId[nCol])
call ShowDebugMsg( "nFav = " + I2S(nFav) )
if ( nFav < 0 ) then
call MultiboardSetItemStyle( mbitem, false, false )
else
call MultiboardSetItemStyle( mbitem, true, true )
call MultiboardSetItemIcon( mbitem, GetHeroAbilityIcon(nFav) )
call MultiboardSetItemValue( mbitem, I2S(GetScoreHeroSpellPencentage(anPlayerId[nCol], nFav)) + "%" )
if ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Nuclear Landed/Sent
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_NUCLEAR) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreNuclearLanded(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol])+"/"+I2S(GetScoreNuclearUsed(anPlayerId[nCol])) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Hero Killed
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_HEROKILLED) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreHeroKilled(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
//Category Misc
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SCOREBOARD_CATMISC )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, 0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Tech Level
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_TECHLEVEL) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreTechLevel(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) + "%" )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Resources
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_RESOURCES) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreResources(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
//House Razed
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, GetDataTitleColoredString(udg__STR_SCOREBOARD_HOUSERAZED) )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetScoreHouseRazed(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
//Blank line
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, rWidthTotal )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, 0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call ShowDebugMsg( "Row = " + I2S(nRow) )
//Total Score
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, udg__STR_SCOREBOARD_TOTALSCORE )
call MultiboardSetItemWidth( mbitem, COLWIDTH_TITLE )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, COLWIDTH_INDENT )
call MultiboardReleaseItem( mbitem )
set nCol1 = 0
loop
exitwhen nCol1 >= nColNum
if ( anPlayerId[nCol1] >= 0 ) then
set udg_Score_RowValue[nCol1] = GetPlayerTotalScore(anPlayerId[nCol1])
else
set udg_Score_RowValue[nCol1] = 0
endif
set nCol1 = nCol1 + 1
endloop
set nValueMax = GetMaxRowScore( nColNum )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
if ( anPlayerId[nCol] >= 0 ) then
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, I2S(udg_Score_RowValue[nCol]) )
if ( udg_Score_RowValue[nCol] > 0 and udg_Score_RowValue[nCol] == nValueMax ) then
call MultiboardSetItemValueColor( mbitem, COLOR_TOPSCORE[0], COLOR_TOPSCORE[1], COLOR_TOPSCORE[2], 255 )
elseif ( anPlayerId[nCol] == fp_nPlayerId ) then
call MultiboardSetItemValueColor( mbitem, COLOR_SELF[0], COLOR_SELF[1], COLOR_SELF[2], 255 )
else
call MultiboardSetItemValueColor( mbitem, COLOR_OTHERPPL[0], COLOR_OTHERPPL[1], COLOR_OTHERPPL[2], 255 )
endif
call MultiboardSetItemWidth( mbitem, COLWIDTH_DATA )
else
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, COLWIDTH_VS )
endif
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
//Blank line
set nRow = nRow + 1
call MultiboardSetRowCount( mb, nRow + 1 )
set nCol = 0
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, true, false )
call MultiboardSetItemValue( mbitem, "" )
call MultiboardSetItemWidth( mbitem, rWidthTotal )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
loop
exitwhen nCol >= nColNum
set mbitem = MultiboardGetItem( mb, nRow, nCol )
call MultiboardSetItemStyle( mbitem, false, false )
call MultiboardSetItemWidth( mbitem, 0 )
call MultiboardReleaseItem( mbitem )
set nCol = nCol + 1
endloop
call MultiBoardDisplayPlayer( Player(fp_nPlayerId), mb, true, false )
endfunction
function CreateFinalScoreBoards takes nothing returns nothing
local integer nPlayerId
local integer nForceId
local string strMsg
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
if ( IsSlotPlayer(nPlayerId) ) then
set nForceId = GetPlayerForceId( nPlayerId )
if ( IsForceDefeated(nForceId) ) then
set strMsg = udg__STR_YOULOSE
else
set strMsg = udg__STR_YOUWIN
endif
call DisplayTimedTextToPlayer( Player(nPlayerId), 0, 0, 60, strMsg )
endif
set nPlayerId = nPlayerId + 1
endloop
set nPlayerId = 0
loop
exitwhen nPlayerId >= GetPlayerTotalNum()
if ( udg_mb[nPlayerId] != null ) then
call DestroyMultiboard( udg_mb[nPlayerId] )
endif
if ( IsSlotPlayer(nPlayerId) ) then
call CreateFinalScoreBoard( nPlayerId )
call TriggerSleepAction( 0.1 )
endif
set nPlayerId = nPlayerId + 1
endloop
endfunction
//===========================================================================
function InitTrig_Final_Score_Functions takes nothing returns nothing
endfunction