native GetUnitGoldCost takes integer unitid returns integer
Name | Type | is_array | initial_value |
ActivePlayers | force | No | |
Altar | unit | Yes | |
AltarDevineShieldAdvLearned | boolean | Yes | |
AltarHolyLightAdvLearned | boolean | Yes | |
AltarResurrectionAdvLearned | boolean | Yes | |
AltarThunderclapAdvLearned | boolean | Yes | |
BasePosition | location | Yes | |
Bears | group | No | |
BlessingCurrentMax | integer | No | |
BlessingFrostTicks | integer | No | |
BlessingIndex | integer | No | |
BlessingsFrostUnit | unit | No | |
BlessingsTrigger | trigger | Yes | |
BlessingUnit | unit | Yes | |
Corners | location | Yes | |
CreationTimers | timer | Yes | |
CurrentPlayerNumber | integer | No | |
DEBUG | boolean | No | |
DragonsAttackPoint | location | Yes | |
DragonsGroups | group | Yes | |
DragonsIndexUsed | integer | No | 0 |
EarthquakePeriod | real | No | |
ElapsedTime | integer | No | |
FarmsHashMap | hashtable | No | |
FirstTranportTrained | boolean | Yes | |
Forfeited | boolean | Yes | |
GameHints | string | Yes | |
GateHandleTemp | handle | Yes | |
GateHash | hashtable | No | |
GateUnitTemp | unit | Yes | |
Goldmines | unit | Yes | |
GoldminesNeutral | unit | Yes | |
GolemTempPoint | location | No | |
GolemTempPoint_Copy | location | No | |
HashTableForTowers | hashtable | No | |
HasMagicSentry | boolean | Yes | |
isFFA | boolean | No | |
ItemType | itemcode | No | |
JainaPosition | location | No | |
KnightsGroup | group | No | |
KnightTempDist | real | No | |
KnightTempDist_Copy | real | No | |
KnightTempUnit | unit | No | |
LumberArrivedTemp | integer | No | |
LumberNextResearch | integer | Yes | 1000 |
LumberRequiredDialog | dialog | No | |
LumberRequiredDialogButtons | button | Yes | |
LumberRequiredPerPlayer | real | No | |
LumberRequiredPerTeam | real | Yes | |
LumberSentPerPlayer | integer | Yes | |
MarketPlaceItems | itemcode | Yes | |
MarketPlaceNItems | integer | No | |
MarketPlaceNItemsPossible | integer | No | |
Marketplaces | group | No | |
MultiLumberRequired | multiboard | No | |
MultiRowIndexPerPlayer | integer | Yes | |
MultiRowIndexPerTeam | integer | Yes | |
NBoni | integer | No | |
NeutralLocationArray | location | Yes | |
NumberPowerGenerators | integer | Yes | |
Paladin | unit | Yes | |
PlayerHasArcaneSecrets | boolean | Yes | |
PlayerHasEngineeringSecrets | boolean | Yes | |
PlayerNamesWithC | string | Yes | |
PlayerPositions | location | Yes | |
PlayersN | integer | No | |
PlayerStartDeg | real | Yes | |
Point | location | No | |
Reward1Given | boolean | No | false |
Reward2Given | boolean | No | false |
Reward3Given | boolean | No | false |
SacrificalPit | unit | No | |
SacrificialPitInitP | integer | No | 5 |
starting_items_group1 | itemcode | Yes | |
starting_items_group2 | itemcode | Yes | |
StatueForest | unit | Yes | |
StatueForestN | integer | No | |
TalentHeroes | unit | Yes | |
TalentPoints | integer | Yes | |
TalentResearchers | unit | Yes | |
TalentResearcherst2 | unit | Yes | |
TalentResearcherst3 | unit | Yes | |
TempInt1 | integer | No | |
TempInt2 | integer | No | |
TempInteger | integer | No | |
TempIntPermutation | integer | Yes | |
TempPlayerGroup | force | No | |
TempPoint0 | location | No | |
TempPoint1 | location | No | |
TempReal | real | No | |
TempUnit | unit | No | |
TempUnitGroup | group | No | |
TestAltar | unit | No | |
TowerTempUnitGroup | group | No | |
TownHall | unit | Yes | |
TransportGroup | group | No | |
TreeBounds | integer | No | 6000 |
WorkerWithSacrifice | group | No |
library PathingLib
// Object generator
//! external ObjectMerger w3u hgry hPLF unsf "(PathingLib) FlyChecker" unam "" umdl ".mdl" ubdg 0 uabi "Aloc" uble 0 ulum 0 upoi 0 uico "" umxp 0 umxr 0 ussc 0 ushu "" ugol 0 uaen "" udea "" umvt "fly" usnd "" ufle 0 ufoo 0 uspe 1 uhom 1 urac "unknown" usid 0 usin 0 upgr "" uhot "" utip "" utub ""
//! external ObjectMerger w3u hfoo hPLW unsf "(PathingLib) WalkChecker" unam "" umdl ".mdl" ubdg 0 uabi "Aloc" uble 0 ulum 0 upoi 0 uico "" umxp 0 umxr 0 ussc 0 ushu "" ugol 0 uaen "" udea "" umvt "foot" ucol 0 usnd "" ufle 0 ufoo 0 uspe 1 uhom 1 urac "unknown" usid 0 usin 0 upgr "" uhot "" utip "" utub ""
//! external ObjectMerger w3u hhou hPLB unsf "(PathingLib) BuildChecker" unam "" umdl ".mdl" ubdg 1 uabi "Aloc" upat "" ulum 0 upoi 0 uubs "" uble 0 ushb "" uico "" ugol 0 ufma 0 umxp 0 ubsl "" umxr 0 ussc 0 ushu "" uaen "" udea "" umvt "" ucol 0 usnd "" ufle 0 ufoo 0 uspe 1 uhom 1 urac "unknown" usid 0 usin 0 upgr "" uhot "" utip "" utub ""
//! external ObjectMerger w3u hpea hPLP unsf "(PathingLib) PathChecker" unam "" umdl ".mdl" ubdg 0 uabi "Aloc" uble 0 ubui "hPLF,hPLW,hPLB" ulum 0 upoi 0 uico "" umxp 0 umxr 0 ussc 0 ushu "" ugol 0 uaen "" udea "" umvt "foot" ucol 0 usnd "" ufle 0 ufoo 0 uspe 1 uhom 1 urac "unknown" usid 0 usin 0 upgr "" uhot "" utip "" utub ""
// Configuration
globals
private constant integer PATH_CHECKER = 'h00F'
private constant integer FLY_CHECKER = 'h00C'
private constant integer WALK_CHECKER = 'h00D'
private constant integer BUILD_CHECKER = 'h00E'
private constant player DUMMY_PLAYER = Player(27)
endglobals
/*
Pathing Library v1.6
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Description
¯¯¯¯¯¯¯¯¯¯¯
Allows you to detect all pathability types:
walkablility, flyability, and buildability.
Warning!
Please keep informed that this system is more sensitive than
any other walkability checker systems out there, as it also
detects pathing map generated by normal units as well.
API
¯¯¯
| function IsTerrainFlyable takes real x, real y returns boolean
| function IsTerrainWalkable takes real x, real y returns boolean
| function IsTerrainBuildable takes real x, real y returns boolean
How to import
¯¯¯¯¯¯¯¯¯¯¯¯¯
- Copy Fly, Walk, Build, and Path Checker at object editor (Unit).
- Make sure Path Checker is able to build Fly, Walk, and Build Checker
(at object editor>unit>Path Checker>"Techtree - Structures built")
- Configure this system correctly.
Link: hiveworkshop.com/forums/spells-569/pathing-type-v1-2-a-263230/
*/
globals
private unit PathChecker
endglobals
function IsTerrainFlyable takes real x, real y returns boolean
return IssueBuildOrderById(PathChecker, FLY_CHECKER, x, y)
endfunction
function IsTerrainWalkable takes real x, real y returns boolean
return IssueBuildOrderById(PathChecker, WALK_CHECKER, x, y)
endfunction
function IsTerrainBuildable takes real x, real y returns boolean
return IssueBuildOrderById(PathChecker, BUILD_CHECKER, x, y)
endfunction
private module Init
private static method onInit takes nothing returns nothing
call init()
endmethod
endmodule
private struct InitStruct extends array
private static method init takes nothing returns nothing
set PathChecker = CreateUnit(DUMMY_PLAYER, PATH_CHECKER, 0, 0, 0)
call UnitRemoveAbility(PathChecker, 'Amov')
call ShowUnit(PathChecker, false)
if GetLocalPlayer() == DUMMY_PLAYER then
call FogEnable(false)
endif
endmethod
implement Init
endstruct
endlibrary
library PathingColor requires PathingLib
/*
Pathing Color v1.5
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Pathing may generate color based on their characteristics.
If the pathing is not walkable, it will have red color. If
the pathing is not buildable, it will have blue color. And
if the pathing is not flyable, it will have green color.
The rests are just combinations between these colors.
Here is the summary to ease everything: (o = yes, x = no)
Color Buildable Walkable Flyable Red Green Blue
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
White x x x 255 255 255
Magenta x x o 255 0 255
Cyan x o x 0 255 255
Blue x o o 0 0 255
Yellow o x x 255 255 0
Red o x o 255 0 0
Green o o x 0 255 0
Black o o o 0 0 0
(You can check your pathing map by pressing 'p' at terrain editor)
API
¯¯¯
| function GetTerrainPathingColor takes real x, real y returns integer
(Constants)
| PATHING_COLOR_WHITE
| PATHING_COLOR_MAGENTA
| PATHING_COLOR_CYAN
| PATHING_COLOR_BLUE
| PATHING_COLOR_YELLOW
| PATHING_COLOR_RED
| PATHING_COLOR_GREEN
| PATHING_COLOR_BLACK
*/
globals
constant integer PATHING_COLOR_WHITE = 0
constant integer PATHING_COLOR_MAGENTA = 1
constant integer PATHING_COLOR_CYAN = 2
constant integer PATHING_COLOR_BLUE = 3
constant integer PATHING_COLOR_YELLOW = 4
constant integer PATHING_COLOR_RED = 5
constant integer PATHING_COLOR_GREEN = 6
constant integer PATHING_COLOR_BLACK = 7
endglobals
function GetTerrainPathingColor takes real x, real y returns integer
local integer color = 0
if IsTerrainFlyable(x, y) then
set color = color + 1
endif
if IsTerrainWalkable(x, y) then
set color = color + 2
endif
if IsTerrainBuildable(x, y) then
set color = color + 4
endif
return color
endfunction
endlibrary
//TESH.scrollpos=0
//TESH.alwaysfold=0
scope test initializer onInit
globals
private string array PathingColor
endglobals
private function display takes nothing returns nothing
local real x = GetUnitX(gg_unit_hfoo_0001)
local real y = GetUnitY(gg_unit_hfoo_0001)
call ClearTextMessages()
// Get pathing color
call BJDebugMsg(PathingColor[GetTerrainPathingColor(x, y)] + "Pathing Color at (" + R2S(x) + ", " + R2S(y) + ")|r")
// Check is x, y flyable
if IsTerrainFlyable(x, y) then
call BJDebugMsg("Flyable: true")
else
call BJDebugMsg("Flyable: false")
endif
// Check is x, y walkable
if IsTerrainWalkable(x, y) then
call BJDebugMsg("Walkable: true")
else
call BJDebugMsg("Walkable: false")
endif
// Check is x, y buildable
if IsTerrainBuildable(x, y) then
call BJDebugMsg("Buildable: true")
else
call BJDebugMsg("Buildable: false")
endif
endfunction
private function onInit takes nothing returns nothing
//call FogEnable(false)
//call FogMaskEnable(false)
call TimerStart(CreateTimer(), 0.03125, true, function display)
set PathingColor[PATHING_COLOR_BLACK] = "|CFF000000"
set PathingColor[PATHING_COLOR_BLUE] = "|CFF0000FF"
set PathingColor[PATHING_COLOR_RED] = "|CFFFF0000"
set PathingColor[PATHING_COLOR_MAGENTA] = "|CFFFF00FF"
set PathingColor[PATHING_COLOR_GREEN] = "|CFF00FF00"
set PathingColor[PATHING_COLOR_CYAN] = "|CFF00FFFF"
set PathingColor[PATHING_COLOR_YELLOW] = "|CFFFFFF00"
set PathingColor[PATHING_COLOR_WHITE] = "|CFFFFFFFF"
endfunction
endscope
// variations 3,4 and 8, 9 are "small".
// rest are big
function SampleSmallVar takes nothing returns integer
local integer r = GetRandomInt(3, 6)
if r == 5 then
set r = 8
endif
if r == 6 then
set r = 9
endif
return r
endfunction
function SampleBigVar takes nothing returns integer
local integer r = GetRandomInt(0, 5)
if r == 3 then
set r = 6
endif
if r == 4 then
set r = 7
endif
return r
endfunction
function RandomPermutation takes integer n returns nothing
local integer array p
local integer i = 0
local integer j
local integer m
// init the array
loop
exitwhen i >= n
set p[i] = i
set i = i + 1
endloop
// draw from the init array
set m = n - 1
set i = 0
loop
exitwhen i >= n
set j = GetRandomInt(0, m)
set udg_TempIntPermutation[i] = p[j]
// call BJDebugMsg("Permute " + I2S(i) + ": " + I2S(udg_TempIntPermutation[i]))
set p[j] = p[m]
set m = m - 1
set i = i + 1
endloop
endfunction
function GetXNeutralLocations takes integer n, real d_to_player, boolean dont_skip, real min_r returns nothing
// samples points in a circle (but at periodic angles), making sure they are not too close to the centre and player positions.
//
local real current_degree = GetRandomDirectionDeg()
local integer max_samples = 5
local integer i = 0
local integer j = 0
local integer k = 0
local location origin = Location(0, 0)
local location p
local boolean is_valid_point
local real R = 5050
loop
exitwhen i > 20
call RemoveLocation(udg_NeutralLocationArray[i])
set i = i + 1
endloop
set i = 0
loop
exitwhen i > n
set j = 0
loop
exitwhen j >= max_samples
//sample a point, make sure d to origin is at least min_r
set p = PolarProjectionBJ(origin, SquareRoot(GetRandomReal((min_r*min_r)/(R*R), 1.)) * R, current_degree + GetRandomReal(-18, 18))
set is_valid_point = true
//check if this point is valid in terms of distance to player positions
set k = 0
loop
exitwhen k > 5
if DistanceBetweenPoints(p, udg_PlayerPositions[k]) < d_to_player then
set is_valid_point = false
endif
set k = k + 1
endloop
if not IsTerrainBuildable(GetLocationX(p), GetLocationY(p)) then
set is_valid_point = false
endif
if is_valid_point then
set j = max_samples
endif
set j = j + 1
if j < max_samples then
call RemoveLocation(p)
endif
endloop
set current_degree = current_degree + 360./n
if is_valid_point or dont_skip then
// if positions should be forced, or a good position was found, set the location.
set udg_NeutralLocationArray[i] = p
else
// in this case, no good position could be found.
set udg_NeutralLocationArray[i] = null
endif
set i = i + 1
endloop
call RemoveLocation(origin)
endfunction
function IsActivePlayerASD takes integer i returns boolean
if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING or GetPlayerController(Player(i)) == MAP_CONTROL_COMPUTER then
return true
else
return false
endif
endfunction
function Trig_MultiboardInit_Actions takes nothing returns nothing
local integer team_i = 0
local integer player_i = 0
local integer cur_row = 0
local integer array n_players_per_team
// loop through, set cur_row
// loop through players
// if player in team, add
set cur_row = 2
loop
exitwhen team_i > 5
// check if the team has any players
set player_i = 0
loop
exitwhen player_i > 5
if GetPlayerTeam(Player(player_i)) == team_i then
set n_players_per_team[team_i] = n_players_per_team[team_i] + 1
// call BJDebugMsg("Multi: Player " + I2S(player_i) + " is in Team " + I2S(team_i))
set udg_LumberRequiredPerTeam[team_i] = udg_LumberRequiredPerTeam[team_i] + udg_LumberRequiredPerPlayer
endif
set player_i = player_i + 1
endloop
// if it has, then add give the team a team row.
if n_players_per_team[team_i] > 0 then
set udg_MultiRowIndexPerTeam[team_i] = cur_row
set cur_row = cur_row + 1
endif
// for all players of the team, add a player row.
set player_i = 0
loop
exitwhen player_i > 5
if GetPlayerTeam(Player(player_i)) == team_i then
set udg_MultiRowIndexPerPlayer[player_i] = cur_row
set cur_row = cur_row + 1
endif
set player_i = player_i + 1
endloop
set team_i = team_i + 1
endloop
set udg_MultiLumberRequired = CreateMultiboardBJ(3, cur_row - 1, "WoodWorkers")
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 1, 1, "Players")
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 2, 1, "Sent" )
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 3, 1, "Required" )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 1, 1, true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 2, 1, true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 3, 1, true, false )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 1, 1, 20 )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 2, 1, 5 )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 3, 1, 5 )
set team_i = 0
loop
exitwhen team_i > 5
if udg_MultiRowIndexPerTeam[team_i] > 0 then
// call BJDebugMsg("Multi: Team " + I2S(team_i)+ " is in row " + I2S(udg_MultiRowIndexPerTeam[team_i]))
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerTeam[team_i], "Team " + I2S(team_i + 1))
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerTeam[team_i], "")
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 3, udg_MultiRowIndexPerTeam[team_i], I2S(R2I(udg_LumberRequiredPerTeam[team_i])))
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerTeam[team_i], true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerTeam[team_i], true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 3, udg_MultiRowIndexPerTeam[team_i], true, false )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerTeam[team_i], 20)
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerTeam[team_i], 5)
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 3, udg_MultiRowIndexPerTeam[team_i], 5)
endif
set team_i = team_i + 1
endloop
set player_i = 0
loop
exitwhen player_i > 5
if udg_MultiRowIndexPerPlayer[player_i] > 0 then
// call BJDebugMsg("Multi: Player " + I2S(player_i)+ " is in row " + I2S(udg_MultiRowIndexPerPlayer[player_i]))
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerPlayer[player_i], " " + GetPlayerName(Player(player_i)))
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerPlayer[player_i], I2S(0))
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 3, udg_MultiRowIndexPerPlayer[player_i], "")
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerPlayer[player_i], true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerPlayer[player_i], true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 3, udg_MultiRowIndexPerPlayer[player_i], true, false )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerPlayer[player_i], 20 )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerPlayer[player_i], 5 )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 3, udg_MultiRowIndexPerPlayer[player_i], 5 )
endif
set player_i = player_i + 1
endloop
call MultiboardDisplayBJ( true, udg_MultiLumberRequired)
endfunction
function Trig_MultiboardInit_Actions2 takes nothing returns nothing
local integer team_i = 0
local integer player_i = 0
local integer n_teams = 0
local integer n_players = 0
local integer array n_players_per_team
local string s
call BJDebugMsg("Setup MultiBoard")
// first, set lumber required per team and row index per team
loop
exitwhen team_i > 5
set n_players_per_team[team_i] = 0
set player_i = 0
loop
exitwhen player_i > 5
if GetPlayerTeam(Player(player_i)) == team_i then
set n_players_per_team[team_i] = n_players_per_team[team_i] + 1
// call BJDebugMsg("Multi: Player " + I2S(player_i) + " is in Team " + I2S(team_i))
// set udg_MultiRowIndexPerPlayer[player_i] = n_teams + 1 + n_players_per_team[team_i]
// call BJDebugMsg("Multi: Player " + I2S(player_i) + " is in Team " + I2S(team_i) + " and set to row " + I2S(udg_MultiRowIndexPerPlayer[player_i]))
set udg_LumberRequiredPerTeam[team_i] = udg_LumberRequiredPerTeam[team_i] + udg_LumberRequiredPerPlayer
endif
set player_i = player_i + 1
endloop
if n_players_per_team[team_i] > 0 then
set n_teams = n_teams + 1
set udg_MultiRowIndexPerTeam[team_i] = n_teams + 1
endif
// call BJMsg("Multi: Players in Team " + I2S(team_i) + ": " + I2S(n_players_per_team[team_i]))
// call BJDebugMsg("Multi: Team " + I2S(team_i) + " needs to send " + R2S(udg_LumberRequiredPerTeam[team_i]))
set team_i = team_i + 1
endloop
// call BJDebugMsg("Multi: N Teams " + I2S(n_teams))
// create Multiboard
set udg_MultiLumberRequired = CreateMultiboardBJ(2, n_teams + 1, "WoodWorkers")
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 1, 1, "Teams")
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 2, 1, "Required Lumber" )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 1, 1, true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 2, 1, true, false )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 1, 1, 25 )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 2, 1, 10 )
// set the team strings
set team_i = 0
set player_i = 0
loop
exitwhen team_i > 5
// call BJDebugMsg("TeamRow" + I2S(udg_MultiRowIndexPerTeam[team_i]))
if n_players_per_team[team_i] > 0 then
set s = "Team " + I2S(team_i + 1) + ": ("
set player_i = 0
loop
exitwhen player_i > 5
if GetPlayerTeam(Player(player_i)) == team_i then
set s = s + GetPlayerName(Player(player_i)) + " "
endif
set player_i = player_i + 1
endloop
set s = s + ")"
// call BJDebugMsg("Multi: Adding Team" + I2S(team_i) + " at " + I2S(udg_MultiRowIndexPerTeam[team_i]) + " as " + s)
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerTeam[team_i], s)
call MultiboardSetItemValueBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerTeam[team_i], I2S(R2I(udg_LumberRequiredPerTeam[team_i])))
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerTeam[team_i], true, false )
call MultiboardSetItemStyleBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerTeam[team_i], true, false )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 1, udg_MultiRowIndexPerTeam[team_i], 25 )
call MultiboardSetItemWidthBJ( udg_MultiLumberRequired , 2, udg_MultiRowIndexPerTeam[team_i], 10 )
endif
set team_i = team_i + 1
endloop
call MultiboardDisplayBJ( true, udg_MultiLumberRequired)
endfunction
//===========================================================================
function InitTrig_MultiboardInit takes nothing returns nothing
set gg_trg_MultiboardInit = CreateTrigger( )
// call TriggerRegisterTimerEventSingle( gg_trg_MultiboardInit, 5 )
call TriggerAddAction( gg_trg_MultiboardInit, function Trig_MultiboardInit_Actions )
endfunction
function Trig_NeutralMines_Actions takes nothing returns nothing
local real start_x = -5200
local real end_x = 5200
local real start_y = -5200
local real end_y = 5200
local integer player_i
//local real density = 1485.7
local real density = 1300
local integer x_steps = R2I((- start_x + end_x) / density)
local integer y_steps = R2I((- start_y + end_y) / density)
local integer loop_x = 0
local integer loop_y = 0
local real map_x = 0
local real map_y = 0
local real wiggle = 300.
local location loc
local boolean valid = true
local unit u
local real sqrt
local integer players_close_to_mine = 0
local integer cur_player
//call DisplayTextToForce( GetPlayersAll(), "Create Goldmines")
loop
exitwhen loop_x > x_steps
set loop_y = 0
loop
exitwhen loop_y > y_steps
set map_x = start_x + (I2R(loop_x) * density)
set map_y = start_y + (I2R(loop_y) * density)
//distance to origin
set sqrt = SquareRoot(map_x * map_x + map_y * map_y)
if (sqrt > 1100) and (sqrt < 5700) then
// dont wiggle the mines that are right at the edge of the map
if map_x > (start_x + 100) and map_x < (end_x - 100) then
set map_x = map_x + GetRandomReal(-wiggle, wiggle)
endif
if map_y > (start_y + 100) and map_y < (end_y - 100) then
set map_y = map_y + GetRandomReal(-wiggle, wiggle)
endif
set loc = Location(map_x, map_y)
set player_i = 0
set players_close_to_mine = 0
set cur_player = -1
loop
exitwhen player_i > 5
if DistanceBetweenPoints(loc, udg_PlayerPositions[player_i]) < 1200 then
// count the # of players that are close to the mine
set players_close_to_mine = players_close_to_mine + 1
set cur_player = player_i
endif
set player_i = player_i + 1
endloop
if players_close_to_mine == 1 then
// TODO better would be to just push it away from the base a little....
if DistanceBetweenPoints(loc, udg_PlayerPositions[cur_player]) < 500 then
//if it would spawn to close to just 1 player, spawn it a little away from the player towards the center of the map.
set loc = PolarProjectionBJ(udg_PlayerPositions[cur_player], GetRandomReal(800, 1000), udg_PlayerStartDeg[cur_player] - 180 + GetRandomReal(-45, 45))
// otherwise just keep the original position
// if 2 players are close, this is a nice mine for them to fight for!
endif
endif
set u = CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'ngol', loc, bj_UNIT_FACING )
call SetResourceAmount(u, 400 )
call RemoveLocation(loc)
else
endif
set loop_y = loop_y + 1
endloop
set loop_x = loop_x + 1
endloop
endfunction
//===========================================================================
function InitTrig_NeutralMines takes nothing returns nothing
set gg_trg_NeutralMines = CreateTrigger( )
call TriggerAddAction( gg_trg_NeutralMines, function Trig_NeutralMines_Actions )
endfunction
function CreateTreeDir takes real x, real y, real alpha, integer width, boolean include_start returns nothing
local integer length = GetRandomInt(8, 12)
local real angle_momentum = GetRandomReal(-7, 7)
local integer i = 0
local integer j = 0
local real x_place
local real y_place
local real wiggle = 150
local location loc
local location new_loc
local location new_loc2
local real density = 124
set loc = Location(x, y)
loop
exitwhen i > length
// call BJDebugMsg("place row " + I2S(i))
if i > 0 or include_start then
set new_loc = PolarProjectionBJ(loc, I2R(width) / 2 * density, alpha - 90)
set j = 0
loop
exitwhen j > width
// call BJDebugMsg("place col " + I2S(j))
set x = GetLocationX(new_loc)
set y = GetLocationY(new_loc)
set x_place = x + GetRandomReal(-wiggle, wiggle)
set y_place = y + GetRandomReal(-wiggle, wiggle)
if IsTerrainBuildable(x_place,y_place) then
call CreateDestructable( 'B004', x_place, y_place, GetRandomDirectionDeg(), ( 1.1 + GetRandomReal(0.00, 0.10) ), SampleBigVar() )
endif
// is this necessary? Does reassignment leak?
set new_loc2 = PolarProjectionBJ(new_loc, density, alpha + 90)
call RemoveLocation(new_loc)
set new_loc = new_loc2
set j = j + 1
endloop
call RemoveLocation(new_loc)
endif
set angle_momentum = angle_momentum + GetRandomReal(-1, 1)
set alpha = alpha + angle_momentum
set loc = PolarProjectionBJ(loc, density, alpha)
set width = width + GetRandomInt(-1, 1)
if width > 5 then
set width = 5
endif
if width < 3 then
set width = 3
endif
set i = i + 1
endloop
call RemoveLocation(loc)
endfunction
function CreateTreeField takes real x, real y returns nothing
local integer n_trees_width
local real alpha
set alpha = GetRandomDirectionDeg()
set n_trees_width = GetRandomInt(4, 6)
//call BJDebugMsg("create " + R2S(alpha) + "; " + R2S(x))
call CreateTreeDir(x, y, alpha, n_trees_width, true)
call CreateTreeDir(x, y, alpha - 180, n_trees_width, false)
endfunction
function CreateTreeFields takes nothing returns nothing
local integer i = 0
local integer j = 0
local real wiggle = 700
loop
exitwhen i > 4
set j = 0
loop
exitwhen j > 4
//if not (j == 2 and i == 2) then
call CreateTreeField(- 4000 + i * 2000 + GetRandomReal(-wiggle , wiggle ), - 4000 + j * 2000 + GetRandomReal(-wiggle , wiggle ))
//endif
set j = j + 1
endloop
set i = i + 1
endloop
endfunction
function Trig_CreateRocks_Actions takes nothing returns nothing
local integer loop_x = 0
local real map_x = 0
local real map_y = 0
loop
exitwhen loop_x > 160
set map_x = GetRandomReal(-5600., 5600.)
set map_y = GetRandomReal(-5600., 5600.)
//call BJDebugMsg("Check " + R2S(map_x) + ", " + R2S(map_y))
if IsTerrainBuildable(map_x - 50, map_y - 50) and IsTerrainBuildable(map_x + 50, map_y + 50) and IsTerrainBuildable(map_x - 50, map_y - 50) and IsTerrainBuildable(map_x + 50, map_y + 50) then
call CreateDestructable( 'LTrt', map_x, map_y, GetRandomDirectionDeg(), ( 0.60 + GetRandomReal(0.00, 0.20) ), GetRandomInt(1, 10) )
//call SetDestructableInvulnerableBJ( GetLastCreatedDestructable(), true )
endif
set loop_x = loop_x + 1
endloop
endfunction
//===========================================================================
function InitTrig_CreateRocks takes nothing returns nothing
set gg_trg_CreateRocks = CreateTrigger( )
//call TriggerRegisterTimerEventSingle( gg_trg_CreateRocks, 1)
call TriggerAddAction( gg_trg_CreateRocks, function Trig_CreateRocks_Actions )
endfunction
function CreateTrees takes real start_x, real end_x, real start_y, real end_y returns nothing
local real density = 110.
local integer totaltrees = 0
local integer x_steps = R2I((- start_x + end_x) / density)
local integer y_steps = R2I((- start_y + end_y) / density)
local integer loop_x = 0
local integer loop_y = 0
local real map_x = 0
local real map_y = 0
local real wiggle = 300.
local integer trees_per_row = 0
if start_x > end_x or start_y > end_y then
call BJDebugMsg("Trees: Bad options")
return
endif
if false then
return
endif
//call BJDebugMsg("LoopX Steps " + I2S(x_steps))
//call BJDebugMsg("LoopY Steps " + I2S(y_steps))
//call DisplayTextToForce( GetPlayersAll(), "CreateTrees")
loop
exitwhen loop_x > x_steps
set trees_per_row = 0
set loop_y = 0
loop
exitwhen loop_y > y_steps
set map_x = start_x + (I2R(loop_x) * density)
set map_y = start_y + (I2R(loop_y) * density)
set map_x = map_x + GetRandomReal(-wiggle, wiggle)
set map_y = map_y + GetRandomReal(-wiggle, wiggle)
if IsTerrainBuildable(map_x, map_y) then
call CreateDestructable( 'B005', map_x, map_y, GetRandomDirectionDeg(), ( 0.90 + GetRandomReal(0.00, 0.10) ), SampleSmallVar() )
set totaltrees = totaltrees + 1
set trees_per_row = trees_per_row + 1
endif
set loop_y = loop_y + 1
endloop
// call BJDebugMsg("Trees in row " + I2S(loop_x) +": " + I2S(trees_per_row))
set loop_x = loop_x + 1
endloop
// call BJDebugMsg("Created " + I2S(totaltrees) + " Trees.")
endfunction
function BaseCreation takes nothing returns nothing
local integer i = 0
local integer j = 0
local integer k = 0
local handle h
local location p
local location p0
local location p1
local unit u
local unit u0
// call DisplayTextToForce( GetPlayersAll(), "Creating Player Bases")
if true then
loop
exitwhen i > 5
// call DisplayTextToForce( GetPlayersAll(), ( R2S(GetLocationX(udg_PlayerPositions[i]))+ ", " + R2S(GetLocationY(udg_PlayerPositions[i])) ) )
set i = i + 1
endloop
endif
set i = 0
loop
exitwhen i > 5
if IsActivePlayerASD(i) then
// TownHall
set udg_TownHall[i] = CreateUnitAtLoc(Player(i), 'h001', udg_PlayerPositions[i], bj_UNIT_FACING )
set udg_PlayerPositions[i] = GetUnitLoc(udg_TownHall[i])
call UnitAddAbilityBJ( 'Argl', udg_TownHall[i] )
//Altar
set p = PolarProjectionBJ(udg_PlayerPositions[i], GetRandomReal(450, 450), udg_PlayerStartDeg[i] - 180 + GetRandomReal(-10, 10))
set udg_Altar[i] = CreateUnitAtLoc(Player(i), 'h01F', p, bj_UNIT_FACING )
call SetUnitManaBJ( udg_Altar[i], 300.00 )
call UnitAddAbilityBJ( 'A00S', udg_Altar[i] )
call RemoveLocation(p)
// FARMS
set j = 0
loop
exitwhen j > 4
set p = PolarProjectionBJ(udg_PlayerPositions[i], 300.00, GetRandomDirectionDeg())
set u = CreateUnitAtLoc(Player(i), 'h00I', p, bj_UNIT_FACING )
set p0 = GetUnitLoc(u)
// call DisplayTextToForce( GetPlayersAll(), "Farm handle id: " + I2S(GetHandleIdBJ(u)) )
// the plants
set k = 0
loop
exitwhen k > 3
set p1 = PolarProjectionBJ(p0, GetRandomReal(150.00, 200.00), GetRandomDirectionDeg())
set u0 = CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'h00Q', p1, GetRandomDirectionDeg() )
call SaveUnitHandleBJ(u0, k + 1, GetHandleIdBJ(u), udg_FarmsHashMap)
call RemoveLocation(p1)
set k = k + 1
endloop
call RemoveLocation(p)
call RemoveLocation(p0)
set j = j + 1
endloop
//workers
set j = 0
loop
exitwhen j > 6
set p1 = PolarProjectionBJ(udg_PlayerPositions[i], 200.00, GetRandomDirectionDeg())
call CreateUnitAtLoc(Player(i), 'h000', p1, GetRandomDirectionDeg() )
call RemoveLocation(p1)
set j = j + 1
endloop
//snipers
call CreateNUnitsAtLoc( 2, 'h00U', Player(i), PolarProjectionBJ(udg_PlayerPositions[i], 100.00, GetRandomDirectionDeg()), GetRandomDirectionDeg() )
// Pala
set u = CreateUnitAtLoc(Player(i), 'H00G', PolarProjectionBJ(udg_PlayerPositions[i], 200.00, GetRandomDirectionDeg()), GetRandomDirectionDeg() )
set udg_Paladin[i] = u
call SetHeroLevelBJ(u, 4, false )
call UnitAddItemByIdSwapped( 'stwp', u )
call UnitAddItemByIdSwapped( 'hlst', u )
call RandomPermutation(7)
call UnitAddItemByIdSwapped( udg_starting_items_group1[udg_TempIntPermutation[0]], u )
call UnitAddItemByIdSwapped( udg_starting_items_group1[udg_TempIntPermutation[1]], u )
call UnitAddItemByIdSwapped( udg_starting_items_group1[udg_TempIntPermutation[2]], u )
// call UnitAddItemByIdSwapped( 'ofir', u )
// call UnitAddItemByIdSwapped( 'spro', u )
// call UnitAddItemByIdSwapped( 'stel', u )
// call UnitAddItemByIdSwapped( 'pinv', u )
// 2 spidereggs per player, prevent to spawn in buildings...
set j = 0
loop
exitwhen j > 20
set p1 = PolarProjectionBJ(udg_PlayerPositions[i], GetRandomReal(400, 600), GetRandomDirectionDeg())
if IsTerrainBuildable(GetLocationX(p1), GetLocationY(p1)) then
call CreateDestructableLoc( 'DTes', p1 , GetRandomDirectionDeg(), GetRandomReal(0.80, 1.20), GetRandomInt(0, 1) )
call TriggerRegisterDeathEvent( gg_trg_EggSackDies, GetLastCreatedDestructable() )
set j = 22
endif
call RemoveLocation(p1)
set j = j + 1
endloop
set j = 0
loop
exitwhen j > 20
set p1 = PolarProjectionBJ(udg_PlayerPositions[i], GetRandomReal(600, 800), GetRandomDirectionDeg())
if IsTerrainBuildable(GetLocationX(p1), GetLocationY(p1)) then
call CreateDestructableLoc( 'DTes', p1 , GetRandomDirectionDeg(), GetRandomReal(0.80, 1.20), GetRandomInt(0, 1) )
call TriggerRegisterDeathEvent( gg_trg_EggSackDies, GetLastCreatedDestructable() )
set j = 22
endif
call RemoveLocation(p1)
set j = j + 1
endloop
endif
set i = i + 1
endloop
endfunction
function SetupPlayerLocations1v1 takes nothing returns nothing
// in case of only 2 players, make sure they spawn kinda close to each other, and in a random direction (clockwise/counterclock)
local integer p1
local integer p2
local boolean p1_taken = false
local integer i = 0
local location origin = Location(0, 0)
local real deg = GetRandomDirectionDeg()
local real diffdeg
loop
exitwhen i > 5
if IsActivePlayerASD(i) then
if not p1_taken then
set p1 = i
set p1_taken = true
else
set p2 = i
endif
else
set udg_PlayerPositions[i] = null
endif
set i = i + 1
endloop
set udg_PlayerStartDeg[p1] = deg
set udg_PlayerPositions[p1] = PolarProjectionBJ(origin, 3700 + GetRandomReal(-250, 250), udg_PlayerStartDeg[p1])
call PanCameraToTimedLocForPlayer(Player(p1), udg_PlayerPositions[p1], 0 )
set diffdeg = GetRandomReal(35, 55)
if GetRandomReal(0, 1) < 0.5 then
set deg = deg - diffdeg
else
set deg = deg + diffdeg
endif
set udg_PlayerStartDeg[p2] = deg
set udg_PlayerPositions[p2] = PolarProjectionBJ(origin, 3700 + GetRandomReal(-250, 250), udg_PlayerStartDeg[p2])
call PanCameraToTimedLocForPlayer(Player(p2), udg_PlayerPositions[p2], 0.01 )
call RemoveLocation(origin)
endfunction
function SetupPlayerLocations2v2_version2 takes nothing returns nothing
// in case of 2v2, players should spawn 1122, using only about half of the map.
local integer team_i = GetRandomInt(0, 5)
local integer i = 0
local integer player_ind
local integer array playernumbers
local integer array playerassigned
local integer pn = 0
local location origin = Location(0, 0)
local real deg = GetRandomDirectionDeg()
local real diffdeg = 55 // space between players in degrees.
// init the arrays
set i = 0
loop
exitwhen i > 5
set playernumbers[i] = -1
set playerassigned[i] = -1
set i = i + 1
endloop
// go through each team, and assign all players of that team.
set i = 0
loop
exitwhen i > 5
set player_ind = 0
loop
exitwhen player_ind > 5
if IsActivePlayerASD(player_ind) and playerassigned[player_ind] == -1 and GetPlayerTeam(Player(player_ind)) == team_i then
set playernumbers[pn] = player_ind
set playerassigned[player_ind] = 1
set pn = pn + 1
endif
set player_ind = player_ind + 1
endloop
set i = i + 1
set team_i = team_i + 1
if team_i == 6 then
set team_i = 0
endif
endloop
set i = 0
loop
exitwhen i > 3
set pn = playernumbers[i]
//call BJDebugMsg(I2S(i) + I2S(pn))
set udg_PlayerStartDeg[pn] = deg + GetRandomReal(-5, 5)
set udg_PlayerPositions[pn] = PolarProjectionBJ(origin, 3800 + GetRandomReal(-300, 300), udg_PlayerStartDeg[pn])
call PanCameraToTimedLocForPlayer(Player(pn), udg_PlayerPositions[pn], 0.01 )
set deg = deg + diffdeg
set i = i + 1
endloop
call RemoveLocation(origin)
endfunction
function SetupPlayerLocationsCircle takes nothing returns nothing
// arranges the players in a circle around the center.
local integer i = 0
local integer n_players
local real r2origin
local location origin = Location(0, 0)
local real degree_wiggle
local real r_wiggle = 300
local real current_degree = GetRandomDirectionDeg()
call DisplayTextToForce( GetPlayersAll(), "Creating Player Positions")
// put all active players in a player group
loop
exitwhen i > 5
if IsActivePlayerASD(i) then
call ForceAddPlayerSimple( Player(i), udg_ActivePlayers )
endif
set i = i + 1
endloop
set n_players = CountPlayersInForceBJ(udg_ActivePlayers)
set r2origin = 3800
//set degree_wiggle = -55/4 * n_players + 195/2
set degree_wiggle = 35./12. * I2R(n_players) * I2R(n_players) - I2R(n_players) * 445./12. + 255./2.
// call DisplayTextToForce( GetPlayersAll(), "degree_wiggle: " + R2S(degree_wiggle))
//create a random permutation here
set i = 0
loop
exitwhen i > 5
if IsActivePlayerASD(i) then
// call DisplayTextToForce( GetPlayersAll(), "CurrentDegree: " + R2S(current_degree))
set udg_PlayerStartDeg[i] = current_degree + GetRandomReal(-degree_wiggle, degree_wiggle)
set udg_PlayerPositions[i] = PolarProjectionBJ(origin, r2origin + GetRandomReal(-r_wiggle, r_wiggle), udg_PlayerStartDeg[i])
call PanCameraToTimedLocForPlayer(Player(i), udg_PlayerPositions[i], 0.01 )
set current_degree = current_degree + 360./n_players
else
set udg_PlayerPositions[i] = null
endif
set i = i + 1
endloop
call RemoveLocation(origin)
endfunction
function SetupPlayerLocations takes nothing returns nothing
// first detect if FFA, 2v2, ...
local integer team_i = 0
local integer player_i = 0
local integer array n_players_per_team
local integer n_active_teams = 0
local integer largest_team_n = -1
local integer smallest_team_n = 8
loop
exitwhen team_i > 5
// check if the team has any players
set player_i = 0
set n_players_per_team[team_i] = 0
loop
exitwhen player_i > 5
if GetPlayerTeam(Player(player_i)) == team_i then
set n_players_per_team[team_i] = n_players_per_team[team_i] + 1
endif
set player_i = player_i + 1
endloop
if n_players_per_team[team_i] > 0 then
set n_active_teams = n_active_teams + 1
if n_players_per_team[team_i] > largest_team_n then
set largest_team_n = n_players_per_team[team_i]
endif
if n_players_per_team[team_i] < smallest_team_n then
set smallest_team_n = n_players_per_team[team_i]
endif
endif
set team_i = team_i + 1
endloop
if largest_team_n == 1 and n_active_teams == 2 then
call BJDebugMsg("Setting up a 1v1 Player Spawn")
call SetupPlayerLocations1v1()
elseif largest_team_n == 2 and smallest_team_n == 2 and n_active_teams == 2 then
call BJDebugMsg("Setting up a 2v2 Player Spawn")
call SetupPlayerLocations2v2_version2()
elseif largest_team_n == 3 and smallest_team_n == 3 and n_active_teams == 2 then
call BJDebugMsg("Setting up a 3v3 Player Spawn")
// setup for 3v3 to be done. But probably fine like this.
call SetupPlayerLocationsCircle()
elseif largest_team_n == 2 and smallest_team_n == 2 and n_active_teams == 3 then
// setup for 2v2v2 to be done.
call BJDebugMsg("2v2v2 not nicely supported yet, setup as a circle")
call SetupPlayerLocationsCircle()
else
call BJDebugMsg("FFA, setup as a circle")
set udg_isFFA = true
call SetupPlayerLocationsCircle()
endif
endfunction
function Trig_Untitled_Trigger_006_Func001Func002C takes nothing returns boolean
if ( not ( DistanceBetweenPoints(GetUnitLoc(GetEnumUnit()), udg_BasePosition[0]) >= 10 ) ) then
return false
endif
return true
endfunction
function Trig_Untitled_Trigger_006_Func001A takes nothing returns nothing
call RemoveUnit( GetEnumUnit() )
if ( Trig_Untitled_Trigger_006_Func001Func002C() ) then
else
endif
endfunction
function Trig_Untitled_Trigger_006_Actions takes nothing returns nothing
call ForGroupBJ( GetUnitsOfTypeIdAll('ngol'), function Trig_Untitled_Trigger_006_Func001A )
endfunction
function count_mines_per_player_within_range takes r returns nothing
endfunction
//===========================================================================
function InitTrig_Untitled_Trigger_006 takes nothing returns nothing
set gg_trg_Untitled_Trigger_006 = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_Untitled_Trigger_006, 10.00 )
call TriggerAddAction( gg_trg_Untitled_Trigger_006, function Trig_Untitled_Trigger_006_Actions )
endfunction
function Trig_Test_Research_Points_Actions takes nothing returns nothing
set udg_TalentPoints[0] = udg_TalentPoints[0] + 2
call ModifyHeroSkillPoints( udg_TalentHeroes[0], bj_MODIFYMETHOD_ADD, 2)
endfunction
//===========================================================================
function InitTrig_Test_Research_Points takes nothing returns nothing
set gg_trg_Test_Research_Points = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_Test_Research_Points, 15.00 )
call TriggerAddAction( gg_trg_Test_Research_Points, function Trig_Test_Research_Points_Actions )
endfunction
function Trig_Devine_Fury_cast_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'AHds' ) ) then
return false
endif
return true
endfunction
function Trig_Devine_Fury_cast_Actions takes nothing returns nothing
local unit u
local integer shield_lvl
local real waittime
set u = GetTriggerUnit()
//call BJDebugMsg("triggers with " + I2S(GetPlayerId(GetOwningPlayer(u))))
if udg_AltarDevineShieldAdvLearned[GetPlayerId(GetOwningPlayer(u))] == true then
set shield_lvl = GetUnitAbilityLevelSwapped('AHds', u)
if shield_lvl == 1 then
set waittime = 10
endif
if shield_lvl == 2 then
set waittime = 21
endif
if shield_lvl == 3 then
set waittime = 32
endif
//call BJDebugMsg("in if block")
call UnitAddAbilityBJ( 'A018', u )
//call BJDebugMsg("waiting")
call TriggerSleepAction( waittime - 0.5 )
call UnitRemoveAbilityBJ( 'A018', u )
endif
endfunction
//===========================================================================
function InitTrig_Devine_Fury_cast takes nothing returns nothing
set gg_trg_Devine_Fury_cast = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Devine_Fury_cast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Devine_Fury_cast, Condition( function Trig_Devine_Fury_cast_Conditions ) )
call TriggerAddAction( gg_trg_Devine_Fury_cast, function Trig_Devine_Fury_cast_Actions )
endfunction
function Trig_StatueForestSpawnNewTrees_Actions takes nothing returns nothing
local integer i = 0
local location p
local real x
local real y
loop
exitwhen i >= udg_StatueForestN
if IsUnitAliveBJ(udg_StatueForest[i]) == true then
set p = PolarProjectionBJ(GetUnitLoc(udg_StatueForest[i]), GetRandomReal(140.00, 500.00), GetRandomDirectionDeg())
set x = GetLocationX(p)
set y = GetLocationY(p)
if IsTerrainBuildable(x, y) then
call CreateDestructable( 'B005', x, y, GetRandomDirectionDeg(), ( 0.90 + GetRandomReal(0.00, 0.20) ), GetRandomInt(1, 10) )
endif
call RemoveLocation(p)
endif
set i = i + 1
endloop
endfunction
//===========================================================================
function InitTrig_StatueForestSpawnNewTrees takes nothing returns nothing
set gg_trg_StatueForestSpawnNewTrees = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_StatueForestSpawnNewTrees, 15.00 )
call TriggerAddAction( gg_trg_StatueForestSpawnNewTrees, function Trig_StatueForestSpawnNewTrees_Actions )
endfunction
function Trig_DragonAttackPoint_Actions takes nothing returns location
local integer i = 0
local integer player_i = GetRandomInt(0, 5)
local real cur_min = 99999
local integer p = -1
loop
exitwhen i > 5
// first active player is the one to attack if noone has sent anything.
if udg_LumberSentPerPlayer[player_i] < cur_min and IsActivePlayerASD(player_i) then
set cur_min = udg_LumberSentPerPlayer[player_i]
set p = player_i
endif
set player_i = player_i + 1
if player_i == 6 then
set player_i = 0
endif
set i = i + 1
endloop
// call BJDebugMsg("Dragons will attack Player: " + GetPlayerName(Player(p)))
return udg_PlayerPositions[p]
endfunction
//===========================================================================
function InitTrig_DragonAttackPoint takes nothing returns nothing
set gg_trg_DragonAttackPoint = CreateTrigger( )
call TriggerAddAction( gg_trg_DragonAttackPoint, function Trig_DragonAttackPoint_Actions )
endfunction
function functiontofreezegolemsagain takes unit u returns nothing
call TriggerSleepAction( 40 )
call SetUnitOwner( u, Player(PLAYER_NEUTRAL_PASSIVE), true )
call PauseUnitBJ( true, u )
call SetUnitTimeScalePercent( u, 0.00 )
endfunction
function Trig_Sellsword_Army_Copy_Func002C takes nothing returns boolean
// secrets
if ( not ( GetUnitTypeId(GetSoldUnit()) != 'h012' ) ) then
return false
endif
if ( not ( GetUnitTypeId(GetSoldUnit()) != 'h00A' ) ) then
return false
endif
// fishers hut
if ( not ( GetUnitTypeId(GetSoldUnit()) != 'h01M' ) ) then
return false
endif
return true
endfunction
function Trig_Sellsword_Army_Copy_Conditions takes nothing returns boolean
if ( not ( GetPlayerTechCountSimple('R00B', GetOwningPlayer(GetBuyingUnit())) == 1 ) ) then
return false
endif
if ( not Trig_Sellsword_Army_Copy_Func002C() ) then
return false
endif
return true
endfunction
function Trig_Sellsword_Army_Copy_Actions takes nothing returns nothing
local integer reimbgold
set udg_TempInt1 = GetUnitGoldCost( GetUnitTypeId( GetSoldUnit()))
set reimbgold = R2I( I2R(udg_TempInt1) * 0.10 )
call AdjustPlayerStateBJ( reimbgold , GetOwningPlayer(GetBuyingUnit()), PLAYER_STATE_RESOURCE_GOLD )
set udg_TempPoint0 = GetUnitLoc(GetBuyingUnit())
call CreateTextTagLocBJ( "Reimbursed " + I2S(reimbgold) + " Gold", udg_TempPoint0, 0, 10, 100, 100, 0.00, 0 )
call ShowTextTagForceBJ( false, GetLastCreatedTextTag(), GetPlayersAll() )
set udg_TempPlayerGroup = bj_FORCE_PLAYER[GetPlayerId(GetOwningPlayer(GetBuyingUnit()))]
call ShowTextTagForceBJ( true, GetLastCreatedTextTag(), udg_TempPlayerGroup )
call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 3.00 )
call SetTextTagVelocityBJ( GetLastCreatedTextTag(), 64, 90 )
call SetTextTagFadepointBJ( GetLastCreatedTextTag(), 2.00 )
call SetTextTagPermanentBJ( GetLastCreatedTextTag(), false )
call RemoveLocation( udg_TempPoint0 )
endfunction
//===========================================================================
function InitTrig_Sellsword_Army_Copy takes nothing returns nothing
set gg_trg_Sellsword_Army_Copy = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Sellsword_Army_Copy, EVENT_PLAYER_UNIT_SELL )
call TriggerAddCondition( gg_trg_Sellsword_Army_Copy, Condition( function Trig_Sellsword_Army_Copy_Conditions ) )
call TriggerAddAction( gg_trg_Sellsword_Army_Copy, function Trig_Sellsword_Army_Copy_Actions )
endfunction
function Trig_OnResearchCancel_Actions takes nothing returns nothing
local unit u
local integer i = 0
local integer player_n
set u = GetTriggerUnit()
set player_n = GetPlayerId(GetOwningPlayer(u))
if (GetUnitTypeId(u) == 'h019' or GetUnitTypeId(u) == 'h01H' or GetUnitTypeId(u) == 'h01G') then
set udg_TalentPoints[player_n ] = udg_TalentPoints[player_n ] + 1
call ModifyHeroSkillPoints( udg_TalentHeroes[player_n], bj_MODIFYMETHOD_ADD, 1 )
call DisableTrigger ( GetTriggeringTrigger() )
loop
exitwhen i > 7
call IssueImmediateOrderById( u, 851976 )
set i = i + 1
endloop
call EnableTrigger ( GetTriggeringTrigger() )
// call BJDebugMsg("cancelled, new points: " + I2S(udg_TalentPoints[player_n ]) )
endif
endfunction
//===========================================================================
function InitTrig_OnResearchCancel takes nothing returns nothing
set gg_trg_OnResearchCancel = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_OnResearchCancel, EVENT_PLAYER_UNIT_RESEARCH_CANCEL )
call TriggerAddAction( gg_trg_OnResearchCancel, function Trig_OnResearchCancel_Actions )
endfunction
function Trig_OnResearchStart_Actions takes nothing returns nothing
local unit u
local integer player_n
set u = GetTriggerUnit()
set player_n = GetPlayerId(GetOwningPlayer(u))
if (GetUnitTypeId(u) == 'h019' or GetUnitTypeId(u) == 'h01H' or GetUnitTypeId(u) == 'h01G') then
if udg_TalentPoints[player_n] < 1 then
call DisableTrigger( gg_trg_OnResearchCancel )
call IssueImmediateOrderById( u, 851976 )
call EnableTrigger( gg_trg_OnResearchCancel )
call DisplayTextToPlayer(Player(player_n), 0, 0, "You do not have enough Research Points. Send Lumber faster than your opponents to get them!")
else
set udg_TalentPoints[player_n] = udg_TalentPoints[player_n] - 1
call ModifyHeroSkillPoints( udg_TalentHeroes[player_n], bj_MODIFYMETHOD_SUB, 1 )
// call BJDebugMsg("new points: " + I2S(udg_TalentPoints[player_n]) )
endif
endif
endfunction
//===========================================================================
function InitTrig_OnResearchStart takes nothing returns nothing
set gg_trg_OnResearchStart = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_OnResearchStart, EVENT_PLAYER_UNIT_RESEARCH_START )
call TriggerAddAction( gg_trg_OnResearchStart, function Trig_OnResearchStart_Actions )
endfunction
function Trig_CheckLumberReq_Copy_Copy_Func002C takes nothing returns boolean
if ( not ( udg_LumberSentPerPlayer[udg_CurrentPlayerNumber] >= 1000 ) ) then
return false
endif
if ( not ( udg_Reward1Given == false ) ) then
return false
endif
return true
endfunction
function Trig_CheckLumberReqBoni_Actions takes nothing returns nothing
if udg_LumberSentPerPlayer[udg_CurrentPlayerNumber] >= udg_LumberNextResearch[udg_CurrentPlayerNumber] and udg_NBoni > 0 then
set udg_NBoni = udg_NBoni -1
call QuestMessageBJ(GetPlayersAll(), bj_QUESTMESSAGE_ALWAYSHINT, "|cffffcc00Jaina|r: " + GetPlayerName(ConvertedPlayer( udg_CurrentPlayerNumber + 1 )) + " reached " + I2S(udg_LumberNextResearch[udg_CurrentPlayerNumber]) + " lumber and receives a Research Point. There are " + I2S(udg_NBoni) + " Boni left.")
set udg_LumberNextResearch[udg_CurrentPlayerNumber] = udg_LumberNextResearch[udg_CurrentPlayerNumber] + 1000
set udg_TalentPoints[udg_CurrentPlayerNumber] = udg_TalentPoints[udg_CurrentPlayerNumber] + 1
call ModifyHeroSkillPoints( udg_TalentHeroes[udg_CurrentPlayerNumber], bj_MODIFYMETHOD_ADD, 1 )
endif
endfunction
//===========================================================================
function InitTrig_CheckLumberReqBoni takes nothing returns nothing
set gg_trg_CheckLumberReqBoni = CreateTrigger( )
call TriggerAddAction( gg_trg_CheckLumberReqBoni, function Trig_CheckLumberReqBoni_Actions )
endfunction
function Trig_CheckGameEndsByGGorLeave_Actions takes nothing returns nothing
local integer player_i = 0
local integer team_i = 0
local integer playing_teams = 0
local boolean active
loop
exitwhen team_i > 5
set player_i = 0
set active = false
loop
exitwhen player_i > 5
if IsActivePlayerASD(player_i) and udg_Forfeited[player_i] == false and GetPlayerTeam(Player(player_i)) == team_i then
set active = true
endif
set player_i = player_i + 1
endloop
if active == true then
set playing_teams = playing_teams + 1
endif
set team_i = team_i + 1
endloop
// call BJDebugMsg(I2S(playing_teams))
if playing_teams <= 1 then
call ConditionalTriggerExecute( gg_trg_GameEnds )
endif
endfunction
//===========================================================================
function InitTrig_CheckGameEndsByGGorLeave takes nothing returns nothing
set gg_trg_CheckGameEndsByGGorLeave = CreateTrigger( )
call TriggerAddAction( gg_trg_CheckGameEndsByGGorLeave, function Trig_CheckGameEndsByGGorLeave_Actions )
endfunction
function Trig_Power_Generator_Conditions takes nothing returns boolean
if ( not ( GetUnitTypeId(GetConstructedStructure()) == 'n00Q' ) ) then
return false
endif
return true
endfunction
function Trig_Power_Generator_Actions takes nothing returns nothing
set udg_NumberPowerGenerators[( GetPlayerId(GetOwningPlayer(GetTriggerUnit())))] = udg_NumberPowerGenerators[( GetPlayerId(GetOwningPlayer(GetTriggerUnit())))] + 1
// call BJDebugMsg(I2S(udg_NumberPowerGenerators[( GetPlayerId(GetOwningPlayer(GetTriggerUnit())))]))
endfunction
//===========================================================================
function InitTrig_Power_Generator takes nothing returns nothing
set gg_trg_Power_Generator = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Power_Generator, EVENT_PLAYER_UNIT_CONSTRUCT_FINISH )
call TriggerAddCondition( gg_trg_Power_Generator, Condition( function Trig_Power_Generator_Conditions ) )
call TriggerAddAction( gg_trg_Power_Generator, function Trig_Power_Generator_Actions )
endfunction
function Trig_Magical_Acorn_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A00T' ) ) then
return false
endif
return true
endfunction
function Trig_Magical_Acorn_Actions takes nothing returns nothing
local location loc
local effect e
set loc = GetSpellTargetLoc()
set e = AddSpecialEffectLocBJ( loc, "Abilities\\Spells\\NightElf\\TargetArtLumber\\TargetArtLumber.mdl" )
call TriggerSleepAction(10)
call DestroyEffectBJ(e)
call CreateDestructableLoc( 'B004', loc, GetRandomDirectionDeg(), 1, 0 )
call RemoveLocation(loc)
endfunction
//===========================================================================
function InitTrig_Magical_Acorn takes nothing returns nothing
set gg_trg_Magical_Acorn = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Magical_Acorn, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Magical_Acorn, Condition( function Trig_Magical_Acorn_Conditions ) )
call TriggerAddAction( gg_trg_Magical_Acorn, function Trig_Magical_Acorn_Actions )
endfunction
function Trig_AncientProtectors_Actions takes nothing returns nothing
local real start_x = -5200
local real end_x = 5200
local real start_y = -5200
local real end_y = 5200
local integer player_i
local real density = 2500
local integer x_steps = R2I((- start_x + end_x) / density)
local integer y_steps = R2I((- start_y + end_y) / density)
local integer loop_x = 0
local integer loop_y = 0
local real map_x = 0
local real map_y = 0
local real wiggle = 700.
local location loc
local boolean valid = true
loop
exitwhen loop_x > x_steps
set loop_y = 0
loop
exitwhen loop_y > y_steps
set map_x = start_x + (I2R(loop_x) * density)
set map_y = start_y + (I2R(loop_y) * density)
set map_x = map_x + GetRandomReal(-wiggle, wiggle)
set map_y = map_y + GetRandomReal(-wiggle, wiggle)
if SquareRoot(map_x * map_x + map_y * map_y) > 1000 then
set loc = Location(map_x, map_y)
set player_i = 0
set valid = true
loop
exitwhen player_i > 5
if DistanceBetweenPoints(loc, udg_PlayerPositions[player_i]) < 2000 then
set valid = false
endif
if DistanceBetweenPoints(loc, GetUnitLoc(udg_Goldmines[player_i * 2 + 1])) < 800 then
set valid = false
endif
set player_i = player_i + 1
endloop
if GetTerrainCliffLevelBJ(loc) != 2 then
set valid = false
endif
if valid then
//if IsTerrainBuildable(map_x, map_y) then
// call BJDebugMsg("create a tree...")
call CreateUnitAtLoc(Player(19), 'e000', loc, bj_UNIT_FACING )
//endif
endif
endif
call RemoveLocation(loc)
set loop_y = loop_y + 1
endloop
set loop_x = loop_x + 1
endloop
endfunction
//===========================================================================
function InitTrig_AncientProtectors takes nothing returns nothing
set gg_trg_AncientProtectors = CreateTrigger( )
call TriggerAddAction( gg_trg_AncientProtectors, function Trig_AncientProtectors_Actions )
endfunction
function CreatePlayerGoldMines2 takes nothing returns nothing
// for each player, creates the far goldmine towards the center of the map.
local integer player_i
local location p
local unit u
set player_i = 0
loop
exitwhen player_i > 5
if not (udg_PlayerPositions[player_i] == null) then
set p = PolarProjectionBJ(udg_PlayerPositions[player_i], 1700, udg_PlayerStartDeg[player_i] - 180 + GetRandomReal(-3, 3))
set u = CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'ngol', p, bj_UNIT_FACING )
set udg_Goldmines[player_i * 2 + 1] = u
call SetResourceAmount(u, 1500 )
call UnitShareVisionBJ( true, u, Player(player_i) )
call RemoveLocation(p)
if GetRandomInt(0, 1) == 1 then
set p = PolarProjectionBJ(udg_PlayerPositions[player_i], 1300, udg_PlayerStartDeg[player_i] + 50 + GetRandomReal(-10, 10))
else
set p = PolarProjectionBJ(udg_PlayerPositions[player_i], 1300, udg_PlayerStartDeg[player_i] - 50 + GetRandomReal(-10, 10))
endif
set u = CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'ngol', p, bj_UNIT_FACING )
set udg_Goldmines[player_i * 2 + 0] = u
call SetResourceAmount(u, 1000 )
call UnitShareVisionBJ( true, u, Player(player_i) )
call RemoveLocation(p)
endif
set player_i = player_i + 1
endloop
endfunction
function CreatePlayerGoldMines takes nothing returns nothing
// for each player, searches for a spot for the far goldmine, which is much closer than to any other player.
// then places the near goldmine in a different direction.
local integer player_i
local integer player_j
local integer deg_i
local real cur_deg
local location p
local location p0 = Location(0, 0)
local boolean is_valid
local boolean far_placed
local unit u
set player_i = 0
loop
exitwhen player_i > 5
if not (udg_PlayerPositions[player_i] == null) then
set cur_deg = GetRandomDirectionDeg()
set deg_i = 0
set far_placed = false
loop
exitwhen deg_i > 35
set p = PolarProjectionBJ(udg_PlayerPositions[player_i], 1900, cur_deg)
set is_valid = true
set player_j = 0
loop
exitwhen player_j > 5
if player_j != player_i then
if udg_PlayerPositions[player_j] != null then
if DistanceBetweenPoints(p, udg_PlayerPositions[player_j]) < 2500 then
set is_valid = false
set player_j = 6
endif
if GetTerrainCliffLevelBJ(p) != 2 then
set is_valid = false
set player_j = 6
endif
if DistanceBetweenPoints(p, p0) < 1400 then
set is_valid = false
set player_j = 6
endif
endif
endif
set player_j = player_j + 1
endloop
if is_valid then
set deg_i = 35
set u = CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'ngol', p, bj_UNIT_FACING )
set udg_Goldmines[player_i * 2 + 1] = u
call SetResourceAmount(u, 1300 )
// call CreateFogModifierRectBJ( true, Player(player_i), FOG_OF_WAR_FOGGED, re )
call UnitShareVisionBJ( true, u, Player(player_i) )
set far_placed = true
else
set cur_deg = cur_deg + 10
endif
call RemoveLocation(p)
set deg_i = deg_i + 1
endloop
if not far_placed then
set cur_deg = GetRandomDirectionDeg()
set p = PolarProjectionBJ(udg_PlayerPositions[player_i], 1500, cur_deg)
set u = CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'ngol', p, bj_UNIT_FACING )
set udg_Goldmines[player_i * 2 + 1] = u
call SetResourceAmount(u, 1300 )
call UnitShareVisionBJ( true, u, Player(player_i) )
endif
set p = PolarProjectionBJ(udg_PlayerPositions[player_i], 1000, cur_deg - 180 + GetRandomReal(-80, 80))
set u = CreateUnitAtLoc(Player(PLAYER_NEUTRAL_PASSIVE), 'ngol', p, bj_UNIT_FACING )
set udg_Goldmines[player_i * 2 + 0] = u
call SetResourceAmount(u, 900 )
call UnitShareVisionBJ( true, u, Player(player_i) )
call RemoveLocation(p)
endif
set player_i = player_i + 1
endloop
call RemoveLocation(p0)
endfunction
function Trig_FinalEvalFavorFromLumber_Copy_Actions takes nothing returns nothing
set udg_FavorLumber[0] = R2I(I2R(udg_TotalWoodSend[0]) * 0.012)
set udg_FavorLumber[1] = R2I(I2R(udg_TotalWoodSend[1]) * 0.012)
endfunction
//===========================================================================
function InitTrig_FinalEvalFavorFromLumber_Copy takes nothing returns nothing
set gg_trg_FinalEvalFavorFromLumber_Copy = CreateTrigger( )
call TriggerAddAction( gg_trg_FinalEvalFavorFromLumber_Copy, function Trig_FinalEvalFavorFromLumber_Copy_Actions )
endfunction